#ifndef PDC202XX_H #define PDC202XX_H #include #include #include #ifndef SPLIT_BYTE #define SPLIT_BYTE(B,H,L) ((H)=(B>>4), (L)=(B-((B>>4)<<4))) #endif #define PDC202XX_DEBUG_DRIVE_INFO 0 static const char *pdc_quirk_drives[] = { "QUANTUM FIREBALLlct08 08", "QUANTUM FIREBALLP KA6.4", "QUANTUM FIREBALLP KA9.1", "QUANTUM FIREBALLP LM20.4", "QUANTUM FIREBALLP KX13.6", "QUANTUM FIREBALLP KX20.5", "QUANTUM FIREBALLP KX27.3", "QUANTUM FIREBALLP LM20.5", NULL }; static inline u8 *pdc202xx_pio_verbose (u32 drive_pci) { if ((drive_pci & 0x000ff000) == 0x000ff000) return("NOTSET"); if ((drive_pci & 0x00000401) == 0x00000401) return("PIO 4"); if ((drive_pci & 0x00000602) == 0x00000602) return("PIO 3"); if ((drive_pci & 0x00000803) == 0x00000803) return("PIO 2"); if ((drive_pci & 0x00000C05) == 0x00000C05) return("PIO 1"); if ((drive_pci & 0x00001309) == 0x00001309) return("PIO 0"); return("PIO ?"); } static inline u8 *pdc202xx_dma_verbose (u32 drive_pci) { if ((drive_pci & 0x00036000) == 0x00036000) return("MWDMA 2"); if ((drive_pci & 0x00046000) == 0x00046000) return("MWDMA 1"); if ((drive_pci & 0x00056000) == 0x00056000) return("MWDMA 0"); if ((drive_pci & 0x00056000) == 0x00056000) return("SWDMA 2"); if ((drive_pci & 0x00068000) == 0x00068000) return("SWDMA 1"); if ((drive_pci & 0x000BC000) == 0x000BC000) return("SWDMA 0"); return("PIO---"); } static inline u8 *pdc202xx_ultra_verbose (u32 drive_pci, u16 slow_cable) { if ((drive_pci & 0x000ff000) == 0x000ff000) return("NOTSET"); if ((drive_pci & 0x00012000) == 0x00012000) return((slow_cable) ? "UDMA 2" : "UDMA 4"); if ((drive_pci & 0x00024000) == 0x00024000) return((slow_cable) ? "UDMA 1" : "UDMA 3"); if ((drive_pci & 0x00036000) == 0x00036000) return("UDMA 0"); return(pdc202xx_dma_verbose(drive_pci)); } /* A Register */ #define SYNC_ERRDY_EN 0xC0 #define SYNC_IN 0x80 /* control bit, different for master vs. slave drives */ #define ERRDY_EN 0x40 /* control bit, different for master vs. slave drives */ #define IORDY_EN 0x20 /* PIO: IOREADY */ #define PREFETCH_EN 0x10 /* PIO: PREFETCH */ #define PA3 0x08 /* PIO"A" timing */ #define PA2 0x04 /* PIO"A" timing */ #define PA1 0x02 /* PIO"A" timing */ #define PA0 0x01 /* PIO"A" timing */ /* B Register */ #define MB2 0x80 /* DMA"B" timing */ #define MB1 0x40 /* DMA"B" timing */ #define MB0 0x20 /* DMA"B" timing */ #define PB4 0x10 /* PIO_FORCE 1:0 */ #define PB3 0x08 /* PIO"B" timing */ /* PIO flow Control mode */ #define PB2 0x04 /* PIO"B" timing */ /* PIO 4 */ #define PB1 0x02 /* PIO"B" timing */ /* PIO 3 half */ #define PB0 0x01 /* PIO"B" timing */ /* PIO 3 other half */ /* C Register */ #define IORDYp_NO_SPEED 0x4F #define SPEED_DIS 0x0F #define DMARQp 0x80 #define IORDYp 0x40 #define DMAR_EN 0x20 #define DMAW_EN 0x10 #define MC3 0x08 /* DMA"C" timing */ #define MC2 0x04 /* DMA"C" timing */ #define MC1 0x02 /* DMA"C" timing */ #define MC0 0x01 /* DMA"C" timing */ #define DISPLAY_PDC202XX_TIMINGS static void init_setup_pdc202ata4(struct pci_dev *dev, ide_pci_device_t *d); static void init_setup_pdc20265(struct pci_dev *, ide_pci_device_t *); static void init_setup_pdc202xx(struct pci_dev *, ide_pci_device_t *); static unsigned int init_chipset_pdc202xx(struct pci_dev *, const char *); static void init_hwif_pdc202xx(ide_hwif_t *); static void init_dma_pdc202xx(ide_hwif_t *, unsigned long); static ide_pci_device_t pdc202xx_chipsets[] __devinitdata = { { /* 0 */ .name = "PDC20246", .init_setup = init_setup_pdc202ata4, .init_chipset = init_chipset_pdc202xx, .init_hwif = init_hwif_pdc202xx, .init_dma = init_dma_pdc202xx, .channels = 2, .autodma = AUTODMA, #ifndef CONFIG_PDC202XX_FORCE .enablebits = {{0x50,0x02,0x02}, {0x50,0x04,0x04}}, #endif .bootable = OFF_BOARD, .extra = 16, },{ /* 1 */ .name = "PDC20262", .init_setup = init_setup_pdc202ata4, .init_chipset = init_chipset_pdc202xx, .init_hwif = init_hwif_pdc202xx, .init_dma = init_dma_pdc202xx, .channels = 2, .autodma = AUTODMA, #ifndef CONFIG_PDC202XX_FORCE .enablebits = {{0x50,0x02,0x02}, {0x50,0x04,0x04}}, #endif .bootable = OFF_BOARD, .extra = 48, .flags = IDEPCI_FLAG_FORCE_PDC, },{ /* 2 */ .name = "PDC20263", .init_setup = init_setup_pdc202ata4, .init_chipset = init_chipset_pdc202xx, .init_hwif = init_hwif_pdc202xx, .init_dma = init_dma_pdc202xx, .channels = 2, .autodma = AUTODMA, #ifndef CONFIG_PDC202XX_FORCE .enablebits = {{0x50,0x02,0x02}, {0x50,0x04,0x04}}, #endif .bootable = OFF_BOARD, .extra = 48, },{ /* 3 */ .name = "PDC20265", .init_setup = init_setup_pdc20265, .init_chipset = init_chipset_pdc202xx, .init_hwif = init_hwif_pdc202xx, .init_dma = init_dma_pdc202xx, .channels = 2, .autodma = AUTODMA, #ifndef CONFIG_PDC202XX_FORCE .enablebits = {{0x50,0x02,0x02}, {0x50,0x04,0x04}}, #endif .bootable = OFF_BOARD, .extra = 48, .flags = IDEPCI_FLAG_FORCE_PDC, },{ /* 4 */ .name = "PDC20267", .init_setup = init_setup_pdc202xx, .init_chipset = init_chipset_pdc202xx, .init_hwif = init_hwif_pdc202xx, .init_dma = init_dma_pdc202xx, .channels = 2, .autodma = AUTODMA, #ifndef CONFIG_PDC202XX_FORCE .enablebits = {{0x50,0x02,0x02}, {0x50,0x04,0x04}}, #endif .bootable = OFF_BOARD, .extra = 48, } }; #endif /* PDC202XX_H */