Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 15 Jul 2013 20:33:54 +0000 (UTC)
From:      Matt Jacob <mjacob@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r253371 - stable/9/sys/dev/isp
Message-ID:  <201307152033.r6FKXsI0039111@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mjacob
Date: Mon Jul 15 20:33:54 2013
New Revision: 253371
URL: http://svnweb.freebsd.org/changeset/base/253371

Log:
  MFC of 253330
  
  When fiddling with options of which registers to copy out for
  a mailbox command and which registers to copy back in when
  the command completes, the bits being set need to not only
  specify what bits you want to add from the default from the
  table but also what bits you want *subtract* (mask) from the
  default from the table.
  
  A failing ISP2200 command pointed this out.
  
  Approved by:	re

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

Modified: stable/9/sys/dev/isp/isp.c
==============================================================================
--- stable/9/sys/dev/isp/isp.c	Mon Jul 15 18:17:31 2013	(r253370)
+++ stable/9/sys/dev/isp/isp.c	Mon Jul 15 20:33:54 2013	(r253371)
@@ -2589,7 +2589,7 @@ isp_get_wwn(ispsoftc_t *isp, int chan, i
 		}
 		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 *mb
 	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);

Modified: stable/9/sys/dev/isp/ispreg.h
==============================================================================
--- stable/9/sys/dev/isp/ispreg.h	Mon Jul 15 18:17:31 2013	(r253370)
+++ stable/9/sys/dev/isp/ispreg.h	Mon Jul 15 20:33:54 2013	(r253371)
@@ -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__;		\



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201307152033.r6FKXsI0039111>