------=_NextPart_000_0081_01C20307.3C49F750
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: 7bit
Would you please pointing the ioctl() support in our patch more detail?
Attach is our latest patch for Ultra series.
We can discuss that if you got any info.
Best Regards
Hank Yang
----- Original Message -----
From: Hileman, Larry
To: 'hanky@promise.com.tw'
Cc: 'linux-kernel@vger.kernel.org'
Sent: 2002?5?24? ?? 05:17
Subject: 20275 linux driver patch dated 3/7/2002
We are seeing some significant problems regarding ioctl() support in
this PDC patch on our 2.4.18 kernel.
Is there a newer patch available, if so, where can I find it? can you
provide the
URL or attach it to a response.
I am sorry that we have not isolated it to the point of giving meaningful
error
messages, but we will work on that after we get the most recent patch.
Lawrence Hileman
Quantum.
------=_NextPart_000_0081_01C20307.3C49F750
Content-Type: application/octet-stream;
name="ultra1207-2.4.18.patch"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="ultra1207-2.4.18.patch"
Binary files linux-2.4.18.org/drivers/ide/.ide.c.swp and =
linux/drivers/ide/.ide.c.swp differ=0A=
diff -urN linux-2.4.18.org/drivers/ide/ide-disk.c =
linux/drivers/ide/ide-disk.c=0A=
--- linux-2.4.18.org/drivers/ide/ide-disk.c Sat Dec 22 01:41:54 2001=0A=
+++ linux/drivers/ide/ide-disk.c Wed May 22 17:47:44 2002=0A=
@@ -28,6 +28,11 @@=0A=
* added UDMA 3/4 reporting=0A=
* Version 1.10 request queue changes, Ultra DMA 100=0A=
*/=0A=
+/*=0A=
+ * Support UltraDMA Mode 6 and 48 bit LBA Mode.=0A=
+ * Powered by PROMISE Technology, Inc. Portions Copyright (C)2001.=0A=
+ */=0A=
+//#define PCI_VENDOR_ID_PROMISE 0x105a=0A=
=0A=
#define IDEDISK_VERSION "1.10"=0A=
=0A=
@@ -48,6 +53,8 @@=0A=
#include <linux/delay.h>=0A=
#include <linux/ide.h>=0A=
=0A=
+#include <linux/pci_ids.h>=0A=
+=0A=
#include <asm/byteorder.h>=0A=
#include <asm/irq.h>=0A=
#include <asm/uaccess.h>=0A=
@@ -371,10 +378,22 @@=0A=
OUT_BYTE(drive->ctl,IDE_CONTROL_REG);=0A=
OUT_BYTE(0x00, IDE_FEATURE_REG);=0A=
OUT_BYTE(rq->nr_sectors,IDE_NSECTOR_REG);=0A=
+ if ((drive->id->command_set_2 & 0x0400) && =
HWIF(drive)->pci_devid.vid=3D=3DPCI_VENDOR_ID_PROMISE) {=0A=
+ /* 48 bits data previous */=0A=
+ OUT_BYTE(rq->nr_sectors>>8, IDE_NSECTOR_REG);=0A=
+ OUT_BYTE(block>>24, IDE_SECTOR_REG);=0A=
+ OUT_BYTE(0x00, IDE_LCYL_REG); //block only 32 bits=0A=
+ OUT_BYTE(0x00, IDE_HCYL_REG);=0A=
+ /* 48 bits data current */=0A=
+ OUT_BYTE(rq->nr_sectors, IDE_NSECTOR_REG);=0A=
+ OUT_BYTE(block, IDE_SECTOR_REG);=0A=
+ OUT_BYTE(block>>8, IDE_LCYL_REG);=0A=
+ OUT_BYTE(block>>16, IDE_HCYL_REG);=0A=
+ OUT_BYTE(drive->select.all,IDE_SELECT_REG);=0A=
#ifdef CONFIG_BLK_DEV_PDC4030=0A=
- if (drive->select.b.lba || IS_PDC4030_DRIVE) {=0A=
-#else /* !CONFIG_BLK_DEV_PDC4030 */=0A=
- if (drive->select.b.lba) {=0A=
+ } else if (drive->select.b.lba || IS_PDC4030_DRIVE) {=0A=
+#else /* !CONFIG_BLK_DEV_PDC4030 */ =0A=
+ } else if (drive->select.b.lba) {=0A=
#endif /* CONFIG_BLK_DEV_PDC4030 */=0A=
#ifdef DEBUG=0A=
printk("%s: %sing: LBAsect=3D%ld, sectors=3D%ld, buffer=3D0x%08lx\n",=0A=
@@ -413,7 +432,10 @@=0A=
return ide_started;=0A=
#endif /* CONFIG_BLK_DEV_IDEDMA */=0A=
ide_set_handler(drive, &read_intr, WAIT_CMD, NULL);=0A=
- OUT_BYTE(drive->mult_count ? WIN_MULTREAD : WIN_READ, =
IDE_COMMAND_REG);=0A=
+ if ((drive->id->command_set_2 & 0x0400) && =
HWIF(drive)->pci_devid.vid=3D=3DPCI_VENDOR_ID_PROMISE)=0A=
+ OUT_BYTE(drive->mult_count ? MULTI_READ_EXT : READ_EXT, =
IDE_COMMAND_REG);=0A=
+ else=0A=
+ OUT_BYTE(drive->mult_count ? WIN_MULTREAD : WIN_READ, =
IDE_COMMAND_REG);=0A=
return ide_started;=0A=
}=0A=
if (rq->cmd =3D=3D WRITE) {=0A=
@@ -422,7 +444,11 @@=0A=
if (drive->using_dma && !(HWIF(drive)->dmaproc(ide_dma_write, drive)))=0A=
return ide_started;=0A=
#endif /* CONFIG_BLK_DEV_IDEDMA */=0A=
- OUT_BYTE(drive->mult_count ? WIN_MULTWRITE : WIN_WRITE, =
IDE_COMMAND_REG);=0A=
+ /* out 48 bits R/W command here */=0A=
+ if ((drive->id->command_set_2 & 0x0400) && =
HWIF(drive)->pci_devid.vid=3D=3DPCI_VENDOR_ID_PROMISE)=0A=
+ OUT_BYTE(drive->mult_count ? MULTI_WRITE_EXT : WRITE_EXT, =
IDE_COMMAND_REG);=0A=
+ else=0A=
+ OUT_BYTE(drive->mult_count ? WIN_MULTWRITE : WIN_WRITE, =
IDE_COMMAND_REG);=0A=
if (ide_wait_stat(&startstop, drive, DATA_READY, drive->bad_wstat, =
WAIT_DRQ)) {=0A=
printk(KERN_ERR "%s: no DRQ after issuing %s\n", drive->name,=0A=
drive->mult_count ? "MULTWRITE" : "WRITE");=0A=
@@ -481,7 +507,7 @@=0A=
static void idedisk_release (struct inode *inode, struct file *filp, =
ide_drive_t *drive)=0A=
{=0A=
if (drive->removable && !drive->usage) {=0A=
- invalidate_bdev(inode->i_bdev, 0);=0A=
+ invalidate_buffers(inode->i_rdev);=0A=
if (drive->doorlocking && ide_wait_cmd(drive, WIN_DOORUNLOCK, 0, 0, =
0, NULL))=0A=
drive->doorlocking =3D 0;=0A=
}=0A=
@@ -508,12 +534,22 @@=0A=
{=0A=
struct hd_driveid *id =3D drive->id;=0A=
unsigned long capacity =3D drive->cyl * drive->head * drive->sect;=0A=
+ int lba48=3Ddrive->id->command_set_2 & 0x0400;=0A=
+ unsigned long temp=3D0;=0A=
=0A=
drive->select.b.lba =3D 0;=0A=
=0A=
/* Determine capacity, and use LBA if the drive properly supports it */=0A=
if ((id->capability & 2) && lba_capacity_is_ok(id)) {=0A=
capacity =3D id->lba_capacity;=0A=
+ /* get 48 bits disk capacity if support */=0A=
+ if (lba48 && HWIF(drive)->pci_devid.vid=3D=3DPCI_VENDOR_ID_PROMISE)=0A=
+ {=0A=
+ temp=3Did->words94_125[7];=0A=
+ temp<<=3D16;=0A=
+ temp|=3Did->words94_125[6];=0A=
+ capacity=3Dtemp;=0A=
+ }=0A=
drive->cyl =3D capacity / (drive->head * drive->sect);=0A=
drive->select.b.lba =3D 1;=0A=
}=0A=
@@ -769,7 +805,7 @@=0A=
=0A=
/* Give size in megabytes (MB), not mebibytes (MiB). */=0A=
/* We compute the exact rounded value, avoiding overflow. */=0A=
- printk (" (%ld MB)", (capacity - capacity/625 + 974)/1950);=0A=
+ printk (" (%ld GB)", ((capacity - capacity/625 + 974)/1950)/1024);=0A=
=0A=
/* Only print cache size when it was specified */=0A=
if (id->buf_size)=0A=
diff -urN linux-2.4.18.org/drivers/ide/ide-dma.c =
linux/drivers/ide/ide-dma.c=0A=
--- linux-2.4.18.org/drivers/ide/ide-dma.c Mon Sep 10 01:43:02 2001=0A=
+++ linux/drivers/ide/ide-dma.c Thu May 23 11:46:26 2002=0A=
@@ -75,6 +75,8 @@=0A=
* ATA-66/100 and recovery functions, I forgot the rest......=0A=
* SELECT_READ_WRITE(hwif,drive,func) for active tuning based on IO =
direction.=0A=
*=0A=
+ * Support UltraDMA Mode 6 and 48 bit LBA Mode.=0A=
+ * Powered by PROMISE Technology, Inc. Portions Copyright (C)2001.=0A=
*/=0A=
=0A=
#include <linux/config.h>=0A=
@@ -86,6 +88,7 @@=0A=
#include <linux/pci.h>=0A=
#include <linux/init.h>=0A=
#include <linux/ide.h>=0A=
+#include <linux/pci_ids.h>=0A=
=0A=
#include <asm/io.h>=0A=
#include <asm/irq.h>=0A=
@@ -101,6 +104,8 @@=0A=
#define DEFAULT_BMCRBA 0xcc00 /* VIA's default value */=0A=
#define DEFAULT_BMALIBA 0xd400 /* ALI's default value */=0A=
=0A=
+/*#define CONFIG_BLK_DEV_IDEDMA_TIMEOUT 1 //By Promise */=0A=
+=0A=
extern char *ide_dmafunc_verbose(ide_dma_action_t dmafunc);=0A=
=0A=
#ifdef CONFIG_IDEDMA_NEW_DRIVE_LISTINGS=0A=
@@ -252,7 +257,7 @@=0A=
struct buffer_head *bh;=0A=
struct scatterlist *sg =3D hwif->sg_table;=0A=
int nents =3D 0;=0A=
-=0A=
+ =0A=
if (hwif->sg_dma_active)=0A=
BUG();=0A=
=0A=
@@ -429,18 +434,22 @@=0A=
struct hd_driveid *id =3D drive->id;=0A=
=0A=
if ((id->field_valid & 4) && (eighty_ninty_three(drive)) &&=0A=
- (id->dma_ultra & (id->dma_ultra >> 11) & 7)) {=0A=
- if ((id->dma_ultra >> 13) & 1) {=0A=
- printk(", UDMA(100)"); /* UDMA BIOS-enabled! */=0A=
+ (id->dma_ultra & (id->dma_ultra >> 14) & 3)) {=0A=
+ if ((id->dma_ultra >> 15) & 1) {=0A=
+ printk(", UDMA(166?)"); /* UDMA 7 BIOS-enabled! */=0A=
+ } else if ((id->dma_ultra >> 14) & 1) {=0A=
+ printk(", UDMA(133)"); /* UDMA 6 BIOS-enabled! */=0A=
+ } else if ((id->dma_ultra >> 13) & 1) {=0A=
+ printk(", UDMA(100)"); /* UDMA 5 BIOS-enabled! */=0A=
} else if ((id->dma_ultra >> 12) & 1) {=0A=
- printk(", UDMA(66)"); /* UDMA BIOS-enabled! */=0A=
+ printk(", UDMA(66)"); /* UDMA 4 BIOS-enabled! */=0A=
} else {=0A=
printk(", UDMA(44)"); /* UDMA BIOS-enabled! */=0A=
}=0A=
} else if ((id->field_valid & 4) &&=0A=
(id->dma_ultra & (id->dma_ultra >> 8) & 7)) {=0A=
if ((id->dma_ultra >> 10) & 1) {=0A=
- printk(", UDMA(33)"); /* UDMA BIOS-enabled! */=0A=
+ printk(", UDMA(33)"); /* UDMA 2 BIOS-enabled! */=0A=
} else if ((id->dma_ultra >> 9) & 1) {=0A=
printk(", UDMA(25)"); /* UDMA BIOS-enabled! */=0A=
} else {=0A=
@@ -463,7 +472,11 @@=0A=
/* Consult the list of known "bad" drives */=0A=
if (ide_dmaproc(ide_dma_bad_drive, drive))=0A=
return hwif->dmaproc(ide_dma_off, drive);=0A=
-=0A=
+ =0A=
+ /* Enable DMA on any drive that has UltraDMA (mode 6/7) enabled */=0A=
+ if ((id->field_valid & 4) && (eighty_ninty_three(drive)))=0A=
+ if ((id->dma_ultra & (id->dma_ultra >> 14) & 3))=0A=
+ return hwif->dmaproc(ide_dma_on, drive);=0A=
/* Enable DMA on any drive that has UltraDMA (mode 3/4/5) enabled */=0A=
if ((id->field_valid & 4) && (eighty_ninty_three(drive)))=0A=
if ((id->dma_ultra & (id->dma_ultra >> 11) & 7))=0A=
@@ -550,13 +563,18 @@=0A=
*/=0A=
int ide_dmaproc (ide_dma_action_t func, ide_drive_t *drive)=0A=
{=0A=
-// ide_hwgroup_t *hwgroup =3D HWGROUP(drive);=0A=
ide_hwif_t *hwif =3D HWIF(drive);=0A=
- unsigned long dma_base =3D hwif->dma_base;=0A=
+ unsigned long dma_base =3D hwif->dma_base;=0A=
byte unit =3D (drive->select.b.unit & 0x01);=0A=
unsigned int count, reading =3D 0;=0A=
byte dma_stat;=0A=
-=0A=
+ int lba48 =3Ddrive->id->command_set_2 & 0x0400;=0A=
+ unsigned long high_16 =3D pci_resource_start(hwif->pci_dev, 4);=0A=
+ byte clock =3Dinb(high_16+0x11);=0A=
+ unsigned long atapi_port =3Dhigh_16+ 0x20 + (hwif->channel ? 0x04 : =
0x00);=0A=
+ struct request *rq =3D HWGROUP(drive)->rq;=0A=
+ unsigned long word_count =3D 0;=0A=
+ =0A=
switch (func) {=0A=
case ide_dma_off:=0A=
printk("%s: DMA disabled\n", drive->name);=0A=
@@ -575,6 +593,15 @@=0A=
SELECT_READ_WRITE(hwif,drive,func);=0A=
if (!(count =3D ide_build_dmatable(drive, func)))=0A=
return 1; /* try PIO instead of DMA */=0A=
+ /* Fix PDC20262 running with 48bit LBA=0A=
+ * This is a evaluate function by PROMISE. 2002.4.15 */=0A=
+ /*=0A=
+ if ( IDE_PCI_DEVID_EQ(hwif->pci_devid, DEVID_PDC20262) && lba48 )=0A=
+ {=0A=
+ hwif->sg_table[hwif->sg_nents].address =3D =
hwif->sg_table[(hwif->sg_nents)-1].address;=0A=
+ hwif->sg_table[hwif->sg_nents].length =3D =
hwif->sg_table[(hwif->sg_nents)-1].length;=0A=
+ hwif->sg_nents++;=0A=
+ }*/=0A=
outl(hwif->dmatable_dma, dma_base + 4); /* PRD table */=0A=
outb(reading, dma_base); /* specify r/w */=0A=
outb(inb(dma_base+2)|6, dma_base+2); /* clear INTR & ERROR flags */=0A=
@@ -586,18 +613,39 @@=0A=
#else /* !CONFIG_BLK_DEV_IDEDMA_TIMEOUT */=0A=
ide_set_handler(drive, &ide_dma_intr, WAIT_CMD, dma_timer_expiry); =
/* issue cmd to drive */=0A=
#endif /* CONFIG_BLK_DEV_IDEDMA_TIMEOUT */=0A=
- OUT_BYTE(reading ? WIN_READDMA : WIN_WRITEDMA, IDE_COMMAND_REG);=0A=
+ if (lba48 && hwif->pci_devid.vid=3D=3DPCI_VENDOR_ID_PROMISE)=0A=
+ OUT_BYTE(reading ? READ_DMA_EXT : WRITE_DMA_EXT, IDE_COMMAND_REG);=0A=
+ else=0A=
+ OUT_BYTE(reading ? WIN_READDMA : WIN_WRITEDMA, IDE_COMMAND_REG);=0A=
case ide_dma_begin:=0A=
/* Note that this is done *after* the cmd has=0A=
- * been issued to the drive, as per the BM-IDE spec.=0A=
- * The Promise Ultra33 doesn't work correctly when=0A=
- * we do this part before issuing the drive cmd.=0A=
- */=0A=
- outb(inb(dma_base)|1, dma_base); /* start DMA */=0A=
+ * been issued to the drive, as per the BM-IDE spec. */=0A=
+ /* Enable ATAPI UDMA port for 48bit data on PDC20267 */=0A=
+ if (lba48 && hwif->pci_devid.vid=3D=3DPCI_VENDOR_ID_PROMISE &&=0A=
+ (hwif->pci_devid.did =3D=3D PCI_DEVICE_ID_PROMISE_20267 || =0A=
+ hwif->pci_devid.did =3D=3D PCI_DEVICE_ID_PROMISE_20265 ||=0A=
+ hwif->pci_devid.did =3D=3D PCI_DEVICE_ID_PROMISE_20262))=0A=
+ {=0A=
+ outb(clock|(hwif->channel ? 0x08:0x02), high_16 + 0x11);=0A=
+ word_count=3D(rq->nr_sectors << 8);=0A=
+ word_count=3Dreading ? word_count | 0x05000000 : word_count | =
0x06000000;=0A=
+ outl(word_count, atapi_port);=0A=
+ } =0A=
+ outb(inb(dma_base)|1, dma_base); /* start DMA */=0A=
return 0;=0A=
case ide_dma_end: /* returns 1 on error, 0 otherwise */=0A=
drive->waiting_for_dma =3D 0;=0A=
outb(inb(dma_base)&~1, dma_base); /* stop DMA */=0A=
+ /* Disable ATAPI UDMA port for 48bit data on PDC20267 */=0A=
+ if (lba48 && hwif->pci_devid.vid=3D=3DPCI_VENDOR_ID_PROMISE &&=0A=
+ (hwif->pci_devid.did =3D=3D PCI_DEVICE_ID_PROMISE_20267 || =0A=
+ hwif->pci_devid.did =3D=3D PCI_DEVICE_ID_PROMISE_20265 ||=0A=
+ hwif->pci_devid.did =3D=3D PCI_DEVICE_ID_PROMISE_20262))=0A=
+ {=0A=
+ outl(0, atapi_port);=0A=
+ clock=3Dinb(high_16+0x11);=0A=
+ outb(clock & ~(hwif->channel ? 0x08:0x02), high_16+0x11);=0A=
+ }=0A=
dma_stat =3D inb(dma_base+2); /* get DMA status */=0A=
outb(dma_stat|6, dma_base+2); /* clear the INTR & ERROR bits */=0A=
ide_destroy_dmatable(drive); /* purge DMA mappings */=0A=
diff -urN linux-2.4.18.org/drivers/ide/ide-features.c =
linux/drivers/ide/ide-features.c=0A=
--- linux-2.4.18.org/drivers/ide/ide-features.c Sat Feb 10 03:40:02 2001=0A=
+++ linux/drivers/ide/ide-features.c Thu Feb 28 00:04:42 2002=0A=
@@ -261,6 +261,9 @@=0A=
*/=0A=
byte eighty_ninty_three (ide_drive_t *drive)=0A=
{=0A=
+ if (HWIF(drive)->pci_devid.vid=3D=3D0x105a)=0A=
+ return(HWIF(drive)->udma_four);=0A=
+ /* PDC202XX: that's because some HDD will return wrong info */=0A=
return ((byte) ((HWIF(drive)->udma_four) &&=0A=
#ifndef CONFIG_IDEDMA_IVB=0A=
(drive->id->hw_config & 0x4000) &&=0A=
diff -urN linux-2.4.18.org/drivers/ide/ide-pci.c =
linux/drivers/ide/ide-pci.c=0A=
--- linux-2.4.18.org/drivers/ide/ide-pci.c Fri Oct 26 04:53:47 2001=0A=
+++ linux/drivers/ide/ide-pci.c Thu May 23 11:21:32 2002=0A=
@@ -11,6 +11,10 @@=0A=
* This module provides support for automatic detection and=0A=
* configuration of all PCI IDE interfaces present in a system. =0A=
*/=0A=
+/* =0A=
+ * Support PROMISE PDC20268/20269/20275 IDE Controller.=0A=
+ * Powered by PROMISE Technology, Inc. Portions Copyright (C)2001.=0A=
+ */ =0A=
=0A=
#include <linux/config.h>=0A=
#include <linux/types.h>=0A=
@@ -45,8 +49,9 @@=0A=
#define DEVID_PDC20262 ((ide_pci_devid_t){PCI_VENDOR_ID_PROMISE, =
PCI_DEVICE_ID_PROMISE_20262})=0A=
#define DEVID_PDC20265 ((ide_pci_devid_t){PCI_VENDOR_ID_PROMISE, =
PCI_DEVICE_ID_PROMISE_20265})=0A=
#define DEVID_PDC20267 ((ide_pci_devid_t){PCI_VENDOR_ID_PROMISE, =
PCI_DEVICE_ID_PROMISE_20267})=0A=
-#define DEVID_PDC20268 ((ide_pci_devid_t){PCI_VENDOR_ID_PROMISE, =
PCI_DEVICE_ID_PROMISE_20268})=0A=
-#define DEVID_PDC20268R ((ide_pci_devid_t){PCI_VENDOR_ID_PROMISE, =
PCI_DEVICE_ID_PROMISE_20268R})=0A=
+#define DEVID_PDC20268 ((ide_pci_devid_t){PCI_VENDOR_ID_PROMISE, =
PCI_DEVICE_ID_PROMISE_20268})=0A=
+#define DEVID_PDC20269 ((ide_pci_devid_t){PCI_VENDOR_ID_PROMISE, =
PCI_DEVICE_ID_PROMISE_20269})=0A=
+#define DEVID_PDC20275 ((ide_pci_devid_t){PCI_VENDOR_ID_PROMISE, =
PCI_DEVICE_ID_PROMISE_20275})=0A=
#define DEVID_RZ1000 ((ide_pci_devid_t){PCI_VENDOR_ID_PCTECH, =
PCI_DEVICE_ID_PCTECH_RZ1000})=0A=
#define DEVID_RZ1001 ((ide_pci_devid_t){PCI_VENDOR_ID_PCTECH, =
PCI_DEVICE_ID_PCTECH_RZ1001})=0A=
#define DEVID_SAMURAI ((ide_pci_devid_t){PCI_VENDOR_ID_PCTECH, =
PCI_DEVICE_ID_PCTECH_SAMURAI_IDE})=0A=
@@ -401,11 +406,9 @@=0A=
{DEVID_PDC20265,"PDC20265", PCI_PDC202XX, ATA66_PDC202XX, =
INIT_PDC202XX, NULL, {{0x50,0x02,0x02}, {0x50,0x04,0x04}}, OFF_BOARD, =
48 },=0A=
{DEVID_PDC20267,"PDC20267", PCI_PDC202XX, ATA66_PDC202XX, =
INIT_PDC202XX, NULL, {{0x50,0x02,0x02}, {0x50,0x04,0x04}}, OFF_BOARD, =
48 },=0A=
#endif=0A=
- {DEVID_PDC20268,"PDC20268", PCI_PDC202XX, ATA66_PDC202XX, =
INIT_PDC202XX, NULL, {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, OFF_BOARD, =
16 },=0A=
- /* Promise used a different PCI ident for the raid card apparently to =
try and=0A=
- prevent Linux detecting it and using our own raid code. We want to =
detect=0A=
- it for the ataraid drivers, so we have to list both here.. */=0A=
- {DEVID_PDC20268R,"PDC20268", PCI_PDC202XX, ATA66_PDC202XX, =
INIT_PDC202XX, NULL, {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, OFF_BOARD, =
16 },=0A=
+ {DEVID_PDC20268,"PDC20268", PCI_PDC202XX, ATA66_PDC202XX, =
INIT_PDC202XX, NULL, {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, OFF_BOARD, =
48 },=0A=
+ {DEVID_PDC20269,"PDC20269", PCI_PDC202XX, ATA66_PDC202XX, =
INIT_PDC202XX, NULL, {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, OFF_BOARD, =
48 },=0A=
+ {DEVID_PDC20275,"PDC20275", PCI_PDC202XX, ATA66_PDC202XX, =
INIT_PDC202XX, NULL, {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, OFF_BOARD, =
48 },=0A=
{DEVID_RZ1000, "RZ1000", NULL, NULL, INIT_RZ1000, NULL, =
{{0x00,0x00,0x00}, {0x00,0x00,0x00}}, ON_BOARD, 0 },=0A=
{DEVID_RZ1001, "RZ1001", NULL, NULL, INIT_RZ1000, NULL, =
{{0x00,0x00,0x00}, {0x00,0x00,0x00}}, ON_BOARD, 0 },=0A=
{DEVID_SAMURAI, "SAMURAI", NULL, NULL, INIT_SAMURAI, NULL, =
{{0x00,0x00,0x00}, {0x00,0x00,0x00}}, ON_BOARD, 0 },=0A=
@@ -458,6 +461,8 @@=0A=
case PCI_DEVICE_ID_PROMISE_20265:=0A=
case PCI_DEVICE_ID_PROMISE_20267:=0A=
case PCI_DEVICE_ID_PROMISE_20268:=0A=
+ case PCI_DEVICE_ID_PROMISE_20269:=0A=
+ case PCI_DEVICE_ID_PROMISE_20275:=0A=
case PCI_DEVICE_ID_ARTOP_ATP850UF:=0A=
case PCI_DEVICE_ID_ARTOP_ATP860:=0A=
case PCI_DEVICE_ID_ARTOP_ATP860R:=0A=
@@ -586,6 +591,7 @@=0A=
ide_hwif_t *hwif, *mate =3D NULL;=0A=
unsigned int class_rev;=0A=
static int secondpdc =3D 0;=0A=
+ int new_chip=3D0;=0A=
=0A=
#ifdef CONFIG_IDEDMA_AUTO=0A=
if (!noautodma)=0A=
@@ -684,6 +690,10 @@=0A=
/*=0A=
* Set up the IDE ports=0A=
*/=0A=
+ if ((IDE_PCI_DEVID_EQ(d->devid,DEVID_PDC20268)) ||=0A=
+ (IDE_PCI_DEVID_EQ(d->devid,DEVID_PDC20269)) ||=0A=
+ (IDE_PCI_DEVID_EQ(d->devid,DEVID_PDC20275)))=0A=
+ new_chip=3D1; =0A=
for (port =3D 0; port <=3D 1; ++port) {=0A=
unsigned long base =3D 0, ctl =3D 0;=0A=
ide_pci_enablebit_t *e =3D &(d->enablebits[port]);=0A=
@@ -697,9 +707,9 @@=0A=
goto controller_ok;=0A=
if ((IDE_PCI_DEVID_EQ(d->devid, DEVID_PDC20262)) && =
(secondpdc++=3D=3D1) && (port=3D=3D1) ) =0A=
goto controller_ok;=0A=
- =0A=
- if (e->reg && (pci_read_config_byte(dev, e->reg, &tmp) || (tmp & =
e->mask) !=3D e->val))=0A=
- continue; /* port not enabled */=0A=
+ if (!(new_chip))=0A=
+ if (e->reg && (pci_read_config_byte(dev, e->reg, &tmp) || (tmp & =
e->mask) !=3D e->val))=0A=
+ continue; /* port not enabled */=0A=
controller_ok: =0A=
if (IDE_PCI_DEVID_EQ(d->devid, DEVID_HPT366) && (port) && (class_rev =
< 0x03))=0A=
return;=0A=
@@ -774,7 +784,8 @@=0A=
IDE_PCI_DEVID_EQ(d->devid, DEVID_PDC20265) ||=0A=
IDE_PCI_DEVID_EQ(d->devid, DEVID_PDC20267) ||=0A=
IDE_PCI_DEVID_EQ(d->devid, DEVID_PDC20268) ||=0A=
- IDE_PCI_DEVID_EQ(d->devid, DEVID_PDC20268R) ||=0A=
+ IDE_PCI_DEVID_EQ(d->devid, DEVID_PDC20269) ||=0A=
+ IDE_PCI_DEVID_EQ(d->devid, DEVID_PDC20275) ||=0A=
IDE_PCI_DEVID_EQ(d->devid, DEVID_AEC6210) ||=0A=
IDE_PCI_DEVID_EQ(d->devid, DEVID_AEC6260) ||=0A=
IDE_PCI_DEVID_EQ(d->devid, DEVID_AEC6260R) ||=0A=
@@ -890,6 +901,12 @@=0A=
devid.vid =3D dev->vendor;=0A=
devid.did =3D dev->device;=0A=
for (d =3D ide_pci_chipsets; d->devid.vid && =
!IDE_PCI_DEVID_EQ(d->devid, devid); ++d);=0A=
+ /* Fix IDE issue by Promise */=0A=
+ if ((dev->vendor=3D=3DPCI_VENDOR_ID_PROMISE) && ((dev->class =
>>8)=3D=3DPCI_CLASS_STORAGE_RAID))=0A=
+ {=0A=
+ printk("%s: Fix IDE issue by PROMISE.\n", d->name);=0A=
+ return;=0A=
+ }=0A=
if (d->init_hwif =3D=3D IDE_IGNORE)=0A=
printk("%s: ignored by ide_scan_pci_device() (uses own driver)\n", =
d->name);=0A=
else if (IDE_PCI_DEVID_EQ(d->devid, DEVID_OPTI621V) && =
!(PCI_FUNC(dev->devfn) & 1))=0A=
diff -urN linux-2.4.18.org/drivers/ide/ide.c linux/drivers/ide/ide.c=0A=
--- linux-2.4.18.org/drivers/ide/ide.c Tue Feb 26 03:37:57 2002=0A=
+++ linux/drivers/ide/ide.c Thu May 23 16:10:07 2002=0A=
@@ -883,6 +883,7 @@=0A=
{=0A=
unsigned long flags;=0A=
byte err =3D 0;=0A=
+ int lba48=3D(drive->id->command_set_2 & 0x0400);=0A=
=0A=
__save_flags (flags); /* local CPU only */=0A=
ide__sti(); /* local CPU only */=0A=
@@ -918,7 +919,16 @@=0A=
printk("}");=0A=
if ((err & (BBD_ERR | ABRT_ERR)) =3D=3D BBD_ERR || (err & =
(ECC_ERR|ID_ERR|MARK_ERR))) {=0A=
byte cur =3D IN_BYTE(IDE_SELECT_REG);=0A=
- if (cur & 0x40) { /* using LBA? */=0A=
+ if ((lba48) && (HWIF(drive)->pci_devid.vid=3D=3D0x105a)) { /* 48bit =
LBA? */=0A=
+ OUT_BYTE(0x88, IDE_CONTROL_REG);=0A=
+ cur =3D IN_BYTE(IDE_SECTOR_REG);=0A=
+ OUT_BYTE(0x08, IDE_CONTROL_REG);=0A=
+ printk(", LBAsect=3D%ld", (unsigned long)=0A=
+ (cur << 24)=0A=
+ |(IN_BYTE(IDE_HCYL_REG)<<16)=0A=
+ |(IN_BYTE(IDE_LCYL_REG)<<8)=0A=
+ | IN_BYTE(IDE_SECTOR_REG));=0A=
+ } else if (cur & 0x40) { /* using LBA? */=0A=
printk(", LBAsect=3D%ld", (unsigned long)=0A=
((cur&0xf)<<24)=0A=
|(IN_BYTE(IDE_HCYL_REG)<<16)=0A=
@@ -3746,7 +3756,6 @@=0A=
char *options =3D NULL;=0A=
MODULE_PARM(options,"s");=0A=
MODULE_LICENSE("GPL");=0A=
-=0A=
static void __init parse_options (char *line)=0A=
{=0A=
char *next =3D line;=0A=
diff -urN linux-2.4.18.org/drivers/ide/pdc202xx.c =
linux/drivers/ide/pdc202xx.c=0A=
--- linux-2.4.18.org/drivers/ide/pdc202xx.c Thu Nov 15 03:44:03 2001=0A=
+++ linux/drivers/ide/pdc202xx.c Thu May 23 11:48:49 2002=0A=
@@ -1,5 +1,5 @@=0A=
/*=0A=
- * linux/drivers/ide/pdc202xx.c Version 0.30 Mar. 18, 2000=0A=
+ * linux/drivers/ide/pdc202xx.c Version 0.32 Feb. 27, 2002=0A=
*=0A=
* Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org>=0A=
* May be copied or modified under the terms of the GNU General Public =
License=0A=
@@ -12,7 +12,8 @@=0A=
* Promise Ultra66 cards with BIOS v1.11 this=0A=
* compiled into the kernel if you have more than one card installed.=0A=
*=0A=
- * Promise Ultra100 cards.=0A=
+ * Promise Ultra Series cards.=0A=
+ * Promise Ultra100TX2 & Ultra133TX2 cards.=0A=
*=0A=
* The latest chipset code will support the following ::=0A=
* Three Ultra33 controllers and 12 drives.=0A=
@@ -21,13 +22,42 @@=0A=
*=0A=
* UNLESS you enable "CONFIG_PDC202XX_BURST"=0A=
*=0A=
- */=0A=
-=0A=
-/*=0A=
- * Portions Copyright (C) 1999 Promise Technology, Inc.=0A=
- * Author: Frank Tiernan (frankt@promise.com)=0A=
+ * History :=0A=
+ * 05/22/01 v1.20 b1=0A=
+ * (1) support PDC20268=0A=
+ * (2) fix cable judge function=0A=
+ * 08/22/01 v1.20 b2=0A=
+ * (1) support ATA-133 PDC20269/75=0A=
+ * (2) support UDMA Mode 6=0A=
+ * (3) fix proc report information=0A=
+ * (4) set ATA133 timing=0A=
+ * (5) fix ultra dma bit 14 selectable=0A=
+ * (6) support 32bit LBA=0A=
+ * 09/11/01 v1.20 b3 =0A=
+ * (1) fix eighty_ninty_three()=0A=
+ * (2) fix offset address 0x1c~0x1f=0A=
+ * 10/30/01 v1.20 b4=0A=
+ * (1) fix 48bit LBA HOB bit=0A=
+ * (2) force rescan drive under PIO modes if need=0A=
+ * 11/02/01 v1.20.0.5=0A=
+ * (1) could be patched with ext3 filesystem code=0A=
+ * 11/06/01 v1.20.0.6=0A=
+ * (1) fix LBA48 drive running without Promise controllers=0A=
+ * (2) fix LBA48 drive running under PIO modes=0A=
+ * 01/28/02 v1.20.0.6=0A=
+ * (1) release for linux IDE Group kernel 2.4.18=0A=
+ * (2) add version and controller info to proc=0A=
+ * 05/23/02 v1.20.0.7=0A=
+ * (1) fix PDC20262 running with 48bit LBA for evaluate only=0A=
+ * (2) Add quirk drive lists for PDC20265/67=0A=
+ *=0A=
+ * Portions Copyright (C) 1999-2002 Promise Technology, Inc.=0A=
+ * Author: Frank Tiernan <frankt@promise.com>=0A=
+ * Hank Yang <hanky@promise.com.tw>=0A=
* Released under terms of General Public License=0A=
*/=0A=
+#define VERSION "1.20.0.7"=0A=
+#define VERDATE "2002-05-23"=0A=
=0A=
#include <linux/config.h>=0A=
#include <linux/types.h>=0A=
@@ -65,41 +95,10 @@=0A=
extern int (*pdc202xx_display_info)(char *, char **, off_t, int); /* =
ide-proc.c */=0A=
extern char *ide_media_verbose(ide_drive_t *);=0A=
static struct pci_dev *bmide_dev;=0A=
-=0A=
-char *pdc202xx_pio_verbose (u32 drive_pci)=0A=
-{=0A=
- if ((drive_pci & 0x000ff000) =3D=3D 0x000ff000) return("NOTSET");=0A=
- if ((drive_pci & 0x00000401) =3D=3D 0x00000401) return("PIO 4");=0A=
- if ((drive_pci & 0x00000602) =3D=3D 0x00000602) return("PIO 3");=0A=
- if ((drive_pci & 0x00000803) =3D=3D 0x00000803) return("PIO 2");=0A=
- if ((drive_pci & 0x00000C05) =3D=3D 0x00000C05) return("PIO 1");=0A=
- if ((drive_pci & 0x00001309) =3D=3D 0x00001309) return("PIO 0");=0A=
- return("PIO ?");=0A=
-}=0A=
-=0A=
-char *pdc202xx_dma_verbose (u32 drive_pci)=0A=
-{=0A=
- if ((drive_pci & 0x00036000) =3D=3D 0x00036000) return("MWDMA 2");=0A=
- if ((drive_pci & 0x00046000) =3D=3D 0x00046000) return("MWDMA 1");=0A=
- if ((drive_pci & 0x00056000) =3D=3D 0x00056000) return("MWDMA 0");=0A=
- if ((drive_pci & 0x00056000) =3D=3D 0x00056000) return("SWDMA 2");=0A=
- if ((drive_pci & 0x00068000) =3D=3D 0x00068000) return("SWDMA 1");=0A=
- if ((drive_pci & 0x000BC000) =3D=3D 0x000BC000) return("SWDMA 0");=0A=
- return("PIO---");=0A=
-}=0A=
-=0A=
-char *pdc202xx_ultra_verbose (u32 drive_pci, u16 slow_cable)=0A=
-{=0A=
- if ((drive_pci & 0x000ff000) =3D=3D 0x000ff000)=0A=
- return("NOTSET");=0A=
- if ((drive_pci & 0x00012000) =3D=3D 0x00012000)=0A=
- return((slow_cable) ? "UDMA 2" : "UDMA 4");=0A=
- if ((drive_pci & 0x00024000) =3D=3D 0x00024000)=0A=
- return((slow_cable) ? "UDMA 1" : "UDMA 3");=0A=
- if ((drive_pci & 0x00036000) =3D=3D 0x00036000)=0A=
- return("UDMA 0");=0A=
- return(pdc202xx_dma_verbose(drive_pci));=0A=
-}=0A=
+static struct hd_driveid *id[4];=0A=
+static int speed_rate[4];=0A=
+static int set_speed=3D0;=0A=
+static int new_chip=3D0;=0A=
=0A=
static char * pdc202xx_info (char *buf, struct pci_dev *dev)=0A=
{=0A=
@@ -107,8 +106,8 @@=0A=
=0A=
u32 bibma =3D pci_resource_start(dev, 4);=0A=
u32 reg60h =3D 0, reg64h =3D 0, reg68h =3D 0, reg6ch =3D 0;=0A=
- u16 reg50h =3D 0, pmask =3D (1<<10), smask =3D (1<<11);=0A=
- u8 hi =3D 0, lo =3D 0, invalid_data_set =3D 0;=0A=
+ u16 reg50h =3D 0, word88=3D0;=0A=
+ int udmasel[4]=3D{0,0,0,0}, piosel[4]=3D{0,0,0,0}, i=3D0, hd=3D0;=0A=
=0A=
/*=0A=
* at that point bibma+0x2 et bibma+0xa are byte registers=0A=
@@ -120,10 +119,6 @@=0A=
u8 sc11 =3D inb_p((unsigned short)bibma + 0x11);=0A=
u8 sc1a =3D inb_p((unsigned short)bibma + 0x1a);=0A=
u8 sc1b =3D inb_p((unsigned short)bibma + 0x1b);=0A=
- u8 sc1c =3D inb_p((unsigned short)bibma + 0x1c); =0A=
- u8 sc1d =3D inb_p((unsigned short)bibma + 0x1d);=0A=
- u8 sc1e =3D inb_p((unsigned short)bibma + 0x1e);=0A=
- u8 sc1f =3D inb_p((unsigned short)bibma + 0x1f);=0A=
=0A=
pci_read_config_word(dev, 0x50, ®50h);=0A=
pci_read_config_dword(dev, 0x60, ®60h);=0A=
@@ -131,45 +126,35 @@=0A=
pci_read_config_dword(dev, 0x68, ®68h);=0A=
pci_read_config_dword(dev, 0x6c, ®6ch);=0A=
=0A=
+ p+=3Dsprintf(p, "\nPROMISE Ultra series driver Ver %s %s Adapter: ", =
VERSION, VERDATE);=0A=
switch(dev->device) {=0A=
+ case PCI_DEVICE_ID_PROMISE_20275:=0A=
+ p +=3D sprintf(p, "MBUltra133\n");=0A=
+ break;=0A=
+ case PCI_DEVICE_ID_PROMISE_20269:=0A=
+ p +=3D sprintf(p, "Ultra133 TX2\n");=0A=
+ break;=0A=
case PCI_DEVICE_ID_PROMISE_20268:=0A=
- case PCI_DEVICE_ID_PROMISE_20268R:=0A=
- p +=3D sprintf(p, "\n PDC20268 TX2 =
Chipset.\n");=0A=
- invalid_data_set =3D 1;=0A=
+ p +=3D sprintf(p, "Ultra100 TX2\n");=0A=
break;=0A=
case PCI_DEVICE_ID_PROMISE_20267:=0A=
- p +=3D sprintf(p, "\n PDC20267 =
Chipset.\n");=0A=
+ p +=3D sprintf(p, "Ultra100\n");=0A=
break;=0A=
case PCI_DEVICE_ID_PROMISE_20265:=0A=
- p +=3D sprintf(p, "\n PDC20265 =
Chipset.\n");=0A=
+ p +=3D sprintf(p, "Ultra100 on M/B\n");=0A=
break;=0A=
case PCI_DEVICE_ID_PROMISE_20262:=0A=
- p +=3D sprintf(p, "\n PDC20262 =
Chipset.\n");=0A=
+ p +=3D sprintf(p, "Ultra66\n");=0A=
break;=0A=
case PCI_DEVICE_ID_PROMISE_20246:=0A=
- p +=3D sprintf(p, "\n PDC20246 =
Chipset.\n");=0A=
+ p +=3D sprintf(p, "Ultra33\n");=0A=
reg50h |=3D 0x0c00;=0A=
break;=0A=
default:=0A=
- p +=3D sprintf(p, "\n PDC202XX =
Chipset.\n");=0A=
+ p +=3D sprintf(p, "Ultra Series\n");=0A=
break;=0A=
}=0A=
=0A=
- p +=3D sprintf(p, "------------------------------- General Status =
---------------------------------\n");=0A=
- p +=3D sprintf(p, "Burst Mode : %sabled\n", =
(sc1f & 0x01) ? "en" : "dis");=0A=
- p +=3D sprintf(p, "Host Mode : %s\n", (sc1f =
& 0x08) ? "Tri-Stated" : "Normal");=0A=
- p +=3D sprintf(p, "Bus Clocking : %s\n",=0A=
- ((sc1f & 0xC0) =3D=3D 0xC0) ? "100 External" :=0A=
- ((sc1f & 0x80) =3D=3D 0x80) ? "66 External" :=0A=
- ((sc1f & 0x40) =3D=3D 0x40) ? "33 External" : "33 PCI Internal");=0A=
- p +=3D sprintf(p, "IO pad select : %s mA\n",=0A=
- ((sc1c & 0x03) =3D=3D 0x03) ? "10" :=0A=
- ((sc1c & 0x02) =3D=3D 0x02) ? "8" :=0A=
- ((sc1c & 0x01) =3D=3D 0x01) ? "6" :=0A=
- ((sc1c & 0x00) =3D=3D 0x00) ? "4" : "??");=0A=
- SPLIT_BYTE(sc1e, hi, lo);=0A=
- p +=3D sprintf(p, "Status Polling Period : %d\n", hi);=0A=
- p +=3D sprintf(p, "Interrupt Check Status Polling Delay : %d\n", lo);=0A=
p +=3D sprintf(p, "--------------- Primary Channel ---------------- =
Secondary Channel -------------\n");=0A=
p +=3D sprintf(p, " %s %s\n",=0A=
(c0&0x80)?"disabled":"enabled ",=0A=
@@ -177,41 +162,33 @@=0A=
p +=3D sprintf(p, "66 Clocking %s %s\n",=0A=
(sc11&0x02)?"enabled ":"disabled",=0A=
(sc11&0x08)?"enabled ":"disabled");=0A=
- p +=3D sprintf(p, " Mode %s Mode %s\n",=0A=
+ p +=3D sprintf(p, "Mode %s %s\n",=0A=
(sc1a & 0x01) ? "MASTER" : "PCI ",=0A=
(sc1b & 0x01) ? "MASTER" : "PCI ");=0A=
- if (!(invalid_data_set))=0A=
- p +=3D sprintf(p, " %s %s\n",=0A=
- (sc1d & 0x08) ? "Error " :=0A=
- ((sc1d & 0x05) =3D=3D 0x05) ? "Not My INTR " :=0A=
- (sc1d & 0x04) ? "Interrupting" :=0A=
- (sc1d & 0x02) ? "FIFO Full " :=0A=
- (sc1d & 0x01) ? "FIFO Empty " : "????????????",=0A=
- (sc1d & 0x80) ? "Error " :=0A=
- ((sc1d & 0x50) =3D=3D 0x50) ? "Not My INTR " :=0A=
- (sc1d & 0x40) ? "Interrupting" :=0A=
- (sc1d & 0x20) ? "FIFO Full " :=0A=
- (sc1d & 0x10) ? "FIFO Empty " : "????????????");=0A=
p +=3D sprintf(p, "--------------- drive0 --------- drive1 -------- =
drive0 ---------- drive1 ------\n");=0A=
p +=3D sprintf(p, "DMA enabled: %s %s %s =
%s\n",=0A=
- (c0&0x20)?"yes":"no ",(c0&0x40)?"yes":"no ",(c1&0x20)?"yes":"no =
",(c1&0x40)?"yes":"no ");=0A=
- if (!(invalid_data_set))=0A=
- p +=3D sprintf(p, "DMA Mode: %s %s %s =
%s\n",=0A=
- pdc202xx_ultra_verbose(reg60h, (reg50h & pmask)),=0A=
- pdc202xx_ultra_verbose(reg64h, (reg50h & pmask)),=0A=
- pdc202xx_ultra_verbose(reg68h, (reg50h & smask)),=0A=
- pdc202xx_ultra_verbose(reg6ch, (reg50h & smask)));=0A=
- if (!(invalid_data_set))=0A=
- p +=3D sprintf(p, "PIO Mode: %s %s %s =
%s\n",=0A=
- pdc202xx_pio_verbose(reg60h),=0A=
- pdc202xx_pio_verbose(reg64h),=0A=
- pdc202xx_pio_verbose(reg68h),=0A=
- pdc202xx_pio_verbose(reg6ch));=0A=
+ (id[0]!=3DNULL && (c0&0x20))?"yes":"no ",(id[1]!=3DNULL && =
(c0&0x40))?"yes":"no ",=0A=
+ (id[2]!=3DNULL && (c1&0x20))?"yes":"no ",(id[3]!=3DNULL && =
(c1&0x40))?"yes":"no ");=0A=
+ for(hd=3D0;hd<4;hd++)=0A=
+ {=0A=
+ if (id[hd]=3D=3DNULL)=0A=
+ continue;=0A=
+ word88=3Did[hd]->dma_ultra;=0A=
+ for (i=3D7;i>=3D0;i--)=0A=
+ if (word88>>(i+8))=0A=
+ {=0A=
+ udmasel[hd]=3Di; /* get select UDMA mode */=0A=
+ break;=0A=
+ }=0A=
+ piosel[hd]=3D(id[hd]->eide_pio_modes >=3D 0x02) ? 4 : 3;=0A=
+ }=0A=
+ p +=3D sprintf(p, "UDMA Mode: %d %d =
%d %d\n",=0A=
+ udmasel[0],udmasel[1],udmasel[2],udmasel[3]);=0A=
+ p +=3D sprintf(p, "PIO Mode: %d %d =
%d %d\n",=0A=
+ piosel[0],piosel[1],piosel[2],piosel[3]);=0A=
#if 0=0A=
p +=3D sprintf(p, "--------------- Can ATAPI DMA ---------------\n");=0A=
#endif=0A=
- if (invalid_data_set)=0A=
- p +=3D sprintf(p, "--------------- Cannot Decode HOST =
---------------\n");=0A=
return (char *)p;=0A=
}=0A=
=0A=
@@ -228,7 +205,9 @@=0A=
const char *pdc_quirk_drives[] =3D {=0A=
"QUANTUM FIREBALLlct08 08",=0A=
"QUANTUM FIREBALLP KA6.4",=0A=
+ "QUANTUM FIREBALLP KA9.1",=0A=
"QUANTUM FIREBALLP LM20.4",=0A=
+ "QUANTUM FIREBALLP KX13.6",=0A=
"QUANTUM FIREBALLP KX20.5",=0A=
"QUANTUM FIREBALLP KX27.3",=0A=
"QUANTUM FIREBALLP LM20.5",=0A=
@@ -376,7 +355,21 @@=0A=
int err;=0A=
byte drive_pci, AP, BP, CP, DP;=0A=
byte TA =3D 0, TB =3D 0, TC =3D 0;=0A=
+#ifdef CONFIG_BLK_DEV_IDEDMA=0A=
+ unsigned long indexreg =3D (hwif->dma_base + 1);=0A=
+ unsigned long datareg =3D (hwif->dma_base + 3);=0A=
+#else=0A=
+ struct pci_dev *dev =3D hwif->pci_dev;=0A=
+ unsigned long high_16 =3D pci_resource_start(dev, 4);=0A=
+ unsigned long indexreg =3D high_16 + (hwif->channel ? 0x09 : 0x01);=0A=
+ unsigned long datareg =3D (indexreg + 2);=0A=
+#endif /* CONFIG_BLK_DEV_IDEDMA */=0A=
+ byte thold =3D0x10;=0A=
+ byte adj =3D(drive->dn%2) ? 0x08 : 0x00;=0A=
+ int i=3D0, j=3Dhwif->channel ? 2:0;=0A=
=0A=
+if (!(new_chip))=0A=
+{=0A=
switch (drive->dn) {=0A=
case 0: drive_pci =3D 0x60; break;=0A=
case 1: drive_pci =3D 0x64; break;=0A=
@@ -387,9 +380,6 @@=0A=
=0A=
if ((drive->media !=3D ide_disk) && (speed < XFER_SW_DMA_0)) return -1;=0A=
=0A=
- if (dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20268)=0A=
- goto skip_register_hell;=0A=
-=0A=
pci_read_config_dword(dev, drive_pci, &drive_conf);=0A=
pci_read_config_byte(dev, (drive_pci), &AP);=0A=
pci_read_config_byte(dev, (drive_pci)|0x01, &BP);=0A=
@@ -476,14 +466,158 @@=0A=
decode_registers(REG_C, CP);=0A=
decode_registers(REG_D, DP);=0A=
#endif /* PDC202XX_DECODE_REGISTER_INFO */=0A=
-=0A=
-skip_register_hell:=0A=
-=0A=
+}=0A=
+ if (speed>=3DXFER_UDMA_6)=0A=
+ set_speed=3D1; /* we need to set ATA133 timing */=0A=
if (!drive->init_speed)=0A=
drive->init_speed =3D speed;=0A=
+#if PDC202XX_DEBUG_DRIVE_INFO=0A=
+ printk("%s: Before set_feature =3D %s, word88 =3D %#x\n",=0A=
+ drive->name, ide_xfer_verbose(speed), drive->id->dma_ultra );=0A=
+#endif /* PDC202XX_DEBUG_DRIVE_INFO */=0A=
err =3D ide_config_drive_speed(drive, speed);=0A=
drive->current_speed =3D speed;=0A=
-=0A=
+#ifdef CONFIG_BLK_DEV_IDEDMA=0A=
+ /* Setting tHOLD bit to 0 if using UDMA mode 2 */=0A=
+ if ((speed=3D=3DXFER_UDMA_2) && (new_chip))=0A=
+ {=0A=
+ outb(thold+adj,indexreg);=0A=
+ outb((inb(datareg)&0x7f),datareg);=0A=
+ }=0A=
+#endif /* CONFIG_BLK_DEV_IDEDMA */=0A=
+ for (i=3D0;i<2;i++)=0A=
+ if (hwif->drives[i].present)=0A=
+ {=0A=
+ id[i+j]=3Dhwif->drives[i].id; /* get identify structs */=0A=
+ speed_rate[i+j]=3Dspeed; /* get current speed */=0A=
+ }=0A=
+ if (new_chip && set_speed)=0A=
+ {=0A=
+ for (i=3D0; i<4; i++)=0A=
+ {=0A=
+ if (id[i]=3D=3DNULL)=0A=
+ continue;=0A=
+ switch(speed_rate[i]){=0A=
+ case XFER_PIO_0:=0A=
+ outb(0x0c+adj, indexreg);=0A=
+ outb(0xfb, datareg);=0A=
+ outb(0x0d+adj, indexreg);=0A=
+ outb(0x2b, datareg);=0A=
+ outb(0x13+adj, indexreg);=0A=
+ outb(0xac, datareg);=0A=
+ break;=0A=
+ case XFER_PIO_1:=0A=
+ outb(0x0c+adj, indexreg);=0A=
+ outb(0x46, datareg);=0A=
+ outb(0x0d+adj, indexreg);=0A=
+ outb(0x29, datareg);=0A=
+ outb(0x13+adj, indexreg);=0A=
+ outb(0xa4, datareg);=0A=
+ break;=0A=
+ case XFER_PIO_2:=0A=
+ outb(0x0c+adj, indexreg);=0A=
+ outb(0x23, datareg);=0A=
+ outb(0x0d+adj, indexreg);=0A=
+ outb(0x26, datareg);=0A=
+ outb(0x13+adj, indexreg);=0A=
+ outb(0x64, datareg);=0A=
+ break;=0A=
+ case XFER_PIO_3:=0A=
+ outb(0x0c+adj, indexreg);=0A=
+ outb(0x27, datareg);=0A=
+ outb(0x0d+adj, indexreg);=0A=
+ outb(0x0d, datareg);=0A=
+ outb(0x13+adj, indexreg);=0A=
+ outb(0x35, datareg);=0A=
+ break;=0A=
+ case XFER_PIO_4:=0A=
+ outb(0x0c+adj, indexreg);=0A=
+ outb(0x23, datareg);=0A=
+ outb(0x0d+adj, indexreg);=0A=
+ outb(0x09, datareg);=0A=
+ outb(0x13+adj, indexreg);=0A=
+ outb(0x25, datareg);=0A=
+ break;=0A=
+#ifdef CONFIG_BLK_DEV_IDEDMA=0A=
+ case XFER_MW_DMA_0:=0A=
+ outb(0x0e +adj, indexreg);=0A=
+ outb(0xdf, datareg);=0A=
+ outb(0x0f+adj, indexreg);=0A=
+ outb(0x5f, datareg);=0A=
+ break;=0A=
+ case XFER_MW_DMA_1:=0A=
+ outb(0x0e +adj, indexreg);=0A=
+ outb(0x6b, datareg);=0A=
+ outb(0x0f+adj, indexreg);=0A=
+ outb(0x27, datareg);=0A=
+ break;=0A=
+ case XFER_MW_DMA_2:=0A=
+ outb(0x0e +adj, indexreg);=0A=
+ outb(0x69, datareg);=0A=
+ outb(0x0f+adj, indexreg);=0A=
+ outb(0x25, datareg);=0A=
+ break;=0A=
+ case XFER_UDMA_0:=0A=
+ outb(0x10+adj, indexreg);=0A=
+ outb(0x4a, datareg);=0A=
+ outb(0x11+adj, indexreg);=0A=
+ outb(0x0f, datareg);=0A=
+ outb(0x12+adj, indexreg);=0A=
+ outb(0xd5, datareg);=0A=
+ break;=0A=
+ case XFER_UDMA_1:=0A=
+ outb(0x10+adj, indexreg);=0A=
+ outb(0x3a, datareg);=0A=
+ outb(0x11+adj, indexreg);=0A=
+ outb(0x0a, datareg);=0A=
+ outb(0x12+adj, indexreg);=0A=
+ outb(0xd0, datareg);=0A=
+ break;=0A=
+ case XFER_UDMA_2:=0A=
+ outb(0x10+adj, indexreg);=0A=
+ outb(0x2a, datareg);=0A=
+ outb(0x11+adj, indexreg);=0A=
+ outb(0x07, datareg);=0A=
+ outb(0x12+adj, indexreg);=0A=
+ outb(0xcd, datareg);=0A=
+ break;=0A=
+ case XFER_UDMA_3:=0A=
+ outb(0x10+adj, indexreg);=0A=
+ outb(0x1a, datareg);=0A=
+ outb(0x11+adj, indexreg);=0A=
+ outb(0x05, datareg);=0A=
+ outb(0x12+adj, indexreg);=0A=
+ outb(0xcd, datareg);=0A=
+ break;=0A=
+ case XFER_UDMA_4:=0A=
+ outb(0x10+adj, indexreg);=0A=
+ outb(0x1a, datareg);=0A=
+ outb(0x11+adj, indexreg);=0A=
+ outb(0x03, datareg);=0A=
+ outb(0x12+adj, indexreg);=0A=
+ outb(0xcd, datareg);=0A=
+ break;=0A=
+ case XFER_UDMA_5:=0A=
+ outb(0x10+adj, indexreg);=0A=
+ outb(0x1a, datareg);=0A=
+ outb(0x11+adj, indexreg);=0A=
+ outb(0x02, datareg);=0A=
+ outb(0x12+adj, indexreg);=0A=
+ outb(0xcb, datareg);=0A=
+ break;=0A=
+ case XFER_UDMA_6:=0A=
+ outb(0x10+adj, indexreg);=0A=
+ outb(0x1a, datareg);=0A=
+ outb(0x11+adj, indexreg);=0A=
+ outb(0x01, datareg);=0A=
+ outb(0x12+adj, indexreg);=0A=
+ outb(0xcb, datareg);=0A=
+ break;=0A=
+#endif /* CONFIG_BLK_DEV_IDEDMA */=0A=
+ default: break;=0A=
+ }=0A=
+ }=0A=
+ }=0A=
#if PDC202XX_DEBUG_DRIVE_INFO=0A=
printk("%s: %s drive%d 0x%08x ",=0A=
drive->name, ide_xfer_verbose(speed),=0A=
@@ -519,22 +653,38 @@=0A=
#ifdef CONFIG_BLK_DEV_IDEDMA=0A=
static int config_chipset_for_dma (ide_drive_t *drive, byte ultra)=0A=
{=0A=
- struct hd_driveid *id =3D drive->id;=0A=
- ide_hwif_t *hwif =3D HWIF(drive);=0A=
- struct pci_dev *dev =3D hwif->pci_dev;=0A=
- unsigned long high_16 =3D pci_resource_start(dev, 4);=0A=
- unsigned long dma_base =3D hwif->dma_base;=0A=
- byte unit =3D (drive->select.b.unit & 0x01);=0A=
+ struct hd_driveid *id =3D drive->id;=0A=
+ ide_hwif_t *hwif =3D HWIF(drive);=0A=
+ struct pci_dev *dev =3D hwif->pci_dev;=0A=
+ unsigned long high_16 =3D pci_resource_start(dev, 4);=0A=
+ unsigned long dma_base =3D hwif->dma_base;=0A=
+ unsigned long indexreg =3D dma_base+1;=0A=
+ unsigned long datareg =3D indexreg+2;=0A=
+ byte unit =3D (drive->select.b.unit & 0x01);=0A=
+ byte iordy =3D 0x13;=0A=
+ byte adj =3D (drive->dn%2) ? 0x08 : 0x00;=0A=
+ byte cable =3D 0;=0A=
=0A=
unsigned int drive_conf;=0A=
- byte drive_pci;=0A=
+ byte drive_pci =3D 0;=0A=
byte test1, test2, speed =3D -1;=0A=
byte AP;=0A=
unsigned short EP;=0A=
byte CLKSPD =3D IN_BYTE(high_16 + 0x11);=0A=
- byte udma_33 =3D ultra ? (inb(high_16 + 0x001f) & 1) : 0;=0A=
+ byte udma_33 =3D ultra;=0A=
byte udma_66 =3D ((eighty_ninty_three(drive)) && udma_33) ? 1 : 0;=0A=
- byte udma_100 =3D (((dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20265) =
|| (dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20267) || (dev->device =
=3D=3D PCI_DEVICE_ID_PROMISE_20268)) && udma_66) ? 1 : 0;=0A=
+ byte udma_100 =3D (((dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20265) =
||=0A=
+ (dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20267) ||=0A=
+ new_chip) && udma_66) ? 1 : 0;=0A=
+ byte udma_133 =3D (((dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20269) =
||=0A=
+ (dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20275))=0A=
+ && udma_100) ? 1 : 0;=0A=
+ byte mask =3D hwif->channel ? 0x08 : 0x02;=0A=
+ unsigned short c_mask =3D hwif->channel ? (1<<11) : (1<<10);=0A=
+ byte ultra_66 =3D ((id->dma_ultra & 0x0010) || =0A=
+ (id->dma_ultra & 0x0008)) ? 1 : 0;=0A=
+ byte ultra_100 =3D ((id->dma_ultra & 0x0020) || (ultra_66)) ? 1 : 0;=0A=
+ byte ultra_133 =3D ((id->dma_ultra & 0x0040) || (ultra_100)) ? 1 : 0;=0A=
=0A=
/*=0A=
* Set the control register to use the 66Mhz system=0A=
@@ -548,21 +698,18 @@=0A=
* leave the 66Mhz clock on and readjust the timing=0A=
* parameters.=0A=
*/=0A=
-=0A=
- byte mask =3D hwif->channel ? 0x08 : 0x02;=0A=
- unsigned short c_mask =3D hwif->channel ? (1<<11) : (1<<10);=0A=
- byte ultra_66 =3D ((id->dma_ultra & 0x0010) ||=0A=
- (id->dma_ultra & 0x0008)) ? 1 : 0;=0A=
- byte ultra_100 =3D ((id->dma_ultra & 0x0020) ||=0A=
- (id->dma_ultra & 0x0010) ||=0A=
- (id->dma_ultra & 0x0008)) ? 1 : 0;=0A=
-=0A=
- if (dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20268)=0A=
- goto jump_pci_mucking;=0A=
-=0A=
- pci_read_config_word(dev, 0x50, &EP);=0A=
-=0A=
- if (((ultra_66) || (ultra_100)) && (EP & c_mask)) {=0A=
+ =0A=
+ if (new_chip)=0A=
+ {=0A=
+ outb(0x0b,indexreg);=0A=
+ cable=3D(inb(datareg)&0x04); /* check 80pin cable? */=0A=
+ }=0A=
+ else {=0A=
+ pci_read_config_word(dev, 0x50, &EP);=0A=
+ cable=3D(EP & c_mask); /* check 80pin cable? */=0A=
+ } =0A=
+ =0A=
+ if (((ultra_66) || (ultra_100) || (ultra_133)) && (cable)) {=0A=
#ifdef DEBUG=0A=
printk("ULTRA66: %s channel of Ultra 66 requires an 80-pin cable for =
Ultra66 operation.\n", hwif->channel ? "Secondary" : "Primary");=0A=
printk(" Switching to Ultra33 mode.\n");=0A=
@@ -570,14 +717,19 @@=0A=
/* Primary : zero out second bit */=0A=
/* Secondary : zero out fourth bit */=0A=
OUT_BYTE(CLKSPD & ~mask, (high_16 + 0x11));=0A=
+ printk("Warning: %s channel requires an 80-pin cable for =
operation.\n",=0A=
+ hwif->channel ? "Secondary":"Primary");=0A=
+ printk("%s reduced to Ultra33 mode.\n", drive->name);=0A=
+ udma_66=3D0; udma_100=3D0; udma_133=3D0;=0A=
} else {=0A=
- if ((ultra_66) || (ultra_100)) {=0A=
+ if ((ultra_66) || (ultra_100) || (ultra_133)) {=0A=
/*=0A=
* check to make sure drive on same channel=0A=
* is u66 capable=0A=
*/=0A=
if (hwif->drives[!(drive->dn%2)].id) {=0A=
- if ((hwif->drives[!(drive->dn%2)].id->dma_ultra & 0x0020) ||=0A=
+ if ((hwif->drives[!(drive->dn%2)].id->dma_ultra & 0x0040) ||=0A=
+ (hwif->drives[!(drive->dn%2)].id->dma_ultra & 0x0020) ||=0A=
(hwif->drives[!(drive->dn%2)].id->dma_ultra & 0x0010) ||=0A=
(hwif->drives[!(drive->dn%2)].id->dma_ultra & 0x0008)) {=0A=
OUT_BYTE(CLKSPD | mask, (high_16 + 0x11));=0A=
@@ -589,7 +741,8 @@=0A=
}=0A=
}=0A=
}=0A=
-=0A=
+ if (!(new_chip))=0A=
+ {=0A=
switch(drive->dn) {=0A=
case 0: drive_pci =3D 0x60;=0A=
pci_read_config_dword(dev, drive_pci, &drive_conf);=0A=
@@ -639,10 +792,18 @@=0A=
pci_read_config_byte(dev, (drive_pci), &AP);=0A=
if (drive->media =3D=3D ide_disk) /* PREFETCH_EN */=0A=
pci_write_config_byte(dev, (drive_pci), AP|PREFETCH_EN);=0A=
-=0A=
-jump_pci_mucking:=0A=
-=0A=
- if ((id->dma_ultra & 0x0020) && (udma_100)) speed =3D XFER_UDMA_5;=0A=
+ }=0A=
+ else=0A=
+ {=0A=
+ if (drive->media !=3D ide_disk) return ide_dma_off_quietly;=0A=
+ if (id->capability & 4) /* IORDY_EN & PREFETCH_EN*/=0A=
+ {=0A=
+ outb(iordy+adj, indexreg);=0A=
+ outb((inb(datareg)|0x03), datareg);=0A=
+ }=0A=
+ }=0A=
+ if ((id->dma_ultra & 0x0040) && (udma_133)) speed =3D XFER_UDMA_6;=0A=
+ else if ((id->dma_ultra & 0x0020) && (udma_100)) speed =3D XFER_UDMA_5;=0A=
else if ((id->dma_ultra & 0x0010) && (udma_66)) speed =3D XFER_UDMA_4;=0A=
else if ((id->dma_ultra & 0x0008) && (udma_66)) speed =3D XFER_UDMA_3;=0A=
else if ((id->dma_ultra & 0x0004) && (udma_33)) speed =3D XFER_UDMA_2;=0A=
@@ -656,7 +817,7 @@=0A=
else if (id->dma_1word & 0x0001) speed =3D XFER_SW_DMA_0;=0A=
else {=0A=
/* restore original pci-config space */=0A=
- if (dev->device !=3D PCI_DEVICE_ID_PROMISE_20268)=0A=
+ if (!(new_chip))=0A=
pci_write_config_dword(dev, drive_pci, drive_conf);=0A=
return ide_dma_off_quietly;=0A=
}=0A=
@@ -664,11 +825,13 @@=0A=
outb(inb(dma_base+2) & ~(1<<(5+unit)), dma_base+2);=0A=
(void) pdc202xx_tune_chipset(drive, speed);=0A=
=0A=
- return ((int) ((id->dma_ultra >> 11) & 7) ? ide_dma_on :=0A=
+ =0A=
+ return ((int) ((id->dma_ultra >> 14) & 3) ? ide_dma_on :=0A=
+ ((id->dma_ultra >> 11) & 7) ? ide_dma_on :=0A=
((id->dma_ultra >> 8) & 7) ? ide_dma_on :=0A=
((id->dma_mword >> 8) & 7) ? ide_dma_on : =0A=
((id->dma_1word >> 8) & 7) ? ide_dma_on :=0A=
- ide_dma_off_quietly);=0A=
+ ide_dma_off_quietly);=0A=
}=0A=
=0A=
static int config_drive_xfer_rate (ide_drive_t *drive)=0A=
@@ -685,7 +848,7 @@=0A=
}=0A=
dma_func =3D ide_dma_off_quietly;=0A=
if (id->field_valid & 4) {=0A=
- if (id->dma_ultra & 0x002F) {=0A=
+ if (id->dma_ultra & 0x007F) {=0A=
/* Force if Capable UltraDMA */=0A=
dma_func =3D config_chipset_for_dma(drive, 1);=0A=
if ((id->field_valid & 2) &&=0A=
@@ -757,6 +920,13 @@=0A=
case ide_dma_timeout:=0A=
if (HWIF(drive)->resetproc !=3D NULL)=0A=
HWIF(drive)->resetproc(drive);=0A=
+ break;=0A=
+ /*=0A=
+ case ide_dma_off:=0A=
+ printk("PDC202XX: Force DMA keep on.\n");=0A=
+ return (0);=0A=
+ //func=3Dide_dma_check; // Fix me!!=0A=
+ */=0A=
default:=0A=
break;=0A=
}=0A=
@@ -766,13 +936,12 @@=0A=
=0A=
void pdc202xx_reset (ide_drive_t *drive)=0A=
{=0A=
- unsigned long high_16 =3D pci_resource_start(HWIF(drive)->pci_dev, 4);=0A=
- byte udma_speed_flag =3D inb(high_16 + 0x001f);=0A=
-=0A=
- OUT_BYTE(udma_speed_flag | 0x10, high_16 + 0x001f);=0A=
- mdelay(100);=0A=
- OUT_BYTE(udma_speed_flag & ~0x10, high_16 + 0x001f);=0A=
- mdelay(2000); /* 2 seconds ?! */=0A=
+ outb(0x04,IDE_CONTROL_REG);=0A=
+ mdelay(1000);=0A=
+ outb(0x00,IDE_CONTROL_REG);=0A=
+ mdelay(1000);=0A=
+ printk("PDC202XX: %s channel reset.\n",=0A=
+ HWIF(drive)->channel ? "Secondary":"Primary");=0A=
}=0A=
=0A=
unsigned int __init pci_init_pdc202xx (struct pci_dev *dev, const char =
*name)=0A=
@@ -784,6 +953,9 @@=0A=
=0A=
if ((dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20262) ||=0A=
(dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20265) ||=0A=
+ (dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20268) ||=0A=
+ (dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20269) ||=0A=
+ (dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20275) ||=0A=
(dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20267)) {=0A=
/*=0A=
* software reset - this is required because the bios=0A=
@@ -800,6 +972,10 @@=0A=
OUT_BYTE(udma_speed_flag & ~0x10, high_16 + 0x001f);=0A=
mdelay(2000); /* 2 seconds ?! */=0A=
}=0A=
+ if ((dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20268) ||=0A=
+ (dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20269) ||=0A=
+ (dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20275))=0A=
+ new_chip=3D1;=0A=
=0A=
if (dev->resource[PCI_ROM_RESOURCE].start) {=0A=
pci_write_config_dword(dev, PCI_ROM_ADDRESS, =
dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE);=0A=
@@ -813,7 +989,7 @@=0A=
if ((irq !=3D irq2) &&=0A=
(dev->device !=3D PCI_DEVICE_ID_PROMISE_20265) &&=0A=
(dev->device !=3D PCI_DEVICE_ID_PROMISE_20267) &&=0A=
- (dev->device !=3D PCI_DEVICE_ID_PROMISE_20268)) {=0A=
+ !(new_chip)) {=0A=
pci_write_config_byte(dev, (PCI_INTERRUPT_LINE)|0x80, irq); /* 0xbc =
*/=0A=
printk("%s: pci-config space interrupt mirror fixed.\n", name);=0A=
}=0A=
@@ -866,10 +1042,19 @@=0A=
unsigned short mask =3D (hwif->channel) ? (1<<11) : (1<<10);=0A=
unsigned short CIS;=0A=
=0A=
- pci_read_config_word(hwif->pci_dev, 0x50, &CIS);=0A=
- return ((CIS & mask) ? 0 : 1);=0A=
+ switch(hwif->pci_dev->device) {=0A=
+ case PCI_DEVICE_ID_PROMISE_20275:=0A=
+ case PCI_DEVICE_ID_PROMISE_20269:=0A=
+ case PCI_DEVICE_ID_PROMISE_20268:=0A=
+ OUT_BYTE(0x0b, (hwif->dma_base + 1));=0A=
+ return (!(IN_BYTE((hwif->dma_base + 3)) & 0x04));=0A=
+ /* check 80pin cable */=0A=
+ default:=0A=
+ pci_read_config_word(hwif->pci_dev, 0x50, &CIS);=0A=
+ return (!(CIS & mask));=0A=
+ /* check 80pin cable */=0A=
+ }=0A=
}=0A=
-=0A=
void __init ide_init_pdc202xx (ide_hwif_t *hwif)=0A=
{=0A=
hwif->tuneproc =3D &pdc202xx_tune_drive;=0A=
@@ -878,6 +1063,9 @@=0A=
=0A=
if ((hwif->pci_dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20262) ||=0A=
(hwif->pci_dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20265) ||=0A=
+ (hwif->pci_dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20268) ||=0A=
+ (hwif->pci_dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20269) ||=0A=
+ (hwif->pci_dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20275) ||=0A=
(hwif->pci_dev->device =3D=3D PCI_DEVICE_ID_PROMISE_20267)) {=0A=
hwif->resetproc =3D &pdc202xx_reset;=0A=
}=0A=
diff -urN linux-2.4.18.org/include/linux/hdreg.h =
linux/include/linux/hdreg.h=0A=
--- linux-2.4.18.org/include/linux/hdreg.h Fri Nov 23 03:46:18 2001=0A=
+++ linux/include/linux/hdreg.h Wed Mar 13 02:30:46 2002=0A=
@@ -81,6 +81,14 @@=0A=
=0A=
#define WIN_SMART 0xB0 /* self-monitoring and reporting */=0A=
=0A=
+/* Additianal command for 48 Bit LBA */=0A=
+#define READ_EXT 0x24=0A=
+#define WRITE_EXT 0x34=0A=
+#define MULTI_READ_EXT 0x29=0A=
+#define MULTI_WRITE_EXT 0x39=0A=
+#define READ_DMA_EXT 0x25=0A=
+#define WRITE_DMA_EXT 0x35=0A=
+=0A=
/* Additional drive command codes used by ATAPI devices. */=0A=
#define WIN_PIDENTIFY 0xA1 /* identify ATAPI device */=0A=
#define WIN_SRST 0x08 /* ATAPI soft reset command */=0A=
diff -urN linux-2.4.18.org/include/linux/pci_ids.h =
linux/include/linux/pci_ids.h=0A=
--- linux-2.4.18.org/include/linux/pci_ids.h Tue Feb 26 03:38:13 2002=0A=
+++ linux/include/linux/pci_ids.h Wed Feb 27 19:45:18 2002=0A=
@@ -603,7 +603,6 @@=0A=
#define PCI_DEVICE_ID_PROMISE_20246 0x4d33=0A=
#define PCI_DEVICE_ID_PROMISE_20262 0x4d38=0A=
#define PCI_DEVICE_ID_PROMISE_20268 0x4d68=0A=
-#define PCI_DEVICE_ID_PROMISE_20268R 0x6268=0A=
#define PCI_DEVICE_ID_PROMISE_20269 0x4d69=0A=
#define PCI_DEVICE_ID_PROMISE_20275 0x1275=0A=
#define PCI_DEVICE_ID_PROMISE_5300 0x5300=0A=
------=_NextPart_000_0081_01C20307.3C49F750--
-
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/