[PATCH] (1/2) Convert YAM driver to dynamic net_device

From: Stephen Hemminger (rbvwmog.qjqjwuqpr@nla.no)
Date: Wed Aug 13 2003 - 19:39:09 EEST

  • Next message: Stephen Hemminger: "[PATCH] (0/11) Netrom patches"

    Convert hamradio/yam.c to dynamic allocation of net_device instead of allocating
    an array of structures containing net_device's.

    This applies to 2.6.0-test3. Since this driver will come up with out any actual
    hardware was able to test load/unload on SMP.

    To bad my license is way out of date ;-)

    diff -Nru a/drivers/net/hamradio/yam.c b/drivers/net/hamradio/yam.c
    --- a/drivers/net/hamradio/yam.c Wed Aug 13 09:31:17 2003
    +++ b/drivers/net/hamradio/yam.c Wed Aug 13 09:31:17 2003
    @@ -120,7 +120,7 @@
             int irq;
             int dupmode;
     
    - struct net_device dev;
    + struct net_device *dev;
     
             /* Stats section */
     
    @@ -161,7 +161,7 @@
             struct yam_mcs *next;
     };
     
    -static struct yam_port yam_ports[NR_PORTS];
    +static struct net_device *yam_devs[NR_PORTS];
     
     static struct yam_mcs *yam_data;
     
    @@ -628,8 +628,8 @@
             int i;
     
             for (i = 0; i < NR_PORTS; i++) {
    - struct net_device *dev = &yam_ports[i].dev;
    - if (netif_running(dev))
    + struct net_device *dev = yam_devs[i];
    + if (dev && netif_running(dev))
                             yam_arbitrate(dev);
             }
             yam_timer.expires = jiffies + HZ / 100;
    @@ -724,8 +724,8 @@
             int handled = 0;
     
             for (i = 0; i < NR_PORTS; i++) {
    - yp = &yam_ports[i];
    - dev = &yp->dev;
    + dev = yam_devs[i];
    + yp = dev->priv;
     
                     if (!netif_running(dev))
                             continue;
    @@ -882,8 +882,10 @@
     
             /* Reset overruns for all ports - FPGA programming makes overruns */
             for (i = 0; i < NR_PORTS; i++) {
    - inb(LSR(yam_ports[i].dev.base_addr));
    - yam_ports[i].stats.rx_fifo_errors = 0;
    + struct net_device *dev = yam_devs[i];
    + struct yam_port *yp = dev->priv;
    + inb(LSR(dev->base_addr));
    + yp->stats.rx_fifo_errors = 0;
             }
     
             printk(KERN_INFO "%s at iobase 0x%lx irq %u uart %s\n", dev->name, dev->base_addr, dev->irq,
    @@ -1070,14 +1072,26 @@
     
     /* --------------------------------------------------------------------- */
     
    -static int yam_probe(struct net_device *dev)
    +static void yam_setup(struct net_device *dev)
     {
    - struct yam_port *yp;
    -
    - if (!dev)
    - return -ENXIO;
    + struct yam_port *yp = dev->priv;
     
    - yp = (struct yam_port *) dev->priv;
    + yp->magic = YAM_MAGIC;
    + yp->bitrate = DEFAULT_BITRATE;
    + yp->baudrate = DEFAULT_BITRATE * 2;
    + yp->iobase = 0;
    + yp->irq = 0;
    + yp->dupmode = 0;
    + yp->holdd = DEFAULT_HOLDD;
    + yp->txd = DEFAULT_TXD;
    + yp->txtail = DEFAULT_TXTAIL;
    + yp->slot = DEFAULT_SLOT;
    + yp->pers = DEFAULT_PERS;
    + yp->dev = dev;
    +
    + dev->base_addr = yp->iobase;
    + dev->irq = yp->irq;
    + SET_MODULE_OWNER(dev);
     
             dev->open = yam_open;
             dev->stop = yam_close;
    @@ -1104,50 +1118,35 @@
             memcpy(dev->broadcast, ax25_bcast, 7);
             memcpy(dev->dev_addr, ax25_test, 7);
     
    - /* New style flags */
    - dev->flags = 0;
    -
    - return 0;
     }
     
    -/* --------------------------------------------------------------------- */
    -
     static int __init yam_init_driver(void)
     {
             struct net_device *dev;
    - int i;
    + int i, err;
    + char name[IFNAMSIZ];
     
             printk(yam_drvinfo);
     
             for (i = 0; i < NR_PORTS; i++) {
    - sprintf(yam_ports[i].dev.name, "yam%d", i);
    - yam_ports[i].magic = YAM_MAGIC;
    - yam_ports[i].bitrate = DEFAULT_BITRATE;
    - yam_ports[i].baudrate = DEFAULT_BITRATE * 2;
    - yam_ports[i].iobase = 0;
    - yam_ports[i].irq = 0;
    - yam_ports[i].dupmode = 0;
    - yam_ports[i].holdd = DEFAULT_HOLDD;
    - yam_ports[i].txd = DEFAULT_TXD;
    - yam_ports[i].txtail = DEFAULT_TXTAIL;
    - yam_ports[i].slot = DEFAULT_SLOT;
    - yam_ports[i].pers = DEFAULT_PERS;
    -
    - dev = &yam_ports[i].dev;
    -
    - dev->priv = &yam_ports[i];
    - dev->base_addr = yam_ports[i].iobase;
    - dev->irq = yam_ports[i].irq;
    - dev->init = yam_probe;
    - dev->if_port = 0;
    -
    - if (register_netdev(dev)) {
    + sprintf(name, "yam%d", i);
    +
    + dev = alloc_netdev(sizeof(struct yam_port), name,
    + yam_setup);
    + if (!dev) {
    + printk(KERN_ERR "yam: cannot allocate net device %s\n",
    + dev->name);
    + err = -ENOMEM;
    + goto error;
    + }
    +
    + err = register_netdev(dev);
    + if (err) {
                             printk(KERN_WARNING "yam: cannot register net device %s\n", dev->name);
    - dev->priv = NULL;
    - return -ENXIO;
    + goto error;
                     }
    + yam_devs[i] = dev;
     
    - SET_MODULE_OWNER(dev);
             }
     
             yam_timer.function = yam_dotimer;
    @@ -1156,6 +1155,12 @@
     
             proc_net_create("yam", 0, yam_net_get_info);
             return 0;
    + error:
    + while (--i >= 0) {
    + unregister_netdev(yam_devs[i]);
    + kfree(yam_devs[i]);
    + }
    + return err;
     }
     
     /* --------------------------------------------------------------------- */
    @@ -1167,12 +1172,11 @@
     
             del_timer(&yam_timer);
             for (i = 0; i < NR_PORTS; i++) {
    - struct net_device *dev = &yam_ports[i].dev;
    - if (!dev->priv)
    - continue;
    - if (netif_running(dev))
    - yam_close(dev);
    - unregister_netdev(dev);
    + struct net_device *dev = yam_devs[i];
    + if (dev) {
    + unregister_netdev(dev);
    + kfree(dev);
    + }
             }
     
             while (yam_data) {
    -
    To unsubscribe from this list: send the line "unsubscribe linux-hams" in
    the body of a message to lnwlhgw.tfghd@shlink.net
    More majordomo info at http://vger.kernel.org/majordomo-info.html



    This archive was generated by hypermail 2b30 : Wed Aug 13 2003 - 19:40:49 EEST