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

VME: Correct read/write alignment algorithm

commit f0342e66 upstream.

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>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 24a50910
...@@ -880,7 +880,7 @@ static ssize_t ca91cx42_master_read(struct vme_master_resource *image, ...@@ -880,7 +880,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;
...@@ -934,7 +934,7 @@ static ssize_t ca91cx42_master_write(struct vme_master_resource *image, ...@@ -934,7 +934,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;
......
...@@ -1283,7 +1283,7 @@ static ssize_t tsi148_master_read(struct vme_master_resource *image, void *buf, ...@@ -1283,7 +1283,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;
...@@ -1365,7 +1365,7 @@ static ssize_t tsi148_master_write(struct vme_master_resource *image, void *buf, ...@@ -1365,7 +1365,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