summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/isp/isp.c93
1 files changed, 62 insertions, 31 deletions
diff --git a/sys/dev/isp/isp.c b/sys/dev/isp/isp.c
index 783fcea..8e6e5af 100644
--- a/sys/dev/isp/isp.c
+++ b/sys/dev/isp/isp.c
@@ -64,8 +64,6 @@
/*
* Local static data
*/
-static const char warnlun[] =
- "WARNING- cannot determine Expanded LUN capability- limiting to one LUN";
static const char portshift[] =
"Target %d Loop ID 0x%x (Port 0x%x) => Loop 0x%x (Port 0x%x)";
static const char portdup[] =
@@ -161,7 +159,6 @@ isp_reset(struct ispsoftc *isp)
isp->isp_state = ISP_NILSTATE;
-
/*
* Basic types (SCSI, FibreChannel and PCI or SBus)
* have been set in the MD code. We figure out more
@@ -184,7 +181,13 @@ isp_reset(struct ispsoftc *isp)
/*
* First see whether or not we're sitting in the ISP PROM.
* If we've just been reset, we'll have the string "ISP "
- * spread through outgoing mailbox registers 1-3.
+ * spread through outgoing mailbox registers 1-3. We do
+ * this for PCI cards because otherwise we really don't
+ * know what state the card is in and we could hang if
+ * we try this command otherwise.
+ *
+ * For SBus cards, we just do this because they almost
+ * certainly will be running firmware by now.
*/
if (ISP_READ(isp, OUTMAILBOX1) != 0x4953 ||
ISP_READ(isp, OUTMAILBOX2) != 0x5020 ||
@@ -194,10 +197,7 @@ isp_reset(struct ispsoftc *isp)
*/
ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE);
mbs.param[0] = MBOX_ABOUT_FIRMWARE;
- isp_mboxcmd(isp, &mbs, MBOX_COMMAND_ERROR);
- /*
- * This *shouldn't* fail.....
- */
+ isp_mboxcmd(isp, &mbs, MBLOGNONE);
if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
isp->isp_romfw_rev[0] = mbs.param[1];
isp->isp_romfw_rev[1] = mbs.param[2];
@@ -208,6 +208,7 @@ isp_reset(struct ispsoftc *isp)
}
DISABLE_INTS(isp);
+
/*
* Set up default request/response queue in-pointer/out-pointer
* register indices.
@@ -675,22 +676,52 @@ again:
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
return;
}
+
+ /*
+ * The SBus firmware that we are using apparently does not return
+ * major, minor, micro revisions in the mailbox registers, which
+ * is really, really, annoying.
+ */
+ if (isp->isp_bustype == ISP_BT_SBUS) {
+ if (dodnld) {
+#ifdef ISP_TARGET_MODE
+ isp->isp_fwrev[0] = 7;
+ isp->isp_fwrev[1] = 55;
+#else
+ isp->isp_fwrev[0] = 1;
+ isp->isp_fwrev[1] = 37;
+#endif
+ isp->isp_fwrev[2] = 0;
+ }
+ } else {
+ isp->isp_fwrev[0] = mbs.param[1];
+ isp->isp_fwrev[1] = mbs.param[2];
+ isp->isp_fwrev[2] = mbs.param[3];
+ }
isp_prt(isp, ISP_LOGCONFIG,
"Board Type %s, Chip Revision 0x%x, %s F/W Revision %d.%d.%d",
btype, isp->isp_revision, dodnld? "loaded" : "resident",
- mbs.param[1], mbs.param[2], mbs.param[3]);
+ isp->isp_fwrev[0], isp->isp_fwrev[1], isp->isp_fwrev[2]);
+
if (IS_FC(isp)) {
- isp_prt(isp, ISP_LOGCONFIG, "Firmware Attributes = 0x%x",
- mbs.param[6]);
+ /*
+ * We do not believe firmware attributes for 2100 code less
+ * than 1.17.0.
+ */
+ if (IS_2100(isp) &&
+ (ISP_FW_REVX(isp->isp_fwrev) < ISP_FW_REV(1, 17, 0))) {
+ FCPARAM(isp)->isp_fwattr = 0;
+ } else {
+ FCPARAM(isp)->isp_fwattr = mbs.param[6];
+ isp_prt(isp, ISP_LOGDEBUG0,
+ "Firmware Attributes = 0x%x", mbs.param[6]);
+ }
if (ISP_READ(isp, BIU2100_CSR) & BIU2100_PCI64) {
isp_prt(isp, ISP_LOGCONFIG,
"Installed in 64-Bit PCI slot");
}
}
- isp->isp_fwrev[0] = mbs.param[1];
- isp->isp_fwrev[1] = mbs.param[2];
- isp->isp_fwrev[2] = mbs.param[3];
if (isp->isp_romfw_rev[0] || isp->isp_romfw_rev[1] ||
isp->isp_romfw_rev[2]) {
isp_prt(isp, ISP_LOGCONFIG, "Last F/W revision was %d.%d.%d",
@@ -720,15 +751,15 @@ again:
/*
* Okay- now that we have new firmware running, we now (re)set our
* notion of how many luns we support. This is somewhat tricky because
- * if we haven't loaded firmware, we don't have an easy way of telling
- * how many luns we support.
- *
- * We'll make a simplifying assumption- if we loaded firmware, we
- * are running with expanded lun firmware, otherwise not.
+ * if we haven't loaded firmware, we sometimes do not have an easy way
+ * of knowing how many luns we support.
*
* Expanded lun firmware gives you 32 luns for SCSI cards and
* 65536 luns for Fibre Channel cards.
*
+ * It turns out that even for QLogic 2100s with ROM 1.10 and above
+ * we do get a firmware attributes word returned in mailbox register 6.
+ *
* Because the lun is in a a different position in the Request Queue
* Entry structure for Fibre Channel with expanded lun firmware, we
* can only support one lun (lun zero) when we don't know what kind
@@ -739,18 +770,17 @@ again:
* and released.
*/
if (touched == 0) {
- if (dodnld) {
- if (IS_SCSI(isp)) {
+ if (IS_SCSI(isp)) {
+ if (dodnld) {
isp->isp_maxluns = 32;
} else {
- isp->isp_maxluns = 65536;
+ isp->isp_maxluns = 8;
}
} else {
- if (IS_SCSI(isp)) {
- isp->isp_maxluns = 8;
+ if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) {
+ isp->isp_maxluns = 65536;
} else {
- isp_prt(isp, ISP_LOGALL, warnlun);
- isp->isp_maxluns = 1;
+ isp->isp_maxluns = 16;
}
}
}
@@ -1193,7 +1223,8 @@ isp_fibre_init(struct ispsoftc *isp)
}
}
- if (IS_2200(isp) || IS_2300(isp)) {
+ if ((IS_2200(isp) && ISP_FW_REVX(isp->isp_fwrev) >=
+ ISP_FW_REV(2, 1, 26)) || IS_2300(isp)) {
/*
* Turn on LIP F8 async event (1)
* Turn on generate AE 8013 on all LIP Resets (2)
@@ -2678,7 +2709,7 @@ isp_start(XS_T *xs)
reqp->req_lun_trn = XS_LUN(xs);
reqp->req_cdblen = XS_CDBLEN(xs);
} else {
- if (isp->isp_maxluns > 16)
+ if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN)
t2reqp->req_scclun = XS_LUN(xs);
else
t2reqp->req_lun_trn = XS_LUN(xs);
@@ -2801,7 +2832,7 @@ isp_control(struct ispsoftc *isp, ispctl_t ctl, void *arg)
bus = XS_CHANNEL(xs);
mbs.param[0] = MBOX_ABORT;
if (IS_FC(isp)) {
- if (isp->isp_maxluns > 16) {
+ if (FCPARAM(isp)->isp_fwattr & ISP_FW_ATTR_SCCLUN) {
mbs.param[1] = tgt << 8;
mbs.param[4] = 0;
mbs.param[5] = 0;
@@ -3981,7 +4012,7 @@ static u_int16_t mbpscsi[] = {
ISPOPMAP(0x03, 0x07), /* 0x05: MBOX_READ_RAM_WORD */
ISPOPMAP(0x3f, 0x3f), /* 0x06: MBOX_MAILBOX_REG_TEST */
ISPOPMAP(0x03, 0x07), /* 0x07: MBOX_VERIFY_CHECKSUM */
- ISPOPMAP(0x01, 0x4f), /* 0x08: MBOX_ABOUT_FIRMWARE */
+ ISPOPMAP(0x01, 0x0f), /* 0x08: MBOX_ABOUT_FIRMWARE */
ISPOPMAP(0x00, 0x00), /* 0x09: */
ISPOPMAP(0x00, 0x00), /* 0x0a: */
ISPOPMAP(0x00, 0x00), /* 0x0b: */
@@ -4177,7 +4208,7 @@ static u_int16_t mbpfc[] = {
ISPOPMAP(0x03, 0x07), /* 0x05: MBOX_READ_RAM_WORD */
ISPOPMAP(0xff, 0xff), /* 0x06: MBOX_MAILBOX_REG_TEST */
ISPOPMAP(0x03, 0x05), /* 0x07: MBOX_VERIFY_CHECKSUM */
- ISPOPMAP(0x01, 0x0f), /* 0x08: MBOX_ABOUT_FIRMWARE */
+ ISPOPMAP(0x01, 0x4f), /* 0x08: MBOX_ABOUT_FIRMWARE */
ISPOPMAP(0xdf, 0x01), /* 0x09: LOAD RAM */
ISPOPMAP(0xdf, 0x01), /* 0x0a: DUMP RAM */
ISPOPMAP(0x00, 0x00), /* 0x0b: */
OpenPOWER on IntegriCloud