--- a/net80211/ieee80211_input.c +++ b/net80211/ieee80211_input.c @@ -1181,6 +1181,7 @@ } if (skb1 != NULL) { struct ieee80211_node *ni_tmp; + int ret; skb1->dev = dev; skb_reset_mac_header(skb1); skb_set_network_header(skb1, sizeof(struct ether_header)); @@ -1188,7 +1189,12 @@ skb1->protocol = __constant_htons(ETH_P_802_2); /* XXX insert vlan tag before queue it? */ ni_tmp = SKB_CB(skb1)->ni; /* remember node so we can free it */ - if (dev_queue_xmit(skb1) == NET_XMIT_DROP) { + ret = dev->hard_start_xmit(skb1, dev); + + if (ret == NETDEV_TX_BUSY) + ieee80211_dev_kfree_skb(&skb1); + + if (ret != NETDEV_TX_OK) { /* If queue dropped the packet because device was * too busy */ vap->iv_devstats.tx_dropped++; --- a/net80211/ieee80211_output.c +++ b/net80211/ieee80211_output.c @@ -329,9 +329,10 @@ /* Dispatch the packet to the parent device */ skb->dev = vap->iv_ic->ic_dev; - if (dev_queue_xmit(skb) == NET_XMIT_DROP) + if (netif_queue_stopped(skb->dev)) + ieee80211_dev_kfree_skb(&skb); + else if (dev_queue_xmit(skb) == NET_XMIT_DROP) vap->iv_devstats.tx_dropped++; - } /*