Lines Matching refs:cmd

65     struct mrsas_mpt_cmd *cmd, union ccb *ccb);
67 mrsas_build_ldio_rw(struct mrsas_softc *sc, struct mrsas_mpt_cmd *cmd,
70 mrsas_build_ldio_nonrw(struct mrsas_softc *sc, struct mrsas_mpt_cmd *cmd,
73 mrsas_build_syspdio(struct mrsas_softc *sc, struct mrsas_mpt_cmd *cmd,
76 mrsas_setup_io(struct mrsas_softc *sc, struct mrsas_mpt_cmd *cmd,
82 void mrsas_release_mpt_cmd(struct mrsas_mpt_cmd *cmd);
83 void mrsas_unmap_request(struct mrsas_softc *sc, struct mrsas_mpt_cmd *cmd);
84 void mrsas_cmd_done(struct mrsas_softc *sc, struct mrsas_mpt_cmd *cmd);
93 static void mrsas_freeze_simq(struct mrsas_mpt_cmd *cmd, struct cam_sim *sim);
109 static boolean_t mrsas_is_prp_possible(struct mrsas_mpt_cmd *cmd,
111 static void mrsas_build_ieee_sgl(struct mrsas_mpt_cmd *cmd,
113 static void mrsas_build_prp_nvme(struct mrsas_mpt_cmd *cmd,
142 struct mrsas_mpt_cmd *cmd);
401 struct mrsas_mpt_cmd *cmd;
408 cmd = (struct mrsas_mpt_cmd *)data;
409 sc = cmd->sc;
411 if (cmd->ccb_ptr == NULL) {
423 callout_reset_sbt(&cmd->cm_callout, SBT_1S * 180, 0,
424 mrsas_scsiio_timeout, cmd, 0);
426 callout_reset(&cmd->cm_callout, (180000 * hz) / 1000,
427 mrsas_scsiio_timeout, cmd);
430 if (cmd->ccb_ptr->cpi.bus_id == 0)
431 target_id = cmd->ccb_ptr->ccb_h.target_id;
433 target_id = (cmd->ccb_ptr->ccb_h.target_id + (MRSAS_MAX_PD - 1));
435 /* Save the cmd to be processed for TM, if it is not there in the array */
437 sc->target_reset_pool[target_id] = cmd;
458 struct mrsas_mpt_cmd *cmd, *r1_cmd = NULL;
479 cmd = mrsas_get_mpt_cmd(sc);
481 if (!cmd) {
490 cmd->flags |= MRSAS_DIR_IN;
492 cmd->flags |= MRSAS_DIR_OUT;
494 cmd->flags = MRSAS_DIR_NONE; /* no data */
506 mrsas_release_mpt_cmd(cmd);
513 mrsas_release_mpt_cmd(cmd);
518 mrsas_release_mpt_cmd(cmd);
522 cmd->length = csio->dxfer_len;
523 if (cmd->length)
524 cmd->data = csio->data_ptr;
528 mrsas_release_mpt_cmd(cmd);
532 cmd->length = csio->dxfer_len;
533 if (cmd->length)
534 cmd->data = csio->data_ptr;
544 mrsas_release_mpt_cmd(cmd);
548 cmd->length = csio->dxfer_len;
549 if (cmd->length)
550 cmd->data = csio->data_ptr;
552 mrsas_release_mpt_cmd(cmd);
557 mrsas_release_mpt_cmd(cmd);
564 cmd->ccb_ptr = ccb;
566 req_desc = mrsas_get_request_desc(sc, (cmd->index) - 1);
572 cmd->request_desc = req_desc;
575 bcopy(csio->cdb_io.cdb_ptr, cmd->io_request->CDB.CDB32, csio->cdb_len);
577 bcopy(csio->cdb_io.cdb_bytes, cmd->io_request->CDB.CDB32, csio->cdb_len);
585 if (mrsas_build_ldio_rw(sc, cmd, ccb)) {
588 mrsas_release_mpt_cmd(cmd);
594 if (mrsas_build_ldio_nonrw(sc, cmd, ccb)) {
597 mrsas_release_mpt_cmd(cmd);
606 if (mrsas_build_syspdio(sc, cmd, ccb, sim, 0)) {
610 mrsas_release_mpt_cmd(cmd);
615 if (mrsas_build_syspdio(sc, cmd, ccb, sim, 1)) {
619 mrsas_release_mpt_cmd(cmd);
626 if (cmd->flags == MRSAS_DIR_IN) /* from device */
627 cmd->io_request->Control |= MPI2_SCSIIO_CONTROL_READ;
628 else if (cmd->flags == MRSAS_DIR_OUT) /* to device */
629 cmd->io_request->Control |= MPI2_SCSIIO_CONTROL_WRITE;
631 cmd->io_request->SGLFlags = MPI2_SGE_FLAGS_64_BIT_ADDRESSING;
632 cmd->io_request->SGLOffset0 = offsetof(MRSAS_RAID_SCSI_IO_REQUEST, SGL) / 4;
633 cmd->io_request->SenseBufferLowAddress = cmd->sense_phys_addr;
634 cmd->io_request->SenseBufferLength = MRSAS_SCSI_SENSE_BUFFERSIZE;
636 req_desc = cmd->request_desc;
637 req_desc->SCSIIO.SMID = cmd->index;
642 cmd->callout_owner = true;
644 callout_reset_sbt(&cmd->cm_callout, SBT_1S * 180, 0,
645 mrsas_scsiio_timeout, cmd, 0);
647 callout_reset(&cmd->cm_callout, (180000 * hz) / 1000,
648 mrsas_scsiio_timeout, cmd);
665 if (cmd->r1_alt_dev_handle != MR_DEVHANDLE_INVALID) {
666 mrsas_prepare_secondRaid1_IO(sc, cmd);
669 r1_cmd = cmd->peer_cmd;
715 * mrsas_get_mpt_cmd: Get a cmd from free command pool
724 struct mrsas_mpt_cmd *cmd = NULL;
728 cmd = TAILQ_FIRST(&sc->mrsas_mpt_cmd_list_head);
729 TAILQ_REMOVE(&sc->mrsas_mpt_cmd_list_head, cmd, next);
734 memset((uint8_t *)cmd->io_request, 0, MRSAS_MPI2_RAID_DEFAULT_IO_FRAME_SIZE);
735 cmd->data = NULL;
736 cmd->length = 0;
737 cmd->flags = 0;
738 cmd->error_code = 0;
739 cmd->load_balance = 0;
740 cmd->ccb_ptr = NULL;
743 return cmd;
747 * mrsas_release_mpt_cmd: Return a cmd to free command pool
753 mrsas_release_mpt_cmd(struct mrsas_mpt_cmd *cmd)
755 struct mrsas_softc *sc = cmd->sc;
758 cmd->r1_alt_dev_handle = MR_DEVHANDLE_INVALID;
759 cmd->sync_cmd_idx = (u_int32_t)MRSAS_ULONG_MAX;
760 cmd->peer_cmd = NULL;
761 cmd->cmd_completed = 0;
762 memset((uint8_t *)cmd->io_request, 0,
764 TAILQ_INSERT_HEAD(&(sc->mrsas_mpt_cmd_list_head), cmd, next);
796 struct mrsas_mpt_cmd *cmd)
801 r1_cmd = cmd->peer_cmd;
802 req_desc = cmd->request_desc;
808 memcpy(r1_cmd->io_request, cmd->io_request,
810 memcpy(&r1_cmd->io_request->SGL, &cmd->io_request->SGL,
815 r1_cmd->ccb_ptr = cmd->ccb_ptr;
822 r1_cmd->request_desc->SCSIIO.DevHandle = cmd->r1_alt_dev_handle;
823 r1_cmd->r1_alt_dev_handle = cmd->io_request->DevHandle;
824 r1_cmd->io_request->DevHandle = cmd->r1_alt_dev_handle;
825 cmd->io_request->RaidContext.raid_context_g35.smid.peerSMID =
828 cmd->index;
833 r1_cmd->request_desc->SCSIIO.MSIxIndex = cmd->request_desc->SCSIIO.MSIxIndex;
834 /* span arm is different for r1 cmd */
836 cmd->io_request->RaidContext.raid_context_g35.spanArm + 1;
851 mrsas_build_ldio_rw(struct mrsas_softc *sc, struct mrsas_mpt_cmd *cmd,
861 io_request = cmd->io_request;
869 if (mrsas_setup_io(sc, cmd, ccb, device_id, io_request) != SUCCESS)
872 io_request->DataLength = cmd->length;
874 if (mrsas_map_request(sc, cmd, ccb) == SUCCESS) {
875 if (cmd->sge_count > sc->max_num_sge) {
877 "max (0x%x) allowed\n", cmd->sge_count, sc->max_num_sge);
881 io_request->RaidContext.raid_context_g35.numSGE = cmd->sge_count;
887 io_request->RaidContext.raid_context.numSGE = cmd->sge_count;
888 io_request->RaidContext.raid_context.numSGEExt = (uint8_t)(cmd->sge_count >> 8);
900 mrsas_stream_detect(struct mrsas_softc *sc, struct mrsas_mpt_cmd *cmd,
933 cmd->io_request->RaidContext.raid_context_g35.streamDetected = TRUE;
972 mrsas_setup_io(struct mrsas_softc *sc, struct mrsas_mpt_cmd *cmd,
1050 io_request->DataLength = cmd->length;
1078 /* Store the TM capability value in cmd */
1079 cmd->tmCapable = raid->capability.tmCapable;
1081 cmd->request_desc->SCSIIO.MSIxIndex =
1087 mrsas_stream_detect(sc, cmd, &io_info);
1115 cmd->peer_cmd = r1_cmd;
1116 r1_cmd->peer_cmd = cmd;
1126 cmd->request_desc->SCSIIO.RequestFlags =
1131 cmd->request_desc->SCSIIO.RequestFlags =
1156 cmd->load_balance = MRSAS_LOAD_BALANCE_FLAG;
1157 cmd->pd_r1_lb = io_info.pd_after_lb;
1163 cmd->load_balance = 0;
1166 cmd->r1_alt_dev_handle = io_info.r1_alt_dev_handle;
1168 cmd->r1_alt_dev_handle = MR_DEVHANDLE_INVALID;
1170 cmd->request_desc->SCSIIO.DevHandle = io_info.devHandle;
1172 cmd->pdInterface = io_info.pdInterface;
1176 cmd->request_desc->SCSIIO.RequestFlags =
1181 cmd->request_desc->SCSIIO.RequestFlags =
1210 mrsas_build_ldio_nonrw(struct mrsas_softc *sc, struct mrsas_mpt_cmd *cmd,
1220 io_request = cmd->io_request;
1228 /* Store the TM capability value in cmd */
1229 cmd->tmCapable = raid->capability.tmCapable;
1234 cmd->request_desc->SCSIIO.RequestFlags =
1240 io_request->DataLength = cmd->length;
1242 if (mrsas_map_request(sc, cmd, ccb) == SUCCESS) {
1243 if (cmd->sge_count > sc->max_num_sge) {
1245 "max (0x%x) allowed\n", cmd->sge_count, sc->max_num_sge);
1249 io_request->RaidContext.raid_context_g35.numSGE = cmd->sge_count;
1255 io_request->RaidContext.raid_context.numSGE = cmd->sge_count;
1256 io_request->RaidContext.raid_context.numSGEExt = (uint8_t)(cmd->sge_count >> 8);
1275 mrsas_build_syspdio(struct mrsas_softc *sc, struct mrsas_mpt_cmd *cmd,
1285 io_request = cmd->io_request;
1296 cmd->pdInterface = sc->target_list[device_id].interface_type;
1303 cmd->tmCapable = pd_sync->seq[device_id].capability.tmCapable;
1338 cmd->request_desc->SCSIIO.DevHandle = io_request->DevHandle;
1339 cmd->request_desc->SCSIIO.MSIxIndex =
1345 cmd->request_desc->SCSIIO.RequestFlags =
1364 cmd->request_desc->SCSIIO.RequestFlags =
1370 io_request->DataLength = cmd->length;
1372 if (mrsas_map_request(sc, cmd, ccb) == SUCCESS) {
1373 if (cmd->sge_count > sc->max_num_sge) {
1375 "max (0x%x) allowed\n", cmd->sge_count, sc->max_num_sge);
1379 io_request->RaidContext.raid_context_g35.numSGE = cmd->sge_count;
1385 io_request->RaidContext.raid_context.numSGE = cmd->sge_count;
1386 io_request->RaidContext.raid_context.numSGEExt = (uint8_t)(cmd->sge_count >> 8);
1398 * cmd: MPT command frame pointer
1405 static boolean_t mrsas_is_prp_possible(struct mrsas_mpt_cmd *cmd,
1408 struct mrsas_softc *sc = cmd->sc;
1415 data_length = cmd->length;
1468 * cmd->error_code will contain the error code and a 1 is returned.
1472 struct mrsas_mpt_cmd *cmd, union ccb *ccb)
1477 sim = xpt_path_sim(cmd->ccb_ptr->ccb_h.path);
1479 if (cmd->data != NULL) {
1483 retcode = bus_dmamap_load_ccb(sc->data_tag, cmd->data_dmamap, ccb,
1484 mrsas_data_load_cb, cmd, 0);
1486 retcode = bus_dmamap_load(sc->data_tag, cmd->data_dmamap, cmd->data,
1487 cmd->length, mrsas_data_load_cb, cmd, BUS_DMA_NOWAIT);
1494 mrsas_freeze_simq(cmd, sim);
1497 if (cmd->error_code)
1510 mrsas_unmap_request(struct mrsas_softc *sc, struct mrsas_mpt_cmd *cmd)
1512 if (cmd->data != NULL) {
1513 if (cmd->flags & MRSAS_DIR_IN)
1514 bus_dmamap_sync(sc->data_tag, cmd->data_dmamap, BUS_DMASYNC_POSTREAD);
1515 if (cmd->flags & MRSAS_DIR_OUT)
1516 bus_dmamap_sync(sc->data_tag, cmd->data_dmamap, BUS_DMASYNC_POSTWRITE);
1518 bus_dmamap_unload(sc->data_tag, cmd->data_dmamap);
1528 * @cmd: Fusion command frame
1531 static void mrsas_build_ieee_sgl(struct mrsas_mpt_cmd *cmd, bus_dma_segment_t *segs, int nseg)
1533 struct mrsas_softc *sc = cmd->sc;
1538 io_request = cmd->io_request;
1563 if ((cmd->io_request->IoFlags & MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH)
1565 cmd->io_request->ChainOffset = sc->chain_offset_io_request;
1567 cmd->io_request->ChainOffset = 0;
1569 cmd->io_request->ChainOffset = sc->chain_offset_io_request;
1576 sg_chain->Address = cmd->chain_frame_phys_addr;
1577 sgl_ptr = (pMpi25IeeeSgeChain64_t)cmd->chain_frame;
1588 * @cmd: Fusion command frame
1591 static void mrsas_build_prp_nvme(struct mrsas_mpt_cmd *cmd, bus_dma_segment_t *segs, int nseg)
1593 struct mrsas_softc *sc = cmd->sc;
1601 int data_len = cmd->length;
1605 sgl_ptr = (pMpi25IeeeSgeChain64_t) &cmd->io_request->SGL;
1619 ptr_sgl = (u_int64_t *) cmd->chain_frame;
1620 ptr_sgl_phys = cmd->chain_frame_phys_addr;
1628 main_chain_element->Address = cmd->chain_frame_phys_addr;
1710 struct mrsas_mpt_cmd *cmd = (struct mrsas_mpt_cmd *)arg;
1711 struct mrsas_softc *sc = cmd->sc;
1715 cmd->error_code = error;
1718 cmd->ccb_ptr->ccb_h.status = CAM_REQ_TOO_BIG;
1722 if (cmd->flags & MRSAS_DIR_IN)
1723 bus_dmamap_sync(cmd->sc->data_tag, cmd->data_dmamap,
1725 if (cmd->flags & MRSAS_DIR_OUT)
1726 bus_dmamap_sync(cmd->sc->data_tag, cmd->data_dmamap,
1734 if ((cmd->io_request->IoFlags & MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH) &&
1735 (cmd->pdInterface == NVME_PD))
1736 build_prp = mrsas_is_prp_possible(cmd, segs, nseg);
1739 mrsas_build_prp_nvme(cmd, segs, nseg);
1741 mrsas_build_ieee_sgl(cmd, segs, nseg);
1743 cmd->sge_count = nseg;
1754 mrsas_freeze_simq(struct mrsas_mpt_cmd *cmd, struct cam_sim *sim)
1756 union ccb *ccb = (union ccb *)(cmd->ccb_ptr);
1784 mrsas_cmd_done(struct mrsas_softc *sc, struct mrsas_mpt_cmd *cmd)
1786 mrsas_unmap_request(sc, cmd);
1789 if (cmd->callout_owner) {
1790 callout_stop(&cmd->cm_callout);
1791 cmd->callout_owner = false;
1793 xpt_done(cmd->ccb_ptr);
1794 cmd->ccb_ptr = NULL;
1796 mrsas_release_mpt_cmd(cmd);
2004 device_printf(sc->mrsas_dev, "tm cmd TIMEDOUT\n");
2048 /* Get an mpt frame and an index to fire the TM cmd */