* rename the offset definition to avoid abiguity with the standard ATA IO address * read and write four bytes at once like the original driver does * use writesl() and readsl() which implicitly iterate over the data This patch assumes buflen to be a multiple of four, which is true for ATA devices. ATAPI support is not known, though unlikely, as the original driver always transfers 512 Bytes at once. In doubt, do the right thing and return the number of bytes actually consumed. Signed-off-by: Phil Sutter <n0-1@xxxxxxxxxxx> Acked-by: Sergei Shtyltov <sshtylyov@xxxxxxxxxxxxx> Acked-by: Bartlomiej Zolnierkiewicz <bzolnier@xxxxxxxxx> Acked-by: Florian Fainelli <florian@xxxxxxxxxxx> --- drivers/ata/pata_rb532_cf.c | 19 ++++++++----------- 1 files changed, 8 insertions(+), 11 deletions(-) diff --git a/drivers/ata/pata_rb532_cf.c b/drivers/ata/pata_rb532_cf.c index 576fc99..4479b04 100644 --- a/drivers/ata/pata_rb532_cf.c +++ b/drivers/ata/pata_rb532_cf.c @@ -43,7 +43,8 @@ #define RB500_CF_REG_BASE 0x0800 #define RB500_CF_REG_ERR 0x080D #define RB500_CF_REG_CTRL 0x080E -#define RB500_CF_REG_DATA 0x0C00 +/* 32bit buffered data register offset */ +#define RB500_CF_REG_DBUF32 0x0C00 struct rb532_cf_info { void __iomem *iobase; @@ -79,18 +80,14 @@ static unsigned int rb532_pata_data_xfer(struct ata_device *adev, unsigned char { struct ata_port *ap = adev->link->ap; void __iomem *ioaddr = ap->ioaddr.data_addr; - int retlen = buflen; - if (write_data) { - for (; buflen > 0; buflen--, buf++) - writeb(*buf, ioaddr); - } else { - for (; buflen > 0; buflen--, buf++) - *buf = readb(ioaddr); - } + if (write_data) + writesl(ioaddr, buf, buflen / sizeof(u32)); + else + readsl(ioaddr, buf, buflen / sizeof(u32)); rb532_pata_finish_io(adev->link->ap); - return retlen; + return buflen - buflen % sizeof(u32); } static void rb532_pata_freeze(struct ata_port *ap) @@ -158,7 +155,7 @@ static void rb532_pata_setup_ports(struct ata_host *ah) ata_sff_std_ports(&ap->ioaddr); - ap->ioaddr.data_addr = info->iobase + RB500_CF_REG_DATA; + ap->ioaddr.data_addr = info->iobase + RB500_CF_REG_DBUF32; ap->ioaddr.error_addr = info->iobase + RB500_CF_REG_ERR; } -- 1.5.6.4 -- To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html