@@ -193,10 +193,23 @@ static void mt7601u_complete_rx(struct urb *urb)
193193 struct mt7601u_rx_queue * q = & dev -> rx_q ;
194194 unsigned long flags ;
195195
196- spin_lock_irqsave (& dev -> rx_lock , flags );
196+ /* do no schedule rx tasklet if urb has been unlinked
197+ * or the device has been removed
198+ */
199+ switch (urb -> status ) {
200+ case - ECONNRESET :
201+ case - ESHUTDOWN :
202+ case - ENOENT :
203+ return ;
204+ default :
205+ dev_err_ratelimited (dev -> dev , "rx urb failed: %d\n" ,
206+ urb -> status );
207+ /* fall through */
208+ case 0 :
209+ break ;
210+ }
197211
198- if (mt7601u_urb_has_error (urb ))
199- dev_err (dev -> dev , "Error: RX urb failed:%d\n" , urb -> status );
212+ spin_lock_irqsave (& dev -> rx_lock , flags );
200213 if (WARN_ONCE (q -> e [q -> end ].urb != urb , "RX urb mismatch" ))
201214 goto out ;
202215
@@ -363,19 +376,9 @@ int mt7601u_dma_enqueue_tx(struct mt7601u_dev *dev, struct sk_buff *skb,
363376static void mt7601u_kill_rx (struct mt7601u_dev * dev )
364377{
365378 int i ;
366- unsigned long flags ;
367379
368- spin_lock_irqsave (& dev -> rx_lock , flags );
369-
370- for (i = 0 ; i < dev -> rx_q .entries ; i ++ ) {
371- int next = dev -> rx_q .end ;
372-
373- spin_unlock_irqrestore (& dev -> rx_lock , flags );
374- usb_poison_urb (dev -> rx_q .e [next ].urb );
375- spin_lock_irqsave (& dev -> rx_lock , flags );
376- }
377-
378- spin_unlock_irqrestore (& dev -> rx_lock , flags );
380+ for (i = 0 ; i < dev -> rx_q .entries ; i ++ )
381+ usb_poison_urb (dev -> rx_q .e [i ].urb );
379382}
380383
381384static int mt7601u_submit_rx_buf (struct mt7601u_dev * dev ,
0 commit comments