Deleted Added
full compact
ata-dma.c (107562) ata-dma.c (108931)
1/*-
2 * Copyright (c) 1998,1999,2000,2001,2002 S�ren Schmidt <sos@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
1/*-
2 * Copyright (c) 1998,1999,2000,2001,2002 S�ren Schmidt <sos@FreeBSD.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 11 unchanged lines hidden (view full) ---

20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * $FreeBSD: head/sys/dev/ata/ata-dma.c 107562 2002-12-03 20:20:44Z sos $
28 * $FreeBSD: head/sys/dev/ata/ata-dma.c 108931 2003-01-08 10:03:31Z sos $
29 */
30
31#include <sys/param.h>
32#include <sys/systm.h>
33#include <sys/ata.h>
34#include <sys/endian.h>
35#include <sys/malloc.h>
36#include <sys/bus.h>

--- 1468 unchanged lines hidden (view full) ---

1505{
1506 struct ata_channel *ch = atadev->channel;
1507 struct ata_dmastate *ds = &atadev->dmastate;
1508 struct ata_dmasetup_data_cb_args cba;
1509
1510 if (ds->flags & ATA_DS_ACTIVE)
1511 panic("ata_dmasetup: transfer active on this device!");
1512
29 */
30
31#include <sys/param.h>
32#include <sys/systm.h>
33#include <sys/ata.h>
34#include <sys/endian.h>
35#include <sys/malloc.h>
36#include <sys/bus.h>

--- 1468 unchanged lines hidden (view full) ---

1505{
1506 struct ata_channel *ch = atadev->channel;
1507 struct ata_dmastate *ds = &atadev->dmastate;
1508 struct ata_dmasetup_data_cb_args cba;
1509
1510 if (ds->flags & ATA_DS_ACTIVE)
1511 panic("ata_dmasetup: transfer active on this device!");
1512
1513 switch(ch->chiptype) {
1514 case 0x0d38105a: /* Promise Fasttrak 66 */
1515 case 0x4d38105a: /* Promise Ultra/Fasttrak 66 */
1516 case 0x0d30105a: /* Promise OEM ATA 100 */
1517 case 0x4d30105a: /* Promise Ultra/Fasttrak 100 */
1518 ATA_OUTB(ch->r_bmio, 0x11,
1519 ATA_INB(ch->r_bmio, 0x11) | (atadev->unit ? 0x08 : 0x02));
1520
1521 ATA_OUTL(ch->r_bmio, (atadev->unit ? 0x24 : 0x20),
1522 (dir ? 0x05000000 : 0x06000000) | (count >> 1));
1523 break;
1524 }
1525
1513 cba.dmatab = ds->dmatab;
1514 bus_dmamap_sync(ds->cdmatag, ds->cdmamap, BUS_DMASYNC_PREWRITE);
1515 if (bus_dmamap_load(ds->ddmatag, ds->ddmamap, data, count,
1516 ata_dmasetupd_cb, &cba, 0) || cba.error)
1517 return -1;
1518
1519 bus_dmamap_sync(ds->cdmatag, ds->cdmamap, BUS_DMASYNC_POSTWRITE);
1520 bus_dmamap_sync(ds->ddmatag, ds->ddmamap, dir ? BUS_DMASYNC_PREREAD :
1521 BUS_DMASYNC_PREWRITE);
1522
1523 ch->flags |= ATA_DMA_ACTIVE;
1526 cba.dmatab = ds->dmatab;
1527 bus_dmamap_sync(ds->cdmatag, ds->cdmamap, BUS_DMASYNC_PREWRITE);
1528 if (bus_dmamap_load(ds->ddmatag, ds->ddmamap, data, count,
1529 ata_dmasetupd_cb, &cba, 0) || cba.error)
1530 return -1;
1531
1532 bus_dmamap_sync(ds->cdmatag, ds->cdmamap, BUS_DMASYNC_POSTWRITE);
1533 bus_dmamap_sync(ds->ddmatag, ds->ddmamap, dir ? BUS_DMASYNC_PREREAD :
1534 BUS_DMASYNC_PREWRITE);
1535
1536 ch->flags |= ATA_DMA_ACTIVE;
1524 ds->flags = ATA_DS_ACTIVE;
1525 if (dir)
1526 ds->flags |= ATA_DS_READ;
1537 ds->flags = dir ? (ATA_DS_ACTIVE | ATA_DS_READ) : ATA_DS_ACTIVE;
1527
1528 ATA_OUTL(ch->r_bmio, ATA_BMDTP_PORT, ds->mdmatab);
1529 ATA_OUTB(ch->r_bmio, ATA_BMCMD_PORT, dir ? ATA_BMCMD_WRITE_READ : 0);
1530 ATA_OUTB(ch->r_bmio, ATA_BMSTAT_PORT,
1538
1539 ATA_OUTL(ch->r_bmio, ATA_BMDTP_PORT, ds->mdmatab);
1540 ATA_OUTB(ch->r_bmio, ATA_BMCMD_PORT, dir ? ATA_BMCMD_WRITE_READ : 0);
1541 ATA_OUTB(ch->r_bmio, ATA_BMSTAT_PORT,
1531 (ATA_INB(ch->r_bmio, ATA_BMSTAT_PORT) |
1532 (ATA_BMSTAT_INTERRUPT | ATA_BMSTAT_ERROR)));
1542 (ATA_INB(ch->r_bmio, ATA_BMSTAT_PORT) |
1543 (ATA_BMSTAT_INTERRUPT | ATA_BMSTAT_ERROR)));
1533 ATA_OUTB(ch->r_bmio, ATA_BMCMD_PORT,
1544 ATA_OUTB(ch->r_bmio, ATA_BMCMD_PORT,
1534 ATA_INB(ch->r_bmio, ATA_BMCMD_PORT) | ATA_BMCMD_START_STOP);
1545 ATA_INB(ch->r_bmio, ATA_BMCMD_PORT) | ATA_BMCMD_START_STOP);
1535 return 0;
1536}
1537
1538int
1539ata_dmadone(struct ata_device *atadev)
1540{
1546 return 0;
1547}
1548
1549int
1550ata_dmadone(struct ata_device *atadev)
1551{
1541 struct ata_channel *ch;
1542 struct ata_dmastate *ds;
1552 struct ata_channel *ch = atadev->channel;
1553 struct ata_dmastate *ds = &atadev->dmastate;
1543 int error;
1544
1554 int error;
1555
1545 ch = atadev->channel;
1546 ds = &atadev->dmastate;
1556 switch(ch->chiptype) {
1557 case 0x0d38105a: /* Promise Fasttrak 66 */
1558 case 0x4d38105a: /* Promise Ultra/Fasttrak 66 */
1559 case 0x0d30105a: /* Promise OEM ATA 100 */
1560 case 0x4d30105a: /* Promise Ultra/Fasttrak 100 */
1561 ATA_OUTL(ch->r_bmio, (atadev->unit ? 0x24 : 0x20), 0);
1562 ATA_OUTB(ch->r_bmio, 0x11,
1563 ATA_INB(ch->r_bmio, 0x11) & ~(atadev->unit ? 0x08 : 0x02));
1564 break;
1565 }
1566
1547 bus_dmamap_sync(ds->ddmatag, ds->ddmamap, (ds->flags & ATA_DS_READ) != 0 ?
1548 BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE);
1549 bus_dmamap_unload(ds->ddmatag, ds->ddmamap);
1567 bus_dmamap_sync(ds->ddmatag, ds->ddmamap, (ds->flags & ATA_DS_READ) != 0 ?
1568 BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE);
1569 bus_dmamap_unload(ds->ddmatag, ds->ddmamap);
1550
1570
1551 ATA_OUTB(ch->r_bmio, ATA_BMCMD_PORT,
1552 ATA_INB(ch->r_bmio, ATA_BMCMD_PORT) & ~ATA_BMCMD_START_STOP);
1553 error = ATA_INB(ch->r_bmio, ATA_BMSTAT_PORT);
1554 ATA_OUTB(ch->r_bmio, ATA_BMSTAT_PORT,
1555 error | ATA_BMSTAT_INTERRUPT | ATA_BMSTAT_ERROR);
1556 ch->flags &= ~ATA_DMA_ACTIVE;
1557 ds->flags = 0;
1558 return (error & ATA_BMSTAT_MASK);

--- 209 unchanged lines hidden ---
1571 ATA_OUTB(ch->r_bmio, ATA_BMCMD_PORT,
1572 ATA_INB(ch->r_bmio, ATA_BMCMD_PORT) & ~ATA_BMCMD_START_STOP);
1573 error = ATA_INB(ch->r_bmio, ATA_BMSTAT_PORT);
1574 ATA_OUTB(ch->r_bmio, ATA_BMSTAT_PORT,
1575 error | ATA_BMSTAT_INTERRUPT | ATA_BMSTAT_ERROR);
1576 ch->flags &= ~ATA_DMA_ACTIVE;
1577 ds->flags = 0;
1578 return (error & ATA_BMSTAT_MASK);

--- 209 unchanged lines hidden ---