svn commit: r237101 - head/sys/dev/sym

Marius Strobl marius at FreeBSD.org
Thu Jun 14 20:49:23 UTC 2012


Author: marius
Date: Thu Jun 14 20:49:22 2012
New Revision: 237101
URL: http://svn.freebsd.org/changeset/base/237101

Log:
  Fix a braino in r236469; the number of DMA tags required for handling
  MAXPHYS should be based on PAGE_SIZE rather than SYM_CONF_DMA_BOUNDARY.
  While at it, reuse the SYM_CONF_MAX_SG macro for specifying the maximum
  number of DMA tags so sym(4) itself doesn't size memory beyond what's
  required for handling MAXPHYS.
  
  PR:		168928
  MFC after:	3 days

Modified:
  head/sys/dev/sym/sym_conf.h
  head/sys/dev/sym/sym_hipd.c

Modified: head/sys/dev/sym/sym_conf.h
==============================================================================
--- head/sys/dev/sym/sym_conf.h	Thu Jun 14 20:44:56 2012	(r237100)
+++ head/sys/dev/sym/sym_conf.h	Thu Jun 14 20:49:22 2012	(r237101)
@@ -90,11 +90,12 @@
 #define SYM_CONF_DMA_BOUNDARY	(1UL << 24)
 
 /*
- *  Max number of scatter/gather entries for en IO.
+ *  Max number of scatter/gather entries for an I/O.
  *  Each entry costs 8 bytes in the internal CCB data structure.
- *  For now 65 should suffice given the BSD O/Ses capabilities.
+ *  We use at most 33 segments but also no more than required for handling
+ *  MAXPHYS.
  */
-#define SYM_CONF_MAX_SG		(33)
+#define	SYM_CONF_MAX_SG		(MIN(33, (MAXPHYS / PAGE_SIZE) + 1))
 
 /*
  *  Max number of targets.

Modified: head/sys/dev/sym/sym_hipd.c
==============================================================================
--- head/sys/dev/sym/sym_hipd.c	Thu Jun 14 20:44:56 2012	(r237100)
+++ head/sys/dev/sym/sym_hipd.c	Thu Jun 14 20:49:22 2012	(r237101)
@@ -1609,7 +1609,6 @@ struct sym_hcb {
 	u_int	features;	/* Chip features map		*/
 	u_char	myaddr;		/* SCSI id of the adapter	*/
 	u_char	maxburst;	/* log base 2 of dwords burst	*/
-	u_char	maxsegcnt;	/* Max DMA S/G segments		*/
 	u_char	maxwide;	/* Maximum transfer width	*/
 	u_char	minsync;	/* Min sync period factor (ST)	*/
 	u_char	maxsync;	/* Max sync period factor (ST)	*/
@@ -8135,7 +8134,7 @@ static void sym_action2(struct cam_sim *
 			cpi->xport_specific.spi.ppr_options =
 			    SID_SPI_CLOCK_DT_ST;
 		}
-		cpi->maxio = np->maxsegcnt * SYM_CONF_DMA_BOUNDARY;
+		cpi->maxio = SYM_CONF_MAX_SG * PAGE_SIZE;
 		sym_xpt_done2(np, ccb, CAM_REQ_CMP);
 		break;
 	case XPT_ABORT:
@@ -8536,11 +8535,9 @@ sym_pci_attach(device_t dev)
 	/*
 	 *  Allocate a tag for the DMA of user data.
 	 */
-	np->maxsegcnt = MIN(SYM_CONF_MAX_SG,
-	    (MAXPHYS / SYM_CONF_DMA_BOUNDARY) + 1);
 	if (bus_dma_tag_create(np->bus_dmat, 1, SYM_CONF_DMA_BOUNDARY,
 	    BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
-	    BUS_SPACE_MAXSIZE, np->maxsegcnt, SYM_CONF_DMA_BOUNDARY,
+	    BUS_SPACE_MAXSIZE, SYM_CONF_MAX_SG, SYM_CONF_DMA_BOUNDARY,
 	    BUS_DMA_ALLOCNOW, busdma_lock_mutex, &np->mtx, &np->data_dmat)) {
 		device_printf(dev, "failed to create DMA tag.\n");
 		goto attach_failed;


More information about the svn-src-all mailing list