mirror of
https://git.yoctoproject.org/meta-ti
synced 2026-07-16 22:38:04 +00:00
df83a59b6b
Signed-off-by: Koen Kooi <koen@dominion.thruhere.net> Signed-off-by: Denys Dmytriyenko <denys@ti.com>
78 lines
2.8 KiB
Diff
78 lines
2.8 KiB
Diff
From 9f32412e06d7c657dc0db00f1990196da0edc7b5 Mon Sep 17 00:00:00 2001
|
|
From: Larry Finger <Larry.Finger@lwfinger.net>
|
|
Date: Wed, 11 Jul 2012 14:37:28 -0500
|
|
Subject: [PATCH 14/38] rtlwifi: rtl8192cu: Change buffer allocation for
|
|
synchronous reads
|
|
|
|
commit 3ce4d85b76010525adedcc2555fa164bf706a2f3 upstream.
|
|
|
|
In commit a7959c1, the USB part of rtlwifi was switched to convert
|
|
_usb_read_sync() to using a preallocated buffer rather than one
|
|
that has been acquired using kmalloc. Although this routine is named
|
|
as though it were synchronous, there seem to be simultaneous users,
|
|
and the selection of the index to the data buffer is not multi-user
|
|
safe. This situation is addressed by adding a new spinlock. The routine
|
|
cannot sleep, thus a mutex is not allowed.
|
|
|
|
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
|
|
Signed-off-by: John W. Linville <linville@tuxdriver.com>
|
|
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
|
---
|
|
drivers/net/wireless/rtlwifi/usb.c | 14 +++++++++++---
|
|
drivers/net/wireless/rtlwifi/wifi.h | 1 +
|
|
2 files changed, 12 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c
|
|
index db34db6..a49e848 100644
|
|
--- a/drivers/net/wireless/rtlwifi/usb.c
|
|
+++ b/drivers/net/wireless/rtlwifi/usb.c
|
|
@@ -120,15 +120,19 @@ static u32 _usb_read_sync(struct rtl_priv *rtlpriv, u32 addr, u16 len)
|
|
u8 request;
|
|
u16 wvalue;
|
|
u16 index;
|
|
- __le32 *data = &rtlpriv->usb_data[rtlpriv->usb_data_index];
|
|
+ __le32 *data;
|
|
+ unsigned long flags;
|
|
|
|
+ spin_lock_irqsave(&rtlpriv->locks.usb_lock, flags);
|
|
+ if (++rtlpriv->usb_data_index >= RTL_USB_MAX_RX_COUNT)
|
|
+ rtlpriv->usb_data_index = 0;
|
|
+ data = &rtlpriv->usb_data[rtlpriv->usb_data_index];
|
|
+ spin_unlock_irqrestore(&rtlpriv->locks.usb_lock, flags);
|
|
request = REALTEK_USB_VENQT_CMD_REQ;
|
|
index = REALTEK_USB_VENQT_CMD_IDX; /* n/a */
|
|
|
|
wvalue = (u16)addr;
|
|
_usbctrl_vendorreq_sync_read(udev, request, wvalue, index, data, len);
|
|
- if (++rtlpriv->usb_data_index >= RTL_USB_MAX_RX_COUNT)
|
|
- rtlpriv->usb_data_index = 0;
|
|
return le32_to_cpu(*data);
|
|
}
|
|
|
|
@@ -909,6 +913,10 @@ int __devinit rtl_usb_probe(struct usb_interface *intf,
|
|
GFP_KERNEL);
|
|
if (!rtlpriv->usb_data)
|
|
return -ENOMEM;
|
|
+
|
|
+ /* this spin lock must be initialized early */
|
|
+ spin_lock_init(&rtlpriv->locks.usb_lock);
|
|
+
|
|
rtlpriv->usb_data_index = 0;
|
|
SET_IEEE80211_DEV(hw, &intf->dev);
|
|
udev = interface_to_usbdev(intf);
|
|
diff --git a/drivers/net/wireless/rtlwifi/wifi.h b/drivers/net/wireless/rtlwifi/wifi.h
|
|
index b1e9deb..deb87e9 100644
|
|
--- a/drivers/net/wireless/rtlwifi/wifi.h
|
|
+++ b/drivers/net/wireless/rtlwifi/wifi.h
|
|
@@ -1550,6 +1550,7 @@ struct rtl_locks {
|
|
spinlock_t rf_lock;
|
|
spinlock_t lps_lock;
|
|
spinlock_t waitq_lock;
|
|
+ spinlock_t usb_lock;
|
|
|
|
/*Dual mac*/
|
|
spinlock_t cck_and_rw_pagea_lock;
|
|
--
|
|
1.7.7.6
|
|
|