Lines Matching defs:rcb
36 static void pqisrc_increment_io_counters(pqisrc_softstate_t *softs, rcb_t *rcb);
121 pqisrc_build_sgl(sgt_t *sg_array, rcb_t *rcb, iu_header_t *iu_hdr,
125 uint32_t num_sg = OS_GET_IO_SG_COUNT(rcb);
141 sgt->addr= OS_GET_IO_SG_ADDR(rcb,i);
142 sgt->len= OS_GET_IO_SG_LEN(rcb,i);
151 sg_chain = rcb->sg_chain_virt;
152 sgt->addr = rcb->sg_chain_dma;
158 sgt->addr = OS_GET_IO_SG_ADDR(rcb,i);
159 sgt->len = OS_GET_IO_SG_LEN(rcb,i);
204 pqisrc_build_raid_io(pqisrc_softstate_t *softs, rcb_t *rcb,
211 raid_req->response_queue_id = OS_GET_IO_RESP_QID(softs, rcb);
214 raid_req->request_id = rcb->tag;
216 raid_req->buffer_length = GET_SCSI_BUFFLEN(rcb);
217 memcpy(raid_req->lun_number, rcb->dvp->scsi3addr,
220 raid_req->data_direction = rcb->data_dir;
225 raid_req->task_attribute = OS_GET_TASK_ATTR(rcb);
230 raid_req->ml_device_lun_number = (uint8_t)rcb->cm_ccb->ccb_h.target_lun;
234 memcpy(raid_req->cmd.cdb, rcb->cdbp, rcb->cmdlen);
237 for(i = 0; i < rcb->cmdlen ; i++)
241 switch (rcb->cmdlen) {
269 raid_req->partial = pqisrc_build_sgl(&raid_req->sg_descriptors[0], rcb,
278 rcb->success_cmp_callback = pqisrc_process_io_response_success;
279 rcb->error_cmp_callback = pqisrc_process_raid_response_error;
280 rcb->resp_qid = raid_req->response_queue_id;
337 rcb_t *rcb, uint32_t num_elem_alloted)
342 aio_req->response_queue_id = OS_GET_IO_RESP_QID(softs, rcb);
345 aio_req->req_id = rcb->tag;
348 aio_req->nexus = rcb->ioaccel_handle;
349 aio_req->buf_len = GET_SCSI_BUFFLEN(rcb);
350 aio_req->cmd_flags.data_dir = rcb->data_dir;
354 aio_req->attr_prio.task_attr = OS_GET_TASK_ATTR(rcb);
358 aio_req->cdb_len = rcb->cmdlen;
360 if (rcb->cmdlen > sizeof(aio_req->cdb))
361 rcb->cmdlen = sizeof(aio_req->cdb);
362 memcpy(aio_req->cdb, rcb->cdbp, rcb->cmdlen);
365 uint64_t lun = rcb->cm_ccb->ccb_h.target_lun;
366 if (lun && (rcb->dvp->is_multi_lun)) {
374 if (rcb->encrypt_enable == true) {
377 LE_16(rcb->enc_info.data_enc_key_index);
379 LE_32(rcb->enc_info.encrypt_tweak_lower);
381 LE_32(rcb->enc_info.encrypt_tweak_upper);
389 aio_req->cmd_flags.partial = pqisrc_build_sgl(&aio_req->sg_desc[0], rcb,
399 rcb->success_cmp_callback = pqisrc_process_io_response_success;
400 rcb->error_cmp_callback = pqisrc_process_aio_response_error;
401 rcb->resp_qid = aio_req->response_queue_id;
407 pqisrc_show_aio_common(pqisrc_softstate_t *softs, rcb_t *rcb,
411 DBG_INFO("AIO IU Content, tag# 0x%08x", rcb->tag);
432 pqisrc_show_cdb(softs, "AIOC", rcb, aio_req->cdb);
451 pqi_aio_raid1_write_req_t *aio_req, rcb_t *rcb,
455 if (!rcb->dvp) {
459 if (!rcb->dvp->raid_map) {
466 aio_req->response_queue_id = OS_GET_IO_RESP_QID(softs, rcb);
469 aio_req->req_id = rcb->tag;
470 aio_req->volume_id = (LE_32(rcb->dvp->scsi3addr[0]) & 0x3FFF);
471 aio_req->nexus_1 = rcb->it_nexus[0];
472 aio_req->nexus_2 = rcb->it_nexus[1];
473 aio_req->nexus_3 = rcb->it_nexus[2];
474 aio_req->buf_len = GET_SCSI_BUFFLEN(rcb);
475 aio_req->cmd_flags.data_dir = rcb->data_dir;
479 aio_req->attr_prio.task_attr = OS_GET_TASK_ATTR(rcb);
482 if(rcb->cmdlen > sizeof(aio_req->cdb))
483 rcb->cmdlen = sizeof(aio_req->cdb);
484 memcpy(aio_req->cdb, rcb->cdbp, rcb->cmdlen);
486 aio_req->cdb_len = rcb->cmdlen;
487 aio_req->num_drives = LE_16(rcb->dvp->raid_map->layout_map_count);
490 if (rcb->encrypt_enable == true) {
493 LE_16(rcb->enc_info.data_enc_key_index);
495 LE_32(rcb->enc_info.encrypt_tweak_lower);
497 LE_32(rcb->enc_info.encrypt_tweak_upper);
505 aio_req->cmd_flags.partial = pqisrc_build_sgl(&aio_req->sg_desc[0], rcb,
516 rcb->success_cmp_callback = pqisrc_process_io_response_success;
517 rcb->error_cmp_callback = pqisrc_process_aio_response_error;
518 rcb->resp_qid = aio_req->response_queue_id;
525 pqisrc_show_aio_R1_write(pqisrc_softstate_t *softs, rcb_t *rcb,
530 DBG_INFO("AIO RAID1 Write IU Content, tag# 0x%08x", rcb->tag);
552 pqisrc_show_cdb(softs, "AIOR1W", rcb, aio_req->cdb);
573 pqi_aio_raid5or6_write_req_t *aio_req, rcb_t *rcb,
581 num_data_disks = LE_16(rcb->dvp->raid_map->data_disks_per_row);
582 num_metadata_disks = LE_16(rcb->dvp->raid_map->metadata_disks_per_row);
585 index = PQISRC_DIV_ROUND_UP(rcb->raid_map_index + 1, total_disks);
589 switch (rcb->dvp->raid_level) {
602 aio_req->response_queue_id = OS_GET_IO_RESP_QID(softs, rcb);
605 aio_req->req_id = rcb->tag;
606 aio_req->volume_id = (LE_32(rcb->dvp->scsi3addr[0]) & 0x3FFF);
607 aio_req->data_it_nexus = rcb->dvp->raid_map->dev_data[rcb->raid_map_index].ioaccel_handle;
609 rcb->dvp->raid_map->dev_data[index].ioaccel_handle;
613 rcb->dvp->raid_map->dev_data[index + 1].ioaccel_handle;
616 rcb->dvp->raid_map->dev_data[rcb->raid_map_index].xor_mult[1];
617 aio_req->row = rcb->row_num;
618 /*aio_req->reserved = rcb->row_num * rcb->blocks_per_row +
619 rcb->dvp->raid_map->disk_starting_blk;*/
620 aio_req->buf_len = GET_SCSI_BUFFLEN(rcb);
621 aio_req->cmd_flags.data_dir = rcb->data_dir;
625 aio_req->attr_prio.task_attr = OS_GET_TASK_ATTR(rcb);
628 if (rcb->cmdlen > sizeof(aio_req->cdb))
629 rcb->cmdlen = sizeof(aio_req->cdb);
630 memcpy(aio_req->cdb, rcb->cdbp, rcb->cmdlen);
632 aio_req->cdb_len = rcb->cmdlen;
643 if (rcb->encrypt_enable == true) {
646 LE_16(rcb->enc_info.data_enc_key_index);
648 LE_32(rcb->enc_info.encrypt_tweak_lower);
650 LE_32(rcb->enc_info.encrypt_tweak_upper);
658 aio_req->cmd_flags.partial = pqisrc_build_sgl(&aio_req->sg_desc[0], rcb,
668 rcb->success_cmp_callback = pqisrc_process_io_response_success;
669 rcb->error_cmp_callback = pqisrc_process_aio_response_error;
670 rcb->resp_qid = aio_req->response_queue_id;
677 pqisrc_show_aio_R5or6_write(pqisrc_softstate_t *softs, rcb_t *rcb,
681 DBG_INFO("AIO RAID5or6 Write IU Content, tag# 0x%08x\n", rcb->tag);
706 pqisrc_show_cdb(softs, "AIOR56W", rcb, aio_req->cdb);
750 pqisrc_show_aio_io(pqisrc_softstate_t *softs, rcb_t *rcb,
756 is_write = pqisrc_cdb_is_write(rcb->cdbp);
759 pqisrc_show_aio_common(softs, rcb, aio_req);
763 switch (rcb->dvp->raid_level) {
765 pqisrc_show_aio_common(softs, rcb, aio_req);
769 pqisrc_show_aio_R1_write(softs, rcb,
774 pqisrc_show_aio_R5or6_write(softs, rcb,
786 pqisrc_build_aio_io(pqisrc_softstate_t *softs, rcb_t *rcb,
792 is_write = pqisrc_cdb_is_write(rcb->cdbp);
795 switch (rcb->dvp->raid_level) {
798 rcb, num_elem_alloted);
804 rcb, num_elem_alloted);
811 rcb, num_elem_alloted);
815 pqisrc_build_aio_common(softs, aio_req, rcb, num_elem_alloted);
818 pqisrc_show_aio_io(softs, rcb, aio_req, num_elem_alloted);
829 pqisrc_is_parity_write_stream(pqisrc_softstate_t *softs, rcb_t *rcb)
841 rc = fill_lba_for_scsi_rw(softs, rcb->cdbp , &loc);
847 if (!pqisrc_cdb_is_write(rcb->cdbp)) {
855 device = rcb->dvp;
926 determine_io_path_build_bypass(pqisrc_softstate_t *softs,rcb_t *rcb)
929 pqi_scsi_dev_t *devp = rcb->dvp;
934 rcb->cdbp = OS_GET_CDBP(rcb);
936 if(!rcb->aio_retry) {
940 rcb->ioaccel_handle = devp->ioaccel_handle;
945 if (devp->offload_enabled && !pqisrc_is_parity_write_stream(softs, rcb)) {
946 ret = pqisrc_build_scsi_cmd_raidbypass(softs, devp, rcb);
952 ASSERT(rcb->cdbp == rcb->bypass_cdb);
963 pqisrc_get_aio_data_direction(rcb_t *rcb)
965 switch (rcb->cm_ccb->ccb_h.flags & CAM_DIR_MASK) {
974 pqisrc_get_raid_data_direction(rcb_t *rcb)
976 switch (rcb->cm_ccb->ccb_h.flags & CAM_DIR_MASK) {
986 pqisrc_build_send_io(pqisrc_softstate_t *softs,rcb_t *rcb)
993 int first_qindex = OS_GET_IO_REQ_QINDEX(softs, rcb);
998 pqi_scsi_dev_t *devp = rcb->dvp;
1004 io_path = determine_io_path_build_bypass(softs, rcb);
1009 rcb->data_dir = pqisrc_get_raid_data_direction(rcb);
1014 rcb->data_dir = pqisrc_get_aio_data_direction(rcb);
1015 if (rcb->data_dir == SOP_DATA_DIR_UNKNOWN) {
1020 is_write = pqisrc_cdb_is_write(rcb->cdbp);
1023 OS_GET_IO_SG_COUNT(rcb), devp, is_write, io_path);
1063 pqisrc_build_aio_io(softs, rcb, (pqi_aio_req_t *)ib_iu,
1067 pqisrc_build_raid_io(softs, rcb, (pqisrc_raid_req_t *)ib_iu,
1071 rcb->req_pending = true;
1072 rcb->req_q = ib_q;
1073 rcb->path = io_path;
1075 pqisrc_increment_io_counters(softs, rcb);
1252 pqisrc_calc_disk_params(pqisrc_softstate_t *softs, aio_req_locator_t *l, rcb_t *rcb)
1272 rcb->blocks_per_row = l->row.blks_per_row;
1274 rcb->row_num = l->row.first;
1304 pqisrc_set_map_row_and_idx(pqisrc_softstate_t *softs, aio_req_locator_t *l, rcb_t *rcb)
1319 rcb->raid_map_index = l->map.idx;
1320 rcb->raid_map_row = l->map.row;
1351 rcb_t *rcb)
1361 rcb->it_nexus[mirror] =
1446 rcb_t *rcb)
1458 rcb->raid_map_index = l->map.idx;
1459 rcb->raid_map_row = l->map.row;
1497 pqi_scsi_dev_t *device, rcb_t *rcb,
1506 if (device->is_nvme && rcb->encrypt_enable) {
1586 aio_req_locator_t *l, uint32_t disk_blk_cnt, rcb_t *rcb)
1591 DBG_INFO("======= AIO Locator Content, tag#0x%08x =====\n", rcb->tag);
1641 uint32_t disk_blk_cnt, rcb_t *rcb, uint8_t *cdb)
1662 rcb->cmdlen = cdb_length;
1716 pqisrc_show_cdb(pqisrc_softstate_t *softs, char *msg, rcb_t *rcb, uint8_t *cdb)
1719 pqisrc_print_buffer(softs, msg, cdb, rcb->cmdlen, PRINT_FLAG_HDR_COLUMN);
1723 pqisrc_show_rcb_details(pqisrc_softstate_t *softs, rcb_t *rcb, char *msg, void *err_info)
1727 if (rcb == NULL || rcb->dvp == NULL)
1729 DBG_ERR("Invalid rcb or dev ptr! rcb=%p\n", rcb);
1733 devp = rcb->dvp;
1738 pqisrc_print_buffer(softs, "host cdb", OS_GET_CDBP(rcb), rcb->cmdlen, PRINT_FLAG_HDR_COLUMN);
1739 if (OS_GET_CDBP(rcb) != rcb->cdbp)
1740 pqisrc_print_buffer(softs, "aio mapped cdb", rcb->cdbp, rcb->cmdlen, 0);
1742 DBG_INFO("tag=0x%x dir=%u host_timeout=%ums\n", rcb->tag,
1743 rcb->data_dir, (uint32_t)rcb->host_timeout_ms);
1748 if (rcb->path == AIO_PATH)
1750 DBG_INFO("handle=0x%x\n", rcb->ioaccel_handle);
1752 rcb->row_num, rcb->blocks_per_row, rcb->raid_map_index, rcb->raid_map_row);
1755 pqisrc_show_aio_error_info(softs, rcb, err_info);
1761 pqisrc_show_raid_error_info(softs, rcb, err_info);
1774 pqi_scsi_dev_t *device, rcb_t *rcb)
1790 rcb->tag, device->bus, device->target, device->lun);
1795 rc = fill_lba_for_scsi_rw(softs, OS_GET_CDBP(rcb), l);
1809 if (!pqisrc_calc_disk_params(softs, l, rcb))
1815 if (!pqisrc_set_map_row_and_idx(softs, l, rcb))
1825 if (!pqisrc_set_write_mirrors(softs, device, l, rcb))
1843 pqisrc_set_r5or6_row_and_index(l, rcb);
1853 rcb->ioaccel_handle =
1863 rcb->encrypt_enable = false;
1866 pqisrc_set_enc_info(&rcb->enc_info, l->raid_map,
1868 rcb->encrypt_enable = true;
1871 if (pqisrc_aio_req_too_big(softs, device, rcb, l, disk_blk_cnt))
1875 rcb->cdbp = &rcb->bypass_cdb[0];
1878 pqisrc_aio_build_cdb(l, disk_blk_cnt, rcb, rcb->cdbp);
1880 pqisrc_aio_show_locator_info(softs, l, disk_blk_cnt, rcb);
1893 rcb_t *rcb, rcb_t *rcb_to_manage, int tmf_type)
1906 tmf_req.req_id = rcb->tag;
1907 tmf_req.error_idx = rcb->tag;
1911 tmf_req.resp_qid = OS_GET_TMF_RESP_QID(softs, rcb);
1913 is_write = pqisrc_cdb_is_write(rcb->cdbp);
1915 uint64_t lun = rcb->cm_ccb->ccb_h.target_lun;
1916 if (lun && (rcb->dvp->is_multi_lun)) {
1940 rcb->path = AIO_PATH;
1941 rcb->req_pending = true;
1943 rcb->error_cmp_callback = pqisrc_process_aio_response_error;
1951 rval = pqisrc_wait_on_condition(softs, rcb, PQISRC_TMF_TIMEOUT);
1954 rcb->status = rval;
1957 if (rcb->status != PQI_STATUS_SUCCESS) {
1959 "stat:0x%x\n", tmf_type, rcb->status);
1970 rcb_t *rcb, rcb_t *rcb_to_manage, int tmf_type)
1982 tmf_req.req_id = rcb->tag;
1985 tmf_req.ml_device_lun_number = (uint8_t)rcb->cm_ccb->ccb_h.target_lun;
1988 tmf_req.resp_qid = OS_GET_TMF_RESP_QID(softs, rcb);
2010 rcb->path = RAID_PATH;
2011 rcb->req_pending = true;
2013 rcb->error_cmp_callback = pqisrc_process_raid_response_error;
2021 rval = pqisrc_wait_on_condition(softs, rcb, PQISRC_TMF_TIMEOUT);
2024 rcb->status = rval;
2027 if (rcb->status != PQI_STATUS_SUCCESS) {
2029 "stat:0x%x\n", tmf_type, rcb->status);
2038 dump_tmf_details(pqisrc_softstate_t *softs, rcb_t *rcb, char *msg)
2040 uint32_t qid = rcb->req_q ? rcb->req_q->q_id : -1;
2043 msg, rcb->req_pending, rcb->path, rcb->tag,
2044 rcb->tag, qid, (uint32_t)rcb->host_timeout_ms);
2049 rcb_t *rcb, rcb_t *rcb_to_manage, int tmf_type)
2058 rcb->is_abort_cmd_from_host = true;
2059 rcb->softs = softs;
2061 /* No target rcb for general purpose TMFs like LUN RESET */
2069 dump_tmf_details(softs, rcb, "rcb");
2075 ret = pqisrc_send_aio_tmf(softs, devp, rcb, rcb_to_manage, tmf_type);
2083 ret = pqisrc_send_raid_tmf(softs, devp, rcb, rcb_to_manage, tmf_type);
2087 ret = pqisrc_send_aio_tmf(softs, devp, rcb, rcb_to_manage, tmf_type);
2089 ret = pqisrc_send_raid_tmf(softs, devp, rcb, rcb_to_manage, tmf_type);
2099 get_counter_index(rcb_t *rcb)
2101 if (IS_AIO_PATH(rcb->dvp))
2104 switch (rcb->dvp->raid_level) {
2117 ASSERT(rcb->path == RAID_PATH);
2214 pqisrc_increment_io_counters(pqisrc_softstate_t *softs, rcb_t *rcb)
2216 io_type_t io_type = get_io_type_from_cdb(rcb->cdbp);
2217 counter_types_t type_index = get_counter_index(rcb);
2221 ret_val = increment_this_counter(pcounter, rcb->path, io_type);
2227 char *path = io_path_to_ascii(rcb->path);