PM/Suspend: Introduce two new platform callbacks to avoid breakage
[safe/jmp/linux-2.6] / drivers / net / 3c527.c
index d516c32..b61073c 100644 (file)
@@ -103,8 +103,8 @@ DRV_NAME ".c:v" DRV_VERSION " " DRV_RELDATE " Richard Procter <rnp@paradise.net.
 #include <linux/ethtool.h>
 #include <linux/completion.h>
 #include <linux/bitops.h>
+#include <linux/semaphore.h>
 
-#include <asm/semaphore.h>
 #include <asm/uaccess.h>
 #include <asm/system.h>
 #include <asm/io.h>
@@ -158,7 +158,6 @@ struct mc32_local
        int slot;
 
        u32 base;
-       struct net_device_stats net_stats;
        volatile struct mc32_mailbox *rx_box;
        volatile struct mc32_mailbox *tx_box;
        volatile struct mc32_mailbox *exec_box;
@@ -257,8 +256,6 @@ struct net_device *__init mc32_probe(int unit)
        if (unit >= 0)
                sprintf(dev->name, "eth%d", unit);
 
-       SET_MODULE_OWNER(dev);
-
        /* Do not check any supplied i/o locations.
           POS registers usually don't fail :) */
 
@@ -291,6 +288,18 @@ struct net_device *__init mc32_probe(int unit)
        return ERR_PTR(-ENODEV);
 }
 
+static const struct net_device_ops netdev_ops = {
+       .ndo_open               = mc32_open,
+       .ndo_stop               = mc32_close,
+       .ndo_start_xmit         = mc32_send_packet,
+       .ndo_get_stats          = mc32_get_stats,
+       .ndo_set_multicast_list = mc32_set_multicast_list,
+       .ndo_tx_timeout         = mc32_timeout,
+       .ndo_change_mtu         = eth_change_mtu,
+       .ndo_set_mac_address    = eth_mac_addr,
+       .ndo_validate_addr      = eth_validate_addr,
+};
+
 /**
  * mc32_probe1 -       Check a given slot for a board and test the card
  * @dev:  Device structure to fill in
@@ -398,17 +407,17 @@ static int __init mc32_probe1(struct net_device *dev, int slot)
         *      Go PROM browsing
         */
 
-       printk("%s: Address ", dev->name);
-
        /* Retrieve and print the ethernet address. */
        for (i = 0; i < 6; i++)
        {
                mca_write_pos(slot, 6, i+12);
                mca_write_pos(slot, 7, 0);
 
-               printk(" %2.2x", dev->dev_addr[i] = mca_read_pos(slot,3));
+               dev->dev_addr[i] = mca_read_pos(slot,3);
        }
 
+       printk("%s: Address %pM", dev->name, dev->dev_addr);
+
        mca_write_pos(slot, 6, 0);
        mca_write_pos(slot, 7, 0);
 
@@ -521,12 +530,7 @@ static int __init mc32_probe1(struct net_device *dev, int slot)
        printk("%s: Firmware Rev %d. %d RX buffers, %d TX buffers. Base of 0x%08X.\n",
                dev->name, lp->exec_box->data[12], lp->rx_len, lp->tx_len, lp->base);
 
-       dev->open               = mc32_open;
-       dev->stop               = mc32_close;
-       dev->hard_start_xmit    = mc32_send_packet;
-       dev->get_stats          = mc32_get_stats;
-       dev->set_multicast_list = mc32_set_multicast_list;
-       dev->tx_timeout         = mc32_timeout;
+       dev->netdev_ops         = &netdev_ops;
        dev->watchdog_timeo     = HZ*5; /* Board does all the work */
        dev->ethtool_ops        = &netdev_ethtool_ops;
 
@@ -1094,24 +1098,24 @@ static void mc32_update_stats(struct net_device *dev)
 
        u32 rx_errors=0;
 
-       rx_errors+=lp->net_stats.rx_crc_errors   +=st->rx_crc_errors;
+       rx_errors+=dev->stats.rx_crc_errors   +=st->rx_crc_errors;
                                                   st->rx_crc_errors=0;
-       rx_errors+=lp->net_stats.rx_fifo_errors  +=st->rx_overrun_errors;
+       rx_errors+=dev->stats.rx_fifo_errors  +=st->rx_overrun_errors;
                                                   st->rx_overrun_errors=0;
-       rx_errors+=lp->net_stats.rx_frame_errors +=st->rx_alignment_errors;
+       rx_errors+=dev->stats.rx_frame_errors +=st->rx_alignment_errors;
                                                   st->rx_alignment_errors=0;
-       rx_errors+=lp->net_stats.rx_length_errors+=st->rx_tooshort_errors;
+       rx_errors+=dev->stats.rx_length_errors+=st->rx_tooshort_errors;
                                                   st->rx_tooshort_errors=0;
-       rx_errors+=lp->net_stats.rx_missed_errors+=st->rx_outofresource_errors;
+       rx_errors+=dev->stats.rx_missed_errors+=st->rx_outofresource_errors;
                                                   st->rx_outofresource_errors=0;
-        lp->net_stats.rx_errors=rx_errors;
+        dev->stats.rx_errors=rx_errors;
 
        /* Number of packets which saw one collision */
-       lp->net_stats.collisions+=st->dataC[10];
+       dev->stats.collisions+=st->dataC[10];
        st->dataC[10]=0;
 
        /* Number of packets which saw 2--15 collisions */
-       lp->net_stats.collisions+=st->dataC[11];
+       dev->stats.collisions+=st->dataC[11];
        st->dataC[11]=0;
 }
 
@@ -1179,7 +1183,7 @@ static void mc32_rx_ring(struct net_device *dev)
                                skb=dev_alloc_skb(length+2);
 
                                if(skb==NULL) {
-                                       lp->net_stats.rx_dropped++;
+                                       dev->stats.rx_dropped++;
                                        goto dropped;
                                }
 
@@ -1189,10 +1193,8 @@ static void mc32_rx_ring(struct net_device *dev)
                        }
 
                        skb->protocol=eth_type_trans(skb,dev);
-                       skb->dev=dev;
-                       dev->last_rx = jiffies;
-                       lp->net_stats.rx_packets++;
-                       lp->net_stats.rx_bytes += length;
+                       dev->stats.rx_packets++;
+                       dev->stats.rx_bytes += length;
                        netif_rx(skb);
                }
 
@@ -1255,34 +1257,34 @@ static void mc32_tx_ring(struct net_device *dev)
                        /* Not COMPLETED */
                        break;
                }
-               lp->net_stats.tx_packets++;
+               dev->stats.tx_packets++;
                if(!(np->status & (1<<6))) /* Not COMPLETED_OK */
                {
-                       lp->net_stats.tx_errors++;
+                       dev->stats.tx_errors++;
 
                        switch(np->status&0x0F)
                        {
                                case 1:
-                                       lp->net_stats.tx_aborted_errors++;
+                                       dev->stats.tx_aborted_errors++;
                                        break; /* Max collisions */
                                case 2:
-                                       lp->net_stats.tx_fifo_errors++;
+                                       dev->stats.tx_fifo_errors++;
                                        break;
                                case 3:
-                                       lp->net_stats.tx_carrier_errors++;
+                                       dev->stats.tx_carrier_errors++;
                                        break;
                                case 4:
-                                       lp->net_stats.tx_window_errors++;
+                                       dev->stats.tx_window_errors++;
                                        break;  /* CTS Lost */
                                case 5:
-                                       lp->net_stats.tx_aborted_errors++;
+                                       dev->stats.tx_aborted_errors++;
                                        break; /* Transmit timeout */
                        }
                }
                /* Packets are sent in order - this is
                    basically a FIFO queue of buffers matching
                    the card ring */
-               lp->net_stats.tx_bytes+=lp->tx_ring[t].skb->len;
+               dev->stats.tx_bytes+=lp->tx_ring[t].skb->len;
                dev_kfree_skb_irq(lp->tx_ring[t].skb);
                lp->tx_ring[t].skb=NULL;
                atomic_inc(&lp->tx_count);
@@ -1324,11 +1326,6 @@ static irqreturn_t mc32_interrupt(int irq, void *dev_id)
        int rx_event = 0;
        int tx_event = 0;
 
-       if (dev == NULL) {
-               printk(KERN_WARNING "%s: irq %d for unknown device.\n", cardname, irq);
-               return IRQ_NONE;
-       }
-
        ioaddr = dev->base_addr;
        lp = netdev_priv(dev);
 
@@ -1374,7 +1371,7 @@ static irqreturn_t mc32_interrupt(int irq, void *dev_id)
                        case 6:
                                /* Out of RX buffers stat */
                                /* Must restart rx */
-                               lp->net_stats.rx_dropped++;
+                               dev->stats.rx_dropped++;
                                mc32_rx_ring(dev);
                                mc32_start_transceiver(dev);
                                break;
@@ -1496,10 +1493,8 @@ static int mc32_close(struct net_device *dev)
 
 static struct net_device_stats *mc32_get_stats(struct net_device *dev)
 {
-       struct mc32_local *lp = netdev_priv(dev);
-
        mc32_update_stats(dev);
-       return &lp->net_stats;
+       return &dev->stats;
 }
 
 
@@ -1531,14 +1526,11 @@ static void do_mc32_set_multicast_list(struct net_device *dev, int retry)
        struct mc32_local *lp = netdev_priv(dev);
        u16 filt = (1<<2); /* Save Bad Packets, for stats purposes */
 
-       if (dev->flags&IFF_PROMISC)
+       if ((dev->flags&IFF_PROMISC) ||
+           (dev->flags&IFF_ALLMULTI) ||
+           dev->mc_count > 10)
                /* Enable promiscuous mode */
                filt |= 1;
-       else if((dev->flags&IFF_ALLMULTI) || dev->mc_count > 10)
-       {
-               dev->flags|=IFF_PROMISC;
-               filt |= 1;
-       }
        else if(dev->mc_count)
        {
                unsigned char block[62];
@@ -1664,7 +1656,7 @@ int __init init_module(void)
  *     transmit operations are allowed to start scribbling into memory.
  */
 
-void cleanup_module(void)
+void __exit cleanup_module(void)
 {
        unregister_netdev(this_device);
        cleanup_card(this_device);