config
docs
include
package
scripts
target
imagebuilder
linux
adm5120
adm8668
amazon
ar7
ar71xx
at91
atheros
au1000
avr32
brcm2708
brcm47xx
brcm63xx
cns21xx
cns3xxx
cobalt
coldfire
ep93xx
etrax
gemini
generic
goldfish
imx21
iop32x
ipq806x
ixp4xx
base-files
generic
harddisk
image
patches-3.3
020-gateworks_i2c_pld.patch
090-increase_entropy_pools.patch
100-wg302v2_gateway7001_mac_plat_info.patch
105-wg302v1_support.patch
110-pronghorn_series_support.patch
111-pronghorn_swap_uarts.patch
115-sidewinder_support.patch
116-sidewinder_fis_location.patch
120-compex_support.patch
130-wrt300nv2_support.patch
131-wrt300nv2_mac_plat_info.patch
132-wrt300nv2_mac_fix.patch
150-lanready_ap1000_support.patch
151-lanready_ap1000_mac_plat_info.patch
160-delayed_uart_io.patch
162-wg302v1_mem_fixup.patch
170-ixdpg425_mac_plat_info.patch
175-avila_hss_audio_support.patch
180-tw5334_support.patch
185-mi424wr_support.patch
190-cambria_support.patch
201-npe_driver_print_license_location.patch
203-npe_driver_mask_phy_features.patch
205-npe_driver_separate_phy_functions.patch
206-npe_driver_add_update_link_function.patch
207-npe_driver_multiphy_support.patch
295-latch_led_driver.patch
300-avila_support.patch
304-ixp4xx_eth_jumboframe.patch
310-gtwx5717_spi_bus.patch
311-gtwx5717_mac_plat_info.patch
312-ixp4xx_pata_optimization.patch
402-ixp4xx_gpiolib.patch
500-usr8200_support.patch
520-tw2662_support.patch
600-skb_avoid_dmabounce.patch
900-ixp4xx-crypto-include-module.h.patch
Makefile
config-3.3
modules.mk
kirkwood
lantiq
leon
malta
mcs814x
mpc52xx
mpc83xx
mpc85xx
octeon
omap24xx
omap35xx
omap4
orion
ppc40x
ppc44x
ps3
pxa
pxcab
ramips
rb532
rdc
realview
s3c24xx
sibyte
sparc
ubicom32
uml
x86
xburst
Makefile
sdk
toolchain
Config.in
Makefile
toolchain
tools
.gitattributes
.gitignore
BSDmakefile
Config.in
LICENSE
Makefile
README
feeds.conf.default
rules.mk
138 lines
3.4 KiB
Diff
138 lines
3.4 KiB
Diff
--- a/drivers/ata/pata_ixp4xx_cf.c
|
|
+++ b/drivers/ata/pata_ixp4xx_cf.c
|
|
@@ -24,16 +24,58 @@
|
|
#include <scsi/scsi_host.h>
|
|
|
|
#define DRV_NAME "pata_ixp4xx_cf"
|
|
-#define DRV_VERSION "0.2"
|
|
+#define DRV_VERSION "0.3"
|
|
|
|
static int ixp4xx_set_mode(struct ata_link *link, struct ata_device **error)
|
|
{
|
|
+ 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_dev_info(dev, "configured for PIO0\n");
|
|
- dev->pio_mode = XFER_PIO_0;
|
|
- dev->xfer_mode = XFER_PIO_0;
|
|
+ if (dev->id[ATA_ID_FIELD_VALID] & (1 << 1)) {
|
|
+ pio_mask = dev->id[ATA_ID_PIO_MODES] & 0x03;
|
|
+ if (pio_mask & (1 << 1)) {
|
|
+ pio_mask = 4;
|
|
+ } else {
|
|
+ pio_mask = 3;
|
|
+ }
|
|
+ } 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;
|
|
+ }
|
|
dev->xfer_shift = ATA_SHIFT_PIO;
|
|
dev->flags |= ATA_DFLAG_PIO;
|
|
}
|
|
@@ -46,6 +88,7 @@ static unsigned int ixp4xx_mmio_data_xfe
|
|
unsigned int i;
|
|
unsigned int words = buflen >> 1;
|
|
u16 *buf16 = (u16 *) buf;
|
|
+ unsigned int pio_mask;
|
|
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 +96,34 @@ static unsigned int ixp4xx_mmio_data_xfe
|
|
/* set the expansion bus in 16bit mode and restore
|
|
* 8 bit mode after the transaction.
|
|
*/
|
|
- *data->cs0_cfg &= ~(0x01);
|
|
- udelay(100);
|
|
+ if (dev->id[ATA_ID_FIELD_VALID] & (1 << 1)){
|
|
+ pio_mask = dev->id[ATA_ID_PIO_MODES] & 0x03;
|
|
+ if (pio_mask & (1 << 1)){
|
|
+ pio_mask = 4;
|
|
+ }else{
|
|
+ pio_mask = 3;
|
|
+ }
|
|
+ }else{
|
|
+ pio_mask = (dev->id[ATA_ID_OLD_PIO_MODES] >> 8);
|
|
+ }
|
|
+ switch (pio_mask){
|
|
+ case 0:
|
|
+ *data->cs0_cfg = 0xa9643c42;
|
|
+ break;
|
|
+ case 1:
|
|
+ *data->cs0_cfg = 0x85033c42;
|
|
+ break;
|
|
+ case 2:
|
|
+ *data->cs0_cfg = 0x80b23c42;
|
|
+ break;
|
|
+ case 3:
|
|
+ *data->cs0_cfg = 0x80823c42;
|
|
+ break;
|
|
+ case 4:
|
|
+ *data->cs0_cfg = 0x80403c42;
|
|
+ break;
|
|
+ }
|
|
+ udelay(5);
|
|
|
|
/* Transfer multiple of 2 bytes */
|
|
if (rw == READ)
|
|
@@ -79,8 +148,24 @@ static unsigned int ixp4xx_mmio_data_xfe
|
|
words++;
|
|
}
|
|
|
|
- udelay(100);
|
|
- *data->cs0_cfg |= 0x01;
|
|
+ udelay(5);
|
|
+ switch (pio_mask){
|
|
+ case 0:
|
|
+ *data->cs0_cfg = 0x8a473c03;
|
|
+ break;
|
|
+ case 1:
|
|
+ *data->cs0_cfg = 0x86433c03;
|
|
+ break;
|
|
+ case 2:
|
|
+ *data->cs0_cfg = 0x82413c03;
|
|
+ break;
|
|
+ case 3:
|
|
+ *data->cs0_cfg = 0x80823c03;
|
|
+ break;
|
|
+ case 4:
|
|
+ *data->cs0_cfg = 0x80403c03;
|
|
+ break;
|
|
+ }
|
|
|
|
return words << 1;
|
|
}
|