Index: ata-pci.c =================================================================== RCS file: /cache/ncvs/src/sys/dev/ata/ata-pci.c,v retrieving revision 1.77 diff -u -r1.77 ata-pci.c --- ata-pci.c 17 Mar 2004 17:50:27 -0000 1.77 +++ ata-pci.c 12 Apr 2004 04:54:18 -0000 @@ -246,48 +246,55 @@ if (type == SYS_RES_IOPORT) { switch (*rid) { case ATA_IOADDR_RID: + /* + * ATA master devices are hard wired to the traditional ata + * I/O addresses. Some devices have these resources wired to + * their BARs, while others do not, hence the need to hardwire + */ if (ATA_MASTERDEV(dev)) { - myrid = 0; start = (unit ? ATA_SECONDARY : ATA_PRIMARY); end = start + ATA_IOSIZE - 1; count = ATA_IOSIZE; - res = BUS_ALLOC_RESOURCE(device_get_parent(dev), child, - SYS_RES_IOPORT, &myrid, - start, end, count, flags); - } - else { - myrid = 0x10 + 8 * unit; - res = BUS_ALLOC_RESOURCE(device_get_parent(dev), dev, - SYS_RES_IOPORT, &myrid, - start, end, count, flags); } + myrid = 0x10 + 8 * unit; + res = BUS_ALLOC_RESOURCE(device_get_parent(dev), dev, + SYS_RES_IOPORT, &myrid, + start, end, count, flags); break; case ATA_ALTADDR_RID: if (ATA_MASTERDEV(dev)) { - myrid = 0; +#if 0 start = (unit ? ATA_SECONDARY : ATA_PRIMARY) + ATA_ALTOFFSET; end = start + ATA_ALTIOSIZE - 1; count = ATA_ALTIOSIZE; - res = BUS_ALLOC_RESOURCE(device_get_parent(dev), child, - SYS_RES_IOPORT, &myrid, - start, end, count, flags); +#else + start = (unit ? ATA_SECONDARY : ATA_PRIMARY) + ATA_ALTOFFSET - 2; + count = 4; + end = start + count - 1; +#endif } - else { - myrid = 0x14 + 8 * unit; +printf("ata altaddr start %#lx end %#lx count %#lx\n", start, end, count); + myrid = 0x14 + 8 * unit; + res = BUS_ALLOC_RESOURCE(device_get_parent(dev), dev, + SYS_RES_IOPORT, &myrid, + start, end, count, flags); + + /* + * I don't understand why we need to do this dance. If we get + * the resource, then we release it and allocated something + * else. This makes little sense to me, and might, in fact + * be a bug. + */ + if (res && !ATA_MASTERDEV(dev)) { + start = rman_get_start(res) + 2; + end = start + ATA_ALTIOSIZE - 1; + count = ATA_ALTIOSIZE; + BUS_RELEASE_RESOURCE(device_get_parent(dev), dev, + SYS_RES_IOPORT, myrid, res); res = BUS_ALLOC_RESOURCE(device_get_parent(dev), dev, SYS_RES_IOPORT, &myrid, start, end, count, flags); - if (res) { - start = rman_get_start(res) + 2; - end = start + ATA_ALTIOSIZE - 1; - count = ATA_ALTIOSIZE; - BUS_RELEASE_RESOURCE(device_get_parent(dev), dev, - SYS_RES_IOPORT, myrid, res); - res = BUS_ALLOC_RESOURCE(device_get_parent(dev), dev, - SYS_RES_IOPORT, &myrid, - start, end, count, flags); - } } break; } @@ -295,14 +302,14 @@ } if (type == SYS_RES_IRQ && *rid == ATA_IRQ_RID) { - if (ATA_MASTERDEV(dev)) { + if (ATA_MASTERDEV(dev)) { #ifdef __alpha__ return alpha_platform_alloc_ide_intr(unit); #else - int irq = (unit == 0 ? 14 : 15); + int irq = (unit == 0 ? 14 : 15); - return BUS_ALLOC_RESOURCE(device_get_parent(dev), child, - SYS_RES_IRQ, rid, irq, irq, 1, flags); + return BUS_ALLOC_RESOURCE(device_get_parent(dev), child, + SYS_RES_IRQ, rid, irq, irq, 1, flags); #endif } else { @@ -321,21 +328,13 @@ if (type == SYS_RES_IOPORT) { switch (rid) { case ATA_IOADDR_RID: - if (ATA_MASTERDEV(dev)) - return BUS_RELEASE_RESOURCE(device_get_parent(dev), child, - SYS_RES_IOPORT, 0x0, r); - else - return BUS_RELEASE_RESOURCE(device_get_parent(dev), dev, - SYS_RES_IOPORT, 0x10 + 8 * unit, r); + return BUS_RELEASE_RESOURCE(device_get_parent(dev), dev, + SYS_RES_IOPORT, 0x10 + 8 * unit, r); break; case ATA_ALTADDR_RID: - if (ATA_MASTERDEV(dev)) - return BUS_RELEASE_RESOURCE(device_get_parent(dev), child, - SYS_RES_IOPORT, 0x0, r); - else - return BUS_RELEASE_RESOURCE(device_get_parent(dev), dev, - SYS_RES_IOPORT, 0x14 + 8 * unit, r); + return BUS_RELEASE_RESOURCE(device_get_parent(dev), dev, + SYS_RES_IOPORT, 0x14 + 8 * unit, r); break; default: return ENOENT; @@ -352,8 +351,7 @@ return BUS_RELEASE_RESOURCE(device_get_parent(dev), child, SYS_RES_IRQ, rid, r); #endif - } - else + } else return 0; } return EINVAL; @@ -431,7 +429,7 @@ ch->r_io[i].offset = i; } ch->r_io[ATA_ALTSTAT].res = altio; - ch->r_io[ATA_ALTSTAT].offset = 0; + ch->r_io[ATA_ALTSTAT].offset = 2; ch->r_io[ATA_IDX_ADDR].res = io; if (ctlr->r_res1) {