Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: drivers/net/ethernet/intel/e1000e/ethtool.c drivers/net/vmxnet3/vmxnet3_drv.c drivers/net/wireless/iwlwifi/dvm/tx.c net/ipv6/route.c The ipv6 route.c conflict is simple, just ignore the 'net' side change as we fixed the same problem in 'net-next' by eliminating cached neighbours from ipv6 routes. The e1000e conflict is an addition of a new statistic in the ethtool code, trivial. The vmxnet3 conflict is about one change in 'net' removing a guarding conditional, whilst in 'net-next' we had a netdev_info() conversion. The iwlwifi conflict is dealing with a WARN_ON() conversion in 'net-next' vs. a revert happening in 'net'. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -380,6 +380,12 @@ static int rx_submit (struct usbnet *dev, struct urb *urb, gfp_t flags)
|
||||
unsigned long lockflags;
|
||||
size_t size = dev->rx_urb_size;
|
||||
|
||||
/* prevent rx skb allocation when error ratio is high */
|
||||
if (test_bit(EVENT_RX_KILL, &dev->flags)) {
|
||||
usb_free_urb(urb);
|
||||
return -ENOLINK;
|
||||
}
|
||||
|
||||
skb = __netdev_alloc_skb_ip_align(dev->net, size, flags);
|
||||
if (!skb) {
|
||||
netif_dbg(dev, rx_err, dev->net, "no rx skb\n");
|
||||
@@ -539,6 +545,17 @@ block:
|
||||
break;
|
||||
}
|
||||
|
||||
/* stop rx if packet error rate is high */
|
||||
if (++dev->pkt_cnt > 30) {
|
||||
dev->pkt_cnt = 0;
|
||||
dev->pkt_err = 0;
|
||||
} else {
|
||||
if (state == rx_cleanup)
|
||||
dev->pkt_err++;
|
||||
if (dev->pkt_err > 20)
|
||||
set_bit(EVENT_RX_KILL, &dev->flags);
|
||||
}
|
||||
|
||||
state = defer_bh(dev, skb, &dev->rxq, state);
|
||||
|
||||
if (urb) {
|
||||
@@ -791,6 +808,11 @@ int usbnet_open (struct net_device *net)
|
||||
(dev->driver_info->flags & FLAG_FRAMING_AX) ? "ASIX" :
|
||||
"simple");
|
||||
|
||||
/* reset rx error state */
|
||||
dev->pkt_cnt = 0;
|
||||
dev->pkt_err = 0;
|
||||
clear_bit(EVENT_RX_KILL, &dev->flags);
|
||||
|
||||
// delay posting reads until we're fully open
|
||||
tasklet_schedule (&dev->bh);
|
||||
if (info->manage_power) {
|
||||
@@ -1103,13 +1125,11 @@ netdev_tx_t usbnet_start_xmit (struct sk_buff *skb,
|
||||
if (info->tx_fixup) {
|
||||
skb = info->tx_fixup (dev, skb, GFP_ATOMIC);
|
||||
if (!skb) {
|
||||
if (netif_msg_tx_err(dev)) {
|
||||
netif_dbg(dev, tx_err, dev->net, "can't tx_fixup skb\n");
|
||||
goto drop;
|
||||
} else {
|
||||
/* cdc_ncm collected packet; waits for more */
|
||||
/* packet collected; minidriver waiting for more */
|
||||
if (info->flags & FLAG_MULTI_PACKET)
|
||||
goto not_drop;
|
||||
}
|
||||
netif_dbg(dev, tx_err, dev->net, "can't tx_fixup skb\n");
|
||||
goto drop;
|
||||
}
|
||||
}
|
||||
length = skb->len;
|
||||
@@ -1254,6 +1274,9 @@ static void usbnet_bh (unsigned long param)
|
||||
}
|
||||
}
|
||||
|
||||
/* restart RX again after disabling due to high error rate */
|
||||
clear_bit(EVENT_RX_KILL, &dev->flags);
|
||||
|
||||
// waiting for all pending urbs to complete?
|
||||
if (dev->wait) {
|
||||
if ((dev->txq.qlen + dev->rxq.qlen + dev->done.qlen) == 0) {
|
||||
|
Reference in New Issue
Block a user