File tree 2 files changed +18
-7
lines changed
drivers/net/wireless/mediatek/mt7601u 2 files changed +18
-7
lines changed Original file line number Diff line number Diff line change @@ -233,14 +233,25 @@ static void mt7601u_complete_tx(struct urb *urb)
233
233
struct sk_buff * skb ;
234
234
unsigned long flags ;
235
235
236
- spin_lock_irqsave (& dev -> tx_lock , flags );
236
+ switch (urb -> status ) {
237
+ case - ECONNRESET :
238
+ case - ESHUTDOWN :
239
+ case - ENOENT :
240
+ return ;
241
+ default :
242
+ dev_err_ratelimited (dev -> dev , "tx urb failed: %d\n" ,
243
+ urb -> status );
244
+ /* fall through */
245
+ case 0 :
246
+ break ;
247
+ }
237
248
238
- if (mt7601u_urb_has_error (urb ))
239
- dev_err (dev -> dev , "Error: TX urb failed:%d\n" , urb -> status );
249
+ spin_lock_irqsave (& dev -> tx_lock , flags );
240
250
if (WARN_ONCE (q -> e [q -> start ].urb != urb , "TX urb mismatch" ))
241
251
goto out ;
242
252
243
253
skb = q -> e [q -> start ].skb ;
254
+ q -> e [q -> start ].skb = NULL ;
244
255
trace_mt_tx_dma_done (dev , skb );
245
256
246
257
__skb_queue_tail (& dev -> tx_skb_done , skb );
@@ -440,10 +451,10 @@ static void mt7601u_free_tx_queue(struct mt7601u_tx_queue *q)
440
451
{
441
452
int i ;
442
453
443
- WARN_ON (q -> used );
444
-
445
454
for (i = 0 ; i < q -> entries ; i ++ ) {
446
455
usb_poison_urb (q -> e [i ].urb );
456
+ if (q -> e [i ].skb )
457
+ mt7601u_tx_status (q -> dev , q -> e [i ].skb );
447
458
usb_free_urb (q -> e [i ].urb );
448
459
}
449
460
}
Original file line number Diff line number Diff line change @@ -109,9 +109,9 @@ void mt7601u_tx_status(struct mt7601u_dev *dev, struct sk_buff *skb)
109
109
info -> status .rates [0 ].idx = -1 ;
110
110
info -> flags |= IEEE80211_TX_STAT_ACK ;
111
111
112
- spin_lock (& dev -> mac_lock );
112
+ spin_lock_bh (& dev -> mac_lock );
113
113
ieee80211_tx_status (dev -> hw , skb );
114
- spin_unlock (& dev -> mac_lock );
114
+ spin_unlock_bh (& dev -> mac_lock );
115
115
}
116
116
117
117
static int mt7601u_skb_rooms (struct mt7601u_dev * dev , struct sk_buff * skb )
You can’t perform that action at this time.
0 commit comments