# 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.577 -> 1.578
# drivers/usb/rtl8150.c 1.1 -> 1.2
#
# The following is the BitKeeper ChangeSet Log
# --------------------------------------------
# 02/04/03 [EMAIL PROTECTED] 1.578
# USB rtl8150 driver
#
# fix the "small packet" problem and debug messages cleanup
# --------------------------------------------
#
diff -Nru a/drivers/usb/rtl8150.c b/drivers/usb/rtl8150.c
--- a/drivers/usb/rtl8150.c Wed Apr 3 16:39:08 2002
+++ b/drivers/usb/rtl8150.c Wed Apr 3 16:39:08 2002
@@ -24,7 +24,7 @@
/* Version Information */
-#define DRIVER_VERSION "v0.0.1"
+#define DRIVER_VERSION "v0.5.0 (2002/03/28)"
#define DRIVER_AUTHOR "Petko Manolov <[EMAIL PROTECTED]>"
#define DRIVER_DESC "rtl8150 based usb-ethernet driver"
@@ -59,13 +59,14 @@
#define RTL8150_REQ_SET_REGS 0x05
#define RTL8150_MTU 1500
-#define RTL8150_MAX_MTU 1500
+#define RTL8150_MAX_MTU 1536
#define RTL8150_TX_TIMEOUT (HZ)
/* rtl8150 flags */
#define RTL8150_FLAG_HWCRC 0
#define RX_REG_SET 1
+#define RTL8150_UNPLUG 2
/* Define these values to match your device */
@@ -147,13 +148,10 @@
switch (urb->status) {
case 0:
- info("async set regs OK");
break;
case -EINPROGRESS:
- warn("in progress");
break;
case -ENOENT:
- warn("no entry");
break;
default:
warn("ctrl urb status %d", urb->status);
@@ -167,10 +165,8 @@
{
int ret;
- if (test_bit(RX_REG_SET, &dev->flags)) {
- warn("async registers change in progress");
+ if (test_bit(RX_REG_SET, &dev->flags))
return -EAGAIN;
- }
dev->dr.bRequestType = RTL8150_REQT_WRITE;
dev->dr.bRequest = RTL8150_REQ_SET_REGS;
@@ -244,8 +240,6 @@
get_registers(dev, IRD, sizeof(node_id), node_id);
memcpy(dev->netdev->dev_addr, node_id, sizeof(node_id));
- info("ethID->%02x:%02x:%02x:%02x:%02x:%02x", node_id[0], node_id[1],
- node_id[2], node_id[3], node_id[4], node_id[5]);
}
@@ -312,9 +306,10 @@
static void read_bulk_callback(struct urb *urb)
{
rtl8150_t *dev;
- int pkt_len, res;
+ unsigned pkt_len, res;
struct sk_buff *skb;
struct net_device *netdev;
+ u16 rx_stat;
dev = urb->context;
if (!dev) {
@@ -330,33 +325,19 @@
case 0:
break;
case -ENOENT:
- warn("-ENOENT");
return;
case -ETIMEDOUT:
warn("reset needed may be?..");
- break;
+ goto goon;
default:
warn("Rx status %d", urb->status);
goto goon;
}
-
- pkt_len = urb->actual_length - 4;
- if (pkt_len < 60) {
- warn("Rx short packet %d", pkt_len);
- goto goon;
- }
-#if 0
- if (pkt_len <= 80) {
- int i;
- info("%s: Rx pkt_len %d", netdev->name, pkt_len);
- for (i=0; i<(pkt_len + 4); i++) {
- printk("%02x ", *(u8 *)(dev->rx_buff+i));
- }
- printk("\b ..done\n");
- memset(dev->rx_buff, 0, pkt_len);
- }
-#endif
+ res = urb->actual_length;
+ rx_stat = le16_to_cpu(*(short*)(dev->rx_buff + res - 4));
+ pkt_len = res - 4;
+
if (!(skb = dev_alloc_skb(pkt_len + 2)))
goto goon;
skb->dev = netdev;
@@ -394,8 +375,6 @@
void intr_callback(struct urb *urb)
{
rtl8150_t *dev;
- struct net_device *netdev;
- u8 *d;
dev = urb->context;
if (!dev)
@@ -409,15 +388,9 @@
info("%s: intr status %d", dev->netdev->name,
urb->status);
}
- d = urb->transfer_buffer;
- netdev = dev->netdev;
- /* info("%s: Tx errs %02x:%02x:%02x:%02x", dev->netdev->name,
- d[0], d[1], d[2], d[3]); */
}
-
-
/*
**
** network related part of the code
@@ -433,13 +406,12 @@
warn("%s - device reset failed", __FUNCTION__);
}
dev->rx_creg = rcr = 0x9e; /* bit7=1 attach Rx info at the end */
- tcr = 0xd8;
+ tcr = 0xd8; /* bit0=1 no CRC at the end of the frame */
cr = 0x0c;
set_registers(dev, RCR, 1, &rcr);
set_registers(dev, TCR, 1, &tcr);
set_registers(dev, CR, 1, &cr);
get_registers(dev, MSR, 1, &msr);
- info("MSR = %02x", msr);
return 0;
}
@@ -468,7 +440,7 @@
dev = netdev->priv;
if (!dev)
return;
- warn("%s: tx timeout.", netdev->name);
+ warn("%s: Tx timeout.", netdev->name);
dev->tx_urb->transfer_flags |= USB_ASYNC_UNLINK;
usb_unlink_urb(dev->tx_urb);
dev->stats.tx_errors++;
@@ -505,7 +477,8 @@
netif_stop_queue(netdev);
dev = netdev->priv;
- count = (skb->len & 0x3f) ? skb->len : skb->len+1;
+ count = (skb->len < 60) ? 60 : skb->len;
+ count = (count & 0x3f) ? count : count + 1;
memcpy(dev->tx_buff, skb->data, skb->len);
FILL_BULK_URB(dev->tx_urb, dev->udev, usb_sndbulkpipe(dev->udev,2),
dev->tx_buff, RTL8150_MAX_MTU, write_bulk_callback, dev);
@@ -531,33 +504,24 @@
rtl8150_t *dev;
int res;
- dbg(__FUNCTION__);
-
dev = netdev->priv;
if (dev == NULL) {
return -ENODEV;
}
- {
- unsigned char mar[8];
- get_registers(dev, MAR, sizeof(mar), mar);
- printk("%x:%x:%x:%x:%x:%x:%x:%x\n", mar[0], mar[1], mar[2],
- mar[3], mar[4], mar[5], mar[6], mar[7]);
- }
-
+ down(&dev->sem);
FILL_BULK_URB(dev->rx_urb, dev->udev, usb_rcvbulkpipe(dev->udev,1),
dev->rx_buff, RTL8150_MAX_MTU, read_bulk_callback, dev);
if ((res=usb_submit_urb(dev->rx_urb, GFP_KERNEL)))
warn("%s: rx_urb submit failed: %d", __FUNCTION__, res);
-#if 0
FILL_INT_URB(dev->intr_urb, dev->udev, usb_rcvintpipe(dev->udev,3),
dev->intr_buff, sizeof(dev->intr_buff), intr_callback,
dev, dev->intr_interval);
if ((res=usb_submit_urb(dev->intr_urb, GFP_KERNEL)))
warn("%s: intr_urb submit failed: %d", __FUNCTION__, res);
-#endif
netif_start_queue(netdev);
enable_net_traffic(dev);
+ up(&dev->sem);
return res;
}
@@ -572,9 +536,12 @@
if (!dev)
return -ENODEV;
- disable_net_traffic(dev);
+ down(&dev->sem);
+ if (!test_bit(RTL8150_UNPLUG, &dev->flags))
+ disable_net_traffic(dev);
unlink_all_urbs(dev);
netif_stop_queue(netdev);
+ up(&dev->sem);
return res;
@@ -663,26 +630,34 @@
{
rtl8150_t *dev;
u16 *data;
+ int res;
dev = netdev->priv;
data = (u16 *)&rq->ifr_data;
+ res = 0;
+ down(&dev->sem);
switch (cmd) {
case SIOCETHTOOL:
- return rtl8150_ethtool_ioctl(netdev, rq->ifr_data);
+ res = rtl8150_ethtool_ioctl(netdev, rq->ifr_data);
+ break;
case SIOCDEVPRIVATE:
data[0] = dev->phy;
case SIOCDEVPRIVATE+1:
read_mii_word(dev, dev->phy, (data[1] & 0x1f), &data[3]);
- return 0;
+ break;
case SIOCDEVPRIVATE+2:
- if (!capable(CAP_NET_ADMIN))
+ if (!capable(CAP_NET_ADMIN)) {
+ up(&dev->sem);
return -EPERM;
+ }
write_mii_word(dev, dev->phy, (data[1] & 0x1f), data[2]);
- return 0;
+ break;
default:
- return -EOPNOTSUPP;
+ res = -EOPNOTSUPP;
}
+ up(&dev->sem);
+ return res;
}
@@ -702,11 +677,10 @@
err("Not the one we are interested about");
return NULL;
}
-
dev = kmalloc(sizeof(rtl8150_t), GFP_KERNEL);
if (!dev) {
err ("Out of memory");
- return NULL;
+ goto exit;
} else
memset(dev, 0, sizeof(rtl8150_t));
@@ -714,7 +688,8 @@
if (!netdev) {
kfree(dev);
err("Oh boy, out of memory again?!?");
- return NULL;
+ dev = NULL;
+ goto exit;
}
init_MUTEX(&dev->sem);
@@ -739,14 +714,13 @@
unregister_netdev(dev->netdev);
kfree(netdev);
kfree(dev);
- return NULL;
+ dev = NULL;
+ goto exit;
}
set_ethernet_addr(dev);
-
- info("%s: the rtl8150 is detected", netdev->name);
- info("compiled %s %s\n", __DATE__, __TIME__);
-
+ info("%s: rtl8150 is detected", netdev->name);
+exit:
return dev;
}
@@ -756,6 +730,7 @@
rtl8150_t *dev;
dev = ptr;
+ set_bit(RTL8150_UNPLUG, &dev->flags);
unregister_netdev(dev->netdev);
unlink_all_urbs(dev);
free_all_urbs(dev);
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel