kern/126866: [isp] [panic] kernel panic on card initialization
Alexander Sack
asack at niksun.com
Fri Oct 3 19:20:10 UTC 2008
The following reply was made to PR kern/126866; it has been noted by GNATS.
From: Alexander Sack <asack at niksun.com>
To: bug-followup at FreeBSD.org, westr at connection.ca
Cc:
Subject: Re: kern/126866: [isp] [panic] kernel panic on card initialization
Date: Fri, 3 Oct 2008 14:39:14 -0400
--Apple-Mail-13--61181355
Content-Type: text/plain;
charset=US-ASCII;
format=flowed;
delsp=yes
Content-Transfer-Encoding: 7bit
The main problem is if you issue a firmware MAILBOX command before you
quiesce the ISP then you will wound up handling async events to early
at attach time. I've moved checking for the reset signature further
down the isp_reset() path as well as remove checking OUTMAILBOX3
(OUTMAILBOX3 is really isp->isp_type (but its a string), if you see
the 'ISP' characters in OUTMAILBOX1 and 2 then we assume the soft
reset sequence worked and we can move on). Note the ABOUT FIRMWARE
command seems to fail on ISP24xx after a reset until the EXEC occurs.
We might want to rehash this sequence at some point but for now, we
either load via dodnld or we don't via loader.conf parameter., i.e. we
are still not checking which firmware is newer the one on the card or
the one shipped with the driver.
I also removed putting the ISP24xx into PAUSE mode - I don't see the
reason for this since we only touch SXP and FPM/FBM registers for non-
ISP24xx cards.
Note I have another patch to fix some firmware related issues as well
which I will coordinate with this fix...
-aps
--Apple-Mail-13--61181355
Content-Disposition: attachment;
filename=isp.c.patch
Content-Type: application/octet-stream;
x-unix-mode=0644;
name="isp.c.patch"
Content-Transfer-Encoding: 7bit
--- isp.c Tue Sep 30 18:09:42 2008
+++ isp.c.fix Fri Oct 3 14:27:48 2008
@@ -171,60 +171,6 @@
isp->isp_state = ISP_NILSTATE;
- /*
- * Basic types (SCSI, FibreChannel and PCI or SBus)
- * have been set in the MD code. We figure out more
- * here. Possibly more refined types based upon PCI
- * identification. Chip revision has been gathered.
- *
- * After we've fired this chip up, zero out the conf1 register
- * for SCSI adapters and do other settings for the 2100.
- */
-
- /*
- * Get the current running firmware revision out of the
- * chip before we hit it over the head (if this is our
- * first time through). Note that we store this as the
- * 'ROM' firmware revision- which it may not be. In any
- * case, we don't really use this yet, but we may in
- * the future.
- */
- if (isp->isp_touched == 0) {
- /*
- * 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. 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 ||
- ISP_READ(isp, OUTMAILBOX3) != 0x2020) {
- /*
- * Just in case it was paused...
- */
- if (IS_24XX(isp)) {
- ISP_WRITE(isp, BIU2400_HCCR,
- HCCR_2400_CMD_RELEASE);
- } else {
- ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE);
- }
- MEMZERO(&mbs, sizeof (mbs));
- mbs.param[0] = MBOX_ABOUT_FIRMWARE;
- mbs.logval = MBLOGNONE;
- isp_mboxcmd(isp, &mbs);
- if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
- isp->isp_romfw_rev[0] = mbs.param[1];
- isp->isp_romfw_rev[1] = mbs.param[2];
- isp->isp_romfw_rev[2] = mbs.param[3];
- }
- }
- isp->isp_touched = 1;
- }
ISP_DISABLE_INTS(isp);
@@ -279,13 +225,13 @@
}
/*
- * Put the board into PAUSE mode (so we can read the SXP registers
+ * XXX: For 23xx and earlier, put the board into
+ * PAUSE mode (so we can read the SXP registers
* or write FPM/FBM registers).
*/
if (IS_24XX(isp)) {
ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_CLEAR_HOST_INT);
ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_CLEAR_RISC_INT);
- ISP_WRITE(isp, BIU2400_HCCR, HCCR_2400_CMD_PAUSE);
} else {
ISP_WRITE(isp, HCCR, HCCR_CMD_PAUSE);
}
@@ -675,6 +621,61 @@
ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE);
}
+ /*
+ * Basic types (SCSI, FibreChannel and PCI or SBus)
+ * have been set in the MD code. We figure out more
+ * here. Possibly more refined types based upon PCI
+ * identification. Chip revision has been gathered.
+ *
+ * After we've fired this chip up, zero out the conf1 register
+ * for SCSI adapters and do other settings for the 2100.
+ */
+
+ /*
+ * Get the current running firmware revision out of the
+ * chip before we hit it over the head (if this is our
+ * first time through). Note that we store this as the
+ * 'ROM' firmware revision- which it may not be. In any
+ * case, we don't really use this yet, but we may in
+ * the future.
+ */
+ if (isp->isp_touched == 0) {
+ /*
+ * 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. 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) {
+ isp_prt(isp, ISP_LOGERR, "reset signature was invalid, RISC maybe paused");
+ /*
+ * Just in case it was paused...
+ */
+ if (IS_24XX(isp)) {
+ ISP_WRITE(isp, BIU2400_HCCR,
+ HCCR_2400_CMD_RELEASE);
+ } else {
+ ISP_WRITE(isp, HCCR, HCCR_CMD_RELEASE);
+ MEMZERO(&mbs, sizeof (mbs));
+ mbs.param[0] = MBOX_ABOUT_FIRMWARE;
+ mbs.logval = MBLOGNONE;
+ isp_mboxcmd(isp, &mbs);
+ if (mbs.param[0] == MBOX_COMMAND_COMPLETE) {
+ isp->isp_romfw_rev[0] = mbs.param[1];
+ isp->isp_romfw_rev[1] = mbs.param[2];
+ isp->isp_romfw_rev[2] = mbs.param[3];
+ }
+ }
+ }
+ isp->isp_touched = 1;
+ }
+
ISP_WRITE(isp, isp->isp_rqstinrp, 0);
ISP_WRITE(isp, isp->isp_rqstoutrp, 0);
ISP_WRITE(isp, isp->isp_respinrp, 0);
@@ -738,6 +739,7 @@
mbs.logval = MBLOGALL;
isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
+ isp_prt(isp, ISP_LOGERR, "Mailbox Register Test mailbox command failed to complete");
ISP_RESET0(isp);
return;
}
@@ -1832,7 +1834,6 @@
mbs.logval = MBLOGALL;
isp_mboxcmd(isp, &mbs);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
- isp_prt(isp, ISP_LOGERR, "setting firmware options failed");
return;
}
@@ -2056,7 +2057,6 @@
isp_mboxcmd(isp, &mbs);
FC_SCRATCH_RELEASE(isp);
if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
- isp_prt(isp, ISP_LOGERR, "initialization of firmware fails");
return;
}
isp->isp_reqidx = 0;
--Apple-Mail-13--61181355
Content-Type: text/plain;
charset=US-ASCII;
format=flowed
Content-Transfer-Encoding: 7bit
--Apple-Mail-13--61181355--
More information about the freebsd-scsi
mailing list