Deleted Added
full compact
59c59
< __FBSDID("$FreeBSD: head/sys/dev/amr/amr.c 174194 2007-12-02 19:54:45Z scottl $");
---
> __FBSDID("$FreeBSD: head/sys/dev/amr/amr.c 174544 2007-12-12 05:55:03Z scottl $");
143,145c143,145
< static void amr_setup_dmamap(void *arg, bus_dma_segment_t *segs, int nsegments, int error);
< static void amr_setup_dma64map(void *arg, bus_dma_segment_t *segs, int nsegments, int error);
< static void amr_setup_data_dmamap(void *arg, bus_dma_segment_t *segs, int nsegments, int error);
---
> static void amr_setup_sg(void *arg, bus_dma_segment_t *segs, int nsegments, int error);
> static void amr_setup_data(void *arg, bus_dma_segment_t *segs, int nsegments, int error);
> static void amr_setup_ccb(void *arg, bus_dma_segment_t *segs, int nsegments, int error);
575,577d574
< ap = malloc(sizeof(struct amr_passthrough),
< M_AMR, M_WAITOK | M_ZERO);
<
589a587,592
> mtx_lock(&sc->amr_list_lock);
> while ((ac = amr_alloccmd(sc)) == NULL)
> msleep(sc, &sc->amr_list_lock, PPAUSE, "amrioc", hz);
> mtx_unlock(&sc->amr_list_lock);
> ap = &ac->ac_ccb->ccb_pthru;
>
606,610c609
< mtx_lock(&sc->amr_list_lock);
< while ((ac = amr_alloccmd(sc)) == NULL)
< msleep(sc, &sc->amr_list_lock, PPAUSE, "amrioc", hz);
<
< ac_flags = AMR_CMD_DATAIN|AMR_CMD_DATAOUT|AMR_CMD_CCB_DATAIN|AMR_CMD_CCB_DATAOUT;
---
> ac_flags = AMR_CMD_DATAIN|AMR_CMD_DATAOUT|AMR_CMD_CCB;
615,618c614,615
< ac->ac_data = ap;
< ac->ac_length = sizeof(struct amr_passthrough);
< ac->ac_ccb_data = dp;
< ac->ac_ccb_length = ap->ap_data_transfer_length;
---
> ac->ac_data = dp;
> ac->ac_length = ap->ap_data_transfer_length;
620a618
> mtx_lock(&sc->amr_list_lock);
709,710d706
< if (ap != NULL)
< free(ap, M_AMR);
732c728
< int error, ac_flags = 0;
---
> int error;
835,836d830
< if (au_cmd[0] == AMR_CMD_PASS)
< ap = malloc(sizeof(struct amr_passthrough), M_AMR, M_WAITOK|M_ZERO);
845a840,842
> ap = &ac->ac_ccb->ccb_pthru;
> bzero(ap, sizeof(struct amr_passthrough));
>
863,867d859
< ac->ac_data = ap;
< ac->ac_length = sizeof(struct amr_passthrough);
< ac->ac_ccb_data = dp;
< ac->ac_ccb_length = au_length;
<
869c861
< ac_flags = AMR_CMD_DATAIN|AMR_CMD_DATAOUT|AMR_CMD_CCB_DATAIN|AMR_CMD_CCB_DATAOUT;
---
> ac->ac_flags = AMR_CMD_CCB;
881,885c873
<
< /* build the command */
< ac->ac_data = dp;
< ac->ac_length = au_length;
< ac_flags = AMR_CMD_DATAIN|AMR_CMD_DATAOUT;
---
> ac->ac_flags = 0;
888c876,879
< ac->ac_flags = ac_flags;
---
> /* build the command */
> ac->ac_data = dp;
> ac->ac_length = au_length;
> ac->ac_flags |= AMR_CMD_DATAIN|AMR_CMD_DATAOUT;
902c893
< debug(2, "%jd", (uintptr_t)dp);
---
> debug(2, "%p status 0x%x", dp, ac->ac_status);
916,917d906
< if (ap != NULL)
< free(ap, M_AMR);
1423c1412
< int flags;
---
> int mb_channel;
1425,1429c1414
< flags = 0;
< if (ac->ac_flags & AMR_CMD_DATAIN)
< flags |= BUS_DMASYNC_PREREAD;
< if (ac->ac_flags & AMR_CMD_DATAOUT)
< flags |= BUS_DMASYNC_PREWRITE;
---
> amr_setup_sg(arg, segs, nsegs, err);
1430a1416,1424
> /* for AMR_CMD_CONFIG Read/Write the s/g count goes elsewhere */
> mb_channel = ((struct amr_mailbox_ioctl *)&ac->ac_mailbox)->mb_channel;
> if (ac->ac_mailbox.mb_command == AMR_CMD_CONFIG &&
> ((mb_channel == AMR_CONFIG_READ_NVRAM_CONFIG) ||
> (mb_channel == AMR_CONFIG_WRITE_NVRAM_CONFIG)))
> ((struct amr_mailbox_ioctl *)&ac->ac_mailbox)->mb_param = ac->ac_nsegments;
>
> ac->ac_mailbox.mb_nsgelem = ac->ac_nsegments;
> ac->ac_mailbox.mb_physaddr = ac->ac_mb_physaddr;
1432,1436c1426,1427
< amr_setup_dma64map(arg, segs, nsegs, err);
< bus_dmamap_sync(sc->amr_buffer64_dmat,ac->ac_dma64map, flags);
< } else {
< amr_setup_dmamap(arg, segs, nsegs, err);
< bus_dmamap_sync(sc->amr_buffer_dmat,ac->ac_dmamap, flags);
---
> ac->ac_sg64_hi = 0;
> ac->ac_sg64_lo = ac->ac_sgbusaddr;
1437a1429
>
1448,1449d1439
< bus_dma_tag_t tag;
< bus_dmamap_t datamap;
1458,1459c1448,1449
< tag = sc->amr_buffer64_dmat;
< datamap = ac->ac_dma64map;
---
> ac->ac_tag = sc->amr_buffer64_dmat;
> ac->ac_datamap = ac->ac_dma64map;
1461,1462c1451,1452
< tag = sc->amr_buffer_dmat;
< datamap = ac->ac_dmamap;
---
> ac->ac_tag = sc->amr_buffer_dmat;
> ac->ac_datamap = ac->ac_dmamap;
1467,1468c1457,1458
< if (bus_dmamap_load(tag, datamap, ac->ac_data, ac->ac_length,
< amr_setup_polled_dmamap, ac, BUS_DMA_NOWAIT) != 0) {
---
> if (bus_dmamap_load(ac->ac_tag, ac->ac_datamap, ac->ac_data,
> ac->ac_length, amr_setup_polled_dmamap, ac, BUS_DMA_NOWAIT) != 0) {
1497,1500c1487
< if (AC_IS_SG64(ac))
< bus_dmamap_unload(sc->amr_buffer64_dmat, ac->ac_dma64map);
< else
< bus_dmamap_unload(sc->amr_buffer_dmat, ac->ac_dmamap);
---
> bus_dmamap_unload(ac->ac_tag, ac->ac_datamap);
1538,1539c1525
< bus_dmamap_sync(sc->amr_buffer_dmat,ac->ac_dmamap,
< BUS_DMASYNC_POSTREAD);
---
> bus_dmamap_sync(ac->ac_tag, ac->ac_datamap, BUS_DMASYNC_POSTREAD);
1542,1543c1528
< bus_dmamap_sync(sc->amr_buffer_dmat,ac->ac_dmamap,
< BUS_DMASYNC_POSTWRITE);
---
> bus_dmamap_sync(ac->ac_tag, ac->ac_datamap, BUS_DMASYNC_POSTWRITE);
1545,1548c1530
< if (AC_IS_SG64(ac))
< bus_dmamap_unload(sc->amr_buffer64_dmat, ac->ac_dma64map);
< else
< bus_dmamap_unload(sc->amr_buffer_dmat, ac->ac_dmamap);
---
> bus_dmamap_unload(ac->ac_tag, ac->ac_datamap);
1577c1559
< amr_setup_dmamap(void *arg, bus_dma_segment_t *segs, int nsegments, int error)
---
> amr_setup_sg(void *arg, bus_dma_segment_t *segs, int nsegments, int error)
1581,1582c1563,1564
< int i;
< u_int8_t *sgc;
---
> struct amr_sg64entry *sg64;
> int flags, i;
1586,1587c1568,1569
< /* get base address of s/g table */
< sg = ac->ac_sg.sg32;
---
> if (error)
> printf("amr_setup_sg: error %d\n", error);
1589,1629d1570
< /* save data physical address */
<
< /* for AMR_CMD_CONFIG Read/Write the s/g count goes elsewhere */
< if (ac->ac_mailbox.mb_command == AMR_CMD_CONFIG && (
< ((struct amr_mailbox_ioctl *)&ac->ac_mailbox)->mb_channel == AMR_CONFIG_READ_NVRAM_CONFIG ||
< ((struct amr_mailbox_ioctl *)&ac->ac_mailbox)->mb_channel == AMR_CONFIG_WRITE_NVRAM_CONFIG)) {
< sgc = &(((struct amr_mailbox_ioctl *)&ac->ac_mailbox)->mb_param);
< } else {
< sgc = &ac->ac_mailbox.mb_nsgelem;
< }
<
< /* decide whether we need to populate the s/g table */
< if (nsegments < 2) {
< *sgc = 0;
< ac->ac_mailbox.mb_nsgelem = 0;
< ac->ac_mailbox.mb_physaddr = segs[0].ds_addr;
< } else {
< ac->ac_mailbox.mb_nsgelem = nsegments;
< *sgc = nsegments;
< /* XXX Setting these to 0 might not be needed. */
< ac->ac_sg64_lo = 0;
< ac->ac_sg64_hi = 0;
< ac->ac_mailbox.mb_physaddr = ac->ac_sgbusaddr;
< for (i = 0; i < nsegments; i++, sg++) {
< sg->sg_addr = segs[i].ds_addr;
< sg->sg_count = segs[i].ds_len;
< }
< }
<
< }
<
< static void
< amr_setup_dma64map(void *arg, bus_dma_segment_t *segs, int nsegments, int error)
< {
< struct amr_command *ac = (struct amr_command *)arg;
< struct amr_sg64entry *sg;
< int i;
< u_int8_t *sgc;
<
< debug_called(3);
<
1631,1665d1571
< sg = ac->ac_sg.sg64;
<
< /* save data physical address */
<
< /* for AMR_CMD_CONFIG Read/Write the s/g count goes elsewhere */
< if (ac->ac_mailbox.mb_command == AMR_CMD_CONFIG && (
< ((struct amr_mailbox_ioctl *)&ac->ac_mailbox)->mb_channel == AMR_CONFIG_READ_NVRAM_CONFIG ||
< ((struct amr_mailbox_ioctl *)&ac->ac_mailbox)->mb_channel == AMR_CONFIG_WRITE_NVRAM_CONFIG)) {
< sgc = &(((struct amr_mailbox_ioctl *)&ac->ac_mailbox)->mb_param);
< } else {
< sgc = &ac->ac_mailbox.mb_nsgelem;
< }
<
< ac->ac_mailbox.mb_nsgelem = nsegments;
< *sgc = nsegments;
< ac->ac_sg64_hi = 0;
< ac->ac_sg64_lo = ac->ac_sgbusaddr;
< ac->ac_mailbox.mb_physaddr = 0xffffffff;
< for (i = 0; i < nsegments; i++, sg++) {
< sg->sg_addr = segs[i].ds_addr;
< sg->sg_count = segs[i].ds_len;
< }
< }
<
< static void
< amr_setup_ccbmap(void *arg, bus_dma_segment_t *segs, int nsegments, int error)
< {
< struct amr_command *ac = (struct amr_command *)arg;
< struct amr_softc *sc = ac->ac_sc;
< struct amr_sgentry *sg;
< struct amr_passthrough *ap = (struct amr_passthrough *)ac->ac_data;
< struct amr_ext_passthrough *aep = (struct amr_ext_passthrough *)ac->ac_data;
< int i;
<
< /* get base address of s/g table */
1666a1573
> sg64 = ac->ac_sg.sg64;
1668,1685c1575,1580
< /* decide whether we need to populate the s/g table */
< if( ac->ac_mailbox.mb_command == AMR_CMD_EXTPASS ) {
< if (nsegments < 2) {
< aep->ap_no_sg_elements = 0;
< aep->ap_data_transfer_address = segs[0].ds_addr;
< } else {
< /* save s/g table information in passthrough */
< aep->ap_no_sg_elements = nsegments;
< aep->ap_data_transfer_address = ac->ac_sgbusaddr;
< /*
< * populate s/g table (overwrites previous call which mapped the
< * passthrough)
< */
< for (i = 0; i < nsegments; i++, sg++) {
< sg->sg_addr = segs[i].ds_addr;
< sg->sg_count = segs[i].ds_len;
< debug(3, " %d: 0x%x/%d", i, sg->sg_addr, sg->sg_count);
< }
---
> if (AC_IS_SG64(ac)) {
> ac->ac_nsegments = nsegments;
> ac->ac_mb_physaddr = 0xffffffff;
> for (i = 0; i < nsegments; i++, sg64++) {
> sg64->sg_addr = segs[i].ds_addr;
> sg64->sg_count = segs[i].ds_len;
1687,1688d1581
< debug(3, "slot %d %d segments at 0x%x\n", ac->ac_slot,
< aep->ap_no_sg_elements, aep->ap_data_transfer_address);
1689a1583
> /* decide whether we need to populate the s/g table */
1691,1692c1585,1586
< ap->ap_no_sg_elements = 0;
< ap->ap_data_transfer_address = segs[0].ds_addr;
---
> ac->ac_nsegments = 0;
> ac->ac_mb_physaddr = segs[0].ds_addr;
1694,1700c1588,1589
< /* save s/g table information in passthrough */
< ap->ap_no_sg_elements = nsegments;
< ap->ap_data_transfer_address = ac->ac_sgbusaddr;
< /*
< * populate s/g table (overwrites previous call which mapped the
< * passthrough)
< */
---
> ac->ac_nsegments = nsegments;
> ac->ac_mb_physaddr = ac->ac_sgbusaddr;
1704d1592
< debug(3, " %d: 0x%x/%d", i, sg->sg_addr, sg->sg_count);
1707,1708d1594
< debug(3, "slot %d %d segments at 0x%x\n", ac->ac_slot,
< ap->ap_no_sg_elements, ap->ap_data_transfer_address);
1710,1717d1595
< if (ac->ac_flags & AMR_CMD_CCB_DATAIN)
< bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_ccb_dmamap,
< BUS_DMASYNC_PREREAD);
< if (ac->ac_flags & AMR_CMD_CCB_DATAOUT)
< bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_ccb_dmamap,
< BUS_DMASYNC_PREWRITE);
< if ((ac->ac_flags & (AMR_CMD_CCB_DATAIN | AMR_CMD_CCB_DATAOUT)) == 0)
< panic("no direction for ccb?\n");
1718a1597
> flags = 0;
1720c1599
< bus_dmamap_sync(sc->amr_buffer_dmat,ac->ac_dmamap,BUS_DMASYNC_PREREAD);
---
> flags |= BUS_DMASYNC_PREREAD;
1722,1723c1601,1602
< bus_dmamap_sync(sc->amr_buffer_dmat,ac->ac_dmamap,BUS_DMASYNC_PREWRITE);
<
---
> flags |= BUS_DMASYNC_PREWRITE;
> bus_dmamap_sync(ac->ac_tag, ac->ac_datamap, flags);
1725,1729d1603
<
< if (sc->amr_submit_command(ac) == EBUSY) {
< amr_freeslot(ac);
< amr_requeue_ready(ac);
< }
1733c1607
< amr_setup_ccb64map(void *arg, bus_dma_segment_t *segs, int nsegments, int error)
---
> amr_setup_data(void *arg, bus_dma_segment_t *segs, int nsegs, int err)
1735,1740c1609,1611
< struct amr_command *ac = (struct amr_command *)arg;
< struct amr_softc *sc = ac->ac_sc;
< struct amr_sg64entry *sg;
< struct amr_passthrough *ap = (struct amr_passthrough *)ac->ac_data;
< struct amr_ext_passthrough *aep = (struct amr_ext_passthrough *)ac->ac_data;
< int i;
---
> struct amr_command *ac = arg;
> struct amr_softc *sc = ac->ac_sc;
> int mb_channel;
1742,1743c1613
< /* get base address of s/g table */
< sg = ac->ac_sg.sg64;
---
> amr_setup_sg(arg, segs, nsegs, err);
1745,1775c1615,1626
< /* decide whether we need to populate the s/g table */
< if( ac->ac_mailbox.mb_command == AMR_CMD_EXTPASS ) {
< /* save s/g table information in passthrough */
< aep->ap_no_sg_elements = nsegments;
< aep->ap_data_transfer_address = ac->ac_sgbusaddr;
< /*
< * populate s/g table (overwrites previous call which mapped the
< * passthrough)
< */
< for (i = 0; i < nsegments; i++, sg++) {
< sg->sg_addr = segs[i].ds_addr;
< sg->sg_count = segs[i].ds_len;
< debug(3, " %d: 0x%lx/%d", i, (u_long)sg->sg_addr, sg->sg_count);
< }
< debug(3, "slot %d %d segments at 0x%x\n", ac->ac_slot,
< aep->ap_no_sg_elements, aep->ap_data_transfer_address);
< } else {
< /* save s/g table information in passthrough */
< ap->ap_no_sg_elements = nsegments;
< ap->ap_data_transfer_address = ac->ac_sgbusaddr;
< /*
< * populate s/g table (overwrites previous call which mapped the
< * passthrough)
< */
< for (i = 0; i < nsegments; i++, sg++) {
< sg->sg_addr = segs[i].ds_addr;
< sg->sg_count = segs[i].ds_len;
< debug(3, " %d: 0x%lx/%d", i, (u_long)sg->sg_addr, sg->sg_count);
< }
< debug(3, "slot %d %d segments at 0x%x\n", ac->ac_slot,
< ap->ap_no_sg_elements, ap->ap_data_transfer_address);
---
> /* for AMR_CMD_CONFIG Read/Write the s/g count goes elsewhere */
> mb_channel = ((struct amr_mailbox_ioctl *)&ac->ac_mailbox)->mb_channel;
> if (ac->ac_mailbox.mb_command == AMR_CMD_CONFIG &&
> ((mb_channel == AMR_CONFIG_READ_NVRAM_CONFIG) ||
> (mb_channel == AMR_CONFIG_WRITE_NVRAM_CONFIG)))
> ((struct amr_mailbox_ioctl *)&ac->ac_mailbox)->mb_param = ac->ac_nsegments;
>
> ac->ac_mailbox.mb_nsgelem = ac->ac_nsegments;
> ac->ac_mailbox.mb_physaddr = ac->ac_mb_physaddr;
> if (AC_IS_SG64(ac)) {
> ac->ac_sg64_hi = 0;
> ac->ac_sg64_lo = ac->ac_sgbusaddr;
1777,1784d1627
< if (ac->ac_flags & AMR_CMD_CCB_DATAIN)
< bus_dmamap_sync(sc->amr_buffer64_dmat, ac->ac_ccb_dma64map,
< BUS_DMASYNC_PREREAD);
< if (ac->ac_flags & AMR_CMD_CCB_DATAOUT)
< bus_dmamap_sync(sc->amr_buffer64_dmat, ac->ac_ccb_dma64map,
< BUS_DMASYNC_PREWRITE);
< if ((ac->ac_flags & (AMR_CMD_CCB_DATAIN | AMR_CMD_CCB_DATAOUT)) == 0)
< panic("no direction for ccb?\n");
1786,1794d1628
< if (ac->ac_flags & AMR_CMD_DATAIN)
< bus_dmamap_sync(sc->amr_buffer64_dmat, ac->ac_dma64map,
< BUS_DMASYNC_PREREAD);
< if (ac->ac_flags & AMR_CMD_DATAOUT)
< bus_dmamap_sync(sc->amr_buffer64_dmat, ac->ac_dma64map,
< BUS_DMASYNC_PREWRITE);
<
< ac->ac_flags |= AMR_CMD_MAPPED;
<
1800c1634
<
---
>
1802,1803c1636
< amr_setup_dmamap_cb(void *arg, bus_dma_segment_t *segs, int nsegments,
< int error)
---
> amr_setup_ccb(void *arg, bus_dma_segment_t *segs, int nsegs, int err)
1805,1806c1638,1641
< struct amr_command *ac = (struct amr_command *)arg;
< struct amr_softc *sc = ac->ac_sc;
---
> struct amr_command *ac = arg;
> struct amr_softc *sc = ac->ac_sc;
> struct amr_passthrough *ap = &ac->ac_ccb->ccb_pthru;
> struct amr_ext_passthrough *aep = &ac->ac_ccb->ccb_epthru;
1808c1643,1645
< amr_setup_dmamap(arg, segs, nsegments, error);
---
> /* Set up the mailbox portion of the command to point at the ccb */
> ac->ac_mailbox.mb_nsgelem = 0;
> ac->ac_mailbox.mb_physaddr = ac->ac_ccb_busaddr;
1810,1813c1647,1659
< if (bus_dmamap_load(sc->amr_buffer_dmat, ac->ac_ccb_dmamap,
< ac->ac_ccb_data, ac->ac_ccb_length, amr_setup_ccbmap, ac,
< 0) == EINPROGRESS) {
< sc->amr_state |= AMR_STATE_QUEUE_FRZN;
---
> amr_setup_sg(arg, segs, nsegs, err);
>
> switch (ac->ac_mailbox.mb_command) {
> case AMR_CMD_EXTPASS:
> aep->ap_no_sg_elements = ac->ac_nsegments;
> aep->ap_data_transfer_address = ac->ac_mb_physaddr;
> break;
> case AMR_CMD_PASS:
> ap->ap_no_sg_elements = ac->ac_nsegments;
> ap->ap_data_transfer_address = ac->ac_mb_physaddr;
> break;
> default:
> panic("Unknown ccb command");
1815d1660
< }
1817,1829c1662,1664
< static void
< amr_setup_dma64map_cb(void *arg, bus_dma_segment_t *segs, int nsegments,
< int error)
< {
< struct amr_command *ac = (struct amr_command *)arg;
< struct amr_softc *sc = ac->ac_sc;
<
< amr_setup_dma64map(arg, segs, nsegments, error);
<
< if (bus_dmamap_load(sc->amr_buffer64_dmat, ac->ac_ccb_dma64map,
< ac->ac_ccb_data, ac->ac_ccb_length, amr_setup_ccb64map, ac,
< 0) == EINPROGRESS) {
< sc->amr_state |= AMR_STATE_QUEUE_FRZN;
---
> if (sc->amr_submit_command(ac) == EBUSY) {
> amr_freeslot(ac);
> amr_requeue_ready(ac);
1836,1837d1670
< bus_dma_tag_t tag;
< bus_dmamap_t datamap;
1844,1846c1677,1678
< tag = sc->amr_buffer64_dmat;
< datamap = ac->ac_dma64map;
< cb = amr_setup_dma64map_cb;
---
> ac->ac_tag = sc->amr_buffer64_dmat;
> ac->ac_datamap = ac->ac_dma64map;
1848,1850c1680,1681
< tag = sc->amr_buffer_dmat;
< datamap = ac->ac_dmamap;
< cb = amr_setup_dmamap_cb;
---
> ac->ac_tag = sc->amr_buffer_dmat;
> ac->ac_datamap = ac->ac_dmamap;
1852a1684,1688
> if (ac->ac_flags & AMR_CMD_CCB)
> cb = amr_setup_ccb;
> else
> cb = amr_setup_data;
>
1855,1856d1690
< if (ac->ac_ccb_data == NULL)
< cb = amr_setup_data_dmamap;
1858,1859c1692,1693
< if (bus_dmamap_load(tag, datamap, ac->ac_data, ac->ac_length,
< cb, ac, 0) == EINPROGRESS) {
---
> if (bus_dmamap_load(ac->ac_tag, ac->ac_datamap, ac->ac_data,
> ac->ac_length, cb, ac, 0) == EINPROGRESS) {
1875d1708
< struct amr_softc *sc = ac->ac_sc;
1891,1897c1724,1725
< if (AC_IS_SG64(ac)) {
< bus_dmamap_sync(sc->amr_buffer64_dmat, ac->ac_dma64map, flag);
< bus_dmamap_unload(sc->amr_buffer64_dmat, ac->ac_dma64map);
< } else {
< bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_dmamap, flag);
< bus_dmamap_unload(sc->amr_buffer_dmat, ac->ac_dmamap);
< }
---
> bus_dmamap_sync(ac->ac_tag, ac->ac_datamap, flag);
> bus_dmamap_unload(ac->ac_tag, ac->ac_datamap);
1900,1915d1727
< if (ac->ac_ccb_data != NULL) {
<
< flag = 0;
< if (ac->ac_flags & AMR_CMD_CCB_DATAIN)
< flag |= BUS_DMASYNC_POSTREAD;
< if (ac->ac_flags & AMR_CMD_CCB_DATAOUT)
< flag |= BUS_DMASYNC_POSTWRITE;
<
< if (AC_IS_SG64(ac)) {
< bus_dmamap_sync(sc->amr_buffer64_dmat,ac->ac_ccb_dma64map,flag);
< bus_dmamap_unload(sc->amr_buffer64_dmat, ac->ac_ccb_dma64map);
< } else {
< bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_ccb_dmamap, flag);
< bus_dmamap_unload(sc->amr_buffer_dmat, ac->ac_ccb_dmamap);
< }
< }
1920,1947d1731
< static void
< amr_setup_data_dmamap(void *arg, bus_dma_segment_t *segs, int nsegs, int err)
< {
< struct amr_command *ac = arg;
< struct amr_softc *sc = ac->ac_sc;
< int flags;
<
< flags = 0;
< if (ac->ac_flags & AMR_CMD_DATAIN)
< flags |= BUS_DMASYNC_PREREAD;
< if (ac->ac_flags & AMR_CMD_DATAOUT)
< flags |= BUS_DMASYNC_PREWRITE;
<
< if (AC_IS_SG64(ac)) {
< amr_setup_dma64map(arg, segs, nsegs, err);
< bus_dmamap_sync(sc->amr_buffer64_dmat,ac->ac_dma64map, flags);
< } else {
< amr_setup_dmamap(arg, segs, nsegs, err);
< bus_dmamap_sync(sc->amr_buffer_dmat,ac->ac_dmamap, flags);
< }
< ac->ac_flags |= AMR_CMD_MAPPED;
<
< if (sc->amr_submit_command(ac) == EBUSY) {
< amr_freeslot(ac);
< amr_requeue_ready(ac);
< }
< }
<
2127d1910
< ac->ac_ccb_data = NULL;
2128a1912,1913
> ac->ac_tag = NULL;
> ac->ac_datamap = NULL;
2180,2185c1965,1973
< if (bus_dmamap_create(sc->amr_buffer_dmat, 0, &ac->ac_dmamap) ||
< bus_dmamap_create(sc->amr_buffer_dmat, 0, &ac->ac_ccb_dmamap) ||
< (AMR_IS_SG64(sc) &&
< (bus_dmamap_create(sc->amr_buffer64_dmat, 0,&ac->ac_dma64map) ||
< bus_dmamap_create(sc->amr_buffer64_dmat, 0, &ac->ac_ccb_dma64map))))
< break;
---
> ac->ac_ccb = sc->amr_ccb + ac->ac_slot;
> ac->ac_ccb_busaddr = sc->amr_ccb_busaddr +
> (ac->ac_slot * sizeof(union amr_ccb));
>
> if (bus_dmamap_create(sc->amr_buffer_dmat, 0, &ac->ac_dmamap))
> break;
> if (AMR_IS_SG64(sc) &&
> (bus_dmamap_create(sc->amr_buffer64_dmat, 0,&ac->ac_dma64map)))
> break;
2205d1992
< bus_dmamap_destroy(sc->amr_buffer_dmat, acc->acc_command[i].ac_ccb_dmamap);
2208d1994
< bus_dmamap_destroy(sc->amr_buffer64_dmat, acc->acc_command[i].ac_ccb_dma64map);