diff -Naur -X /g/g/lib/dontdiff /spare/tmp/linux-2.5.4-pre1/drivers/net/pcmcia/3c589_cs.c linux_2_5/drivers/net/pcmcia/3c589_cs.c --- /spare/tmp/linux-2.5.4-pre1/drivers/net/pcmcia/3c589_cs.c Tue Nov 13 17:02:30 2001 +++ linux_2_5/drivers/net/pcmcia/3c589_cs.c Sat Nov 24 16:37:43 2001 @@ -17,6 +17,9 @@ ======================================================================*/ +#define DRV_NAME "3c589_cs" +#define DRV_VERSION "1.162" + #include #include #include @@ -28,6 +31,9 @@ #include #include #include +#include + +#include #include #include #include @@ -134,7 +140,7 @@ INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG); #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args) static char *version = -"3c589_cs.c 1.162 2001/10/13 00:08:50 (David Hinds)"; +DRV_NAME ".c " DRV_VERSION " 2001/10/13 00:08:50 (David Hinds)"; #else #define DEBUG(n, args...) #endif @@ -159,6 +165,7 @@ static int el3_close(struct net_device *dev); static void el3_tx_timeout(struct net_device *dev); static void set_multicast_list(struct net_device *dev); +static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); static dev_info_t dev_info = "3c589_cs"; @@ -249,7 +256,8 @@ dev->tx_timeout = el3_tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; #endif - + dev->do_ioctl = netdev_ioctl; + /* Register with Card Services */ link->next = dev_list; dev_list = link; @@ -638,6 +646,71 @@ ioaddr + EL3_CMD); outw(SetIntrEnb | IntLatch | TxAvailable | RxComplete | StatsFull | AdapterFailure, ioaddr + EL3_CMD); +} + +static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr) +{ + u32 ethcmd; + + /* dev_ioctl() in ../../net/core/dev.c has already checked + capable(CAP_NET_ADMIN), so don't bother with that here. */ + + if (get_user(ethcmd, (u32 *)useraddr)) + return -EFAULT; + + switch (ethcmd) { + + case ETHTOOL_GDRVINFO: { + struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; + strcpy (info.driver, DRV_NAME); + strcpy (info.version, DRV_VERSION); + sprintf(info.bus_info, "PCMCIA 0x%lx", dev->base_addr); + if (copy_to_user (useraddr, &info, sizeof (info))) + return -EFAULT; + return 0; + } + +#ifdef PCMCIA_DEBUG + /* get message-level */ + case ETHTOOL_GMSGLVL: { + struct ethtool_value edata = {ETHTOOL_GMSGLVL}; + edata.data = pc_debug; + if (copy_to_user(useraddr, &edata, sizeof(edata))) + return -EFAULT; + return 0; + } + /* set message-level */ + case ETHTOOL_SMSGLVL: { + struct ethtool_value edata; + if (copy_from_user(&edata, useraddr, sizeof(edata))) + return -EFAULT; + pc_debug = edata.data; + return 0; + } +#endif + + default: + break; + } + + return -EOPNOTSUPP; +} + +static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) +{ + int rc; + + switch (cmd) { + case SIOCETHTOOL: + rc = netdev_ethtool_ioctl(dev, (void *) rq->ifr_data); + break; + + default: + rc = -EOPNOTSUPP; + break; + } + + return rc; } static int el3_config(struct net_device *dev, struct ifmap *map) diff -Naur -X /g/g/lib/dontdiff /spare/tmp/linux-2.5.4-pre1/drivers/net/pcmcia/aironet4500_cs.c linux_2_5/drivers/net/pcmcia/aironet4500_cs.c --- /spare/tmp/linux-2.5.4-pre1/drivers/net/pcmcia/aironet4500_cs.c Sun Sep 30 19:26:07 2001 +++ linux_2_5/drivers/net/pcmcia/aironet4500_cs.c Sat Nov 24 16:37:43 2001 @@ -10,8 +10,11 @@ * */ +#define DRV_NAME "aironet4500_cs" +#define DRV_VERSION "0.1" + static const char *awc_version = -"aironet4500_cs.c v0.1 1/1/99 Elmer Joandi, elmer@ylenurme.ee.\n"; +DRV_NAME ".c v" DRV_VERSION " 1/1/99 Elmer Joandi, elmer@ylenurme.ee.\n"; #include @@ -24,6 +27,9 @@ #include #include #include +#include + +#include #include #include #include @@ -159,6 +165,66 @@ return ret; } +static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr) +{ + u32 ethcmd; + + /* dev_ioctl() in ../../net/core/dev.c has already checked + capable(CAP_NET_ADMIN), so don't bother with that here. */ + + if (get_user(ethcmd, (u32 *)useraddr)) + return -EFAULT; + + switch (ethcmd) { + + case ETHTOOL_GDRVINFO: { + struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; + strcpy (info.driver, DRV_NAME); + strcpy (info.version, DRV_VERSION); + sprintf(info.bus_info, "PCMCIA 0x%lx", dev->base_addr); + if (copy_to_user (useraddr, &info, sizeof (info))) + return -EFAULT; + return 0; + } + +#ifdef PCMCIA_DEBUG + /* get message-level */ + case ETHTOOL_GMSGLVL: { + struct ethtool_value edata = {ETHTOOL_GMSGLVL}; + edata.data = pc_debug; + if (copy_to_user(useraddr, &edata, sizeof(edata))) + return -EFAULT; + return 0; + } + /* set message-level */ + case ETHTOOL_SMSGLVL: { + struct ethtool_value edata; + if (copy_from_user(&edata, useraddr, sizeof(edata))) + return -EFAULT; + pc_debug = edata.data; + return 0; + } +#endif + + default: + break; + } + + return -EOPNOTSUPP; +} + +static int awc_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 -EOPNOTSUPP; + } + return 0; +} + /* awc_attach() creates an "instance" of the driver, allocating local data structures for one device. The device is registered @@ -230,7 +296,8 @@ // dev->set_config = &awc_config_misiganes,aga mitte awc_config; dev->get_stats = &awc_get_stats; // dev->set_multicast_list = &awc_set_multicast_list; - + dev->do_ioctl = &awc_ioctl; + strcpy(dev->name, ((struct awc_private *)dev->priv)->node.dev_name); ether_setup(dev); diff -Naur -X /g/g/lib/dontdiff /spare/tmp/linux-2.5.4-pre1/drivers/net/pcmcia/fmvj18x_cs.c linux_2_5/drivers/net/pcmcia/fmvj18x_cs.c --- /spare/tmp/linux-2.5.4-pre1/drivers/net/pcmcia/fmvj18x_cs.c Fri Jan 11 00:23:45 2002 +++ linux_2_5/drivers/net/pcmcia/fmvj18x_cs.c Tue Jan 15 06:45:23 2002 @@ -28,6 +28,9 @@ ======================================================================*/ +#define DRV_NAME "fmvj18x_cs" +#define DRV_VERSION "2.6" + #include #include #include @@ -39,6 +42,9 @@ #include #include #include +#include + +#include #include #include @@ -74,7 +80,7 @@ #ifdef PCMCIA_DEBUG INT_MODULE_PARM(pc_debug, PCMCIA_DEBUG); #define DEBUG(n, args...) if (pc_debug>(n)) printk(KERN_DEBUG args) -static char *version = "fmvj18x_cs.c 2.6 2001/09/17"; +static char *version = DRV_NAME ".c " DRV_VERSION " 2001/09/17"; #else #define DEBUG(n, args...) #endif @@ -104,6 +110,7 @@ static struct net_device_stats *fjn_get_stats(struct net_device *dev); static void set_rx_mode(struct net_device *dev); static void fjn_tx_timeout(struct net_device *dev); +static int fjn_ioctl(struct net_device *, struct ifreq *, int); static dev_info_t dev_info = "fmvj18x_cs"; static dev_link_t *dev_list; @@ -316,6 +323,7 @@ dev->tx_timeout = fjn_tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; #endif + dev->do_ioctl = fjn_ioctl; /* Register with Card Services */ link->next = dev_list; @@ -1102,6 +1110,65 @@ } /* fjn_rx */ /*====================================================================*/ + +static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr) +{ + u32 ethcmd; + + /* dev_ioctl() in ../../net/core/dev.c has already checked + capable(CAP_NET_ADMIN), so don't bother with that here. */ + + if (get_user(ethcmd, (u32 *)useraddr)) + return -EFAULT; + + switch (ethcmd) { + + case ETHTOOL_GDRVINFO: { + struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO }; + strcpy (info.driver, DRV_NAME); + strcpy (info.version, DRV_VERSION); + sprintf(info.bus_info, "PCMCIA 0x%lx", dev->base_addr); + if (copy_to_user (useraddr, &info, sizeof (info))) + return -EFAULT; + return 0; + } + +#ifdef PCMCIA_DEBUG + /* get message-level */ + case ETHTOOL_GMSGLVL: { + struct ethtool_value edata = {ETHTOOL_GMSGLVL}; + edata.data = pc_debug; + if (copy_to_user(useraddr, &edata, sizeof(edata))) + return -EFAULT; + return 0; + } + /* set message-level */ + case ETHTOOL_SMSGLVL: { + struct ethtool_value edata; + if (copy_from_user(&edata, useraddr, sizeof(edata))) + return -EFAULT; + pc_debug = edata.data; + return 0; + } +#endif + + default: + break; + } + + return -EOPNOTSUPP; +} + +static int fjn_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 -EOPNOTSUPP; + } +} static int fjn_config(struct net_device *dev, struct ifmap *map){ return 0;