Commit f0342e66 authored by Martyn Welch's avatar Martyn Welch Committed by Greg Kroah-Hartman

VME: Correct read/write alignment algorithm

In order to ensure the correct width cycles on the VME bus, the VME bridge
drivers implement an algorithm to utilise the largest possible width reads and
writes whilst maintaining natural alignment constraints. The algorithm
currently looks at the start address rather than the current read/write address
when determining whether a 16-bit width cycle is required to get to 32-bit
alignment.  This results in incorrect alignment,
Reported-by: default avatarJim Strouth <james.strouth@ge.com>
Tested-by: default avatarJim Strouth <james.strouth@ge.com>
Signed-off-by: default avatarMartyn Welch <martyn.welch@ge.com>
Cc: stable <stable@vger.kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 5cb906c7
...@@ -884,7 +884,7 @@ static ssize_t ca91cx42_master_read(struct vme_master_resource *image, ...@@ -884,7 +884,7 @@ static ssize_t ca91cx42_master_read(struct vme_master_resource *image,
if (done == count) if (done == count)
goto out; goto out;
} }
if ((uintptr_t)addr & 0x2) { if ((uintptr_t)(addr + done) & 0x2) {
if ((count - done) < 2) { if ((count - done) < 2) {
*(u8 *)(buf + done) = ioread8(addr + done); *(u8 *)(buf + done) = ioread8(addr + done);
done += 1; done += 1;
...@@ -938,7 +938,7 @@ static ssize_t ca91cx42_master_write(struct vme_master_resource *image, ...@@ -938,7 +938,7 @@ static ssize_t ca91cx42_master_write(struct vme_master_resource *image,
if (done == count) if (done == count)
goto out; goto out;
} }
if ((uintptr_t)addr & 0x2) { if ((uintptr_t)(addr + done) & 0x2) {
if ((count - done) < 2) { if ((count - done) < 2) {
iowrite8(*(u8 *)(buf + done), addr + done); iowrite8(*(u8 *)(buf + done), addr + done);
done += 1; done += 1;
......
...@@ -1289,7 +1289,7 @@ static ssize_t tsi148_master_read(struct vme_master_resource *image, void *buf, ...@@ -1289,7 +1289,7 @@ static ssize_t tsi148_master_read(struct vme_master_resource *image, void *buf,
if (done == count) if (done == count)
goto out; goto out;
} }
if ((uintptr_t)addr & 0x2) { if ((uintptr_t)(addr + done) & 0x2) {
if ((count - done) < 2) { if ((count - done) < 2) {
*(u8 *)(buf + done) = ioread8(addr + done); *(u8 *)(buf + done) = ioread8(addr + done);
done += 1; done += 1;
...@@ -1371,7 +1371,7 @@ static ssize_t tsi148_master_write(struct vme_master_resource *image, void *buf, ...@@ -1371,7 +1371,7 @@ static ssize_t tsi148_master_write(struct vme_master_resource *image, void *buf,
if (done == count) if (done == count)
goto out; goto out;
} }
if ((uintptr_t)addr & 0x2) { if ((uintptr_t)(addr + done) & 0x2) {
if ((count - done) < 2) { if ((count - done) < 2) {
iowrite8(*(u8 *)(buf + done), addr + done); iowrite8(*(u8 *)(buf + done), addr + done);
done += 1; done += 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment