diff options
-rw-r--r-- | sys/dev/aic7xxx/aic79xx_osm.c | 35 | ||||
-rw-r--r-- | sys/dev/aic7xxx/aic7xxx_osm.c | 35 |
2 files changed, 42 insertions, 28 deletions
diff --git a/sys/dev/aic7xxx/aic79xx_osm.c b/sys/dev/aic7xxx/aic79xx_osm.c index df73b3fadfa4..4a1e3336fe5f 100644 --- a/sys/dev/aic7xxx/aic79xx_osm.c +++ b/sys/dev/aic7xxx/aic79xx_osm.c @@ -303,6 +303,25 @@ ahd_platform_intr(void *arg) ahd_unlock(ahd); } +static void +ahd_sync_ccb(struct ahd_softc *ahd, struct scb *scb, union ccb *ccb, bool post) +{ + bus_dmasync_op_t op; + uint32_t rdmask; + + if (ccb->ccb_h.func_code == XPT_CONT_TARGET_IO) + rdmask = CAM_DIR_OUT; + else + rdmask = CAM_DIR_IN; + + if ((ccb->ccb_h.flags & CAM_DIR_MASK) == rdmask) + op = post ? BUS_DMASYNC_POSTREAD : BUS_DMASYNC_PREREAD; + else + op = post ? BUS_DMASYNC_POSTWRITE : BUS_DMASYNC_PREWRITE; + + bus_dmamap_sync(ahd->buffer_dmat, scb->dmamap, op); +} + /* * We have an scb which has been processed by the * adaptor, now we look to see how the operation @@ -324,13 +343,7 @@ ahd_done(struct ahd_softc *ahd, struct scb *scb) callout_stop(&scb->io_timer); if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) { - bus_dmasync_op_t op; - - if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) - op = BUS_DMASYNC_POSTREAD; - else - op = BUS_DMASYNC_POSTWRITE; - bus_dmamap_sync(ahd->buffer_dmat, scb->dmamap, op); + ahd_sync_ccb(ahd, scb, ccb, true); bus_dmamap_unload(ahd->buffer_dmat, scb->dmamap); } @@ -961,7 +974,6 @@ ahd_execute_scb(void *arg, bus_dma_segment_t *dm_segs, int nsegments, scb->sg_count = 0; if (nsegments != 0) { void *sg; - bus_dmasync_op_t op; u_int i; /* Copy the segments into our SG list */ @@ -971,13 +983,8 @@ ahd_execute_scb(void *arg, bus_dma_segment_t *dm_segs, int nsegments, /*last*/i == 1); dm_segs++; } - - if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) - op = BUS_DMASYNC_PREREAD; - else - op = BUS_DMASYNC_PREWRITE; - bus_dmamap_sync(ahd->buffer_dmat, scb->dmamap, op); + ahd_sync_ccb(ahd, scb, ccb, false); if (ccb->ccb_h.func_code == XPT_CONT_TARGET_IO) { struct target_data *tdata; diff --git a/sys/dev/aic7xxx/aic7xxx_osm.c b/sys/dev/aic7xxx/aic7xxx_osm.c index 46c87defa3a5..04037773c528 100644 --- a/sys/dev/aic7xxx/aic7xxx_osm.c +++ b/sys/dev/aic7xxx/aic7xxx_osm.c @@ -302,6 +302,25 @@ ahc_platform_intr(void *arg) ahc_unlock(ahc); } +static void +ahc_sync_ccb(struct ahc_softc *ahc, struct scb *scb, union ccb *ccb, bool post) +{ + bus_dmasync_op_t op; + uint32_t rdmask; + + if (ccb->ccb_h.func_code == XPT_CONT_TARGET_IO) + rdmask = CAM_DIR_OUT; + else + rdmask = CAM_DIR_IN; + + if ((ccb->ccb_h.flags & CAM_DIR_MASK) == rdmask) + op = post ? BUS_DMASYNC_POSTREAD : BUS_DMASYNC_PREREAD; + else + op = post ? BUS_DMASYNC_POSTWRITE : BUS_DMASYNC_PREWRITE; + + bus_dmamap_sync(ahc->buffer_dmat, scb->dmamap, op); +} + /* * We have an scb which has been processed by the * adaptor, now we look to see how the operation @@ -333,13 +352,7 @@ ahc_done(struct ahc_softc *ahc, struct scb *scb) callout_stop(&scb->io_timer); if ((ccb->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) { - bus_dmasync_op_t op; - - if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) - op = BUS_DMASYNC_POSTREAD; - else - op = BUS_DMASYNC_POSTWRITE; - bus_dmamap_sync(ahc->buffer_dmat, scb->dmamap, op); + ahc_sync_ccb(ahc, scb, ccb, true); bus_dmamap_unload(ahc->buffer_dmat, scb->dmamap); } @@ -943,7 +956,6 @@ ahc_execute_scb(void *arg, bus_dma_segment_t *dm_segs, int nsegments, if (nsegments != 0) { struct ahc_dma_seg *sg; bus_dma_segment_t *end_seg; - bus_dmasync_op_t op; end_seg = dm_segs + nsegments; @@ -968,12 +980,7 @@ ahc_execute_scb(void *arg, bus_dma_segment_t *dm_segs, int nsegments, */ scb->hscb->sgptr = aic_htole32(scb->sg_list_phys|SG_FULL_RESID); - if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) - op = BUS_DMASYNC_PREREAD; - else - op = BUS_DMASYNC_PREWRITE; - - bus_dmamap_sync(ahc->buffer_dmat, scb->dmamap, op); + ahc_sync_ccb(ahc, scb, ccb, false); if (ccb->ccb_h.func_code == XPT_CONT_TARGET_IO) { struct target_data *tdata; |