Author: mav
Date: Mon Nov 30 21:30:18 2015
New Revision: 291500
URL: https://svnweb.freebsd.org/changeset/base/291500

Log:
  MFC r290147: Fix and improve error masking and reporting.

Modified:
  stable/10/sys/dev/isp/isp.c
  stable/10/sys/dev/isp/ispmbox.h
  stable/10/sys/dev/isp/ispreg.h
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/isp/isp.c
==============================================================================
--- stable/10/sys/dev/isp/isp.c Mon Nov 30 21:29:38 2015        (r291499)
+++ stable/10/sys/dev/isp/isp.c Mon Nov 30 21:30:18 2015        (r291500)
@@ -2562,7 +2562,8 @@ isp_getpdb(ispsoftc_t *isp, int chan, ui
                isp_pdb_24xx_t bill;
        } un;
 
-       MBSINIT(&mbs, MBOX_GET_PORT_DB, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR, 
250000);
+       MBSINIT(&mbs, MBOX_GET_PORT_DB,
+           MBLOGALL & ~MBLOGMASK(MBOX_COMMAND_PARAM_ERROR), 250000);
        if (IS_24XX(isp)) {
                mbs.ibits = (1 << 9)|(1 << 10);
                mbs.param[1] = id;
@@ -2632,7 +2633,7 @@ isp_gethandles(ispsoftc_t *isp, int chan
        uint32_t p;
        uint16_t h;
 
-       MBSINIT(&mbs, MBOX_GET_ID_LIST, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR, 
250000);
+       MBSINIT(&mbs, MBOX_GET_ID_LIST, MBLOGALL, 250000);
        if (IS_24XX(isp)) {
                mbs.param[2] = DMA_WD1(fcp->isp_scdma);
                mbs.param[3] = DMA_WD0(fcp->isp_scdma);
@@ -2726,7 +2727,8 @@ isp_get_wwn(ispsoftc_t *isp, int chan, i
            fcp->isp_loopstate < LOOP_PDB_RCVD) {
                return (wwn);
        }
-       MBSINIT(&mbs, MBOX_GET_PORT_NAME, MBLOGALL & ~MBOX_COMMAND_PARAM_ERROR, 
500000);
+       MBSINIT(&mbs, MBOX_GET_PORT_NAME,
+           MBLOGALL & ~MBLOGMASK(MBOX_COMMAND_PARAM_ERROR), 500000);
        if (ISP_CAP_2KLOGIN(isp)) {
                mbs.param[1] = loopid;
                if (nodename) {
@@ -4920,7 +4922,8 @@ isp_control(ispsoftc_t *isp, ispctl_t ct
                } else {
                        mbs.param[1] = (chan << 15) | (tgt << 8) | XS_LUN(xs);
                }
-               MBSINIT(&mbs, MBOX_ABORT, MBLOGALL & ~MBOX_COMMAND_ERROR, 0);
+               MBSINIT(&mbs, MBOX_ABORT,
+                   MBLOGALL & ~MBLOGMASK(MBOX_COMMAND_ERROR), 0);
                mbs.param[2] = handle;
                isp_mboxcmd(isp, &mbs);
                if (mbs.param[0] != MBOX_COMMAND_COMPLETE) {
@@ -7431,7 +7434,7 @@ isp_mboxcmd_qnw(ispsoftc_t *isp, mbreg_t
 static void
 isp_mboxcmd(ispsoftc_t *isp, mbreg_t *mbp)
 {
-       const char *cname, *xname;
+       const char *cname, *xname, *sname;
        char tname[16], mname[16];
        unsigned int ibits, obits, box, opcode;
 
@@ -7541,57 +7544,58 @@ isp_mboxcmd(ispsoftc_t *isp, mbreg_t *mb
 
        isp->isp_mboxbsy = 0;
        MBOX_RELEASE(isp);
- out:
-       if (mbp->logval == 0 || opcode == MBOX_EXEC_FIRMWARE) {
+out:
+       if (mbp->logval == 0 || mbp->param[0] == MBOX_COMMAND_COMPLETE)
+               return;
+
+       if ((mbp->param[0] & 0xbfe0) == 0 &&
+           (mbp->logval & MBLOGMASK(mbp->param[0])) == 0)
                return;
-       }
 
-       /*
-        * Just to be chatty here...
-        */
        xname = NULL;
+       sname = "";
        switch (mbp->param[0]) {
-       case MBOX_COMMAND_COMPLETE:
-               break;
        case MBOX_INVALID_COMMAND:
-               if (mbp->logval & MBLOGMASK(MBOX_COMMAND_COMPLETE)) {
-                       xname = "INVALID COMMAND";
-               }
+               xname = "INVALID COMMAND";
                break;
        case MBOX_HOST_INTERFACE_ERROR:
-               if (mbp->logval & MBLOGMASK(MBOX_HOST_INTERFACE_ERROR)) {
-                       xname = "HOST INTERFACE ERROR";
-               }
+               xname = "HOST INTERFACE ERROR";
                break;
        case MBOX_TEST_FAILED:
-               if (mbp->logval & MBLOGMASK(MBOX_TEST_FAILED)) {
-                       xname = "TEST FAILED";
-               }
+               xname = "TEST FAILED";
                break;
        case MBOX_COMMAND_ERROR:
-               if (mbp->logval & MBLOGMASK(MBOX_COMMAND_ERROR)) {
-                       xname = "COMMAND ERROR";
-               }
+               xname = "COMMAND ERROR";
+               ISP_SNPRINTF(mname, sizeof(mname), " subcode 0x%x",
+                   mbp->param[1]);
+               sname = mname;
                break;
        case MBOX_COMMAND_PARAM_ERROR:
-               if (mbp->logval & MBLOGMASK(MBOX_COMMAND_PARAM_ERROR)) {
-                       xname = "COMMAND PARAMETER ERROR";
-               }
-               break;
-       case MBOX_LOOP_ID_USED:
-               if (mbp->logval & MBLOGMASK(MBOX_LOOP_ID_USED)) {
-                       xname = "LOOP ID ALREADY IN USE";
-               }
+               xname = "COMMAND PARAMETER ERROR";
                break;
        case MBOX_PORT_ID_USED:
-               if (mbp->logval & MBLOGMASK(MBOX_PORT_ID_USED)) {
-                       xname = "PORT ID ALREADY IN USE";
-               }
+               xname = "PORT ID ALREADY IN USE";
+               break;
+       case MBOX_LOOP_ID_USED:
+               xname = "LOOP ID ALREADY IN USE";
                break;
        case MBOX_ALL_IDS_USED:
-               if (mbp->logval & MBLOGMASK(MBOX_ALL_IDS_USED)) {
-                       xname = "ALL LOOP IDS IN USE";
-               }
+               xname = "ALL LOOP IDS IN USE";
+               break;
+       case MBOX_NOT_LOGGED_IN:
+               xname = "NOT LOGGED IN";
+               break;
+       case MBOX_LINK_DOWN_ERROR:
+               xname = "LINK DOWN ERROR";
+               break;
+       case MBOX_LOOPBACK_ERROR:
+               xname = "LOOPBACK ERROR";
+               break;
+       case MBOX_CHECKSUM_ERROR:
+               xname = "CHECKSUM ERROR";
+               break;
+       case MBOX_INVALID_PRODUCT_KEY:
+               xname = "INVALID PRODUCT KEY";
                break;
        case MBOX_REGS_BUSY:
                xname = "REGISTERS BUSY";
@@ -7605,8 +7609,8 @@ isp_mboxcmd(ispsoftc_t *isp, mbreg_t *mb
                break;
        }
        if (xname) {
-               isp_prt(isp, ISP_LOGALL, "Mailbox Command '%s' failed (%s)",
-                   cname, xname);
+               isp_prt(isp, ISP_LOGALL, "Mailbox Command '%s' failed (%s%s)",
+                   cname, xname, sname);
        }
 }
 

Modified: stable/10/sys/dev/isp/ispmbox.h
==============================================================================
--- stable/10/sys/dev/isp/ispmbox.h     Mon Nov 30 21:29:38 2015        
(r291499)
+++ stable/10/sys/dev/isp/ispmbox.h     Mon Nov 30 21:30:18 2015        
(r291500)
@@ -191,13 +191,17 @@
 #define        MBOX_LOOP_ID_USED               0x4008
 #define        MBOX_ALL_IDS_USED               0x4009
 #define        MBOX_NOT_LOGGED_IN              0x400A
+#define        MBOX_LINK_DOWN_ERROR            0x400B
+#define        MBOX_LOOPBACK_ERROR             0x400C
+#define        MBOX_CHECKSUM_ERROR             0x4010
+#define        MBOX_INVALID_PRODUCT_KEY        0x4020
 /* pseudo mailbox completion codes */
 #define        MBOX_REGS_BUSY                  0x6000  /* registers in use */
 #define        MBOX_TIMEOUT                    0x6001  /* command timed out */
 
-#define        MBLOGALL                        0x000f
-#define        MBLOGNONE                       0x0000
-#define        MBLOGMASK(x)                    ((x) & 0xf)
+#define        MBLOGALL                        0xffffffff
+#define        MBLOGNONE                       0x00000000
+#define        MBLOGMASK(x)                    (1 << (((x) - 1) & 0x1f))
 
 /*
  * Asynchronous event status codes

Modified: stable/10/sys/dev/isp/ispreg.h
==============================================================================
--- stable/10/sys/dev/isp/ispreg.h      Mon Nov 30 21:29:38 2015        
(r291499)
+++ stable/10/sys/dev/isp/ispreg.h      Mon Nov 30 21:30:18 2015        
(r291500)
@@ -453,11 +453,9 @@ typedef struct {
        uint32_t obits; /* bits to add for register copyout */
        uint32_t ibitm; /* bits to mask for register copyin */
        uint32_t obitm; /* bits to mask for register copyout */
-       uint32_t
-               lineno  : 16,
-                       : 12,
-               logval  : 4;
+       uint32_t logval;        /* Bitmask of status codes to log */
        uint32_t timeout;
+       uint32_t lineno;
        const char *func;
 } mbreg_t;
 #define        MBSINIT(mbxp, code, loglev, timo)       \
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to