# This is a BitKeeper generated patch for the following project: # Project Name: Linux kernel tree # This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas: # ChangeSet 1.538 -> 1.539 # drivers/usb/net/rtl8150.c 1.6 -> 1.7 # drivers/usb/net/pegasus.c 1.24 -> 1.25 # # The following is the BitKeeper ChangeSet Log # -------------------------------------------- # 02/04/22 petkan@mastika.lnxw.com 1.539 # USB pegasus and rtl8150 # # Rx tasklet cleanups for both pegasus and rtl8150 # -------------------------------------------- # diff -Nru a/drivers/usb/net/pegasus.c b/drivers/usb/net/pegasus.c --- a/drivers/usb/net/pegasus.c Mon Apr 22 14:28:15 2002 +++ b/drivers/usb/net/pegasus.c Mon Apr 22 14:28:15 2002 @@ -469,20 +469,11 @@ static int enable_net_traffic(struct net_device *dev, struct usb_device *usb) { - __u16 linkpart, bmsr; + __u16 linkpart; __u8 data[4]; pegasus_t *pegasus = dev->priv; - read_mii_word(pegasus, pegasus->phy, MII_BMSR, &bmsr); - read_mii_word(pegasus, pegasus->phy, MII_BMSR, &bmsr); - if (!(bmsr & BMSR_LSTATUS) && !loopback) - warn("%s: link NOT established (%04x) - check the cable.", - dev->name, bmsr); - if (read_mii_word(pegasus, pegasus->phy, MII_LPA, &linkpart)) - return 2; - if (!(linkpart & 1)) - warn("link partner stat %x", linkpart); - + read_mii_word(pegasus, pegasus->phy, MII_LPA, &linkpart); data[0] = 0xc9; data[1] = 0; if (linkpart & (ADVERTISE_100FULL | ADVERTISE_10FULL)) @@ -529,6 +520,8 @@ dbg("reset MAC"); pegasus->flags &= ~PEGASUS_RX_BUSY; break; + case -ENOENT: + return; default: dbg("%s: RX status %d", net->name, urb->status); goto goon; @@ -551,10 +544,8 @@ } pkt_len = (rx_status & 0xfff) - 8; - tasklet_schedule(&pegasus->rx_tl); - if (!pegasus->rx_skb) - return; + goto tl_sched; skb_put(pegasus->rx_skb, pkt_len); pegasus->rx_skb->protocol = eth_type_trans(pegasus->rx_skb, net); @@ -562,7 +553,7 @@ if (!(skb = dev_alloc_skb(PEGASUS_MTU + 2))) { pegasus->rx_skb = NULL; - return; + goto tl_sched; } skb->dev = net; @@ -575,10 +566,17 @@ usb_rcvbulkpipe(pegasus->usb, 1), pegasus->rx_skb->data, PEGASUS_MTU + 8, read_bulk_callback, pegasus); - if (usb_submit_urb(pegasus->rx_urb, GFP_ATOMIC)) + if (usb_submit_urb(pegasus->rx_urb, GFP_ATOMIC)) { pegasus->flags |= PEGASUS_RX_URB_FAIL; - else + goto tl_sched; + } else { pegasus->flags &= ~PEGASUS_RX_URB_FAIL; + } + + return; + +tl_sched: + tasklet_schedule(&pegasus->rx_tl); } static void rx_fixup(unsigned long data) @@ -587,11 +585,10 @@ pegasus = (pegasus_t *)data; - if (pegasus->flags & PEGASUS_RX_URB_FAIL) { - goto try_again; - } - if (pegasus->rx_skb) - return; + if (pegasus->flags & PEGASUS_RX_URB_FAIL) + if (pegasus->rx_skb) + goto try_again; + if (!(pegasus->rx_skb = dev_alloc_skb(PEGASUS_MTU + 2))) { tasklet_schedule(&pegasus->rx_tl); return; @@ -655,8 +652,12 @@ pegasus->stats.tx_aborted_errors++; if (d[0] & LATE_COL) pegasus->stats.tx_window_errors++; - if (d[0] & (NO_CARRIER | LOSS_CARRIER)) + if (d[0] & (NO_CARRIER | LOSS_CARRIER)) { pegasus->stats.tx_carrier_errors++; + netif_carrier_off(net); + } else { + netif_carrier_on(net); + } } } #endif diff -Nru a/drivers/usb/net/rtl8150.c b/drivers/usb/net/rtl8150.c --- a/drivers/usb/net/rtl8150.c Mon Apr 22 14:28:15 2002 +++ b/drivers/usb/net/rtl8150.c Mon Apr 22 14:28:15 2002 @@ -309,7 +309,7 @@ case 0: break; case -ENOENT: - return; /* urb's in unlink state */ + return; /* the urb is in unlink state */ case -ETIMEDOUT: warn("reset needed may be?.."); goto goon; @@ -318,12 +318,8 @@ goto goon; } - tasklet_schedule(&dev->tl); - - if (!dev->rx_skb) { - /* lost packets++ */ - return; - } + if (!dev->rx_skb) + goto resched; res = urb->actual_length; rx_stat = le16_to_cpu(*(short *)(urb->transfer_buffer + res - 4)); @@ -336,10 +332,8 @@ dev->stats.rx_bytes += pkt_len; skb = pull_skb(dev); - if (!skb) { - dev->rx_skb = NULL; - return; - } + if (!skb) + goto resched; skb->dev = netdev; skb_reserve(skb, 2); @@ -347,10 +341,16 @@ goon: FILL_BULK_URB(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev); - if (usb_submit_urb(dev->rx_urb, GFP_ATOMIC)) + if (usb_submit_urb(dev->rx_urb, GFP_ATOMIC)) { set_bit(RX_URB_FAIL, &dev->flags); - else + goto resched; + } else { clear_bit(RX_URB_FAIL, &dev->flags); + } + + return; +resched: + tasklet_schedule(&dev->tl); } static void rx_fixup(unsigned long data) @@ -362,22 +362,24 @@ fill_skb_pool(dev); if (test_bit(RX_URB_FAIL, &dev->flags)) - goto try_again; - if (dev->rx_skb) - return; - if (!(skb = pull_skb(dev))) { - tasklet_schedule(&dev->tl); - return; - } + if (dev->rx_skb) + goto try_again; + if (!(skb = pull_skb(dev))) + goto tlsched; dev->rx_skb = skb; FILL_BULK_URB(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev, 1), dev->rx_skb->data, RTL8150_MTU, read_bulk_callback, dev); try_again: if (usb_submit_urb(dev->rx_urb, GFP_ATOMIC)) { set_bit(RX_URB_FAIL, &dev->flags); - tasklet_schedule(&dev->tl); - } else + goto tlsched; + } else { clear_bit(RX_URB_FAIL, &dev->flags); + } + + return; +tlsched: + tasklet_schedule(&dev->tl); } static void write_bulk_callback(struct urb *urb)