Lines Matching refs:cmd

103 pvscsi_add_to_queue(pvscsi_softc_t *pvs, pvscsi_cmd_t *cmd)  in pvscsi_add_to_queue()  argument
121 if (((cmd->start + cmd->timeout) - in pvscsi_add_to_queue()
123 list_insert_after(l, r, cmd); in pvscsi_add_to_queue()
128 list_insert_head(l, cmd); in pvscsi_add_to_queue()
154 pvscsi_write_cmd_desc(pvscsi_softc_t *pvs, uint32_t cmd, void *desc, size_t len) in pvscsi_write_cmd_desc() argument
157 pvscsi_reg_write(pvs, PVSCSI_REG_OFFSET_COMMAND, cmd); in pvscsi_write_cmd_desc()
180 pvscsi_cmd_t *cmd; in pvscsi_reclaim_cmds() local
183 while ((cmd = list_remove_head(&pvs->cmd_queue)) != NULL) { in pvscsi_reclaim_cmds()
184 list_remove(&pvs->cmd_queue, cmd); in pvscsi_reclaim_cmds()
185 *tail = cmd; in pvscsi_reclaim_cmds()
186 tail = &cmd->next_cmd; in pvscsi_reclaim_cmds()
188 cmd->host_status = BTSTAT_BUSRESET; in pvscsi_reclaim_cmds()
224 pvscsi_cmd_t *cmd; in pvscsi_restart_hba() local
228 cmd = pvscsi_reclaim_cmds(pvs); in pvscsi_restart_hba()
233 pvscsi_complete_cmds(pvs, cmd); in pvscsi_restart_hba()
252 pvscsi_cmd_t *cmd; in pvscsi_process_comp_ring() local
271 if ((cmd = id32_lookup((uint32_t)cdesc->context)) != NULL) { in pvscsi_process_comp_ring()
272 cmd->next_cmd = NULL; in pvscsi_process_comp_ring()
275 cmd->host_status = cdesc->hostStatus; in pvscsi_process_comp_ring()
276 cmd->scsi_status = cdesc->scsiStatus; in pvscsi_process_comp_ring()
277 cmd->transferred = cdesc->dataLen; in pvscsi_process_comp_ring()
279 *pnext_cmd = cmd; in pvscsi_process_comp_ring()
280 pnext_cmd = &cmd->next_cmd; in pvscsi_process_comp_ring()
282 list_remove(&pvs->cmd_queue, cmd); in pvscsi_process_comp_ring()
362 pvscsi_abort_cmd(pvscsi_softc_t *pvs, pvscsi_cmd_t *cmd) in pvscsi_abort_cmd() argument
367 acmd.target = cmd->target; in pvscsi_abort_cmd()
368 acmd.context = cmd->ctx; in pvscsi_abort_cmd()
373 pvscsi_map_buffers(pvscsi_cmd_t *cmd, struct PVSCSIRingReqDesc *rdesc) in pvscsi_map_buffers() argument
375 struct scsi_pkt *pkt = cmd->pkt; in pvscsi_map_buffers()
387 struct PVSCSISGElement *sgl = cmd->sgl; in pvscsi_map_buffers()
396 rdesc->dataAddr = cmd->sgl_pa; in pvscsi_map_buffers()
398 (void) ddi_dma_sync(cmd->sgl_dmah, 0, 0, DDI_DMA_SYNC_FORDEV); in pvscsi_map_buffers()
408 pvscsi_comp_cmd(pvscsi_cmd_t *cmd) in pvscsi_comp_cmd() argument
410 struct scsi_pkt *pkt = cmd->pkt; in pvscsi_comp_cmd()
411 uint8_t status = cmd->scsi_status; in pvscsi_comp_cmd()
419 pkt->pkt_resid -= cmd->transferred; in pvscsi_comp_cmd()
433 bcopy(cmd->arq_sense, &ars->sts_sensedata, len); in pvscsi_comp_cmd()
443 pvscsi_set_status(pvscsi_softc_t *pvs, pvscsi_cmd_t *cmd) in pvscsi_set_status() argument
445 struct scsi_pkt *pkt = cmd->pkt; in pvscsi_set_status()
446 uint32_t host_status = cmd->host_status; in pvscsi_set_status()
452 pvscsi_comp_cmd(cmd); in pvscsi_set_status()
459 pkt->pkt_resid -= cmd->transferred; in pvscsi_set_status()
481 pkt->pkt_resid -= cmd->transferred; in pvscsi_set_status()
488 pkt->pkt_resid -= cmd->transferred; in pvscsi_set_status()
491 if (cmd->expired) { in pvscsi_set_status()
500 pkt->pkt_resid -= cmd->transferred; in pvscsi_set_status()
514 pkt->pkt_resid -= cmd->transferred; in pvscsi_set_status()
532 pvscsi_complete_cmds(pvscsi_softc_t *pvs, pvscsi_cmd_t *cmd) in pvscsi_complete_cmds() argument
536 while (cmd != NULL) { in pvscsi_complete_cmds()
537 pvscsi_cmd_t *next = cmd->next_cmd; in pvscsi_complete_cmds()
539 cmd->next_cmd = NULL; in pvscsi_complete_cmds()
541 if (((pkt = cmd->pkt) == NULL) || (cmd->poll)) { in pvscsi_complete_cmds()
542 atomic_or_8(&cmd->done, 1); in pvscsi_complete_cmds()
544 pvscsi_set_status(pvs, cmd); in pvscsi_complete_cmds()
548 cmd = next; in pvscsi_complete_cmds()
555 struct PVSCSICmdDescResetDevice cmd = { 0 }; in pvscsi_dev_reset() local
557 cmd.target = target; in pvscsi_dev_reset()
558 cmd.lun[1] = lun & 0xff; in pvscsi_dev_reset()
559 pvscsi_write_cmd_desc(pvs, PVSCSI_CMD_RESET_DEVICE, &cmd, sizeof (cmd)); in pvscsi_dev_reset()
563 pvscsi_poll_cmd_until(pvscsi_softc_t *pvs, pvscsi_cmd_t *cmd, clock_t usec) in pvscsi_poll_cmd_until() argument
567 if (cmd->done) { in pvscsi_poll_cmd_until()
583 pvscsi_poll_cmd(pvscsi_softc_t *pvs, pvscsi_cmd_t *cmd) in pvscsi_poll_cmd() argument
585 if (pvscsi_poll_cmd_until(pvs, cmd, drv_hztousec(cmd->timeout))) { in pvscsi_poll_cmd()
590 pvscsi_abort_cmd(pvs, cmd); in pvscsi_poll_cmd()
591 if (pvscsi_poll_cmd_until(pvs, cmd, 2)) { in pvscsi_poll_cmd()
595 pvscsi_dev_reset(pvs, cmd->target, cmd->lun); in pvscsi_poll_cmd()
596 if (pvscsi_poll_cmd_until(pvs, cmd, 2)) { in pvscsi_poll_cmd()
601 if (pvscsi_poll_cmd_until(pvs, cmd, 2)) { in pvscsi_poll_cmd()
611 pvscsi_cmd_t *cmd; in pvscsi_abort_all() local
615 for (cmd = list_head(l); cmd != NULL; cmd = list_next(l, cmd)) { in pvscsi_abort_all()
616 if ((pd->target == cmd->target) && (pd->lun == cmd->lun)) { in pvscsi_abort_all()
617 pvscsi_abort_cmd(pvs, cmd); in pvscsi_abort_all()
624 pvscsi_transport_command(pvscsi_softc_t *pvs, pvscsi_cmd_t *cmd) in pvscsi_transport_command() argument
630 cmd->done = 0; in pvscsi_transport_command()
631 cmd->expired = 0; in pvscsi_transport_command()
643 rdesc->target = cmd->target; in pvscsi_transport_command()
646 rdesc->lun[1] = cmd->lun & 0xff; in pvscsi_transport_command()
648 bzero(cmd->arq_sense, sizeof (cmd->arq_sense)); in pvscsi_transport_command()
649 rdesc->context = cmd->ctx; in pvscsi_transport_command()
650 rdesc->senseLen = sizeof (cmd->arq_sense); in pvscsi_transport_command()
651 rdesc->senseAddr = cmd->arq_pa; in pvscsi_transport_command()
652 rdesc->tag = cmd->tag; in pvscsi_transport_command()
654 rdesc->cdbLen = cmd->cdblen; in pvscsi_transport_command()
655 rdesc->flags = cmd->dma_dir; in pvscsi_transport_command()
656 bcopy(cmd->cdb, rdesc->cdb, cmd->cdblen); in pvscsi_transport_command()
657 pvscsi_map_buffers(cmd, rdesc); in pvscsi_transport_command()
664 pvscsi_add_to_queue(pvs, cmd); in pvscsi_transport_command()
666 switch (cmd->cdb[0]) { in pvscsi_transport_command()
783 struct PVSCSICmdDescSetupRings cmd = { 0 }; in pvscsi_setup_rings() local
786 cmd.ringsStatePPN = pvs->state_buf.pa >> PAGE_SHIFT; in pvscsi_setup_rings()
787 cmd.reqRingNumPages = pvs->req_pages; in pvscsi_setup_rings()
788 cmd.cmpRingNumPages = pvs->cmp_pages; in pvscsi_setup_rings()
793 cmd.reqRingPPNs[i] = base >> PAGE_SHIFT; in pvscsi_setup_rings()
800 cmd.cmpRingPPNs[i] = base >> PAGE_SHIFT; in pvscsi_setup_rings()
809 pvscsi_write_cmd_desc(pvs, PVSCSI_CMD_SETUP_RINGS, &cmd, sizeof (cmd)); in pvscsi_setup_rings()
920 pvscsi_cmd_t *cmd; in pvscsi_intr() local
936 cmd = pvscsi_process_comp_ring(pvs); in pvscsi_intr()
952 pvscsi_complete_cmds(pvs, cmd); in pvscsi_intr()
1052 pvscsi_cmd_t *cmd; in pvscsi_timeout() local
1067 for (cmd = list_head(l); cmd != NULL; cmd = list_next(l, cmd)) { in pvscsi_timeout()
1071 if (cmd->poll) { in pvscsi_timeout()
1075 overdue = now - (cmd->start + cmd->timeout); in pvscsi_timeout()
1087 if (!cmd->expired) { in pvscsi_timeout()
1088 atomic_or_8(&cmd->expired, 1); in pvscsi_timeout()
1090 drv_hztousec(cmd->timeout)/1000000); in pvscsi_timeout()
1101 pvscsi_dev_reset(pvs, cmd->target, cmd->lun); in pvscsi_timeout()
1122 cmd = pvscsi_process_comp_ring(pvs); in pvscsi_timeout()
1133 pvscsi_complete_cmds(pvs, cmd); in pvscsi_timeout()
1139 pvscsi_cmd_t *cmd = pkt->pkt_ha_private; in pvscsi_start() local
1149 (pkt->pkt_cdblen > sizeof (cmd->cdb)) || in pvscsi_start()
1156 ASSERT(cmd->pkt == pkt); in pvscsi_start()
1158 poll = cmd->poll = ((pkt->pkt_flags & FLAG_NOINTR) != 0); in pvscsi_start()
1161 cmd->tag = MSG_HEAD_QTAG; in pvscsi_start()
1163 cmd->tag = MSG_ORDERED_QTAG; in pvscsi_start()
1165 cmd->tag = MSG_SIMPLE_QTAG; in pvscsi_start()
1168 bcopy(pkt->pkt_cdbp, cmd->cdb, pkt->pkt_cdblen); in pvscsi_start()
1169 cmd->cdblen = pkt->pkt_cdblen; in pvscsi_start()
1170 bzero(&cmd->cmd_scb, sizeof (cmd->cmd_scb)); in pvscsi_start()
1187 cmd->dma_dir = PVSCSI_FLAG_CMD_DIR_TOHOST; in pvscsi_start()
1189 cmd->dma_dir = PVSCSI_FLAG_CMD_DIR_TODEVICE; in pvscsi_start()
1191 cmd->dma_dir = 0; in pvscsi_start()
1195 cmd->target = pd->target; in pvscsi_start()
1196 cmd->lun = pd->lun; in pvscsi_start()
1197 cmd->start = ddi_get_lbolt(); in pvscsi_start()
1198 cmd->timeout = pkt->pkt_time * pvscsi_hz; in pvscsi_start()
1200 rc = pvscsi_transport_command(pvs, cmd); in pvscsi_start()
1203 pvscsi_poll_cmd(pvs, cmd); in pvscsi_start()
1204 pvscsi_set_status(pvs, cmd); in pvscsi_start()
1238 struct PVSCSICmdDescConfigCmd cmd; in pvscsi_max_targets() local
1249 bzero(&cmd, sizeof (cmd)); in pvscsi_max_targets()
1250 cmd.configPageAddress = PVSCSI_CONFIG_CONTROLLER_ADDRESS; in pvscsi_max_targets()
1251 cmd.configPageAddress <<= 32; in pvscsi_max_targets()
1252 cmd.configPageNum = PVSCSI_CONFIG_PAGE_CONTROLLER; in pvscsi_max_targets()
1253 cmd.cmpAddr = db.pa; in pvscsi_max_targets()
1255 pvscsi_write_cmd_desc(pvs, PVSCSI_CMD_CONFIG, &cmd, sizeof (cmd)); in pvscsi_max_targets()
1274 pvscsi_cmd_t cmd; in pvscsi_probe_target() local
1276 if (!pvscsi_cmd_init(pvs, &cmd, KM_SLEEP)) { in pvscsi_probe_target()
1277 pvscsi_cmd_fini(&cmd); in pvscsi_probe_target()
1281 bzero(cmd.cdb, sizeof (cmd.cdb)); in pvscsi_probe_target()
1282 cmd.poll = B_TRUE; in pvscsi_probe_target()
1283 cmd.dma_dir = 0; in pvscsi_probe_target()
1284 cmd.target = target; in pvscsi_probe_target()
1285 cmd.lun = 0; in pvscsi_probe_target()
1286 cmd.start = ddi_get_lbolt(); in pvscsi_probe_target()
1287 cmd.timeout = pvscsi_hz; in pvscsi_probe_target()
1289 if (pvscsi_transport_command(pvs, &cmd) != TRAN_ACCEPT) { in pvscsi_probe_target()
1290 pvscsi_cmd_fini(&cmd); in pvscsi_probe_target()
1293 pvscsi_poll_cmd(pvs, &cmd); in pvscsi_probe_target()
1295 switch (cmd.host_status) { in pvscsi_probe_target()
1300 pvscsi_cmd_fini(&cmd); in pvscsi_probe_target()
1304 pvscsi_cmd_fini(&cmd); in pvscsi_probe_target()
1367 pvscsi_cmd_t *cmd; in pvscsi_reset() local
1393 cmd = pvscsi_process_comp_ring(pvs); in pvscsi_reset()
1396 pvscsi_complete_cmds(pvs, cmd); in pvscsi_reset()
1406 pvscsi_cmd_t *cmd; in pvscsi_abort() local
1410 cmd = pkt->pkt_ha_private; in pvscsi_abort()
1411 pvs = cmd->pvs; in pvscsi_abort()
1412 pvscsi_abort_cmd(pvs, cmd); in pvscsi_abort()
1425 cmd = pvscsi_process_comp_ring(pvs); in pvscsi_abort()
1428 pvscsi_complete_cmds(pvs, cmd); in pvscsi_abort()
1475 pvscsi_cmd_fini(pvscsi_cmd_t *cmd) in pvscsi_cmd_fini() argument
1477 if (cmd->arq_pa != 0) { in pvscsi_cmd_fini()
1478 (void) ddi_dma_unbind_handle(cmd->arq_dmah); in pvscsi_cmd_fini()
1479 cmd->arq_dmah = NULL; in pvscsi_cmd_fini()
1481 if (cmd->arq_dmah != NULL) { in pvscsi_cmd_fini()
1482 ddi_dma_free_handle(&cmd->arq_dmah); in pvscsi_cmd_fini()
1483 cmd->arq_dmah = NULL; in pvscsi_cmd_fini()
1485 if (cmd->sgl_pa != 0) { in pvscsi_cmd_fini()
1486 (void) ddi_dma_unbind_handle(cmd->sgl_dmah); in pvscsi_cmd_fini()
1487 cmd->sgl_pa = 0; in pvscsi_cmd_fini()
1489 if (cmd->sgl_acch != NULL) { in pvscsi_cmd_fini()
1490 ddi_dma_mem_free(&cmd->sgl_acch); in pvscsi_cmd_fini()
1491 cmd->sgl_acch = NULL; in pvscsi_cmd_fini()
1492 cmd->sgl = NULL; in pvscsi_cmd_fini()
1494 if (cmd->sgl_dmah != NULL) { in pvscsi_cmd_fini()
1495 ddi_dma_free_handle(&cmd->sgl_dmah); in pvscsi_cmd_fini()
1496 cmd->sgl_dmah = NULL; in pvscsi_cmd_fini()
1498 if (cmd->ctx != 0) { in pvscsi_cmd_fini()
1499 id32_free(cmd->ctx); in pvscsi_cmd_fini()
1500 cmd->ctx = 0; in pvscsi_cmd_fini()
1507 pvscsi_cmd_t *cmd = pkt->pkt_ha_private; in pvscsi_pkt_dtor() local
1508 pvscsi_cmd_fini(cmd); in pvscsi_pkt_dtor()
1512 pvscsi_cmd_init(pvscsi_softc_t *pvs, pvscsi_cmd_t *cmd, int sleep) in pvscsi_cmd_init() argument
1520 bzero(cmd, sizeof (*cmd)); in pvscsi_cmd_init()
1521 cmd->ctx = id32_alloc(cmd, sleep); in pvscsi_cmd_init()
1522 if (cmd->ctx == 0) { in pvscsi_cmd_init()
1530 &cmd->sgl_dmah) != DDI_SUCCESS) { in pvscsi_cmd_init()
1535 if (ddi_dma_mem_alloc(cmd->sgl_dmah, PAGE_SIZE, &pvscsi_dma_attrs, in pvscsi_cmd_init()
1536 DDI_DMA_CONSISTENT, cb, NULL, &kaddr, &len, &cmd->sgl_acch) != in pvscsi_cmd_init()
1542 cmd->sgl = (void *)kaddr; in pvscsi_cmd_init()
1543 if (ddi_dma_addr_bind_handle(cmd->sgl_dmah, NULL, kaddr, in pvscsi_cmd_init()
1549 cmd->sgl_pa = ddi_dma_cookie_one(cmd->sgl_dmah)->dmac_laddress; in pvscsi_cmd_init()
1553 cb, NULL, &cmd->arq_dmah) != DDI_SUCCESS) { in pvscsi_cmd_init()
1559 if (ddi_dma_addr_bind_handle(cmd->arq_dmah, NULL, in pvscsi_cmd_init()
1560 (void *)cmd->arq_sense, SENSE_LENGTH, in pvscsi_cmd_init()
1566 cmd->arq_pa = ddi_dma_cookie_one(cmd->arq_dmah)->dmac_laddress; in pvscsi_cmd_init()
1573 pvscsi_cmd_t *cmd = pkt->pkt_ha_private; in pvscsi_pkt_ctor() local
1576 if (!pvscsi_cmd_init(pvs, cmd, sleep)) { in pvscsi_pkt_ctor()
1580 cmd->pkt = pkt; in pvscsi_pkt_ctor()
1720 pvscsi_attach(dev_info_t *dip, ddi_attach_cmd_t cmd) in pvscsi_attach() argument
1724 if (cmd != DDI_ATTACH) { in pvscsi_attach()
1839 pvscsi_detach(dev_info_t *dip, ddi_detach_cmd_t cmd) in pvscsi_detach() argument
1844 if (cmd != DDI_DETACH) { in pvscsi_detach()