diff options
Diffstat (limited to 'drivers/net/wireless/rtlwifi')
| -rw-r--r-- | drivers/net/wireless/rtlwifi/base.c | 5 | ||||
| -rw-r--r-- | drivers/net/wireless/rtlwifi/pci.c | 7 | ||||
| -rw-r--r-- | drivers/net/wireless/rtlwifi/rtl8192de/sw.c | 6 | ||||
| -rw-r--r-- | drivers/net/wireless/rtlwifi/usb.c | 34 | ||||
| -rw-r--r-- | drivers/net/wireless/rtlwifi/wifi.h | 6 | 
5 files changed, 31 insertions, 27 deletions
diff --git a/drivers/net/wireless/rtlwifi/base.c b/drivers/net/wireless/rtlwifi/base.c index 510023554e5..e54488db0e1 100644 --- a/drivers/net/wireless/rtlwifi/base.c +++ b/drivers/net/wireless/rtlwifi/base.c @@ -838,7 +838,10 @@ void rtl_get_tcb_desc(struct ieee80211_hw *hw,  	__le16 fc = hdr->frame_control;  	txrate = ieee80211_get_tx_rate(hw, info); -	tcb_desc->hw_rate = txrate->hw_value; +	if (txrate) +		tcb_desc->hw_rate = txrate->hw_value; +	else +		tcb_desc->hw_rate = 0;  	if (ieee80211_is_data(fc)) {  		/* diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c index 07dd38efe62..288b035a357 100644 --- a/drivers/net/wireless/rtlwifi/pci.c +++ b/drivers/net/wireless/rtlwifi/pci.c @@ -912,8 +912,13 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw)  	memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc));  	ring = &rtlpci->tx_ring[BEACON_QUEUE];  	pskb = __skb_dequeue(&ring->queue); -	if (pskb) +	if (pskb) { +		struct rtl_tx_desc *entry = &ring->desc[ring->idx]; +		pci_unmap_single(rtlpci->pdev, rtlpriv->cfg->ops->get_desc( +				 (u8 *) entry, true, HW_DESC_TXBUFF_ADDR), +				 pskb->len, PCI_DMA_TODEVICE);  		kfree_skb(pskb); +	}  	/*NB: the beacon data buffer must be 32-bit aligned. */  	pskb = ieee80211_beacon_get(hw, mac->vif); diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/sw.c b/drivers/net/wireless/rtlwifi/rtl8192de/sw.c index 4898c502974..480862c07f9 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192de/sw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192de/sw.c @@ -91,7 +91,6 @@ static int rtl92d_init_sw_vars(struct ieee80211_hw *hw)  	u8 tid;  	struct rtl_priv *rtlpriv = rtl_priv(hw);  	struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); -	static int header_print;  	rtlpriv->dm.dm_initialgain_enable = true;  	rtlpriv->dm.dm_flag = 0; @@ -171,10 +170,6 @@ static int rtl92d_init_sw_vars(struct ieee80211_hw *hw)  	for (tid = 0; tid < 8; tid++)  		skb_queue_head_init(&rtlpriv->mac80211.skb_waitq[tid]); -	/* Only load firmware for first MAC */ -	if (header_print) -		return 0; -  	/* for firmware buf */  	rtlpriv->rtlhal.pfirmware = vzalloc(0x8000);  	if (!rtlpriv->rtlhal.pfirmware) { @@ -186,7 +181,6 @@ static int rtl92d_init_sw_vars(struct ieee80211_hw *hw)  	rtlpriv->max_fw_size = 0x8000;  	pr_info("Driver for Realtek RTL8192DE WLAN interface\n");  	pr_info("Loading firmware file %s\n", rtlpriv->cfg->fw_name); -	header_print++;  	/* request fw */  	err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name, diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c index 2e1e352864b..d04dbda13f5 100644 --- a/drivers/net/wireless/rtlwifi/usb.c +++ b/drivers/net/wireless/rtlwifi/usb.c @@ -124,46 +124,38 @@ static int _usbctrl_vendorreq_sync_read(struct usb_device *udev, u8 request,  	return status;  } -static u32 _usb_read_sync(struct usb_device *udev, u32 addr, u16 len) +static u32 _usb_read_sync(struct rtl_priv *rtlpriv, u32 addr, u16 len)  { +	struct device *dev = rtlpriv->io.dev; +	struct usb_device *udev = to_usb_device(dev);  	u8 request;  	u16 wvalue;  	u16 index; -	u32 *data; -	u32 ret; +	__le32 *data = &rtlpriv->usb_data[rtlpriv->usb_data_index]; -	data = kmalloc(sizeof(u32), GFP_KERNEL); -	if (!data) -		return -ENOMEM;  	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); -	ret = le32_to_cpu(*data); -	kfree(data); -	return ret; +	if (++rtlpriv->usb_data_index >= RTL_USB_MAX_RX_COUNT) +		rtlpriv->usb_data_index = 0; +	return le32_to_cpu(*data);  }  static u8 _usb_read8_sync(struct rtl_priv *rtlpriv, u32 addr)  { -	struct device *dev = rtlpriv->io.dev; - -	return (u8)_usb_read_sync(to_usb_device(dev), addr, 1); +	return (u8)_usb_read_sync(rtlpriv, addr, 1);  }  static u16 _usb_read16_sync(struct rtl_priv *rtlpriv, u32 addr)  { -	struct device *dev = rtlpriv->io.dev; - -	return (u16)_usb_read_sync(to_usb_device(dev), addr, 2); +	return (u16)_usb_read_sync(rtlpriv, addr, 2);  }  static u32 _usb_read32_sync(struct rtl_priv *rtlpriv, u32 addr)  { -	struct device *dev = rtlpriv->io.dev; - -	return _usb_read_sync(to_usb_device(dev), addr, 4); +	return _usb_read_sync(rtlpriv, addr, 4);  }  static void _usb_write_async(struct usb_device *udev, u32 addr, u32 val, @@ -955,6 +947,11 @@ int __devinit rtl_usb_probe(struct usb_interface *intf,  		return -ENOMEM;  	}  	rtlpriv = hw->priv; +	rtlpriv->usb_data = kzalloc(RTL_USB_MAX_RX_COUNT * sizeof(u32), +				    GFP_KERNEL); +	if (!rtlpriv->usb_data) +		return -ENOMEM; +	rtlpriv->usb_data_index = 0;  	init_completion(&rtlpriv->firmware_loading_complete);  	SET_IEEE80211_DEV(hw, &intf->dev);  	udev = interface_to_usbdev(intf); @@ -1025,6 +1022,7 @@ void rtl_usb_disconnect(struct usb_interface *intf)  	/* rtl_deinit_rfkill(hw); */  	rtl_usb_deinit(hw);  	rtl_deinit_core(hw); +	kfree(rtlpriv->usb_data);  	rtlpriv->cfg->ops->deinit_sw_leds(hw);  	rtlpriv->cfg->ops->deinit_sw_vars(hw);  	_rtl_usb_io_handler_release(hw); diff --git a/drivers/net/wireless/rtlwifi/wifi.h b/drivers/net/wireless/rtlwifi/wifi.h index b591614c3b9..28ebc69218a 100644 --- a/drivers/net/wireless/rtlwifi/wifi.h +++ b/drivers/net/wireless/rtlwifi/wifi.h @@ -67,7 +67,7 @@  #define QOS_QUEUE_NUM				4  #define RTL_MAC80211_NUM_QUEUE			5  #define REALTEK_USB_VENQT_MAX_BUF_SIZE		254 - +#define RTL_USB_MAX_RX_COUNT			100  #define QBSS_LOAD_SIZE				5  #define MAX_WMMELE_LENGTH			64 @@ -1629,6 +1629,10 @@ struct rtl_priv {  	   interface or hardware */  	unsigned long status; +	/* data buffer pointer for USB reads */ +	__le32 *usb_data; +	int usb_data_index; +  	/*This must be the last item so  	   that it points to the data allocated  	   beyond  this structure like:  |