All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] rt2x00 fixes for rt2800.
@ 2009-11-14 19:20 Gertjan van Wingerde
  2009-11-14 19:20 ` [PATCH 1/2] rt2x00: Log RT/RF chipset information correctly Gertjan van Wingerde
  0 siblings, 1 reply; 6+ messages in thread
From: Gertjan van Wingerde @ 2009-11-14 19:20 UTC (permalink / raw)
  To: users, linux-wireless; +Cc: Ivo van Doorn, Bartlomiej Zolnierkiewicz

The next two patches fix a few issues with the current wireless-testing tree
with respect to the rt2x00 driver (rt2800).

---
Gertjan

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/2] rt2x00: Log RT/RF chipset information correctly.
  2009-11-14 19:20 [PATCH 0/2] rt2x00 fixes for rt2800 Gertjan van Wingerde
@ 2009-11-14 19:20 ` Gertjan van Wingerde
  2009-11-14 19:20   ` [PATCH 2/2] rt2x00: Fix BUG on rt2800usb when trying to read eFuse EEPROM Gertjan van Wingerde
  2009-11-14 19:34   ` [PATCH 1/2] rt2x00: Log RT/RF chipset information correctly Ivo van Doorn
  0 siblings, 2 replies; 6+ messages in thread
From: Gertjan van Wingerde @ 2009-11-14 19:20 UTC (permalink / raw)
  To: users, linux-wireless
  Cc: Ivo van Doorn, Bartlomiej Zolnierkiewicz, Gertjan van Wingerde

Some drivers (rt2800* most notably) cannot set the RF and RT chipset in
the correct order to have the information logging in rt2x00_set_chip
be correct.
Fix this by decoupling the setting of the chipset information from the
logging of the chipset information so that drivers can determine
themselves when all information is set.

Signed-off-by: Gertjan van Wingerde <gwingerde@gmail.com>
---
 drivers/net/wireless/rt2x00/rt2400pci.c |    1 +
 drivers/net/wireless/rt2x00/rt2500pci.c |    1 +
 drivers/net/wireless/rt2x00/rt2500usb.c |    1 +
 drivers/net/wireless/rt2x00/rt2800lib.c |    1 +
 drivers/net/wireless/rt2x00/rt2x00.h    |   11 +++++++----
 drivers/net/wireless/rt2x00/rt61pci.c   |    1 +
 drivers/net/wireless/rt2x00/rt73usb.c   |    1 +
 7 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
index 0f912f5..6e68bc7 100644
--- a/drivers/net/wireless/rt2x00/rt2400pci.c
+++ b/drivers/net/wireless/rt2x00/rt2400pci.c
@@ -1341,6 +1341,7 @@ static int rt2400pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
 	rt2x00pci_register_read(rt2x00dev, CSR0, &reg);
 	rt2x00_set_chip_rf(rt2x00dev, value, reg);
+	rt2x00_print_chip(rt2x00dev);
 
 	if (!rt2x00_rf(&rt2x00dev->chip, RF2420) &&
 	    !rt2x00_rf(&rt2x00dev->chip, RF2421)) {
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
index 6618cbd..9a31e5e 100644
--- a/drivers/net/wireless/rt2x00/rt2500pci.c
+++ b/drivers/net/wireless/rt2x00/rt2500pci.c
@@ -1505,6 +1505,7 @@ static int rt2500pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
 	rt2x00pci_register_read(rt2x00dev, CSR0, &reg);
 	rt2x00_set_chip_rf(rt2x00dev, value, reg);
+	rt2x00_print_chip(rt2x00dev);
 
 	if (!rt2x00_rf(&rt2x00dev->chip, RF2522) &&
 	    !rt2x00_rf(&rt2x00dev->chip, RF2523) &&
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
index bb64473..b2de43e 100644
--- a/drivers/net/wireless/rt2x00/rt2500usb.c
+++ b/drivers/net/wireless/rt2x00/rt2500usb.c
@@ -1409,6 +1409,7 @@ static int rt2500usb_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
 	rt2500usb_register_read(rt2x00dev, MAC_CSR0, &reg);
 	rt2x00_set_chip(rt2x00dev, RT2570, value, reg);
+	rt2x00_print_chip(rt2x00dev);
 
 	if (!rt2x00_check_rev(&rt2x00dev->chip, 0x000ffff0, 0) ||
 	    rt2x00_check_rev(&rt2x00dev->chip, 0x0000000f, 0)) {
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index d88857c..c710805 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -1854,6 +1854,7 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
 			return -ENODEV;
 		}
 	}
+	rt2x00_print_chip(rt2x00dev);
 
 	if (!rt2x00_rf(&rt2x00dev->chip, RF2820) &&
 	    !rt2x00_rf(&rt2x00dev->chip, RF2850) &&
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
index 62da572..1cbb7ac 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -906,10 +906,6 @@ static inline void rt2x00_eeprom_write(struct rt2x00_dev *rt2x00dev,
 static inline void rt2x00_set_chip(struct rt2x00_dev *rt2x00dev,
 				   const u16 rt, const u16 rf, const u32 rev)
 {
-	INFO(rt2x00dev,
-	     "Chipset detected - rt: %04x, rf: %04x, rev: %08x.\n",
-	     rt, rf, rev);
-
 	rt2x00dev->chip.rt = rt;
 	rt2x00dev->chip.rf = rf;
 	rt2x00dev->chip.rev = rev;
@@ -927,6 +923,13 @@ static inline void rt2x00_set_chip_rf(struct rt2x00_dev *rt2x00dev,
 	rt2x00_set_chip(rt2x00dev, rt2x00dev->chip.rt, rf, rev);
 }
 
+static inline void rt2x00_print_chip(struct rt2x00_dev *rt2x00dev)
+{
+	INFO(rt2x00dev,
+	     "Chipset detected - rt: %04x, rf: %04x, rev: %08x.\n",
+	     rt2x00dev->chip.rt, rt2x00dev->chip.rf, rt2x00dev->chip.rev);
+}
+
 static inline char rt2x00_rt(const struct rt2x00_chip *chipset, const u16 chip)
 {
 	return (chipset->rt == chip);
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index 6e46135..bf04605 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -2300,6 +2300,7 @@ static int rt61pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
 	rt2x00pci_register_read(rt2x00dev, MAC_CSR0, &reg);
 	rt2x00_set_chip_rf(rt2x00dev, value, reg);
+	rt2x00_print_chip(rt2x00dev);
 
 	if (!rt2x00_rf(&rt2x00dev->chip, RF5225) &&
 	    !rt2x00_rf(&rt2x00dev->chip, RF5325) &&
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
index 7236f01..5bbcf66 100644
--- a/drivers/net/wireless/rt2x00/rt73usb.c
+++ b/drivers/net/wireless/rt2x00/rt73usb.c
@@ -1825,6 +1825,7 @@ static int rt73usb_init_eeprom(struct rt2x00_dev *rt2x00dev)
 	value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
 	rt2x00usb_register_read(rt2x00dev, MAC_CSR0, &reg);
 	rt2x00_set_chip(rt2x00dev, RT2571, value, reg);
+	rt2x00_print_chip(rt2x00dev);
 
 	if (!rt2x00_check_rev(&rt2x00dev->chip, 0x000ffff0, 0x25730) ||
 	    rt2x00_check_rev(&rt2x00dev->chip, 0x0000000f, 0)) {
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH 2/2] rt2x00: Fix BUG on rt2800usb when trying to read eFuse EEPROM.
  2009-11-14 19:20 ` [PATCH 1/2] rt2x00: Log RT/RF chipset information correctly Gertjan van Wingerde
@ 2009-11-14 19:20   ` Gertjan van Wingerde
  2009-11-14 19:35     ` Ivo van Doorn
  2009-11-14 19:34   ` [PATCH 1/2] rt2x00: Log RT/RF chipset information correctly Ivo van Doorn
  1 sibling, 1 reply; 6+ messages in thread
From: Gertjan van Wingerde @ 2009-11-14 19:20 UTC (permalink / raw)
  To: users, linux-wireless
  Cc: Ivo van Doorn, Bartlomiej Zolnierkiewicz, Gertjan van Wingerde

Current tree hits a BUG_ON in rt2x00_regbusy_read, because the eFuse EEPROM
reading code of rt2800lib uses the function without the csr_mutex locked.

Fix this by locking the csr_mutex for the of the EEPROM reading cycly and
using the _lock variants of the register reading and writing functions.

This also introcudes the register_read_lock function pointer in the
rt2800_ops structure.

Signed-off-by: Gertjan van Wingerde <gwingerde@gmail.com>
---
 drivers/net/wireless/rt2x00/rt2800lib.c |   24 ++++++++++++++----------
 drivers/net/wireless/rt2x00/rt2800lib.h |   11 +++++++++++
 drivers/net/wireless/rt2x00/rt2800pci.c |    1 +
 drivers/net/wireless/rt2x00/rt2800usb.c |    1 +
 4 files changed, 27 insertions(+), 10 deletions(-)

diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index c710805..621dac1 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -1684,24 +1684,28 @@ static void rt2800_efuse_read(struct rt2x00_dev *rt2x00dev, unsigned int i)
 {
 	u32 reg;
 
-	rt2800_register_read(rt2x00dev, EFUSE_CTRL, &reg);
+	mutex_lock(&rt2x00dev->csr_mutex);
+
+	rt2800_register_read_lock(rt2x00dev, EFUSE_CTRL, &reg);
 	rt2x00_set_field32(&reg, EFUSE_CTRL_ADDRESS_IN, i);
 	rt2x00_set_field32(&reg, EFUSE_CTRL_MODE, 0);
 	rt2x00_set_field32(&reg, EFUSE_CTRL_KICK, 1);
-	rt2800_register_write(rt2x00dev, EFUSE_CTRL, reg);
+	rt2800_register_write_lock(rt2x00dev, EFUSE_CTRL, reg);
 
 	/* Wait until the EEPROM has been loaded */
 	rt2800_regbusy_read(rt2x00dev, EFUSE_CTRL, EFUSE_CTRL_KICK, &reg);
 
 	/* Apparently the data is read from end to start */
-	rt2800_register_read(rt2x00dev, EFUSE_DATA3,
-				(u32 *)&rt2x00dev->eeprom[i]);
-	rt2800_register_read(rt2x00dev, EFUSE_DATA2,
-				(u32 *)&rt2x00dev->eeprom[i + 2]);
-	rt2800_register_read(rt2x00dev, EFUSE_DATA1,
-				(u32 *)&rt2x00dev->eeprom[i + 4]);
-	rt2800_register_read(rt2x00dev, EFUSE_DATA0,
-				(u32 *)&rt2x00dev->eeprom[i + 6]);
+	rt2800_register_read_lock(rt2x00dev, EFUSE_DATA3,
+					(u32 *)&rt2x00dev->eeprom[i]);
+	rt2800_register_read_lock(rt2x00dev, EFUSE_DATA2,
+					(u32 *)&rt2x00dev->eeprom[i + 2]);
+	rt2800_register_read_lock(rt2x00dev, EFUSE_DATA1,
+					(u32 *)&rt2x00dev->eeprom[i + 4]);
+	rt2800_register_read_lock(rt2x00dev, EFUSE_DATA0,
+					(u32 *)&rt2x00dev->eeprom[i + 6]);
+
+	mutex_unlock(&rt2x00dev->csr_mutex);
 }
 
 void rt2800_read_eeprom_efuse(struct rt2x00_dev *rt2x00dev)
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.h b/drivers/net/wireless/rt2x00/rt2800lib.h
index 7c79011..535ce22 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.h
+++ b/drivers/net/wireless/rt2x00/rt2800lib.h
@@ -23,6 +23,8 @@
 struct rt2800_ops {
 	void (*register_read)(struct rt2x00_dev *rt2x00dev,
 			      const unsigned int offset, u32 *value);
+	void (*register_read_lock)(struct rt2x00_dev *rt2x00dev,
+				   const unsigned int offset, u32 *value);
 	void (*register_write)(struct rt2x00_dev *rt2x00dev,
 			       const unsigned int offset, u32 value);
 	void (*register_write_lock)(struct rt2x00_dev *rt2x00dev,
@@ -49,6 +51,15 @@ static inline void rt2800_register_read(struct rt2x00_dev *rt2x00dev,
 	rt2800ops->register_read(rt2x00dev, offset, value);
 }
 
+static inline void rt2800_register_read_lock(struct rt2x00_dev *rt2x00dev,
+					     const unsigned int offset,
+					     u32 *value)
+{
+	const struct rt2800_ops *rt2800ops = rt2x00dev->priv;
+
+	rt2800ops->register_read_lock(rt2x00dev, offset, value);
+}
+
 static inline void rt2800_register_write(struct rt2x00_dev *rt2x00dev,
 					 const unsigned int offset,
 					 u32 value)
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
index 46750f6..bb65ffa 100644
--- a/drivers/net/wireless/rt2x00/rt2800pci.c
+++ b/drivers/net/wireless/rt2x00/rt2800pci.c
@@ -1058,6 +1058,7 @@ static int rt2800pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
 
 static const struct rt2800_ops rt2800pci_rt2800_ops = {
 	.register_read		= rt2x00pci_register_read,
+	.register_read_lock	= rt2x00pci_register_read, /* same for PCI */
 	.register_write		= rt2x00pci_register_write,
 	.register_write_lock	= rt2x00pci_register_write, /* same for PCI */
 
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
index b57999b..b1d6393 100644
--- a/drivers/net/wireless/rt2x00/rt2800usb.c
+++ b/drivers/net/wireless/rt2x00/rt2800usb.c
@@ -682,6 +682,7 @@ static int rt2800usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
 
 static const struct rt2800_ops rt2800usb_rt2800_ops = {
 	.register_read		= rt2x00usb_register_read,
+	.register_read_lock	= rt2x00usb_register_read_lock,
 	.register_write		= rt2x00usb_register_write,
 	.register_write_lock	= rt2x00usb_register_write_lock,
 
-- 
1.6.5.2


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH 1/2] rt2x00: Log RT/RF chipset information correctly.
  2009-11-14 19:20 ` [PATCH 1/2] rt2x00: Log RT/RF chipset information correctly Gertjan van Wingerde
  2009-11-14 19:20   ` [PATCH 2/2] rt2x00: Fix BUG on rt2800usb when trying to read eFuse EEPROM Gertjan van Wingerde
@ 2009-11-14 19:34   ` Ivo van Doorn
  1 sibling, 0 replies; 6+ messages in thread
From: Ivo van Doorn @ 2009-11-14 19:34 UTC (permalink / raw)
  To: Gertjan van Wingerde; +Cc: users, linux-wireless, Bartlomiej Zolnierkiewicz

On Saturday 14 November 2009, Gertjan van Wingerde wrote:
> Some drivers (rt2800* most notably) cannot set the RF and RT chipset in
> the correct order to have the information logging in rt2x00_set_chip
> be correct.
> Fix this by decoupling the setting of the chipset information from the
> logging of the chipset information so that drivers can determine
> themselves when all information is set.
> 
> Signed-off-by: Gertjan van Wingerde <gwingerde@gmail.com>

Acked-by: Ivo van Doorn <IvDoorn@gmail.com>

> ---
>  drivers/net/wireless/rt2x00/rt2400pci.c |    1 +
>  drivers/net/wireless/rt2x00/rt2500pci.c |    1 +
>  drivers/net/wireless/rt2x00/rt2500usb.c |    1 +
>  drivers/net/wireless/rt2x00/rt2800lib.c |    1 +
>  drivers/net/wireless/rt2x00/rt2x00.h    |   11 +++++++----
>  drivers/net/wireless/rt2x00/rt61pci.c   |    1 +
>  drivers/net/wireless/rt2x00/rt73usb.c   |    1 +
>  7 files changed, 13 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c
> index 0f912f5..6e68bc7 100644
> --- a/drivers/net/wireless/rt2x00/rt2400pci.c
> +++ b/drivers/net/wireless/rt2x00/rt2400pci.c
> @@ -1341,6 +1341,7 @@ static int rt2400pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
>  	value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
>  	rt2x00pci_register_read(rt2x00dev, CSR0, &reg);
>  	rt2x00_set_chip_rf(rt2x00dev, value, reg);
> +	rt2x00_print_chip(rt2x00dev);
>  
>  	if (!rt2x00_rf(&rt2x00dev->chip, RF2420) &&
>  	    !rt2x00_rf(&rt2x00dev->chip, RF2421)) {
> diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c
> index 6618cbd..9a31e5e 100644
> --- a/drivers/net/wireless/rt2x00/rt2500pci.c
> +++ b/drivers/net/wireless/rt2x00/rt2500pci.c
> @@ -1505,6 +1505,7 @@ static int rt2500pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
>  	value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
>  	rt2x00pci_register_read(rt2x00dev, CSR0, &reg);
>  	rt2x00_set_chip_rf(rt2x00dev, value, reg);
> +	rt2x00_print_chip(rt2x00dev);
>  
>  	if (!rt2x00_rf(&rt2x00dev->chip, RF2522) &&
>  	    !rt2x00_rf(&rt2x00dev->chip, RF2523) &&
> diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c
> index bb64473..b2de43e 100644
> --- a/drivers/net/wireless/rt2x00/rt2500usb.c
> +++ b/drivers/net/wireless/rt2x00/rt2500usb.c
> @@ -1409,6 +1409,7 @@ static int rt2500usb_init_eeprom(struct rt2x00_dev *rt2x00dev)
>  	value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
>  	rt2500usb_register_read(rt2x00dev, MAC_CSR0, &reg);
>  	rt2x00_set_chip(rt2x00dev, RT2570, value, reg);
> +	rt2x00_print_chip(rt2x00dev);
>  
>  	if (!rt2x00_check_rev(&rt2x00dev->chip, 0x000ffff0, 0) ||
>  	    rt2x00_check_rev(&rt2x00dev->chip, 0x0000000f, 0)) {
> diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
> index d88857c..c710805 100644
> --- a/drivers/net/wireless/rt2x00/rt2800lib.c
> +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
> @@ -1854,6 +1854,7 @@ int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
>  			return -ENODEV;
>  		}
>  	}
> +	rt2x00_print_chip(rt2x00dev);
>  
>  	if (!rt2x00_rf(&rt2x00dev->chip, RF2820) &&
>  	    !rt2x00_rf(&rt2x00dev->chip, RF2850) &&
> diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
> index 62da572..1cbb7ac 100644
> --- a/drivers/net/wireless/rt2x00/rt2x00.h
> +++ b/drivers/net/wireless/rt2x00/rt2x00.h
> @@ -906,10 +906,6 @@ static inline void rt2x00_eeprom_write(struct rt2x00_dev *rt2x00dev,
>  static inline void rt2x00_set_chip(struct rt2x00_dev *rt2x00dev,
>  				   const u16 rt, const u16 rf, const u32 rev)
>  {
> -	INFO(rt2x00dev,
> -	     "Chipset detected - rt: %04x, rf: %04x, rev: %08x.\n",
> -	     rt, rf, rev);
> -
>  	rt2x00dev->chip.rt = rt;
>  	rt2x00dev->chip.rf = rf;
>  	rt2x00dev->chip.rev = rev;
> @@ -927,6 +923,13 @@ static inline void rt2x00_set_chip_rf(struct rt2x00_dev *rt2x00dev,
>  	rt2x00_set_chip(rt2x00dev, rt2x00dev->chip.rt, rf, rev);
>  }
>  
> +static inline void rt2x00_print_chip(struct rt2x00_dev *rt2x00dev)
> +{
> +	INFO(rt2x00dev,
> +	     "Chipset detected - rt: %04x, rf: %04x, rev: %08x.\n",
> +	     rt2x00dev->chip.rt, rt2x00dev->chip.rf, rt2x00dev->chip.rev);
> +}
> +
>  static inline char rt2x00_rt(const struct rt2x00_chip *chipset, const u16 chip)
>  {
>  	return (chipset->rt == chip);
> diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
> index 6e46135..bf04605 100644
> --- a/drivers/net/wireless/rt2x00/rt61pci.c
> +++ b/drivers/net/wireless/rt2x00/rt61pci.c
> @@ -2300,6 +2300,7 @@ static int rt61pci_init_eeprom(struct rt2x00_dev *rt2x00dev)
>  	value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
>  	rt2x00pci_register_read(rt2x00dev, MAC_CSR0, &reg);
>  	rt2x00_set_chip_rf(rt2x00dev, value, reg);
> +	rt2x00_print_chip(rt2x00dev);
>  
>  	if (!rt2x00_rf(&rt2x00dev->chip, RF5225) &&
>  	    !rt2x00_rf(&rt2x00dev->chip, RF5325) &&
> diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
> index 7236f01..5bbcf66 100644
> --- a/drivers/net/wireless/rt2x00/rt73usb.c
> +++ b/drivers/net/wireless/rt2x00/rt73usb.c
> @@ -1825,6 +1825,7 @@ static int rt73usb_init_eeprom(struct rt2x00_dev *rt2x00dev)
>  	value = rt2x00_get_field16(eeprom, EEPROM_ANTENNA_RF_TYPE);
>  	rt2x00usb_register_read(rt2x00dev, MAC_CSR0, &reg);
>  	rt2x00_set_chip(rt2x00dev, RT2571, value, reg);
> +	rt2x00_print_chip(rt2x00dev);
>  
>  	if (!rt2x00_check_rev(&rt2x00dev->chip, 0x000ffff0, 0x25730) ||
>  	    rt2x00_check_rev(&rt2x00dev->chip, 0x0000000f, 0)) {



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] rt2x00: Fix BUG on rt2800usb when trying to read eFuse EEPROM.
  2009-11-14 19:20   ` [PATCH 2/2] rt2x00: Fix BUG on rt2800usb when trying to read eFuse EEPROM Gertjan van Wingerde
@ 2009-11-14 19:35     ` Ivo van Doorn
  2009-11-15 13:09       ` Bartlomiej Zolnierkiewicz
  0 siblings, 1 reply; 6+ messages in thread
From: Ivo van Doorn @ 2009-11-14 19:35 UTC (permalink / raw)
  To: Gertjan van Wingerde; +Cc: users, linux-wireless, Bartlomiej Zolnierkiewicz

On Saturday 14 November 2009, Gertjan van Wingerde wrote:
> Current tree hits a BUG_ON in rt2x00_regbusy_read, because the eFuse EEPROM
> reading code of rt2800lib uses the function without the csr_mutex locked.
> 
> Fix this by locking the csr_mutex for the of the EEPROM reading cycly and
> using the _lock variants of the register reading and writing functions.
> 
> This also introcudes the register_read_lock function pointer in the
> rt2800_ops structure.
> 
> Signed-off-by: Gertjan van Wingerde <gwingerde@gmail.com>

Acked-by: Ivo van Doorn <IvDoorn@gmail.com>

> ---
>  drivers/net/wireless/rt2x00/rt2800lib.c |   24 ++++++++++++++----------
>  drivers/net/wireless/rt2x00/rt2800lib.h |   11 +++++++++++
>  drivers/net/wireless/rt2x00/rt2800pci.c |    1 +
>  drivers/net/wireless/rt2x00/rt2800usb.c |    1 +
>  4 files changed, 27 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
> index c710805..621dac1 100644
> --- a/drivers/net/wireless/rt2x00/rt2800lib.c
> +++ b/drivers/net/wireless/rt2x00/rt2800lib.c
> @@ -1684,24 +1684,28 @@ static void rt2800_efuse_read(struct rt2x00_dev *rt2x00dev, unsigned int i)
>  {
>  	u32 reg;
>  
> -	rt2800_register_read(rt2x00dev, EFUSE_CTRL, &reg);
> +	mutex_lock(&rt2x00dev->csr_mutex);
> +
> +	rt2800_register_read_lock(rt2x00dev, EFUSE_CTRL, &reg);
>  	rt2x00_set_field32(&reg, EFUSE_CTRL_ADDRESS_IN, i);
>  	rt2x00_set_field32(&reg, EFUSE_CTRL_MODE, 0);
>  	rt2x00_set_field32(&reg, EFUSE_CTRL_KICK, 1);
> -	rt2800_register_write(rt2x00dev, EFUSE_CTRL, reg);
> +	rt2800_register_write_lock(rt2x00dev, EFUSE_CTRL, reg);
>  
>  	/* Wait until the EEPROM has been loaded */
>  	rt2800_regbusy_read(rt2x00dev, EFUSE_CTRL, EFUSE_CTRL_KICK, &reg);
>  
>  	/* Apparently the data is read from end to start */
> -	rt2800_register_read(rt2x00dev, EFUSE_DATA3,
> -				(u32 *)&rt2x00dev->eeprom[i]);
> -	rt2800_register_read(rt2x00dev, EFUSE_DATA2,
> -				(u32 *)&rt2x00dev->eeprom[i + 2]);
> -	rt2800_register_read(rt2x00dev, EFUSE_DATA1,
> -				(u32 *)&rt2x00dev->eeprom[i + 4]);
> -	rt2800_register_read(rt2x00dev, EFUSE_DATA0,
> -				(u32 *)&rt2x00dev->eeprom[i + 6]);
> +	rt2800_register_read_lock(rt2x00dev, EFUSE_DATA3,
> +					(u32 *)&rt2x00dev->eeprom[i]);
> +	rt2800_register_read_lock(rt2x00dev, EFUSE_DATA2,
> +					(u32 *)&rt2x00dev->eeprom[i + 2]);
> +	rt2800_register_read_lock(rt2x00dev, EFUSE_DATA1,
> +					(u32 *)&rt2x00dev->eeprom[i + 4]);
> +	rt2800_register_read_lock(rt2x00dev, EFUSE_DATA0,
> +					(u32 *)&rt2x00dev->eeprom[i + 6]);
> +
> +	mutex_unlock(&rt2x00dev->csr_mutex);
>  }
>  
>  void rt2800_read_eeprom_efuse(struct rt2x00_dev *rt2x00dev)
> diff --git a/drivers/net/wireless/rt2x00/rt2800lib.h b/drivers/net/wireless/rt2x00/rt2800lib.h
> index 7c79011..535ce22 100644
> --- a/drivers/net/wireless/rt2x00/rt2800lib.h
> +++ b/drivers/net/wireless/rt2x00/rt2800lib.h
> @@ -23,6 +23,8 @@
>  struct rt2800_ops {
>  	void (*register_read)(struct rt2x00_dev *rt2x00dev,
>  			      const unsigned int offset, u32 *value);
> +	void (*register_read_lock)(struct rt2x00_dev *rt2x00dev,
> +				   const unsigned int offset, u32 *value);
>  	void (*register_write)(struct rt2x00_dev *rt2x00dev,
>  			       const unsigned int offset, u32 value);
>  	void (*register_write_lock)(struct rt2x00_dev *rt2x00dev,
> @@ -49,6 +51,15 @@ static inline void rt2800_register_read(struct rt2x00_dev *rt2x00dev,
>  	rt2800ops->register_read(rt2x00dev, offset, value);
>  }
>  
> +static inline void rt2800_register_read_lock(struct rt2x00_dev *rt2x00dev,
> +					     const unsigned int offset,
> +					     u32 *value)
> +{
> +	const struct rt2800_ops *rt2800ops = rt2x00dev->priv;
> +
> +	rt2800ops->register_read_lock(rt2x00dev, offset, value);
> +}
> +
>  static inline void rt2800_register_write(struct rt2x00_dev *rt2x00dev,
>  					 const unsigned int offset,
>  					 u32 value)
> diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c
> index 46750f6..bb65ffa 100644
> --- a/drivers/net/wireless/rt2x00/rt2800pci.c
> +++ b/drivers/net/wireless/rt2x00/rt2800pci.c
> @@ -1058,6 +1058,7 @@ static int rt2800pci_validate_eeprom(struct rt2x00_dev *rt2x00dev)
>  
>  static const struct rt2800_ops rt2800pci_rt2800_ops = {
>  	.register_read		= rt2x00pci_register_read,
> +	.register_read_lock	= rt2x00pci_register_read, /* same for PCI */
>  	.register_write		= rt2x00pci_register_write,
>  	.register_write_lock	= rt2x00pci_register_write, /* same for PCI */
>  
> diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
> index b57999b..b1d6393 100644
> --- a/drivers/net/wireless/rt2x00/rt2800usb.c
> +++ b/drivers/net/wireless/rt2x00/rt2800usb.c
> @@ -682,6 +682,7 @@ static int rt2800usb_validate_eeprom(struct rt2x00_dev *rt2x00dev)
>  
>  static const struct rt2800_ops rt2800usb_rt2800_ops = {
>  	.register_read		= rt2x00usb_register_read,
> +	.register_read_lock	= rt2x00usb_register_read_lock,
>  	.register_write		= rt2x00usb_register_write,
>  	.register_write_lock	= rt2x00usb_register_write_lock,
>  



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 2/2] rt2x00: Fix BUG on rt2800usb when trying to read eFuse EEPROM.
  2009-11-14 19:35     ` Ivo van Doorn
@ 2009-11-15 13:09       ` Bartlomiej Zolnierkiewicz
  0 siblings, 0 replies; 6+ messages in thread
From: Bartlomiej Zolnierkiewicz @ 2009-11-15 13:09 UTC (permalink / raw)
  To: Ivo van Doorn; +Cc: Gertjan van Wingerde, users, linux-wireless

On Saturday 14 November 2009 20:35:02 Ivo van Doorn wrote:
> On Saturday 14 November 2009, Gertjan van Wingerde wrote:
> > Current tree hits a BUG_ON in rt2x00_regbusy_read, because the eFuse EEPROM
> > reading code of rt2800lib uses the function without the csr_mutex locked.
> > 
> > Fix this by locking the csr_mutex for the of the EEPROM reading cycly and
> > using the _lock variants of the register reading and writing functions.
> > 
> > This also introcudes the register_read_lock function pointer in the
> > rt2800_ops structure.
> > 
> > Signed-off-by: Gertjan van Wingerde <gwingerde@gmail.com>
> 
> Acked-by: Ivo van Doorn <IvDoorn@gmail.com>

FWIW both patches are in rt2800 tree now.

Thanks.
-- 
Bartlomiej Zolnierkiewicz

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2009-11-15 13:38 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-11-14 19:20 [PATCH 0/2] rt2x00 fixes for rt2800 Gertjan van Wingerde
2009-11-14 19:20 ` [PATCH 1/2] rt2x00: Log RT/RF chipset information correctly Gertjan van Wingerde
2009-11-14 19:20   ` [PATCH 2/2] rt2x00: Fix BUG on rt2800usb when trying to read eFuse EEPROM Gertjan van Wingerde
2009-11-14 19:35     ` Ivo van Doorn
2009-11-15 13:09       ` Bartlomiej Zolnierkiewicz
2009-11-14 19:34   ` [PATCH 1/2] rt2x00: Log RT/RF chipset information correctly Ivo van Doorn

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.