diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00queue.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00queue.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index 3b27f6aa860c..898cdd7f57d9 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c | |||
@@ -128,6 +128,7 @@ static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry, | |||
128 | unsigned int data_length; | 128 | unsigned int data_length; |
129 | unsigned int duration; | 129 | unsigned int duration; |
130 | unsigned int residual; | 130 | unsigned int residual; |
131 | unsigned long irqflags; | ||
131 | 132 | ||
132 | memset(txdesc, 0, sizeof(*txdesc)); | 133 | memset(txdesc, 0, sizeof(*txdesc)); |
133 | 134 | ||
@@ -213,14 +214,14 @@ static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry, | |||
213 | * sequence counter given by mac80211. | 214 | * sequence counter given by mac80211. |
214 | */ | 215 | */ |
215 | if (tx_info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { | 216 | if (tx_info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { |
216 | spin_lock(&intf->lock); | 217 | spin_lock_irqsave(&intf->seqlock, irqflags); |
217 | 218 | ||
218 | if (test_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags)) | 219 | if (test_bit(ENTRY_TXD_FIRST_FRAGMENT, &txdesc->flags)) |
219 | intf->seqno += 0x10; | 220 | intf->seqno += 0x10; |
220 | hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); | 221 | hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); |
221 | hdr->seq_ctrl |= cpu_to_le16(intf->seqno); | 222 | hdr->seq_ctrl |= cpu_to_le16(intf->seqno); |
222 | 223 | ||
223 | spin_unlock(&intf->lock); | 224 | spin_unlock_irqrestore(&intf->seqlock, irqflags); |
224 | 225 | ||
225 | __set_bit(ENTRY_TXD_GENERATE_SEQ, &txdesc->flags); | 226 | __set_bit(ENTRY_TXD_GENERATE_SEQ, &txdesc->flags); |
226 | } | 227 | } |