lkml.org 
[lkml]   [2019]   [Sep]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 3.16 033/132] hwmon: (vt1211) Use request_muxed_region for Super-IO accesses
    3.16.74-rc1 review patch.  If anyone has any objections, please let me know.

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

    From: Guenter Roeck <linux@roeck-us.net>

    commit 14b97ba5c20056102b3dd22696bf17b057e60976 upstream.

    Super-IO accesses may fail on a system with no or unmapped LPC bus.

    Also, other drivers may attempt to access the LPC bus at the same time,
    resulting in undefined behavior.

    Use request_muxed_region() to ensure that IO access on the requested
    address space is supported, and to ensure that access by multiple drivers
    is synchronized.

    Fixes: 2219cd81a6cd ("hwmon/vt1211: Add probing of alternate config index port")
    Signed-off-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
    ---
    drivers/hwmon/vt1211.c | 15 ++++++++++++---
    1 file changed, 12 insertions(+), 3 deletions(-)

    --- a/drivers/hwmon/vt1211.c
    +++ b/drivers/hwmon/vt1211.c
    @@ -226,15 +226,21 @@ static inline void superio_select(int si
    outb(ldn, sio_cip + 1);
    }

    -static inline void superio_enter(int sio_cip)
    +static inline int superio_enter(int sio_cip)
    {
    + if (!request_muxed_region(sio_cip, 2, DRVNAME))
    + return -EBUSY;
    +
    outb(0x87, sio_cip);
    outb(0x87, sio_cip);
    +
    + return 0;
    }

    static inline void superio_exit(int sio_cip)
    {
    outb(0xaa, sio_cip);
    + release_region(sio_cip, 2);
    }

    /* ---------------------------------------------------------------------
    @@ -1280,11 +1286,14 @@ EXIT:

    static int __init vt1211_find(int sio_cip, unsigned short *address)
    {
    - int err = -ENODEV;
    + int err;
    int devid;

    - superio_enter(sio_cip);
    + err = superio_enter(sio_cip);
    + if (err)
    + return err;

    + err = -ENODEV;
    devid = force_id ? force_id : superio_inb(sio_cip, SIO_VT1211_DEVID);
    if (devid != SIO_VT1211_ID)
    goto EXIT;
    \
     
     \ /
      Last update: 2019-09-20 16:37    [W:2.216 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site