Lines Matching defs:sg_state

102 #define	SGEN_DO_ERRSTATS(sg_state, x)  \
103 if (sg_state->sgen_kstats) { \
105 sp = (struct sgen_errstats *)sg_state->sgen_kstats->ks_data; \
572 sgen_state_t *sg_state;
604 sg_state = ddi_get_soft_state(sgen_soft_state, instance);
605 sg_state->sgen_scsidev = scsidevp;
609 * Now that sg_state->sgen_scsidev is initialized, it's ok to
610 * call sgen_log with sg_state instead of NULL.
615 * sgen_diag setting by setting sg_state's sgen_diag value. If the
618 sg_state->sgen_diag = ddi_getprop(DDI_DEV_T_ANY, dip, DDI_PROP_DONTPASS,
621 if (sg_state->sgen_diag != -1) {
622 if (sg_state->sgen_diag < 0 || sg_state->sgen_diag > 3)
623 sg_state->sgen_diag = 0;
626 sgen_log(sg_state, SGEN_DIAG2,
638 sgen_log(sg_state, SGEN_DIAG1,
649 sg_state->sgen_cmdbuf = getrbuf(KM_SLEEP);
650 cv_init(&sg_state->sgen_cmdbuf_cv, NULL, CV_DRIVER, NULL);
652 SGEN_CLR_BUSY(sg_state);
653 SGEN_CLR_OPEN(sg_state);
654 SGEN_CLR_SUSP(sg_state);
659 if (scsi_ifgetcap(&sg_state->sgen_scsiaddr, "wide-xfer", 1) != -1) {
664 if (scsi_ifsetcap(&sg_state->sgen_scsiaddr, "wide-xfer",
666 sgen_log(sg_state, SGEN_DIAG1,
680 if (scsi_ifsetcap(&sg_state->sgen_scsiaddr, "auto-rqsense",
682 sg_state->sgen_arq_enabled = 0;
684 sg_state->sgen_arq_enabled = 1;
690 if (scsi_ifgetcap(&sg_state->sgen_scsiaddr,
692 if (scsi_ifsetcap(&sg_state->sgen_scsiaddr,
694 sg_state->sgen_arq_enabled = 1;
695 sgen_log(sg_state, SGEN_DIAG1,
700 sg_state->sgen_arq_enabled = 0;
701 sgen_log(sg_state, SGEN_DIAG1,
707 sg_state->sgen_arq_enabled = 1; /* already enabled */
708 sgen_log(sg_state, SGEN_DIAG1,
717 if (sgen_setup_sense(sg_state) != 0) {
718 freerbuf(sg_state->sgen_cmdbuf);
722 sgen_log(sg_state, SGEN_DIAG1,
729 sgen_create_errstats(sg_state, instance);
742 sgen_setup_sense(sgen_state_t *sg_state)
747 if ((bp = scsi_alloc_consistent_buf(&sg_state->sgen_scsiaddr, NULL,
752 if ((rqpkt = scsi_init_pkt(&sg_state->sgen_scsiaddr, NULL, bp,
762 sg_state->sgen_sense = (struct scsi_extended_sense *)bp->b_un.b_addr;
766 FILL_SCSI1_LUN(sg_state->sgen_scsidev, rqpkt);
771 rqpkt->pkt_private = sg_state;
773 sg_state->sgen_rqspkt = rqpkt;
774 sg_state->sgen_rqsbuf = bp;
784 sgen_create_errstats(sgen_state_t *sg_state, int instance)
791 sg_state->sgen_kstats = kstat_create("sgenerr", instance,
796 if (sg_state->sgen_kstats == NULL)
799 stp = (struct sgen_errstats *)sg_state->sgen_kstats->ks_data;
820 sg_state->sgen_kstats->ks_private = sg_state;
821 sg_state->sgen_kstats->ks_update = nulldev;
822 kstat_install(sg_state->sgen_kstats);
833 sgen_state_t *sg_state;
836 sg_state = ddi_get_soft_state(sgen_soft_state, instance);
838 sgen_log(sg_state, SGEN_DIAG2, "in sgen_detach(), "
841 if (sg_state == NULL) {
868 sgen_state_t *sg_state;
872 sg_state = ddi_get_soft_state(sgen_soft_state, instance);
873 ASSERT(sg_state);
875 sgen_log(sg_state, SGEN_DIAG2, "in sgen_do_detach(), "
879 mutex_enter(&sg_state->sgen_mutex);
880 if (SGEN_IS_BUSY(sg_state)) {
881 mutex_exit(&sg_state->sgen_mutex);
882 sgen_log(sg_state, SGEN_DIAG1, "sgen_do_detach: failed because "
887 mutex_exit(&sg_state->sgen_mutex);
893 if (sg_state->sgen_restart_timeid)
894 (void) untimeout(sg_state->sgen_restart_timeid);
895 sg_state->sgen_restart_timeid = 0;
901 scsi_free_consistent_buf(sg_state->sgen_rqsbuf);
902 scsi_destroy_pkt(sg_state->sgen_rqspkt);
904 if (sg_state->sgen_kstats) {
905 kstat_delete(sg_state->sgen_kstats);
906 sg_state->sgen_kstats = NULL;
912 freerbuf(sg_state->sgen_cmdbuf);
913 cv_destroy(&sg_state->sgen_cmdbuf_cv);
915 sgen_log(sg_state, SGEN_DIAG2, "done sgen_do_detach(), "
936 sgen_state_t *sg_state;
939 sg_state = ddi_get_soft_state(sgen_soft_state, instance);
940 ASSERT(sg_state);
942 sgen_log(sg_state, SGEN_DIAG2, "in sgen_do_suspend(), "
945 if (sg_state->sgen_restart_timeid) {
946 (void) untimeout(sg_state->sgen_restart_timeid);
948 sg_state->sgen_restart_timeid = 0;
950 mutex_enter(&sg_state->sgen_mutex);
951 if (SGEN_IS_OPEN(sg_state))
952 SGEN_SET_SUSP(sg_state);
953 mutex_exit(&sg_state->sgen_mutex);
955 sgen_log(sg_state, SGEN_DIAG2, "done sgen_do_suspend(), "
969 sgen_state_t *sg_state;
975 if ((sg_state = ddi_get_soft_state(sgen_soft_state, instance))
978 *result = (void *) sg_state->sgen_scsidev->sd_dev;
1057 sgen_state_t *sg_state;
1062 if ((sg_state = ddi_get_soft_state(sgen_soft_state, instance)) == NULL)
1065 sgen_log(sg_state, SGEN_DIAG2, "in sgen_open(): instance = %d",
1068 mutex_enter(&sg_state->sgen_mutex);
1075 if (SGEN_IS_SUSP(sg_state)) {
1076 mutex_exit(&sg_state->sgen_mutex);
1083 if (SGEN_IS_EXCL(sg_state) ||
1084 (SGEN_IS_OPEN(sg_state) && (flag & FEXCL))) {
1085 mutex_exit(&sg_state->sgen_mutex);
1090 SGEN_SET_EXCL(sg_state);
1092 SGEN_SET_OPEN(sg_state);
1094 mutex_exit(&sg_state->sgen_mutex);
1107 sgen_state_t *sg_state;
1112 if ((sg_state = ddi_get_soft_state(sgen_soft_state, instance)) == NULL)
1115 sgen_log(sg_state, SGEN_DIAG2, "in sgen_close(): instance = %d",
1118 mutex_enter(&sg_state->sgen_mutex);
1119 SGEN_CLR_OPEN(sg_state);
1120 SGEN_CLR_EXCL(sg_state);
1121 SGEN_CLR_SUSP(sg_state); /* closing clears the 'I was suspended' bit */
1122 mutex_exit(&sg_state->sgen_mutex);
1124 sgen_log(sg_state, SGEN_DIAG2, "done sgen_close()");
1139 sgen_state_t *sg_state;
1144 if ((sg_state = ddi_get_soft_state(sgen_soft_state, instance)) == NULL)
1147 sgen_log(sg_state, SGEN_DIAG2, "in sgen_ioctl(): instance = %d",
1154 mutex_enter(&sg_state->sgen_mutex);
1155 if (SGEN_IS_SUSP(sg_state)) {
1156 mutex_exit(&sg_state->sgen_mutex);
1157 sgen_log(sg_state, SGEN_DIAG1, "sgen_ioctl: returning EIO: "
1161 mutex_exit(&sg_state->sgen_mutex);
1168 sg_state->sgen_diag = (int)arg;
1190 sgen_log(sg_state, SGEN_DIAG2, "done sgen_ioctl(), returning %d",
1206 sgen_state_t *sg_state;
1214 sg_state = ddi_get_soft_state(sgen_soft_state, instance);
1215 ASSERT(sg_state);
1217 sgen_log(sg_state, SGEN_DIAG2, "in sgen_uscsi_cmd(): instance = %d",
1224 if (sgen_hold_cmdbuf(sg_state) != 0) {
1225 sgen_log(sg_state, SGEN_DIAG1, "sgen_uscsi_cmd: interrupted");
1230 &sg_state->sgen_scsiaddr, &uscmd);
1232 sgen_rele_cmdbuf(sg_state);
1233 sgen_log(sg_state, SGEN_DIAG1, "sgen_uscsi_cmd: "
1244 sgen_log(sg_state, SGEN_DIAG1, "sgen_uscsi_cmd: cleared "
1250 sgen_dump_cdb(sg_state, "sgen_uscsi_cmd: ",
1257 sg_state->sgen_rqs_sen = uscmd->uscsi_rqbuf;
1259 bp = sg_state->sgen_cmdbuf;
1267 if (sg_state->sgen_cmdpkt != NULL) {
1268 uscmd->uscsi_status = SCBP_C(sg_state->sgen_cmdpkt);
1273 sgen_log(sg_state, SGEN_DIAG3, "sgen_uscsi_cmd: awake from waiting "
1278 sgen_dump_sense(sg_state, rqlen,
1284 if (sg_state->sgen_cmdpkt != NULL) {
1285 scsi_destroy_pkt(sg_state->sgen_cmdpkt);
1286 sg_state->sgen_cmdpkt = NULL;
1292 sgen_rele_cmdbuf(sg_state);
1294 sgen_log(sg_state, SGEN_DIAG2, "done sgen_uscsi_cmd()");
1305 sgen_hold_cmdbuf(sgen_state_t *sg_state)
1307 mutex_enter(&sg_state->sgen_mutex);
1308 while (SGEN_IS_BUSY(sg_state)) {
1309 if (!cv_wait_sig(&sg_state->sgen_cmdbuf_cv,
1310 &sg_state->sgen_mutex)) {
1311 mutex_exit(&sg_state->sgen_mutex);
1315 SGEN_SET_BUSY(sg_state);
1316 mutex_exit(&sg_state->sgen_mutex);
1325 sgen_rele_cmdbuf(sgen_state_t *sg_state)
1327 mutex_enter(&sg_state->sgen_mutex);
1328 SGEN_CLR_BUSY(sg_state);
1329 cv_signal(&sg_state->sgen_cmdbuf_cv);
1330 mutex_exit(&sg_state->sgen_mutex);
1341 sgen_state_t *sg_state;
1345 if ((sg_state = ddi_get_soft_state(sgen_soft_state,
1357 ASSERT(bp == sg_state->sgen_cmdbuf && sg_state->sgen_cmdpkt == NULL);
1360 if (sgen_make_uscsi_cmd(sg_state, bp) != 0) {
1367 ASSERT(sg_state->sgen_cmdpkt != NULL);
1375 trans_err = sgen_scsi_transport(sg_state->sgen_cmdpkt);
1380 sgen_log(sg_state, SGEN_DIAG2,
1382 sg_state->sgen_restart_timeid = timeout(sgen_restart, sg_state,
1390 mutex_enter(&sg_state->sgen_mutex);
1391 SGEN_DO_ERRSTATS(sg_state, sgen_trans_err);
1392 mutex_exit(&sg_state->sgen_mutex);
1393 sgen_log(sg_state, SGEN_DIAG2, "sgen_start: scsi_transport() "
1399 sgen_log(sg_state, SGEN_DIAG2, "sgen_start: b_flags 0x%x", bp->b_flags);
1413 sgen_state_t *sg_state = pkt->pkt_private;
1421 sgen_log(sg_state, SGEN_DIAG1, "sgen_scsi_transport: "
1425 sgen_log(sg_state, SGEN_DIAG1, "sgen_scsi_transport: "
1442 sgen_make_uscsi_cmd(sgen_state_t *sg_state, struct buf *bp)
1451 sgen_log(sg_state, SGEN_DIAG2, "in sgen_make_uscsi_cmd()");
1466 sgen_log(sg_state, SGEN_DIAG3, "sgen_make_uscsi_cmd: b_bcount = %ld",
1468 pkt = scsi_init_pkt(&sg_state->sgen_scsiaddr,
1476 (caddr_t)sg_state); /* callback_arg */
1479 sgen_log(sg_state, SGEN_DIAG2, "failed sgen_make_uscsi_cmd()");
1484 pkt->pkt_private = sg_state;
1485 sg_state->sgen_cmdpkt = pkt;
1495 FILL_SCSI1_LUN(sg_state->sgen_scsidev, pkt);
1519 sgen_log(sg_state, SGEN_DIAG2, "done sgen_make_uscsi_cmd()");
1532 sgen_state_t *sg_state = (sgen_state_t *)arg;
1536 sgen_log(sg_state, SGEN_DIAG2, "in sgen_restart()");
1538 bp = sg_state->sgen_cmdbuf;
1539 pkt = sg_state->sgen_cmdpkt;
1542 SGEN_DO_ERRSTATS(sg_state, sgen_restart);
1549 sgen_log(sg_state, SGEN_DIAG3,
1551 pkt = sg_state->sgen_rqspkt;
1572 sgen_state_t *sg_state;
1577 sg_state = pkt->pkt_private;
1584 bp = sg_state->sgen_cmdbuf;
1586 ASSERT(pkt == sg_state->sgen_rqspkt);
1587 sgen_log(sg_state, SGEN_DIAG2,
1590 ASSERT(pkt == sg_state->sgen_cmdpkt);
1591 sgen_log(sg_state, SGEN_DIAG2,
1596 sgen_log(sg_state, SGEN_DIAG3, "sgen_callback: reason=0x%x resid=%ld "
1606 sgen_log(sg_state, SGEN_DIAG3,
1608 action = sgen_handle_incomplete(sg_state, pkt);
1609 } else if (sg_state->sgen_arq_enabled &&
1615 sgen_log(sg_state, SGEN_DIAG3,
1617 action = sgen_handle_autosense(sg_state, pkt);
1626 sgen_log(sg_state, SGEN_DIAG3, "sgen_callback: received sense");
1627 sg_state->sgen_cmdpkt->pkt_flags &= ~FLAG_SENSING;
1628 action = sgen_handle_sense(sg_state);
1635 sgen_log(sg_state, SGEN_DIAG3,
1637 action = sgen_check_error(sg_state, bp);
1646 if (sgen_initiate_sense(sg_state,
1663 sgen_log(sg_state, SGEN_DIAG2, "done sgen_callback()");
1671 sgen_initiate_sense(sgen_state_t *sg_state, int path_instance)
1674 if (scsi_pkt_allocated_correctly(sg_state->sgen_rqspkt))
1675 sg_state->sgen_rqspkt->pkt_path_instance = path_instance;
1677 switch (sgen_scsi_transport(sg_state->sgen_rqspkt)) {
1679 sgen_log(sg_state, SGEN_DIAG3, "sgen_initiate_sense: "
1683 sgen_log(sg_state, SGEN_DIAG2, "sgen_initiate_sense: "
1685 sg_state->sgen_restart_timeid = timeout(sgen_restart, sg_state,
1689 sgen_log(sg_state, SGEN_DIAG2, "sgen_initiate_sense: "
1707 sgen_handle_incomplete(sgen_state_t *sg_state, struct scsi_pkt *pkt)
1709 SGEN_DO_ERRSTATS(sg_state, sgen_incmp_err);
1723 sgen_handle_autosense(sgen_state_t *sg_state, struct scsi_pkt *pkt)
1727 (struct uscsi_cmd *)sg_state->sgen_cmdbuf->b_private;
1732 SGEN_DO_ERRSTATS(sg_state, sgen_autosen_rcv);
1735 sgen_log(sg_state, SGEN_DIAG1, "sgen_handle_autosense: ARQ"
1737 SGEN_DO_ERRSTATS(sg_state, sgen_autosen_bad);
1755 ASSERT(ucmd->uscsi_rqlen && sg_state->sgen_rqs_sen);
1756 bcopy(&(arqstat->sts_sensedata), sg_state->sgen_rqs_sen, rqlen);
1757 sgen_log(sg_state, SGEN_DIAG2, "sgen_handle_autosense: "
1763 sgen_log(sg_state, SGEN_DIAG1, "sgen_handle_autosense: got "
1765 SGEN_DO_ERRSTATS(sg_state, sgen_autosen_bad);
1771 sgen_log(sg_state, SGEN_DIAG1, "sgen_handle_autosense: got "
1773 SGEN_DO_ERRSTATS(sg_state, sgen_autosen_bad);
1780 sg_state->sgen_sense = &arqstat->sts_sensedata;
1787 sgen_log(sg_state, SGEN_DIAG1, "sgen_handle_autosense: not "
1794 SGEN_DO_ERRSTATS(sg_state, sgen_recov_err);
1797 SGEN_DO_ERRSTATS(sg_state, sgen_nosen_err);
1800 SGEN_DO_ERRSTATS(sg_state, sgen_unrecov_err);
1812 sgen_handle_sense(sgen_state_t *sg_state)
1814 struct scsi_pkt *rqpkt = sg_state->sgen_rqspkt;
1817 (struct uscsi_cmd *)sg_state->sgen_cmdbuf->b_private;
1820 SGEN_DO_ERRSTATS(sg_state, sgen_sense_rcv);
1828 ASSERT(ucmd->uscsi_rqlen && sg_state->sgen_rqs_sen);
1829 bcopy(sg_state->sgen_sense, sg_state->sgen_rqs_sen, rqlen);
1830 sgen_log(sg_state, SGEN_DIAG2, "sgen_handle_sense: "
1836 sgen_log(sg_state, SGEN_DIAG1, "sgen_handle_sense: got busy "
1838 SGEN_DO_ERRSTATS(sg_state, sgen_sense_bad);
1843 sgen_log(sg_state, SGEN_DIAG1, "sgen_handle_sense: got check "
1845 SGEN_DO_ERRSTATS(sg_state, sgen_sense_bad);
1850 sgen_log(sg_state, SGEN_DIAG1, "sgen_handle_sense: got "
1852 SGEN_DO_ERRSTATS(sg_state, sgen_sense_bad);
1861 sgen_log(sg_state, SGEN_DIAG1, "sgen_handle_sense: not "
1863 SGEN_DO_ERRSTATS(sg_state, sgen_sense_bad);
1872 sgen_log(sg_state, SGEN_DIAG1, "Sense key is %s [0x%x]",
1873 scsi_sname(sg_state->sgen_sense->es_key),
1874 sg_state->sgen_sense->es_key);
1875 switch (sg_state->sgen_sense->es_key) {
1877 SGEN_DO_ERRSTATS(sg_state, sgen_recov_err);
1880 SGEN_DO_ERRSTATS(sg_state, sgen_nosen_err);
1883 SGEN_DO_ERRSTATS(sg_state, sgen_unrecov_err);
1898 sgen_check_error(sgen_state_t *sg_state, struct buf *bp)
1900 struct scsi_pkt *pkt = sg_state->sgen_cmdpkt;
1903 (struct uscsi_cmd *)sg_state->sgen_cmdbuf->b_private;
1906 sgen_log(sg_state, SGEN_DIAG1,
1921 if (sg_state->sgen_arq_enabled) {
1922 sgen_log(sg_state, SGEN_DIAG1,
1927 sgen_log(sg_state, SGEN_DIAG2, "sgen_check_error: "
1931 sgen_log(sg_state, SGEN_DIAG2, "sgen_check_error: "
1963 * given an sg_state and a desired diagnostic level, return true if
1968 sgen_diag_ok(sgen_state_t *sg_state, int level)
1981 if (sg_state) {
1988 if (sg_state->sgen_diag != -1)
1989 diag_lvl = sg_state->sgen_diag;
2007 sgen_log(sgen_state_t *sg_state, int level, const char *fmt, ...)
2012 if (!sgen_diag_ok(sg_state, level))
2024 if (sg_state == (sgen_state_t *)NULL) {
2027 scsi_log(sg_state->sgen_devinfo, sgen_label, level,
2035 if (sg_state == (sgen_state_t *)NULL) {
2038 scsi_log(sg_state->sgen_devinfo, sgen_label, CE_CONT,
2050 sgen_dump_cdb(sgen_state_t *sg_state, const char *label,
2063 if (!sgen_diag_ok(sg_state, SGEN_DIAG3))
2082 sgen_log(sg_state, SGEN_DIAG3, buf);
2087 sgen_dump_sense(sgen_state_t *sg_state, size_t rqlen, uchar_t *rqbuf)
2098 if (!sgen_diag_ok(sg_state, SGEN_DIAG3))
2117 sgen_log(sg_state, SGEN_DIAG3, buf);