diff options
| -rw-r--r-- | target/linux/ixp4xx/patches-2.6.30/312-ixp4xx_pata_optimization.patch | 86 | 
1 files changed, 40 insertions, 46 deletions
diff --git a/target/linux/ixp4xx/patches-2.6.30/312-ixp4xx_pata_optimization.patch b/target/linux/ixp4xx/patches-2.6.30/312-ixp4xx_pata_optimization.patch index cba130525..3bf1b7497 100644 --- a/target/linux/ixp4xx/patches-2.6.30/312-ixp4xx_pata_optimization.patch +++ b/target/linux/ixp4xx/patches-2.6.30/312-ixp4xx_pata_optimization.patch @@ -1,6 +1,6 @@  --- a/drivers/ata/pata_ixp4xx_cf.c  +++ b/drivers/ata/pata_ixp4xx_cf.c -@@ -24,18 +24,61 @@ +@@ -24,16 +24,58 @@   #include <scsi/scsi_host.h>   #define DRV_NAME	"pata_ixp4xx_cf" @@ -9,17 +9,14 @@   static int ixp4xx_set_mode(struct ata_link *link, struct ata_device **error)   { + 	struct ata_device *dev;  +	struct ixp4xx_pata_data *data = link->ap->host->dev->platform_data;  +	unsigned int pio_mask; - 	struct ata_device *dev; --	ata_for_each_dev(dev, link, ENABLED) { + 	ata_for_each_dev(dev, link, ENABLED) {  -		ata_dev_printk(dev, KERN_INFO, "configured for PIO0\n");  -		dev->pio_mode = XFER_PIO_0;  -		dev->xfer_mode = XFER_PIO_0; --		dev->xfer_shift = ATA_SHIFT_PIO; --		dev->flags |= ATA_DFLAG_PIO; -+	ata_link_for_each_dev(dev, link) {  +		if (dev->id[ATA_ID_FIELD_VALID] & (1 << 1)) {  +			pio_mask = dev->id[ATA_ID_PIO_MODES] & 0x03;  +			if (pio_mask & (1 << 1)) { @@ -30,46 +27,43 @@  +		} else {  +			pio_mask = (dev->id[ATA_ID_OLD_PIO_MODES] >> 8);  +		} -+		switch (pio_mask) { -+		case 0: -+			ata_dev_printk(dev, KERN_INFO, "configured for PIO0\n"); -+			dev->pio_mode = XFER_PIO_0; -+			dev->xfer_mode = XFER_PIO_0; -+			*data->cs0_cfg = 0x8a473c03; -+			break; -+		case 1: -+			ata_dev_printk(dev, KERN_INFO, "configured for PIO1\n"); -+			dev->pio_mode = XFER_PIO_1; -+			dev->xfer_mode = XFER_PIO_1; -+			*data->cs0_cfg = 0x86433c03; -+			break; -+		case 2: -+			ata_dev_printk(dev, KERN_INFO, "configured for PIO2\n"); -+			dev->pio_mode = XFER_PIO_2; -+			dev->xfer_mode = XFER_PIO_2; -+			*data->cs0_cfg = 0x82413c03; -+			break; -+		case 3: -+			ata_dev_printk(dev, KERN_INFO, "configured for PIO3\n"); -+			dev->pio_mode = XFER_PIO_3; -+			dev->xfer_mode = XFER_PIO_3; -+			*data->cs0_cfg = 0x80823c03; -+			break; -+		case 4: -+			ata_dev_printk(dev, KERN_INFO, "configured for PIO4\n"); -+			dev->pio_mode = XFER_PIO_4; -+			dev->xfer_mode = XFER_PIO_4; -+			*data->cs0_cfg = 0x80403c03; -+			break; -+		} -+		if (ata_dev_enabled(dev)) { -+			dev->xfer_shift = ATA_SHIFT_PIO; -+			dev->flags |= ATA_DFLAG_PIO; ++ ++		switch (pio_mask){ ++			case 0: ++				ata_dev_printk(dev, KERN_INFO, "configured for PIO0\n"); ++				dev->pio_mode = XFER_PIO_0; ++				dev->xfer_mode = XFER_PIO_0; ++				*data->cs0_cfg = 0x8a473c03; ++				break; ++			case 1: ++				ata_dev_printk(dev, KERN_INFO, "configured for PIO1\n"); ++				dev->pio_mode = XFER_PIO_1; ++				dev->xfer_mode = XFER_PIO_1; ++				*data->cs0_cfg = 0x86433c03; ++				break; ++			case 2: ++				ata_dev_printk(dev, KERN_INFO, "configured for PIO2\n"); ++				dev->pio_mode = XFER_PIO_2; ++				dev->xfer_mode = XFER_PIO_2; ++				*data->cs0_cfg = 0x82413c03; ++				break; ++			case 3: ++				ata_dev_printk(dev, KERN_INFO, "configured for PIO3\n"); ++				dev->pio_mode = XFER_PIO_3; ++				dev->xfer_mode = XFER_PIO_3; ++				*data->cs0_cfg = 0x80823c03; ++				break; ++			case 4: ++				ata_dev_printk(dev, KERN_INFO, "configured for PIO4\n"); ++				dev->pio_mode = XFER_PIO_4; ++				dev->xfer_mode = XFER_PIO_4; ++				*data->cs0_cfg = 0x80403c03; ++				break;  +		} + 		dev->xfer_shift = ATA_SHIFT_PIO; + 		dev->flags |= ATA_DFLAG_PIO;   	} - 	return 0; - } -@@ -46,6 +89,7 @@ static unsigned int ixp4xx_mmio_data_xfe +@@ -46,6 +88,7 @@ static unsigned int ixp4xx_mmio_data_xfe   	unsigned int i;   	unsigned int words = buflen >> 1;   	u16 *buf16 = (u16 *) buf; @@ -77,7 +71,7 @@   	struct ata_port *ap = dev->link->ap;   	void __iomem *mmio = ap->ioaddr.data_addr;   	struct ixp4xx_pata_data *data = ap->host->dev->platform_data; -@@ -53,8 +97,34 @@ static unsigned int ixp4xx_mmio_data_xfe +@@ -53,8 +96,34 @@ static unsigned int ixp4xx_mmio_data_xfe   	/* set the expansion bus in 16bit mode and restore   	 * 8 bit mode after the transaction.   	 */ @@ -114,7 +108,7 @@   	/* Transfer multiple of 2 bytes */   	if (rw == READ) -@@ -79,8 +149,24 @@ static unsigned int ixp4xx_mmio_data_xfe +@@ -79,8 +148,24 @@ static unsigned int ixp4xx_mmio_data_xfe   		words++;   	}  | 
