summaryrefslogtreecommitdiffstats
path: root/sys/dev/isp/isp.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/isp/isp.c')
-rw-r--r--sys/dev/isp/isp.c567
1 files changed, 299 insertions, 268 deletions
diff --git a/sys/dev/isp/isp.c b/sys/dev/isp/isp.c
index ed9b29d..2c6b0b8 100644
--- a/sys/dev/isp/isp.c
+++ b/sys/dev/isp/isp.c
@@ -65,7 +65,7 @@ __FBSDID("$FreeBSD$");
*/
#define MBOX_DELAY_COUNT 1000000 / 100
#define ISP_MARK_PORTDB(a, b, c) \
- isp_prt(isp, ISP_LOGSANCFG, \
+ isp_prt(isp, ISP_LOG_SANCFG, \
"Chan %d ISP_MARK_PORTDB@LINE %d", b, __LINE__); \
isp_mark_portdb(a, b, c)
@@ -670,8 +670,7 @@ isp_reset(ispsoftc_t *isp, int do_load_defaults)
ISP_DELAY(100);
if (--loops < 0) {
ISP_RESET0(isp);
- isp_prt(isp, ISP_LOGERR,
- "MBOX_BUSY never cleared on reset");
+ isp_prt(isp, ISP_LOGERR, "MBOX_BUSY never cleared on reset");
return;
}
}
@@ -1715,6 +1714,25 @@ isp_fibre_init(ispsoftc_t *isp)
icbp->icb_xfwoptions = fcp->isp_xfwoptions;
+ if (ISP_CAP_FCTAPE(isp)) {
+ if (isp->isp_confopts & ISP_CFG_NOFCTAPE)
+ icbp->icb_xfwoptions &= ~ICBXOPT_FCTAPE;
+
+ if (isp->isp_confopts & ISP_CFG_FCTAPE)
+ icbp->icb_xfwoptions |= ICBXOPT_FCTAPE;
+
+ if (icbp->icb_xfwoptions & ICBXOPT_FCTAPE) {
+ icbp->icb_fwoptions &= ~ICBOPT_FULL_LOGIN; /* per documents */
+ icbp->icb_xfwoptions |= ICBXOPT_FCTAPE_CCQ|ICBXOPT_FCTAPE_CONFIRM;
+ FCPARAM(isp, 0)->fctape_enabled = 1;
+ } else {
+ FCPARAM(isp, 0)->fctape_enabled = 0;
+ }
+ } else {
+ icbp->icb_xfwoptions &= ~ICBXOPT_FCTAPE;
+ FCPARAM(isp, 0)->fctape_enabled = 0;
+ }
+
/*
* Prefer or force Point-To-Point instead Loop?
*/
@@ -1804,6 +1822,9 @@ isp_fibre_init(ispsoftc_t *isp)
if (ISP_FW_NEWER_THAN(isp, 3, 16, 0)) {
mbs.param[1] |= IFCOPT1_EQFQASYNC|IFCOPT1_CTIO_RETRY;
if (fcp->role & ISP_ROLE_TARGET) {
+ if (ISP_FW_NEWER_THAN(isp, 3, 25, 0)) {
+ mbs.param[1] |= IFCOPT1_ENAPURE;
+ }
mbs.param[3] = IFCOPT3_NOPRLI;
}
}
@@ -1813,8 +1834,15 @@ isp_fibre_init(ispsoftc_t *isp)
}
}
icbp->icb_logintime = ICB_LOGIN_TOV;
- icbp->icb_lunetimeout = ICB_LUN_ENABLE_TOV;
+#ifdef ISP_TARGET_MODE
+ if (ISP_FW_NEWER_THAN(isp, 3, 25, 0) && (icbp->icb_fwoptions & ICBOPT_TGT_ENABLE)) {
+ icbp->icb_lunenables = 0xffff;
+ icbp->icb_ccnt = DFLT_CMND_CNT;
+ icbp->icb_icnt = DFLT_INOT_CNT;
+ icbp->icb_lunetimeout = ICB_LUN_ENABLE_TOV;
+ }
+#endif
if (fcp->isp_wwnn && fcp->isp_wwpn && (fcp->isp_wwnn >> 60) != 2) {
icbp->icb_fwoptions |= ICBOPT_BOTH_WWNS;
MAKE_NODE_NAME_FROM_WWN(icbp->icb_nodename, fcp->isp_wwnn);
@@ -1910,7 +1938,7 @@ isp_fibre_init_2400(ispsoftc_t *isp)
}
}
if (chan == isp->isp_nchan) {
- isp_prt(isp, ISP_LOGDEBUG0, "all %d channels with role 'none'", chan);
+ isp_prt(isp, ISP_LOG_WARN1, "all %d channels with role 'none'", chan);
isp->isp_state = ISP_INITSTATE;
return;
}
@@ -1978,6 +2006,19 @@ isp_fibre_init_2400(ispsoftc_t *isp)
icbp->icb_fwoptions1 |= ICB2400_OPT1_HARD_ADDRESS;
icbp->icb_fwoptions2 = fcp->isp_xfwoptions;
+ if (isp->isp_confopts & ISP_CFG_NOFCTAPE) {
+ icbp->icb_fwoptions2 &= ~ICB2400_OPT2_FCTAPE;
+ }
+ if (isp->isp_confopts & ISP_CFG_FCTAPE) {
+ icbp->icb_fwoptions2 |= ICB2400_OPT2_FCTAPE;
+ }
+
+ if (icbp->icb_fwoptions2 & ICB2400_OPT2_FCTAPE) {
+ FCPARAM(isp, chan)->fctape_enabled = 1;
+ } else {
+ FCPARAM(isp, chan)->fctape_enabled = 0;
+ }
+
switch (isp->isp_confopts & ISP_CFG_PORT_PREF) {
case ISP_CFG_NPORT_ONLY:
icbp->icb_fwoptions2 &= ~ICB2400_OPT2_TOPO_MASK;
@@ -2336,13 +2377,13 @@ isp_plogx(ispsoftc_t *isp, int chan, uint16_t handle, uint32_t portid, int flags
msg = buf;
break;
case PLOGX_IOCBERR_PORTUSED:
- lev = ISP_LOGSANCFG|ISP_LOGDEBUG0;
+ lev = ISP_LOG_SANCFG|ISP_LOG_WARN1;
ISP_SNPRINTF(buf, sizeof (buf), "already logged in with N-Port handle 0x%x", parm1);
msg = buf;
rval = MBOX_PORT_ID_USED | (parm1 << 16);
break;
case PLOGX_IOCBERR_HNDLUSED:
- lev = ISP_LOGSANCFG|ISP_LOGDEBUG0;
+ lev = ISP_LOG_SANCFG|ISP_LOG_WARN1;
ISP_SNPRINTF(buf, sizeof (buf), "handle already used for PortID 0x%06x", parm1);
msg = buf;
rval = MBOX_LOOP_ID_USED;
@@ -2388,35 +2429,26 @@ isp_port_login(ispsoftc_t *isp, uint16_t handle, uint32_t portid)
switch (mbs.param[0]) {
case MBOX_PORT_ID_USED:
- isp_prt(isp, ISP_LOGDEBUG0,
- "isp_port_login: portid 0x%06x already logged in as %u",
- portid, mbs.param[1]);
+ isp_prt(isp, ISP_LOG_SANCFG|ISP_LOG_WARN1, "isp_port_login: portid 0x%06x already logged in as %u", portid, mbs.param[1]);
return (MBOX_PORT_ID_USED | (mbs.param[1] << 16));
case MBOX_LOOP_ID_USED:
- isp_prt(isp, ISP_LOGDEBUG0,
- "isp_port_login: handle 0x%04x in use for port id 0x%02xXXXX",
- handle, mbs.param[1] & 0xff);
+ isp_prt(isp, ISP_LOG_SANCFG|ISP_LOG_WARN1, "isp_port_login: handle 0x%04x in use for port id 0x%02xXXXX", handle, mbs.param[1] & 0xff);
return (MBOX_LOOP_ID_USED);
case MBOX_COMMAND_COMPLETE:
return (0);
case MBOX_COMMAND_ERROR:
- isp_prt(isp, ISP_LOGINFO,
- "isp_port_login: error 0x%x in PLOGI to port 0x%06x",
- mbs.param[1], portid);
+ isp_prt(isp, ISP_LOG_SANCFG|ISP_LOG_WARN1, "isp_port_login: error 0x%x in PLOGI to port 0x%06x", mbs.param[1], portid);
return (MBOX_COMMAND_ERROR);
case MBOX_ALL_IDS_USED:
- isp_prt(isp, ISP_LOGINFO,
- "isp_port_login: all IDs used for fabric login");
+ isp_prt(isp, ISP_LOG_SANCFG|ISP_LOG_WARN1, "isp_port_login: all IDs used for fabric login");
return (MBOX_ALL_IDS_USED);
default:
- isp_prt(isp, ISP_LOGINFO,
- "isp_port_login: error 0x%x on port login of 0x%06x@0x%0x",
- mbs.param[0], portid, handle);
+ isp_prt(isp, ISP_LOG_SANCFG, "isp_port_login: error 0x%x on port login of 0x%06x@0x%0x", mbs.param[0], portid, handle);
return (mbs.param[0]);
}
}
@@ -2483,16 +2515,12 @@ isp_getpdb(ispsoftc_t *isp, int chan, uint16_t id, isp_pdb_t *pdb, int dolock)
if (IS_24XX(isp)) {
isp_get_pdb_24xx(isp, fcp->isp_scratch, &un.bill);
pdb->handle = un.bill.pdb_handle;
- pdb->s3_role = un.bill.pdb_prli_svc3;
+ pdb->prli_word3 = un.bill.pdb_prli_svc3;
pdb->portid = BITS2WORD_24XX(un.bill.pdb_portid_bits);
ISP_MEMCPY(pdb->portname, un.bill.pdb_portname, 8);
ISP_MEMCPY(pdb->nodename, un.bill.pdb_nodename, 8);
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d Port 0x%06x flags 0x%x curstate %x",
- chan, pdb->portid, un.bill.pdb_flags,
- un.bill.pdb_curstate);
- if (un.bill.pdb_curstate < PDB2400_STATE_PLOGI_DONE ||
- un.bill.pdb_curstate > PDB2400_STATE_LOGGED_IN) {
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d Port 0x%06x flags 0x%x curstate %x", chan, pdb->portid, un.bill.pdb_flags, un.bill.pdb_curstate);
+ if (un.bill.pdb_curstate < PDB2400_STATE_PLOGI_DONE || un.bill.pdb_curstate > PDB2400_STATE_LOGGED_IN) {
mbs.param[0] = MBOX_NOT_LOGGED_IN;
if (dolock) {
FC_SCRATCH_RELEASE(isp, chan);
@@ -2502,7 +2530,7 @@ isp_getpdb(ispsoftc_t *isp, int chan, uint16_t id, isp_pdb_t *pdb, int dolock)
} else {
isp_get_pdb_21xx(isp, fcp->isp_scratch, &un.fred);
pdb->handle = un.fred.pdb_loopid;
- pdb->s3_role = un.fred.pdb_prli_svc3;
+ pdb->prli_word3 = un.fred.pdb_prli_svc3;
pdb->portid = BITS2WORD(un.fred.pdb_portid_bits);
ISP_MEMCPY(pdb->portname, un.fred.pdb_portname, 8);
ISP_MEMCPY(pdb->nodename, un.fred.pdb_nodename, 8);
@@ -2528,7 +2556,7 @@ isp_dump_chip_portdb(ispsoftc_t *isp, int chan, int dolock)
if (isp_getpdb(isp, chan, loopid, &pdb, dolock)) {
continue;
}
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGINFO, "Chan %d Loopid 0x%04x "
+ isp_prt(isp, ISP_LOG_SANCFG|ISP_LOGINFO, "Chan %d Loopid 0x%04x "
"PortID 0x%06x WWPN 0x%02x%02x%02x%02x%02x%02x%02x%02x",
chan, loopid, pdb.portid, pdb.portname[0], pdb.portname[1],
pdb.portname[2], pdb.portname[3], pdb.portname[4],
@@ -2606,7 +2634,7 @@ isp_fclink_test(ispsoftc_t *isp, int chan, int usdelay)
fcp = FCPARAM(isp, chan);
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0, "Chan %d FC Link Test Entry", chan);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC Link Test Entry", chan);
ISP_MARK_PORTDB(isp, chan, 1);
/*
@@ -2622,7 +2650,7 @@ isp_fclink_test(ispsoftc_t *isp, int chan, int usdelay)
GET_NANOTIME(&hra);
isp_fw_state(isp, chan);
if (lwfs != fcp->isp_fwstate) {
- isp_prt(isp, ISP_LOGCONFIG|ISP_LOGSANCFG, "Chan %d Firmware State <%s->%s>", chan, isp_fc_fw_statename((int)lwfs), isp_fc_fw_statename((int)fcp->isp_fwstate));
+ isp_prt(isp, ISP_LOGCONFIG|ISP_LOG_SANCFG, "Chan %d Firmware State <%s->%s>", chan, isp_fc_fw_statename((int)lwfs), isp_fc_fw_statename((int)fcp->isp_fwstate));
lwfs = fcp->isp_fwstate;
}
if (fcp->isp_fwstate == FW_READY) {
@@ -2673,7 +2701,7 @@ isp_fclink_test(ispsoftc_t *isp, int chan, int usdelay)
* If we haven't gone to 'ready' state, return.
*/
if (fcp->isp_fwstate != FW_READY) {
- isp_prt(isp, ISP_LOGSANCFG, "%s: chan %d not at FW_READY state", __func__, chan);
+ isp_prt(isp, ISP_LOG_SANCFG, "%s: chan %d not at FW_READY state", __func__, chan);
return (-1);
}
@@ -2738,7 +2766,9 @@ isp_fclink_test(ispsoftc_t *isp, int chan, int usdelay)
}
}
if (alpa_map[i] && fcp->isp_loopid != i) {
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0, "Chan %d deriving loopid %d from AL_PA map (AL_PA 0x%x) and ignoring returned value %d (AL_PA 0x%x)", chan, i, alpa_map[i], fcp->isp_loopid, alpa);
+ isp_prt(isp, ISP_LOG_SANCFG,
+ "Chan %d deriving loopid %d from AL_PA map (AL_PA 0x%x) and ignoring returned value %d (AL_PA 0x%x)",
+ chan, i, alpa_map[i], fcp->isp_loopid, alpa);
fcp->isp_loopid = i;
}
}
@@ -2778,18 +2808,17 @@ isp_fclink_test(ispsoftc_t *isp, int chan, int usdelay)
lp->state = FC_PORTDB_STATE_PENDING_VALID;
MAKE_WWN_FROM_NODE_NAME(lp->node_wwn, pdb.nodename);
MAKE_WWN_FROM_NODE_NAME(lp->port_wwn, pdb.portname);
- lp->roles = (pdb.s3_role & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT;
+ lp->prli_word3 = pdb.prli_word3;
lp->portid = pdb.portid;
lp->handle = pdb.handle;
lp->new_portid = lp->portid;
- lp->new_roles = lp->roles;
+ lp->new_prli_word3 = lp->prli_word3;
if (IS_24XX(isp)) {
if (check_for_fabric) {
/*
* The mbs is still hanging out from the MBOX_GET_LOOP_ID above.
*/
fcp->isp_fabric_params = mbs.param[7];
- isp_prt(isp, ISP_LOGCONFIG, "fabric params 0x%x", mbs.param[7]);
} else {
fcp->isp_fabric_params = 0;
}
@@ -2809,7 +2838,7 @@ isp_fclink_test(ispsoftc_t *isp, int chan, int usdelay)
r = isp_register_fc4_type(isp, chan);
}
if (r) {
- isp_prt(isp, ISP_LOGWARN|ISP_LOGSANCFG, "%s: register fc4 type failed", __func__);
+ isp_prt(isp, ISP_LOGWARN|ISP_LOG_SANCFG, "%s: register fc4 type failed", __func__);
return (-1);
}
} else {
@@ -2843,8 +2872,8 @@ not_on_fabric:
/*
* Announce ourselves, too.
*/
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGCONFIG, topology, chan, (uint32_t) (fcp->isp_wwpn >> 32), (uint32_t) fcp->isp_wwpn, fcp->isp_portid, fcp->isp_loopid, isp_fc_toponame(fcp));
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0, "Chan %d FC Link Test Complete", chan);
+ isp_prt(isp, ISP_LOG_SANCFG|ISP_LOGCONFIG, topology, chan, (uint32_t) (fcp->isp_wwpn >> 32), (uint32_t) fcp->isp_wwpn, fcp->isp_portid, fcp->isp_loopid, isp_fc_toponame(fcp));
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC Link Test Complete", chan);
return (0);
}
@@ -2912,8 +2941,7 @@ isp_pdb_sync(ispsoftc_t *isp, int chan)
}
}
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d Synchronizing PDBs", chan);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d Synchronizing PDBs", chan);
fcp->isp_loopstate = LOOP_SYNCING_PDB;
@@ -2950,7 +2978,7 @@ isp_pdb_sync(ispsoftc_t *isp, int chan)
} else {
lp->autologin = 0;
}
- lp->new_roles = 0;
+ lp->new_prli_word3 = 0;
lp->new_portid = 0;
/*
* Note that we might come out of this with our state
@@ -2963,13 +2991,12 @@ isp_pdb_sync(ispsoftc_t *isp, int chan)
* target id in isp_dev_map (if any).
*/
lp->portid = lp->new_portid;
- lp->roles = lp->new_roles;
+ lp->prli_word3 = lp->new_prli_word3;
lp->state = FC_PORTDB_STATE_VALID;
isp_async(isp, ISPASYNC_DEV_ARRIVED, chan, lp);
- lp->new_roles = 0;
+ lp->new_prli_word3 = 0;
lp->new_portid = 0;
- lp->reserved = 0;
- lp->new_reserved = 0;
+ lp->announced = 0;
break;
case FC_PORTDB_STATE_CHANGED:
/*
@@ -2977,14 +3004,13 @@ isp_pdb_sync(ispsoftc_t *isp, int chan)
*/
lp->state = FC_PORTDB_STATE_VALID;
isp_async(isp, ISPASYNC_DEV_CHANGED, chan, lp);
- lp->new_roles = 0;
+ lp->new_prli_word3 = 0;
lp->new_portid = 0;
- lp->reserved = 0;
- lp->new_reserved = 0;
+ lp->announced = 0;
break;
case FC_PORTDB_STATE_PENDING_VALID:
lp->portid = lp->new_portid;
- lp->roles = lp->new_roles;
+ lp->prli_word3 = lp->new_prli_word3;
if (lp->dev_map_idx) {
int t = lp->dev_map_idx - 1;
fcp->isp_dev_map[t] = dbidx + 1;
@@ -2992,11 +3018,10 @@ isp_pdb_sync(ispsoftc_t *isp, int chan)
lp->state = FC_PORTDB_STATE_VALID;
isp_async(isp, ISPASYNC_DEV_STAYED, chan, lp);
if (dbidx != FL_ID) {
- lp->new_roles = 0;
+ lp->new_prli_word3 = 0;
lp->new_portid = 0;
}
- lp->reserved = 0;
- lp->new_reserved = 0;
+ lp->announced = 0;
break;
case FC_PORTDB_STATE_ZOMBIE:
break;
@@ -3054,8 +3079,7 @@ isp_scan_loop(ispsoftc_t *isp, int chan)
break;
case TOPO_FL_PORT:
if (IS_24XX(isp) && isp->isp_nchan > 1) {
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d Skipping Local Loop Scan", chan);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d Skipping Local Loop Scan", chan);
fcp->isp_loopstate = LOOP_LSCAN_DONE;
return (0);
}
@@ -3065,16 +3089,14 @@ isp_scan_loop(ispsoftc_t *isp, int chan)
lim = 2;
break;
default:
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d no loop topology to scan", chan);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d no loop topology to scan", chan);
fcp->isp_loopstate = LOOP_LSCAN_DONE;
return (0);
}
fcp->isp_loopstate = LOOP_SCANNING_LOOP;
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d FC scan loop 0..%d", chan, lim-1);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC scan loop 0..%d", chan, lim-1);
/*
@@ -3100,8 +3122,7 @@ isp_scan_loop(ispsoftc_t *isp, int chan)
if (IS_2100(isp) || IS_2200(isp)) {
uint64_t node_wwn = isp_get_wwn(isp, chan, handle, 1);
if (fcp->isp_loopstate < LOOP_SCANNING_LOOP) {
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d FC scan loop DONE (bad)", chan);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC scan loop DONE (bad)", chan);
return (-1);
}
if (node_wwn == INI_NONE) {
@@ -3119,8 +3140,7 @@ isp_scan_loop(ispsoftc_t *isp, int chan)
chan, handle, r);
if (fcp->isp_loopstate < LOOP_SCANNING_LOOP) {
ISP_MARK_PORTDB(isp, chan, 1);
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d FC scan loop DONE (bad)", chan);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC scan loop DONE (bad)", chan);
return (-1);
}
continue;
@@ -3128,8 +3148,7 @@ isp_scan_loop(ispsoftc_t *isp, int chan)
if (fcp->isp_loopstate < LOOP_SCANNING_LOOP) {
ISP_MARK_PORTDB(isp, chan, 1);
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d FC scan loop DONE (bad)", chan);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC scan loop DONE (bad)", chan);
return (-1);
}
@@ -3143,8 +3162,7 @@ isp_scan_loop(ispsoftc_t *isp, int chan)
isp_prt(isp, ISP_LOGWARN,
"Chan %d cannot synchronize port database", chan);
ISP_MARK_PORTDB(isp, chan, 1);
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d FC scan loop DONE (bad)", chan);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC scan loop DONE (bad)", chan);
return (-1);
}
@@ -3153,7 +3171,7 @@ isp_scan_loop(ispsoftc_t *isp, int chan)
*/
MAKE_WWN_FROM_NODE_NAME(tmp.node_wwn, pdb.nodename);
MAKE_WWN_FROM_NODE_NAME(tmp.port_wwn, pdb.portname);
- tmp.roles = (pdb.s3_role & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT;
+ tmp.prli_word3 = pdb.prli_word3;
tmp.portid = pdb.portid;
tmp.handle = pdb.handle;
@@ -3192,8 +3210,7 @@ isp_scan_loop(ispsoftc_t *isp, int chan)
for (i = 0; i < MAX_FC_TARG; i++) {
lp = &fcp->portdb[i];
- if (lp->state == FC_PORTDB_STATE_NIL ||
- lp->target_mode) {
+ if (lp->state == FC_PORTDB_STATE_NIL || lp->target_mode) {
continue;
}
if (lp->node_wwn != tmp.node_wwn) {
@@ -3214,8 +3231,7 @@ isp_scan_loop(ispsoftc_t *isp, int chan)
chan, i, lp->state);
isp_dump_portdb(isp, chan);
ISP_MARK_PORTDB(isp, chan, 1);
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d FC scan loop DONE (bad)", chan);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC scan loop DONE (bad)", chan);
return (-1);
}
@@ -3229,15 +3245,11 @@ isp_scan_loop(ispsoftc_t *isp, int chan)
* Check to make see if really still the same
* device. If it is, we mark it pending valid.
*/
- if (lp->portid == tmp.portid &&
- lp->handle == tmp.handle &&
- lp->roles == tmp.roles) {
+ if (lp->portid == tmp.portid && lp->handle == tmp.handle && lp->prli_word3 == tmp.prli_word3) {
lp->new_portid = tmp.portid;
- lp->new_roles = tmp.roles;
+ lp->new_prli_word3 = tmp.prli_word3;
lp->state = FC_PORTDB_STATE_PENDING_VALID;
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d Loop Port 0x%06x@0x%04x Pending "
- "Valid", chan, tmp.portid, tmp.handle);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d Loop Port 0x%06x@0x%04x Pending Valid", chan, tmp.portid, tmp.handle);
break;
}
@@ -3251,12 +3263,10 @@ isp_scan_loop(ispsoftc_t *isp, int chan)
* Claim that this has changed and let somebody else
* decide what to do.
*/
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d Loop Port 0x%06x@0x%04x changed",
- chan, tmp.portid, tmp.handle);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d Loop Port 0x%06x@0x%04x changed", chan, tmp.portid, tmp.handle);
lp->state = FC_PORTDB_STATE_CHANGED;
lp->new_portid = tmp.portid;
- lp->new_roles = tmp.roles;
+ lp->new_prli_word3 = tmp.prli_word3;
break;
}
@@ -3290,17 +3300,14 @@ isp_scan_loop(ispsoftc_t *isp, int chan)
lp->autologin = 1;
lp->state = FC_PORTDB_STATE_NEW;
lp->new_portid = tmp.portid;
- lp->new_roles = tmp.roles;
+ lp->new_prli_word3 = tmp.prli_word3;
lp->handle = tmp.handle;
lp->port_wwn = tmp.port_wwn;
lp->node_wwn = tmp.node_wwn;
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d Loop Port 0x%06x@0x%04x is New Entry",
- chan, tmp.portid, tmp.handle);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d Loop Port 0x%06x@0x%04x is New Entry", chan, tmp.portid, tmp.handle);
}
fcp->isp_loopstate = LOOP_LSCAN_DONE;
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d FC scan loop DONE", chan);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC scan loop DONE", chan);
return (0);
}
@@ -3343,8 +3350,7 @@ isp_gid_ft_sns(ispsoftc_t *isp, int chan)
sns_gid_ft_req_t *rq = &un._x;
mbreg_t mbs;
- isp_prt(isp, ISP_LOGDEBUG0,
- "Chan %d scanning fabric (GID_FT) via SNS", chan);
+ isp_prt(isp, ISP_LOGDEBUG0, "Chan %d scanning fabric (GID_FT) via SNS", chan);
ISP_MEMZERO(rq, SNS_GID_FT_REQ_SIZE);
rq->snscb_rblen = GIDLEN >> 1;
@@ -3393,8 +3399,7 @@ isp_gid_ft_ct_passthru(ispsoftc_t *isp, int chan)
uint32_t *rp;
uint8_t *scp = fcp->isp_scratch;
- isp_prt(isp, ISP_LOGDEBUG0,
- "Chan %d scanning fabric (GID_FT) via CT", chan);
+ isp_prt(isp, ISP_LOGDEBUG0, "Chan %d scanning fabric (GID_FT) via CT", chan);
if (!IS_24XX(isp)) {
return (1);
@@ -3488,10 +3493,8 @@ isp_scan_fabric(ispsoftc_t *isp, int chan)
int portidx, portlim, r;
sns_gid_ft_rsp_t *rs0, *rs1;
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d FC Scan Fabric", chan);
- if (fcp->isp_fwstate != FW_READY ||
- fcp->isp_loopstate < LOOP_LSCAN_DONE) {
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC Scan Fabric", chan);
+ if (fcp->isp_fwstate != FW_READY || fcp->isp_loopstate < LOOP_LSCAN_DONE) {
return (-1);
}
if (fcp->isp_loopstate > LOOP_SCANNING_FABRIC) {
@@ -3499,8 +3502,7 @@ isp_scan_fabric(ispsoftc_t *isp, int chan)
}
if (fcp->isp_topo != TOPO_FL_PORT && fcp->isp_topo != TOPO_F_PORT) {
fcp->isp_loopstate = LOOP_FSCAN_DONE;
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d FC Scan Fabric Done (no fabric)", chan);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC Scan Fabric Done (no fabric)", chan);
return (0);
}
@@ -3568,9 +3570,8 @@ isp_scan_fabric(ispsoftc_t *isp, int chan)
}
if (rs1->snscb_cthdr.ct_cmd_resp != LS_ACC) {
int level;
- if (rs1->snscb_cthdr.ct_reason == 9 &&
- rs1->snscb_cthdr.ct_explanation == 7) {
- level = ISP_LOGSANCFG|ISP_LOGDEBUG0;
+ if (rs1->snscb_cthdr.ct_reason == 9 && rs1->snscb_cthdr.ct_explanation == 7) {
+ level = ISP_LOG_SANCFG;
} else {
level = ISP_LOGWARN;
}
@@ -3614,7 +3615,7 @@ isp_scan_fabric(ispsoftc_t *isp, int chan)
"fabric too big for scratch area: increase ISP_FC_SCRLEN");
}
portlim = portidx + 1;
- isp_prt(isp, ISP_LOGSANCFG,
+ isp_prt(isp, ISP_LOG_SANCFG,
"Chan %d got %d ports back from name server", chan, portlim);
for (portidx = 0; portidx < portlim; portidx++) {
@@ -3639,9 +3640,7 @@ isp_scan_fabric(ispsoftc_t *isp, int chan)
rs1->snscb_ports[npidx].portid[0] = 0;
rs1->snscb_ports[npidx].portid[1] = 0;
rs1->snscb_ports[npidx].portid[2] = 0;
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d removing duplicate PortID 0x%06x"
- " entry from list", chan, portid);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d removing duplicate PortID 0x%06x entry from list", chan, portid);
}
}
@@ -3671,7 +3670,7 @@ isp_scan_fabric(ispsoftc_t *isp, int chan)
((rs1->snscb_ports[portidx].portid[2]));
if (portid == 0) {
- isp_prt(isp, ISP_LOGSANCFG,
+ isp_prt(isp, ISP_LOG_SANCFG,
"Chan %d skipping null PortID at idx %d",
chan, portidx);
continue;
@@ -3687,19 +3686,19 @@ isp_scan_fabric(ispsoftc_t *isp, int chan)
*/
if (ISP_CAP_MULTI_ID(isp)) {
if ((portid >> 8) == (fcp->isp_portid >> 8)) {
- isp_prt(isp, ISP_LOGSANCFG,
+ isp_prt(isp, ISP_LOG_SANCFG,
"Chan %d skip PortID 0x%06x",
chan, portid);
continue;
}
} else if (portid == fcp->isp_portid) {
- isp_prt(isp, ISP_LOGSANCFG,
+ isp_prt(isp, ISP_LOG_SANCFG,
"Chan %d skip ourselves on @ PortID 0x%06x",
chan, portid);
continue;
}
- isp_prt(isp, ISP_LOGSANCFG,
+ isp_prt(isp, ISP_LOG_SANCFG,
"Chan %d Checking Fabric Port 0x%06x", chan, portid);
/*
@@ -3711,8 +3710,7 @@ isp_scan_fabric(ispsoftc_t *isp, int chan)
for (dbidx = 0; dbidx < MAX_FC_TARG; dbidx++) {
lp = &fcp->portdb[dbidx];
- if (lp->state != FC_PORTDB_STATE_PROBATIONAL ||
- lp->target_mode) {
+ if (lp->state != FC_PORTDB_STATE_PROBATIONAL || lp->target_mode) {
continue;
}
if (lp->portid == portid) {
@@ -3754,9 +3752,7 @@ isp_scan_fabric(ispsoftc_t *isp, int chan)
if (r != 0) {
lp->new_portid = portid;
lp->state = FC_PORTDB_STATE_DEAD;
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d Fabric Port 0x%06x is dead",
- chan, portid);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d Fabric Port 0x%06x is dead", chan, portid);
continue;
}
@@ -3773,7 +3769,7 @@ isp_scan_fabric(ispsoftc_t *isp, int chan)
pdb.portid != portid ||
wwpn != lp->port_wwn ||
wwnn != lp->node_wwn) {
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
+ isp_prt(isp, ISP_LOG_SANCFG,
fconf, chan, dbidx, pdb.handle, pdb.portid,
(uint32_t) (wwnn >> 32), (uint32_t) wwnn,
(uint32_t) (wwpn >> 32), (uint32_t) wwpn,
@@ -3824,7 +3820,7 @@ isp_scan_fabric(ispsoftc_t *isp, int chan)
handle_changed++;
}
- nr = (pdb.s3_role & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT;
+ nr = pdb.prli_word3;
/*
* Check to see whether the portid and roles have
@@ -3839,17 +3835,12 @@ isp_scan_fabric(ispsoftc_t *isp, int chan)
*/
lp->new_portid = portid;
- lp->new_roles = nr;
- if (pdb.portid != lp->portid || nr != lp->roles ||
- handle_changed) {
- isp_prt(isp, ISP_LOGSANCFG,
- "Chan %d Fabric Port 0x%06x changed",
- chan, portid);
+ lp->new_prli_word3 = nr;
+ if (pdb.portid != lp->portid || nr != lp->prli_word3 || handle_changed) {
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d Fabric Port 0x%06x changed", chan, portid);
lp->state = FC_PORTDB_STATE_CHANGED;
} else {
- isp_prt(isp, ISP_LOGSANCFG,
- "Chan %d Fabric Port 0x%06x "
- "Now Pending Valid", chan, portid);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d Fabric Port 0x%06x Now Pending Valid", chan, portid);
lp->state = FC_PORTDB_STATE_PENDING_VALID;
}
continue;
@@ -3935,7 +3926,7 @@ isp_scan_fabric(ispsoftc_t *isp, int chan)
handle = pdb.handle;
MAKE_WWN_FROM_NODE_NAME(wwnn, pdb.nodename);
MAKE_WWN_FROM_NODE_NAME(wwpn, pdb.portname);
- nr = (pdb.s3_role & SVC3_ROLE_MASK) >> SVC3_ROLE_SHIFT;
+ nr = pdb.prli_word3;
/*
* And go through the database *one* more time to make sure
@@ -3949,8 +3940,7 @@ isp_scan_fabric(ispsoftc_t *isp, int chan)
if (fcp->portdb[dbidx].target_mode) {
continue;
}
- if (fcp->portdb[dbidx].node_wwn == wwnn &&
- fcp->portdb[dbidx].port_wwn == wwpn) {
+ if (fcp->portdb[dbidx].node_wwn == wwnn && fcp->portdb[dbidx].port_wwn == wwpn) {
break;
}
}
@@ -3961,11 +3951,9 @@ isp_scan_fabric(ispsoftc_t *isp, int chan)
lp->node_wwn = wwnn;
lp->port_wwn = wwpn;
lp->new_portid = portid;
- lp->new_roles = nr;
+ lp->new_prli_word3 = nr;
lp->state = FC_PORTDB_STATE_NEW;
- isp_prt(isp, ISP_LOGSANCFG,
- "Chan %d Fabric Port 0x%06x is a New Entry",
- chan, portid);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d Fabric Port 0x%06x is a New Entry", chan, portid);
continue;
}
@@ -3991,16 +3979,12 @@ isp_scan_fabric(ispsoftc_t *isp, int chan)
lp = &fcp->portdb[dbidx];
lp->handle = handle;
lp->new_portid = portid;
- lp->new_roles = nr;
- if (lp->portid != portid || lp->roles != nr) {
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d Zombie Fabric Port 0x%06x Now Changed",
- chan, portid);
+ lp->new_prli_word3 = nr;
+ if (lp->portid != portid || lp->prli_word3 != nr) {
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d Zombie Fabric Port 0x%06x Now Changed", chan, portid);
lp->state = FC_PORTDB_STATE_CHANGED;
} else {
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d Zombie Fabric Port 0x%06x "
- "Now Pending Valid", chan, portid);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d Zombie Fabric Port 0x%06x Now Pending Valid", chan, portid);
lp->state = FC_PORTDB_STATE_PENDING_VALID;
}
}
@@ -4011,8 +3995,7 @@ isp_scan_fabric(ispsoftc_t *isp, int chan)
return (-1);
}
fcp->isp_loopstate = LOOP_FSCAN_DONE;
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d FC Scan Fabric Done", chan);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d FC Scan Fabric Done", chan);
return (0);
}
@@ -4261,17 +4244,13 @@ isp_register_fc4_type_24xx(ispsoftc_t *isp, int chan)
FC_SCRATCH_RELEASE(isp, chan);
if (ct->ct_cmd_resp == LS_RJT) {
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d Register FC4 Type rejected", chan);
+ isp_prt(isp, ISP_LOG_SANCFG|ISP_LOG_WARN1, "Chan %d Register FC4 Type rejected", chan);
return (-1);
} else if (ct->ct_cmd_resp == LS_ACC) {
- isp_prt(isp, ISP_LOGSANCFG|ISP_LOGDEBUG0,
- "Chan %d Register FC4 Type accepted", chan);
+ isp_prt(isp, ISP_LOG_SANCFG, "Chan %d Register FC4 Type accepted", chan);
return (0);
} else {
- isp_prt(isp, ISP_LOGWARN,
- "Chan %d Register FC4 Type: 0x%x",
- chan, ct->ct_cmd_resp);
+ isp_prt(isp, ISP_LOGWARN, "Chan %d Register FC4 Type: 0x%x", chan, ct->ct_cmd_resp);
return (-1);
}
}
@@ -4369,6 +4348,7 @@ isp_start(XS_T *xs)
fcparam *fcp = FCPARAM(isp, XS_CHANNEL(xs));
if ((fcp->role & ISP_ROLE_INITIATOR) == 0) {
+ isp_prt(isp, ISP_LOG_WARN1, "%d.%d.%d I am not an initiator", XS_CHANNEL(xs), target, XS_LUN(xs));
XS_SETERR(xs, HBA_SELTIMEOUT);
return (CMD_COMPLETE);
}
@@ -4381,6 +4361,7 @@ isp_start(XS_T *xs)
}
if (XS_TGT(xs) >= MAX_FC_TARG) {
+ isp_prt(isp, ISP_LOG_WARN1, "%d.%d.%d target too big", XS_CHANNEL(xs), target, XS_LUN(xs));
XS_SETERR(xs, HBA_SELTIMEOUT);
return (CMD_COMPLETE);
}
@@ -4392,9 +4373,11 @@ isp_start(XS_T *xs)
return (CMD_COMPLETE);
}
if (fcp->portdb[hdlidx].state == FC_PORTDB_STATE_ZOMBIE) {
+ isp_prt(isp, ISP_LOGDEBUG1, "%d.%d.%d target zombie", XS_CHANNEL(xs), target, XS_LUN(xs));
return (CMD_RQLATER);
}
if (fcp->portdb[hdlidx].state != FC_PORTDB_STATE_VALID) {
+ isp_prt(isp, ISP_LOGDEBUG1, "%d.%d.%d bad db port state 0x%x", XS_CHANNEL(xs), target, XS_LUN(xs), fcp->portdb[hdlidx].state);
XS_SETERR(xs, HBA_SELTIMEOUT);
return (CMD_COMPLETE);
}
@@ -4403,6 +4386,7 @@ isp_start(XS_T *xs)
} else {
sdparam *sdp = SDPARAM(isp, XS_CHANNEL(xs));
if ((sdp->role & ISP_ROLE_INITIATOR) == 0) {
+ isp_prt(isp, ISP_LOGDEBUG1, "%d.%d.%d I am not an initiator", XS_CHANNEL(xs), target, XS_LUN(xs));
XS_SETERR(xs, HBA_SELTIMEOUT);
return (CMD_COMPLETE);
}
@@ -4415,7 +4399,7 @@ isp_start(XS_T *xs)
qep = isp_getrqentry(isp);
if (qep == NULL) {
- isp_prt(isp, ISP_LOGDEBUG0, "Request Queue Overflow");
+ isp_prt(isp, ISP_LOG_WARN1, "Request Queue Overflow");
XS_SETERR(xs, HBA_BOTCH);
return (CMD_EAGAIN);
}
@@ -4449,6 +4433,14 @@ isp_start(XS_T *xs)
}
reqp->req_header.rqs_entry_count = 1;
+
+ /*
+ * Select and install Header Code.
+ * Note that it might be overridden before going out
+ * if we're on a 64 bit platform. The lower level
+ * code (isp_send_cmd) will select the appropriate
+ * 64 bit variant if it needs to.
+ */
if (IS_24XX(isp)) {
reqp->req_header.rqs_entry_type = RQSTYPE_T7RQS;
} else if (IS_FC(isp)) {
@@ -4461,6 +4453,9 @@ isp_start(XS_T *xs)
}
}
+ /*
+ * Set task attributes
+ */
if (IS_24XX(isp)) {
int ttype;
if (XS_TAG_P(xs)) {
@@ -4513,20 +4508,30 @@ isp_start(XS_T *xs)
tptr = &reqp->req_time;
/*
- * NB: we do not support long CDBs
+ * NB: we do not support long CDBs (yet)
*/
cdblen = XS_CDBLEN(xs);
if (IS_SCSI(isp)) {
+ if (cdblen > sizeof (reqp->req_cdb)) {
+ isp_prt(isp, ISP_LOGERR, "Command Length %u too long for this chip", cdblen);
+ XS_SETERR(xs, HBA_BOTCH);
+ return (CMD_COMPLETE);
+ }
reqp->req_target = target | (XS_CHANNEL(xs) << 7);
reqp->req_lun_trn = XS_LUN(xs);
- cdblen = ISP_MIN(cdblen, sizeof (reqp->req_cdb));
cdbp = reqp->req_cdb;
reqp->req_cdblen = cdblen;
} else if (IS_24XX(isp)) {
ispreqt7_t *t7 = (ispreqt7_t *)local;
fcportdb_t *lp;
+ if (cdblen > sizeof (t7->req_cdb)) {
+ isp_prt(isp, ISP_LOGERR, "Command Length %u too long for this chip", cdblen);
+ XS_SETERR(xs, HBA_BOTCH);
+ return (CMD_COMPLETE);
+ }
+
lp = &FCPARAM(isp, XS_CHANNEL(xs))->portdb[hdlidx];
t7->req_nphdl = target;
t7->req_tidlo = lp->portid;
@@ -4537,28 +4542,47 @@ isp_start(XS_T *xs)
t7->req_lun[0] |= 0x40;
}
t7->req_lun[1] = XS_LUN(xs);
- FCP_NEXT_CRN(isp, xs, t7->req_crn, XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
+ if (FCPARAM(isp, XS_CHANNEL(xs))->fctape_enabled && (lp->prli_word3 & PRLI_WD3_RETRY)) {
+ if (FCP_NEXT_CRN(isp, &t7->req_crn, xs)) {
+ isp_prt(isp, ISP_LOG_WARN1, "%d.%d.%d cannot generate next CRN", XS_CHANNEL(xs), target, XS_LUN(xs));
+ XS_SETERR(xs, HBA_BOTCH);
+ return (CMD_EAGAIN);
+ }
+ }
tptr = &t7->req_time;
cdbp = t7->req_cdb;
- cdblen = ISP_MIN(cdblen, sizeof (t7->req_cdb));
- } else if (ISP_CAP_2KLOGIN(isp)) {
- ispreqt2e_t *t2e = (ispreqt2e_t *)local;
- t2e->req_target = target;
- t2e->req_scclun = XS_LUN(xs);
- cdbp = t2e->req_cdb;
- cdblen = ISP_MIN(cdblen, sizeof (t2e->req_cdb));
- } else if (ISP_CAP_SCCFW(isp)) {
- ispreqt2_t *t2 = (ispreqt2_t *)local;
- t2->req_target = target;
- t2->req_scclun = XS_LUN(xs);
- cdbp = t2->req_cdb;
- cdblen = ISP_MIN(cdblen, sizeof (t2->req_cdb));
} else {
ispreqt2_t *t2 = (ispreqt2_t *)local;
- t2->req_target = target;
- t2->req_lun_trn = XS_LUN(xs);
- cdbp = t2->req_cdb;
- cdblen = ISP_MIN(cdblen, sizeof (t2->req_cdb));
+ fcportdb_t *lp;
+
+ if (cdblen > sizeof t2->req_cdb) {
+ isp_prt(isp, ISP_LOGERR, "Command Length %u too long for this chip", cdblen);
+ XS_SETERR(xs, HBA_BOTCH);
+ return (CMD_COMPLETE);
+ }
+ lp = &FCPARAM(isp, XS_CHANNEL(xs))->portdb[hdlidx];
+ if (FCPARAM(isp, XS_CHANNEL(xs))->fctape_enabled && (lp->prli_word3 & PRLI_WD3_RETRY)) {
+ if (FCP_NEXT_CRN(isp, &t2->req_crn, xs)) {
+ isp_prt(isp, ISP_LOG_WARN1, "%d.%d.%d cannot generate next CRN", XS_CHANNEL(xs), target, XS_LUN(xs));
+ XS_SETERR(xs, HBA_BOTCH);
+ return (CMD_EAGAIN);
+ }
+ }
+ if (ISP_CAP_2KLOGIN(isp)) {
+ ispreqt2e_t *t2e = (ispreqt2e_t *)local;
+ t2e->req_target = target;
+ t2e->req_scclun = XS_LUN(xs);
+ cdbp = t2e->req_cdb;
+ } else if (ISP_CAP_SCCFW(isp)) {
+ ispreqt2_t *t2 = (ispreqt2_t *)local;
+ t2->req_target = target;
+ t2->req_scclun = XS_LUN(xs);
+ cdbp = t2->req_cdb;
+ } else {
+ t2->req_target = target;
+ t2->req_lun_trn = XS_LUN(xs);
+ cdbp = t2->req_cdb;
+ }
}
ISP_MEMCPY(cdbp, XS_CDBP(xs), cdblen);
@@ -4571,7 +4595,7 @@ isp_start(XS_T *xs)
}
if (isp_allocate_xs(isp, xs, &handle)) {
- isp_prt(isp, ISP_LOGDEBUG0, "out of xflist pointers");
+ isp_prt(isp, ISP_LOG_WARN1, "out of xflist pointers");
XS_SETERR(xs, HBA_BOTCH);
return (CMD_EAGAIN);
}
@@ -4618,7 +4642,7 @@ isp_control(ispsoftc_t *isp, ispctl_t ctl, ...)
* Issue a bus reset.
*/
if (IS_24XX(isp)) {
- isp_prt(isp, ISP_LOGWARN, "RESET BUS NOT IMPLEMENTED");
+ isp_prt(isp, ISP_LOGERR, "BUS RESET NOT IMPLEMENTED");
break;
} else if (IS_FC(isp)) {
mbs.param[1] = 10;
@@ -4639,8 +4663,7 @@ isp_control(ispsoftc_t *isp, ispctl_t ctl, ...)
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
break;
}
- isp_prt(isp, ISP_LOGINFO,
- "driver initiated bus reset of bus %d", chan);
+ isp_prt(isp, ISP_LOGINFO, "driver initiated bus reset of bus %d", chan);
return (0);
case ISPCTL_RESET_DEV:
@@ -4658,17 +4681,12 @@ isp_control(ispsoftc_t *isp, ispctl_t ctl, ...)
hdlidx = fcp->isp_dev_map[tgt] - 1;
if (hdlidx < 0 || hdlidx >= MAX_FC_TARG) {
- isp_prt(isp, ISP_LOGWARN,
- "Chan %d bad handle %d trying to reset"
- "target %d", chan, hdlidx, tgt);
+ isp_prt(isp, ISP_LOGWARN, "Chan %d bad handle %d trying to reset target %d", chan, hdlidx, tgt);
break;
}
lp = &fcp->portdb[hdlidx];
if (lp->state != FC_PORTDB_STATE_VALID) {
- isp_prt(isp, ISP_LOGWARN,
- "Chan %d handle %d for abort of target %d "
- "no longer valid", chan,
- hdlidx, tgt);
+ isp_prt(isp, ISP_LOGWARN, "Chan %d handle %d for abort of target %d no longer valid", chan, hdlidx, tgt);
break;
}
@@ -4703,18 +4721,14 @@ isp_control(ispsoftc_t *isp, ispctl_t ctl, ...)
FC_SCRATCH_RELEASE(isp, chan);
break;
}
- MEMORYBARRIER(isp, SYNC_SFORCPU, QENTRY_LEN,
- QENTRY_LEN, chan);
+ MEMORYBARRIER(isp, SYNC_SFORCPU, QENTRY_LEN, QENTRY_LEN, chan);
sp = (isp24xx_statusreq_t *) local;
- isp_get_24xx_response(isp,
- &((isp24xx_statusreq_t *)fcp->isp_scratch)[1], sp);
+ isp_get_24xx_response(isp, &((isp24xx_statusreq_t *)fcp->isp_scratch)[1], sp);
FC_SCRATCH_RELEASE(isp, chan);
if (sp->req_completion_status == 0) {
return (0);
}
- isp_prt(isp, ISP_LOGWARN,
- "Chan %d reset of target %d returned 0x%x",
- chan, tgt, sp->req_completion_status);
+ isp_prt(isp, ISP_LOGWARN, "Chan %d reset of target %d returned 0x%x", chan, tgt, sp->req_completion_status);
break;
} else if (IS_FC(isp)) {
if (ISP_CAP_2KLOGIN(isp)) {
@@ -4732,8 +4746,7 @@ isp_control(ispsoftc_t *isp, ispctl_t ctl, ...)
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
break;
}
- isp_prt(isp, ISP_LOGINFO,
- "Target %d on Bus %d Reset Succeeded", tgt, chan);
+ isp_prt(isp, ISP_LOGINFO, "Target %d on Bus %d Reset Succeeded", tgt, chan);
ISP_SET_SENDMARKER(isp, chan, 1);
return (0);
@@ -4747,8 +4760,7 @@ isp_control(ispsoftc_t *isp, ispctl_t ctl, ...)
handle = isp_find_handle(isp, xs);
if (handle == 0) {
- isp_prt(isp, ISP_LOGWARN,
- "cannot find handle for command to abort");
+ isp_prt(isp, ISP_LOGWARN, "cannot find handle for command to abort");
break;
}
if (IS_24XX(isp)) {
@@ -4760,21 +4772,15 @@ isp_control(ispsoftc_t *isp, ispctl_t ctl, ...)
fcp = FCPARAM(isp, chan);
hdlidx = fcp->isp_dev_map[tgt] - 1;
if (hdlidx < 0 || hdlidx >= MAX_FC_TARG) {
- isp_prt(isp, ISP_LOGWARN,
- "Chan %d bad handle %d trying to abort"
- "target %d", chan, hdlidx, tgt);
+ isp_prt(isp, ISP_LOGWARN, "Chan %d bad handle %d trying to abort target %d", chan, hdlidx, tgt);
break;
}
lp = &fcp->portdb[hdlidx];
if (lp->state != FC_PORTDB_STATE_VALID) {
- isp_prt(isp, ISP_LOGWARN,
- "Chan %d handle %d for abort of target %d "
- "no longer valid", chan, hdlidx, tgt);
+ isp_prt(isp, ISP_LOGWARN, "Chan %d handle %d for abort of target %d no longer valid", chan, hdlidx, tgt);
break;
}
- isp_prt(isp, ISP_LOGALL,
- "Chan %d Abort Cmd for N-Port 0x%04x @ Port "
- "0x%06x %p", chan, lp->handle, lp->portid, xs);
+ isp_prt(isp, ISP_LOGALL, "Chan %d Abort Cmd for N-Port 0x%04x @ Port 0x%06x", chan, lp->handle, lp->portid);
ISP_MEMZERO(ab, QENTRY_LEN);
ab->abrt_header.rqs_entry_type = RQSTYPE_ABORT_IO;
ab->abrt_header.rqs_entry_count = 1;
@@ -4797,8 +4803,7 @@ isp_control(ispsoftc_t *isp, ispctl_t ctl, ...)
break;
}
isp_put_24xx_abrt(isp, ab, fcp->isp_scratch);
- ab2 = (isp24xx_abrt_t *)
- &((uint8_t *)fcp->isp_scratch)[QENTRY_LEN];
+ ab2 = (isp24xx_abrt_t *) &((uint8_t *)fcp->isp_scratch)[QENTRY_LEN];
ab2->abrt_nphdl = 0xdeaf;
MEMORYBARRIER(isp, SYNC_SFORDEV, 0, 2 * QENTRY_LEN, chan);
isp_mboxcmd(isp, &mbs);
@@ -4806,16 +4811,13 @@ isp_control(ispsoftc_t *isp, ispctl_t ctl, ...)
FC_SCRATCH_RELEASE(isp, chan);
break;
}
- MEMORYBARRIER(isp, SYNC_SFORCPU, QENTRY_LEN,
- QENTRY_LEN, chan);
+ MEMORYBARRIER(isp, SYNC_SFORCPU, QENTRY_LEN, QENTRY_LEN, chan);
isp_get_24xx_abrt(isp, ab2, ab);
FC_SCRATCH_RELEASE(isp, chan);
if (ab->abrt_nphdl == ISP24XX_ABRT_OKAY) {
return (0);
}
- isp_prt(isp, ISP_LOGWARN,
- "Chan %d handle %d abort returned 0x%x", chan,
- hdlidx, ab->abrt_nphdl);
+ isp_prt(isp, ISP_LOGWARN, "Chan %d handle %d abort returned 0x%x", chan, hdlidx, ab->abrt_nphdl);
break;
} else if (IS_FC(isp)) {
if (ISP_CAP_SCCFW(isp)) {
@@ -5003,7 +5005,8 @@ isp_intr(ispsoftc_t *isp, uint32_t isr, uint16_t sema, uint16_t mbox)
{
XS_T *complist[MAX_REQUESTQ_COMPLETIONS], *xs;
uint32_t iptr, optr, junk;
- int i, nlooked = 0, ndone = 0;
+ int i, nlooked = 0, ndone = 0, continuations_expected = 0;
+ int etype, last_etype = 0;
again:
optr = isp->isp_residx;
@@ -5179,10 +5182,10 @@ again:
uint8_t qe[QENTRY_LEN];
ispstatusreq_t *sp = (ispstatusreq_t *) qe;
isphdr_t *hp;
- int buddaboom, etype, scsi_status, completion_status;
+ int buddaboom, scsi_status, completion_status;
int req_status_flags, req_state_flags;
uint8_t *snsp, *resp;
- uint32_t rlen, slen;
+ uint32_t rlen, slen, totslen;
long resid;
uint16_t oop;
@@ -5234,9 +5237,22 @@ again:
isp->isp_fpcchiwater = rio->req_header.rqs_seqno;
}
ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
+ last_etype = etype;
continue;
} else if (etype == RQSTYPE_RIO2) {
- isp_prt(isp, ISP_LOGERR, "dropping RIO2 response\n");
+ isp_prt(isp, ISP_LOGERR, "dropping RIO2 response");
+ ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
+ last_etype = etype;
+ continue;
+ } else if (etype == RQSTYPE_STATUS_CONT) {
+ isp_get_cont_response(isp, (ispstatus_cont_t *) hp, (ispstatus_cont_t *) sp);
+ if (last_etype == RQSTYPE_RESPONSE && continuations_expected && ndone > 0 && (xs = complist[ndone-1]) != NULL) {
+ ispstatus_cont_t *scp = (ispstatus_cont_t *) sp;
+ XS_SENSE_APPEND(xs, scp->req_sense_data, sizeof (scp->req_sense_data));
+ isp_prt(isp, ISP_LOGDEBUG0|ISP_LOG_CWARN, "%d more Status Continuations expected", --continuations_expected);
+ } else {
+ isp_prt(isp, ISP_LOG_WARN1, "Ignored Continuation Response");
+ }
ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
continue;
} else {
@@ -5256,12 +5272,12 @@ again:
* optr to be one more than the updated amount.
*/
while (tsto != oop) {
- optr = ISP_NXT_QENTRY(tsto,
- RESULT_QUEUE_LEN(isp));
+ optr = ISP_NXT_QENTRY(tsto, RESULT_QUEUE_LEN(isp));
}
if (r > 0) {
ISP_WRITE(isp, isp->isp_respoutrp, optr);
ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
+ last_etype = etype;
continue;
}
@@ -5277,11 +5293,10 @@ again:
* not, something bad has happened.
*/
if (etype != RQSTYPE_REQUEST) {
- isp_prt(isp, ISP_LOGERR, notresp,
- etype, oop, optr, nlooked);
- isp_print_bytes(isp,
- "Request Queue Entry", QENTRY_LEN, sp);
+ isp_prt(isp, ISP_LOGERR, notresp, etype, oop, optr, nlooked);
+ isp_print_bytes(isp, "Request Queue Entry", QENTRY_LEN, sp);
ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
+ last_etype = etype;
continue;
}
buddaboom = 1;
@@ -5296,10 +5311,11 @@ again:
if (sp->req_header.rqs_flags & RQSFLAG_CONTINUATION) {
isp_print_bytes(isp, "unexpected continuation segment", QENTRY_LEN, sp);
ISP_WRITE(isp, isp->isp_respoutrp, optr);
+ last_etype = etype;
continue;
}
if (sp->req_header.rqs_flags & RQSFLAG_FULL) {
- isp_prt(isp, ISP_LOGDEBUG0, "internal queues full");
+ isp_prt(isp, ISP_LOG_WARN1, "internal queues full");
/*
* We'll synthesize a QUEUE FULL message below.
*/
@@ -5319,6 +5335,7 @@ again:
if (sp->req_header.rqs_flags & RQSFLAG_BADORDER) {
isp_print_bytes(isp, "invalid IOCB ordering", QENTRY_LEN, sp);
ISP_WRITE(isp, isp->isp_respoutrp, optr);
+ last_etype = etype;
continue;
}
}
@@ -5327,6 +5344,7 @@ again:
isp_prt(isp, ISP_LOGERR, "bad request handle 0x%x (iocb type 0x%x)", sp->req_handle, etype);
ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
ISP_WRITE(isp, isp->isp_respoutrp, optr);
+ last_etype = etype;
continue;
}
xs = isp_find_xs(isp, sp->req_handle);
@@ -5343,20 +5361,23 @@ again:
}
ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
ISP_WRITE(isp, isp->isp_respoutrp, optr);
+ last_etype = etype;
continue;
}
if (req_status_flags & RQSTF_BUS_RESET) {
+ isp_prt(isp, ISP_LOG_WARN1, "%d.%d.%d bus was reset", XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
XS_SETERR(xs, HBA_BUSRESET);
ISP_SET_SENDMARKER(isp, XS_CHANNEL(xs), 1);
}
if (buddaboom) {
+ isp_prt(isp, ISP_LOG_WARN1, "%d.%d.%d buddaboom", XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs));
XS_SETERR(xs, HBA_BOTCH);
}
resp = NULL;
rlen = 0;
snsp = NULL;
- slen = 0;
+ totslen = slen = 0;
if (IS_24XX(isp) && (scsi_status & (RQCS_RV|RQCS_SV)) != 0) {
resp = ((isp24xx_statusreq_t *)sp)->req_rsp_sense;
rlen = ((isp24xx_statusreq_t *)sp)->req_response_len;
@@ -5374,14 +5395,23 @@ again:
if (IS_24XX(isp)) {
snsp = ((isp24xx_statusreq_t *)sp)->req_rsp_sense;
snsp += rlen;
- slen = ((isp24xx_statusreq_t *)sp)->req_sense_len;
+ totslen = ((isp24xx_statusreq_t *)sp)->req_sense_len;
+ slen = (sizeof (((isp24xx_statusreq_t *)sp)->req_rsp_sense)) - rlen;
+ if (totslen < slen)
+ slen = totslen;
} else {
snsp = sp->req_sense_data;
- slen = sp->req_sense_len;
+ totslen = sp->req_sense_len;
+ slen = sizeof (sp->req_sense_data);
+ if (totslen < slen)
+ slen = totslen;
}
} else if (IS_SCSI(isp) && (req_state_flags & RQSF_GOT_SENSE)) {
snsp = sp->req_sense_data;
- slen = sp->req_sense_len;
+ totslen = sp->req_sense_len;
+ slen = sizeof (sp->req_sense_data);
+ if (totslen < slen)
+ slen = totslen;
}
if (req_state_flags & RQSF_GOT_STATUS) {
*XS_STSP(xs) = scsi_status & 0xff;
@@ -5442,7 +5472,22 @@ again:
}
}
if (snsp && slen) {
- XS_SAVE_SENSE(xs, snsp, slen);
+ if (totslen > slen) {
+ continuations_expected += ((totslen - slen + QENTRY_LEN - 5) / (QENTRY_LEN - 4));
+ if (ndone > (MAX_REQUESTQ_COMPLETIONS - continuations_expected - 1)) {
+ /* we'll lose some stats, but that's a small price to pay */
+ for (i = 0; i < ndone; i++) {
+ if (complist[i]) {
+ isp->isp_rsltccmplt++;
+ isp_done(complist[i]);
+ }
+ }
+ ndone = 0;
+ }
+ isp_prt(isp, ISP_LOGDEBUG0|ISP_LOG_CWARN, "Expecting %d more Status Continuations for total sense length of %u",
+ continuations_expected, totslen);
+ }
+ XS_SAVE_SENSE(xs, snsp, totslen, slen);
} else if ((req_status_flags & RQSF_GOT_STATUS) && (scsi_status & 0xff) == SCSI_CHECK && IS_FC(isp)) {
isp_prt(isp, ISP_LOGWARN, "CHECK CONDITION w/o sense data for CDB=0x%x", XS_CDBP(xs)[0] & 0xff);
isp_print_bytes(isp, "CC with no Sense", QENTRY_LEN, qe);
@@ -5461,6 +5506,7 @@ again:
*XS_STSP(xs) = SCSI_QFULL;
XS_SETERR(xs, HBA_NOERROR);
} else if (XS_NOERR(xs)) {
+ isp_prt(isp, ISP_LOG_WARN1, "%d.%d.%d badness at %s:%u", XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs), __func__, __LINE__);
XS_SETERR(xs, HBA_BOTCH);
}
XS_SET_RESID(xs, XS_XFRLEN(xs));
@@ -5482,15 +5528,12 @@ again:
}
isp_destroy_handle(isp, sp->req_handle);
- if (((isp->isp_dblev & (ISP_LOGDEBUG1|ISP_LOGDEBUG2|ISP_LOGDEBUG3))) ||
- ((isp->isp_dblev & (ISP_LOGDEBUG0|ISP_LOG_CWARN) && ((!XS_NOERR(xs)) || (*XS_STSP(xs) != SCSI_GOOD))))) {
- isp_prt_endcmd(isp, xs);
- }
if (isp->isp_nactive > 0) {
isp->isp_nactive--;
}
complist[ndone++] = xs; /* defer completion call until later */
ISP_MEMZERO(hp, QENTRY_LEN); /* PERF */
+ last_etype = etype;
if (ndone == MAX_REQUESTQ_COMPLETIONS) {
break;
}
@@ -5525,6 +5568,10 @@ out:
for (i = 0; i < ndone; i++) {
xs = complist[i];
if (xs) {
+ if (((isp->isp_dblev & (ISP_LOGDEBUG1|ISP_LOGDEBUG2|ISP_LOGDEBUG3))) ||
+ ((isp->isp_dblev & (ISP_LOGDEBUG0|ISP_LOG_CWARN) && ((!XS_NOERR(xs)) || (*XS_STSP(xs) != SCSI_GOOD))))) {
+ isp_prt_endcmd(isp, xs);
+ }
isp->isp_rsltccmplt++;
isp_done(xs);
}
@@ -5547,8 +5594,8 @@ isp_prt_endcmd(ispsoftc_t *isp, XS_T *xs)
ISP_SNPRINTF(cdbstr, sizeof (cdbstr), "%s0x%02x ", cdbstr, XS_CDBP(xs)[i]);
}
if (XS_SENSE_VALID(xs)) {
- isp_xs_prt(isp, xs, ISP_LOGALL, "FIN dl%d resid %ld CDB=%s KEY/ASC/ASCQ=0x%02x/0x%02x/0x%02x",
- XS_XFRLEN(xs), (long) XS_GET_RESID(xs), cdbstr, XS_SNSKEY(xs), XS_SNSASC(xs), XS_SNSASCQ(xs));
+ isp_xs_prt(isp, xs, ISP_LOGALL, "FIN dl%d resid %ld CDB=%s SenseLength=%u/%u KEY/ASC/ASCQ=0x%02x/0x%02x/0x%02x",
+ XS_XFRLEN(xs), (long) XS_GET_RESID(xs), cdbstr, XS_CUR_SNSLEN(xs), XS_TOT_SNSLEN(xs), XS_SNSKEY(xs), XS_SNSASC(xs), XS_SNSASCQ(xs));
} else {
isp_xs_prt(isp, xs, ISP_LOGALL, "FIN dl%d resid %ld CDB=%s STS 0x%x XS_ERR=0x%x", XS_XFRLEN(xs), (long) XS_GET_RESID(xs), cdbstr, *XS_STSP(xs), XS_ERR(xs));
}
@@ -5876,6 +5923,7 @@ isp_parse_async_fc(ispsoftc_t *isp, uint16_t mbox)
continue;
}
j++;
+ isp_prt(isp, ISP_LOG_WARN1, "%d.%d.%d bus reset set at %s:%u", XS_CHANNEL(xs), XS_TGT(xs), XS_LUN(xs), __func__, __LINE__);
XS_SETERR(xs, HBA_BUSRESET);
}
if (j) {
@@ -6102,10 +6150,10 @@ isp_handle_other_response(ispsoftc_t *isp, int type, isphdr_t *hp, uint32_t *opt
{
switch (type) {
case RQSTYPE_STATUS_CONT:
- isp_prt(isp, ISP_LOGDEBUG0, "Ignored Continuation Response");
+ isp_prt(isp, ISP_LOG_WARN1, "Ignored Continuation Response");
return (1);
case RQSTYPE_MARKER:
- isp_prt(isp, ISP_LOGDEBUG0, "Marker Response");
+ isp_prt(isp, ISP_LOG_WARN1, "Marker Response");
return (1);
case RQSTYPE_ATIO:
case RQSTYPE_CTIO:
@@ -6170,7 +6218,7 @@ isp_parse_status(ispsoftc_t *isp, ispstatusreq_t *sp, XS_T *xs, long *rp)
case RQCS_INCOMPLETE:
if ((sp->req_state_flags & RQSF_GOT_TARGET) == 0) {
- isp_xs_prt(isp, xs, ISP_LOGDEBUG1, "Selection Timeout");
+ isp_xs_prt(isp, xs, ISP_LOG_WARN1, "Selection Timeout @ %s:%d", __func__, __LINE__);
if (XS_NOERR(xs)) {
XS_SETERR(xs, HBA_SELTIMEOUT);
*rp = XS_XFRLEN(xs);
@@ -6366,7 +6414,7 @@ isp_parse_status(ispsoftc_t *isp, ispstatusreq_t *sp, XS_T *xs, long *rp)
break;
case RQCS_QUEUE_FULL:
- isp_xs_prt(isp, xs, ISP_LOGDEBUG0, "internal queues full status 0x%x", *XS_STSP(xs));
+ isp_xs_prt(isp, xs, ISP_LOG_WARN1, "internal queues full status 0x%x", *XS_STSP(xs));
/*
* If QFULL or some other status byte is set, then this
@@ -6374,17 +6422,14 @@ isp_parse_status(ispsoftc_t *isp, ispstatusreq_t *sp, XS_T *xs, long *rp)
*
* Unfortunately, some QLogic f/w writers have, in
* some cases, ommitted to *set* status to QFULL.
- *
-
+ */
+#if 0
if (*XS_STSP(xs) != SCSI_GOOD && XS_NOERR(xs)) {
XS_SETERR(xs, HBA_NOERROR);
return;
}
- *
- *
- */
-
+#endif
*XS_STSP(xs) = SCSI_QFULL;
XS_SETERR(xs, HBA_NOERROR);
return;
@@ -6446,8 +6491,7 @@ isp_parse_status(ispsoftc_t *isp, ispstatusreq_t *sp, XS_T *xs, long *rp)
reason = "logout";
}
- isp_prt(isp, ISP_LOGINFO, "port %s for target %d",
- reason, XS_TGT(xs));
+ isp_prt(isp, ISP_LOGINFO, "port %s for target %d", reason, XS_TGT(xs));
/*
* If we're on a local loop, force a LIP (which is overkill)
@@ -6469,24 +6513,21 @@ isp_parse_status(ispsoftc_t *isp, ispstatusreq_t *sp, XS_T *xs, long *rp)
return;
}
case RQCS_PORT_CHANGED:
- isp_prt(isp, ISP_LOGWARN,
- "port changed for target %d", XS_TGT(xs));
+ isp_prt(isp, ISP_LOGWARN, "port changed for target %d", XS_TGT(xs));
if (XS_NOERR(xs)) {
XS_SETERR(xs, HBA_SELTIMEOUT);
}
return;
case RQCS_PORT_BUSY:
- isp_prt(isp, ISP_LOGWARN,
- "port busy for target %d", XS_TGT(xs));
+ isp_prt(isp, ISP_LOGWARN, "port busy for target %d", XS_TGT(xs));
if (XS_NOERR(xs)) {
XS_SETERR(xs, HBA_TGTBSY);
}
return;
default:
- isp_prt(isp, ISP_LOGERR, "Unknown Completion Status 0x%x",
- sp->req_completion_status);
+ isp_prt(isp, ISP_LOGERR, "Unknown Completion Status 0x%x", sp->req_completion_status);
break;
}
if (XS_NOERR(xs)) {
@@ -6547,9 +6588,7 @@ isp_parse_status_24xx(ispsoftc_t *isp, isp24xx_statusreq_t *sp, XS_T *xs, long *
return;
case RQCS_24XX_DRE: /* data reassembly error */
- isp_prt(isp, ISP_LOGERR,
- "Chan %d data reassembly error for target %d",
- chan, XS_TGT(xs));
+ isp_prt(isp, ISP_LOGERR, "Chan %d data reassembly error for target %d", chan, XS_TGT(xs));
if (XS_NOERR(xs)) {
XS_SETERR(xs, HBA_ABORTED);
}
@@ -6557,8 +6596,7 @@ isp_parse_status_24xx(ispsoftc_t *isp, isp24xx_statusreq_t *sp, XS_T *xs, long *
return;
case RQCS_24XX_TABORT: /* aborted by target */
- isp_prt(isp, ISP_LOGERR, "Chan %d target %d sent ABTS",
- chan, XS_TGT(xs));
+ isp_prt(isp, ISP_LOGERR, "Chan %d target %d sent ABTS", chan, XS_TGT(xs));
if (XS_NOERR(xs)) {
XS_SETERR(xs, HBA_ABORTED);
}
@@ -6580,7 +6618,7 @@ isp_parse_status_24xx(ispsoftc_t *isp, isp24xx_statusreq_t *sp, XS_T *xs, long *
return;
}
XS_SET_RESID(xs, sp->req_resid);
- isp_xs_prt(isp, xs, ISP_LOGDEBUG0, "Data Underrun (%d) for command 0x%x", sp->req_resid, XS_CDBP(xs)[0] & 0xff);
+ isp_xs_prt(isp, xs, ISP_LOG_WARN1, "Data Underrun (%d) for command 0x%x", sp->req_resid, XS_CDBP(xs)[0] & 0xff);
if (XS_NOERR(xs)) {
XS_SETERR(xs, HBA_NOERROR);
}
@@ -6616,8 +6654,7 @@ isp_parse_status_24xx(ispsoftc_t *isp, isp24xx_statusreq_t *sp, XS_T *xs, long *
return;
}
case RQCS_PORT_CHANGED:
- isp_prt(isp, ISP_LOGWARN,
- "port changed for target %d chan %d", XS_TGT(xs), chan);
+ isp_prt(isp, ISP_LOGWARN, "port changed for target %d chan %d", XS_TGT(xs), chan);
if (XS_NOERR(xs)) {
XS_SETERR(xs, HBA_SELTIMEOUT);
}
@@ -6625,9 +6662,7 @@ isp_parse_status_24xx(ispsoftc_t *isp, isp24xx_statusreq_t *sp, XS_T *xs, long *
case RQCS_24XX_ENOMEM: /* f/w resource unavailable */
- isp_prt(isp, ISP_LOGWARN,
- "f/w resource unavailable for target %d chan %d",
- XS_TGT(xs), chan);
+ isp_prt(isp, ISP_LOGWARN, "f/w resource unavailable for target %d chan %d", XS_TGT(xs), chan);
if (XS_NOERR(xs)) {
*XS_STSP(xs) = SCSI_BUSY;
XS_SETERR(xs, HBA_TGTBSY);
@@ -6635,9 +6670,7 @@ isp_parse_status_24xx(ispsoftc_t *isp, isp24xx_statusreq_t *sp, XS_T *xs, long *
return;
case RQCS_24XX_TMO: /* task management overrun */
- isp_prt(isp, ISP_LOGWARN,
- "command for target %d overlapped task management for "
- "chan %d", XS_TGT(xs), chan);
+ isp_prt(isp, ISP_LOGWARN, "command for target %d overlapped task management for chan %d", XS_TGT(xs), chan);
if (XS_NOERR(xs)) {
*XS_STSP(xs) = SCSI_BUSY;
XS_SETERR(xs, HBA_TGTBSY);
@@ -6645,9 +6678,7 @@ isp_parse_status_24xx(ispsoftc_t *isp, isp24xx_statusreq_t *sp, XS_T *xs, long *
return;
default:
- isp_prt(isp, ISP_LOGERR,
- "Unknown Completion Status 0x%x on chan %d",
- sp->req_completion_status, chan);
+ isp_prt(isp, ISP_LOGERR, "Unknown Completion Status 0x%x on chan %d", sp->req_completion_status, chan);
break;
}
if (XS_NOERR(xs)) {
@@ -6991,7 +7022,7 @@ static const uint32_t mbpfc[] = {
ISP_FC_OPMAP(0x03, 0x07), /* 0x05: MBOX_READ_RAM_WORD */
ISP_FC_OPMAP_FULL(0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff), /* 0x06: MBOX_MAILBOX_REG_TEST */
ISP_FC_OPMAP(0x07, 0x07), /* 0x07: MBOX_VERIFY_CHECKSUM */
- ISP_FC_OPMAP_FULL(0x0, 0x0, 0x0, 0x01, 0x0, 0x3, 0x80, 0x4f), /* 0x08: MBOX_ABOUT_FIRMWARE */
+ ISP_FC_OPMAP_FULL(0x0, 0x0, 0x0, 0x01, 0x0, 0x3, 0x80, 0x7f), /* 0x08: MBOX_ABOUT_FIRMWARE */
ISP_FC_OPMAP(0xdf, 0x01), /* 0x09: MBOX_LOAD_RISC_RAM_2100 */
ISP_FC_OPMAP(0xdf, 0x01), /* 0x0a: DUMP RAM */
ISP_FC_OPMAP_HALF(0x1, 0xff, 0x0, 0x01), /* 0x0b: MBOX_LOAD_RISC_RAM */
OpenPOWER on IntegriCloud