Author: marius
Date: Sat Jun  2 18:57:16 2012
New Revision: 236469
URL: http://svn.freebsd.org/changeset/base/236469

Log:
  MFC: r236061
  
  - When creating the DMA tag for user data, don't ask for more segments
    than required for handling MAXPHYS and report the resulting maximum
    I/O size to CAM instead of implicitly limiting it to DFLTPHYS.
  - Move the variables of sym_action2() out of nested scope as required
    by style(9) and remove extraneous curly braces.
  - Replace a magic value for PCIR_COMMAND with the appropriate macro.
  - Use DEVMETHOD_END.
  - Use NULL instead of 0 for pointers.
  
  Tested with a HBA donated by wilko.

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     Sat Jun  2 18:57:13 2012        
(r236468)
+++ stable/8/sys/dev/sym/sym_conf.h     Sat Jun  2 18:57:16 2012        
(r236469)
@@ -83,6 +83,13 @@
 #define SYM_CONF_MAX_TAG_ORDER (6)
 
 /*
+ *  DMA boundary
+ *  We need to ensure 16 MB boundaries not to be crossed during DMA of
+ *  each segment, due to some chips being flawed.
+ */
+#define SYM_CONF_DMA_BOUNDARY  (1UL << 24)
+
+/*
  *  Max number of scatter/gather entries for en IO.
  *  Each entry costs 8 bytes in the internal CCB data structure.
  *  For now 65 should suffice given the BSD O/Ses capabilities.

Modified: stable/8/sys/dev/sym/sym_hipd.c
==============================================================================
--- stable/8/sys/dev/sym/sym_hipd.c     Sat Jun  2 18:57:13 2012        
(r236468)
+++ stable/8/sys/dev/sym/sym_hipd.c     Sat Jun  2 18:57:16 2012        
(r236469)
@@ -1623,6 +1623,7 @@ 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)  */
@@ -7988,10 +7989,7 @@ sym_fast_scatter_sg_physical(hcb_p np, c
 
 /*
  *  Scatter a SG list with physical addresses into bus addressable chunks.
- *  We need to ensure 16MB boundaries not to be crossed during DMA of
- *  each segment, due to some chips being flawed.
  */
-#define BOUND_MASK ((1UL<<24)-1)
 static int
 sym_scatter_sg_physical(hcb_p np, ccb_p cp, bus_dma_segment_t *psegs, int 
nsegs)
 {
@@ -8007,7 +8005,7 @@ sym_scatter_sg_physical(hcb_p np, ccb_p 
        pe = ps + psegs[t].ds_len;
 
        while (s >= 0) {
-               pn = (pe - 1) & ~BOUND_MASK;
+               pn = (pe - 1) & ~(SYM_CONF_DMA_BOUNDARY - 1);
                if (pn <= ps)
                        pn = ps;
                k = pe - pn;
@@ -8032,17 +8030,21 @@ sym_scatter_sg_physical(hcb_p np, ccb_p 
 
        return t >= 0 ? -1 : 0;
 }
-#undef BOUND_MASK
 
 /*
  *  SIM action for non performance critical stuff.
  */
 static void sym_action2(struct cam_sim *sim, union ccb *ccb)
 {
+       union ccb *abort_ccb;
+       struct ccb_hdr *ccb_h;
+       struct ccb_pathinq *cpi;
+       struct ccb_trans_settings *cts;
+       struct sym_trans *tip;
        hcb_p   np;
        tcb_p   tp;
        lcb_p   lp;
-       struct  ccb_hdr  *ccb_h;
+       u_char dflags;
 
        /*
         *  Retrieve our controller data structure.
@@ -8055,9 +8057,6 @@ static void sym_action2(struct cam_sim *
 
        switch (ccb_h->func_code) {
        case XPT_SET_TRAN_SETTINGS:
-       {
-               struct ccb_trans_settings *cts;
-
                cts  = &ccb->cts;
                tp = &np->target[ccb_h->target_id];
 
@@ -8079,13 +8078,7 @@ static void sym_action2(struct cam_sim *
 
                sym_xpt_done2(np, ccb, CAM_REQ_CMP);
                break;
-       }
        case XPT_GET_TRAN_SETTINGS:
-       {
-               struct ccb_trans_settings *cts;
-               struct sym_trans *tip;
-               u_char dflags;
-
                cts = &ccb->cts;
                tp = &np->target[ccb_h->target_id];
                lp = sym_lp(np, tp, ccb_h->target_lun);
@@ -8129,16 +8122,12 @@ static void sym_action2(struct cam_sim *
 #undef cts__scsi
                sym_xpt_done2(np, ccb, CAM_REQ_CMP);
                break;
-       }
        case XPT_CALC_GEOMETRY:
-       {
                cam_calc_geometry(&ccb->ccg, /*extended*/1);
                sym_xpt_done2(np, ccb, CAM_REQ_CMP);
                break;
-       }
        case XPT_PATH_INQ:
-       {
-               struct ccb_pathinq *cpi = &ccb->cpi;
+               cpi = &ccb->cpi;
                cpi->version_num = 1;
                cpi->hba_inquiry = PI_MDP_ABLE|PI_SDTR_ABLE|PI_TAG_ABLE;
                if ((np->features & FE_WIDE) != 0)
@@ -8173,12 +8162,11 @@ 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;
                sym_xpt_done2(np, ccb, CAM_REQ_CMP);
                break;
-       }
        case XPT_ABORT:
-       {
-               union ccb *abort_ccb = ccb->cab.abort_ccb;
+               abort_ccb = ccb->cab.abort_ccb;
                switch(abort_ccb->ccb_h.func_code) {
                case XPT_SCSI_IO:
                        if (sym_abort_scsiio(np, abort_ccb, 0) == 0) {
@@ -8190,14 +8178,10 @@ static void sym_action2(struct cam_sim *
                        break;
                }
                break;
-       }
        case XPT_RESET_DEV:
-       {
                sym_reset_dev(np, ccb);
                break;
-       }
        case XPT_RESET_BUS:
-       {
                sym_reset_scsi_bus(np, 0);
                if (sym_verbose) {
                        xpt_print_path(np->path);
@@ -8206,7 +8190,6 @@ static void sym_action2(struct cam_sim *
                sym_init (np, 1);
                sym_xpt_done2(np, ccb, CAM_REQ_CMP);
                break;
-       }
        case XPT_ACCEPT_TARGET_IO:
        case XPT_CONT_TARGET_IO:
        case XPT_EN_LUN:
@@ -8362,7 +8345,7 @@ sym_update_dflags(hcb_p np, u_char *flag
 static device_method_t sym_pci_methods[] = {
        DEVMETHOD(device_probe,  sym_pci_probe),
        DEVMETHOD(device_attach, sym_pci_attach),
-       { 0, 0 }
+       DEVMETHOD_END
 };
 
 static driver_t sym_pci_driver = {
@@ -8373,7 +8356,7 @@ static driver_t sym_pci_driver = {
 
 static devclass_t sym_devclass;
 
-DRIVER_MODULE(sym, pci, sym_pci_driver, sym_devclass, 0, 0);
+DRIVER_MODULE(sym, pci, sym_pci_driver, sym_devclass, NULL, NULL);
 MODULE_DEPEND(sym, cam, 1, 1, 1);
 MODULE_DEPEND(sym, pci, 1, 1, 1);
 
@@ -8586,15 +8569,16 @@ sym_pci_attach(device_t dev)
        /*
         *  Allocate a tag for the DMA of user data.
         */
-       if (bus_dma_tag_create(np->bus_dmat, 1, (1<<24),
-                               BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR,
-                               NULL, NULL,
-                               BUS_SPACE_MAXSIZE, SYM_CONF_MAX_SG,
-                               (1<<24), 0, busdma_lock_mutex, &np->mtx,
-                               &np->data_dmat)) {
+       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_DMA_ALLOCNOW, busdma_lock_mutex, &np->mtx, &np->data_dmat)) {
                device_printf(dev, "failed to create DMA tag.\n");
                goto attach_failed;
        }
+
        /*
         *  Read and apply some fix-ups to the PCI COMMAND
         *  register. We want the chip to be enabled for:
@@ -8603,9 +8587,8 @@ sym_pci_attach(device_t dev)
         *  - Write And Invalidate.
         */
        command = pci_read_config(dev, PCIR_COMMAND, 2);
-       command |= PCIM_CMD_BUSMASTEREN;
-       command |= PCIM_CMD_PERRESPEN;
-       command |= /* PCIM_CMD_MWIEN */ 0x0010;
+       command |= PCIM_CMD_BUSMASTEREN | PCIM_CMD_PERRESPEN |
+           PCIM_CMD_MWRICEN;
        pci_write_config(dev, PCIR_COMMAND, command, 2);
 
        /*
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to