patch-2.4.19 linux-2.4.19/drivers/usb/catc.c
Next file: linux-2.4.19/drivers/usb/devices.c
Previous file: linux-2.4.19/drivers/usb/brlvger.c
Back to the patch index
Back to the overall index
- Lines: 138
- Date:
Fri Aug 2 17:39:44 2002
- Orig file:
linux-2.4.18/drivers/usb/catc.c
- Orig date:
Tue Nov 13 09:19:41 2001
diff -urN linux-2.4.18/drivers/usb/catc.c linux-2.4.19/drivers/usb/catc.c
@@ -38,7 +38,9 @@
#include <linux/etherdevice.h>
#include <linux/skbuff.h>
#include <linux/spinlock.h>
+#include <linux/ethtool.h>
#include <asm/bitops.h>
+#include <asm/uaccess.h>
#undef DEBUG
@@ -48,9 +50,10 @@
* Version information.
*/
-#define DRIVER_VERSION "v2.7"
+#define DRIVER_VERSION "v2.8"
#define DRIVER_AUTHOR "Vojtech Pavlik <vojtech@suse.cz>"
#define DRIVER_DESC "CATC EL1210A NetMate USB Ethernet driver"
+#define SHORT_DRIVER_DESC "EL1210A NetMate USB Ethernet"
MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
@@ -259,11 +262,15 @@
}
}
- if (data[1] & 0x40)
+ if (data[1] & 0x40) {
+ netif_carrier_on(catc->netdev);
dbg("link ok");
+ }
- if (data[1] & 0x20)
+ if (data[1] & 0x20) {
+ netif_carrier_off(catc->netdev);
dbg("link bad");
+ }
}
/*
@@ -402,7 +409,7 @@
{
struct catc *catc = urb->context;
struct ctrl_queue *q;
- long flags;
+ unsigned long flags;
if (urb->status)
dbg("ctrl_done, status %d, len %d.", urb->status, urb->actual_length);
@@ -436,7 +443,7 @@
{
struct ctrl_queue *q;
int retval = 0;
- long flags;
+ unsigned long flags;
spin_lock_irqsave(&catc->ctrl_lock, flags);
@@ -564,6 +571,54 @@
}
/*
+ * ioctl's
+ */
+static int netdev_ethtool_ioctl(struct net_device *dev, void *useraddr)
+{
+ struct catc *catc = dev->priv;
+ u32 cmd;
+ char tmp[40];
+
+ if (get_user(cmd, (u32 *)useraddr))
+ return -EFAULT;
+
+ switch (cmd) {
+ /* get driver info */
+ case ETHTOOL_GDRVINFO: {
+ struct ethtool_drvinfo info = {ETHTOOL_GDRVINFO};
+ strncpy(info.driver, SHORT_DRIVER_DESC, ETHTOOL_BUSINFO_LEN);
+ strncpy(info.version, DRIVER_VERSION, ETHTOOL_BUSINFO_LEN);
+ sprintf(tmp, "usb%d:%d", catc->usbdev->bus->busnum, catc->usbdev->devnum);
+ strncpy(info.bus_info, tmp,ETHTOOL_BUSINFO_LEN);
+ if (copy_to_user(useraddr, &info, sizeof(info)))
+ return -EFAULT;
+ return 0;
+ }
+ /* get link status */
+ case ETHTOOL_GLINK: {
+ struct ethtool_value edata = {ETHTOOL_GLINK};
+ edata.data = netif_carrier_ok(dev);
+ if (copy_to_user(useraddr, &edata, sizeof(edata)))
+ return -EFAULT;
+ return 0;
+ }
+ }
+ /* Note that the ethtool user space code requires EOPNOTSUPP */
+ return -EOPNOTSUPP;
+}
+
+static int catc_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
+{
+ switch(cmd) {
+ case SIOCETHTOOL:
+ return netdev_ethtool_ioctl(dev, (void *) rq->ifr_data);
+ default:
+ return -ENOTTY; /* Apparently this is the standard ioctl errno */
+ }
+}
+
+
+/*
* Open, close.
*/
@@ -618,9 +673,16 @@
}
catc = kmalloc(sizeof(struct catc), GFP_KERNEL);
+ if (!catc)
+ return NULL;
+
memset(catc, 0, sizeof(struct catc));
netdev = init_etherdev(0, 0);
+ if (!netdev) {
+ kfree(catc);
+ return NULL;
+ }
netdev->open = catc_open;
netdev->hard_start_xmit = catc_hard_start_xmit;
@@ -629,6 +691,7 @@
netdev->tx_timeout = catc_tx_timeout;
netdev->watchdog_timeo = TX_TIMEOUT;
netdev->set_multicast_list = catc_set_multicast_list;
+ netdev->do_ioctl = catc_ioctl;
netdev->priv = catc;
catc->usbdev = usbdev;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)