Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

b43: Do not return TX_BUSY from op_tx

Never return TX_BUSY from op_tx. It doesn't make sense to return
TX_BUSY, if we can not transmit the packet.
Drop the packet and return TX_OK.
This will fix the resume hang.

Signed-off-by: Michael Buesch <mb@bu3sch.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

authored by

Michael Buesch and committed by
John W. Linville
c9e8eae0 59d393ad

+8 -4
+8 -4
drivers/net/wireless/b43/main.c
··· 2883 2883 2884 2884 if (unlikely(skb->len < 2 + 2 + 6)) { 2885 2885 /* Too short, this can't be a valid frame. */ 2886 - dev_kfree_skb_any(skb); 2887 - return NETDEV_TX_OK; 2886 + goto drop_packet; 2888 2887 } 2889 2888 B43_WARN_ON(skb_shinfo(skb)->nr_frags); 2890 2889 if (unlikely(!dev)) 2891 - return NETDEV_TX_BUSY; 2890 + goto drop_packet; 2892 2891 2893 2892 /* Transmissions on seperate queues can run concurrently. */ 2894 2893 read_lock_irqsave(&wl->tx_lock, flags); ··· 2903 2904 read_unlock_irqrestore(&wl->tx_lock, flags); 2904 2905 2905 2906 if (unlikely(err)) 2906 - return NETDEV_TX_BUSY; 2907 + goto drop_packet; 2908 + return NETDEV_TX_OK; 2909 + 2910 + drop_packet: 2911 + /* We can not transmit this packet. Drop it. */ 2912 + dev_kfree_skb_any(skb); 2907 2913 return NETDEV_TX_OK; 2908 2914 } 2909 2915