lkml.org 
[lkml]   [2012]   [Jan]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[057/129] i2c: Fix error value returned by several bus drivers
    3.2-stable review patch.  If anyone has any objections, please let me know.

    ------------------
    Content-Length: 5429
    Lines: 183

    From: Jean Delvare <khali@linux-fr.org>

    commit 7c1f59c9d5caf3a84f35549b5d58f3c055a68da5 upstream.

    When adding checks for ACPI resource conflicts to many bus drivers,
    not enough attention was paid to the error paths, and for several
    drivers this causes 0 to be returned on error in some cases. Fix this
    by properly returning a non-zero value on every error.

    Signed-off-by: Jean Delvare <khali@linux-fr.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    drivers/i2c/busses/i2c-ali1535.c | 11 +++++++----
    drivers/i2c/busses/i2c-nforce2.c | 2 +-
    drivers/i2c/busses/i2c-sis5595.c | 4 ++--
    drivers/i2c/busses/i2c-sis630.c | 6 +++++-
    drivers/i2c/busses/i2c-viapro.c | 7 +++++--
    5 files changed, 20 insertions(+), 10 deletions(-)

    --- a/drivers/i2c/busses/i2c-ali1535.c
    +++ b/drivers/i2c/busses/i2c-ali1535.c
    @@ -140,7 +140,7 @@ static unsigned short ali1535_smba;
    defined to make the transition easier. */
    static int __devinit ali1535_setup(struct pci_dev *dev)
    {
    - int retval = -ENODEV;
    + int retval;
    unsigned char temp;

    /* Check the following things:
    @@ -155,6 +155,7 @@ static int __devinit ali1535_setup(struc
    if (ali1535_smba == 0) {
    dev_warn(&dev->dev,
    "ALI1535_smb region uninitialized - upgrade BIOS?\n");
    + retval = -ENODEV;
    goto exit;
    }

    @@ -167,6 +168,7 @@ static int __devinit ali1535_setup(struc
    ali1535_driver.name)) {
    dev_err(&dev->dev, "ALI1535_smb region 0x%x already in use!\n",
    ali1535_smba);
    + retval = -EBUSY;
    goto exit;
    }

    @@ -174,6 +176,7 @@ static int __devinit ali1535_setup(struc
    pci_read_config_byte(dev, SMBCFG, &temp);
    if ((temp & ALI1535_SMBIO_EN) == 0) {
    dev_err(&dev->dev, "SMB device not enabled - upgrade BIOS?\n");
    + retval = -ENODEV;
    goto exit_free;
    }

    @@ -181,6 +184,7 @@ static int __devinit ali1535_setup(struc
    pci_read_config_byte(dev, SMBHSTCFG, &temp);
    if ((temp & 1) == 0) {
    dev_err(&dev->dev, "SMBus controller not enabled - upgrade BIOS?\n");
    + retval = -ENODEV;
    goto exit_free;
    }

    @@ -198,12 +202,11 @@ static int __devinit ali1535_setup(struc
    dev_dbg(&dev->dev, "SMBREV = 0x%X\n", temp);
    dev_dbg(&dev->dev, "ALI1535_smba = 0x%X\n", ali1535_smba);

    - retval = 0;
    -exit:
    - return retval;
    + return 0;

    exit_free:
    release_region(ali1535_smba, ALI1535_SMB_IOSIZE);
    +exit:
    return retval;
    }

    --- a/drivers/i2c/busses/i2c-nforce2.c
    +++ b/drivers/i2c/busses/i2c-nforce2.c
    @@ -356,7 +356,7 @@ static int __devinit nforce2_probe_smb (
    error = acpi_check_region(smbus->base, smbus->size,
    nforce2_driver.name);
    if (error)
    - return -1;
    + return error;

    if (!request_region(smbus->base, smbus->size, nforce2_driver.name)) {
    dev_err(&smbus->adapter.dev, "Error requesting region %02x .. %02X for %s\n",
    --- a/drivers/i2c/busses/i2c-sis5595.c
    +++ b/drivers/i2c/busses/i2c-sis5595.c
    @@ -147,7 +147,7 @@ static int __devinit sis5595_setup(struc
    u16 a;
    u8 val;
    int *i;
    - int retval = -ENODEV;
    + int retval;

    /* Look for imposters */
    for (i = blacklist; *i != 0; i++) {
    @@ -223,7 +223,7 @@ static int __devinit sis5595_setup(struc

    error:
    release_region(sis5595_base + SMB_INDEX, 2);
    - return retval;
    + return -ENODEV;
    }

    static int sis5595_transaction(struct i2c_adapter *adap)
    --- a/drivers/i2c/busses/i2c-sis630.c
    +++ b/drivers/i2c/busses/i2c-sis630.c
    @@ -393,7 +393,7 @@ static int __devinit sis630_setup(struct
    {
    unsigned char b;
    struct pci_dev *dummy = NULL;
    - int retval = -ENODEV, i;
    + int retval, i;

    /* check for supported SiS devices */
    for (i=0; supported[i] > 0 ; i++) {
    @@ -418,18 +418,21 @@ static int __devinit sis630_setup(struct
    */
    if (pci_read_config_byte(sis630_dev, SIS630_BIOS_CTL_REG,&b)) {
    dev_err(&sis630_dev->dev, "Error: Can't read bios ctl reg\n");
    + retval = -ENODEV;
    goto exit;
    }
    /* if ACPI already enabled , do nothing */
    if (!(b & 0x80) &&
    pci_write_config_byte(sis630_dev, SIS630_BIOS_CTL_REG, b | 0x80)) {
    dev_err(&sis630_dev->dev, "Error: Can't enable ACPI\n");
    + retval = -ENODEV;
    goto exit;
    }

    /* Determine the ACPI base address */
    if (pci_read_config_word(sis630_dev,SIS630_ACPI_BASE_REG,&acpi_base)) {
    dev_err(&sis630_dev->dev, "Error: Can't determine ACPI base address\n");
    + retval = -ENODEV;
    goto exit;
    }

    @@ -445,6 +448,7 @@ static int __devinit sis630_setup(struct
    sis630_driver.name)) {
    dev_err(&sis630_dev->dev, "SMBus registers 0x%04x-0x%04x already "
    "in use!\n", acpi_base + SMB_STS, acpi_base + SMB_SAA);
    + retval = -EBUSY;
    goto exit;
    }

    --- a/drivers/i2c/busses/i2c-viapro.c
    +++ b/drivers/i2c/busses/i2c-viapro.c
    @@ -324,7 +324,7 @@ static int __devinit vt596_probe(struct
    const struct pci_device_id *id)
    {
    unsigned char temp;
    - int error = -ENODEV;
    + int error;

    /* Determine the address of the SMBus areas */
    if (force_addr) {
    @@ -390,6 +390,7 @@ found:
    dev_err(&pdev->dev, "SMBUS: Error: Host SMBus "
    "controller not enabled! - upgrade BIOS or "
    "use force=1\n");
    + error = -ENODEV;
    goto release_region;
    }
    }
    @@ -422,9 +423,11 @@ found:
    "SMBus Via Pro adapter at %04x", vt596_smba);

    vt596_pdev = pci_dev_get(pdev);
    - if (i2c_add_adapter(&vt596_adapter)) {
    + error = i2c_add_adapter(&vt596_adapter);
    + if (error) {
    pci_dev_put(vt596_pdev);
    vt596_pdev = NULL;
    + goto release_region;
    }

    /* Always return failure here. This is to allow other drivers to bind



    \
     
     \ /
      Last update: 2012-01-24 04:09    [W:4.058 / U:0.124 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site