From 68aae63d391d5ec49b19da74ce4c7f987d2b6eaa Mon Sep 17 00:00:00 2001 From: Sergei Shtylyov Date: Sun, 15 Feb 2009 23:30:38 +0400 Subject: [PATCH] --- yaml --- r: 147095 b: refs/heads/master c: 2102d7497393e982bf38ffe8f5fd3d487104880d h: refs/heads/master i: 147093: 07722c76b1ce925e626589f433c54b6725e4eac3 147091: d109a9cf7c4e886331fc28234491e0b6985d6763 147087: ba1c1a0df0595e37e45bd3e3f16357231f1634a3 v: v3 --- [refs] | 2 +- trunk/drivers/ata/libata-sff.c | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/[refs] b/[refs] index ff02ee1168d7..f58a269b6329 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 4da646b7b52552f3b43eae27ffa5aa2c200f6db6 +refs/heads/master: 2102d7497393e982bf38ffe8f5fd3d487104880d diff --git a/trunk/drivers/ata/libata-sff.c b/trunk/drivers/ata/libata-sff.c index bb18415d3d63..bbbb1fab1755 100644 --- a/trunk/drivers/ata/libata-sff.c +++ b/trunk/drivers/ata/libata-sff.c @@ -727,17 +727,23 @@ unsigned int ata_sff_data_xfer(struct ata_device *dev, unsigned char *buf, else iowrite16_rep(data_addr, buf, words); - /* Transfer trailing 1 byte, if any. */ + /* Transfer trailing byte, if any. */ if (unlikely(buflen & 0x01)) { - __le16 align_buf[1] = { 0 }; - unsigned char *trailing_buf = buf + buflen - 1; + unsigned char pad[2]; + /* Point buf to the tail of buffer */ + buf += buflen - 1; + + /* + * Use io*16_rep() accessors here as well to avoid pointlessly + * swapping bytes to and fro on the big endian machines... + */ if (rw == READ) { - align_buf[0] = cpu_to_le16(ioread16(data_addr)); - memcpy(trailing_buf, align_buf, 1); + ioread16_rep(data_addr, pad, 1); + *buf = pad[0]; } else { - memcpy(align_buf, trailing_buf, 1); - iowrite16(le16_to_cpu(align_buf[0]), data_addr); + pad[0] = *buf; + iowrite16_rep(data_addr, pad, 1); } words++; }