ChangeSet 1.1673.8.4, 2004/03/25 11:31:25-08:00, [EMAIL PROTECTED]

[PATCH] USB: rtl8150 update

adds two more vid/did and better packet error statistics.  Link
detection also has been added.


 drivers/usb/net/rtl8150.c |  115 +++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 108 insertions(+), 7 deletions(-)


diff -Nru a/drivers/usb/net/rtl8150.c b/drivers/usb/net/rtl8150.c
--- a/drivers/usb/net/rtl8150.c Wed Apr 14 14:40:10 2004
+++ b/drivers/usb/net/rtl8150.c Wed Apr 14 14:40:10 2004
@@ -20,7 +20,7 @@
 #include <asm/uaccess.h>
 
 /* Version Information */
-#define DRIVER_VERSION "v0.5.7 (2002/12/31)"
+#define DRIVER_VERSION "v0.6.1 (2004/03/13)"
 #define DRIVER_AUTHOR "Petko Manolov <[EMAIL PROTECTED]>"
 #define DRIVER_DESC "rtl8150 based usb-ethernet driver"
 
@@ -43,6 +43,8 @@
 #define        ANAR                    0x0144
 #define        ANLP                    0x0146
 #define        AER                     0x0148
+#define CSCR                   0x014C  /* This one has the link status */
+#define CSCR_LINK_STATUS       (1 << 3)
 
 #define        IDR_EEPROM              0x1202
 
@@ -58,6 +60,60 @@
 #define        RTL8150_REQ_GET_REGS    0x05
 #define        RTL8150_REQ_SET_REGS    0x05
 
+
+/* Transmit status register errors */
+#define TSR_ECOL               (1<<5)
+#define TSR_LCOL               (1<<4)
+#define TSR_LOSS_CRS           (1<<3)
+#define TSR_JBR                        (1<<2)
+#define TSR_ERRORS             (TSR_ECOL | TSR_LCOL | TSR_LOSS_CRS | TSR_JBR)
+/* Receive status register errors */
+#define RSR_CRC                        (1<<2)
+#define RSR_FAE                        (1<<1)
+#define RSR_ERRORS             (RSR_CRC | RSR_FAE)
+
+/* Media status register definitions */
+#define MSR_DUPLEX             (1<<4)
+#define MSR_SPEED              (1<<3)
+#define MSR_LINK               (1<<2)
+
+/* Interrupt pipe data */
+#define INT_TSR                        0x00
+#define INT_RSR                        0x01
+#define INT_MSR                        0x02
+#define INT_WAKSR              0x03
+#define INT_TXOK_CNT           0x04
+#define INT_RXLOST_CNT         0x05
+#define INT_CRERR_CNT          0x06
+#define INT_COL_CNT            0x07
+
+/* Transmit status register errors */
+#define TSR_ECOL               (1<<5)
+#define TSR_LCOL               (1<<4)
+#define TSR_LOSS_CRS           (1<<3)
+#define TSR_JBR                        (1<<2)
+#define TSR_ERRORS             (TSR_ECOL | TSR_LCOL | TSR_LOSS_CRS | TSR_JBR)
+/* Receive status register errors */
+#define RSR_CRC                        (1<<2)
+#define RSR_FAE                        (1<<1)
+#define RSR_ERRORS             (RSR_CRC | RSR_FAE)
+
+/* Media status register definitions */
+#define MSR_DUPLEX             (1<<4)
+#define MSR_SPEED              (1<<3)
+#define MSR_LINK               (1<<2)
+
+/* Interrupt pipe data */
+#define INT_TSR                        0x00
+#define INT_RSR                        0x01
+#define INT_MSR                        0x02
+#define INT_WAKSR              0x03
+#define INT_TXOK_CNT           0x04
+#define INT_RXLOST_CNT         0x05
+#define INT_CRERR_CNT          0x06
+#define INT_COL_CNT            0x07
+
+
 #define        RTL8150_MTU             1540
 #define        RTL8150_TX_TIMEOUT      (HZ)
 #define        RX_SKB_POOL_SIZE        4
@@ -71,9 +127,13 @@
 /* Define these values to match your device */
 #define VENDOR_ID_REALTEK              0x0bda
 #define        VENDOR_ID_MELCO                 0x0411
+#define VENDOR_ID_MICRONET             0x3980
+#define        VENDOR_ID_LONGSHINE             0x07b8
 
 #define PRODUCT_ID_RTL8150             0x8150
 #define        PRODUCT_ID_LUAKTX               0x0012
+#define        PRODUCT_ID_LCS8138TX            0x401a
+#define PRODUCT_ID_SP128AR             0x0003
 
 #undef EEPROM_WRITE
 
@@ -81,6 +141,8 @@
 static struct usb_device_id rtl8150_table[] = {
        {USB_DEVICE(VENDOR_ID_REALTEK, PRODUCT_ID_RTL8150)},
        {USB_DEVICE(VENDOR_ID_MELCO, PRODUCT_ID_LUAKTX)},
+       {USB_DEVICE(VENDOR_ID_MICRONET, PRODUCT_ID_SP128AR)},
+       {USB_DEVICE(VENDOR_ID_LONGSHINE, PRODUCT_ID_LCS8138TX)},
        {}
 };
 
@@ -368,6 +430,9 @@
 
        if (!dev->rx_skb)
                goto resched;
+       /* protect against short packets (tell me why we got some?!?) */
+       if (urb->actual_length < 4)
+               goto goon;
 
        res = urb->actual_length;
        rx_stat = le16_to_cpu(*(short *)(urb->transfer_buffer + res - 4));
@@ -454,6 +519,7 @@
 void intr_callback(struct urb *urb, struct pt_regs *regs)
 {
        rtl8150_t *dev;
+       __u8 *d;
        int status;
 
        dev = urb->context;
@@ -472,7 +538,28 @@
                goto resubmit;
        }
 
-       /* FIXME if this doesn't do anything, don't submit the urb! */
+       d = urb->transfer_buffer;
+       if (d[0] & TSR_ERRORS) {
+               dev->stats.tx_errors++;
+               if (d[INT_TSR] & (TSR_ECOL | TSR_JBR))
+                       dev->stats.tx_aborted_errors++;
+               if (d[INT_TSR] & TSR_LCOL)
+                       dev->stats.tx_window_errors++;
+               if (d[INT_TSR] & TSR_LOSS_CRS)
+                       dev->stats.tx_carrier_errors++;
+       }
+       /* Report link status changes to the network stack */
+       if ((d[INT_MSR] & MSR_LINK) == 0) {
+               if (netif_carrier_ok(dev->netdev)) {
+                       netif_carrier_off(dev->netdev);
+                       dbg("%s: LINK LOST\n", __func__);
+               }
+       } else {
+               if (!netif_carrier_ok(dev->netdev)) {
+                       netif_carrier_on(dev->netdev);
+                       dbg("%s: LINK CAME BACK\n", __func__);
+               }
+       }
 
 resubmit:
        status = usb_submit_urb (urb, SLAB_ATOMIC);
@@ -482,6 +569,7 @@
                                dev->udev->devpath, status);
 }
 
+
 /*
 **
 **     network related part of the code
@@ -538,7 +626,7 @@
                warn("%s - device reset failed", __FUNCTION__);
        }
        /* RCR bit7=1 attach Rx info at the end;  =0 HW CRC (which is broken) */
-       rcr = 0x9e;     /* bit7=1 attach Rx info at the end */
+       rcr = 0x9e;
        dev->rx_creg = cpu_to_le16(rcr);
        tcr = 0xd8;
        cr = 0x0c;
@@ -626,6 +714,19 @@
        return 0;
 }
 
+
+static void set_carrier(struct net_device *netdev)
+{
+       rtl8150_t *dev = netdev->priv;
+       short tmp;
+
+       get_registers(dev, CSCR, 2, &tmp);
+       if (tmp & CSCR_LINK_STATUS)
+               netif_carrier_on(netdev);
+       else
+               netif_carrier_off(netdev);
+}
+
 static int rtl8150_open(struct net_device *netdev)
 {
        rtl8150_t *dev;
@@ -653,6 +754,7 @@
                warn("%s: intr_urb submit failed: %d", __FUNCTION__, res);
        netif_start_queue(netdev);
        enable_net_traffic(dev);
+       set_carrier(netdev);
 
        return res;
 }
@@ -674,7 +776,7 @@
        return res;
 }
 
-static int rtl8150_ethtool_ioctl(struct net_device *netdev, void __user *uaddr)
+static int rtl8150_ethtool_ioctl(struct net_device *netdev, void *uaddr)
 {
        rtl8150_t *dev;
        int cmd;
@@ -759,7 +861,7 @@
 
        switch (cmd) {
        case SIOCETHTOOL:
-               res = rtl8150_ethtool_ioctl(netdev, (void __user *)rq->ifr_data);
+               res = rtl8150_ethtool_ioctl(netdev, rq->ifr_data);
                break;
        case SIOCDEVPRIVATE:
                data[0] = dev->phy;
@@ -774,6 +876,7 @@
        default:
                res = -EOPNOTSUPP;
        }
+
        return res;
 }
 
@@ -796,7 +899,6 @@
                kfree(dev);
                return -ENOMEM;
        }
-
        netdev = alloc_etherdev(0);
        if (!netdev) {
                kfree(dev->intr_buff);
@@ -837,7 +939,6 @@
        info("%s: rtl8150 is detected", netdev->name);
        
        usb_set_intfdata(intf, dev);
-
        SET_NETDEV_DEV(netdev, &intf->dev);
        if (register_netdev(netdev) != 0) {
                err("couldn't register the device");



-------------------------------------------------------
This SF.Net email is sponsored by: IBM Linux Tutorials
Free Linux tutorial presented by Daniel Robbins, President and CEO of
GenToo technologies. Learn everything from fundamentals to system
administration.http://ads.osdn.com/?ad_id70&alloc_id638&op=click
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to