Lines Matching +full:inter +full:- +full:chip

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
4 * Copyright (c) 2009-2020 Alexander Motin <mav@FreeBSD.org>
5 * Copyright (c) 1997-2009 by Matthew Jacob
34 * code for the Qlogic ISP SCSI and FC-SCSI adapters.
151 if (fcp->isp_fwstate == state) in isp_change_fw_state()
154 "Chan %d Firmware state <%s->%s>", chan, in isp_change_fw_state()
155 isp_fc_fw_statename(fcp->isp_fwstate), isp_fc_fw_statename(state)); in isp_change_fw_state()
156 fcp->isp_fwstate = state; in isp_change_fw_state()
166 fcp->flash_data_addr = ISP28XX_BASE_ADDR; in isp_get_flash_addrs()
167 fcp->flt_region_flt = ISP28XX_FLT_ADDR; in isp_get_flash_addrs()
169 fcp->flash_data_addr = ISP27XX_BASE_ADDR; in isp_get_flash_addrs()
170 fcp->flt_region_flt = ISP27XX_FLT_ADDR; in isp_get_flash_addrs()
172 fcp->flash_data_addr = ISP25XX_BASE_ADDR; in isp_get_flash_addrs()
173 fcp->flt_region_flt = ISP25XX_FLT_ADDR; in isp_get_flash_addrs()
175 fcp->flash_data_addr = ISP24XX_BASE_ADDR; in isp_get_flash_addrs()
176 fcp->flt_region_flt = ISP24XX_FLT_ADDR; in isp_get_flash_addrs()
178 fcp->flt_length = 0; in isp_get_flash_addrs()
184 fcp->flt_region_nvram = 0x300000; in isp_get_flash_addrs()
186 fcp->flash_data_addr = 0x7fe7c000; in isp_get_flash_addrs()
187 fcp->flt_region_nvram = 0; in isp_get_flash_addrs()
189 fcp->flt_region_nvram = 0x48000; in isp_get_flash_addrs()
191 fcp->flash_data_addr = 0x7ffe0000; in isp_get_flash_addrs()
192 fcp->flt_region_nvram = 0; in isp_get_flash_addrs()
194 fcp->flt_region_nvram += ISP2400_NVRAM_PORT_ADDR(isp->isp_port); in isp_get_flash_addrs()
201 * Hit the chip over the head, download new f/w if available and set it running.
217 isp->isp_state = ISP_NILSTATE; in isp_reset()
228 switch (isp->isp_type) { in isp_reset()
295 * Post-RISC Reset stuff. in isp_reset()
317 isp->isp_reqidx = isp->isp_reqodx = 0; in isp_reset()
318 isp->isp_resodx = 0; in isp_reset()
319 isp->isp_atioodx = 0; in isp_reset()
420 snprintf(fcp->fw_version_ispfw, sizeof(fcp->fw_version_ispfw), in isp_reset()
422 snprintf(fcp->fw_version_flash, sizeof(fcp->fw_version_flash), in isp_reset()
424 snprintf(fcp->fw_version_run, sizeof(fcp->fw_version_run), in isp_reset()
429 if (!(isp->isp_confopts & ISP_CFG_NORELOAD)) { in isp_reset()
431 snprintf(fwname, sizeof(fwname), "isp_%04x", isp->isp_did); in isp_reset()
432 isp->isp_osinfo.ispfw = firmware_get(fwname); in isp_reset()
433 if (isp->isp_osinfo.ispfw != NULL) { in isp_reset()
434 isp->isp_mdvec->dv_ispfw = isp->isp_osinfo.ispfw->data; in isp_reset()
435 const uint32_t *ispfwptr = isp->isp_mdvec->dv_ispfw; in isp_reset()
437 fcp->fw_ispfwrev[i] = ispfwptr[4 + i]; in isp_reset()
440 snprintf(fcp->fw_version_ispfw, in isp_reset()
441 sizeof(fcp->fw_version_ispfw), in isp_reset()
442 "%u.%u.%u", fcp->fw_ispfwrev[0], in isp_reset()
443 fcp->fw_ispfwrev[1], fcp->fw_ispfwrev[2]); in isp_reset()
446 fcp->fw_ispfwrev[0], fcp->fw_ispfwrev[1], in isp_reset()
447 fcp->fw_ispfwrev[2], fcp->fw_ispfwrev[3]); in isp_reset()
475 if (isp->isp_osinfo.ispfw != NULL) in isp_reset()
481 if (isp->isp_osinfo.ispfw != NULL) in isp_reset()
487 const uint32_t *ptr = isp->isp_mdvec->dv_ispfw; in isp_reset()
505 cp = isp->isp_rquest; in isp_reset()
515 wl -= nw; in isp_reset()
525 if (isp->isp_osinfo.ispfw != NULL) in isp_reset()
526 firmware_put(isp->isp_osinfo.ispfw, FIRMWARE_UNLOAD); in isp_reset()
572 fcp->fw_ability_mask = (mbs.param[3] << 16) | mbs.param[2]; in isp_reset()
574 fcp->fw_ability_mask); in isp_reset()
576 fcp->max_supported_speed = mbs.param[2] & (0x1 | 0x2); in isp_reset()
578 fcp->max_supported_speed == 0 ? "16Gbit/s" : in isp_reset()
579 fcp->max_supported_speed == 1 ? "32Gbit/s" : in isp_reset()
580 fcp->max_supported_speed == 2 ? "64Gbit/s" : "unknown"); in isp_reset()
588 * Ask the chip for the current firmware version. in isp_reset()
597 isp->isp_fwrev[0] = mbs.param[1]; in isp_reset()
598 isp->isp_fwrev[1] = mbs.param[2]; in isp_reset()
599 isp->isp_fwrev[2] = mbs.param[3]; in isp_reset()
600 isp->isp_fwattr = mbs.param[6]; in isp_reset()
601 isp->isp_fwattr_h = mbs.param[15]; in isp_reset()
602 if (isp->isp_fwattr & ISP_FW_ATTR_EXTNDED) { in isp_reset()
603 isp->isp_fwattr_ext[0] = mbs.param[16]; in isp_reset()
604 isp->isp_fwattr_ext[1] = mbs.param[17]; in isp_reset()
607 isp_prt(isp, ISP_LOGCONFIG, "Board Type %s, Chip Revision 0x%x, %s F/W Revision %d.%d.%d", in isp_reset()
608 btype, isp->isp_revision, dodnld ? "loaded" : "resident", in isp_reset()
609 isp->isp_fwrev[0], isp->isp_fwrev[1], isp->isp_fwrev[2]); in isp_reset()
610 snprintf(fcp->fw_version_run, sizeof(fcp->fw_version_run), in isp_reset()
611 "%u.%u.%u", isp->isp_fwrev[0], isp->isp_fwrev[1], in isp_reset()
612 isp->isp_fwrev[2]); in isp_reset()
614 snprintf(fcp->fw_version_flash, sizeof(fcp->fw_version_flash), in isp_reset()
615 "%s", fcp->fw_version_run); in isp_reset()
617 fwt = isp->isp_fwattr; in isp_reset()
618 buf = FCPARAM(isp, 0)->isp_scanscratch; in isp_reset()
622 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s Class2", buf); in isp_reset()
626 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s IP", buf); in isp_reset()
630 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s MultiID", buf); in isp_reset()
634 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s SB2", buf); in isp_reset()
638 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s T10CRC", buf); in isp_reset()
642 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s VI", buf); in isp_reset()
646 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s MQ", buf); in isp_reset()
650 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s MSIX", buf); in isp_reset()
654 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s FCOE", buf); in isp_reset()
658 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s VP0_Decoupling", buf); in isp_reset()
662 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s (Experimental)", buf); in isp_reset()
666 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s HotFW", buf); in isp_reset()
670 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), in isp_reset()
675 fwt = isp->isp_fwattr_h; in isp_reset()
676 buf = FCPARAM(isp, 0)->isp_scanscratch; in isp_reset()
680 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s ExtVP", buf); in isp_reset()
684 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s VN2VN", buf); in isp_reset()
688 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s EXMOFF", buf); in isp_reset()
692 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s NPMOFF", buf); in isp_reset()
696 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s DIFCHOP", buf); in isp_reset()
700 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s SRIOV", buf); in isp_reset()
704 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s NVMe", buf); in isp_reset()
708 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s NVMe(updated)", buf); in isp_reset()
712 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s NVMe(first burst)", buf); in isp_reset()
715 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), in isp_reset()
720 fwt = isp->isp_fwattr_ext[0]; in isp_reset()
721 buf = FCPARAM(isp, 0)->isp_scanscratch; in isp_reset()
725 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s ASICTMP", buf); in isp_reset()
729 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s ATIOMQ", buf); in isp_reset()
733 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s EDIF", buf); in isp_reset()
737 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s SCM", buf); in isp_reset()
741 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), "%s NVMe-2", buf); in isp_reset()
744 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), in isp_reset()
749 fwt = isp->isp_fwattr_ext[1]; in isp_reset()
750 buf = FCPARAM(isp, 0)->isp_scanscratch; in isp_reset()
753 ISP_SNPRINTF(buf, ISP_FC_SCRLEN - strlen(buf), in isp_reset()
767 isp->isp_maxcmds = MIN(mbs.param[3], ISP_HANDLE_MAX - ISP_HANDLE_RESERVE); in isp_reset()
768 isp_prt(isp, ISP_LOGCONFIG, "%d max I/O command limit set", isp->isp_maxcmds); in isp_reset()
771 * If we don't have Multi-ID f/w loaded, we need to restrict channels to one. in isp_reset()
772 * Only make this check for non-SCSI cards (I'm not sure firmware attributes in isp_reset()
775 if (isp->isp_nchan > 1) { in isp_reset()
777 isp_prt(isp, ISP_LOGWARN, "non-MULTIID f/w loaded, " in isp_reset()
778 "only can enable 1 of %d channels", isp->isp_nchan); in isp_reset()
779 isp->isp_nchan = 1; in isp_reset()
783 isp->isp_nchan = 1; in isp_reset()
804 for (i = 0; i < isp->isp_nchan; i++) in isp_reset()
807 isp->isp_state = ISP_RESETSTATE; in isp_reset()
815 for (i = 0; i < isp->isp_nchan; i++) in isp_reset()
828 isp->isp_state = ISP_NILSTATE; in isp_stop()
849 if (isp->isp_state >= ISP_RESETSTATE) in isp_shutdown()
873 for (chan = 0; chan < isp->isp_nchan; chan++) { in isp_init()
875 if (fcp->role != ISP_ROLE_NONE) { in isp_init()
879 if (chan == isp->isp_nchan) { in isp_init()
884 isp->isp_state = ISP_INITSTATE; in isp_init()
902 icbp->icb_fwoptions1 = fcp->isp_fwoptions; in isp_init()
903 icbp->icb_fwoptions2 = fcp->isp_xfwoptions; in isp_init()
904 icbp->icb_fwoptions3 = fcp->isp_zfwoptions; in isp_init()
905 if (isp->isp_nchan > 1 && ISP_CAP_VP0(isp)) { in isp_init()
906 icbp->icb_fwoptions1 &= ~ICB2400_OPT1_INI_DISABLE; in isp_init()
907 icbp->icb_fwoptions1 |= ICB2400_OPT1_TGT_ENABLE; in isp_init()
909 if (fcp->role & ISP_ROLE_TARGET) in isp_init()
910 icbp->icb_fwoptions1 |= ICB2400_OPT1_TGT_ENABLE; in isp_init()
912 icbp->icb_fwoptions1 &= ~ICB2400_OPT1_TGT_ENABLE; in isp_init()
913 if (fcp->role & ISP_ROLE_INITIATOR) in isp_init()
914 icbp->icb_fwoptions1 &= ~ICB2400_OPT1_INI_DISABLE; in isp_init()
916 icbp->icb_fwoptions1 |= ICB2400_OPT1_INI_DISABLE; in isp_init()
919 icbp->icb_version = ICB_VERSION1; in isp_init()
920 icbp->icb_maxfrmlen = DEFAULT_FRAMESIZE(isp); in isp_init()
921 if (icbp->icb_maxfrmlen < ICB_MIN_FRMLEN || icbp->icb_maxfrmlen > ICB_MAX_FRMLEN) { in isp_init()
922 icbp->icb_maxfrmlen = ICB_DFLT_FRMLEN; in isp_init()
924 icbp->icb_maxfrmlen = ICB_DFLT_FRMLEN_28XX; in isp_init()
927 "bad frame length (%d) from NVRAM - using %d", in isp_init()
928 DEFAULT_FRAMESIZE(isp), icbp->icb_maxfrmlen); in isp_init()
932 icbp->icb_execthrottle = 0xffff; in isp_init()
938 if (icbp->icb_fwoptions1 & ICB2400_OPT1_TGT_ENABLE) { in isp_init()
939 if ((icbp->icb_fwoptions1 & ICB2400_OPT1_INI_DISABLE) == 0) in isp_init()
940 icbp->icb_xchgcnt = MIN(isp->isp_maxcmds / 2, ATPDPSIZE); in isp_init()
942 icbp->icb_xchgcnt = isp->isp_maxcmds; in isp_init()
946 ownloopid = (isp->isp_confopts & ISP_CFG_OWNLOOPID) != 0; in isp_init()
947 icbp->icb_hardaddr = fcp->isp_loopid; in isp_init()
948 if (icbp->icb_hardaddr >= LOCAL_LOOP_LIM) { in isp_init()
949 icbp->icb_hardaddr = 0; in isp_init()
954 icbp->icb_fwoptions1 |= ICB2400_OPT1_HARD_ADDRESS; in isp_init()
956 if (isp->isp_confopts & ISP_CFG_NOFCTAPE) { in isp_init()
957 icbp->icb_fwoptions2 &= ~ICB2400_OPT2_FCTAPE; in isp_init()
959 if (isp->isp_confopts & ISP_CFG_FCTAPE) { in isp_init()
960 icbp->icb_fwoptions2 |= ICB2400_OPT2_FCTAPE; in isp_init()
963 for (chan = 0; chan < isp->isp_nchan; chan++) { in isp_init()
964 if (icbp->icb_fwoptions2 & ICB2400_OPT2_FCTAPE) in isp_init()
965 FCPARAM(isp, chan)->fctape_enabled = 1; in isp_init()
967 FCPARAM(isp, chan)->fctape_enabled = 0; in isp_init()
970 switch (isp->isp_confopts & ISP_CFG_PORT_PREF) { in isp_init()
972 icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK; in isp_init()
973 icbp->icb_fwoptions2 |= ICB2400_OPT2_LOOP_ONLY; in isp_init()
976 icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK; in isp_init()
977 icbp->icb_fwoptions2 |= ICB2400_OPT2_PTP_ONLY; in isp_init()
982 icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK; in isp_init()
983 icbp->icb_fwoptions2 |= ICB2400_OPT2_LOOP_2_PTP; in isp_init()
987 switch (icbp->icb_fwoptions2 & ICB2400_OPT2_TOPO_MASK) { in isp_init()
993 icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK; in isp_init()
994 icbp->icb_fwoptions2 |= ICB2400_OPT2_LOOP_2_PTP; in isp_init()
999 switch (icbp->icb_fwoptions2 & ICB2400_OPT2_TIMER_MASK) { in isp_init()
1002 icbp->icb_idelaytimer = 0; in isp_init()
1007 …isp_prt(isp, ISP_LOGWARN, "bad value %x in fwopt2 timer field", icbp->icb_fwoptions2 & ICB2400_OPT… in isp_init()
1008 icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TIMER_MASK; in isp_init()
1014 icbp->icb_fwoptions2 |= ICB2400_OPT2_ENA_IHR; in isp_init()
1015 icbp->icb_fwoptions2 |= ICB2400_OPT2_ENA_IHA; in isp_init()
1018 if ((icbp->icb_fwoptions3 & ICB2400_OPT3_RSPSZ_MASK) == 0) { in isp_init()
1019 icbp->icb_fwoptions3 |= ICB2400_OPT3_RSPSZ_24; in isp_init()
1021 if (isp->isp_confopts & ISP_CFG_1GB) { in isp_init()
1022 icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK; in isp_init()
1023 icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_1GB; in isp_init()
1024 } else if (isp->isp_confopts & ISP_CFG_2GB) { in isp_init()
1025 icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK; in isp_init()
1026 icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_2GB; in isp_init()
1027 } else if (isp->isp_confopts & ISP_CFG_4GB) { in isp_init()
1028 icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK; in isp_init()
1029 icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_4GB; in isp_init()
1030 } else if (isp->isp_confopts & ISP_CFG_8GB) { in isp_init()
1031 icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK; in isp_init()
1032 icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_8GB; in isp_init()
1033 } else if (isp->isp_confopts & ISP_CFG_16GB) { in isp_init()
1034 icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK; in isp_init()
1035 icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_16GB; in isp_init()
1036 } else if (isp->isp_confopts & ISP_CFG_32GB) { in isp_init()
1037 icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK; in isp_init()
1038 icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_32GB; in isp_init()
1039 } else if (isp->isp_confopts & ISP_CFG_64GB) { in isp_init()
1040 icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK; in isp_init()
1041 icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_64GB; in isp_init()
1043 switch (icbp->icb_fwoptions3 & ICB2400_OPT3_RATE_MASK) { in isp_init()
1052 if (isp->isp_type <= ISP_HA_FC_2500) in isp_init()
1056 if (isp->isp_type <= ISP_HA_FC_2400) in isp_init()
1060 icbp->icb_fwoptions3 &= ~ICB2400_OPT3_RATE_MASK; in isp_init()
1061 icbp->icb_fwoptions3 |= ICB2400_OPT3_RATE_AUTO; in isp_init()
1066 icbp->icb_fwoptions3 |= ICB2400_OPT3_SOFTID; in isp_init()
1068 icbp->icb_logintime = ICB_LOGIN_TOV; in isp_init()
1070 if (fcp->isp_wwnn && fcp->isp_wwpn) { in isp_init()
1071 icbp->icb_fwoptions1 |= ICB2400_OPT1_BOTH_WWNS; in isp_init()
1072 MAKE_NODE_NAME_FROM_WWN(icbp->icb_portname, fcp->isp_wwpn); in isp_init()
1073 MAKE_NODE_NAME_FROM_WWN(icbp->icb_nodename, fcp->isp_wwnn); in isp_init()
1074 …ing ICB Node 0x%08x%08x Port 0x%08x%08x", ((uint32_t) (fcp->isp_wwnn >> 32)), ((uint32_t) (fcp->is… in isp_init()
1075 ((uint32_t) (fcp->isp_wwpn >> 32)), ((uint32_t) (fcp->isp_wwpn))); in isp_init()
1076 } else if (fcp->isp_wwpn) { in isp_init()
1077 icbp->icb_fwoptions1 &= ~ICB2400_OPT1_BOTH_WWNS; in isp_init()
1078 MAKE_NODE_NAME_FROM_WWN(icbp->icb_portname, fcp->isp_wwpn); in isp_init()
1079 … ICB Node to be same as Port 0x%08x%08x", ((uint32_t) (fcp->isp_wwpn >> 32)), ((uint32_t) (fcp->is… in isp_init()
1084 icbp->icb_rspnsin = isp->isp_resodx; in isp_init()
1085 icbp->icb_rqstout = isp->isp_reqidx; in isp_init()
1086 icbp->icb_retry_count = fcp->isp_retry_count; in isp_init()
1088 icbp->icb_rqstqlen = RQUEST_QUEUE_LEN(isp); in isp_init()
1089 if (icbp->icb_rqstqlen < 8) { in isp_init()
1090 isp_prt(isp, ISP_LOGERR, "bad request queue length %d", icbp->icb_rqstqlen); in isp_init()
1093 icbp->icb_rsltqlen = RESULT_QUEUE_LEN(isp); in isp_init()
1094 if (icbp->icb_rsltqlen < 8) { in isp_init()
1096 icbp->icb_rsltqlen); in isp_init()
1099 icbp->icb_rqstaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_rquest_dma); in isp_init()
1100 icbp->icb_rqstaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_rquest_dma); in isp_init()
1101 icbp->icb_rqstaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_rquest_dma); in isp_init()
1102 icbp->icb_rqstaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_rquest_dma); in isp_init()
1104 icbp->icb_respaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_result_dma); in isp_init()
1105 icbp->icb_respaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_result_dma); in isp_init()
1106 icbp->icb_respaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_result_dma); in isp_init()
1107 icbp->icb_respaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_result_dma); in isp_init()
1111 icbp->icb_atio_in = isp->isp_atioodx; in isp_init()
1112 icbp->icb_atioqlen = ATIO_QUEUE_LEN(isp); in isp_init()
1113 if (icbp->icb_atioqlen < 8) { in isp_init()
1114 isp_prt(isp, ISP_LOGERR, "bad ATIO queue length %d", icbp->icb_atioqlen); in isp_init()
1117 icbp->icb_atioqaddr[RQRSP_ADDR0015] = DMA_WD0(isp->isp_atioq_dma); in isp_init()
1118 icbp->icb_atioqaddr[RQRSP_ADDR1631] = DMA_WD1(isp->isp_atioq_dma); in isp_init()
1119 icbp->icb_atioqaddr[RQRSP_ADDR3247] = DMA_WD2(isp->isp_atioq_dma); in isp_init()
1120 icbp->icb_atioqaddr[RQRSP_ADDR4863] = DMA_WD3(isp->isp_atioq_dma); in isp_init()
1121 …SP_LOGDEBUG0, "isp_init: atioq %04x%04x%04x%04x", DMA_WD3(isp->isp_atioq_dma), DMA_WD2(isp->isp_at… in isp_init()
1122 DMA_WD1(isp->isp_atioq_dma), DMA_WD0(isp->isp_atioq_dma)); in isp_init()
1125 if (ISP_CAP_MSIX(isp) && isp->isp_nirq >= 2) { in isp_init()
1126 icbp->icb_msixresp = 1; in isp_init()
1127 if (IS_26XX(isp) && isp->isp_nirq >= 3) in isp_init()
1128 icbp->icb_msixatio = 2; in isp_init()
1131 … "isp_init: fwopt1 0x%x fwopt2 0x%x fwopt3 0x%x", icbp->icb_fwoptions1, icbp->icb_fwoptions2, icbp in isp_init()
1133 …nit: rqst %04x%04x%04x%04x rsp %04x%04x%04x%04x", DMA_WD3(isp->isp_rquest_dma), DMA_WD2(isp->isp_r… in isp_init()
1134 …DMA_WD1(isp->isp_rquest_dma), DMA_WD0(isp->isp_rquest_dma), DMA_WD3(isp->isp_result_dma), DMA_WD2(… in isp_init()
1135 DMA_WD1(isp->isp_result_dma), DMA_WD0(isp->isp_result_dma)); in isp_init()
1141 ISP_MEMZERO(fcp->isp_scratch, ISP_FC_SCRLEN); in isp_init()
1142 isp_put_icb_2400(isp, icbp, fcp->isp_scratch); in isp_init()
1143 if (isp->isp_dblev & ISP_LOGDEBUG1) { in isp_init()
1145 sizeof (*icbp), fcp->isp_scratch); in isp_init()
1151 if (isp->isp_nchan > 1) { in isp_init()
1160 vpinfo.vp_count = isp->isp_nchan; in isp_init()
1163 vpinfo.vp_count = isp->isp_nchan - 1; in isp_init()
1166 off = fcp->isp_scratch; in isp_init()
1171 for (; chan < isp->isp_nchan; chan++) { in isp_init()
1176 if (fcp2->role != ISP_ROLE_NONE) { in isp_init()
1179 if (fcp2->role & ISP_ROLE_INITIATOR) in isp_init()
1181 if ((fcp2->role & ISP_ROLE_TARGET) == 0) in isp_init()
1183 if (fcp2->isp_loopid < LOCAL_LOOP_LIM) { in isp_init()
1184 pi.vp_port_loopid = fcp2->isp_loopid; in isp_init()
1185 if (isp->isp_confopts & ISP_CFG_OWNLOOPID) in isp_init()
1190 MAKE_NODE_NAME_FROM_WWN(pi.vp_port_portname, fcp2->isp_wwpn); in isp_init()
1191 MAKE_NODE_NAME_FROM_WWN(pi.vp_port_nodename, fcp2->isp_wwnn); in isp_init()
1192 off = fcp->isp_scratch; in isp_init()
1196 off += ICB2400_VPINFO_PORT_OFF(chan - 1); in isp_init()
1201 if (isp->isp_dblev & ISP_LOGDEBUG1) { in isp_init()
1203 amt - ICB2400_VPINFO_OFF, in isp_init()
1204 (char *)fcp->isp_scratch + ICB2400_VPINFO_OFF); in isp_init()
1212 if (isp->isp_nchan > 1) { in isp_init()
1218 mbs.param[2] = DMA_WD1(fcp->isp_scdma); in isp_init()
1219 mbs.param[3] = DMA_WD0(fcp->isp_scdma); in isp_init()
1220 mbs.param[6] = DMA_WD3(fcp->isp_scdma); in isp_init()
1221 mbs.param[7] = DMA_WD2(fcp->isp_scdma); in isp_init()
1222 …/W from %04x%04x%04x%04x", DMA_WD3(fcp->isp_scdma), DMA_WD2(fcp->isp_scdma), DMA_WD1(fcp->isp_scdm… in isp_init()
1234 isp->isp_state = ISP_RUNSTATE; in isp_init()
1253 if (fcp->role & ISP_ROLE_INITIATOR) in isp_fc_enable_vp()
1255 if ((fcp->role & ISP_ROLE_TARGET) == 0) in isp_fc_enable_vp()
1257 if (fcp->isp_loopid < LOCAL_LOOP_LIM) { in isp_fc_enable_vp()
1258 vp.vp_mod_ports[0].loopid = fcp->isp_loopid; in isp_fc_enable_vp()
1259 if (isp->isp_confopts & ISP_CFG_OWNLOOPID) in isp_fc_enable_vp()
1262 MAKE_NODE_NAME_FROM_WWN(vp.vp_mod_ports[0].wwpn, fcp->isp_wwpn); in isp_fc_enable_vp()
1263 MAKE_NODE_NAME_FROM_WWN(vp.vp_mod_ports[0].wwnn, fcp->isp_wwnn); in isp_fc_enable_vp()
1295 chan--; /* VP0 can not be controlled in this case. */ in isp_fc_disable_vp()
1324 if (chan >= isp->isp_nchan) { in isp_fc_change_role()
1328 if (fcp->role == new_role) in isp_fc_change_role()
1330 for (was = 0, i = 0; i < isp->isp_nchan; i++) { in isp_fc_change_role()
1331 if (FCPARAM(isp, i)->role != ISP_ROLE_NONE) in isp_fc_change_role()
1334 if (was == 0 || (was == 1 && fcp->role != ISP_ROLE_NONE)) { in isp_fc_change_role()
1335 fcp->role = new_role; in isp_fc_change_role()
1338 if (fcp->role != ISP_ROLE_NONE) { in isp_fc_change_role()
1342 fcp->role = new_role; in isp_fc_change_role()
1343 if (fcp->role != ISP_ROLE_NONE) in isp_fc_change_role()
1356 lp = &fcp->portdb[i]; in isp_clear_portdb()
1357 switch (lp->state) { in isp_clear_portdb()
1361 lp->state = FC_PORTDB_STATE_NIL; in isp_clear_portdb()
1366 lp->state = FC_PORTDB_STATE_NIL; in isp_clear_portdb()
1371 panic("Don't know how to clear state %d\n", lp->state); in isp_clear_portdb()
1384 lp = &fcp->portdb[i]; in isp_mark_portdb()
1385 if (lp->state == FC_PORTDB_STATE_NIL) in isp_mark_portdb()
1387 if (lp->portid >= DOMAIN_CONTROLLER_BASE && in isp_mark_portdb()
1388 lp->portid <= DOMAIN_CONTROLLER_END) in isp_mark_portdb()
1390 fcp->portdb[i].probational = 1; in isp_mark_portdb()
1433 return (-1); in isp_plogx()
1439 retval = -1; in isp_plogx()
1481 ISP_SNPRINTF(buf, sizeof (buf), "already logged in with N-Port handle 0x%x", parm1); in isp_plogx()
1503 isp_prt(isp, lev, "Chan %d PLOGX PortID 0x%06x to N-Port handle 0x%x: %s", in isp_plogx()
1521 mbs.param[2] = DMA_WD1(isp->isp_iocb_dma); in isp_getpdb()
1522 mbs.param[3] = DMA_WD0(isp->isp_iocb_dma); in isp_getpdb()
1523 mbs.param[6] = DMA_WD3(isp->isp_iocb_dma); in isp_getpdb()
1524 mbs.param[7] = DMA_WD2(isp->isp_iocb_dma); in isp_getpdb()
1533 isp_get_pdb_24xx(isp, isp->isp_iocb, &un.bill); in isp_getpdb()
1534 pdb->handle = un.bill.pdb_handle; in isp_getpdb()
1535 pdb->prli_word0 = un.bill.pdb_prli_svc0; in isp_getpdb()
1536 pdb->prli_word3 = un.bill.pdb_prli_svc3; in isp_getpdb()
1537 pdb->portid = BITS2WORD_24XX(un.bill.pdb_portid_bits); in isp_getpdb()
1538 ISP_MEMCPY(pdb->portname, un.bill.pdb_portname, 8); in isp_getpdb()
1539 ISP_MEMCPY(pdb->nodename, un.bill.pdb_nodename, 8); in isp_getpdb()
1542 chan, id, pdb->portid, un.bill.pdb_flags, in isp_getpdb()
1570 mbs.param[2] = DMA_WD1(fcp->isp_scdma); in isp_gethandles()
1571 mbs.param[3] = DMA_WD0(fcp->isp_scdma); in isp_gethandles()
1572 mbs.param[6] = DMA_WD3(fcp->isp_scdma); in isp_gethandles()
1573 mbs.param[7] = DMA_WD2(fcp->isp_scdma); in isp_gethandles()
1578 return (-1); in isp_gethandles()
1587 elp4 = fcp->isp_scratch; in isp_gethandles()
1591 if (loop && (p >> 8) != (fcp->isp_portid >> 8)) in isp_gethandles()
1606 isp_prt(isp, ISP_LOG_SANCFG|ISP_LOGINFO, "Chan %d chip port dump", chan); in isp_dump_chip_portdb()
1661 if (fcp->isp_loopstate < LOOP_HAVE_LINK) in isp_fclink_test()
1662 return (-1); in isp_fclink_test()
1663 if (fcp->isp_loopstate >= LOOP_LTEST_DONE) in isp_fclink_test()
1674 if (fcp->isp_fwstate == FW_READY) { in isp_fclink_test()
1677 if (fcp->isp_loopstate < LOOP_HAVE_LINK) in isp_fclink_test()
1684 if (fcp->isp_fwstate != FW_READY) { in isp_fclink_test()
1687 chan, isp_fc_fw_statename(fcp->isp_fwstate)); in isp_fclink_test()
1688 return (-1); in isp_fclink_test()
1698 return (-1); in isp_fclink_test()
1704 fcp->isp_topo = topo; in isp_fclink_test()
1705 fcp->isp_portid = mbs.param[2] | (mbs.param[3] << 16); in isp_fclink_test()
1707 if (!TOPO_IS_FABRIC(fcp->isp_topo)) { in isp_fclink_test()
1708 fcp->isp_loopid = mbs.param[1] & 0xff; in isp_fclink_test()
1709 } else if (fcp->isp_topo != TOPO_F_PORT) { in isp_fclink_test()
1710 uint8_t alpa = fcp->isp_portid; in isp_fclink_test()
1717 fcp->isp_loopid = i; in isp_fclink_test()
1721 fcp->isp_loopstate = LOOP_HAVE_ADDR; in isp_fclink_test()
1723 fcp->isp_loopstate = LOOP_TESTING_LINK; in isp_fclink_test()
1725 if (fcp->isp_topo == TOPO_F_PORT || fcp->isp_topo == TOPO_FL_PORT) { in isp_fclink_test()
1730 fcp->isp_topo = TOPO_PTP_STUB; in isp_fclink_test()
1734 fcp->isp_fabric_params = mbs.param[7]; in isp_fclink_test()
1735 fcp->isp_sns_hdl = NPH_SNS_ID; in isp_fclink_test()
1737 if (fcp->isp_loopstate < LOOP_TESTING_LINK) in isp_fclink_test()
1742 if (fcp->isp_loopstate < LOOP_TESTING_LINK) in isp_fclink_test()
1747 if (fcp->isp_loopstate < LOOP_TESTING_LINK) in isp_fclink_test()
1752 if (fcp->isp_loopstate < LOOP_TESTING_LINK) in isp_fclink_test()
1758 fcp->isp_gbspeed = 1; in isp_fclink_test()
1765 fcp->isp_gbspeed = 10; in isp_fclink_test()
1767 fcp->isp_gbspeed = 64; in isp_fclink_test()
1769 fcp->isp_gbspeed = 32; in isp_fclink_test()
1771 fcp->isp_gbspeed = 16; in isp_fclink_test()
1773 fcp->isp_gbspeed = 8; in isp_fclink_test()
1775 fcp->isp_gbspeed = 4; in isp_fclink_test()
1777 fcp->isp_gbspeed = 2; in isp_fclink_test()
1779 fcp->isp_gbspeed = 1; in isp_fclink_test()
1782 if (fcp->isp_loopstate < LOOP_TESTING_LINK) { in isp_fclink_test()
1788 fcp->isp_loopstate = LOOP_LTEST_DONE; in isp_fclink_test()
1791 chan, (uintmax_t)fcp->isp_wwpn, (uintmax_t)fcp->isp_wwnn); in isp_fclink_test()
1794 chan, fcp->isp_gbspeed, isp_fc_toponame(fcp), fcp->isp_portid, in isp_fclink_test()
1795 fcp->isp_loopid); in isp_fclink_test()
1818 if (fcp->isp_loopstate < LOOP_FSCAN_DONE) in isp_pdb_sync()
1819 return (-1); in isp_pdb_sync()
1820 if (fcp->isp_loopstate >= LOOP_READY) in isp_pdb_sync()
1825 fcp->isp_loopstate = LOOP_SYNCING_PDB; in isp_pdb_sync()
1828 lp = &fcp->portdb[dbidx]; in isp_pdb_sync()
1830 if (lp->state == FC_PORTDB_STATE_NIL) in isp_pdb_sync()
1832 if (lp->probational && lp->state != FC_PORTDB_STATE_ZOMBIE) in isp_pdb_sync()
1833 lp->state = FC_PORTDB_STATE_DEAD; in isp_pdb_sync()
1834 switch (lp->state) { in isp_pdb_sync()
1836 lp->state = FC_PORTDB_STATE_NIL; in isp_pdb_sync()
1838 if ((lp->portid & 0xffff00) != 0) { in isp_pdb_sync()
1839 (void) isp_plogx(isp, chan, lp->handle, in isp_pdb_sync()
1840 lp->portid, in isp_pdb_sync()
1851 lp->state = FC_PORTDB_STATE_VALID; in isp_pdb_sync()
1855 lp->state = FC_PORTDB_STATE_VALID; in isp_pdb_sync()
1857 lp->portid = lp->new_portid; in isp_pdb_sync()
1858 lp->prli_word0 = lp->new_prli_word0; in isp_pdb_sync()
1859 lp->prli_word3 = lp->new_prli_word3; in isp_pdb_sync()
1869 lp->state, dbidx); in isp_pdb_sync()
1874 if (fcp->isp_loopstate < LOOP_SYNCING_PDB) { in isp_pdb_sync()
1880 fcp->isp_loopstate = LOOP_READY; in isp_pdb_sync()
1891 MAKE_WWN_FROM_NODE_NAME(wwnn, pdb->nodename); in isp_pdb_add_update()
1892 MAKE_WWN_FROM_NODE_NAME(wwpn, pdb->portname); in isp_pdb_add_update()
1896 if (!lp->probational) { in isp_pdb_add_update()
1899 chan, lp->portid, lp->handle, in isp_pdb_add_update()
1900 FC_PORTDB_TGT(isp, chan, lp), lp->state); in isp_pdb_add_update()
1904 lp->probational = 0; in isp_pdb_add_update()
1905 lp->node_wwn = wwnn; in isp_pdb_add_update()
1908 if (lp->portid == pdb->portid && in isp_pdb_add_update()
1909 lp->handle == pdb->handle && in isp_pdb_add_update()
1910 lp->prli_word3 == pdb->prli_word3 && in isp_pdb_add_update()
1911 ((pdb->prli_word0 & PRLI_WD0_EST_IMAGE_PAIR) == in isp_pdb_add_update()
1912 (lp->prli_word0 & PRLI_WD0_EST_IMAGE_PAIR))) { in isp_pdb_add_update()
1913 if (lp->state != FC_PORTDB_STATE_NEW) in isp_pdb_add_update()
1914 lp->state = FC_PORTDB_STATE_VALID; in isp_pdb_add_update()
1917 chan, pdb->portid, pdb->handle); in isp_pdb_add_update()
1922 lp->state = FC_PORTDB_STATE_CHANGED; in isp_pdb_add_update()
1923 lp->handle = pdb->handle; in isp_pdb_add_update()
1924 lp->new_portid = pdb->portid; in isp_pdb_add_update()
1925 lp->new_prli_word0 = pdb->prli_word0; in isp_pdb_add_update()
1926 lp->new_prli_word3 = pdb->prli_word3; in isp_pdb_add_update()
1929 chan, pdb->portid, pdb->handle); in isp_pdb_add_update()
1940 lp->probational = 0; in isp_pdb_add_update()
1941 lp->state = FC_PORTDB_STATE_NEW; in isp_pdb_add_update()
1942 lp->portid = lp->new_portid = pdb->portid; in isp_pdb_add_update()
1943 lp->prli_word0 = lp->new_prli_word0 = pdb->prli_word0; in isp_pdb_add_update()
1944 lp->prli_word3 = lp->new_prli_word3 = pdb->prli_word3; in isp_pdb_add_update()
1945 lp->handle = pdb->handle; in isp_pdb_add_update()
1946 lp->port_wwn = wwpn; in isp_pdb_add_update()
1947 lp->node_wwn = wwnn; in isp_pdb_add_update()
1949 chan, pdb->portid, pdb->handle); in isp_pdb_add_update()
1964 if (fcp->isp_loopstate < LOOP_LTEST_DONE) in isp_scan_loop()
1965 return (-1); in isp_scan_loop()
1966 if (fcp->isp_loopstate >= LOOP_LSCAN_DONE) in isp_scan_loop()
1970 fcp->isp_loopstate = LOOP_SCANNING_LOOP; in isp_scan_loop()
1971 if (TOPO_IS_FABRIC(fcp->isp_topo)) { in isp_scan_loop()
1974 fcp->isp_loopstate = LOOP_LSCAN_DONE; in isp_scan_loop()
1978 handles = (uint16_t *)fcp->isp_scanscratch; in isp_scan_loop()
1986 return (-1); in isp_scan_loop()
2009 if (fcp->isp_loopstate < LOOP_SCANNING_LOOP) { in isp_scan_loop()
2024 if (fcp->isp_loopstate < LOOP_SCANNING_LOOP) in isp_scan_loop()
2026 fcp->isp_loopstate = LOOP_LSCAN_DONE; in isp_scan_loop()
2038 if (isp->isp_dblev & ISP_LOGDEBUG1) in isp_ct_passthru()
2039 isp_print_bytes(isp, "CT request", cmd_bcnt, fcp->isp_scratch); in isp_ct_passthru()
2047 pt.ctp_nphdl = fcp->isp_sns_hdl; in isp_ct_passthru()
2054 pt.ctp_dataseg[0].ds_base = DMA_LO32(fcp->isp_scdma); in isp_ct_passthru()
2055 pt.ctp_dataseg[0].ds_basehi = DMA_HI32(fcp->isp_scdma); in isp_ct_passthru()
2057 pt.ctp_dataseg[1].ds_base = DMA_LO32(fcp->isp_scdma); in isp_ct_passthru()
2058 pt.ctp_dataseg[1].ds_basehi = DMA_HI32(fcp->isp_scdma); in isp_ct_passthru()
2070 "Chan %d CT pass-through returned 0x%x", in isp_ct_passthru()
2072 return (-1); in isp_ct_passthru()
2075 if (isp->isp_dblev & ISP_LOGDEBUG1) in isp_ct_passthru()
2076 isp_print_bytes(isp, "CT response", rsp_bcnt, fcp->isp_scratch); in isp_ct_passthru()
2087 * We use CT Pass-through IOCB.
2090 #define NGENT ((GIDLEN - 16) >> 2)
2097 uint8_t *scp = fcp->isp_scratch; in isp_gid_pt()
2102 return (-1); in isp_gid_pt()
2105 /* Build the CT command and execute via pass-through. */ in isp_gid_pt()
2111 ct.ct_bcnt_resid = (GIDLEN - 16) >> 2; in isp_gid_pt()
2120 return (-1); in isp_gid_pt()
2124 (sns_gid_xx_rsp_t *)fcp->isp_scanscratch, NGENT); in isp_gid_pt()
2135 uint8_t *scp = fcp->isp_scratch; in isp_gff_id()
2137 int i, res = -1; in isp_gff_id()
2139 if (!fcp->isp_use_gff_id) /* User may block GFF_ID use. */ in isp_gff_id()
2148 /* Build the CT command and execute via pass-through. */ in isp_gff_id()
2154 ct.ct_bcnt_resid = (SNS_GFF_ID_RESP_SIZE - sizeof(ct)) / 4; in isp_gff_id()
2192 uint8_t *scp = fcp->isp_scratch; in isp_gft_id()
2194 int i, res = -1; in isp_gft_id()
2196 if (!fcp->isp_use_gft_id) /* User may block GFT_ID use. */ in isp_gft_id()
2205 /* Build the CT command and execute via pass-through. */ in isp_gft_id()
2211 ct.ct_bcnt_resid = (SNS_GFT_ID_RESP_SIZE - sizeof(ct)) / 4; in isp_gft_id()
2249 if (fcp->isp_loopstate < LOOP_LSCAN_DONE) in isp_scan_fabric()
2250 return (-1); in isp_scan_fabric()
2251 if (fcp->isp_loopstate >= LOOP_FSCAN_DONE) in isp_scan_fabric()
2255 fcp->isp_loopstate = LOOP_SCANNING_FABRIC; in isp_scan_fabric()
2256 if (!TOPO_IS_FABRIC(fcp->isp_topo)) { in isp_scan_fabric()
2257 fcp->isp_loopstate = LOOP_FSCAN_DONE; in isp_scan_fabric()
2263 if (fcp->isp_loopstate < LOOP_SCANNING_FABRIC) { in isp_scan_fabric()
2279 fcp->isp_loopstate = LOOP_LTEST_DONE; in isp_scan_fabric()
2283 return (-1); in isp_scan_fabric()
2288 if (fcp->isp_loopstate < LOOP_SCANNING_FABRIC) in isp_scan_fabric()
2291 fcp->isp_loopstate = LOOP_FSCAN_DONE; in isp_scan_fabric()
2292 return (-1); in isp_scan_fabric()
2294 fcp->isp_loopstate = LOOP_LTEST_DONE; /* try again */ in isp_scan_fabric()
2295 return (-1); in isp_scan_fabric()
2298 rs = (sns_gid_xx_rsp_t *) fcp->isp_scanscratch; in isp_scan_fabric()
2299 if (fcp->isp_loopstate < LOOP_SCANNING_FABRIC) in isp_scan_fabric()
2301 if (rs->snscb_cthdr.ct_cmd_resp != LS_ACC) { in isp_scan_fabric()
2303 /* FC-4 Type and Port Type not registered are not errors. */ in isp_scan_fabric()
2304 if (rs->snscb_cthdr.ct_reason == 9 && in isp_scan_fabric()
2305 (rs->snscb_cthdr.ct_explanation == 0x07 || in isp_scan_fabric()
2306 rs->snscb_cthdr.ct_explanation == 0x0a)) { in isp_scan_fabric()
2313 rs->snscb_cthdr.ct_reason, in isp_scan_fabric()
2314 rs->snscb_cthdr.ct_explanation); in isp_scan_fabric()
2315 fcp->isp_loopstate = LOOP_FSCAN_DONE; in isp_scan_fabric()
2316 return (-1); in isp_scan_fabric()
2320 for (portidx = 0; portidx < NGENT-1; portidx++) { in isp_scan_fabric()
2321 if (rs->snscb_ports[portidx].control & 0x80) in isp_scan_fabric()
2324 if ((rs->snscb_ports[portidx].control & 0x80) == 0) { in isp_scan_fabric()
2337 ((rs->snscb_ports[portidx].portid[0]) << 16) | in isp_scan_fabric()
2338 ((rs->snscb_ports[portidx].portid[1]) << 8) | in isp_scan_fabric()
2339 ((rs->snscb_ports[portidx].portid[2])); in isp_scan_fabric()
2343 ((rs->snscb_ports[npidx].portid[0]) << 16) | in isp_scan_fabric()
2344 ((rs->snscb_ports[npidx].portid[1]) << 8) | in isp_scan_fabric()
2345 ((rs->snscb_ports[npidx].portid[2])); in isp_scan_fabric()
2352 rs->snscb_ports[npidx].portid[0] = 0; in isp_scan_fabric()
2353 rs->snscb_ports[npidx].portid[1] = 0; in isp_scan_fabric()
2354 rs->snscb_ports[npidx].portid[2] = 0; in isp_scan_fabric()
2364 * for probational entries- if we find one, then an old entry is in isp_scan_fabric()
2375 portid = ((rs->snscb_ports[portidx].portid[0]) << 16) | in isp_scan_fabric()
2376 ((rs->snscb_ports[portidx].portid[1]) << 8) | in isp_scan_fabric()
2377 ((rs->snscb_ports[portidx].portid[2])); in isp_scan_fabric()
2386 if (portid == fcp->isp_portid) { in isp_scan_fabric()
2394 if (!lp->probational) { in isp_scan_fabric()
2397 chan, lp->portid, lp->handle, in isp_scan_fabric()
2398 FC_PORTDB_TGT(isp, chan, lp), lp->state); in isp_scan_fabric()
2403 if (lp->state == FC_PORTDB_STATE_ZOMBIE) in isp_scan_fabric()
2421 r = isp_getpdb(isp, chan, lp->handle, &pdb); in isp_scan_fabric()
2422 if (fcp->isp_loopstate < LOOP_SCANNING_FABRIC) in isp_scan_fabric()
2425 lp->state = FC_PORTDB_STATE_DEAD; in isp_scan_fabric()
2428 chan, portid, lp->handle, r); in isp_scan_fabric()
2437 if ((fcp->role & ISP_ROLE_INITIATOR) == 0) { in isp_scan_fabric()
2458 &FCPARAM(isp, 0)->isp_lasthdl)) { in isp_scan_fabric()
2459 if (fcp->isp_loopstate < LOOP_SCANNING_FABRIC) in isp_scan_fabric()
2467 if (fcp->isp_loopstate < LOOP_SCANNING_FABRIC) in isp_scan_fabric()
2469 fcp->isp_loopstate = LOOP_FSCAN_DONE; in isp_scan_fabric()
2485 if (FCPARAM(isp, chan)->isp_loopstate != LOOP_SCANNING_FABRIC) in isp_login_device()
2486 return (-1); in isp_login_device()
2491 if (p->portid != portid) { in isp_login_device()
2498 if (FCPARAM(isp, chan)->isp_loopstate != LOOP_SCANNING_FABRIC) in isp_login_device()
2499 return (-1); in isp_login_device()
2516 if (FCPARAM(isp, chan)->isp_loopstate != LOOP_SCANNING_FABRIC) in isp_login_device()
2517 return (-1); in isp_login_device()
2534 return (-1); in isp_login_device()
2545 return (-1); in isp_login_device()
2548 if (p->handle != handle || p->portid != portid) { in isp_login_device()
2550 chan, portid, handle, p->portid, p->handle); in isp_login_device()
2551 return (-1); in isp_login_device()
2562 uint8_t *scp = fcp->isp_scratch; in isp_register_fc4_type()
2566 return (-1); in isp_register_fc4_type()
2569 /* Build the CT command and execute via pass-through. */ in isp_register_fc4_type()
2571 ct->ct_revision = CT_REVISION; in isp_register_fc4_type()
2572 ct->ct_fcs_type = CT_FC_TYPE_FC; in isp_register_fc4_type()
2573 ct->ct_fcs_subtype = CT_FC_SUBTYPE_NS; in isp_register_fc4_type()
2574 ct->ct_cmd_resp = SNS_RFT_ID; in isp_register_fc4_type()
2575 ct->ct_bcnt_resid = (sizeof (rft_id_t) - sizeof (ct_hdr_t)) >> 2; in isp_register_fc4_type()
2576 rp.rftid_portid[0] = fcp->isp_portid >> 16; in isp_register_fc4_type()
2577 rp.rftid_portid[1] = fcp->isp_portid >> 8; in isp_register_fc4_type()
2578 rp.rftid_portid[2] = fcp->isp_portid; in isp_register_fc4_type()
2584 return (-1); in isp_register_fc4_type()
2589 if (ct->ct_cmd_resp == LS_RJT) { in isp_register_fc4_type()
2591 return (-1); in isp_register_fc4_type()
2592 } else if (ct->ct_cmd_resp == LS_ACC) { in isp_register_fc4_type()
2595 isp_prt(isp, ISP_LOGWARN, "Chan %d Register FC4 Type: 0x%x", chan, ct->ct_cmd_resp); in isp_register_fc4_type()
2596 return (-1); in isp_register_fc4_type()
2607 uint8_t *scp = fcp->isp_scratch; in isp_register_fc4_features_24xx()
2611 return (-1); in isp_register_fc4_features_24xx()
2619 ct->ct_revision = CT_REVISION; in isp_register_fc4_features_24xx()
2620 ct->ct_fcs_type = CT_FC_TYPE_FC; in isp_register_fc4_features_24xx()
2621 ct->ct_fcs_subtype = CT_FC_SUBTYPE_NS; in isp_register_fc4_features_24xx()
2622 ct->ct_cmd_resp = SNS_RFF_ID; in isp_register_fc4_features_24xx()
2623 ct->ct_bcnt_resid = (sizeof (rff_id_t) - sizeof (ct_hdr_t)) >> 2; in isp_register_fc4_features_24xx()
2624 rp.rffid_portid[0] = fcp->isp_portid >> 16; in isp_register_fc4_features_24xx()
2625 rp.rffid_portid[1] = fcp->isp_portid >> 8; in isp_register_fc4_features_24xx()
2626 rp.rffid_portid[2] = fcp->isp_portid; in isp_register_fc4_features_24xx()
2628 if (fcp->role & ISP_ROLE_TARGET) in isp_register_fc4_features_24xx()
2630 if (fcp->role & ISP_ROLE_INITIATOR) in isp_register_fc4_features_24xx()
2634 if (isp->isp_dblev & ISP_LOGDEBUG1) in isp_register_fc4_features_24xx()
2639 return (-1); in isp_register_fc4_features_24xx()
2644 if (ct->ct_cmd_resp == LS_RJT) { in isp_register_fc4_features_24xx()
2647 return (-1); in isp_register_fc4_features_24xx()
2648 } else if (ct->ct_cmd_resp == LS_ACC) { in isp_register_fc4_features_24xx()
2653 "Chan %d Register FC4 Features: 0x%x", chan, ct->ct_cmd_resp); in isp_register_fc4_features_24xx()
2654 return (-1); in isp_register_fc4_features_24xx()
2665 uint8_t *scp = fcp->isp_scratch; in isp_register_port_name_24xx()
2670 return (-1); in isp_register_port_name_24xx()
2678 ct->ct_revision = CT_REVISION; in isp_register_port_name_24xx()
2679 ct->ct_fcs_type = CT_FC_TYPE_FC; in isp_register_port_name_24xx()
2680 ct->ct_fcs_subtype = CT_FC_SUBTYPE_NS; in isp_register_port_name_24xx()
2681 ct->ct_cmd_resp = SNS_RSPN_ID; in isp_register_port_name_24xx()
2682 rp.rspnid_portid[0] = fcp->isp_portid >> 16; in isp_register_port_name_24xx()
2683 rp.rspnid_portid[1] = fcp->isp_portid >> 8; in isp_register_port_name_24xx()
2684 rp.rspnid_portid[2] = fcp->isp_portid; in isp_register_port_name_24xx()
2692 ":%s", device_get_nameunit(isp->isp_dev)); in isp_register_port_name_24xx()
2698 ct->ct_bcnt_resid = (len - sizeof(ct_hdr_t)) >> 2; in isp_register_port_name_24xx()
2703 return (-1); in isp_register_port_name_24xx()
2708 if (ct->ct_cmd_resp == LS_RJT) { in isp_register_port_name_24xx()
2711 return (-1); in isp_register_port_name_24xx()
2712 } else if (ct->ct_cmd_resp == LS_ACC) { in isp_register_port_name_24xx()
2717 "Chan %d Register Symbolic Port Name: 0x%x", chan, ct->ct_cmd_resp); in isp_register_port_name_24xx()
2718 return (-1); in isp_register_port_name_24xx()
2729 uint8_t *scp = fcp->isp_scratch; in isp_register_node_name_24xx()
2734 return (-1); in isp_register_node_name_24xx()
2742 ct->ct_revision = CT_REVISION; in isp_register_node_name_24xx()
2743 ct->ct_fcs_type = CT_FC_TYPE_FC; in isp_register_node_name_24xx()
2744 ct->ct_fcs_subtype = CT_FC_SUBTYPE_NS; in isp_register_node_name_24xx()
2745 ct->ct_cmd_resp = SNS_RSNN_NN; in isp_register_node_name_24xx()
2746 MAKE_NODE_NAME_FROM_WWN(rp.rsnnnn_nodename, fcp->isp_wwnn); in isp_register_node_name_24xx()
2754 ct->ct_bcnt_resid = (len - sizeof(ct_hdr_t)) >> 2; in isp_register_node_name_24xx()
2759 return (-1); in isp_register_node_name_24xx()
2764 if (ct->ct_cmd_resp == LS_RJT) { in isp_register_node_name_24xx()
2767 return (-1); in isp_register_node_name_24xx()
2768 } else if (ct->ct_cmd_resp == LS_ACC) { in isp_register_node_name_24xx()
2773 "Chan %d Register Symbolic Node Name: 0x%x", chan, ct->ct_cmd_resp); in isp_register_node_name_24xx()
2774 return (-1); in isp_register_node_name_24xx()
2794 if (handle > NPH_RESERVED - 1) { in isp_next_handle()
2802 for (chan = 0; chan < isp->isp_nchan; chan++) { in isp_next_handle()
2804 if (fcp->role == ISP_ROLE_NONE) in isp_next_handle()
2807 if (fcp->portdb[i].state != FC_PORTDB_STATE_NIL && in isp_next_handle()
2808 fcp->portdb[i].handle == handle) in isp_next_handle()
2854 if ((fcp->role & ISP_ROLE_INITIATOR) == 0) { in isp_start()
2862 if (isp->isp_state != ISP_RUNSTATE) { in isp_start()
2869 lp = &fcp->portdb[target]; in isp_start()
2871 lp->is_target == 0) { in isp_start()
2875 if (fcp->isp_loopstate != LOOP_READY) { in isp_start()
2881 if (lp->state == FC_PORTDB_STATE_ZOMBIE) { in isp_start()
2887 if (lp->state != FC_PORTDB_STATE_VALID) { in isp_start()
2890 XS_CHANNEL(xs), target, (uintmax_t)XS_LUN(xs), lp->state); in isp_start()
2913 m->mrk_header.rqs_entry_count = 1; in isp_start()
2914 m->mrk_header.rqs_entry_type = RQSTYPE_MARKER; in isp_start()
2915 m->mrk_modifier = SYNC_ALL; in isp_start()
2916 m->mrk_vphdl = XS_CHANNEL(xs); in isp_start()
2927 if (cdblen > sizeof (reqp->req_cdb)) { in isp_start()
2928 isp_prt(isp, ISP_LOGERR, "Command Length %u too long for this chip", cdblen); in isp_start()
2933 reqp->req_header.rqs_entry_type = RQSTYPE_T7RQS; in isp_start()
2934 reqp->req_header.rqs_entry_count = 1; in isp_start()
2935 reqp->req_nphdl = lp->handle; in isp_start()
2936 reqp->req_time = XS_TIME(xs); in isp_start()
2937 be64enc(reqp->req_lun, CAM_EXTLUN_BYTE_SWIZZLE(XS_LUN(xs))); in isp_start()
2939 reqp->req_alen_datadir = FCP_CMND_DATA_READ; in isp_start()
2941 reqp->req_alen_datadir = FCP_CMND_DATA_WRITE; in isp_start()
2943 reqp->req_task_attribute = XS_TAG_TYPE(xs); in isp_start()
2945 reqp->req_task_attribute = FCP_CMND_TASK_ATTR_SIMPLE; in isp_start()
2946 reqp->req_task_attribute |= (XS_PRIORITY(xs) << FCP_CMND_PRIO_SHIFT) & in isp_start()
2948 if (FCPARAM(isp, XS_CHANNEL(xs))->fctape_enabled && (lp->prli_word3 & PRLI_WD3_RETRY)) { in isp_start()
2949 if (FCP_NEXT_CRN(isp, &reqp->req_crn, xs)) { in isp_start()
2957 ISP_MEMCPY(reqp->req_cdb, XS_CDBP(xs), cdblen); in isp_start()
2958 reqp->req_dl = XS_XFRLEN(xs); in isp_start()
2959 reqp->req_tidlo = lp->portid; in isp_start()
2960 reqp->req_tidhi = lp->portid >> 16; in isp_start()
2961 reqp->req_vpidx = ISP_GET_VPIDX(isp, XS_CHANNEL(xs)); in isp_start()
2964 reqp->req_handle = isp_allocate_handle(isp, xs, ISP_HANDLE_INITIATOR); in isp_start()
2965 if (reqp->req_handle == 0) { in isp_start()
2979 isp_destroy_handle(isp, reqp->req_handle); in isp_start()
3030 lp = &fcp->portdb[tgt]; in isp_control()
3031 if (lp->is_target == 0 || lp->state != FC_PORTDB_STATE_VALID) { in isp_control()
3038 tmf->tmf_header.rqs_entry_type = RQSTYPE_TSK_MGMT; in isp_control()
3039 tmf->tmf_header.rqs_entry_count = 1; in isp_control()
3040 tmf->tmf_nphdl = lp->handle; in isp_control()
3041 tmf->tmf_delay = 2; in isp_control()
3042 tmf->tmf_timeout = 4; in isp_control()
3043 tmf->tmf_flags = ISP24XX_TMF_TARGET_RESET; in isp_control()
3044 tmf->tmf_tidlo = lp->portid; in isp_control()
3045 tmf->tmf_tidhi = lp->portid >> 16; in isp_control()
3046 tmf->tmf_vpidx = ISP_GET_VPIDX(isp, chan); in isp_control()
3047 fcp->sendmarker = 1; in isp_control()
3048 …isp_prt(isp, ISP_LOGALL, "Chan %d Reset N-Port Handle 0x%04x @ Port 0x%06x", chan, lp->handle, lp- in isp_control()
3051 if (isp_exec_entry_mbox(isp, tmf, sp, 2 * tmf->tmf_timeout)) in isp_control()
3054 if (sp->req_completion_status == 0) in isp_control()
3056 …isp_prt(isp, ISP_LOGWARN, "Chan %d reset of target %d returned 0x%x", chan, tgt, sp->req_completio… in isp_control()
3081 lp = &fcp->portdb[tgt]; in isp_control()
3082 if (lp->is_target == 0 || lp->state != FC_PORTDB_STATE_VALID) { in isp_control()
3086 …isp_prt(isp, ISP_LOGALL, "Chan %d Abort Cmd for N-Port 0x%04x @ Port 0x%06x", chan, lp->handle, lp in isp_control()
3088 ab->abrt_header.rqs_entry_type = RQSTYPE_ABORT_IO; in isp_control()
3089 ab->abrt_header.rqs_entry_count = 1; in isp_control()
3090 ab->abrt_handle = lp->handle; in isp_control()
3091 ab->abrt_cmd_handle = handle; in isp_control()
3092 ab->abrt_tidlo = lp->portid; in isp_control()
3093 ab->abrt_tidhi = lp->portid >> 16; in isp_control()
3094 ab->abrt_vpidx = ISP_GET_VPIDX(isp, chan); in isp_control()
3099 if (ab->abrt_nphdl == ISP24XX_ABRT_OKAY) in isp_control()
3101 isp_prt(isp, ISP_LOGWARN, "Chan %d handle %d abort returned 0x%x", chan, tgt, ab->abrt_nphdl); in isp_control()
3193 if ((p->flags & PLOGX_FLG_CMD_MASK) != PLOGX_FLG_CMD_PLOGI || (p->handle != NIL_HANDLE)) { in isp_control()
3194 return (isp_plogx(isp, p->channel, p->handle, p->portid, p->flags)); in isp_control()
3197 isp_next_handle(isp, &p->handle); in isp_control()
3198 r = isp_plogx(isp, p->channel, p->handle, p->portid, p->flags); in isp_control()
3200 p->handle = r >> 16; in isp_control()
3222 return (-1); in isp_control()
3240 optr = isp->isp_atioodx; in isp_intr_atioq()
3243 MEMORYBARRIER(isp, SYNC_ATIOQ, oop, QENTRY_LEN, -1); in isp_intr_atioq()
3244 addr = ISP_QUEUE_ENTRY(isp->isp_atioq, oop); in isp_intr_atioq()
3245 switch (((isphdr_t *)addr)->rqs_entry_type) { in isp_intr_atioq()
3260 if (isp->isp_atioodx != optr) { in isp_intr_atioq()
3262 isp->isp_atioodx = optr; in isp_intr_atioq()
3272 if (!isp->isp_mboxbsy) { in isp_intr_mbox()
3276 obits = isp->isp_obits; in isp_intr_mbox()
3277 isp->isp_mboxtmp[0] = mbox0; in isp_intr_mbox()
3281 isp->isp_mboxtmp[i] = ISP_READ(isp, MBOX_OFF(i)); in isp_intr_mbox()
3283 isp->isp_mboxbsy = 0; in isp_intr_mbox()
3304 if (isp->isp_state != ISP_RUNSTATE) { in isp_intr_respq()
3310 optr = isp->isp_resodx; in isp_intr_respq()
3316 hp = (isphdr_t *) ISP_QUEUE_ENTRY(isp->isp_result, cptr); in isp_intr_respq()
3322 MEMORYBARRIER(isp, SYNC_RESULT, cptr, QENTRY_LEN, -1); in isp_intr_respq()
3323 if (isp->isp_dblev & ISP_LOGDEBUG1) in isp_intr_respq()
3325 isp_get_hdr(isp, hp, &sp->req_header); in isp_intr_respq()
3331 if (sp->req_header.rqs_flags & RQSFLAG_BADTYPE) { in isp_intr_respq()
3335 if (sp->req_header.rqs_flags & RQSFLAG_BADPARAM) { in isp_intr_respq()
3339 if (sp->req_header.rqs_flags & RQSFLAG_BADCOUNT) { in isp_intr_respq()
3343 if (sp->req_header.rqs_flags & RQSFLAG_BADORDER) { in isp_intr_respq()
3348 etype = sp->req_header.rqs_entry_type; in isp_intr_respq()
3372 slen = min(cont, sizeof(scp->req_sense_data)); in isp_intr_respq()
3373 XS_SENSE_APPEND(cont_xs, scp->req_sense_data, slen); in isp_intr_respq()
3374 cont -= slen; in isp_intr_respq()
3397 hp = (isphdr_t *)ISP_QUEUE_ENTRY(isp->isp_result, sptr); in isp_intr_respq()
3408 /* We don't know what was this -- log and skip. */ in isp_intr_respq()
3414 xs = isp_find_xs(isp, sp->req_handle); in isp_intr_respq()
3420 if (sp->req_completion_status != RQCS_ABORTED && in isp_intr_respq()
3421 sp->req_completion_status != RQCS_RESET_OCCURRED) in isp_intr_respq()
3423 sp->req_handle, sp->req_completion_status); in isp_intr_respq()
3428 resp = snsp = sp->req_rsp_sense; in isp_intr_respq()
3430 scsi_status = sp->req_scsi_status; in isp_intr_respq()
3432 rlen = sp->req_response_len; in isp_intr_respq()
3436 totslen = sp->req_sense_len; in isp_intr_respq()
3437 slen = MIN(totslen, sizeof(sp->req_rsp_sense) - rlen); in isp_intr_respq()
3441 XS_SET_RESID(xs, sp->req_fcp_residual); in isp_intr_respq()
3479 cont = totslen - slen; in isp_intr_respq()
3488 isp_destroy_handle(isp, sp->req_handle); in isp_intr_respq()
3501 if (optr != isp->isp_resodx) { in isp_intr_respq()
3503 isp->isp_resodx = optr; in isp_intr_respq()
3518 isp->isp_state = ISP_CRASHED; in isp_intr_async()
3519 for (chan = 0; chan < isp->isp_nchan; chan++) { in isp_intr_async()
3520 FCPARAM(isp, chan)->isp_loopstate = LOOP_NIL; in isp_intr_async()
3527 if (isp->isp_mboxbsy) { in isp_intr_async()
3528 isp->isp_obits = 1; in isp_intr_async()
3529 isp->isp_mboxtmp[0] = MBOX_HOST_INTERFACE_ERROR; in isp_intr_async()
3530 isp->isp_mboxbsy = 0; in isp_intr_async()
3559 for (chan = 0; chan < isp->isp_nchan; chan++) { in isp_intr_async()
3561 int topo = fcp->isp_topo; in isp_intr_async()
3563 if (fcp->role == ISP_ROLE_NONE) in isp_intr_async()
3565 if (fcp->isp_loopstate > LOOP_HAVE_LINK) in isp_intr_async()
3566 fcp->isp_loopstate = LOOP_HAVE_LINK; in isp_intr_async()
3585 hdp = &isp->isp_xflist[i]; in isp_intr_async()
3586 if (ISP_H2HT(hdp->handle) != ISP_HANDLE_INITIATOR) { in isp_intr_async()
3589 xs = hdp->cmd; in isp_intr_async()
3613 for (chan = 0; chan < isp->isp_nchan; chan++) { in isp_intr_async()
3615 if (fcp->role == ISP_ROLE_NONE) in isp_intr_async()
3617 fcp->isp_linkstate = 1; in isp_intr_async()
3618 if (fcp->isp_loopstate < LOOP_HAVE_LINK) in isp_intr_async()
3619 fcp->isp_loopstate = LOOP_HAVE_LINK; in isp_intr_async()
3633 for (chan = 0; chan < isp->isp_nchan; chan++) { in isp_intr_async()
3635 if (fcp->role == ISP_ROLE_NONE) in isp_intr_async()
3638 fcp->isp_linkstate = 0; in isp_intr_async()
3639 fcp->isp_loopstate = LOOP_NIL; in isp_intr_async()
3652 for (chan = 0; chan < isp->isp_nchan; chan++) { in isp_intr_async()
3654 if (fcp->role == ISP_ROLE_NONE) in isp_intr_async()
3657 if (fcp->isp_loopstate > LOOP_HAVE_LINK) in isp_intr_async()
3658 fcp->isp_loopstate = LOOP_HAVE_LINK; in isp_intr_async()
3677 echan = isp->isp_nchan - 1; in isp_intr_async()
3678 } else if (chan >= isp->isp_nchan) { in isp_intr_async()
3688 if (fcp->role == ISP_ROLE_NONE) in isp_intr_async()
3690 if (fcp->isp_loopstate > LOOP_LTEST_DONE) { in isp_intr_async()
3692 nphdl == fcp->isp_login_hdl && in isp_intr_async()
3695 fcp->isp_loopstate = LOOP_LTEST_DONE; in isp_intr_async()
3696 } else if (fcp->isp_loopstate < LOOP_HAVE_LINK) in isp_intr_async()
3697 fcp->isp_loopstate = LOOP_HAVE_LINK; in isp_intr_async()
3711 if (chan >= isp->isp_nchan) in isp_intr_async()
3717 if (fcp->role == ISP_ROLE_NONE) in isp_intr_async()
3719 if (fcp->isp_loopstate > LOOP_LTEST_DONE) in isp_intr_async()
3720 fcp->isp_loopstate = LOOP_LTEST_DONE; in isp_intr_async()
3721 else if (fcp->isp_loopstate < LOOP_HAVE_LINK) in isp_intr_async()
3722 fcp->isp_loopstate = LOOP_HAVE_LINK; in isp_intr_async()
3749 isp_prt(isp, ISP_LOGDEBUG0, "Inter-driver communication complete"); in isp_intr_async()
3752 isp_prt(isp, ISP_LOGDEBUG0, "Inter-driver communication notification"); in isp_intr_async()
3755 isp_prt(isp, ISP_LOGDEBUG0, "Inter-driver communication time extended"); in isp_intr_async()
3788 switch (hp->rqs_entry_type) { in isp_handle_control()
3827 for (chan = 0; chan < isp->isp_nchan; chan++) { in isp_handle_rpt_id_acq()
3829 if (fcp->role == ISP_ROLE_NONE) in isp_handle_rpt_id_acq()
3831 c = (chan == 0) ? 127 : (chan - 1); in isp_handle_rpt_id_acq()
3834 fcp->isp_loopstate = LOOP_HAVE_LINK; in isp_handle_rpt_id_acq()
3838 fcp->isp_loopstate = LOOP_NIL; in isp_handle_rpt_id_acq()
3847 fcp->isp_topo = (rid.ridacq_map[0] >> 9) & 0x7; in isp_handle_rpt_id_acq()
3848 fcp->isp_portid = portid; in isp_handle_rpt_id_acq()
3849 fcp->isp_loopstate = LOOP_HAVE_ADDR; in isp_handle_rpt_id_acq()
3853 fcp->isp_loopstate = LOOP_NIL; in isp_handle_rpt_id_acq()
3866 switch (sp->req_completion_status) { in isp_parse_status_24xx()
3884 FCPARAM(isp, chan)->sendmarker = 1; in isp_parse_status_24xx()
3891 FCPARAM(isp, chan)->sendmarker = 1; in isp_parse_status_24xx()
3903 XS_SET_RESID(xs, sp->req_resid); in isp_parse_status_24xx()
3922 ru_marked = (sp->req_scsi_status & RQCS_RU) != 0; in isp_parse_status_24xx()
3925 * if we got a non-zero status. in isp_parse_status_24xx()
3927 sv_marked = (sp->req_scsi_status & (RQCS_SV|RQCS_RV)) != 0; in isp_parse_status_24xx()
3929 (sp->req_resid > XS_XFRLEN(xs))) { in isp_parse_status_24xx()
3930 …isp_xs_prt(isp, xs, ISP_LOGWARN, bun, XS_XFRLEN(xs), sp->req_resid, (ru_marked)? "marked" : "not m… in isp_parse_status_24xx()
3935 XS_SET_RESID(xs, sp->req_resid); in isp_parse_status_24xx()
3936 …isp_xs_prt(isp, xs, ISP_LOG_WARN1, "Data Underrun (%d) for command 0x%x", sp->req_resid, XS_CDBP(x… in isp_parse_status_24xx()
3946 uint8_t sts = sp->req_completion_status & 0xff; in isp_parse_status_24xx()
3951 * It was there (maybe)- treat as a selection timeout. in isp_parse_status_24xx()
3965 lp = &fcp->portdb[XS_TGT(xs)]; in isp_parse_status_24xx()
3966 if (lp->state == FC_PORTDB_STATE_ZOMBIE) { in isp_parse_status_24xx()
3999 …isp_prt(isp, ISP_LOGERR, "Unknown Completion Status 0x%x on chan %d", sp->req_completion_status, c… in isp_parse_status_24xx()
4152 "NO-OP", /* 00h */
4251 "GET FC-AL POSITION MAP",
4288 opcode = mbp->param[0]; in isp_mboxcmd()
4290 mbp->param[0] = MBOX_INVALID_COMMAND; in isp_mboxcmd()
4306 ibits |= mbp->ibits; in isp_mboxcmd()
4307 obits |= mbp->obits; in isp_mboxcmd()
4312 ibits &= mbp->ibitm; in isp_mboxcmd()
4313 obits &= mbp->obitm; in isp_mboxcmd()
4317 mbp->param[0] = MBOX_COMMAND_PARAM_ERROR; in isp_mboxcmd()
4325 mbp->param[box]); in isp_mboxcmd()
4326 ISP_WRITE(isp, MBOX_OFF(box), mbp->param[box]); in isp_mboxcmd()
4328 isp->isp_mboxtmp[box] = mbp->param[box] = 0; in isp_mboxcmd()
4331 isp->isp_obits = obits; in isp_mboxcmd()
4332 isp->isp_mboxbsy = 1; in isp_mboxcmd()
4342 to = (mbp->timeout == 0) ? MBCMD_DEFAULT_TIMEOUT : mbp->timeout; in isp_mboxcmd()
4344 if (!isp->isp_mboxbsy) in isp_mboxcmd()
4347 if (!isp->isp_mboxbsy) in isp_mboxcmd()
4355 if (isp->isp_mboxbsy) { in isp_mboxcmd()
4356 isp->isp_mboxbsy = 0; in isp_mboxcmd()
4358 opcode, to, mbp->func, mbp->lineno); in isp_mboxcmd()
4359 mbp->param[0] = MBOX_TIMEOUT; in isp_mboxcmd()
4368 mbp->param[box] = isp->isp_mboxtmp[box]; in isp_mboxcmd()
4370 mbp->param[box]); in isp_mboxcmd()
4375 if (mbp->logval == 0 || mbp->param[0] == MBOX_COMMAND_COMPLETE) in isp_mboxcmd()
4378 if ((mbp->param[0] & 0xbfe0) == 0 && in isp_mboxcmd()
4379 (mbp->logval & MBLOGMASK(mbp->param[0])) == 0) in isp_mboxcmd()
4384 switch (mbp->param[0]) { in isp_mboxcmd()
4397 mbp->param[1]); in isp_mboxcmd()
4434 ISP_SNPRINTF(mname, sizeof(mname), "error 0x%x", mbp->param[0]); in isp_mboxcmd()
4464 fcp->role = DEFAULT_ROLE(isp, chan); in isp_setdfltfcparm()
4465 fcp->isp_retry_delay = ICB_DFLT_RDELAY; in isp_setdfltfcparm()
4466 fcp->isp_retry_count = ICB_DFLT_RCOUNT; in isp_setdfltfcparm()
4467 fcp->isp_loopid = DEFAULT_LOOPID(isp, chan); in isp_setdfltfcparm()
4468 fcp->isp_wwnn_nvram = DEFAULT_NODEWWN(isp, chan); in isp_setdfltfcparm()
4469 fcp->isp_wwpn_nvram = DEFAULT_PORTWWN(isp, chan); in isp_setdfltfcparm()
4470 fcp->isp_fwoptions = 0; in isp_setdfltfcparm()
4471 fcp->isp_xfwoptions = 0; in isp_setdfltfcparm()
4472 fcp->isp_zfwoptions = 0; in isp_setdfltfcparm()
4473 fcp->isp_lasthdl = NIL_HANDLE; in isp_setdfltfcparm()
4474 fcp->isp_login_hdl = NIL_HANDLE; in isp_setdfltfcparm()
4476 fcp->isp_fwoptions |= ICB2400_OPT1_FAIRNESS; in isp_setdfltfcparm()
4477 fcp->isp_fwoptions |= ICB2400_OPT1_HARD_ADDRESS; in isp_setdfltfcparm()
4478 if (isp->isp_confopts & ISP_CFG_FULL_DUPLEX) in isp_setdfltfcparm()
4479 fcp->isp_fwoptions |= ICB2400_OPT1_FULL_DUPLEX; in isp_setdfltfcparm()
4480 fcp->isp_fwoptions |= ICB2400_OPT1_BOTH_WWNS; in isp_setdfltfcparm()
4481 fcp->isp_xfwoptions |= ICB2400_OPT2_LOOP_2_PTP; in isp_setdfltfcparm()
4482 fcp->isp_zfwoptions |= ICB2400_OPT3_RATE_AUTO; in isp_setdfltfcparm()
4488 if ((isp->isp_confopts & ISP_CFG_NONVRAM) == 0) { in isp_setdfltfcparm()
4500 isp->isp_confopts |= ISP_CFG_NONVRAM; in isp_setdfltfcparm()
4504 fcp->isp_wwnn = ACTIVE_NODEWWN(isp, chan); in isp_setdfltfcparm()
4505 fcp->isp_wwpn = ACTIVE_PORTWWN(isp, chan); in isp_setdfltfcparm()
4507 chan, (uint32_t) (fcp->isp_wwnn >> 32), (uint32_t) (fcp->isp_wwnn), in isp_setdfltfcparm()
4508 (uint32_t) (fcp->isp_wwpn >> 32), (uint32_t) (fcp->isp_wwpn), in isp_setdfltfcparm()
4509 isp_class3_roles[fcp->role]); in isp_setdfltfcparm()
4513 * Re-initialize the ISP and complete all orphaned commands
4523 if (isp->isp_state > ISP_RESETSTATE) in isp_reinit()
4525 if (isp->isp_state != ISP_RESETSTATE) in isp_reinit()
4527 if (isp->isp_state != ISP_RESETSTATE) { in isp_reinit()
4534 if (isp->isp_state > ISP_RESETSTATE && in isp_reinit()
4535 isp->isp_state != ISP_RUNSTATE) { in isp_reinit()
4543 for (i = 0; i < isp->isp_nchan; i++) in isp_reinit()
4556 return (fcp->flash_data_addr + faddr); in flash_data_addr()
4601 uint32_t base = fcp->flash_data_addr; in isp_rd_2xxx_flash()
4626 addr = fcp->flt_region_flt; in isp_read_flthdr_2xxx()
4640 retval = -1; in isp_read_flthdr_2xxx()
4655 fcp->flt_length = le16toh((uint16_t) (ISP2XXX_FLT_LENGTH(flthdr_data))); in isp_parse_flthdr_2xxx()
4658 if ((fcp->flt_length == 0) || in isp_parse_flthdr_2xxx()
4659 (fcp->flt_length > (FLT_HEADER_SIZE + FLT_REGIONS_SIZE))) { in isp_parse_flthdr_2xxx()
4662 fcp->flt_length, fcp->flt_length); in isp_parse_flthdr_2xxx()
4666 ver, fcp->flt_length, fcp->flt_length, csum); in isp_parse_flthdr_2xxx()
4674 int len = fcp->flt_length - FLT_HEADER_SIZE; in isp_read_flt_2xxx()
4677 fcp->flt_region_entries = len / FLT_REGION_SIZE; in isp_read_flt_2xxx()
4679 addr = fcp->flt_region_flt + (FLT_HEADER_SIZE >> 2); in isp_read_flt_2xxx()
4682 fcp->flt_region_entries); in isp_read_flt_2xxx()
4695 struct flt_region region[fcp->flt_region_entries]; in isp_parse_flt_2xxx()
4697 for (count = 0; count < fcp->flt_region_entries; count++) { in isp_parse_flt_2xxx()
4718 fcp->flt_region_fw = region[count].start; in isp_parse_flt_2xxx()
4721 fcp->flt_region_boot = region[count].start; in isp_parse_flt_2xxx()
4724 fcp->flt_region_vpd_nvram = region[count].start; in isp_parse_flt_2xxx()
4725 if (isp->isp_port == 0) in isp_parse_flt_2xxx()
4726 fcp->flt_region_vpd = region[count].start; in isp_parse_flt_2xxx()
4729 if (isp->isp_port == 1) in isp_parse_flt_2xxx()
4730 fcp->flt_region_vpd = region[count].start; in isp_parse_flt_2xxx()
4735 if (isp->isp_port == 2) in isp_parse_flt_2xxx()
4736 fcp->flt_region_vpd = region[count].start; in isp_parse_flt_2xxx()
4741 if (isp->isp_port == 3) in isp_parse_flt_2xxx()
4742 fcp->flt_region_vpd = region[count].start; in isp_parse_flt_2xxx()
4745 if (isp->isp_port == 0) in isp_parse_flt_2xxx()
4746 fcp->flt_region_nvram = region[count].start; in isp_parse_flt_2xxx()
4749 if (isp->isp_port == 1) in isp_parse_flt_2xxx()
4750 fcp->flt_region_nvram = region[count].start; in isp_parse_flt_2xxx()
4755 if (isp->isp_port == 2) in isp_parse_flt_2xxx()
4756 fcp->flt_region_nvram = region[count].start; in isp_parse_flt_2xxx()
4761 if (isp->isp_port == 3) in isp_parse_flt_2xxx()
4762 fcp->flt_region_nvram = region[count].start; in isp_parse_flt_2xxx()
4765 fcp->flt_region_fdt = region[count].start; in isp_parse_flt_2xxx()
4768 fcp->flt_region_flt = region[count].start; in isp_parse_flt_2xxx()
4771 if (isp->isp_port == 0) in isp_parse_flt_2xxx()
4772 fcp->flt_region_npiv_conf = region[count].start; in isp_parse_flt_2xxx()
4775 if (isp->isp_port == 1) in isp_parse_flt_2xxx()
4776 fcp->flt_region_npiv_conf = region[count].start; in isp_parse_flt_2xxx()
4779 fcp->flt_region_gold_fw = region[count].start; in isp_parse_flt_2xxx()
4782 if (isp->isp_port == 0) in isp_parse_flt_2xxx()
4783 fcp->flt_region_fcp_prio = region[count].start; in isp_parse_flt_2xxx()
4786 if (isp->isp_port == 1) in isp_parse_flt_2xxx()
4787 fcp->flt_region_fcp_prio = region[count].start; in isp_parse_flt_2xxx()
4791 fcp->flt_region_img_status_pri = region[count].start; in isp_parse_flt_2xxx()
4795 fcp->flt_region_img_status_sec = region[count].start; in isp_parse_flt_2xxx()
4799 fcp->flt_region_fw_sec = region[count].start; in isp_parse_flt_2xxx()
4803 fcp->flt_region_boot_sec = region[count].start; in isp_parse_flt_2xxx()
4807 fcp->flt_region_aux_img_status_pri = region[count].start; in isp_parse_flt_2xxx()
4811 fcp->flt_region_aux_img_status_sec = region[count].start; in isp_parse_flt_2xxx()
4815 if (isp->isp_port == 0) in isp_parse_flt_2xxx()
4816 fcp->flt_region_nvram_sec = region[count].start; in isp_parse_flt_2xxx()
4820 if (isp->isp_port == 1) in isp_parse_flt_2xxx()
4821 fcp->flt_region_nvram_sec = region[count].start; in isp_parse_flt_2xxx()
4825 if (isp->isp_port == 2) in isp_parse_flt_2xxx()
4826 fcp->flt_region_nvram_sec = region[count].start; in isp_parse_flt_2xxx()
4830 if (isp->isp_port == 3) in isp_parse_flt_2xxx()
4831 fcp->flt_region_nvram_sec = region[count].start; in isp_parse_flt_2xxx()
4836 fcp->flt_region_vpd_nvram_sec = region[count].start; in isp_parse_flt_2xxx()
4837 if (isp->isp_port == 0) in isp_parse_flt_2xxx()
4838 fcp->flt_region_vpd_sec = region[count].start; in isp_parse_flt_2xxx()
4844 if (isp->isp_port == 1) in isp_parse_flt_2xxx()
4845 fcp->flt_region_vpd_sec = region[count].start; in isp_parse_flt_2xxx()
4850 if (isp->isp_port == 2) in isp_parse_flt_2xxx()
4851 fcp->flt_region_vpd_sec = region[count].start; in isp_parse_flt_2xxx()
4856 if (isp->isp_port == 3) in isp_parse_flt_2xxx()
4857 fcp->flt_region_vpd_sec = region[count].start; in isp_parse_flt_2xxx()
4864 fcp->flt_region_boot, fcp->flt_region_fw, fcp->flt_region_vpd_nvram, in isp_parse_flt_2xxx()
4865 fcp->flt_region_vpd, fcp->flt_region_nvram, fcp->flt_region_fdt, in isp_parse_flt_2xxx()
4866 fcp->flt_region_flt, fcp->flt_region_npiv_conf, in isp_parse_flt_2xxx()
4867 fcp->flt_region_fcp_prio); in isp_parse_flt_2xxx()
4878 image_status->image_status_mask, in isp_print_image()
4879 le16toh(image_status->generation), in isp_print_image()
4880 image_status->ver_major, in isp_print_image()
4881 image_status->ver_minor, in isp_print_image()
4882 image_status->bitmap, in isp_print_image()
4883 le32toh(image_status->checksum), in isp_print_image()
4884 le32toh(image_status->signature)); in isp_print_image()
4890 unsigned long signature = le32toh(image_status->signature); in isp_check_aux_image_status_signature()
4898 unsigned long signature = le32toh(image_status->signature); in isp_check_image_status_signature()
4911 for ( ; n--; p++) in isp_image_status_checksum()
4920 return (aux->bitmap & bitmask ? in isp_component_bitmask()
4927 active_regions->aux.board_config = in isp_component_status()
4930 active_regions->aux.vpd_nvram = in isp_component_status()
4933 active_regions->aux.npiv_config_0_1 = in isp_component_status()
4936 active_regions->aux.npiv_config_2_3 = in isp_component_status()
4939 active_regions->aux.nvme_params = in isp_component_status()
4950 le16toh(pri_image_status->generation) - in isp_compare_image_generation()
4951 le16toh(sec_image_status->generation); in isp_compare_image_generation()
4966 if (!fcp->flt_region_aux_img_status_pri) { in isp_get_aux_images()
4973 fcp->flt_region_aux_img_status_pri, in isp_get_aux_images()
4999 if (!fcp->flt_region_aux_img_status_sec) { in isp_get_aux_images()
5006 fcp->flt_region_aux_img_status_sec, in isp_get_aux_images()
5050 active_regions->aux.board_config, in isp_get_aux_images()
5051 active_regions->aux.vpd_nvram, in isp_get_aux_images()
5052 active_regions->aux.npiv_config_0_1, in isp_get_aux_images()
5053 active_regions->aux.npiv_config_2_3, in isp_get_aux_images()
5054 active_regions->aux.nvme_params); in isp_get_aux_images()
5065 if (!fcp->flt_region_img_status_pri) { in isp_get_active_image()
5072 fcp->flt_region_img_status_pri, sizeof(pri_image_status) >> 2) != in isp_get_active_image()
5100 if (!fcp->flt_region_img_status_sec) { in isp_get_active_image()
5107 fcp->flt_region_img_status_sec, sizeof(sec_image_status) >> 2) != in isp_get_active_image()
5135 active_regions->global = ISP27XX_PRIMARY_IMAGE; in isp_get_active_image()
5138 if (!active_regions->global || in isp_get_active_image()
5141 active_regions->global = ISP27XX_SECONDARY_IMAGE; in isp_get_active_image()
5146 active_regions->global == ISP27XX_DEFAULT_IMAGE ? in isp_get_active_image()
5148 active_regions->global == ISP27XX_PRIMARY_IMAGE ? in isp_get_active_image()
5150 active_regions->global == ISP27XX_SECONDARY_IMAGE ? in isp_get_active_image()
5152 active_regions->global); in isp_get_active_image()
5168 MEMORYBARRIER(isp, SYNC_REQUEST, 0, ISP_QUEUE_SIZE(RQUEST_QUEUE_LEN(isp)), -1); in isp_load_ram()
5171 mbs.param[2] = DMA_WD1(isp->isp_rquest_dma); in isp_load_ram()
5172 mbs.param[3] = DMA_WD0(isp->isp_rquest_dma); in isp_load_ram()
5175 mbs.param[6] = DMA_WD3(isp->isp_rquest_dma); in isp_load_ram()
5176 mbs.param[7] = DMA_WD2(isp->isp_rquest_dma); in isp_load_ram()
5205 dcode = isp->isp_rquest; in isp_load_risc_flash()
5208 snprintf(fcp->fw_version_flash, sizeof(fcp->fw_version_flash), in isp_load_risc_flash()
5218 fcp->fw_flashrev[i] = be32toh(dcode[4 + i]); in isp_load_risc_flash()
5219 snprintf(fcp->fw_version_flash, sizeof(fcp->fw_version_flash), in isp_load_risc_flash()
5220 "%u.%u.%u", fcp->fw_flashrev[0], fcp->fw_flashrev[1], in isp_load_risc_flash()
5221 fcp->fw_flashrev[2]); in isp_load_risc_flash()
5224 fcp->fw_flashrev[0], fcp->fw_flashrev[1], in isp_load_risc_flash()
5225 fcp->fw_flashrev[2], fcp->fw_flashrev[3]); in isp_load_risc_flash()
5228 if (isp->isp_osinfo.ispfw != NULL) { in isp_load_risc_flash()
5231 if (ISP_FW_NEWER_THANX(fcp->fw_ispfwrev, fcp->fw_flashrev)) { in isp_load_risc_flash()
5235 if (isp->isp_confopts & ISP_CFG_FWLOAD_FORCE) { in isp_load_risc_flash()
5252 dcode = isp->isp_rquest; in isp_load_risc_flash()
5266 "Loading fragment %u: 0x%x <- 0x%x (0x%lx dwords)", in isp_load_risc_flash()
5283 risc_size -= dlen; in isp_load_risc_flash()
5311 rval = isp_load_risc_flash(isp, srisc_addr, fcp->flt_region_fw_sec); in isp_load_risc()
5317 rval = isp_load_risc_flash(isp, srisc_addr, fcp->flt_region_fw); in isp_load_risc()
5333 addr = fcp->flt_region_nvram; in isp_read_nvram()
5337 addr = fcp->flt_region_nvram_sec; in isp_read_nvram()
5352 retval = -1; in isp_read_nvram()
5363 retval = -1; in isp_read_nvram()
5392 fcp->isp_wwpn_nvram = wwn; in isp_parse_nvram_2400()
5400 if (wwn == 0 && (fcp->isp_wwpn_nvram >> 60) == 2) { in isp_parse_nvram_2400()
5401 wwn = fcp->isp_wwpn_nvram; in isp_parse_nvram_2400()
5404 fcp->isp_wwnn_nvram = wwn; in isp_parse_nvram_2400()
5406 if ((isp->isp_confopts & ISP_CFG_OWNFSZ) == 0) { in isp_parse_nvram_2400()
5410 if ((isp->isp_confopts & ISP_CFG_OWNLOOPID) == 0) { in isp_parse_nvram_2400()
5411 fcp->isp_loopid = ISP2400_NVRAM_HARDLOOPID(nvram_data); in isp_parse_nvram_2400()
5413 fcp->isp_fwoptions = ISP2400_NVRAM_FIRMWARE_OPTIONS1(nvram_data); in isp_parse_nvram_2400()
5414 fcp->isp_xfwoptions = ISP2400_NVRAM_FIRMWARE_OPTIONS2(nvram_data); in isp_parse_nvram_2400()
5415 fcp->isp_zfwoptions = ISP2400_NVRAM_FIRMWARE_OPTIONS3(nvram_data); in isp_parse_nvram_2400()