libata fixes]
PATCH 1/1 libata fixes]
Any comments? ACK?
In pata_legacy and pata_winbond we've got bugs - cpu_to_le16() instead of cpu_to_le32(). Fortunately, both affected suckers are VLB, thus l-e-only, so we might get away with that unless we hit it with slop == 3 (hadn't checked if playing with badly aligned sg could trigger that). Still buggy... Moreover, pata_legacy, pata_winbond and pata_qdi forgot to initialize pad on the write side of 32bit case in their ->data_xfer(). Hopefully the hardware does't care, but still, sending uninitialized data to it...
Signed-off-by Al Viro <[email protected]>
---
drivers/ata/pata_legacy.c +3 -5
@@ -271,14 +271,12 @@ static void pdc_data_xfer_vlb(struct ata_device *adev, unsigned char *buf, unsigioread32_rep (ap->ioaddr.data_addr, buf, buflen >>2 );if (unlikely (slop)) { -u32 pad; +__le32 pad =0 ;if (write_data) {memcpy (&pad, buf + buflen - slop, slop); - pad =le32_to_cpu (pad); -iowrite32 (pad, ap->ioaddr.data_addr); +iowrite32 (le32_to_cpu (pad), ap->ioaddr.data_addr); }else { - pad =ioread32 (ap->ioaddr.data_addr); - pad =cpu_to_le16 (pad); + pad =cpu_to_le32 (ioread32 (ap->ioaddr.data_addr));memcpy (buf + buflen - slop, &pad, slop); } }
drivers/ata/pata_qdi.c +3 -5
@@ -136,14 +136,12 @@ static void qdi_data_xfer(struct ata_device *adev, unsigned char *buf, unsignedioread32_rep (ap->ioaddr.data_addr, buf, buflen >>2 );if (unlikely (slop)) { -u32 pad; +__le32 pad =0 ;if (write_data) {memcpy (&pad, buf + buflen - slop, slop); - pad =le32_to_cpu (pad); -iowrite32 (pad, ap->ioaddr.data_addr); +iowrite32 (le32_to_cpu (pad), ap->ioaddr.data_addr); }else { - pad =ioread32 (ap->ioaddr.data_addr); - pad =cpu_to_le32 (pad); + pad =cpu_to_le32 (ioread32 (ap->ioaddr.data_addr));memcpy (buf + buflen - slop, &pad, slop); } }
drivers/ata/pata_winbond.c +3 -5
@@ -104,14 +104,12 @@ static void winbond_data_xfer(struct ata_device *adev, unsigned char *buf, unsigioread32_rep (ap->ioaddr.data_addr, buf, buflen >>2 );if (unlikely (slop)) { -u32 pad; +__le32 pad =0 ;if (write_data) {memcpy (&pad, buf + buflen - slop, slop); - pad =le32_to_cpu (pad); -iowrite32 (pad, ap->ioaddr.data_addr); +iowrite32 (le32_to_cpu (pad), ap->ioaddr.data_addr); }else { - pad =ioread32 (ap->ioaddr.data_addr); - pad =cpu_to_le16 (pad); + pad =cpu_to_le32 (ioread32 (ap->ioaddr.data_addr));memcpy (buf + buflen - slop, &pad, slop); } }