Deleted Added
sdiff udiff text old ( 107562 ) new ( 108931 )
full compact
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 $
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 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;
1524 ds->flags = ATA_DS_ACTIVE;
1525 if (dir)
1526 ds->flags |= ATA_DS_READ;
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,
1531 (ATA_INB(ch->r_bmio, ATA_BMSTAT_PORT) |
1532 (ATA_BMSTAT_INTERRUPT | ATA_BMSTAT_ERROR)));
1533 ATA_OUTB(ch->r_bmio, ATA_BMCMD_PORT,
1534 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{
1541 struct ata_channel *ch;
1542 struct ata_dmastate *ds;
1543 int error;
1544
1545 ch = atadev->channel;
1546 ds = &atadev->dmastate;
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);
1550
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 ---