[patch 46/60] rtl8187: Fix lockups due to concurrent access to config routine

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Greg KH
Date: Monday, August 18, 2008 - 11:45 am

2.6.26-stable review patch.  If anyone has any objections, please let us know.

------------------
From: Larry Finger <Larry.Finger@lwfinger.net>

With the rtl8187 driver, the config routine is not protected against
access before a previous call has completed. When this happens, the
TX loopback that is needed to change channels may cause the chip to
be locked with a reset needed to restore communications. This patch
entered mainline as commit 7dcdd073bf78bb6958bbc12a1a47754a0f3c4721.

The problem was found by Herton Ronaldo Krzesinski <herton@mandriva.com.br>,
who also suggested this type of fix.

Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Acked-by: Herton Ronaldo Krzesinski <herton@mandriva.com.br>
Acked-by: Hin-Tak Leung <htl10@users.sourceforge.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>


---
 drivers/net/wireless/rtl8187.h     |    4 ++++
 drivers/net/wireless/rtl8187_dev.c |    3 +++
 2 files changed, 7 insertions(+)

--- a/drivers/net/wireless/rtl8187_dev.c
+++ b/drivers/net/wireless/rtl8187_dev.c
@@ -580,6 +580,7 @@ static int rtl8187_config(struct ieee802
 	struct rtl8187_priv *priv = dev->priv;
 	u32 reg;
 
+	mutex_lock(&priv->conf_mutex);
 	reg = rtl818x_ioread32(priv, &priv->map->TX_CONF);
 	/* Enable TX loopback on MAC level to avoid TX during channel
 	 * changes, as this has be seen to causes problems and the
@@ -610,6 +611,7 @@ static int rtl8187_config(struct ieee802
 	rtl818x_iowrite16(priv, &priv->map->ATIMTR_INTERVAL, 100);
 	rtl818x_iowrite16(priv, &priv->map->BEACON_INTERVAL, 100);
 	rtl818x_iowrite16(priv, &priv->map->BEACON_INTERVAL_TIME, 100);
+	mutex_unlock(&priv->conf_mutex);
 	return 0;
 }
 
@@ -814,6 +816,7 @@ static int __devinit rtl8187_probe(struc
 		printk(KERN_ERR "rtl8187: Cannot register device\n");
 		goto err_free_dev;
 	}
+	mutex_init(&priv->conf_mutex);
 
 	printk(KERN_INFO "%s: hwaddr %s, rtl8187 V%d + %s\n",
 	       wiphy_name(dev->wiphy), print_mac(mac, dev->wiphy->perm_addr),
--- a/drivers/net/wireless/rtl8187.h
+++ b/drivers/net/wireless/rtl8187.h
@@ -67,6 +67,10 @@ struct rtl8187_priv {
 	const struct rtl818x_rf_ops *rf;
 	struct ieee80211_vif *vif;
 	int mode;
+	/* The mutex protects the TX loopback state.
+	 * Any attempt to set channels concurrently locks the device.
+	 */
+	struct mutex conf_mutex;
 
 	/* rtl8187 specific */
 	struct ieee80211_channel channels[14];

-- 
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[patch 00/60] 2.6.26-stable review, Greg KH, (Mon Aug 18, 11:40 am)
[patch 01/60] mlock() fix return values, Greg KH, (Mon Aug 18, 11:41 am)
[patch 02/60] SCSI: ses: fix VPD inquiry overrun, Greg KH, (Mon Aug 18, 11:41 am)
[patch 06/60] vt8623fb: fix kernel oops, Greg KH, (Mon Aug 18, 11:41 am)
[patch 11/60] radeonfb: fix accel engine hangs, Greg KH, (Mon Aug 18, 11:42 am)
[patch 26/60] random32: seeding improvement, Greg KH, (Mon Aug 18, 11:43 am)
[patch 28/60] sparc64: FUTEX_OP_ANDN fix, Greg KH, (Mon Aug 18, 11:44 am)
[patch 41/60] x86: amd opteron TOM2 mask val fix, Greg KH, (Mon Aug 18, 11:44 am)
[patch 44/60] radeon: misc corrections, Greg KH, (Mon Aug 18, 11:45 am)
[patch 45/60] cs5520: add enablebits checking, Greg KH, (Mon Aug 18, 11:45 am)
[patch 46/60] rtl8187: Fix lockups due to concurrent acces ..., Greg KH, (Mon Aug 18, 11:45 am)
[patch 50/60] sparc64: Implement IRQ stacks., Greg KH, (Mon Aug 18, 11:45 am)
[patch 52/60] x86: fix spin_is_contended(), Greg KH, (Mon Aug 18, 11:45 am)