1 --- a/drivers/ata/pata_ixp4xx_cf.c
2 +++ b/drivers/ata/pata_ixp4xx_cf.c
4 #include <scsi/scsi_host.h>
6 #define DRV_NAME "pata_ixp4xx_cf"
7 -#define DRV_VERSION "0.2"
8 +#define DRV_VERSION "0.3"
10 static int ixp4xx_set_mode(struct ata_link *link, struct ata_device **error)
12 struct ata_device *dev;
13 + struct ixp4xx_pata_data *data = link->ap->host->dev->platform_data;
14 + unsigned int pio_mask;
16 ata_link_for_each_dev(dev, link) {
17 + if (dev->id[ATA_ID_FIELD_VALID] & (1 << 1)){
18 + pio_mask = dev->id[ATA_ID_PIO_MODES] & 0x03;
19 + if (pio_mask & (1 << 1)){
25 + pio_mask = (dev->id[ATA_ID_OLD_PIO_MODES] >> 8);
29 + ata_dev_printk(dev, KERN_INFO, "configured for PIO0\n");
30 + dev->pio_mode = XFER_PIO_0;
31 + dev->xfer_mode = XFER_PIO_0;
32 + *data->cs0_cfg = 0x8a473c03;
35 + ata_dev_printk(dev, KERN_INFO, "configured for PIO1\n");
36 + dev->pio_mode = XFER_PIO_1;
37 + dev->xfer_mode = XFER_PIO_1;
38 + *data->cs0_cfg = 0x86433c03;
41 + ata_dev_printk(dev, KERN_INFO, "configured for PIO2\n");
42 + dev->pio_mode = XFER_PIO_2;
43 + dev->xfer_mode = XFER_PIO_2;
44 + *data->cs0_cfg = 0x82413c03;
47 + ata_dev_printk(dev, KERN_INFO, "configured for PIO3\n");
48 + dev->pio_mode = XFER_PIO_3;
49 + dev->xfer_mode = XFER_PIO_3;
50 + *data->cs0_cfg = 0x80823c03;
53 + ata_dev_printk(dev, KERN_INFO, "configured for PIO4\n");
54 + dev->pio_mode = XFER_PIO_4;
55 + dev->xfer_mode = XFER_PIO_4;
56 + *data->cs0_cfg = 0x80403c03;
59 if (ata_dev_enabled(dev)) {
60 - ata_dev_printk(dev, KERN_INFO, "configured for PIO0\n");
61 - dev->pio_mode = XFER_PIO_0;
62 - dev->xfer_mode = XFER_PIO_0;
63 dev->xfer_shift = ATA_SHIFT_PIO;
64 dev->flags |= ATA_DFLAG_PIO;
66 @@ -48,6 +89,7 @@ static unsigned int ixp4xx_mmio_data_xfe
68 unsigned int words = buflen >> 1;
69 u16 *buf16 = (u16 *) buf;
70 + unsigned int pio_mask;
71 struct ata_port *ap = dev->link->ap;
72 void __iomem *mmio = ap->ioaddr.data_addr;
73 struct ixp4xx_pata_data *data = ap->host->dev->platform_data;
74 @@ -55,8 +97,34 @@ static unsigned int ixp4xx_mmio_data_xfe
75 /* set the expansion bus in 16bit mode and restore
76 * 8 bit mode after the transaction.
78 - *data->cs0_cfg &= ~(0x01);
80 + if (dev->id[ATA_ID_FIELD_VALID] & (1 << 1)){
81 + pio_mask = dev->id[ATA_ID_PIO_MODES] & 0x03;
82 + if (pio_mask & (1 << 1)){
88 + pio_mask = (dev->id[ATA_ID_OLD_PIO_MODES] >> 8);
92 + *data->cs0_cfg = 0xa9643c42;
95 + *data->cs0_cfg = 0x85033c42;
98 + *data->cs0_cfg = 0x80b23c42;
101 + *data->cs0_cfg = 0x80823c42;
104 + *data->cs0_cfg = 0x80403c42;
109 /* Transfer multiple of 2 bytes */
111 @@ -81,8 +149,24 @@ static unsigned int ixp4xx_mmio_data_xfe
116 - *data->cs0_cfg |= 0x01;
120 + *data->cs0_cfg = 0x8a473c03;
123 + *data->cs0_cfg = 0x86433c03;
126 + *data->cs0_cfg = 0x82413c03;
129 + *data->cs0_cfg = 0x80823c03;
132 + *data->cs0_cfg = 0x80403c03;