diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00queue.c')
| -rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00queue.c | 13 | 
1 files changed, 6 insertions, 7 deletions
| diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index 4c662eccf53c..2fd830103415 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c @@ -207,6 +207,7 @@ static void rt2x00queue_create_tx_descriptor_seq(struct rt2x00_dev *rt2x00dev,  	struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb);  	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;  	struct rt2x00_intf *intf = vif_to_intf(tx_info->control.vif); +	u16 seqno;  	if (!(tx_info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ))  		return; @@ -238,15 +239,13 @@ static void rt2x00queue_create_tx_descriptor_seq(struct rt2x00_dev *rt2x00dev,  	 * sequence counting per-frame, since those will override the  	 * sequence counter given by mac80211.  	 */ -	spin_lock(&intf->seqlock); -  	if (test_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags)) -		intf->seqno += 0x10; -	hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); -	hdr->seq_ctrl |= cpu_to_le16(intf->seqno); - -	spin_unlock(&intf->seqlock); +		seqno = atomic_add_return(0x10, &intf->seqno); +	else +		seqno = atomic_read(&intf->seqno); +	hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); +	hdr->seq_ctrl |= cpu_to_le16(seqno);  }  static void rt2x00queue_create_tx_descriptor_plcp(struct rt2x00_dev *rt2x00dev, | 
