ata-dma.c (54594) | ata-dma.c (54969) |
---|---|
1/*- 2 * Copyright (c) 1998,1999 S�ren Schmidt 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 S�ren Schmidt 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 54594 1999-12-14 10:25:28Z sos $ | 28 * $FreeBSD: head/sys/dev/ata/ata-dma.c 54969 1999-12-21 20:18:56Z sos $ |
29 */ 30 31#include "pci.h" 32#include "apm.h" 33#include <sys/param.h> 34#include <sys/systm.h> 35#include <sys/buf.h> 36#include <sys/malloc.h> --- 22 unchanged lines hidden (view full) --- 59#endif 60 61#if NPCI > 0 62 63int32_t 64ata_dmainit(struct ata_softc *scp, int32_t device, 65 int32_t apiomode, int32_t wdmamode, int32_t udmamode) 66{ | 29 */ 30 31#include "pci.h" 32#include "apm.h" 33#include <sys/param.h> 34#include <sys/systm.h> 35#include <sys/buf.h> 36#include <sys/malloc.h> --- 22 unchanged lines hidden (view full) --- 59#endif 60 61#if NPCI > 0 62 63int32_t 64ata_dmainit(struct ata_softc *scp, int32_t device, 65 int32_t apiomode, int32_t wdmamode, int32_t udmamode) 66{ |
67 int32_t type, devno, error; | 67 int32_t type, error; 68 int32_t devno = (scp->unit << 1) + ((device == ATA_MASTER) ? 0 : 1); |
68 void *dmatab; 69 70 if (!scp->bmaddr) 71 return -1; | 69 void *dmatab; 70 71 if (!scp->bmaddr) 72 return -1; |
72#ifdef ATA_DMADEBUG 73 printf("ata%d: dmainit: ioaddr=0x%x altioaddr=0x%x, bmaddr=0x%x\n", 74 scp->lun, scp->ioaddr, scp->altioaddr, scp->bmaddr); 75#endif | |
76 77 /* if simplex controller, only allow DMA on primary channel */ 78 if (scp->unit == 1) { 79 outb(scp->bmaddr + ATA_BMSTAT_PORT, inb(scp->bmaddr + ATA_BMSTAT_PORT) & 80 (ATA_BMSTAT_DMA_MASTER | ATA_BMSTAT_DMA_SLAVE)); 81 if (inb(scp->bmaddr + ATA_BMSTAT_PORT) & ATA_BMSTAT_DMA_SIMPLEX) { 82 printf("ata%d: simplex device, DMA on primary channel only\n", 83 scp->lun); 84 return -1; 85 } 86 } 87 88 if (!(dmatab = malloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT))) 89 return -1; 90 91 if (((uintptr_t)dmatab >> PAGE_SHIFT) ^ 92 (((uintptr_t)dmatab + PAGE_SIZE - 1) >> PAGE_SHIFT)) { | 73 74 /* if simplex controller, only allow DMA on primary channel */ 75 if (scp->unit == 1) { 76 outb(scp->bmaddr + ATA_BMSTAT_PORT, inb(scp->bmaddr + ATA_BMSTAT_PORT) & 77 (ATA_BMSTAT_DMA_MASTER | ATA_BMSTAT_DMA_SLAVE)); 78 if (inb(scp->bmaddr + ATA_BMSTAT_PORT) & ATA_BMSTAT_DMA_SIMPLEX) { 79 printf("ata%d: simplex device, DMA on primary channel only\n", 80 scp->lun); 81 return -1; 82 } 83 } 84 85 if (!(dmatab = malloc(PAGE_SIZE, M_DEVBUF, M_NOWAIT))) 86 return -1; 87 88 if (((uintptr_t)dmatab >> PAGE_SHIFT) ^ 89 (((uintptr_t)dmatab + PAGE_SIZE - 1) >> PAGE_SHIFT)) { |
93 printf("ata_dmainit: dmatab crosses page boundary, no DMA\n"); | 90 printf("ata%d-%s: dmatab crosses page boundary, no DMA\n", 91 scp->lun, (device == ATA_MASTER) ? "master" : "slave"); |
94 free(dmatab, M_DEVBUF); 95 return -1; 96 } 97 scp->dmatab[(device == ATA_MASTER) ? 0 : 1] = dmatab; 98 99 switch (type = pci_get_devid(scp->dev)) { 100 101 case 0x71118086: /* Intel PIIX4 */ | 92 free(dmatab, M_DEVBUF); 93 return -1; 94 } 95 scp->dmatab[(device == ATA_MASTER) ? 0 : 1] = dmatab; 96 97 switch (type = pci_get_devid(scp->dev)) { 98 99 case 0x71118086: /* Intel PIIX4 */ |
100 case 0x71998086: /* Intel PIIX4 */ |
|
102 if (udmamode >= 2) { 103 int32_t mask48, new48; 104 105 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 106 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 107 if (bootverbose) | 101 if (udmamode >= 2) { 102 int32_t mask48, new48; 103 104 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 105 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 106 if (bootverbose) |
108 printf("ata%d: %s: %s setting up UDMA2 mode on PIIX4 chip\n", | 107 printf("ata%d-%s: %s setting up UDMA2 mode on PIIX4 chip\n", |
109 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 110 (error) ? "failed" : "success"); 111 if (!error) { | 108 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 109 (error) ? "failed" : "success"); 110 if (!error) { |
112 devno = (scp->unit << 1) + ((device == ATA_MASTER) ? 0 : 1); | |
113 mask48 = (1 << devno) + (3 << (16 + (devno << 2))); 114 new48 = (1 << devno) + (2 << (16 + (devno << 2))); 115 pci_write_config(scp->dev, 0x48, 116 (pci_read_config(scp->dev, 0x48, 4) & 117 ~mask48) | new48, 4); 118 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2; 119 return 0; 120 } --- 18 unchanged lines hidden (view full) --- 139 } 140 new40 |= 0x40004000; 141 pci_write_config(scp->dev, 0x40, new40, 4); 142 pci_write_config(scp->dev, 0x44, new44, 4); 143 } 144 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 145 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 146 if (bootverbose) | 111 mask48 = (1 << devno) + (3 << (16 + (devno << 2))); 112 new48 = (1 << devno) + (2 << (16 + (devno << 2))); 113 pci_write_config(scp->dev, 0x48, 114 (pci_read_config(scp->dev, 0x48, 4) & 115 ~mask48) | new48, 4); 116 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2; 117 return 0; 118 } --- 18 unchanged lines hidden (view full) --- 137 } 138 new40 |= 0x40004000; 139 pci_write_config(scp->dev, 0x40, new40, 4); 140 pci_write_config(scp->dev, 0x44, new44, 4); 141 } 142 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 143 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 144 if (bootverbose) |
147 printf("ata%d: %s: %s setting up WDMA2 mode on PIIX4 chip\n", | 145 printf("ata%d-%s: %s setting up WDMA2 mode on PIIX%s chip\n", |
148 scp->lun, (device == ATA_MASTER) ? "master" : "slave", | 146 scp->lun, (device == ATA_MASTER) ? "master" : "slave", |
149 (error) ? "failed" : "success"); | 147 (error) ? "failed" : "success", 148 (type == 0x70108086) ? "3" : "4"); |
150 if (!error) { 151 if (device == ATA_MASTER) { 152 mask40 = 0x0000330f; 153 new40 = 0x00002307; 154 mask44 = 0; 155 new44 = 0; 156 } 157 else { --- 31 unchanged lines hidden (view full) --- 189 /* Check for timing config usable for DMA on controller */ 190 if (!((word40 & 0x3300) == 0x2300 && 191 ((word40 >> (device == ATA_MASTER ? 0 : 4)) & 1) == 1)) 192 break; 193 194 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 195 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 196 if (bootverbose) | 149 if (!error) { 150 if (device == ATA_MASTER) { 151 mask40 = 0x0000330f; 152 new40 = 0x00002307; 153 mask44 = 0; 154 new44 = 0; 155 } 156 else { --- 31 unchanged lines hidden (view full) --- 188 /* Check for timing config usable for DMA on controller */ 189 if (!((word40 & 0x3300) == 0x2300 && 190 ((word40 >> (device == ATA_MASTER ? 0 : 4)) & 1) == 1)) 191 break; 192 193 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 194 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 195 if (bootverbose) |
197 printf("ata%d: %s: %s setting up WDMA2 mode on PIIX chip\n", | 196 printf("ata%d-%s: %s setting up WDMA2 mode on PIIX chip\n", |
198 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 199 (error) ? "failed" : "success"); 200 if (!error) { 201 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2; 202 return 0; 203 } 204 } 205 break; --- 6 unchanged lines hidden (view full) --- 212 break; 213 } 214 if (udmamode >= 2) { 215 int32_t word54 = pci_read_config(scp->dev, 0x54, 4); 216 217 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 218 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 219 if (bootverbose) | 197 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 198 (error) ? "failed" : "success"); 199 if (!error) { 200 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2; 201 return 0; 202 } 203 } 204 break; --- 6 unchanged lines hidden (view full) --- 211 break; 212 } 213 if (udmamode >= 2) { 214 int32_t word54 = pci_read_config(scp->dev, 0x54, 4); 215 216 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 217 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 218 if (bootverbose) |
220 printf("ata%d: %s: %s setting up UDMA2 mode on Aladdin chip\n", | 219 printf("ata%d-%s: %s setting up UDMA2 mode on Aladdin chip\n", |
221 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 222 (error) ? "failed" : "success"); 223 if (!error) { 224 word54 |= 0x5555; 225 word54 |= (0x0a << (16 + (scp->unit << 3) + (device << 2))); 226 pci_write_config(scp->dev, 0x54, word54, 4); 227 pci_write_config(scp->dev, 0x53, 228 pci_read_config(scp->dev, 0x53, 1) | 0x03, 1); 229 scp->flags |= ATA_ATAPI_DMA_RO; 230 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2; 231 return 0; 232 } 233 } 234 if (wdmamode >= 2 && apiomode >= 4) { 235 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 236 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 237 if (bootverbose) | 220 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 221 (error) ? "failed" : "success"); 222 if (!error) { 223 word54 |= 0x5555; 224 word54 |= (0x0a << (16 + (scp->unit << 3) + (device << 2))); 225 pci_write_config(scp->dev, 0x54, word54, 4); 226 pci_write_config(scp->dev, 0x53, 227 pci_read_config(scp->dev, 0x53, 1) | 0x03, 1); 228 scp->flags |= ATA_ATAPI_DMA_RO; 229 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2; 230 return 0; 231 } 232 } 233 if (wdmamode >= 2 && apiomode >= 4) { 234 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 235 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 236 if (bootverbose) |
238 printf("ata%d: %s: %s setting up WDMA2 mode on Aladdin chip\n", | 237 printf("ata%d-%s: %s setting up WDMA2 mode on Aladdin chip\n", |
239 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 240 (error) ? "failed" : "success"); 241 if (!error) { 242 pci_write_config(scp->dev, 0x53, 243 pci_read_config(scp->dev, 0x53, 1) | 0x03, 1); 244 scp->flags |= ATA_ATAPI_DMA_RO; 245 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2; 246 return 0; 247 } 248 } 249 /* we could set PIO mode timings, but we assume the BIOS did that */ 250 break; 251 252 case 0x05711106: /* VIA Apollo 82C571 / 82C586 / 82C686 */ | 238 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 239 (error) ? "failed" : "success"); 240 if (!error) { 241 pci_write_config(scp->dev, 0x53, 242 pci_read_config(scp->dev, 0x53, 1) | 0x03, 1); 243 scp->flags |= ATA_ATAPI_DMA_RO; 244 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2; 245 return 0; 246 } 247 } 248 /* we could set PIO mode timings, but we assume the BIOS did that */ 249 break; 250 251 case 0x05711106: /* VIA Apollo 82C571 / 82C586 / 82C686 */ |
253 devno = (scp->unit << 1) + ((device == ATA_MASTER) ? 0 : 1); 254 255 /* UDMA4 mode only on VT82C686 hardware */ 256 if (udmamode >= 4 && ata_find_dev(scp->dev, 0x06861106)) { 257 int8_t byte = pci_read_config(scp->dev, 0x53 - devno, 1); 258 259 /* enable UDMA transfer modes setting by SETFEATURES cmd */ 260 pci_write_config(scp->dev, 0x53 - devno, (byte & 0x1c) | 0x40, 1); | 252 case 0x74091022: /* AMD 756 */ 253 /* UDMA4 mode only on 82C686 / AMD 756 hardware */ 254 if ((udmamode >= 4 && ata_find_dev(scp->dev, 0x06861106)) || 255 (udmamode >= 4 && type == 0x74091022)) { |
261 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 262 ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY); 263 if (bootverbose) | 256 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 257 ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY); 258 if (bootverbose) |
264 printf("ata%d: %s: %s setting up UDMA4 mode on VIA chip\n", | 259 printf("ata%d-%s: %s setting up UDMA4 mode on %s chip\n", |
265 scp->lun, (device == ATA_MASTER) ? "master":"slave", | 260 scp->lun, (device == ATA_MASTER) ? "master":"slave", |
266 (error) ? "failed" : "success"); | 261 (error) ? "failed" : "success", 262 (type == 0x74091022) ? "AMD" : "VIA"); |
267 if (!error) { | 263 if (!error) { |
264 pci_write_config(scp->dev, 0x53 - devno, 0xc3, 1); |
|
268 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA4; 269 return 0; 270 } | 265 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA4; 266 return 0; 267 } |
271 pci_write_config(scp->dev, 0x53 - devno, byte, 1); | |
272 } 273 | 268 } 269 |
274 /* UDMA2 mode only on rev 1 and better 82C586 & 82C586 chips */ 275 if (udmamode >= 2 && pci_read_config(scp->dev, 0x08, 1) >= 0x01 && 276 (ata_find_dev(scp->dev, 0x05861106) || 277 ata_find_dev(scp->dev, 0x06861106))) { 278 int8_t byte = pci_read_config(scp->dev, 0x53 - devno, 1); 279 280 /* enable UDMA transfer modes setting by SETFEATURES cmd */ 281 pci_write_config(scp->dev, 0x53 - devno, (byte & 0x1c) | 0x40, 1); | 270 /* UDMA2 mode only on 82C686 and AMD 756 and rev 1 and better 82C586 */ 271 if ((udmamode >= 2 && ata_find_dev(scp->dev, 0x06861106)) || 272 (udmamode >= 2 && type == 0x74091022) || 273 (udmamode >= 2 && ata_find_dev(scp->dev, 0x05861106) && 274 pci_read_config(scp->dev, 0x08, 1) >= 0x01)) { |
282 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 283 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 284 if (bootverbose) | 275 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 276 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 277 if (bootverbose) |
285 printf("ata%d: %s: %s setting up UDMA2 mode on VIA chip\n", | 278 printf("ata%d-%s: %s setting up UDMA2 mode on %s chip\n", |
286 scp->lun, (device == ATA_MASTER) ? "master" : "slave", | 279 scp->lun, (device == ATA_MASTER) ? "master" : "slave", |
287 (error) ? "failed" : "success"); | 280 (error) ? "failed" : "success", 281 (type == 0x74091022) ? "AMD" : "VIA"); |
288 if (!error) { | 282 if (!error) { |
289 if ((device == ATA_MASTER && scp->devices & ATA_ATA_MASTER) || 290 (device == ATA_SLAVE && scp->devices & ATA_ATA_SLAVE)) { 291 struct ata_params *ap = ((struct ad_softc *) 292 (scp->dev_softc[(device==ATA_MASTER)?0:1]))->ata_parm; 293 294 if (ata_find_dev(scp->dev, 0x06861106) && 295 (ap->udmamodes & 0x10) && !ap->cblid) { 296 pci_write_config(scp->dev, 0x53 - devno, 297 (byte & 0x1c) | 0x42, 1); 298 } 299 } | 283 pci_write_config(scp->dev, 0x53 - devno, 0xc0, 1); |
300 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2; 301 return 0; 302 } | 284 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2; 285 return 0; 286 } |
303 pci_write_config(scp->dev, 0x53 - devno, byte, 1); | |
304 } 305 if (wdmamode >= 2 && apiomode >= 4) { 306 /* set WDMA2 mode timing */ | 287 } 288 if (wdmamode >= 2 && apiomode >= 4) { 289 /* set WDMA2 mode timing */ |
307 pci_write_config(scp->dev, 0x4b - devno, 0x31 , 1); | |
308 309 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 310 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 311 if (bootverbose) | 290 291 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 292 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 293 if (bootverbose) |
312 printf("ata%d: %s: %s setting up WDMA2 mode on VIA chip\n", | 294 printf("ata%d-%s: %s setting up WDMA2 mode on %s chip\n", |
313 scp->lun, (device == ATA_MASTER) ? "master" : "slave", | 295 scp->lun, (device == ATA_MASTER) ? "master" : "slave", |
314 (error) ? "failed" : "success"); | 296 (error) ? "failed" : "success", 297 (type == 0x74091022) ? "AMD" : "VIA"); |
315 if (!error) { | 298 if (!error) { |
299 pci_write_config(scp->dev, 0x53 - devno, 0x82, 1); 300 pci_write_config(scp->dev, 0x4b - devno, 0x31, 1); |
|
316 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2; 317 return 0; 318 } 319 } 320 /* we could set PIO mode timings, but we assume the BIOS did that */ 321 break; 322 323 case 0x55131039: /* SiS 5591 */ | 301 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2; 302 return 0; 303 } 304 } 305 /* we could set PIO mode timings, but we assume the BIOS did that */ 306 break; 307 308 case 0x55131039: /* SiS 5591 */ |
324 devno = (scp->unit << 1) + ((device == ATA_MASTER) ? 0 : 1); | |
325 if (udmamode >= 2) { 326 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 327 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 328 if (bootverbose) | 309 if (udmamode >= 2) { 310 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 311 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 312 if (bootverbose) |
329 printf("ata%d: %s: %s setting up UDMA2 mode on SiS chip\n", | 313 printf("ata%d-%s: %s setting up UDMA2 mode on SiS chip\n", |
330 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 331 (error) ? "failed" : "success"); 332 if (!error) { 333 pci_write_config(scp->dev, 0x40 + (devno << 1), 0xa301, 2); 334 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2; 335 return 0; 336 } 337 } 338 if (wdmamode >=2 && apiomode >= 4) { 339 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 340 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 341 if (bootverbose) | 314 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 315 (error) ? "failed" : "success"); 316 if (!error) { 317 pci_write_config(scp->dev, 0x40 + (devno << 1), 0xa301, 2); 318 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2; 319 return 0; 320 } 321 } 322 if (wdmamode >=2 && apiomode >= 4) { 323 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 324 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 325 if (bootverbose) |
342 printf("ata%d: %s: %s setting up WDMA2 mode on SiS chip\n", | 326 printf("ata%d-%s: %s setting up WDMA2 mode on SiS chip\n", |
343 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 344 (error) ? "failed" : "success"); 345 if (!error) { 346 pci_write_config(scp->dev, 0x40 + (devno << 1), 0x0301, 2); 347 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2; 348 return 0; 349 } 350 } 351 /* we could set PIO mode timings, but we assume the BIOS did that */ 352 break; 353 354 case 0x4d33105a: /* Promise Ultra33 / FastTrak33 controllers */ 355 case 0x4d38105a: /* Promise Ultra66 / FastTrak66 controllers */ 356 /* the Promise can only do DMA on ATA disks not on ATAPI devices */ 357 if ((device == ATA_MASTER && scp->devices & ATA_ATAPI_MASTER) || 358 (device == ATA_SLAVE && scp->devices & ATA_ATAPI_SLAVE)) 359 break; 360 | 327 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 328 (error) ? "failed" : "success"); 329 if (!error) { 330 pci_write_config(scp->dev, 0x40 + (devno << 1), 0x0301, 2); 331 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2; 332 return 0; 333 } 334 } 335 /* we could set PIO mode timings, but we assume the BIOS did that */ 336 break; 337 338 case 0x4d33105a: /* Promise Ultra33 / FastTrak33 controllers */ 339 case 0x4d38105a: /* Promise Ultra66 / FastTrak66 controllers */ 340 /* the Promise can only do DMA on ATA disks not on ATAPI devices */ 341 if ((device == ATA_MASTER && scp->devices & ATA_ATAPI_MASTER) || 342 (device == ATA_SLAVE && scp->devices & ATA_ATAPI_SLAVE)) 343 break; 344 |
361 devno = (scp->unit << 1) + ((device == ATA_MASTER) ? 0 : 1); | |
362 if (udmamode >=4 && type == 0x4d38105a && 363 !(pci_read_config(scp->dev, 0x50, 2)&(scp->unit ? 1<<11 : 1<<10))) { 364 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 365 ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY); 366 if (bootverbose) | 345 if (udmamode >=4 && type == 0x4d38105a && 346 !(pci_read_config(scp->dev, 0x50, 2)&(scp->unit ? 1<<11 : 1<<10))) { 347 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 348 ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY); 349 if (bootverbose) |
367 printf("ata%d: %s: %s setting up UDMA4 mode on Promise chip\n", | 350 printf("ata%d-%s: %s setting up UDMA4 mode on Promise chip\n", |
368 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 369 (error) ? "failed" : "success"); 370 if (!error) { 371 outb(scp->bmaddr+0x11, inl(scp->bmaddr+0x11) | scp->unit ? 8:2); 372 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004127f3, 4); 373 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA4; 374 return 0; 375 } 376 } 377 if (udmamode >= 2) { 378 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 379 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 380 if (bootverbose) | 351 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 352 (error) ? "failed" : "success"); 353 if (!error) { 354 outb(scp->bmaddr+0x11, inl(scp->bmaddr+0x11) | scp->unit ? 8:2); 355 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004127f3, 4); 356 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA4; 357 return 0; 358 } 359 } 360 if (udmamode >= 2) { 361 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 362 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 363 if (bootverbose) |
381 printf("ata%d: %s: %s setting up UDMA2 mode on Promise chip\n", | 364 printf("ata%d-%s: %s setting up UDMA2 mode on Promise chip\n", |
382 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 383 (error) ? "failed" : "success"); 384 if (!error) { 385 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004127f3, 4); 386 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2; 387 return 0; 388 } 389 } 390 if (wdmamode >= 2 && apiomode >= 4) { 391 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 392 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 393 if (bootverbose) | 365 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 366 (error) ? "failed" : "success"); 367 if (!error) { 368 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004127f3, 4); 369 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2; 370 return 0; 371 } 372 } 373 if (wdmamode >= 2 && apiomode >= 4) { 374 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 375 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 376 if (bootverbose) |
394 printf("ata%d: %s: %s setting up WDMA2 mode on Promise chip\n", | 377 printf("ata%d-%s: %s setting up WDMA2 mode on Promise chip\n", |
395 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 396 (error) ? "failed" : "success"); 397 if (!error) { 398 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004367f3, 4); 399 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2; 400 return 0; 401 } 402 } 403 if (bootverbose) | 378 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 379 (error) ? "failed" : "success"); 380 if (!error) { 381 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004367f3, 4); 382 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2; 383 return 0; 384 } 385 } 386 if (bootverbose) |
404 printf("ata%d: %s: setting PIO mode on Promise chip\n", | 387 printf("ata%d-%s: setting PIO mode on Promise chip\n", |
405 scp->lun, (device == ATA_MASTER) ? "master" : "slave"); 406 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004fe924, 4); 407 break; 408 409 case 0x00041103: /* HighPoint HPT366 controller */ 410 /* no ATAPI devices for now */ 411 if ((device == ATA_MASTER && scp->devices & ATA_ATAPI_MASTER) || 412 (device == ATA_SLAVE && scp->devices & ATA_ATAPI_SLAVE)) 413 break; 414 | 388 scp->lun, (device == ATA_MASTER) ? "master" : "slave"); 389 pci_write_config(scp->dev, 0x60 + (devno << 2), 0x004fe924, 4); 390 break; 391 392 case 0x00041103: /* HighPoint HPT366 controller */ 393 /* no ATAPI devices for now */ 394 if ((device == ATA_MASTER && scp->devices & ATA_ATAPI_MASTER) || 395 (device == ATA_SLAVE && scp->devices & ATA_ATAPI_SLAVE)) 396 break; 397 |
415 devno = (device == ATA_MASTER) ? 0 : 1; | |
416 if (udmamode >=4 && !(pci_read_config(scp->dev, 0x5a, 1) & 0x2)) { 417 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 418 ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY); 419 if (bootverbose) | 398 if (udmamode >=4 && !(pci_read_config(scp->dev, 0x5a, 1) & 0x2)) { 399 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 400 ATA_UDMA4, ATA_C_F_SETXFER, ATA_WAIT_READY); 401 if (bootverbose) |
420 printf("ata%d: %s: %s setting up UDMA4 mode on HPT366 chip\n", | 402 printf("ata%d-%s: %s setting up UDMA4 mode on HPT366 chip\n", |
421 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 422 (error) ? "failed" : "success"); 423 if (!error) { 424 hpt366_timing(scp, device, ATA_MODE_UDMA4); 425 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA4; 426 return 0; 427 } 428 } 429 if (udmamode >=3 && !(pci_read_config(scp->dev, 0x5a, 1) & 0x2)) { 430 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 431 ATA_UDMA3, ATA_C_F_SETXFER, ATA_WAIT_READY); 432 if (bootverbose) | 403 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 404 (error) ? "failed" : "success"); 405 if (!error) { 406 hpt366_timing(scp, device, ATA_MODE_UDMA4); 407 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA4; 408 return 0; 409 } 410 } 411 if (udmamode >=3 && !(pci_read_config(scp->dev, 0x5a, 1) & 0x2)) { 412 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 413 ATA_UDMA3, ATA_C_F_SETXFER, ATA_WAIT_READY); 414 if (bootverbose) |
433 printf("ata%d: %s: %s setting up UDMA3 mode on HPT366 chip\n", | 415 printf("ata%d-%s: %s setting up UDMA3 mode on HPT366 chip\n", |
434 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 435 (error) ? "failed" : "success"); 436 if (!error) { 437 hpt366_timing(scp, device, ATA_MODE_UDMA3); 438 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA3; 439 return 0; 440 } 441 } 442 if (udmamode >= 2) { 443 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 444 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 445 if (bootverbose) | 416 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 417 (error) ? "failed" : "success"); 418 if (!error) { 419 hpt366_timing(scp, device, ATA_MODE_UDMA3); 420 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA3; 421 return 0; 422 } 423 } 424 if (udmamode >= 2) { 425 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 426 ATA_UDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 427 if (bootverbose) |
446 printf("ata%d: %s: %s setting up UDMA2 mode on HPT366 chip\n", | 428 printf("ata%d-%s: %s setting up UDMA2 mode on HPT366 chip\n", |
447 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 448 (error) ? "failed" : "success"); 449 if (!error) { 450 hpt366_timing(scp, device, ATA_MODE_UDMA2); 451 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2; 452 return 0; 453 } 454 } 455 if (wdmamode >= 2 && apiomode >= 4) { 456 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 457 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 458 if (bootverbose) | 429 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 430 (error) ? "failed" : "success"); 431 if (!error) { 432 hpt366_timing(scp, device, ATA_MODE_UDMA2); 433 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_UDMA2; 434 return 0; 435 } 436 } 437 if (wdmamode >= 2 && apiomode >= 4) { 438 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 439 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 440 if (bootverbose) |
459 printf("ata%d: %s: %s setting up WDMA2 mode on HPT366 chip\n", | 441 printf("ata%d-%s: %s setting up WDMA2 mode on HPT366 chip\n", |
460 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 461 (error) ? "failed" : "success"); 462 if (!error) { 463 hpt366_timing(scp, device, ATA_MODE_WDMA2); 464 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2; 465 return 0; 466 } 467 } 468 if (bootverbose) | 442 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 443 (error) ? "failed" : "success"); 444 if (!error) { 445 hpt366_timing(scp, device, ATA_MODE_WDMA2); 446 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2; 447 return 0; 448 } 449 } 450 if (bootverbose) |
469 printf("ata%d: %s: setting PIO mode on HPT366 chip\n", | 451 printf("ata%d-%s: setting PIO mode on HPT366 chip\n", |
470 scp->lun, (device == ATA_MASTER) ? "master" : "slave"); 471 hpt366_timing(scp, device, ATA_MODE_PIO); 472 break; 473 474 default: /* unknown controller chip */ 475 /* better not try generic DMA on ATAPI devices it almost never works */ 476 if ((device == ATA_MASTER && scp->devices & ATA_ATAPI_MASTER) || 477 (device == ATA_SLAVE && scp->devices & ATA_ATAPI_SLAVE)) --- 4 unchanged lines hidden (view full) --- 482#if MAYBE_NOT 483 && (inb(scp->bmaddr + ATA_BMSTAT_PORT) & 484 ((device == ATA_MASTER) ? 485 ATA_BMSTAT_DMA_MASTER : ATA_BMSTAT_DMA_SLAVE))) { 486#endif 487 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 488 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 489 if (bootverbose) | 452 scp->lun, (device == ATA_MASTER) ? "master" : "slave"); 453 hpt366_timing(scp, device, ATA_MODE_PIO); 454 break; 455 456 default: /* unknown controller chip */ 457 /* better not try generic DMA on ATAPI devices it almost never works */ 458 if ((device == ATA_MASTER && scp->devices & ATA_ATAPI_MASTER) || 459 (device == ATA_SLAVE && scp->devices & ATA_ATAPI_SLAVE)) --- 4 unchanged lines hidden (view full) --- 464#if MAYBE_NOT 465 && (inb(scp->bmaddr + ATA_BMSTAT_PORT) & 466 ((device == ATA_MASTER) ? 467 ATA_BMSTAT_DMA_MASTER : ATA_BMSTAT_DMA_SLAVE))) { 468#endif 469 error = ata_command(scp, device, ATA_C_SETFEATURES, 0, 0, 0, 470 ATA_WDMA2, ATA_C_F_SETXFER, ATA_WAIT_READY); 471 if (bootverbose) |
490 printf("ata%d: %s: %s setting up WDMA2 mode on generic chip\n", | 472 printf("ata%d-%s: %s setting up WDMA2 mode on generic chip\n", |
491 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 492 (error) ? "failed" : "success"); 493 if (!error) { 494 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2; 495 return 0; 496 } 497 } 498 } --- 4 unchanged lines hidden (view full) --- 503int32_t 504ata_dmasetup(struct ata_softc *scp, int32_t device, 505 int8_t *data, int32_t count, int32_t flags) 506{ 507 struct ata_dmaentry *dmatab; 508 u_int32_t dma_count, dma_base; 509 int32_t i = 0; 510 | 473 scp->lun, (device == ATA_MASTER) ? "master" : "slave", 474 (error) ? "failed" : "success"); 475 if (!error) { 476 scp->mode[(device == ATA_MASTER) ? 0 : 1] = ATA_MODE_WDMA2; 477 return 0; 478 } 479 } 480 } --- 4 unchanged lines hidden (view full) --- 485int32_t 486ata_dmasetup(struct ata_softc *scp, int32_t device, 487 int8_t *data, int32_t count, int32_t flags) 488{ 489 struct ata_dmaentry *dmatab; 490 u_int32_t dma_count, dma_base; 491 int32_t i = 0; 492 |
511#ifdef ATA_DMADEBUG 512 printf("ata%d: dmasetup\n", scp->lun); 513#endif | |
514 if (((uintptr_t)data & 1) || (count & 1)) 515 return -1; 516 517 if (!count) { | 493 if (((uintptr_t)data & 1) || (count & 1)) 494 return -1; 495 496 if (!count) { |
518#ifdef ATA_DMADEBUG 519 printf("ata%d: zero length DMA transfer attempt on %s\n", | 497 printf("ata%d-%s: zero length DMA transfer attempted\n", |
520 scp->lun, ((device == ATA_MASTER) ? "master" : "slave")); | 498 scp->lun, ((device == ATA_MASTER) ? "master" : "slave")); |
521#endif | |
522 return -1; 523 } 524 525 dmatab = scp->dmatab[(device == ATA_MASTER) ? 0 : 1]; 526 dma_base = vtophys(data); 527 dma_count = MIN(count, (PAGE_SIZE - ((uintptr_t)data & PAGE_MASK))); 528 data += dma_count; 529 count -= dma_count; 530 531 while (count) { 532 dmatab[i].base = dma_base; 533 dmatab[i].count = (dma_count & 0xffff); 534 i++; 535 if (i >= ATA_DMA_ENTRIES) { | 499 return -1; 500 } 501 502 dmatab = scp->dmatab[(device == ATA_MASTER) ? 0 : 1]; 503 dma_base = vtophys(data); 504 dma_count = MIN(count, (PAGE_SIZE - ((uintptr_t)data & PAGE_MASK))); 505 data += dma_count; 506 count -= dma_count; 507 508 while (count) { 509 dmatab[i].base = dma_base; 510 dmatab[i].count = (dma_count & 0xffff); 511 i++; 512 if (i >= ATA_DMA_ENTRIES) { |
536 printf("ata%d: too many segments in DMA table for %s\n", | 513 printf("ata%d-%s: too many segments in DMA table\n", |
537 scp->lun, (device ? "slave" : "master")); 538 return -1; 539 } 540 dma_base = vtophys(data); 541 dma_count = MIN(count, PAGE_SIZE); 542 data += MIN(count, PAGE_SIZE); 543 count -= MIN(count, PAGE_SIZE); 544 } | 514 scp->lun, (device ? "slave" : "master")); 515 return -1; 516 } 517 dma_base = vtophys(data); 518 dma_count = MIN(count, PAGE_SIZE); 519 data += MIN(count, PAGE_SIZE); 520 count -= MIN(count, PAGE_SIZE); 521 } |
545#ifdef ATA_DMADEBUG 546 printf("ata_dmasetup: base=%08x count%08x\n", dma_base, dma_count); 547#endif | |
548 dmatab[i].base = dma_base; 549 dmatab[i].count = (dma_count & 0xffff) | ATA_DMA_EOT; | 522 dmatab[i].base = dma_base; 523 dmatab[i].count = (dma_count & 0xffff) | ATA_DMA_EOT; |
550 | |
551 outl(scp->bmaddr + ATA_BMDTP_PORT, vtophys(dmatab)); | 524 outl(scp->bmaddr + ATA_BMDTP_PORT, vtophys(dmatab)); |
552#ifdef ATA_DMADEBUG 553 printf("dmatab=%08x %08x\n", 554 vtophys(dmatab), inl(scp->bmaddr+ATA_BMDTP_PORT)); 555#endif | |
556 outb(scp->bmaddr + ATA_BMCMD_PORT, flags ? ATA_BMCMD_WRITE_READ:0); 557 outb(scp->bmaddr + ATA_BMSTAT_PORT, (inb(scp->bmaddr + ATA_BMSTAT_PORT) | 558 (ATA_BMSTAT_INTERRUPT | ATA_BMSTAT_ERROR))); 559 return 0; 560} 561 562void 563ata_dmastart(struct ata_softc *scp) 564{ | 525 outb(scp->bmaddr + ATA_BMCMD_PORT, flags ? ATA_BMCMD_WRITE_READ:0); 526 outb(scp->bmaddr + ATA_BMSTAT_PORT, (inb(scp->bmaddr + ATA_BMSTAT_PORT) | 527 (ATA_BMSTAT_INTERRUPT | ATA_BMSTAT_ERROR))); 528 return 0; 529} 530 531void 532ata_dmastart(struct ata_softc *scp) 533{ |
565#ifdef ATA_DMADEBUG 566 printf("ata%d: dmastart\n", scp->lun); 567#endif | |
568 scp->flags |= ATA_DMA_ACTIVE; 569 outb(scp->bmaddr + ATA_BMCMD_PORT, 570 inb(scp->bmaddr + ATA_BMCMD_PORT) | ATA_BMCMD_START_STOP); 571} 572 573int32_t 574ata_dmadone(struct ata_softc *scp) 575{ | 534 scp->flags |= ATA_DMA_ACTIVE; 535 outb(scp->bmaddr + ATA_BMCMD_PORT, 536 inb(scp->bmaddr + ATA_BMCMD_PORT) | ATA_BMCMD_START_STOP); 537} 538 539int32_t 540ata_dmadone(struct ata_softc *scp) 541{ |
576#ifdef ATA_DMADEBUG 577 printf("ata%d: dmadone\n", scp->lun); 578#endif | |
579 outb(scp->bmaddr + ATA_BMCMD_PORT, 580 inb(scp->bmaddr + ATA_BMCMD_PORT) & ~ATA_BMCMD_START_STOP); 581 scp->flags &= ~ATA_DMA_ACTIVE; 582 return inb(scp->bmaddr + ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK; 583} 584 585int32_t 586ata_dmastatus(struct ata_softc *scp) 587{ | 542 outb(scp->bmaddr + ATA_BMCMD_PORT, 543 inb(scp->bmaddr + ATA_BMCMD_PORT) & ~ATA_BMCMD_START_STOP); 544 scp->flags &= ~ATA_DMA_ACTIVE; 545 return inb(scp->bmaddr + ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK; 546} 547 548int32_t 549ata_dmastatus(struct ata_softc *scp) 550{ |
588#ifdef ATA_DMADEBUG 589 printf("ata%d: dmastatus\n", scp->lun); 590#endif | |
591 return inb(scp->bmaddr + ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK; 592} 593 594static void 595hpt366_timing(struct ata_softc *scp, int32_t device, int32_t mode) 596{ 597 u_int32_t timing; 598 --- 24 unchanged lines hidden (view full) --- 623 case ATA_MODE_PIO: timing = 0xc008d963; break; 624 case ATA_MODE_WDMA2: timing = 0xa008d943; break; 625 case ATA_MODE_UDMA2: timing = 0x900bd943; break; 626 case ATA_MODE_UDMA3: timing = 0x900ad943; break; 627 case ATA_MODE_UDMA4: timing = 0x900fd943; break; 628 default: timing = 0x0120d9d9; 629 } 630 } | 551 return inb(scp->bmaddr + ATA_BMSTAT_PORT) & ATA_BMSTAT_MASK; 552} 553 554static void 555hpt366_timing(struct ata_softc *scp, int32_t device, int32_t mode) 556{ 557 u_int32_t timing; 558 --- 24 unchanged lines hidden (view full) --- 583 case ATA_MODE_PIO: timing = 0xc008d963; break; 584 case ATA_MODE_WDMA2: timing = 0xa008d943; break; 585 case ATA_MODE_UDMA2: timing = 0x900bd943; break; 586 case ATA_MODE_UDMA3: timing = 0x900ad943; break; 587 case ATA_MODE_UDMA4: timing = 0x900fd943; break; 588 default: timing = 0x0120d9d9; 589 } 590 } |
631 pci_write_config(scp->dev, 0x40 + (device==ATA_MASTER ? 0 : 4), timing, 4); | 591 pci_write_config(scp->dev, (device==ATA_MASTER ? 0x40 : 0x44), timing, 4); |
632} 633 634#else /* NPCI > 0 */ 635 636int32_t 637ata_dmainit(struct ata_softc *scp, int32_t device, 638 int32_t piomode, int32_t wdmamode, int32_t udmamode) 639{ --- 28 unchanged lines hidden --- | 592} 593 594#else /* NPCI > 0 */ 595 596int32_t 597ata_dmainit(struct ata_softc *scp, int32_t device, 598 int32_t piomode, int32_t wdmamode, int32_t udmamode) 599{ --- 28 unchanged lines hidden --- |