Commit e032fa3f authored by Jeff Garzik's avatar Jeff Garzik

[netdrvr] ethtool_ops support for 3c515, 3c523, 3c527, and dmfe

parent e34b4b9f
...@@ -392,7 +392,7 @@ static int corkscrew_close(struct net_device *dev); ...@@ -392,7 +392,7 @@ static int corkscrew_close(struct net_device *dev);
static void update_stats(int addr, struct net_device *dev); static void update_stats(int addr, struct net_device *dev);
static struct net_device_stats *corkscrew_get_stats(struct net_device *dev); static struct net_device_stats *corkscrew_get_stats(struct net_device *dev);
static void set_rx_mode(struct net_device *dev); static void set_rx_mode(struct net_device *dev);
static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); static struct ethtool_ops netdev_ethtool_ops;
/* /*
...@@ -718,7 +718,7 @@ static int corkscrew_probe1(struct net_device *dev) ...@@ -718,7 +718,7 @@ static int corkscrew_probe1(struct net_device *dev)
dev->stop = &corkscrew_close; dev->stop = &corkscrew_close;
dev->get_stats = &corkscrew_get_stats; dev->get_stats = &corkscrew_get_stats;
dev->set_multicast_list = &set_rx_mode; dev->set_multicast_list = &set_rx_mode;
dev->do_ioctl = netdev_ioctl; dev->ethtool_ops = &netdev_ethtool_ops;
return 0; return 0;
} }
...@@ -1580,86 +1580,30 @@ static void set_rx_mode(struct net_device *dev) ...@@ -1580,86 +1580,30 @@ static void set_rx_mode(struct net_device *dev)
outw(new_mode, ioaddr + EL3_CMD); outw(new_mode, ioaddr + EL3_CMD);
} }
/** 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 = corkscrew_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;
corkscrew_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
void cleanup_module(void) void cleanup_module(void)
......
...@@ -188,7 +188,7 @@ static void elmc_timeout(struct net_device *dev); ...@@ -188,7 +188,7 @@ static void elmc_timeout(struct net_device *dev);
#ifdef ELMC_MULTICAST #ifdef ELMC_MULTICAST
static void set_multicast_list(struct net_device *dev); static void set_multicast_list(struct net_device *dev);
#endif #endif
static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); static struct ethtool_ops netdev_ethtool_ops;
/* helper-functions */ /* helper-functions */
static int init586(struct net_device *dev); static int init586(struct net_device *dev);
...@@ -571,7 +571,7 @@ int __init elmc_probe(struct net_device *dev) ...@@ -571,7 +571,7 @@ int __init elmc_probe(struct net_device *dev)
#else #else
dev->set_multicast_list = NULL; dev->set_multicast_list = NULL;
#endif #endif
dev->do_ioctl = netdev_ioctl; dev->ethtool_ops = &netdev_ethtool_ops;
ether_setup(dev); ether_setup(dev);
...@@ -1228,70 +1228,17 @@ static void set_multicast_list(struct net_device *dev) ...@@ -1228,70 +1228,17 @@ static void set_multicast_list(struct net_device *dev)
} }
#endif #endif
/** 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, "MCA 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, "MCA 0x%lx", dev->base_addr);
if (copy_to_user (useraddr, &info, sizeof (info)))
return -EFAULT;
return 0;
}
default:
break;
}
return -EOPNOTSUPP;
} }
/** static struct ethtool_ops netdev_ethtool_ops = {
* netdev_ioctl: Handle network interface ioctls .get_drvinfo = netdev_get_drvinfo,
* @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;
switch (cmd) {
case SIOCETHTOOL:
rc = netdev_ethtool_ioctl(dev, (void *) rq->ifr_data);
break;
default:
rc = -EOPNOTSUPP;
break;
}
return rc;
}
/*************************************************************************/
#ifdef MODULE #ifdef MODULE
......
...@@ -218,7 +218,7 @@ static int mc32_close(struct net_device *dev); ...@@ -218,7 +218,7 @@ static int mc32_close(struct net_device *dev);
static struct net_device_stats *mc32_get_stats(struct net_device *dev); static struct net_device_stats *mc32_get_stats(struct net_device *dev);
static void mc32_set_multicast_list(struct net_device *dev); static void mc32_set_multicast_list(struct net_device *dev);
static void mc32_reset_multicast_list(struct net_device *dev); static void mc32_reset_multicast_list(struct net_device *dev);
static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); static struct ethtool_ops netdev_ethtool_ops;
/** /**
* mc32_probe - Search for supported boards * mc32_probe - Search for supported boards
...@@ -508,7 +508,7 @@ static int __init mc32_probe1(struct net_device *dev, int slot) ...@@ -508,7 +508,7 @@ static int __init mc32_probe1(struct net_device *dev, int slot)
dev->set_multicast_list = mc32_set_multicast_list; dev->set_multicast_list = mc32_set_multicast_list;
dev->tx_timeout = mc32_timeout; dev->tx_timeout = mc32_timeout;
dev->watchdog_timeo = HZ*5; /* Board does all the work */ dev->watchdog_timeo = HZ*5; /* Board does all the work */
dev->do_ioctl = netdev_ioctl; dev->ethtool_ops = &netdev_ethtool_ops;
lp->xceiver_state = HALTED; lp->xceiver_state = HALTED;
...@@ -1655,86 +1655,30 @@ static void mc32_reset_multicast_list(struct net_device *dev) ...@@ -1655,86 +1655,30 @@ static void mc32_reset_multicast_list(struct net_device *dev)
do_mc32_set_multicast_list(dev,1); do_mc32_set_multicast_list(dev,1);
} }
/** 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, "MCA 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, "MCA 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 = mc32_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;
mc32_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 mc32_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)
{
mc32_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 this_device; static struct net_device this_device;
......
...@@ -296,7 +296,7 @@ static int dmfe_start_xmit(struct sk_buff *, struct DEVICE *); ...@@ -296,7 +296,7 @@ static int dmfe_start_xmit(struct sk_buff *, struct DEVICE *);
static int dmfe_stop(struct DEVICE *); static int dmfe_stop(struct DEVICE *);
static struct net_device_stats * dmfe_get_stats(struct DEVICE *); static struct net_device_stats * dmfe_get_stats(struct DEVICE *);
static void dmfe_set_filter_mode(struct DEVICE *); static void dmfe_set_filter_mode(struct DEVICE *);
static int dmfe_do_ioctl(struct DEVICE *, struct ifreq *, int); static struct ethtool_ops netdev_ethtool_ops;
static u16 read_srom_word(long ,int); static u16 read_srom_word(long ,int);
static irqreturn_t dmfe_interrupt(int , void *, struct pt_regs *); static irqreturn_t dmfe_interrupt(int , void *, struct pt_regs *);
static void dmfe_descriptor_init(struct dmfe_board_info *, unsigned long); static void dmfe_descriptor_init(struct dmfe_board_info *, unsigned long);
...@@ -417,7 +417,7 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev, ...@@ -417,7 +417,7 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev,
dev->stop = &dmfe_stop; dev->stop = &dmfe_stop;
dev->get_stats = &dmfe_get_stats; dev->get_stats = &dmfe_get_stats;
dev->set_multicast_list = &dmfe_set_filter_mode; dev->set_multicast_list = &dmfe_set_filter_mode;
dev->do_ioctl = &dmfe_do_ioctl; dev->ethtool_ops = &netdev_ethtool_ops;
spin_lock_init(&db->lock); spin_lock_init(&db->lock);
pci_read_config_dword(pdev, 0x50, &pci_pmr); pci_read_config_dword(pdev, 0x50, &pci_pmr);
...@@ -1000,55 +1000,23 @@ static void dmfe_set_filter_mode(struct DEVICE * dev) ...@@ -1000,55 +1000,23 @@ static void dmfe_set_filter_mode(struct DEVICE * dev)
spin_unlock_irqrestore(&db->lock, flags); spin_unlock_irqrestore(&db->lock, flags);
} }
static void netdev_get_drvinfo(struct net_device *dev,
/* struct ethtool_drvinfo *info)
* Process the ethtool ioctl command
*/
static int dmfe_ethtool_ioctl(struct net_device *dev, void *useraddr)
{ {
struct dmfe_board_info *db = dev->priv; struct dmfe_board_info *np = dev->priv;
struct ethtool_drvinfo info = { ETHTOOL_GDRVINFO };
u32 ethcmd; strcpy(info->driver, DRV_NAME);
strcpy(info->version, DRV_VERSION);
if (copy_from_user(&ethcmd, useraddr, sizeof(ethcmd))) if (np->pdev)
return -EFAULT; strcpy(info->bus_info, pci_name(np->pdev));
switch (ethcmd) {
case ETHTOOL_GDRVINFO:
strcpy(info.driver, DRV_NAME);
strcpy(info.version, DRV_VERSION);
if (db->pdev)
strcpy(info.bus_info, pci_name(db->pdev));
else else
sprintf(info.bus_info, "EISA 0x%lx %d", sprintf(info->bus_info, "EISA 0x%lx %d",
dev->base_addr, dev->irq); dev->base_addr, dev->irq);
if (copy_to_user(useraddr, &info, sizeof(info)))
return -EFAULT;
return 0;
}
return -EOPNOTSUPP;
}
/*
* Process the upper socket ioctl command
*/
static int dmfe_do_ioctl(struct DEVICE *dev, struct ifreq *ifr, int cmd)
{
int retval = -EOPNOTSUPP;
DMFE_DBUG(0, "dmfe_do_ioctl()", 0);
switch(cmd) {
case SIOCETHTOOL:
return dmfe_ethtool_ioctl(dev, (void*)ifr->ifr_data);
}
return retval;
} }
static struct ethtool_ops netdev_ethtool_ops = {
.get_drvinfo = netdev_get_drvinfo,
};
/* /*
* A periodic timer routine * A periodic timer routine
......
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