diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00mac.c')
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00mac.c | 44 | 
1 files changed, 25 insertions, 19 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c index f883802f350..004dff9b962 100644 --- a/drivers/net/wireless/rt2x00/rt2x00mac.c +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c @@ -13,9 +13,7 @@  	GNU General Public License for more details.  	You should have received a copy of the GNU General Public License -	along with this program; if not, write to the -	Free Software Foundation, Inc., -	59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +	along with this program; if not, see <http://www.gnu.org/licenses/>.   */  /* @@ -90,7 +88,7 @@ static int rt2x00mac_tx_rts_cts(struct rt2x00_dev *rt2x00dev,  				  frag_skb->data, data_length, tx_info,  				  (struct ieee80211_rts *)(skb->data)); -	retval = rt2x00queue_write_tx_frame(queue, skb, true); +	retval = rt2x00queue_write_tx_frame(queue, skb, NULL, true);  	if (retval) {  		dev_kfree_skb_any(skb);  		rt2x00_warn(rt2x00dev, "Failed to send RTS/CTS frame\n"); @@ -151,7 +149,7 @@ void rt2x00mac_tx(struct ieee80211_hw *hw,  			goto exit_fail;  	} -	if (unlikely(rt2x00queue_write_tx_frame(queue, skb, false))) +	if (unlikely(rt2x00queue_write_tx_frame(queue, skb, control->sta, false)))  		goto exit_fail;  	/* @@ -382,11 +380,11 @@ void rt2x00mac_configure_filter(struct ieee80211_hw *hw,  	 * of different types, but has no a separate filter for PS Poll frames,  	 * FIF_CONTROL flag implies FIF_PSPOLL.  	 */ -	if (!test_bit(CAPABILITY_CONTROL_FILTERS, &rt2x00dev->cap_flags)) { +	if (!rt2x00_has_cap_control_filters(rt2x00dev)) {  		if (*total_flags & FIF_CONTROL || *total_flags & FIF_PSPOLL)  			*total_flags |= FIF_CONTROL | FIF_PSPOLL;  	} -	if (!test_bit(CAPABILITY_CONTROL_FILTER_PSPOLL, &rt2x00dev->cap_flags)) { +	if (!rt2x00_has_cap_control_filter_pspoll(rt2x00dev)) {  		if (*total_flags & FIF_CONTROL)  			*total_flags |= FIF_PSPOLL;  	} @@ -469,7 +467,7 @@ int rt2x00mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,  	if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags))  		return 0; -	if (!test_bit(CAPABILITY_HW_CRYPTO, &rt2x00dev->cap_flags)) +	if (!rt2x00_has_cap_hw_crypto(rt2x00dev))  		return -EOPNOTSUPP;  	/* @@ -489,6 +487,8 @@ int rt2x00mac_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,  	crypto.cipher = rt2x00crypto_key_to_cipher(key);  	if (crypto.cipher == CIPHER_NONE)  		return -EOPNOTSUPP; +	if (crypto.cipher == CIPHER_TKIP && rt2x00_is_usb(rt2x00dev)) +		return -EOPNOTSUPP;  	crypto.cmd = cmd; @@ -623,20 +623,18 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw,  				      bss_conf->bssid);  	/* -	 * Update the beacon. This is only required on USB devices. PCI -	 * devices fetch beacons periodically. -	 */ -	if (changes & BSS_CHANGED_BEACON && rt2x00_is_usb(rt2x00dev)) -		rt2x00queue_update_beacon(rt2x00dev, vif); - -	/*  	 * Start/stop beaconing.  	 */  	if (changes & BSS_CHANGED_BEACON_ENABLED) {  		if (!bss_conf->enable_beacon && intf->enable_beacon) { -			rt2x00queue_clear_beacon(rt2x00dev, vif);  			rt2x00dev->intf_beaconing--;  			intf->enable_beacon = false; +			/* +			 * Clear beacon in the H/W for this vif. This is needed +			 * to disable beaconing on this particular interface +			 * and keep it running on other interfaces. +			 */ +			rt2x00queue_clear_beacon(rt2x00dev, vif);  			if (rt2x00dev->intf_beaconing == 0) {  				/* @@ -647,11 +645,15 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw,  				rt2x00queue_stop_queue(rt2x00dev->bcn);  				mutex_unlock(&intf->beacon_skb_mutex);  			} - -  		} else if (bss_conf->enable_beacon && !intf->enable_beacon) {  			rt2x00dev->intf_beaconing++;  			intf->enable_beacon = true; +			/* +			 * Upload beacon to the H/W. This is only required on +			 * USB devices. PCI devices fetch beacons periodically. +			 */ +			if (rt2x00_is_usb(rt2x00dev)) +				rt2x00queue_update_beacon(rt2x00dev, vif);  			if (rt2x00dev->intf_beaconing == 1) {  				/* @@ -749,11 +751,15 @@ void rt2x00mac_rfkill_poll(struct ieee80211_hw *hw)  }  EXPORT_SYMBOL_GPL(rt2x00mac_rfkill_poll); -void rt2x00mac_flush(struct ieee80211_hw *hw, u32 queues, bool drop) +void rt2x00mac_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif, +		     u32 queues, bool drop)  {  	struct rt2x00_dev *rt2x00dev = hw->priv;  	struct data_queue *queue; +	if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags)) +		return; +  	tx_queue_for_each(rt2x00dev, queue)  		rt2x00queue_flush_queue(queue, drop);  }  | 
