diff options
-rw-r--r-- | sys/dev/isp/isp.c | 9 | ||||
-rw-r--r-- | sys/dev/isp/ispreg.h | 8 |
2 files changed, 14 insertions, 3 deletions
diff --git a/sys/dev/isp/isp.c b/sys/dev/isp/isp.c index d3e5bdb..6a3897a 100644 --- a/sys/dev/isp/isp.c +++ b/sys/dev/isp/isp.c @@ -2589,7 +2589,7 @@ isp_get_wwn(ispsoftc_t *isp, int chan, int loopid, int nodename) } mbs.param[9] = chan; } else { - mbs.ibits = 3; + mbs.ibitm = 3; mbs.param[1] = loopid << 8; if (nodename) { mbs.param[1] |= 1; @@ -7363,6 +7363,13 @@ isp_mboxcmd(ispsoftc_t *isp, mbreg_t *mbp) ibits |= mbp->ibits; obits |= mbp->obits; + /* + * Mask any bits that the caller wants us to mask + */ + ibits &= mbp->ibitm; + obits &= mbp->obitm; + + if (ibits == 0 && obits == 0) { mbp->param[0] = MBOX_COMMAND_PARAM_ERROR; isp_prt(isp, ISP_LOGERR, "no parameters for 0x%x", opcode); diff --git a/sys/dev/isp/ispreg.h b/sys/dev/isp/ispreg.h index 3460d24..1fe12fb 100644 --- a/sys/dev/isp/ispreg.h +++ b/sys/dev/isp/ispreg.h @@ -464,8 +464,10 @@ #define MBCMD_DEFAULT_TIMEOUT 100000 /* 100 ms */ typedef struct { uint16_t param[MAX_MAILBOX]; - uint32_t ibits; - uint32_t obits; + uint32_t ibits; /* bits to add for register copyin */ + 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, @@ -475,6 +477,8 @@ typedef struct { } mbreg_t; #define MBSINIT(mbxp, code, loglev, timo) \ ISP_MEMZERO((mbxp), sizeof (mbreg_t)); \ + (mbxp)->ibitm = ~0; \ + (mbxp)->obitm = ~0; \ (mbxp)->param[0] = code; \ (mbxp)->lineno = __LINE__; \ (mbxp)->func = __func__; \ |