Prev: cyber2000fb: fix machine hang on module load
Next: [PATCH v2 0/9] kconfig: introduce saveconfig and alldefconfig (+more)
From: Giel van Schijndel on 31 Jul 2010 17:30 On Sun, Apr 25, 2010 at 12:35:40 +0200, Giel van Schijndel wrote: > On Thu, Mar 25, 2010 at 14:17:42 +0100, Giel van Schijndel wrote: >> Sleep while acquiring a resource lock on the Super I/O port. This >> should prevent collisions from causing the hardware probe to fail >> with -EBUSY. > > Fix a bug which caused f71882fg_find() to pretend to be succesfull on > Super I/O ports which didn't have a Fintek chip attached. This was > caused by returning 0 instead of -ENODEV, adding several 'err = > -ENODEV' statements preceding the 'goto exit' statements fixed this. > > Patch follows this line: > ======================================================================== > Sleep while acquiring a resource lock on the Super I/O port. This > should prevent collisions from causing the hardware probe to fail with > -EBUSY. > > Signed-off-by: Giel van Schijndel <me(a)mortis.eu> All of this patch's dependencies now reside in mainline, so I'd like to "renew" the request for applying it. -- Met vriendelijke groet, With kind regards, Giel van Schijndel
From: Hans de Goede on 4 Aug 2010 07:40
Ack! Acked-by: Hans de Goede <hdegoede(a)redhat.com> On 08/01/2010 03:30 PM, Giel van Schijndel wrote: > Sleep while acquiring a resource lock on the Super I/O port. This should > prevent collisions from causing the hardware probe to fail with -EBUSY. > > Signed-off-by: Giel van Schijndel<me(a)mortis.eu> > --- > drivers/hwmon/f71882fg.c | 32 +++++++++++++++++++------------- > 1 files changed, 19 insertions(+), 13 deletions(-) > > diff --git a/drivers/hwmon/f71882fg.c b/drivers/hwmon/f71882fg.c > index 7857ed3..267cb92 100644 > --- a/drivers/hwmon/f71882fg.c > +++ b/drivers/hwmon/f71882fg.c > @@ -113,7 +113,7 @@ static struct platform_device *f71882fg_pdev; > /* Super-I/O Function prototypes */ > static inline int superio_inb(int base, int reg); > static inline int superio_inw(int base, int reg); > -static inline void superio_enter(int base); > +static inline int superio_enter(int base); > static inline void superio_select(int base, int ld); > static inline void superio_exit(int base); > > @@ -883,11 +883,20 @@ static int superio_inw(int base, int reg) > return val; > } > > -static inline void superio_enter(int base) > +static inline int superio_enter(int base) > { > + /* Don't step on other drivers' I/O space by accident */ > + if (!request_muxed_region(base, 2, DRVNAME)) { > + printk(KERN_ERR DRVNAME ": I/O address 0x%04x already in use\n", > + base); > + return -EBUSY; > + } > + > /* according to the datasheet the key must be send twice! */ > outb(SIO_UNLOCK_KEY, base); > outb(SIO_UNLOCK_KEY, base); > + > + return 0; > } > > static inline void superio_select(int base, int ld) > @@ -899,6 +908,7 @@ static inline void superio_select(int base, int ld) > static inline void superio_exit(int base) > { > outb(SIO_LOCK_KEY, base); > + release_region(base, 2); > } > > static inline int fan_from_reg(u16 reg) > @@ -2239,21 +2249,15 @@ static int f71882fg_remove(struct platform_device *pdev) > static int __init f71882fg_find(int sioaddr, unsigned short *address, > struct f71882fg_sio_data *sio_data) > { > - int err = -ENODEV; > u16 devid; > - > - /* Don't step on other drivers' I/O space by accident */ > - if (!request_region(sioaddr, 2, DRVNAME)) { > - printk(KERN_ERR DRVNAME ": I/O address 0x%04x already in use\n", > - (int)sioaddr); > - return -EBUSY; > - } > - > - superio_enter(sioaddr); > + int err = superio_enter(sioaddr); > + if (err) > + return err; > > devid = superio_inw(sioaddr, SIO_REG_MANID); > if (devid != SIO_FINTEK_ID) { > pr_debug(DRVNAME ": Not a Fintek device\n"); > + err = -ENODEV; > goto exit; > } > > @@ -2280,6 +2284,7 @@ static int __init f71882fg_find(int sioaddr, unsigned short *address, > default: > printk(KERN_INFO DRVNAME ": Unsupported Fintek device: %04x\n", > (unsigned int)devid); > + err = -ENODEV; > goto exit; > } > > @@ -2290,12 +2295,14 @@ static int __init f71882fg_find(int sioaddr, unsigned short *address, > > if (!(superio_inb(sioaddr, SIO_REG_ENABLE)& 0x01)) { > printk(KERN_WARNING DRVNAME ": Device not activated\n"); > + err = -ENODEV; > goto exit; > } > > *address = superio_inw(sioaddr, SIO_REG_ADDR); > if (*address == 0) { > printk(KERN_WARNING DRVNAME ": Base address not set\n"); > + err = -ENODEV; > goto exit; > } > *address&= ~(REGION_LENGTH - 1); /* Ignore 3 LSB */ > @@ -2306,7 +2313,6 @@ static int __init f71882fg_find(int sioaddr, unsigned short *address, > (int)superio_inb(sioaddr, SIO_REG_DEVREV)); > exit: > superio_exit(sioaddr); > - release_region(sioaddr, 2); > return err; > } > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |