Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.24-rc2 633 lines 18 kB view raw
1/* 2 * linux/drivers/ide/pci/cmd64x.c Version 1.50 May 10, 2007 3 * 4 * cmd64x.c: Enable interrupts at initialization time on Ultra/PCI machines. 5 * Due to massive hardware bugs, UltraDMA is only supported 6 * on the 646U2 and not on the 646U. 7 * 8 * Copyright (C) 1998 Eddie C. Dost (ecd@skynet.be) 9 * Copyright (C) 1998 David S. Miller (davem@redhat.com) 10 * 11 * Copyright (C) 1999-2002 Andre Hedrick <andre@linux-ide.org> 12 * Copyright (C) 2007 MontaVista Software, Inc. <source@mvista.com> 13 */ 14 15#include <linux/module.h> 16#include <linux/types.h> 17#include <linux/pci.h> 18#include <linux/delay.h> 19#include <linux/hdreg.h> 20#include <linux/ide.h> 21#include <linux/init.h> 22 23#include <asm/io.h> 24 25#define DISPLAY_CMD64X_TIMINGS 26 27#define CMD_DEBUG 0 28 29#if CMD_DEBUG 30#define cmdprintk(x...) printk(x) 31#else 32#define cmdprintk(x...) 33#endif 34 35/* 36 * CMD64x specific registers definition. 37 */ 38#define CFR 0x50 39#define CFR_INTR_CH0 0x04 40#define CNTRL 0x51 41#define CNTRL_ENA_1ST 0x04 42#define CNTRL_ENA_2ND 0x08 43#define CNTRL_DIS_RA0 0x40 44#define CNTRL_DIS_RA1 0x80 45 46#define CMDTIM 0x52 47#define ARTTIM0 0x53 48#define DRWTIM0 0x54 49#define ARTTIM1 0x55 50#define DRWTIM1 0x56 51#define ARTTIM23 0x57 52#define ARTTIM23_DIS_RA2 0x04 53#define ARTTIM23_DIS_RA3 0x08 54#define ARTTIM23_INTR_CH1 0x10 55#define DRWTIM2 0x58 56#define BRST 0x59 57#define DRWTIM3 0x5b 58 59#define BMIDECR0 0x70 60#define MRDMODE 0x71 61#define MRDMODE_INTR_CH0 0x04 62#define MRDMODE_INTR_CH1 0x08 63#define MRDMODE_BLK_CH0 0x10 64#define MRDMODE_BLK_CH1 0x20 65#define BMIDESR0 0x72 66#define UDIDETCR0 0x73 67#define DTPR0 0x74 68#define BMIDECR1 0x78 69#define BMIDECSR 0x79 70#define BMIDESR1 0x7A 71#define UDIDETCR1 0x7B 72#define DTPR1 0x7C 73 74#if defined(DISPLAY_CMD64X_TIMINGS) && defined(CONFIG_IDE_PROC_FS) 75#include <linux/stat.h> 76#include <linux/proc_fs.h> 77 78static u8 cmd64x_proc = 0; 79 80#define CMD_MAX_DEVS 5 81 82static struct pci_dev *cmd_devs[CMD_MAX_DEVS]; 83static int n_cmd_devs; 84 85static char * print_cmd64x_get_info (char *buf, struct pci_dev *dev, int index) 86{ 87 char *p = buf; 88 u8 reg72 = 0, reg73 = 0; /* primary */ 89 u8 reg7a = 0, reg7b = 0; /* secondary */ 90 u8 reg50 = 1, reg51 = 1, reg57 = 0, reg71 = 0; /* extra */ 91 92 p += sprintf(p, "\nController: %d\n", index); 93 p += sprintf(p, "PCI-%x Chipset.\n", dev->device); 94 95 (void) pci_read_config_byte(dev, CFR, &reg50); 96 (void) pci_read_config_byte(dev, CNTRL, &reg51); 97 (void) pci_read_config_byte(dev, ARTTIM23, &reg57); 98 (void) pci_read_config_byte(dev, MRDMODE, &reg71); 99 (void) pci_read_config_byte(dev, BMIDESR0, &reg72); 100 (void) pci_read_config_byte(dev, UDIDETCR0, &reg73); 101 (void) pci_read_config_byte(dev, BMIDESR1, &reg7a); 102 (void) pci_read_config_byte(dev, UDIDETCR1, &reg7b); 103 104 /* PCI0643/6 originally didn't have the primary channel enable bit */ 105 if ((dev->device == PCI_DEVICE_ID_CMD_643) || 106 (dev->device == PCI_DEVICE_ID_CMD_646 && dev->revision < 3)) 107 reg51 |= CNTRL_ENA_1ST; 108 109 p += sprintf(p, "---------------- Primary Channel " 110 "---------------- Secondary Channel ------------\n"); 111 p += sprintf(p, " %s %s\n", 112 (reg51 & CNTRL_ENA_1ST) ? "enabled " : "disabled", 113 (reg51 & CNTRL_ENA_2ND) ? "enabled " : "disabled"); 114 p += sprintf(p, "---------------- drive0 --------- drive1 " 115 "-------- drive0 --------- drive1 ------\n"); 116 p += sprintf(p, "DMA enabled: %s %s" 117 " %s %s\n", 118 (reg72 & 0x20) ? "yes" : "no ", (reg72 & 0x40) ? "yes" : "no ", 119 (reg7a & 0x20) ? "yes" : "no ", (reg7a & 0x40) ? "yes" : "no "); 120 p += sprintf(p, "UltraDMA mode: %s (%c) %s (%c)", 121 ( reg73 & 0x01) ? " on" : "off", 122 ((reg73 & 0x30) == 0x30) ? ((reg73 & 0x04) ? '3' : '0') : 123 ((reg73 & 0x30) == 0x20) ? ((reg73 & 0x04) ? '3' : '1') : 124 ((reg73 & 0x30) == 0x10) ? ((reg73 & 0x04) ? '4' : '2') : 125 ((reg73 & 0x30) == 0x00) ? ((reg73 & 0x04) ? '5' : '2') : '?', 126 ( reg73 & 0x02) ? " on" : "off", 127 ((reg73 & 0xC0) == 0xC0) ? ((reg73 & 0x08) ? '3' : '0') : 128 ((reg73 & 0xC0) == 0x80) ? ((reg73 & 0x08) ? '3' : '1') : 129 ((reg73 & 0xC0) == 0x40) ? ((reg73 & 0x08) ? '4' : '2') : 130 ((reg73 & 0xC0) == 0x00) ? ((reg73 & 0x08) ? '5' : '2') : '?'); 131 p += sprintf(p, " %s (%c) %s (%c)\n", 132 ( reg7b & 0x01) ? " on" : "off", 133 ((reg7b & 0x30) == 0x30) ? ((reg7b & 0x04) ? '3' : '0') : 134 ((reg7b & 0x30) == 0x20) ? ((reg7b & 0x04) ? '3' : '1') : 135 ((reg7b & 0x30) == 0x10) ? ((reg7b & 0x04) ? '4' : '2') : 136 ((reg7b & 0x30) == 0x00) ? ((reg7b & 0x04) ? '5' : '2') : '?', 137 ( reg7b & 0x02) ? " on" : "off", 138 ((reg7b & 0xC0) == 0xC0) ? ((reg7b & 0x08) ? '3' : '0') : 139 ((reg7b & 0xC0) == 0x80) ? ((reg7b & 0x08) ? '3' : '1') : 140 ((reg7b & 0xC0) == 0x40) ? ((reg7b & 0x08) ? '4' : '2') : 141 ((reg7b & 0xC0) == 0x00) ? ((reg7b & 0x08) ? '5' : '2') : '?'); 142 p += sprintf(p, "Interrupt: %s, %s %s, %s\n", 143 (reg71 & MRDMODE_BLK_CH0 ) ? "blocked" : "enabled", 144 (reg50 & CFR_INTR_CH0 ) ? "pending" : "clear ", 145 (reg71 & MRDMODE_BLK_CH1 ) ? "blocked" : "enabled", 146 (reg57 & ARTTIM23_INTR_CH1) ? "pending" : "clear "); 147 148 return (char *)p; 149} 150 151static int cmd64x_get_info (char *buffer, char **addr, off_t offset, int count) 152{ 153 char *p = buffer; 154 int i; 155 156 for (i = 0; i < n_cmd_devs; i++) { 157 struct pci_dev *dev = cmd_devs[i]; 158 p = print_cmd64x_get_info(p, dev, i); 159 } 160 return p-buffer; /* => must be less than 4k! */ 161} 162 163#endif /* defined(DISPLAY_CMD64X_TIMINGS) && defined(CONFIG_IDE_PROC_FS) */ 164 165static u8 quantize_timing(int timing, int quant) 166{ 167 return (timing + quant - 1) / quant; 168} 169 170/* 171 * This routine calculates active/recovery counts and then writes them into 172 * the chipset registers. 173 */ 174static void program_cycle_times (ide_drive_t *drive, int cycle_time, int active_time) 175{ 176 struct pci_dev *dev = HWIF(drive)->pci_dev; 177 int clock_time = 1000 / system_bus_clock(); 178 u8 cycle_count, active_count, recovery_count, drwtim; 179 static const u8 recovery_values[] = 180 {15, 15, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0}; 181 static const u8 drwtim_regs[4] = {DRWTIM0, DRWTIM1, DRWTIM2, DRWTIM3}; 182 183 cmdprintk("program_cycle_times parameters: total=%d, active=%d\n", 184 cycle_time, active_time); 185 186 cycle_count = quantize_timing( cycle_time, clock_time); 187 active_count = quantize_timing(active_time, clock_time); 188 recovery_count = cycle_count - active_count; 189 190 /* 191 * In case we've got too long recovery phase, try to lengthen 192 * the active phase 193 */ 194 if (recovery_count > 16) { 195 active_count += recovery_count - 16; 196 recovery_count = 16; 197 } 198 if (active_count > 16) /* shouldn't actually happen... */ 199 active_count = 16; 200 201 cmdprintk("Final counts: total=%d, active=%d, recovery=%d\n", 202 cycle_count, active_count, recovery_count); 203 204 /* 205 * Convert values to internal chipset representation 206 */ 207 recovery_count = recovery_values[recovery_count]; 208 active_count &= 0x0f; 209 210 /* Program the active/recovery counts into the DRWTIM register */ 211 drwtim = (active_count << 4) | recovery_count; 212 (void) pci_write_config_byte(dev, drwtim_regs[drive->dn], drwtim); 213 cmdprintk("Write 0x%02x to reg 0x%x\n", drwtim, drwtim_regs[drive->dn]); 214} 215 216/* 217 * This routine writes into the chipset registers 218 * PIO setup/active/recovery timings. 219 */ 220static void cmd64x_tune_pio(ide_drive_t *drive, const u8 pio) 221{ 222 ide_hwif_t *hwif = HWIF(drive); 223 struct pci_dev *dev = hwif->pci_dev; 224 unsigned int cycle_time; 225 u8 setup_count, arttim = 0; 226 227 static const u8 setup_values[] = {0x40, 0x40, 0x40, 0x80, 0, 0xc0}; 228 static const u8 arttim_regs[4] = {ARTTIM0, ARTTIM1, ARTTIM23, ARTTIM23}; 229 230 cycle_time = ide_pio_cycle_time(drive, pio); 231 232 program_cycle_times(drive, cycle_time, 233 ide_pio_timings[pio].active_time); 234 235 setup_count = quantize_timing(ide_pio_timings[pio].setup_time, 236 1000 / system_bus_clock()); 237 238 /* 239 * The primary channel has individual address setup timing registers 240 * for each drive and the hardware selects the slowest timing itself. 241 * The secondary channel has one common register and we have to select 242 * the slowest address setup timing ourselves. 243 */ 244 if (hwif->channel) { 245 ide_drive_t *drives = hwif->drives; 246 247 drive->drive_data = setup_count; 248 setup_count = max(drives[0].drive_data, drives[1].drive_data); 249 } 250 251 if (setup_count > 5) /* shouldn't actually happen... */ 252 setup_count = 5; 253 cmdprintk("Final address setup count: %d\n", setup_count); 254 255 /* 256 * Program the address setup clocks into the ARTTIM registers. 257 * Avoid clearing the secondary channel's interrupt bit. 258 */ 259 (void) pci_read_config_byte (dev, arttim_regs[drive->dn], &arttim); 260 if (hwif->channel) 261 arttim &= ~ARTTIM23_INTR_CH1; 262 arttim &= ~0xc0; 263 arttim |= setup_values[setup_count]; 264 (void) pci_write_config_byte(dev, arttim_regs[drive->dn], arttim); 265 cmdprintk("Write 0x%02x to reg 0x%x\n", arttim, arttim_regs[drive->dn]); 266} 267 268/* 269 * Attempts to set drive's PIO mode. 270 * Special cases are 8: prefetch off, 9: prefetch on (both never worked) 271 */ 272 273static void cmd64x_set_pio_mode(ide_drive_t *drive, const u8 pio) 274{ 275 /* 276 * Filter out the prefetch control values 277 * to prevent PIO5 from being programmed 278 */ 279 if (pio == 8 || pio == 9) 280 return; 281 282 cmd64x_tune_pio(drive, pio); 283} 284 285static void cmd64x_set_dma_mode(ide_drive_t *drive, const u8 speed) 286{ 287 ide_hwif_t *hwif = HWIF(drive); 288 struct pci_dev *dev = hwif->pci_dev; 289 u8 unit = drive->dn & 0x01; 290 u8 regU = 0, pciU = hwif->channel ? UDIDETCR1 : UDIDETCR0; 291 292 if (speed >= XFER_SW_DMA_0) { 293 (void) pci_read_config_byte(dev, pciU, &regU); 294 regU &= ~(unit ? 0xCA : 0x35); 295 } 296 297 switch(speed) { 298 case XFER_UDMA_5: 299 regU |= unit ? 0x0A : 0x05; 300 break; 301 case XFER_UDMA_4: 302 regU |= unit ? 0x4A : 0x15; 303 break; 304 case XFER_UDMA_3: 305 regU |= unit ? 0x8A : 0x25; 306 break; 307 case XFER_UDMA_2: 308 regU |= unit ? 0x42 : 0x11; 309 break; 310 case XFER_UDMA_1: 311 regU |= unit ? 0x82 : 0x21; 312 break; 313 case XFER_UDMA_0: 314 regU |= unit ? 0xC2 : 0x31; 315 break; 316 case XFER_MW_DMA_2: 317 program_cycle_times(drive, 120, 70); 318 break; 319 case XFER_MW_DMA_1: 320 program_cycle_times(drive, 150, 80); 321 break; 322 case XFER_MW_DMA_0: 323 program_cycle_times(drive, 480, 215); 324 break; 325 default: 326 return; 327 } 328 329 if (speed >= XFER_SW_DMA_0) 330 (void) pci_write_config_byte(dev, pciU, regU); 331} 332 333static int cmd648_ide_dma_end (ide_drive_t *drive) 334{ 335 ide_hwif_t *hwif = HWIF(drive); 336 int err = __ide_dma_end(drive); 337 u8 irq_mask = hwif->channel ? MRDMODE_INTR_CH1 : 338 MRDMODE_INTR_CH0; 339 u8 mrdmode = inb(hwif->dma_master + 0x01); 340 341 /* clear the interrupt bit */ 342 outb(mrdmode | irq_mask, hwif->dma_master + 0x01); 343 344 return err; 345} 346 347static int cmd64x_ide_dma_end (ide_drive_t *drive) 348{ 349 ide_hwif_t *hwif = HWIF(drive); 350 struct pci_dev *dev = hwif->pci_dev; 351 int irq_reg = hwif->channel ? ARTTIM23 : CFR; 352 u8 irq_mask = hwif->channel ? ARTTIM23_INTR_CH1 : 353 CFR_INTR_CH0; 354 u8 irq_stat = 0; 355 int err = __ide_dma_end(drive); 356 357 (void) pci_read_config_byte(dev, irq_reg, &irq_stat); 358 /* clear the interrupt bit */ 359 (void) pci_write_config_byte(dev, irq_reg, irq_stat | irq_mask); 360 361 return err; 362} 363 364static int cmd648_ide_dma_test_irq (ide_drive_t *drive) 365{ 366 ide_hwif_t *hwif = HWIF(drive); 367 u8 irq_mask = hwif->channel ? MRDMODE_INTR_CH1 : 368 MRDMODE_INTR_CH0; 369 u8 dma_stat = inb(hwif->dma_status); 370 u8 mrdmode = inb(hwif->dma_master + 0x01); 371 372#ifdef DEBUG 373 printk("%s: dma_stat: 0x%02x mrdmode: 0x%02x irq_mask: 0x%02x\n", 374 drive->name, dma_stat, mrdmode, irq_mask); 375#endif 376 if (!(mrdmode & irq_mask)) 377 return 0; 378 379 /* return 1 if INTR asserted */ 380 if (dma_stat & 4) 381 return 1; 382 383 return 0; 384} 385 386static int cmd64x_ide_dma_test_irq (ide_drive_t *drive) 387{ 388 ide_hwif_t *hwif = HWIF(drive); 389 struct pci_dev *dev = hwif->pci_dev; 390 int irq_reg = hwif->channel ? ARTTIM23 : CFR; 391 u8 irq_mask = hwif->channel ? ARTTIM23_INTR_CH1 : 392 CFR_INTR_CH0; 393 u8 dma_stat = inb(hwif->dma_status); 394 u8 irq_stat = 0; 395 396 (void) pci_read_config_byte(dev, irq_reg, &irq_stat); 397 398#ifdef DEBUG 399 printk("%s: dma_stat: 0x%02x irq_stat: 0x%02x irq_mask: 0x%02x\n", 400 drive->name, dma_stat, irq_stat, irq_mask); 401#endif 402 if (!(irq_stat & irq_mask)) 403 return 0; 404 405 /* return 1 if INTR asserted */ 406 if (dma_stat & 4) 407 return 1; 408 409 return 0; 410} 411 412/* 413 * ASUS P55T2P4D with CMD646 chipset revision 0x01 requires the old 414 * event order for DMA transfers. 415 */ 416 417static int cmd646_1_ide_dma_end (ide_drive_t *drive) 418{ 419 ide_hwif_t *hwif = HWIF(drive); 420 u8 dma_stat = 0, dma_cmd = 0; 421 422 drive->waiting_for_dma = 0; 423 /* get DMA status */ 424 dma_stat = inb(hwif->dma_status); 425 /* read DMA command state */ 426 dma_cmd = inb(hwif->dma_command); 427 /* stop DMA */ 428 outb(dma_cmd & ~1, hwif->dma_command); 429 /* clear the INTR & ERROR bits */ 430 outb(dma_stat | 6, hwif->dma_status); 431 /* and free any DMA resources */ 432 ide_destroy_dmatable(drive); 433 /* verify good DMA status */ 434 return (dma_stat & 7) != 4; 435} 436 437static unsigned int __devinit init_chipset_cmd64x(struct pci_dev *dev, const char *name) 438{ 439 u8 mrdmode = 0; 440 441 if (dev->device == PCI_DEVICE_ID_CMD_646) { 442 443 switch (dev->revision) { 444 case 0x07: 445 case 0x05: 446 printk("%s: UltraDMA capable\n", name); 447 break; 448 case 0x03: 449 default: 450 printk("%s: MultiWord DMA force limited\n", name); 451 break; 452 case 0x01: 453 printk("%s: MultiWord DMA limited, " 454 "IRQ workaround enabled\n", name); 455 break; 456 } 457 } 458 459 /* Set a good latency timer and cache line size value. */ 460 (void) pci_write_config_byte(dev, PCI_LATENCY_TIMER, 64); 461 /* FIXME: pci_set_master() to ensure a good latency timer value */ 462 463 /* 464 * Enable interrupts, select MEMORY READ LINE for reads. 465 * 466 * NOTE: although not mentioned in the PCI0646U specs, 467 * bits 0-1 are write only and won't be read back as 468 * set or not -- PCI0646U2 specs clarify this point. 469 */ 470 (void) pci_read_config_byte (dev, MRDMODE, &mrdmode); 471 mrdmode &= ~0x30; 472 (void) pci_write_config_byte(dev, MRDMODE, (mrdmode | 0x02)); 473 474#if defined(DISPLAY_CMD64X_TIMINGS) && defined(CONFIG_IDE_PROC_FS) 475 476 cmd_devs[n_cmd_devs++] = dev; 477 478 if (!cmd64x_proc) { 479 cmd64x_proc = 1; 480 ide_pci_create_host_proc("cmd64x", cmd64x_get_info); 481 } 482#endif /* DISPLAY_CMD64X_TIMINGS && CONFIG_IDE_PROC_FS */ 483 484 return 0; 485} 486 487static u8 __devinit ata66_cmd64x(ide_hwif_t *hwif) 488{ 489 struct pci_dev *dev = hwif->pci_dev; 490 u8 bmidecsr = 0, mask = hwif->channel ? 0x02 : 0x01; 491 492 switch (dev->device) { 493 case PCI_DEVICE_ID_CMD_648: 494 case PCI_DEVICE_ID_CMD_649: 495 pci_read_config_byte(dev, BMIDECSR, &bmidecsr); 496 return (bmidecsr & mask) ? ATA_CBL_PATA80 : ATA_CBL_PATA40; 497 default: 498 return ATA_CBL_PATA40; 499 } 500} 501 502static void __devinit init_hwif_cmd64x(ide_hwif_t *hwif) 503{ 504 struct pci_dev *dev = hwif->pci_dev; 505 506 hwif->set_pio_mode = &cmd64x_set_pio_mode; 507 hwif->set_dma_mode = &cmd64x_set_dma_mode; 508 509 if (!hwif->dma_base) 510 return; 511 512 /* 513 * UltraDMA only supported on PCI646U and PCI646U2, which 514 * correspond to revisions 0x03, 0x05 and 0x07 respectively. 515 * Actually, although the CMD tech support people won't 516 * tell me the details, the 0x03 revision cannot support 517 * UDMA correctly without hardware modifications, and even 518 * then it only works with Quantum disks due to some 519 * hold time assumptions in the 646U part which are fixed 520 * in the 646U2. 521 * 522 * So we only do UltraDMA on revision 0x05 and 0x07 chipsets. 523 */ 524 if (dev->device == PCI_DEVICE_ID_CMD_646 && dev->revision < 5) 525 hwif->ultra_mask = 0x00; 526 527 if (hwif->cbl != ATA_CBL_PATA40_SHORT) 528 hwif->cbl = ata66_cmd64x(hwif); 529 530 switch (dev->device) { 531 case PCI_DEVICE_ID_CMD_648: 532 case PCI_DEVICE_ID_CMD_649: 533 alt_irq_bits: 534 hwif->ide_dma_end = &cmd648_ide_dma_end; 535 hwif->ide_dma_test_irq = &cmd648_ide_dma_test_irq; 536 break; 537 case PCI_DEVICE_ID_CMD_646: 538 if (dev->revision == 0x01) { 539 hwif->ide_dma_end = &cmd646_1_ide_dma_end; 540 break; 541 } else if (dev->revision >= 0x03) 542 goto alt_irq_bits; 543 /* fall thru */ 544 default: 545 hwif->ide_dma_end = &cmd64x_ide_dma_end; 546 hwif->ide_dma_test_irq = &cmd64x_ide_dma_test_irq; 547 break; 548 } 549} 550 551static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { 552 { /* 0 */ 553 .name = "CMD643", 554 .init_chipset = init_chipset_cmd64x, 555 .init_hwif = init_hwif_cmd64x, 556 .enablebits = {{0x00,0x00,0x00}, {0x51,0x08,0x08}}, 557 .host_flags = IDE_HFLAG_ABUSE_PREFETCH | IDE_HFLAG_BOOTABLE, 558 .pio_mask = ATA_PIO5, 559 .mwdma_mask = ATA_MWDMA2, 560 .udma_mask = 0x00, /* no udma */ 561 },{ /* 1 */ 562 .name = "CMD646", 563 .init_chipset = init_chipset_cmd64x, 564 .init_hwif = init_hwif_cmd64x, 565 .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, 566 .host_flags = IDE_HFLAG_ABUSE_PREFETCH | IDE_HFLAG_BOOTABLE, 567 .pio_mask = ATA_PIO5, 568 .mwdma_mask = ATA_MWDMA2, 569 .udma_mask = ATA_UDMA2, 570 },{ /* 2 */ 571 .name = "CMD648", 572 .init_chipset = init_chipset_cmd64x, 573 .init_hwif = init_hwif_cmd64x, 574 .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, 575 .chipset = ide_cmd646, 576 .host_flags = IDE_HFLAG_ABUSE_PREFETCH | IDE_HFLAG_BOOTABLE, 577 .pio_mask = ATA_PIO5, 578 .mwdma_mask = ATA_MWDMA2, 579 .udma_mask = ATA_UDMA4, 580 },{ /* 3 */ 581 .name = "CMD649", 582 .init_chipset = init_chipset_cmd64x, 583 .init_hwif = init_hwif_cmd64x, 584 .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, 585 .host_flags = IDE_HFLAG_ABUSE_PREFETCH | IDE_HFLAG_BOOTABLE, 586 .pio_mask = ATA_PIO5, 587 .mwdma_mask = ATA_MWDMA2, 588 .udma_mask = ATA_UDMA5, 589 } 590}; 591 592static int __devinit cmd64x_init_one(struct pci_dev *dev, const struct pci_device_id *id) 593{ 594 struct ide_port_info d; 595 u8 idx = id->driver_data; 596 597 d = cmd64x_chipsets[idx]; 598 599 /* 600 * The original PCI0646 didn't have the primary channel enable bit, 601 * it appeared starting with PCI0646U (i.e. revision ID 3). 602 */ 603 if (idx == 1 && dev->revision < 3) 604 d.enablebits[0].reg = 0; 605 606 return ide_setup_pci_device(dev, &d); 607} 608 609static const struct pci_device_id cmd64x_pci_tbl[] = { 610 { PCI_VDEVICE(CMD, PCI_DEVICE_ID_CMD_643), 0 }, 611 { PCI_VDEVICE(CMD, PCI_DEVICE_ID_CMD_646), 1 }, 612 { PCI_VDEVICE(CMD, PCI_DEVICE_ID_CMD_648), 2 }, 613 { PCI_VDEVICE(CMD, PCI_DEVICE_ID_CMD_649), 3 }, 614 { 0, }, 615}; 616MODULE_DEVICE_TABLE(pci, cmd64x_pci_tbl); 617 618static struct pci_driver driver = { 619 .name = "CMD64x_IDE", 620 .id_table = cmd64x_pci_tbl, 621 .probe = cmd64x_init_one, 622}; 623 624static int __init cmd64x_ide_init(void) 625{ 626 return ide_pci_register_driver(&driver); 627} 628 629module_init(cmd64x_ide_init); 630 631MODULE_AUTHOR("Eddie Dost, David Miller, Andre Hedrick"); 632MODULE_DESCRIPTION("PCI driver module for CMD64x IDE"); 633MODULE_LICENSE("GPL");