|
@@ -131,15 +131,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);
|
|
|
}
|
|
|
|
|
@@ -951,6 +955,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;
|
|
|
init_completion(&rtlpriv->firmware_loading_complete);
|
|
|
SET_IEEE80211_DEV(hw, &intf->dev);
|