source: trunk/target/linux/ixp4xx/patches-2.6.33/312-ixp4xx_pata_optimization.patch @ 20792

Last change on this file since 20792 was 20792, checked in by acoul, 6 years ago

ixp4xx: add 2.6.33 support

File size: 3.4 KB
  • drivers/ata/pata_ixp4xx_cf.c

    a b  
    2424#include <scsi/scsi_host.h> 
    2525 
    2626#define DRV_NAME        "pata_ixp4xx_cf" 
    27 #define DRV_VERSION     "0.2" 
     27#define DRV_VERSION     "0.3" 
    2828 
    2929static int ixp4xx_set_mode(struct ata_link *link, struct ata_device **error) 
    3030{ 
    3131        struct ata_device *dev; 
     32        struct ixp4xx_pata_data *data = link->ap->host->dev->platform_data; 
     33        unsigned int pio_mask; 
    3234 
    3335        ata_for_each_dev(dev, link, ENABLED) { 
    34                 ata_dev_printk(dev, KERN_INFO, "configured for PIO0\n"); 
    35                 dev->pio_mode = XFER_PIO_0; 
    36                 dev->xfer_mode = XFER_PIO_0; 
     36                if (dev->id[ATA_ID_FIELD_VALID] & (1 << 1)) { 
     37                        pio_mask = dev->id[ATA_ID_PIO_MODES] & 0x03; 
     38                        if (pio_mask & (1 << 1)) { 
     39                                pio_mask = 4; 
     40                        } else { 
     41                                pio_mask = 3; 
     42                        } 
     43                } else { 
     44                        pio_mask = (dev->id[ATA_ID_OLD_PIO_MODES] >> 8); 
     45                } 
     46 
     47                switch (pio_mask){ 
     48                        case 0: 
     49                                ata_dev_printk(dev, KERN_INFO, "configured for PIO0\n"); 
     50                                dev->pio_mode = XFER_PIO_0; 
     51                                dev->xfer_mode = XFER_PIO_0; 
     52                                *data->cs0_cfg = 0x8a473c03; 
     53                                break; 
     54                        case 1: 
     55                                ata_dev_printk(dev, KERN_INFO, "configured for PIO1\n"); 
     56                                dev->pio_mode = XFER_PIO_1; 
     57                                dev->xfer_mode = XFER_PIO_1; 
     58                                *data->cs0_cfg = 0x86433c03; 
     59                                break; 
     60                        case 2: 
     61                                ata_dev_printk(dev, KERN_INFO, "configured for PIO2\n"); 
     62                                dev->pio_mode = XFER_PIO_2; 
     63                                dev->xfer_mode = XFER_PIO_2; 
     64                                *data->cs0_cfg = 0x82413c03; 
     65                                break; 
     66                        case 3: 
     67                                ata_dev_printk(dev, KERN_INFO, "configured for PIO3\n"); 
     68                                dev->pio_mode = XFER_PIO_3; 
     69                                dev->xfer_mode = XFER_PIO_3; 
     70                                *data->cs0_cfg = 0x80823c03; 
     71                                break; 
     72                        case 4: 
     73                                ata_dev_printk(dev, KERN_INFO, "configured for PIO4\n"); 
     74                                dev->pio_mode = XFER_PIO_4; 
     75                                dev->xfer_mode = XFER_PIO_4; 
     76                                *data->cs0_cfg = 0x80403c03; 
     77                                break; 
     78                } 
    3779                dev->xfer_shift = ATA_SHIFT_PIO; 
    3880                dev->flags |= ATA_DFLAG_PIO; 
    3981        } 
    static unsigned int ixp4xx_mmio_data_xfe 
    4688        unsigned int i; 
    4789        unsigned int words = buflen >> 1; 
    4890        u16 *buf16 = (u16 *) buf; 
     91        unsigned int pio_mask; 
    4992        struct ata_port *ap = dev->link->ap; 
    5093        void __iomem *mmio = ap->ioaddr.data_addr; 
    5194        struct ixp4xx_pata_data *data = ap->host->dev->platform_data; 
    static unsigned int ixp4xx_mmio_data_xfe 
    5396        /* set the expansion bus in 16bit mode and restore 
    5497         * 8 bit mode after the transaction. 
    5598         */ 
    56         *data->cs0_cfg &= ~(0x01); 
    57         udelay(100); 
     99        if (dev->id[ATA_ID_FIELD_VALID] & (1 << 1)){ 
     100                pio_mask = dev->id[ATA_ID_PIO_MODES] & 0x03; 
     101                if (pio_mask & (1 << 1)){ 
     102                        pio_mask = 4; 
     103                }else{ 
     104                        pio_mask = 3; 
     105                } 
     106        }else{ 
     107                pio_mask = (dev->id[ATA_ID_OLD_PIO_MODES] >> 8); 
     108        } 
     109        switch (pio_mask){ 
     110                case 0: 
     111                        *data->cs0_cfg = 0xa9643c42; 
     112                break; 
     113                case 1: 
     114                        *data->cs0_cfg = 0x85033c42; 
     115                break; 
     116                case 2: 
     117                        *data->cs0_cfg = 0x80b23c42; 
     118                break; 
     119                case 3: 
     120                        *data->cs0_cfg = 0x80823c42; 
     121                break; 
     122                case 4: 
     123                        *data->cs0_cfg = 0x80403c42; 
     124                break; 
     125        } 
     126        udelay(5); 
    58127 
    59128        /* Transfer multiple of 2 bytes */ 
    60129        if (rw == READ) 
    static unsigned int ixp4xx_mmio_data_xfe 
    79148                words++; 
    80149        } 
    81150 
    82         udelay(100); 
    83         *data->cs0_cfg |= 0x01; 
     151        udelay(5); 
     152        switch (pio_mask){ 
     153                case 0: 
     154                        *data->cs0_cfg = 0x8a473c03; 
     155                break; 
     156                case 1: 
     157                        *data->cs0_cfg = 0x86433c03; 
     158                break; 
     159                case 2: 
     160                        *data->cs0_cfg = 0x82413c03; 
     161                break; 
     162                case 3: 
     163                        *data->cs0_cfg = 0x80823c03; 
     164                break; 
     165                case 4: 
     166                        *data->cs0_cfg = 0x80403c03; 
     167                break; 
     168        } 
    84169 
    85170        return words << 1; 
    86171} 
Note: See TracBrowser for help on using the repository browser.