Commit e34b4b9f authored by Jeff Garzik's avatar Jeff Garzik

[netdrvr] ethtool_ops support in 3c503, 3c505, 3c507

parent 3c49284b
...@@ -80,7 +80,7 @@ static void el2_block_input(struct net_device *dev, int count, struct sk_buff *s ...@@ -80,7 +80,7 @@ static void el2_block_input(struct net_device *dev, int count, struct sk_buff *s
int ring_offset); int ring_offset);
static void el2_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr, static void el2_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
int ring_page); int ring_page);
static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); static struct ethtool_ops netdev_ethtool_ops;
/* This routine probes for a memory-mapped 3c503 board by looking for /* This routine probes for a memory-mapped 3c503 board by looking for
...@@ -308,7 +308,7 @@ el2_probe1(struct net_device *dev, int ioaddr) ...@@ -308,7 +308,7 @@ el2_probe1(struct net_device *dev, int ioaddr)
dev->open = &el2_open; dev->open = &el2_open;
dev->stop = &el2_close; dev->stop = &el2_close;
dev->do_ioctl = &netdev_ioctl; dev->ethtool_ops = &netdev_ethtool_ops;
if (dev->mem_start) if (dev->mem_start)
printk("%s: %s - %dkB RAM, 8kB shared mem window at %#6lx-%#6lx.\n", printk("%s: %s - %dkB RAM, 8kB shared mem window at %#6lx-%#6lx.\n",
...@@ -617,69 +617,18 @@ el2_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring ...@@ -617,69 +617,18 @@ el2_block_input(struct net_device *dev, int count, struct sk_buff *skb, int ring
return; return;
} }
/**
* netdev_ethtool_ioctl: Handle network interface SIOCETHTOOL ioctls
* @dev: network interface on which out-of-band action is to be performed
* @useraddr: userspace address to which data is to be read and returned
*
* Process the various commands of the SIOCETHTOOL interface.
*/
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, "ISA 0x%lx", dev->base_addr);
if (copy_to_user (useraddr, &info, sizeof (info)))
return -EFAULT;
return 0;
}
default:
break;
}
return -EOPNOTSUPP;
}
/** static void netdev_get_drvinfo(struct net_device *dev,
* netdev_ioctl: Handle network interface ioctls struct ethtool_drvinfo *info)
* @dev: network interface on which out-of-band action is to be performed
* @rq: user request data
* @cmd: command issued by user
*
* Process the various out-of-band ioctls passed to this driver.
*/
static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd)
{ {
int rc = 0; strcpy(info->driver, DRV_NAME);
strcpy(info->version, DRV_VERSION);
switch (cmd) { sprintf(info->bus_info, "ISA 0x%lx", dev->base_addr);
case SIOCETHTOOL:
rc = netdev_ethtool_ioctl(dev, (void *) rq->ifr_data);
break;
default:
rc = -EOPNOTSUPP;
break;
}
return rc;
} }
static struct ethtool_ops netdev_ethtool_ops = {
.get_drvinfo = netdev_get_drvinfo,
};
#ifdef MODULE #ifdef MODULE
#define MAX_EL2_CARDS 4 /* Max number of EL2 cards per module */ #define MAX_EL2_CARDS 4 /* Max number of EL2 cards per module */
......
...@@ -1163,86 +1163,30 @@ static struct net_device_stats *elp_get_stats(struct net_device *dev) ...@@ -1163,86 +1163,30 @@ static struct net_device_stats *elp_get_stats(struct net_device *dev)
return &adapter->stats; return &adapter->stats;
} }
/**
* netdev_ethtool_ioctl: Handle network interface SIOCETHTOOL ioctls
* @dev: network interface on which out-of-band action is to be performed
* @useraddr: userspace address to which data is to be read and returned
*
* Process the various commands of the SIOCETHTOOL interface.
*/
static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr) static void netdev_get_drvinfo(struct net_device *dev,
struct ethtool_drvinfo *info)
{ {
u32 ethcmd; strcpy(info->driver, DRV_NAME);
strcpy(info->version, DRV_VERSION);
/* dev_ioctl() in ../../net/core/dev.c has already checked sprintf(info->bus_info, "ISA 0x%lx", dev->base_addr);
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, "ISA 0x%lx", dev->base_addr);
if (copy_to_user (useraddr, &info, sizeof (info)))
return -EFAULT;
return 0;
}
/* get message-level */
case ETHTOOL_GMSGLVL: {
struct ethtool_value edata = {ETHTOOL_GMSGLVL};
edata.data = 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;
debug = edata.data;
return 0;
}
default:
break;
}
return -EOPNOTSUPP;
} }
/** static u32 netdev_get_msglevel(struct net_device *dev)
* netdev_ioctl: Handle network interface ioctls
* @dev: network interface on which out-of-band action is to be performed
* @rq: user request data
* @cmd: command issued by user
*
* Process the various out-of-band ioctls passed to this driver.
*/
static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd)
{ {
int rc = 0; return debug;
}
switch (cmd) {
case SIOCETHTOOL:
rc = netdev_ethtool_ioctl(dev, (void *) rq->ifr_data);
break;
default:
rc = -EOPNOTSUPP;
break;
}
return rc; static void netdev_set_msglevel(struct net_device *dev, u32 level)
{
debug = level;
} }
static struct ethtool_ops netdev_ethtool_ops = {
.get_drvinfo = netdev_get_drvinfo,
.get_msglevel = netdev_get_msglevel,
.set_msglevel = netdev_set_msglevel,
};
/****************************************************** /******************************************************
* *
...@@ -1373,7 +1317,7 @@ static inline void elp_init(struct net_device *dev) ...@@ -1373,7 +1317,7 @@ static inline void elp_init(struct net_device *dev)
dev->tx_timeout = elp_timeout; /* local */ dev->tx_timeout = elp_timeout; /* local */
dev->watchdog_timeo = 10*HZ; dev->watchdog_timeo = 10*HZ;
dev->set_multicast_list = elp_set_mc_list; /* local */ dev->set_multicast_list = elp_set_mc_list; /* local */
dev->do_ioctl = netdev_ioctl; /* local */ dev->ethtool_ops = &netdev_ethtool_ops; /* local */
/* Setup the generic properties */ /* Setup the generic properties */
ether_setup(dev); ether_setup(dev);
......
...@@ -299,7 +299,7 @@ static void el16_tx_timeout (struct net_device *dev); ...@@ -299,7 +299,7 @@ static void el16_tx_timeout (struct net_device *dev);
static void hardware_send_packet(struct net_device *dev, void *buf, short length, short pad); static void hardware_send_packet(struct net_device *dev, void *buf, short length, short pad);
static void init_82586_mem(struct net_device *dev); static void init_82586_mem(struct net_device *dev);
static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); static struct ethtool_ops netdev_ethtool_ops;
/* Check for a network adaptor of this type, and return '0' iff one exists. /* Check for a network adaptor of this type, and return '0' iff one exists.
...@@ -431,7 +431,7 @@ static int __init el16_probe1(struct net_device *dev, int ioaddr) ...@@ -431,7 +431,7 @@ static int __init el16_probe1(struct net_device *dev, int ioaddr)
dev->get_stats = el16_get_stats; dev->get_stats = el16_get_stats;
dev->tx_timeout = el16_tx_timeout; dev->tx_timeout = el16_tx_timeout;
dev->watchdog_timeo = TX_TIMEOUT; dev->watchdog_timeo = TX_TIMEOUT;
dev->do_ioctl = netdev_ioctl; dev->ethtool_ops = &netdev_ethtool_ops;
ether_setup(dev); /* Generic ethernet behaviour */ ether_setup(dev); /* Generic ethernet behaviour */
...@@ -874,86 +874,29 @@ static void el16_rx(struct net_device *dev) ...@@ -874,86 +874,29 @@ static void el16_rx(struct net_device *dev)
lp->rx_tail = rx_tail; lp->rx_tail = rx_tail;
} }
/** static void netdev_get_drvinfo(struct net_device *dev,
* netdev_ethtool_ioctl: Handle network interface SIOCETHTOOL ioctls struct ethtool_drvinfo *info)
* @dev: network interface on which out-of-band action is to be performed
* @useraddr: userspace address to which data is to be read and returned
*
* Process the various commands of the SIOCETHTOOL interface.
*/
static int netdev_ethtool_ioctl (struct net_device *dev, void *useraddr)
{ {
u32 ethcmd; strcpy(info->driver, DRV_NAME);
strcpy(info->version, DRV_VERSION);
/* dev_ioctl() in ../../net/core/dev.c has already checked sprintf(info->bus_info, "ISA 0x%lx", dev->base_addr);
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, "ISA 0x%lx", dev->base_addr);
if (copy_to_user (useraddr, &info, sizeof (info)))
return -EFAULT;
return 0;
}
/* get message-level */
case ETHTOOL_GMSGLVL: {
struct ethtool_value edata = {ETHTOOL_GMSGLVL};
edata.data = 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;
debug = edata.data;
return 0;
}
default:
break;
}
return -EOPNOTSUPP;
} }
/** static u32 netdev_get_msglevel(struct net_device *dev)
* netdev_ioctl: Handle network interface ioctls
* @dev: network interface on which out-of-band action is to be performed
* @rq: user request data
* @cmd: command issued by user
*
* Process the various out-of-band ioctls passed to this driver.
*/
static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd)
{ {
int rc = 0; return debug;
}
switch (cmd) {
case SIOCETHTOOL:
rc = netdev_ethtool_ioctl(dev, (void *) rq->ifr_data);
break;
default:
rc = -EOPNOTSUPP;
break;
}
return rc; static void netdev_set_msglevel(struct net_device *dev, u32 level)
{
debug = level;
} }
static struct ethtool_ops netdev_ethtool_ops = {
.get_drvinfo = netdev_get_drvinfo,
.get_msglevel = netdev_get_msglevel,
.set_msglevel = netdev_set_msglevel,
};
#ifdef MODULE #ifdef MODULE
static struct net_device dev_3c507; static struct net_device dev_3c507;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment