summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGary King <gking@nvidia.com>2009-12-07 20:38:23 -0800
committerGary King <gking@nvidia.com>2009-12-08 13:52:59 -0800
commit4405ca17e8e67b6f80f5d95b28731d18306be94d (patch)
tree92f16f1acbd6467be4709d4d78bc5e1c11fec856
parent6684ee87cd190812667b878f5997d1fcf9ed7753 (diff)
smsc95xx: add support for SMSC 9514 USB ethernet device
fixes a few bugs with skid buffer usage, adds device ID for SMSC 9514
-rw-r--r--drivers/net/usb/smsc95xx.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/net/usb/smsc95xx.c b/drivers/net/usb/smsc95xx.c
index 5574abe29c73..d93e31f41d2a 100644
--- a/drivers/net/usb/smsc95xx.c
+++ b/drivers/net/usb/smsc95xx.c
@@ -1118,6 +1118,7 @@ static int smsc95xx_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
if (pdata->use_rx_csum)
smsc95xx_rx_csum_offload(skb);
+ skb_trim(skb, skb->len - 4); /* remove fcs */
skb->truesize = size + sizeof(struct sk_buff);
return 1;
@@ -1136,6 +1137,7 @@ static int smsc95xx_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
if (pdata->use_rx_csum)
smsc95xx_rx_csum_offload(ax_skb);
+ skb_trim(ax_skb, ax_skb->len - 4); /* remove fcs */
ax_skb->truesize = size + sizeof(struct sk_buff);
usbnet_skb_return(dev, ax_skb);
@@ -1175,7 +1177,14 @@ static struct sk_buff *smsc95xx_tx_fixup(struct usbnet *dev,
/* We do not advertise SG, so skbs should be already linearized */
BUG_ON(skb_shinfo(skb)->nr_frags);
- if (skb_headroom(skb) < overhead) {
+/*
+ * This condition is commented since otherwise, it causes the driver to hang.
+ * The root cause is yet to be fixed, but if a new skb is always allocated, then
+ * the driver works fine without any problem.
+ */
+
+ // if (skb->len >= 382 || skb_headroom(skb) < overhead)
+ {
struct sk_buff *skb2 = skb_copy_expand(skb,
overhead, 0, flags);
dev_kfree_skb_any(skb);
@@ -1215,7 +1224,7 @@ static const struct driver_info smsc95xx_info = {
.rx_fixup = smsc95xx_rx_fixup,
.tx_fixup = smsc95xx_tx_fixup,
.status = smsc95xx_status,
- .flags = FLAG_ETHER,
+ .flags = FLAG_ETHER | FLAG_SEND_ZLP,
};
static const struct usb_device_id products[] = {
@@ -1224,6 +1233,11 @@ static const struct usb_device_id products[] = {
USB_DEVICE(0x0424, 0x9500),
.driver_info = (unsigned long) &smsc95xx_info,
},
+ {
+ /* SMSC9514 USB Ethernet Device */
+ USB_DEVICE(0x0424, 0xEC00),
+ .driver_info = (unsigned long) &smsc95xx_info,
+ },
{ }, /* END */
};
MODULE_DEVICE_TABLE(usb, products);