]> xenbits.xensource.com Git - people/liuw/freebsd.git/commitdiff
Improve Port Database Changed handling and reporting.
authormav <mav@FreeBSD.org>
Sun, 25 Oct 2015 14:34:07 +0000 (14:34 +0000)
committermav <mav@FreeBSD.org>
Sun, 25 Oct 2015 14:34:07 +0000 (14:34 +0000)
sys/dev/isp/isp.c
sys/dev/isp/isp_freebsd.c

index f8da1c97686caa8a0489ea1129821704c3881e1d..824b6dba284fde7f27f8aa0dbd243043c6549cf6 100644 (file)
@@ -6074,21 +6074,22 @@ isp_parse_async_fc(ispsoftc_t *isp, uint16_t mbox)
 
        case ASYNC_PDB_CHANGED:
        {
-               int nphdl, nlstate, reason;
-               /*
-                * We *should* get a channel out of the 24XX, but we don't seem
-                * to get more than a PDB CHANGED on channel 0, so turn it into
-                * a broadcast event.
-                */
+               int echan, nphdl, nlstate, reason;
+
                if (IS_24XX(isp)) {
                        nphdl = ISP_READ(isp, OUTMAILBOX1);
                        nlstate = ISP_READ(isp, OUTMAILBOX2);
-                       reason = ISP_READ(isp, OUTMAILBOX3) >> 8;
+                       reason = ISP_READ(isp, OUTMAILBOX3);
+                       chan = reason & 0xff;
+                       echan = (nphdl == NIL_HANDLE) ?
+                           isp->isp_nchan - 1 : chan;
+                       reason = reason >> 8;
                } else {
                        nphdl = NIL_HANDLE;
                        nlstate = reason = 0;
+                       chan = echan = 0;
                }
-               for (chan = 0; chan < isp->isp_nchan; chan++) {
+               for (; chan <= echan; chan++) {
                        fcparam *fcp = FCPARAM(isp, chan);
 
                        if (fcp->role == ISP_ROLE_NONE) {
index c78b3555ccebeb784d02404276fc46ff5afc64d1..db122975170842f7fe5f28942f7a2e31130824bc 100644 (file)
@@ -382,14 +382,16 @@ isp_freeze_loopdown(ispsoftc_t *isp, int chan, char *msg)
        if (IS_FC(isp)) {
                struct isp_fc *fc = ISP_FC_PC(isp, chan);
                if (fc->simqfrozen == 0) {
-                       isp_prt(isp, ISP_LOGDEBUG0, "%s: freeze simq (loopdown) chan %d", msg, chan);
+                       isp_prt(isp, ISP_LOGDEBUG0,
+                           "Chan %d %s -- freeze simq (loopdown)", chan, msg);
                        fc->simqfrozen = SIMQFRZ_LOOPDOWN;
 #if __FreeBSD_version >= 1000039
                        xpt_hold_boot();
 #endif
                        xpt_freeze_simq(fc->sim, 1);
                } else {
-                       isp_prt(isp, ISP_LOGDEBUG0, "%s: mark frozen (loopdown) chan %d", msg, chan);
+                       isp_prt(isp, ISP_LOGDEBUG0,
+                           "Chan %d %s -- mark frozen (loopdown)", chan, msg);
                        fc->simqfrozen |= SIMQFRZ_LOOPDOWN;
                }
        }
@@ -4988,11 +4990,11 @@ changed:
                fc = ISP_FC_PC(isp, bus);
 
                if (evt == ISPASYNC_CHANGE_PDB) {
-                       msg = "Chan %d Port Database Changed";
+                       msg = "Port Database Changed";
                } else if (evt == ISPASYNC_CHANGE_SNS) {
-                       msg = "Chan %d Name Server Database Changed";
+                       msg = "Name Server Database Changed";
                } else {
-                       msg = "Chan %d Other Change Notify";
+                       msg = "Other Change Notify";
                }
 
                /*
@@ -5002,7 +5004,7 @@ changed:
                        isp_prt(isp, ISP_LOG_SANCFG|ISP_LOGDEBUG0, "Stopping Loop Down Timer @ %lu", (unsigned long) time_uptime);
                        callout_stop(&fc->ldt);
                }
-               isp_prt(isp, ISP_LOGINFO, msg, bus);
+               isp_prt(isp, ISP_LOGINFO, "Chan %d %s", bus, msg);
                if (FCPARAM(isp, bus)->role & ISP_ROLE_INITIATOR) {
                        isp_freeze_loopdown(isp, bus, msg);
                }