summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/dev/isp/isp.c9
-rw-r--r--sys/dev/isp/ispreg.h8
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__; \
OpenPOWER on IntegriCloud