lkml.org 
[lkml]   [2014]   [Feb]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.12 49/82] VME: Correct read/write alignment algorithm
    Date
    3.12-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Martyn Welch <martyn.welch@ge.com>

    commit f0342e66b397947ed8c3eef8c37b5ca2d5b1bb50 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: Jim Strouth <james.strouth@ge.com>
    Tested-by: Jim Strouth <james.strouth@ge.com>
    Signed-off-by: Martyn Welch <martyn.welch@ge.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/vme/bridges/vme_ca91cx42.c | 4 ++--
    drivers/vme/bridges/vme_tsi148.c | 4 ++--
    2 files changed, 4 insertions(+), 4 deletions(-)

    --- a/drivers/vme/bridges/vme_ca91cx42.c
    +++ b/drivers/vme/bridges/vme_ca91cx42.c
    @@ -884,7 +884,7 @@ static ssize_t ca91cx42_master_read(stru
    if (done == count)
    goto out;
    }
    - if ((uintptr_t)addr & 0x2) {
    + if ((uintptr_t)(addr + done) & 0x2) {
    if ((count - done) < 2) {
    *(u8 *)(buf + done) = ioread8(addr + done);
    done += 1;
    @@ -938,7 +938,7 @@ static ssize_t ca91cx42_master_write(str
    if (done == count)
    goto out;
    }
    - if ((uintptr_t)addr & 0x2) {
    + if ((uintptr_t)(addr + done) & 0x2) {
    if ((count - done) < 2) {
    iowrite8(*(u8 *)(buf + done), addr + done);
    done += 1;
    --- a/drivers/vme/bridges/vme_tsi148.c
    +++ b/drivers/vme/bridges/vme_tsi148.c
    @@ -1289,7 +1289,7 @@ static ssize_t tsi148_master_read(struct
    if (done == count)
    goto out;
    }
    - if ((uintptr_t)addr & 0x2) {
    + if ((uintptr_t)(addr + done) & 0x2) {
    if ((count - done) < 2) {
    *(u8 *)(buf + done) = ioread8(addr + done);
    done += 1;
    @@ -1371,7 +1371,7 @@ static ssize_t tsi148_master_write(struc
    if (done == count)
    goto out;
    }
    - if ((uintptr_t)addr & 0x2) {
    + if ((uintptr_t)(addr + done) & 0x2) {
    if ((count - done) < 2) {
    iowrite8(*(u8 *)(buf + done), addr + done);
    done += 1;



    \
     
     \ /
      Last update: 2014-02-21 02:41    [W:4.090 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site