diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00dev.c')
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00dev.c | 54 | 
1 files changed, 34 insertions, 20 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index c8b9ef0c21f8..b16521e6bf4a 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c @@ -334,7 +334,7 @@ void rt2x00lib_txdone(struct queue_entry *entry,  	/*  	 * Remove the extra tx headroom from the skb.  	 */ -	skb_pull(entry->skb, rt2x00dev->ops->extra_tx_headroom); +	skb_pull(entry->skb, rt2x00dev->extra_tx_headroom);  	/*  	 * Signal that the TX descriptor is no longer in the skb. @@ -1049,7 +1049,7 @@ static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev)  	 */  	rt2x00dev->hw->extra_tx_headroom =  		max_t(unsigned int, IEEE80211_TX_STATUS_HEADROOM, -		      rt2x00dev->ops->extra_tx_headroom); +		      rt2x00dev->extra_tx_headroom);  	/*  	 * Take TX headroom required for alignment into account. @@ -1077,7 +1077,7 @@ static int rt2x00lib_probe_hw(struct rt2x00_dev *rt2x00dev)  		 */  		int kfifo_size =  			roundup_pow_of_two(rt2x00dev->ops->tx_queues * -					   rt2x00dev->ops->tx->entry_num * +					   rt2x00dev->tx->limit *  					   sizeof(u32));  		status = kfifo_alloc(&rt2x00dev->txstatus_fifo, kfifo_size, @@ -1256,6 +1256,17 @@ static inline void rt2x00lib_set_if_combinations(struct rt2x00_dev *rt2x00dev)  	rt2x00dev->hw->wiphy->n_iface_combinations = 1;  } +static unsigned int rt2x00dev_extra_tx_headroom(struct rt2x00_dev *rt2x00dev) +{ +	if (WARN_ON(!rt2x00dev->tx)) +		return 0; + +	if (rt2x00_is_usb(rt2x00dev)) +		return rt2x00dev->tx[0].winfo_size + rt2x00dev->tx[0].desc_size; + +	return rt2x00dev->tx[0].winfo_size; +} +  /*   * driver allocation handlers.   */ @@ -1301,23 +1312,6 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)  		(rt2x00dev->ops->max_ap_intf - 1);  	/* -	 * Determine which operating modes are supported, all modes -	 * which require beaconing, depend on the availability of -	 * beacon entries. -	 */ -	rt2x00dev->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION); -	if (rt2x00dev->ops->bcn->entry_num > 0) -		rt2x00dev->hw->wiphy->interface_modes |= -		    BIT(NL80211_IFTYPE_ADHOC) | -		    BIT(NL80211_IFTYPE_AP) | -#ifdef CONFIG_MAC80211_MESH -		    BIT(NL80211_IFTYPE_MESH_POINT) | -#endif -		    BIT(NL80211_IFTYPE_WDS); - -	rt2x00dev->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; - -	/*  	 * Initialize work.  	 */  	rt2x00dev->workqueue = @@ -1347,6 +1341,26 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev)  	if (retval)  		goto exit; +	/* Cache TX headroom value */ +	rt2x00dev->extra_tx_headroom = rt2x00dev_extra_tx_headroom(rt2x00dev); + +	/* +	 * Determine which operating modes are supported, all modes +	 * which require beaconing, depend on the availability of +	 * beacon entries. +	 */ +	rt2x00dev->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION); +	if (rt2x00dev->bcn->limit > 0) +		rt2x00dev->hw->wiphy->interface_modes |= +		    BIT(NL80211_IFTYPE_ADHOC) | +		    BIT(NL80211_IFTYPE_AP) | +#ifdef CONFIG_MAC80211_MESH +		    BIT(NL80211_IFTYPE_MESH_POINT) | +#endif +		    BIT(NL80211_IFTYPE_WDS); + +	rt2x00dev->hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; +  	/*  	 * Initialize ieee80211 structure.  	 */  | 
