alloc_etherdev for smc91c92_cs
PATCH 5/5 alloc_etherdev for smc91c92_cs
net_device is no longer allocated as part of the driver's private structure, instead it's allocated via alloc_netdev. compile tested only since no hardware against 2.5.73-bk
-daniel
===== smc91c92_cs.c 1.18 vs edited =====
smc91c92_cs.c renamed from drivers/net/pcmcia/smc91c92_cs.c +35 -40
@@ -113,7 +113,6 @@struct smc_private {dev_link_t link; -struct net_device dev;spinlock_t lock;u_short manfid;u_short cardid;
@@ -344,10 +343,13 @@flush_stale_links ();/* Create new ethernet device */ - smc =kmalloc (sizeof (struct smc_private ),GFP_KERNEL ); -if (!smc)return NULL ; -memset (smc,0 ,sizeof (struct smc_private )); - link = &smc->link; dev = &smc->dev; + dev =alloc_etherdev (sizeof (struct smc_private )); +if (!dev) +return NULL ; + smc = dev->priv; + link = &smc->link; + link->priv = dev; +spin_lock_init (&smc->lock);init_timer (&link->release); link->release.function = &smc91c92_release;
@@ -363,6 +365,7 @@for (i =0 ; i <4 ; i++) link->irq.IRQInfo2 |=1 << irq_list[i]; link->irq.Handler = &smc_interrupt; + link->irq.Instance = dev; link->conf.Attributes =CONF_ENABLE_IRQ ; link->conf.Vcc =50 ; link->conf.IntType =INT_MEMORY_AND_IO ;
@@ -373,7 +376,6 @@ dev->get_stats = &smc_get_stats; dev->set_config = &s9k_config; dev->set_multicast_list = &set_rx_mode; -ether_setup (dev); dev->open = &smc_open; dev->stop = &smc_close; dev->do_ioctl = &smc_ioctl;
@@ -381,7 +383,6 @@ dev->tx_timeout = smc_tx_timeout; dev->watchdog_timeo =TX_TIMEOUT ;#endif - dev->priv = link->priv = link->irq.Instance = smc; smc->mii_if.dev = dev; smc->mii_if.mdio_read = mdio_read;
@@ -421,7 +422,7 @@static void smc91c92_detach (dev_link_t *link) { -struct smc_private *smc = link->priv; +struct net_device *dev = link->priv;dev_link_t **linkp;DEBUG (0 ,"smc91c92_detach(0x%p)\n" , link);
@@ -447,8 +448,8 @@/* Unlink device structure, free bits */ *linkp = link->next;if (link->dev) -unregister_netdev (&smc->dev); -kfree (smc); +unregister_netdev (dev); +kfree (dev); }/* smc91c92_detach */
@@ -502,7 +503,8 @@static int mhz_3288_power (dev_link_t *link) { -struct smc_private *smc = link->priv; +struct net_device *dev = link->priv; +struct smc_private *smc = dev->priv;u_char tmp;/* Read the ISR twice... */
@@ -523,8 +525,8 @@static int mhz_mfc_config (dev_link_t *link) { -struct smc_private *smc = link->priv; -struct net_device *dev = &smc->dev; +struct net_device *dev = link->priv; +struct smc_private *smc = dev->priv;tuple_t tuple;cisparse_t parse;u_char buf[255 ];
@@ -590,8 +592,7 @@static int mhz_setup (dev_link_t *link) {client_handle_t handle = link->handle; -struct smc_private *smc = link->priv; -struct net_device *dev = &smc->dev; +struct net_device *dev = link->priv;tuple_t tuple;cisparse_t parse;u_char buf[255 ], *station_addr;
@@ -638,8 +639,8 @@static void mot_config (dev_link_t *link) { -struct smc_private *smc = link->priv; -struct net_device *dev = &smc->dev; +struct net_device *dev = link->priv; +struct smc_private *smc = dev->priv;ioaddr_t ioaddr = dev->base_addr;ioaddr_t iouart = link->io.BasePort2;
@@ -659,8 +660,7 @@static int mot_setup (dev_link_t *link) { -struct smc_private *smc = link->priv; -struct net_device *dev = &smc->dev; +struct net_device *dev = link->priv;ioaddr_t ioaddr = dev->base_addr;int i, wait, loop;u_int addr;
@@ -694,8 +694,7 @@static int smc_config (dev_link_t *link) { -struct smc_private *smc = link->priv; -struct net_device *dev = &smc->dev; +struct net_device *dev = link->priv;tuple_t tuple;cisparse_t parse;u_char buf[255 ];
@@ -727,8 +726,7 @@static int smc_setup (dev_link_t *link) {client_handle_t handle = link->handle; -struct smc_private *smc = link->priv; -struct net_device *dev = &smc->dev; +struct net_device *dev = link->priv;tuple_t tuple;cisparse_t parse;cistpl_lan_node_id_t *node_id;
@@ -755,7 +753,6 @@return 0 ; } } -/* Try the third string in the Version 1 Version/ID tuple. */ tuple.DesiredTuple =CISTPL_VERS_1 ;if (first_tuple (handle, &tuple, &parse) !=CS_SUCCESS )
@@ -771,8 +768,7 @@static int osi_config (dev_link_t *link) { -struct smc_private *smc = link->priv; -struct net_device *dev = &smc->dev; +struct net_device *dev = link->priv;static ioaddr_t com[4 ] = {0x3f8 ,0x2f8 ,0x3e8 ,0x2e8 };int i, j;
@@ -806,8 +802,7 @@static int osi_setup (dev_link_t *link,u_short manfid,u_short cardid) {client_handle_t handle = link->handle; -struct smc_private *smc = link->priv; -struct net_device *dev = &smc->dev; +struct net_device *dev = link->priv;tuple_t tuple;u_char buf[255 ];int i;
@@ -862,8 +857,7 @@static int check_sig (dev_link_t *link) { -struct smc_private *smc = link->priv; -struct net_device *dev = &smc->dev; +struct net_device *dev = link->priv;ioaddr_t ioaddr = dev->base_addr;int width;u_short s;
@@ -921,8 +915,8 @@static void smc91c92_config (dev_link_t *link) {client_handle_t handle = link->handle; -struct smc_private *smc = link->priv; -struct net_device *dev = &smc->dev; +struct net_device *dev = link->priv; +struct smc_private *smc = dev->priv;tuple_t tuple;cisparse_t parse;u_short buf[32 ];
@@ -1090,7 +1084,6 @@static void smc91c92_release (u_long arg) {dev_link_t *link = (dev_link_t *)arg; -struct smc_private *smc = link->priv;DEBUG (0 ,"smc91c92_release(0x%p)\n" , link);
@@ -1105,6 +1098,8 @@CardServices (ReleaseIO, link->handle, &link->io);CardServices (ReleaseIRQ, link->handle, &link->irq);if (link->win) { +struct net_device *dev = link->priv; +struct smc_private *smc = dev->priv;iounmap (smc->base);CardServices (ReleaseWindow, link->win); }
@@ -1126,8 +1121,8 @@ event_callback_args_t *args) {dev_link_t *link = args->client_data; -struct smc_private *smc = link->priv; -struct net_device *dev = &smc->dev; +struct net_device *dev = link->priv; +struct smc_private *smc = dev->priv;int i;DEBUG (1 ,"smc91c92_event(0x%06x)\n" , event);
@@ -1302,7 +1297,7 @@smc_reset (dev);init_timer (&smc->media); smc->media.function = &media_check; - smc->media.data = (u_long )smc; + smc->media.data = (u_long ) dev; smc->media.expires = jiffies +HZ ;add_timer (&smc->media);
@@ -1576,8 +1571,8 @@static irqreturn_t smc_interrupt (int irq,void *dev_id,struct pt_regs *regs) { -struct smc_private *smc = dev_id; -struct net_device *dev = &smc->dev; +struct net_device *dev = dev_id; +struct smc_private *smc = dev->priv;ioaddr_t ioaddr;u_short saved_bank, saved_pointer, mask, status;unsigned int handled =1 ;
@@ -1967,8 +1962,8 @@static void media_check (u_long arg) { -struct smc_private *smc = (struct smc_private *)(arg); -struct net_device *dev = &smc->dev; +struct net_device *dev = (struct net_device *) arg; +struct smc_private *smc = dev->priv;ioaddr_t ioaddr = dev->base_addr;u_short i, media, saved_bank;u_short link;
Jeff, you got these?
If not, I'll apply them.