Re: ATAPI + cdwriter problem

From: Andre Hedrick (andre@linux-ide.org)
Date: Thu Jul 11 2002 - 12:22:42 EST


Alan I did agree with the patch!
You just broke every system that is not x86 wanting to use the pci card.

On Thu, 11 Jul 2002, Alan Cox wrote:

> > i also have now tried this under 2.4.19-rc1 which produces the same
> > problems.
>
> Apply the diff below then retry. Let people know if it fixes your atapi
> problem
>
> diff -urN linux-2.4.19pre10/MAINTAINERS linux/MAINTAINERS
> --- linux-2.4.19pre10/MAINTAINERS Tue Jun 18 11:35:12 2002
> +++ linux/MAINTAINERS Thu Jun 27 19:50:57 2002
> @@ -1291,6 +1291,17 @@
> W: http://www.pnd-pc.demon.co.uk/promise/
> S: Maintained
>
> +PROMISE PDC202XX IDE CONTROLLER DRIVER
> +P: Hank Yang
> +M: support@promise.com.tw [TAIWAN]
> +P: Jordan Rhody
> +M: support@promise.com [U.S.A]
> +P: Jack Hu
> +M: support-china@promise.com [CHINA]
> +W: http://www.promise.com/support/linux_eng.asp
> +W: http://www.promise.com.tw/support/linux_eng.asp
> +S: Maintained
> +
> QNX4 FILESYSTEM
> P: Anders Larsen
> M: al@alarsen.net
> diff -urN linux-2.4.19pre10/drivers/ide/ide-features.c linux/drivers/ide/ide-features.c
> --- linux-2.4.19pre10/drivers/ide/ide-features.c Tue Jun 18 11:35:15 2002
> +++ linux/drivers/ide/ide-features.c Thu Jul 4 00:48:30 2002
> @@ -245,6 +245,9 @@
> */
> byte eighty_ninty_three (ide_drive_t *drive)
> {
> + if (HWIF(drive)->pci_devid.vid==0x105a)
> + return(HWIF(drive)->udma_four);
> + /* PDC202XX: that's because some HDD will return wrong info */
> return ((byte) ((HWIF(drive)->udma_four) &&
> #ifndef CONFIG_IDEDMA_IVB
> (drive->id->hw_config & 0x4000) &&
> diff -urN linux-2.4.19pre10/drivers/ide/ide-pci.c linux/drivers/ide/ide-pci.c
> --- linux-2.4.19pre10/drivers/ide/ide-pci.c Tue Jun 18 11:35:15 2002
> +++ linux/drivers/ide/ide-pci.c Fri Jul 5 02:25:04 2002
> @@ -12,13 +12,6 @@
> * configuration of all PCI IDE interfaces present in a system.
> */
>
> -/*
> - * Chipsets that are on the IDE_IGNORE list because of problems of not being
> - * set at compile time.
> - *
> - * CONFIG_BLK_DEV_PDC202XX
> - */
> -
> #include <linux/config.h>
> #include <linux/types.h>
> #include <linux/kernel.h>
> @@ -54,7 +47,7 @@
> #define DEVID_PDC20265 ((ide_pci_devid_t){PCI_VENDOR_ID_PROMISE, PCI_DEVICE_ID_PROMISE_20265})
> #define DEVID_PDC20267 ((ide_pci_devid_t){PCI_VENDOR_ID_PROMISE, PCI_DEVICE_ID_PROMISE_20267})
> #define DEVID_PDC20268 ((ide_pci_devid_t){PCI_VENDOR_ID_PROMISE, PCI_DEVICE_ID_PROMISE_20268})
> -#define DEVID_PDC20268R ((ide_pci_devid_t){PCI_VENDOR_ID_PROMISE, PCI_DEVICE_ID_PROMISE_20268R})
> +#define DEVID_PDC20270 ((ide_pci_devid_t){PCI_VENDOR_ID_PROMISE, PCI_DEVICE_ID_PROMISE_20270})
> #define DEVID_PDC20269 ((ide_pci_devid_t){PCI_VENDOR_ID_PROMISE, PCI_DEVICE_ID_PROMISE_20269})
> #define DEVID_PDC20275 ((ide_pci_devid_t){PCI_VENDOR_ID_PROMISE, PCI_DEVICE_ID_PROMISE_20275})
> #define DEVID_PDC20276 ((ide_pci_devid_t){PCI_VENDOR_ID_PROMISE, PCI_DEVICE_ID_PROMISE_20276})
> @@ -255,9 +248,9 @@
> #define ATA66_PDC202XX &ata66_pdc202xx
> #define INIT_PDC202XX &ide_init_pdc202xx
> #else
> -#define PCI_PDC202XX IDE_IGNORE
> -#define ATA66_PDC202XX IDE_IGNORE
> -#define INIT_PDC202XX IDE_IGNORE
> +#define PCI_PDC202XX NULL
> +#define ATA66_PDC202XX NULL
> +#define INIT_PDC202XX NULL
> #endif
>
> #ifdef CONFIG_BLK_DEV_PIIX
> @@ -420,7 +413,7 @@
> /* Promise used a different PCI ident for the raid card apparently to try and
> prevent Linux detecting it and using our own raid code. We want to detect
> it for the ataraid drivers, so we have to list both here.. */
> - {DEVID_PDC20268R,"PDC20270", PCI_PDC202XX, ATA66_PDC202XX, INIT_PDC202XX, NULL, {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, OFF_BOARD, 0 },
> + {DEVID_PDC20270,"PDC20270", PCI_PDC202XX, ATA66_PDC202XX, INIT_PDC202XX, NULL, {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, OFF_BOARD, 0 },
> {DEVID_PDC20269,"PDC20269", PCI_PDC202XX, ATA66_PDC202XX, INIT_PDC202XX, NULL, {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, OFF_BOARD, 0 },
> {DEVID_PDC20275,"PDC20275", PCI_PDC202XX, ATA66_PDC202XX, INIT_PDC202XX, NULL, {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, OFF_BOARD, 0 },
> {DEVID_PDC20276,"PDC20276", PCI_PDC202XX, ATA66_PDC202XX, INIT_PDC202XX, NULL, {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, OFF_BOARD, 0 },
> @@ -482,7 +475,7 @@
> case PCI_DEVICE_ID_PROMISE_20265:
> case PCI_DEVICE_ID_PROMISE_20267:
> case PCI_DEVICE_ID_PROMISE_20268:
> - case PCI_DEVICE_ID_PROMISE_20268R:
> + case PCI_DEVICE_ID_PROMISE_20270:
> case PCI_DEVICE_ID_PROMISE_20269:
> case PCI_DEVICE_ID_PROMISE_20275:
> case PCI_DEVICE_ID_PROMISE_20276:
> @@ -672,25 +665,18 @@
> */
> pciirq = dev->irq;
>
> - if (dev->class >> 8 == PCI_CLASS_STORAGE_RAID)
> - {
> - /* By rights we want to ignore these, but the Promise Fastrak
> - people have some strange ideas about proprietary so we have
> - to act otherwise on those. The supertrak however we need
> - to skip */
> - if (IDE_PCI_DEVID_EQ(d->devid, DEVID_PDC20265))
> - {
> - printk(KERN_INFO "ide: Found promise 20265 in RAID mode.\n");
> - if(dev->bus->self && dev->bus->self->vendor == PCI_VENDOR_ID_INTEL &&
> - dev->bus->self->device == PCI_DEVICE_ID_INTEL_I960)
> - {
> - printk(KERN_INFO "ide: Skipping Promise PDC20265 attached to I2O RAID controller.\n");
> - return;
> - }
> +#ifdef CONFIG_PDC202XX_FORCE
> + if (dev->class >> 8 == PCI_CLASS_STORAGE_RAID) {
> + /*
> + * By rights we want to ignore Promise FastTrak and SuperTrak
> + * series here, those use own driver.
> + */
> + if (dev->vendor == PCI_VENDOR_ID_PROMISE) {
> + printk(KERN_INFO "ide: Skipping Promise RAID controller.\n");
> + return;
> }
> - /* Its attached to something else, just a random bridge.
> - Suspect a fastrak and fall through */
> }
> +#endif /* CONFIG_PDC202XX_FORCE */
> if ((dev->class & ~(0xfa)) != ((PCI_CLASS_STORAGE_IDE << 8) | 5)) {
> printk("%s: not 100%% native mode: will probe irqs later\n", d->name);
> /*
> @@ -812,7 +798,7 @@
> IDE_PCI_DEVID_EQ(d->devid, DEVID_PDC20265) ||
> IDE_PCI_DEVID_EQ(d->devid, DEVID_PDC20267) ||
> IDE_PCI_DEVID_EQ(d->devid, DEVID_PDC20268) ||
> - IDE_PCI_DEVID_EQ(d->devid, DEVID_PDC20268R) ||
> + IDE_PCI_DEVID_EQ(d->devid, DEVID_PDC20270) ||
> IDE_PCI_DEVID_EQ(d->devid, DEVID_PDC20269) ||
> IDE_PCI_DEVID_EQ(d->devid, DEVID_PDC20275) ||
> IDE_PCI_DEVID_EQ(d->devid, DEVID_PDC20276) ||
> @@ -985,7 +971,7 @@
> return; /* UM8886A/BF pair */
> else if (IDE_PCI_DEVID_EQ(d->devid, DEVID_HPT366))
> hpt366_device_order_fixup(dev, d);
> - else if (IDE_PCI_DEVID_EQ(d->devid, DEVID_PDC20268R))
> + else if (IDE_PCI_DEVID_EQ(d->devid, DEVID_PDC20270))
> pdc20270_device_order_fixup(dev, d);
> else if (!IDE_PCI_DEVID_EQ(d->devid, IDE_PCI_DEVID_NULL) || (dev->class >> 8) == PCI_CLASS_STORAGE_IDE) {
> if (IDE_PCI_DEVID_EQ(d->devid, IDE_PCI_DEVID_NULL))
> diff -urN linux-2.4.19pre10/drivers/ide/pdc202xx.c linux/drivers/ide/pdc202xx.c
> --- linux-2.4.19pre10/drivers/ide/pdc202xx.c Tue Jun 18 11:35:16 2002
> +++ linux/drivers/ide/pdc202xx.c Fri Jul 5 02:37:08 2002
> @@ -1,34 +1,59 @@
> /*
> - * linux/drivers/ide/pdc202xx.c Version 0.30 Mar. 18, 2000
> + * linux/drivers/ide/pdc202xx.c Version 0.32 Feb. 27, 2002
> *
> * Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org>
> * May be copied or modified under the terms of the GNU General Public License
> *
> - * Promise Ultra33 cards with BIOS v1.20 through 1.28 will need this
> + * Promise Ultra66 cards with BIOS v1.11 this
> * compiled into the kernel if you have more than one card installed.
> - * Note that BIOS v1.29 is reported to fix the problem. Since this is
> - * safe chipset tuning, including this support is harmless
> *
> - * Promise Ultra66 cards with BIOS v1.11 this
> + * Promise Ultra100 cards with BIOS v2.01 this
> * compiled into the kernel if you have more than one card installed.
> *
> - * Promise Ultra100 cards.
> + * Promise Ultra100TX2 with BIOS v2.10 & Ultra133TX2 with BIOS v2.20
> + * support 8 hard drives on UDMA mode.
> *
> - * The latest chipset code will support the following ::
> - * Three Ultra33 controllers and 12 drives.
> - * 8 are UDMA supported and 4 are limited to DMA mode 2 multi-word.
> - * The 8/4 ratio is a BIOS code limit by promise.
> + * Linux kernel will misunderstand FastTrak ATA-RAID series as Ultra
> + * IDE Controller, UNLESS you enable "CONFIG_PDC202XX_FORCE"
> + * That's you can use FastTrak ATA-RAID controllers as IDE controllers.
> *
> - * UNLESS you enable "CONFIG_PDC202XX_BURST"
> + * History :
> + * 05/22/01 v1.20 b1
> + * (1) support PDC20268
> + * (2) fix cable judge function
> + * 08/22/01 v1.20 b2
> + * (1) support ATA-133 PDC20269/75
> + * (2) support UDMA Mode 6
> + * (3) fix proc report information
> + * (4) set ATA133 timing
> + * (5) fix ultra dma bit 14 selectable
> + * (6) support 32bit LBA
> + * 09/11/01 v1.20 b3
> + * (1) fix eighty_ninty_three()
> + * (2) fix offset address 0x1c~0x1f
> + * 10/30/01 v1.20 b4
> + * (1) fix 48bit LBA HOB bit
> + * (2) force rescan drive under PIO modes if need
> + * 11/02/01 v1.20.0.5
> + * (1) could be patched with ext3 filesystem code
> + * 11/06/01 v1.20.0.6
> + * (1) fix LBA48 drive running without Promise controllers
> + * (2) fix LBA48 drive running under PIO modes
> + * 01/28/02 v1.20.0.6
> + * (1) release for linux IDE Group kernel 2.4.18
> + * (2) add version and controller info to proc
> + * 05/23/02 v1.20.0.7
> + * (1) disable PDC20262 running with 48bit
> + * (2) Add quirk drive lists for PDC20265/67
> *
> - */
> -
> -/*
> - * Portions Copyright (C) 1999 Promise Technology, Inc.
> - * Author: Frank Tiernan (frankt@promise.com)
> + * Copyright (C) 1999-2002 Promise Technology, Inc.
> + * Author: Frank Tiernan <frankt@promise.com>
> + * PROMISE pdc202xx IDE Controller driver MAINTAINERS
> * Released under terms of General Public License
> */
> -
> +
> +#define VERSION "1.20.0.7"
> +#define VERDATE "2002-05-23"
> #include <linux/config.h>
> #include <linux/types.h>
> #include <linux/kernel.h>
> @@ -65,41 +90,8 @@
> extern int (*pdc202xx_display_info)(char *, char **, off_t, int); /* ide-proc.c */
> extern char *ide_media_verbose(ide_drive_t *);
> static struct pci_dev *bmide_dev;
> -
> -char *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 ?");
> -}
> -
> -char *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---");
> -}
> -
> -char *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));
> -}
> +static struct hd_driveid *id[4];
> +static int speed_rate[4];
>
> static char * pdc202xx_info (char *buf, struct pci_dev *dev)
> {
> @@ -107,8 +99,10 @@
>
> u32 bibma = pci_resource_start(dev, 4);
> u32 reg60h = 0, reg64h = 0, reg68h = 0, reg6ch = 0;
> - u16 reg50h = 0, pmask = (1<<10), smask = (1<<11);
> - u8 hi = 0, lo = 0;
> + u16 reg50h = 0;
> + u16 word88 = 0;
> + int udmasel[4] = {0,0,0,0}, piosel[4] = {0,0,0,0};
> + int i = 0, hd = 0;
>
> /*
> * at that point bibma+0x2 et bibma+0xa are byte registers
> @@ -120,10 +114,10 @@
> u8 sc11 = inb_p((unsigned short)bibma + 0x11);
> u8 sc1a = inb_p((unsigned short)bibma + 0x1a);
> u8 sc1b = inb_p((unsigned short)bibma + 0x1b);
> - u8 sc1c = inb_p((unsigned short)bibma + 0x1c);
> + /* u8 sc1c = inb_p((unsigned short)bibma + 0x1c);
> u8 sc1d = inb_p((unsigned short)bibma + 0x1d);
> u8 sc1e = inb_p((unsigned short)bibma + 0x1e);
> - u8 sc1f = inb_p((unsigned short)bibma + 0x1f);
> + u8 sc1f = inb_p((unsigned short)bibma + 0x1f); */
>
> pci_read_config_word(dev, 0x50, &reg50h);
> pci_read_config_dword(dev, 0x60, &reg60h);
> @@ -131,40 +125,35 @@
> pci_read_config_dword(dev, 0x68, &reg68h);
> pci_read_config_dword(dev, 0x6c, &reg6ch);
>
> + p+=sprintf(p, "\nPROMISE Ultra series driver Ver %s %s Adapter: ", VERSION, VERDATE);
> switch(dev->device) {
> + case PCI_DEVICE_ID_PROMISE_20275:
> + p += sprintf(p, "MBUltra133\n");
> + break;
> + case PCI_DEVICE_ID_PROMISE_20269:
> + p += sprintf(p, "Ultra133 TX2\n");
> + break;
> + case PCI_DEVICE_ID_PROMISE_20268:
> + p += sprintf(p, "Ultra100 TX2\n");
> + break;
> case PCI_DEVICE_ID_PROMISE_20267:
> - p += sprintf(p, "\n PDC20267 Chipset.\n");
> + p += sprintf(p, "Ultra100\n");
> break;
> case PCI_DEVICE_ID_PROMISE_20265:
> - p += sprintf(p, "\n PDC20265 Chipset.\n");
> + p += sprintf(p, "Ultra100 on M/B\n");
> break;
> case PCI_DEVICE_ID_PROMISE_20262:
> - p += sprintf(p, "\n PDC20262 Chipset.\n");
> + p += sprintf(p, "Ultra66\n");
> break;
> case PCI_DEVICE_ID_PROMISE_20246:
> - p += sprintf(p, "\n PDC20246 Chipset.\n");
> + p += sprintf(p, "Ultra33\n");
> reg50h |= 0x0c00;
> break;
> default:
> - p += sprintf(p, "\n PDC202XX Chipset.\n");
> + p += sprintf(p, "Ultra Series\n");
> break;
> }
>
> - p += sprintf(p, "------------------------------- General Status ---------------------------------\n");
> - p += sprintf(p, "Burst Mode : %sabled\n", (sc1f & 0x01) ? "en" : "dis");
> - p += sprintf(p, "Host Mode : %s\n", (sc1f & 0x08) ? "Tri-Stated" : "Normal");
> - p += sprintf(p, "Bus Clocking : %s\n",
> - ((sc1f & 0xC0) == 0xC0) ? "100 External" :
> - ((sc1f & 0x80) == 0x80) ? "66 External" :
> - ((sc1f & 0x40) == 0x40) ? "33 External" : "33 PCI Internal");
> - p += sprintf(p, "IO pad select : %s mA\n",
> - ((sc1c & 0x03) == 0x03) ? "10" :
> - ((sc1c & 0x02) == 0x02) ? "8" :
> - ((sc1c & 0x01) == 0x01) ? "6" :
> - ((sc1c & 0x00) == 0x00) ? "4" : "??");
> - SPLIT_BYTE(sc1e, hi, lo);
> - p += sprintf(p, "Status Polling Period : %d\n", hi);
> - p += sprintf(p, "Interrupt Check Status Polling Delay : %d\n", lo);
> p += sprintf(p, "--------------- Primary Channel ---------------- Secondary Channel -------------\n");
> p += sprintf(p, " %s %s\n",
> (c0&0x80)?"disabled":"enabled ",
> @@ -172,84 +161,39 @@
> p += sprintf(p, "66 Clocking %s %s\n",
> (sc11&0x02)?"enabled ":"disabled",
> (sc11&0x08)?"enabled ":"disabled");
> - p += sprintf(p, " Mode %s Mode %s\n",
> + p += sprintf(p, "Mode %s %s\n",
> (sc1a & 0x01) ? "MASTER" : "PCI ",
> (sc1b & 0x01) ? "MASTER" : "PCI ");
> - p += sprintf(p, " %s %s\n",
> - (sc1d & 0x08) ? "Error " :
> - ((sc1d & 0x05) == 0x05) ? "Not My INTR " :
> - (sc1d & 0x04) ? "Interrupting" :
> - (sc1d & 0x02) ? "FIFO Full " :
> - (sc1d & 0x01) ? "FIFO Empty " : "????????????",
> - (sc1d & 0x80) ? "Error " :
> - ((sc1d & 0x50) == 0x50) ? "Not My INTR " :
> - (sc1d & 0x40) ? "Interrupting" :
> - (sc1d & 0x20) ? "FIFO Full " :
> - (sc1d & 0x10) ? "FIFO Empty " : "????????????");
> p += sprintf(p, "--------------- drive0 --------- drive1 -------- drive0 ---------- drive1 ------\n");
> p += sprintf(p, "DMA enabled: %s %s %s %s\n",
> - (c0&0x20)?"yes":"no ",(c0&0x40)?"yes":"no ",(c1&0x20)?"yes":"no ",(c1&0x40)?"yes":"no ");
> - p += sprintf(p, "DMA Mode: %s %s %s %s\n",
> - pdc202xx_ultra_verbose(reg60h, (reg50h & pmask)),
> - pdc202xx_ultra_verbose(reg64h, (reg50h & pmask)),
> - pdc202xx_ultra_verbose(reg68h, (reg50h & smask)),
> - pdc202xx_ultra_verbose(reg6ch, (reg50h & smask)));
> - p += sprintf(p, "PIO Mode: %s %s %s %s\n",
> - pdc202xx_pio_verbose(reg60h),
> - pdc202xx_pio_verbose(reg64h),
> - pdc202xx_pio_verbose(reg68h),
> - pdc202xx_pio_verbose(reg6ch));
> + (id[0]!=NULL && (c0&0x20))?"yes":"no ",(id[1]!=NULL && (c0&0x40))?"yes":"no ",
> + (id[2]!=NULL && (c1&0x20))?"yes":"no ",(id[3]!=NULL && (c1&0x40))?"yes":"no ");
> + for( hd = 0; hd < 4 ; hd++) {
> + if (id[hd] == NULL)
> + continue;
> + word88 = id[hd]->dma_ultra;
> + for ( i = 7 ; i >= 0 ; i--)
> + if (word88 >> (i+8)) {
> + udmasel[hd] = i; /* get select UDMA mode */
> + break;
> + }
> + piosel[hd] = (id[hd]->eide_pio_modes >= 0x02) ? 4 : 3;
> + }
> + p += sprintf(p, "UDMA Mode: %d %d %d %d\n",
> + udmasel[0], udmasel[1], udmasel[2], udmasel[3]);
> + p += sprintf(p, "PIO Mode: %d %d %d %d\n",
> + piosel[0], piosel[1], piosel[2], piosel[3]);
> #if 0
> p += sprintf(p, "--------------- Can ATAPI DMA ---------------\n");
> #endif
> return (char *)p;
> }
>
> -static char * pdc202xx_info_new (char *buf, struct pci_dev *dev)
> -{
> - char *p = buf;
> -// u32 bibma = pci_resource_start(dev, 4);
> -
> -// u32 reg60h = 0, reg64h = 0, reg68h = 0, reg6ch = 0;
> -// u16 reg50h = 0, word88 = 0;
> -// int udmasel[4]={0,0,0,0}, piosel[4]={0,0,0,0}, i=0, hd=0;
> -
> - switch(dev->device) {
> - case PCI_DEVICE_ID_PROMISE_20276:
> - p += sprintf(p, "\n PDC20276 Chipset.\n");
> - break;
> - case PCI_DEVICE_ID_PROMISE_20275:
> - p += sprintf(p, "\n PDC20275 Chipset.\n");
> - break;
> - case PCI_DEVICE_ID_PROMISE_20269:
> - p += sprintf(p, "\n PDC20269 TX2 Chipset.\n");
> - break;
> - case PCI_DEVICE_ID_PROMISE_20268:
> - case PCI_DEVICE_ID_PROMISE_20268R:
> - p += sprintf(p, "\n PDC20268 TX2 Chipset.\n");
> - break;
> -default:
> - p += sprintf(p, "\n PDC202XX Chipset.\n");
> - break;
> - }
> - return (char *)p;
> -}
> -
> static int pdc202xx_get_info (char *buffer, char **addr, off_t offset, int count)
> {
> char *p = buffer;
> - switch(bmide_dev->device) {
> - case PCI_DEVICE_ID_PROMISE_20276:
> - case PCI_DEVICE_ID_PROMISE_20275:
> - case PCI_DEVICE_ID_PROMISE_20269:
> - case PCI_DEVICE_ID_PROMISE_20268:
> - case PCI_DEVICE_ID_PROMISE_20268R:
> - p = pdc202xx_info_new(buffer, bmide_dev);
> - break;
> - default:
> - p = pdc202xx_info(buffer, bmide_dev);
> - break;
> - }
> +
> + p = pdc202xx_info(buffer, bmide_dev);
> return p-buffer; /* => must be less than 4k! */
> }
> #endif /* defined(DISPLAY_PDC202XX_TIMINGS) && defined(CONFIG_PROC_FS) */
> @@ -259,7 +203,9 @@
> 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",
> @@ -404,7 +350,7 @@
> struct pci_dev *dev = hwif->pci_dev;
>
> unsigned int drive_conf;
> - int err;
> + int err = 0, i = 0, j = hwif->channel ? 2 : 0 ;
> byte drive_pci, AP, BP, CP, DP;
> byte TA = 0, TB = 0, TC = 0;
>
> @@ -458,6 +404,10 @@
> pci_read_config_byte(dev, (drive_pci)|0x01, &BP);
> pci_read_config_byte(dev, (drive_pci)|0x02, &CP);
>
> + for ( i = 0; i < 2; i++)
> + if (hwif->drives[i].present)
> + id[i+j] = hwif->drives[i].id; /* get identify structs */
> +
> switch(speed) {
> #ifdef CONFIG_BLK_DEV_IDEDMA
> /* case XFER_UDMA_6: */
> @@ -535,142 +485,157 @@
> #endif /* CONFIG_BLK_DEV_IDEDMA */
> byte thold = 0x10;
> byte adj = (drive->dn%2) ? 0x08 : 0x00;
> -
> + int set_speed = 0, i=0, j=hwif->channel ? 2:0;
> int err;
>
> -#ifdef CONFIG_BLK_DEV_IDEDMA
> + /* Setting tHOLD bit to 0 if using UDMA mode 2 */
> if (speed == XFER_UDMA_2) {
> OUT_BYTE((thold + adj), indexreg);
> OUT_BYTE((IN_BYTE(datareg) & 0x7f), datareg);
> }
> - switch (speed) {
> - case XFER_UDMA_7:
> - speed = XFER_UDMA_6;
> - case XFER_UDMA_6:
> - OUT_BYTE((0x10 + adj), indexreg);
> - OUT_BYTE(0x1a, datareg);
> - OUT_BYTE((0x11 + adj), indexreg);
> - OUT_BYTE(0x01, datareg);
> - OUT_BYTE((0x12 + adj), indexreg);
> - OUT_BYTE(0xcb, datareg);
> - break;
> - case XFER_UDMA_5:
> - OUT_BYTE((0x10 + adj), indexreg);
> - OUT_BYTE(0x1a, datareg);
> - OUT_BYTE((0x11 + adj), indexreg);
> - OUT_BYTE(0x02, datareg);
> - OUT_BYTE((0x12 + adj), indexreg);
> - OUT_BYTE(0xcb, datareg);
> - break;
> - case XFER_UDMA_4:
> - OUT_BYTE((0x10 + adj), indexreg);
> - OUT_BYTE(0x1a, datareg);
> - OUT_BYTE((0x11 + adj), indexreg);
> - OUT_BYTE(0x03, datareg);
> - OUT_BYTE((0x12 + adj), indexreg);
> - OUT_BYTE(0xcd, datareg);
> - break;
> - case XFER_UDMA_3:
> - OUT_BYTE((0x10 + adj), indexreg);
> - OUT_BYTE(0x1a, datareg);
> - OUT_BYTE((0x11 + adj), indexreg);
> - OUT_BYTE(0x05, datareg);
> - OUT_BYTE((0x12 + adj), indexreg);
> - OUT_BYTE(0xcd, datareg);
> - break;
> - case XFER_UDMA_2:
> - OUT_BYTE((0x10 + adj), indexreg);
> - OUT_BYTE(0x2a, datareg);
> - OUT_BYTE((0x11 + adj), indexreg);
> - OUT_BYTE(0x07, datareg);
> - OUT_BYTE((0x12 + adj), indexreg);
> - OUT_BYTE(0xcd, datareg);
> - break;
> - case XFER_UDMA_1:
> - OUT_BYTE((0x10 + adj), indexreg);
> - OUT_BYTE(0x3a, datareg);
> - OUT_BYTE((0x11 + adj), indexreg);
> - OUT_BYTE(0x0a, datareg);
> - OUT_BYTE((0x12 + adj), indexreg);
> - OUT_BYTE(0xd0, datareg);
> - break;
> - case XFER_UDMA_0:
> - OUT_BYTE((0x10 + adj), indexreg);
> - OUT_BYTE(0x4a, datareg);
> - OUT_BYTE((0x11 + adj), indexreg);
> - OUT_BYTE(0x0f, datareg);
> - OUT_BYTE((0x12 + adj), indexreg);
> - OUT_BYTE(0xd5, datareg);
> - break;
> - case XFER_MW_DMA_2:
> - OUT_BYTE((0x0e + adj), indexreg);
> - OUT_BYTE(0x69, datareg);
> - OUT_BYTE((0x0f + adj), indexreg);
> - OUT_BYTE(0x25, datareg);
> - break;
> - case XFER_MW_DMA_1:
> - OUT_BYTE((0x0e + adj), indexreg);
> - OUT_BYTE(0x6b, datareg);
> - OUT_BYTE((0x0f+ adj), indexreg);
> - OUT_BYTE(0x27, datareg);
> - break;
> - case XFER_MW_DMA_0:
> - OUT_BYTE((0x0e + adj), indexreg);
> - OUT_BYTE(0xdf, datareg);
> - OUT_BYTE((0x0f + adj), indexreg);
> - OUT_BYTE(0x5f, datareg);
> - break;
> -#else
> - switch (speed) {
> -#endif /* CONFIG_BLK_DEV_IDEDMA */
> - case XFER_PIO_4:
> - OUT_BYTE((0x0c + adj), indexreg);
> - OUT_BYTE(0x23, datareg);
> - OUT_BYTE((0x0d + adj), indexreg);
> - OUT_BYTE(0x09, datareg);
> - OUT_BYTE((0x13 + adj), indexreg);
> - OUT_BYTE(0x25, datareg);
> - break;
> - case XFER_PIO_3:
> - OUT_BYTE((0x0c + adj), indexreg);
> - OUT_BYTE(0x27, datareg);
> - OUT_BYTE((0x0d + adj), indexreg);
> - OUT_BYTE(0x0d, datareg);
> - OUT_BYTE((0x13 + adj), indexreg);
> - OUT_BYTE(0x35, datareg);
> - break;
> - case XFER_PIO_2:
> - OUT_BYTE((0x0c + adj), indexreg);
> - OUT_BYTE(0x23, datareg);
> - OUT_BYTE((0x0d + adj), indexreg);
> - OUT_BYTE(0x26, datareg);
> - OUT_BYTE((0x13 + adj), indexreg);
> - OUT_BYTE(0x64, datareg);
> - break;
> - case XFER_PIO_1:
> - OUT_BYTE((0x0c + adj), indexreg);
> - OUT_BYTE(0x46, datareg);
> - OUT_BYTE((0x0d + adj), indexreg);
> - OUT_BYTE(0x29, datareg);
> - OUT_BYTE((0x13 + adj), indexreg);
> - OUT_BYTE(0xa4, datareg);
> - break;
> - case XFER_PIO_0:
> - OUT_BYTE((0x0c + adj), indexreg);
> - OUT_BYTE(0xfb, datareg);
> - OUT_BYTE((0x0d + adj), indexreg);
> - OUT_BYTE(0x2b, datareg);
> - OUT_BYTE((0x13 + adj), indexreg);
> - OUT_BYTE(0xac, datareg);
> - break;
> - default:
> - }
> +
> + /* We need to set ATA133 timing if ATA133 drives exist */
> + if (speed>=XFER_UDMA_6)
> + set_speed=1;
>
> if (!drive->init_speed)
> drive->init_speed = speed;
> +#if PDC202XX_DEBUG_DRIVE_INFO
> + printk("%s: Before set_feature = %s, word88 = %#x\n",
> + drive->name, ide_xfer_verbose(speed), drive->id->dma_ultra );
> +#endif /* PDC202XX_DEBUG_DRIVE_INFO */
> err = ide_config_drive_speed(drive, speed);
> - drive->current_speed = speed;
> -
> + drive->current_speed = speed;
> + for ( i = 0 ; i < 2 ; i++)
> + if (hwif->drives[i].present) {
> + id[i+j] = hwif->drives[i].id; /* get identify structs */
> + speed_rate[i+j] = speed; /* get current speed */
> + }
> + if (set_speed) {
> + for (i=0; i<4; i++) {
> + if (id[i]==NULL)
> + continue;
> + switch(speed_rate[i]) {
> +#ifdef CONFIG_BLK_DEV_IDEDMA
> + case XFER_UDMA_6:
> + OUT_BYTE((0x10 + adj), indexreg);
> + OUT_BYTE(0x1a, datareg);
> + OUT_BYTE((0x11 + adj), indexreg);
> + OUT_BYTE(0x01, datareg);
> + OUT_BYTE((0x12 + adj), indexreg);
> + OUT_BYTE(0xcb, datareg);
> + break;
> + case XFER_UDMA_5:
> + OUT_BYTE((0x10 + adj), indexreg);
> + OUT_BYTE(0x1a, datareg);
> + OUT_BYTE((0x11 + adj), indexreg);
> + OUT_BYTE(0x02, datareg);
> + OUT_BYTE((0x12 + adj), indexreg);
> + OUT_BYTE(0xcb, datareg);
> + break;
> + case XFER_UDMA_4:
> + OUT_BYTE((0x10 + adj), indexreg);
> + OUT_BYTE(0x1a, datareg);
> + OUT_BYTE((0x11 + adj), indexreg);
> + OUT_BYTE(0x03, datareg);
> + OUT_BYTE((0x12 + adj), indexreg);
> + OUT_BYTE(0xcd, datareg);
> + break;
> + case XFER_UDMA_3:
> + OUT_BYTE((0x10 + adj), indexreg);
> + OUT_BYTE(0x1a, datareg);
> + OUT_BYTE((0x11 + adj), indexreg);
> + OUT_BYTE(0x05, datareg);
> + OUT_BYTE((0x12 + adj), indexreg);
> + OUT_BYTE(0xcd, datareg);
> + break;
> + case XFER_UDMA_2:
> + OUT_BYTE((0x10 + adj), indexreg);
> + OUT_BYTE(0x2a, datareg);
> + OUT_BYTE((0x11 + adj), indexreg);
> + OUT_BYTE(0x07, datareg);
> + OUT_BYTE((0x12 + adj), indexreg);
> + OUT_BYTE(0xcd, datareg);
> + break;
> + case XFER_UDMA_1:
> + OUT_BYTE((0x10 + adj), indexreg);
> + OUT_BYTE(0x3a, datareg);
> + OUT_BYTE((0x11 + adj), indexreg);
> + OUT_BYTE(0x0a, datareg);
> + OUT_BYTE((0x12 + adj), indexreg);
> + OUT_BYTE(0xd0, datareg);
> + break;
> + case XFER_UDMA_0:
> + OUT_BYTE((0x10 + adj), indexreg);
> + OUT_BYTE(0x4a, datareg);
> + OUT_BYTE((0x11 + adj), indexreg);
> + OUT_BYTE(0x0f, datareg);
> + OUT_BYTE((0x12 + adj), indexreg);
> + OUT_BYTE(0xd5, datareg);
> + break;
> + case XFER_MW_DMA_2:
> + OUT_BYTE((0x0e + adj), indexreg);
> + OUT_BYTE(0x69, datareg);
> + OUT_BYTE((0x0f + adj), indexreg);
> + OUT_BYTE(0x25, datareg);
> + break;
> + case XFER_MW_DMA_1:
> + OUT_BYTE((0x0e + adj), indexreg);
> + OUT_BYTE(0x6b, datareg);
> + OUT_BYTE((0x0f+ adj), indexreg);
> + OUT_BYTE(0x27, datareg);
> + break;
> + case XFER_MW_DMA_0:
> + OUT_BYTE((0x0e + adj), indexreg);
> + OUT_BYTE(0xdf, datareg);
> + OUT_BYTE((0x0f + adj), indexreg);
> + OUT_BYTE(0x5f, datareg);
> + break;
> +#endif /* CONFIG_BLK_DEV_IDEDMA */
> + case XFER_PIO_4:
> + OUT_BYTE((0x0c + adj), indexreg);
> + OUT_BYTE(0x23, datareg);
> + OUT_BYTE((0x0d + adj), indexreg);
> + OUT_BYTE(0x09, datareg);
> + OUT_BYTE((0x13 + adj), indexreg);
> + OUT_BYTE(0x25, datareg);
> + break;
> + case XFER_PIO_3:
> + OUT_BYTE((0x0c + adj), indexreg);
> + OUT_BYTE(0x27, datareg);
> + OUT_BYTE((0x0d + adj), indexreg);
> + OUT_BYTE(0x0d, datareg);
> + OUT_BYTE((0x13 + adj), indexreg);
> + OUT_BYTE(0x35, datareg);
> + break;
> + case XFER_PIO_2:
> + OUT_BYTE((0x0c + adj), indexreg);
> + OUT_BYTE(0x23, datareg);
> + OUT_BYTE((0x0d + adj), indexreg);
> + OUT_BYTE(0x26, datareg);
> + OUT_BYTE((0x13 + adj), indexreg);
> + OUT_BYTE(0x64, datareg);
> + break;
> + case XFER_PIO_1:
> + OUT_BYTE((0x0c + adj), indexreg);
> + OUT_BYTE(0x46, datareg);
> + OUT_BYTE((0x0d + adj), indexreg);
> + OUT_BYTE(0x29, datareg);
> + OUT_BYTE((0x13 + adj), indexreg);
> + OUT_BYTE(0xa4, datareg);
> + break;
> + case XFER_PIO_0:
> + OUT_BYTE((0x0c + adj), indexreg);
> + OUT_BYTE(0xfb, datareg);
> + OUT_BYTE((0x0d + adj), indexreg);
> + OUT_BYTE(0x2b, datareg);
> + OUT_BYTE((0x13 + adj), indexreg);
> + OUT_BYTE(0xac, datareg);
> + break;
> + default:
> + }
> + }
> + }
> return err;
> }
>
> @@ -709,7 +674,7 @@
> byte iordy = 0x13;
> byte adj = (drive->dn%2) ? 0x08 : 0x00;
> byte cable = 0;
> - byte jumpbit = 0;
> + byte new_chip = 0;
> byte unit = (drive->select.b.unit & 0x01);
> unsigned int drive_conf;
> byte drive_pci = 0;
> @@ -717,12 +682,12 @@
> byte AP;
> unsigned short EP;
> byte CLKSPD = 0;
> + byte clockreg = high_16 + 0x11;
> byte udma_33 = ultra;
> -// byte udma_33 = ultra ? (IN_BYTE(high_16 + 0x001f) & 1) : 0;
> byte udma_66 = ((eighty_ninty_three(drive)) && udma_33) ? 1 : 0;
> byte udma_100 = 0;
> byte udma_133 = 0;
> - byte mask = hwif->channel ? 0x08 : 0x02;
> + byte mask = hwif->channel ? 0x08 : 0x02;
> unsigned short c_mask = hwif->channel ? (1<<11) : (1<<10);
>
> byte ultra_66 = ((id->dma_ultra & 0x0010) ||
> @@ -740,40 +705,34 @@
> udma_100 = (udma_66) ? 1 : 0;
> OUT_BYTE(0x0b, (hwif->dma_base + 1));
> cable = ((IN_BYTE((hwif->dma_base + 3)) & 0x04));
> - jumpbit = 1;
> - break;
> - case PCI_DEVICE_ID_PROMISE_20268R:
> - udma_100 = 1;
> - udma_66 = 1;
> - OUT_BYTE(0x0b, (hwif->dma_base + 1));
> - cable = ((IN_BYTE((hwif->dma_base + 3)) & 0x04));
> - jumpbit = 1;
> + new_chip = 1;
> break;
> case PCI_DEVICE_ID_PROMISE_20268:
> + case PCI_DEVICE_ID_PROMISE_20270:
> udma_100 = (udma_66) ? 1 : 0;
> OUT_BYTE(0x0b, (hwif->dma_base + 1));
> cable = ((IN_BYTE((hwif->dma_base + 3)) & 0x04));
> - jumpbit = 1;
> + new_chip = 1;
> break;
> case PCI_DEVICE_ID_PROMISE_20267:
> case PCI_DEVICE_ID_PROMISE_20265:
> udma_100 = (udma_66) ? 1 : 0;
> pci_read_config_word(dev, 0x50, &EP);
> cable = (EP & c_mask);
> - jumpbit = 0;
> + new_chip = 0;
> + CLKSPD = IN_BYTE(clockreg);
> break;
> case PCI_DEVICE_ID_PROMISE_20262:
> pci_read_config_word(dev, 0x50, &EP);
> cable = (EP & c_mask);
> - jumpbit = 0;
> + new_chip = 0;
> + CLKSPD = IN_BYTE(clockreg);
> break;
> default:
> - udma_100 = 0; udma_133 = 0; cable = 1; jumpbit = 0;
> + udma_100 = 0; udma_133 = 0; cable = 0; new_chip = 1;
> break;
> }
>
> - if (!jumpbit)
> - CLKSPD = IN_BYTE(high_16 + 0x11);
> /*
> * Set the control register to use the 66Mhz system
> * clock for UDMA 3/4 mode operation. If one drive on
> @@ -794,8 +753,8 @@
> #endif /* DEBUG */
> /* Primary : zero out second bit */
> /* Secondary : zero out fourth bit */
> - if (!jumpbit)
> - OUT_BYTE(CLKSPD & ~mask, (high_16 + 0x11));
> + //if (!new_chip)
> + OUT_BYTE(CLKSPD & ~mask, clockreg);
> printk("Warning: %s channel requires an 80-pin cable for operation.\n", hwif->channel ? "Secondary":"Primary");
> printk("%s reduced to Ultra33 mode.\n", drive->name);
> udma_66 = 0; udma_100 = 0; udma_133 = 0;
> @@ -811,27 +770,17 @@
> & 0x0020) ||
> (hwif->drives[!(drive->dn%2)].id->dma_ultra & 0x0010) ||
> (hwif->drives[!(drive->dn%2)].id->dma_ultra & 0x0008)) {
> - if (!jumpbit)
> - OUT_BYTE(CLKSPD | mask, (high_16 + 0x11));
> + OUT_BYTE(CLKSPD | mask, clockreg);
> } else {
> - if (!jumpbit)
> - OUT_BYTE(CLKSPD & ~mask, (high_16 + 0x11));
> + OUT_BYTE(CLKSPD & ~mask, clockreg);
> }
> } else { /* udma4 drive by itself */
> - if (!jumpbit)
> - OUT_BYTE(CLKSPD | mask, (high_16 + 0x11));
> + OUT_BYTE(CLKSPD | mask, clockreg);
> }
> }
> }
>
> - if (jumpbit) {
> - if (drive->media != ide_disk) return ide_dma_off_quietly;
> - if (id->capability & 4) { /* IORDY_EN & PREFETCH_EN */
> - OUT_BYTE((iordy + adj), indexreg);
> - OUT_BYTE((IN_BYTE(datareg)|0x03), datareg);
> - }
> - goto jumpbit_is_set;
> - }
> + if (new_chip) goto chipset_is_set;
>
> switch(drive->dn) {
> case 0: drive_pci = 0x60;
> @@ -874,16 +823,23 @@
>
> chipset_is_set:
>
> - if (drive->media != ide_disk) return ide_dma_off_quietly;
> -
> - pci_read_config_byte(dev, (drive_pci), &AP);
> - if (id->capability & 4) /* IORDY_EN */
> - pci_write_config_byte(dev, (drive_pci), AP|IORDY_EN);
> - pci_read_config_byte(dev, (drive_pci), &AP);
> - if (drive->media == ide_disk) /* PREFETCH_EN */
> - pci_write_config_byte(dev, (drive_pci), AP|PREFETCH_EN);
> -
> -jumpbit_is_set:
> + if (drive->media != ide_disk)
> + return ide_dma_off_quietly;
> +
> + if (new_chip) {
> + if (id->capability & 4) { /* IORDY_EN & PREFETCH_EN */
> + OUT_BYTE((iordy + adj), indexreg);
> + OUT_BYTE((IN_BYTE(datareg)|0x03), datareg);
> + }
> + }
> + else {
> + pci_read_config_byte(dev, (drive_pci), &AP);
> + if (id->capability & 4) /* IORDY_EN */
> + pci_write_config_byte(dev, (drive_pci), AP|IORDY_EN);
> + pci_read_config_byte(dev, (drive_pci), &AP);
> + if (drive->media == ide_disk) /* PREFETCH_EN */
> + pci_write_config_byte(dev, (drive_pci), AP|PREFETCH_EN);
> + }
>
> if ((id->dma_ultra & 0x0040)&&(udma_133)) speed = XFER_UDMA_6;
> else if ((id->dma_ultra & 0x0020)&&(udma_100)) speed = XFER_UDMA_5;
> @@ -895,12 +851,12 @@
> else if (id->dma_mword & 0x0004) speed = XFER_MW_DMA_2;
> else if (id->dma_mword & 0x0002) speed = XFER_MW_DMA_1;
> else if (id->dma_mword & 0x0001) speed = XFER_MW_DMA_0;
> - else if ((id->dma_1word & 0x0004)&&(!jumpbit)) speed = XFER_SW_DMA_2;
> - else if ((id->dma_1word & 0x0002)&&(!jumpbit)) speed = XFER_SW_DMA_1;
> - else if ((id->dma_1word & 0x0001)&&(!jumpbit)) speed = XFER_SW_DMA_0;
> + else if ((id->dma_1word & 0x0004)&&(!new_chip)) speed = XFER_SW_DMA_2;
> + else if ((id->dma_1word & 0x0002)&&(!new_chip)) speed = XFER_SW_DMA_1;
> + else if ((id->dma_1word & 0x0001)&&(!new_chip)) speed = XFER_SW_DMA_0;
> else {
> /* restore original pci-config space */
> - if (!jumpbit)
> + if (!new_chip)
> pci_write_config_dword(dev, drive_pci, drive_conf);
> return ide_dma_off_quietly;
> }
> @@ -981,25 +937,24 @@
> byte sc1d = 0;
> byte newchip = 0;
> byte clock = 0;
> - byte hardware48hack = 0;
> + byte hardware48fix = 0;
> ide_hwif_t *hwif = HWIF(drive);
> struct pci_dev *dev = hwif->pci_dev;
> unsigned long high_16 = pci_resource_start(dev, 4);
> - unsigned long atapi_reg = high_16 + (hwif->channel ? 0x24 : 0x00);
> unsigned long dma_base = hwif->dma_base;
> + unsigned long atapi_port= hwif->channel ? high_16+0x24 : high_16+0x20;
>
> switch (dev->device) {
> case PCI_DEVICE_ID_PROMISE_20276:
> case PCI_DEVICE_ID_PROMISE_20275:
> case PCI_DEVICE_ID_PROMISE_20269:
> - case PCI_DEVICE_ID_PROMISE_20268R:
> case PCI_DEVICE_ID_PROMISE_20268:
> + case PCI_DEVICE_ID_PROMISE_20270:
> newchip = 1;
> break;
> case PCI_DEVICE_ID_PROMISE_20267:
> case PCI_DEVICE_ID_PROMISE_20265:
> - case PCI_DEVICE_ID_PROMISE_20262:
> - hardware48hack = 1;
> + hardware48fix = 1;
> clock = IN_BYTE(high_16 + 0x11);
> default:
> break;
> @@ -1014,21 +969,29 @@
> * The Promise Ultra33 doesn't work correctly when
> * we do this part before issuing the drive cmd.
> */
> - if ((drive->addressing) && (hardware48hack)) {
> + /* Enable ATAPI UDMA port for 48bit data on PDC20267 */
> + if ((drive->addressing) && (hardware48fix)) {
> struct request *rq = HWGROUP(drive)->rq;
> unsigned long word_count = 0;
> -
> - outb(clock|(hwif->channel ? 0x08 : 0x02), high_16 + 0x11);
> + unsigned long hankval = 0;
> + byte clockreg = high_16 + 0x11;
> +
> + OUT_BYTE(clock|(hwif->channel ? 0x08:0x02), clockreg);
> word_count = (rq->nr_sectors << 8);
> - word_count = (rq->cmd == READ) ? word_count | 0x05000000 : word_count | 0x06000000;
> - outl(word_count, atapi_reg);
> - }
> + hankval = (rq->cmd == READ) ? 0x05<<24 : 0x06<<24;
> + hankval = hankval | word_count ;
> + outl(hankval, atapi_port);
> + }
> break;
> case ide_dma_end:
> - if ((drive->addressing) && (hardware48hack)) {
> - outl(0, atapi_reg); /* zero out extra */
> - clock = IN_BYTE(high_16 + 0x11);
> - OUT_BYTE(clock & ~(hwif->channel ? 0x08:0x02), high_16 + 0x11);
> + /* Disable ATAPI UDMA port for 48bit data on PDC20267 */
> + if ((drive->addressing) && (hardware48fix)) {
> + unsigned long hankval = 0;
> + byte clockreg = high_16 + 0x11;
> +
> + outl(hankval, atapi_port); /* zero out extra */
> + clock = IN_BYTE(clockreg);
> + OUT_BYTE(clock & ~(hwif->channel ? 0x08:0x02), clockreg);
> }
> break;
> case ide_dma_test_irq: /* returns 1 if dma irq issued, 0 otherwise */
> @@ -1059,7 +1022,7 @@
> }
> #endif /* CONFIG_BLK_DEV_IDEDMA */
>
> -void pdc202xx_new_reset (ide_drive_t *drive)
> +void pdc202xx_reset (ide_drive_t *drive)
> {
> OUT_BYTE(0x04,IDE_CONTROL_REG);
> mdelay(1000);
> @@ -1069,19 +1032,6 @@
> HWIF(drive)->channel ? "Secondary" : "Primary");
> }
>
> -void pdc202xx_reset (ide_drive_t *drive)
> -{
> - unsigned long high_16 = pci_resource_start(HWIF(drive)->pci_dev, 4);
> - byte udma_speed_flag = IN_BYTE(high_16 + 0x001f);
> -
> - OUT_BYTE(udma_speed_flag | 0x10, high_16 + 0x001f);
> - mdelay(100);
> - OUT_BYTE(udma_speed_flag & ~0x10, high_16 + 0x001f);
> - mdelay(2000); /* 2 seconds ?! */
> - printk("PDC202XX: %s channel reset.\n",
> - HWIF(drive)->channel ? "Secondary" : "Primary");
> -}
> -
> /*
> * Since SUN Cobalt is attempting to do this operation, I should disclose
> * this has been a long time ago Thu Jul 27 16:40:57 2000 was the patch date
> @@ -1114,59 +1064,17 @@
> byte udma_speed_flag = IN_BYTE(high_16 + 0x001f);
> byte primary_mode = IN_BYTE(high_16 + 0x001a);
> byte secondary_mode = IN_BYTE(high_16 + 0x001b);
> - byte newchip = 0;
> +
> + OUT_BYTE(udma_speed_flag | 0x10, high_16 + 0x001f);
> + mdelay(100);
> + OUT_BYTE(udma_speed_flag & ~0x10, high_16 + 0x001f);
> + mdelay(2000); /* 2 seconds ?! */
>
> if (dev->resource[PCI_ROM_RESOURCE].start) {
> pci_write_config_dword(dev, PCI_ROM_ADDRESS, dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE);
> printk("%s: ROM enabled at 0x%08lx\n", name, dev->resource[PCI_ROM_RESOURCE].start);
> }
> -
> - switch (dev->device) {
> - case PCI_DEVICE_ID_PROMISE_20276:
> - case PCI_DEVICE_ID_PROMISE_20275:
> - case PCI_DEVICE_ID_PROMISE_20269:
> - case PCI_DEVICE_ID_PROMISE_20268R:
> - case PCI_DEVICE_ID_PROMISE_20268:
> - newchip = 1;
> - break;
> - case PCI_DEVICE_ID_PROMISE_20267:
> - case PCI_DEVICE_ID_PROMISE_20265:
> - OUT_BYTE(udma_speed_flag | 0x10, high_16 + 0x001f);
> - mdelay(100);
> - OUT_BYTE(udma_speed_flag & ~0x10, high_16 + 0x001f);
> - mdelay(2000); /* 2 seconds ?! */
> - break;
> - case PCI_DEVICE_ID_PROMISE_20262:
> - /*
> - * software reset - this is required because the bios
> - * will set UDMA timing on if the hdd supports it. The
> - * user may want to turn udma off. A bug in the pdc20262
> - * is that it cannot handle a downgrade in timing from
> - * UDMA to DMA. Disk accesses after issuing a set
> - * feature command will result in errors. A software
> - * reset leaves the timing registers intact,
> - * but resets the drives.
> - */
> - OUT_BYTE(udma_speed_flag | 0x10, high_16 + 0x001f);
> - mdelay(100);
> - OUT_BYTE(udma_speed_flag & ~0x10, high_16 + 0x001f);
> - mdelay(2000); /* 2 seconds ?! */
> - default:
> - if ((dev->class >> 8) != PCI_CLASS_STORAGE_IDE) {
> - byte irq = 0, irq2 = 0;
> - pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq);
> - pci_read_config_byte(dev, (PCI_INTERRUPT_LINE)|0x80, &irq2); /* 0xbc */
> - if (irq != irq2) {
> - pci_write_config_byte(dev, (PCI_INTERRUPT_LINE)|0x80, irq); /* 0xbc */
> - printk("%s: pci-config space interrupt mirror fixed.\n", name);
> - }
> - }
> - break;
> - }
> -
> - if (newchip)
> - goto fttk_tx_series;
> -
> +
> printk("%s: (U)DMA Burst Bit %sABLED " \
> "Primary %s Mode " \
> "Secondary %s Mode.\n",
> @@ -1199,8 +1107,6 @@
> }
> #endif /* CONFIG_PDC202XX_MASTER */
>
> -fttk_tx_series:
> -
> #if defined(DISPLAY_PDC202XX_TIMINGS) && defined(CONFIG_PROC_FS)
> if (!pdc202xx_proc) {
> pdc202xx_proc = 1;
> @@ -1216,17 +1122,19 @@
> unsigned short mask = (hwif->channel) ? (1<<11) : (1<<10);
> unsigned short CIS;
>
> - switch(hwif->pci_dev->device) {
> + switch(hwif->pci_dev->device) {
> case PCI_DEVICE_ID_PROMISE_20276:
> case PCI_DEVICE_ID_PROMISE_20275:
> case PCI_DEVICE_ID_PROMISE_20269:
> case PCI_DEVICE_ID_PROMISE_20268:
> - case PCI_DEVICE_ID_PROMISE_20268R:
> + case PCI_DEVICE_ID_PROMISE_20270:
> OUT_BYTE(0x0b, (hwif->dma_base + 1));
> return (!(IN_BYTE((hwif->dma_base + 3)) & 0x04));
> + /* check 80pin cable */
> default:
> pci_read_config_word(hwif->pci_dev, 0x50, &CIS);
> return (!(CIS & mask));
> + /* check 80pin cable */
> }
> }
>
> @@ -1234,21 +1142,20 @@
> {
> hwif->tuneproc = &pdc202xx_tune_drive;
> hwif->quirkproc = &pdc202xx_quirkproc;
> + hwif->resetproc = &pdc202xx_reset;
>
> switch(hwif->pci_dev->device) {
> case PCI_DEVICE_ID_PROMISE_20276:
> case PCI_DEVICE_ID_PROMISE_20275:
> case PCI_DEVICE_ID_PROMISE_20269:
> case PCI_DEVICE_ID_PROMISE_20268:
> - case PCI_DEVICE_ID_PROMISE_20268R:
> + case PCI_DEVICE_ID_PROMISE_20270:
> hwif->speedproc = &pdc202xx_new_tune_chipset;
> - hwif->resetproc = &pdc202xx_new_reset;
> break;
> case PCI_DEVICE_ID_PROMISE_20267:
> case PCI_DEVICE_ID_PROMISE_20265:
> case PCI_DEVICE_ID_PROMISE_20262:
> hwif->busproc = &pdc202xx_tristate;
> - hwif->resetproc = &pdc202xx_reset;
> case PCI_DEVICE_ID_PROMISE_20246:
> hwif->speedproc = &pdc202xx_tune_chipset;
> default:
> diff -urN linux-2.4.19pre10/include/linux/pci_ids.h linux/include/linux/pci_ids.h
> --- linux-2.4.19pre10/include/linux/pci_ids.h Tue Jun 18 11:35:45 2002
> +++ linux/include/linux/pci_ids.h Fri Jul 5 01:30:07 2002
> @@ -606,7 +606,7 @@
> #define PCI_DEVICE_ID_PROMISE_20246 0x4d33
> #define PCI_DEVICE_ID_PROMISE_20262 0x4d38
> #define PCI_DEVICE_ID_PROMISE_20268 0x4d68
> -#define PCI_DEVICE_ID_PROMISE_20268R 0x6268
> +#define PCI_DEVICE_ID_PROMISE_20270 0x6268
> #define PCI_DEVICE_ID_PROMISE_20269 0x4d69
> #define PCI_DEVICE_ID_PROMISE_20271 0x6269
> #define PCI_DEVICE_ID_PROMISE_20275 0x1275
> -
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
>

Andre Hedrick
LAD Storage Consulting Group

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Mon Jul 15 2002 - 22:00:20 EST