Author: marius
Date: Sun Jun 17 09:43:04 2012
New Revision: 237187
URL: http://svn.freebsd.org/changeset/base/237187

Log:
  MFC: r237101
  
  Fix a braino in r236469 (MFC'ed to stable/8 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

Modified:
  stable/8/sys/dev/sym/sym_conf.h
  stable/8/sys/dev/sym/sym_hipd.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/boot/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/e1000/   (props changed)

Modified: stable/8/sys/dev/sym/sym_conf.h
==============================================================================
--- stable/8/sys/dev/sym/sym_conf.h     Sun Jun 17 09:42:56 2012        
(r237186)
+++ stable/8/sys/dev/sym/sym_conf.h     Sun Jun 17 09:43:04 2012        
(r237187)
@@ -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: stable/8/sys/dev/sym/sym_hipd.c
==============================================================================
--- stable/8/sys/dev/sym/sym_hipd.c     Sun Jun 17 09:42:56 2012        
(r237186)
+++ stable/8/sys/dev/sym/sym_hipd.c     Sun Jun 17 09:43:04 2012        
(r237187)
@@ -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;
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to