aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/pcmcia/pcnet_cs.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c
index a6999403f37b..2fbf9f9ddd37 100644
--- a/drivers/net/pcmcia/pcnet_cs.c
+++ b/drivers/net/pcmcia/pcnet_cs.c
@@ -39,6 +39,7 @@
39#include <linux/ethtool.h> 39#include <linux/ethtool.h>
40#include <linux/netdevice.h> 40#include <linux/netdevice.h>
41#include <linux/log2.h> 41#include <linux/log2.h>
42#include <linux/etherdevice.h>
42#include "../8390.h" 43#include "../8390.h"
43 44
44#include <pcmcia/cs_types.h> 45#include <pcmcia/cs_types.h>
@@ -233,6 +234,23 @@ static inline pcnet_dev_t *PRIV(struct net_device *dev)
233 return (pcnet_dev_t *)(p + sizeof(struct ei_device)); 234 return (pcnet_dev_t *)(p + sizeof(struct ei_device));
234} 235}
235 236
237static const struct net_device_ops pcnet_netdev_ops = {
238 .ndo_open = pcnet_open,
239 .ndo_stop = pcnet_close,
240 .ndo_set_config = set_config,
241 .ndo_start_xmit = ei_start_xmit,
242 .ndo_get_stats = ei_get_stats,
243 .ndo_do_ioctl = ei_ioctl,
244 .ndo_set_multicast_list = ei_set_multicast_list,
245 .ndo_tx_timeout = ei_tx_timeout,
246 .ndo_change_mtu = eth_change_mtu,
247 .ndo_set_mac_address = eth_mac_addr,
248 .ndo_validate_addr = eth_validate_addr,
249#ifdef CONFIG_NET_POLL_CONTROLLER
250 .ndo_poll_controller = ei_poll,
251#endif
252};
253
236/*====================================================================== 254/*======================================================================
237 255
238 pcnet_attach() creates an "instance" of the driver, allocating 256 pcnet_attach() creates an "instance" of the driver, allocating
@@ -260,9 +278,7 @@ static int pcnet_probe(struct pcmcia_device *link)
260 link->conf.Attributes = CONF_ENABLE_IRQ; 278 link->conf.Attributes = CONF_ENABLE_IRQ;
261 link->conf.IntType = INT_MEMORY_AND_IO; 279 link->conf.IntType = INT_MEMORY_AND_IO;
262 280
263 dev->open = &pcnet_open; 281 dev->netdev_ops = &pcnet_netdev_ops;
264 dev->stop = &pcnet_close;
265 dev->set_config = &set_config;
266 282
267 return pcnet_config(link); 283 return pcnet_config(link);
268} /* pcnet_attach */ 284} /* pcnet_attach */
@@ -640,18 +656,12 @@ static int pcnet_config(struct pcmcia_device *link)
640 656
641 SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops); 657 SET_ETHTOOL_OPS(dev, &netdev_ethtool_ops);
642 658
643 if (info->flags & (IS_DL10019|IS_DL10022)) { 659 if (info->flags & (IS_DL10019|IS_DL10022))
644 dev->do_ioctl = &ei_ioctl;
645 mii_phy_probe(dev); 660 mii_phy_probe(dev);
646 }
647 661
648 link->dev_node = &info->node; 662 link->dev_node = &info->node;
649 SET_NETDEV_DEV(dev, &handle_to_dev(link)); 663 SET_NETDEV_DEV(dev, &handle_to_dev(link));
650 664
651#ifdef CONFIG_NET_POLL_CONTROLLER
652 dev->poll_controller = ei_poll;
653#endif
654
655 if (register_netdev(dev) != 0) { 665 if (register_netdev(dev) != 0) {
656 printk(KERN_NOTICE "pcnet_cs: register_netdev() failed\n"); 666 printk(KERN_NOTICE "pcnet_cs: register_netdev() failed\n");
657 link->dev_node = NULL; 667 link->dev_node = NULL;
@@ -1183,6 +1193,10 @@ static int ei_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
1183 pcnet_dev_t *info = PRIV(dev); 1193 pcnet_dev_t *info = PRIV(dev);
1184 u16 *data = (u16 *)&rq->ifr_ifru; 1194 u16 *data = (u16 *)&rq->ifr_ifru;
1185 unsigned int mii_addr = dev->base_addr + DLINK_GPIO; 1195 unsigned int mii_addr = dev->base_addr + DLINK_GPIO;
1196
1197 if (!(info->flags & (IS_DL10019|IS_DL10022)))
1198 return -EINVAL;
1199
1186 switch (cmd) { 1200 switch (cmd) {
1187 case SIOCGMIIPHY: 1201 case SIOCGMIIPHY:
1188 data[0] = info->phy_id; 1202 data[0] = info->phy_id;