lkml.org 
[lkml]   [2017]   [Oct]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 33/50] mmc: sdio: fix alignment issue in struct sdio_func
    Date
    4.4-stable review patch.  If anyone has any objections, please let me know.

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

    From: Heiner Kallweit <hkallweit1@gmail.com>


    [ Upstream commit 5ef1ecf060f28ecef313b5723f1fd39bf5a35f56 ]

    Certain 64-bit systems (e.g. Amlogic Meson GX) require buffers to be
    used for DMA to be 8-byte-aligned. struct sdio_func has an embedded
    small DMA buffer not meeting this requirement.
    When testing switching to descriptor chain mode in meson-gx driver
    SDIO is broken therefore. Fix this by allocating the small DMA buffer
    separately as kmalloc ensures that the returned memory area is
    properly aligned for every basic data type.

    Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
    Tested-by: Helmut Klein <hgkr.klein@gmail.com>
    Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
    Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/mmc/core/sdio_bus.c | 12 +++++++++++-
    include/linux/mmc/sdio_func.h | 2 +-
    2 files changed, 12 insertions(+), 2 deletions(-)

    --- a/drivers/mmc/core/sdio_bus.c
    +++ b/drivers/mmc/core/sdio_bus.c
    @@ -266,7 +266,7 @@ static void sdio_release_func(struct dev
    sdio_free_func_cis(func);

    kfree(func->info);
    -
    + kfree(func->tmpbuf);
    kfree(func);
    }

    @@ -281,6 +281,16 @@ struct sdio_func *sdio_alloc_func(struct
    if (!func)
    return ERR_PTR(-ENOMEM);

    + /*
    + * allocate buffer separately to make sure it's properly aligned for
    + * DMA usage (incl. 64 bit DMA)
    + */
    + func->tmpbuf = kmalloc(4, GFP_KERNEL);
    + if (!func->tmpbuf) {
    + kfree(func);
    + return ERR_PTR(-ENOMEM);
    + }
    +
    func->card = card;

    device_initialize(&func->dev);
    --- a/include/linux/mmc/sdio_func.h
    +++ b/include/linux/mmc/sdio_func.h
    @@ -53,7 +53,7 @@ struct sdio_func {
    unsigned int state; /* function state */
    #define SDIO_STATE_PRESENT (1<<0) /* present in sysfs */

    - u8 tmpbuf[4]; /* DMA:able scratch buffer */
    + u8 *tmpbuf; /* DMA:able scratch buffer */

    unsigned num_info; /* number of info strings */
    const char **info; /* info strings */

    \
     
     \ /
      Last update: 2017-10-06 11:01    [W:3.523 / U:0.200 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site