net:wireless:bcmdhd: rename bcmsdh_remove & bcmsdh_probe
[linux-2.6.git] / drivers / net / 3c507.c
index 030c147..1e94555 100644 (file)
@@ -56,8 +56,8 @@ static const char version[] =
 #include <linux/errno.h>
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
+#include <linux/if_ether.h>
 #include <linux/skbuff.h>
-#include <linux/slab.h>
 #include <linux/init.h>
 #include <linux/bitops.h>
 
@@ -201,7 +201,7 @@ struct net_local {
 #define RX_BUF_SIZE    (1518+14+18)    /* packet+header+RBD */
 #define RX_BUF_END             (dev->mem_end - dev->mem_start)
 
-#define TX_TIMEOUT 5
+#define TX_TIMEOUT (HZ/20)
 
 /*
   That's it: only 86 bytes to set up the beast, including every extra
@@ -284,7 +284,8 @@ static unsigned short init_words[] = {
 
 static int     el16_probe1(struct net_device *dev, int ioaddr);
 static int     el16_open(struct net_device *dev);
-static int     el16_send_packet(struct sk_buff *skb, struct net_device *dev);
+static netdev_tx_t el16_send_packet(struct sk_buff *skb,
+                                   struct net_device *dev);
 static irqreturn_t el16_interrupt(int irq, void *dev_id);
 static void el16_rx(struct net_device *dev);
 static int     el16_close(struct net_device *dev);
@@ -310,8 +311,8 @@ static int mem_start;
 struct net_device * __init el16_probe(int unit)
 {
        struct net_device *dev = alloc_etherdev(sizeof(struct net_local));
-       static unsigned ports[] = { 0x300, 0x320, 0x340, 0x280, 0};
-       unsigned *port;
+       static const unsigned ports[] = { 0x300, 0x320, 0x340, 0x280, 0};
+       const unsigned *port;
        int err = -ENODEV;
 
        if (!dev)
@@ -352,12 +353,21 @@ out:
        return ERR_PTR(err);
 }
 
+static const struct net_device_ops netdev_ops = {
+       .ndo_open               = el16_open,
+       .ndo_stop               = el16_close,
+       .ndo_start_xmit         = el16_send_packet,
+       .ndo_tx_timeout         = el16_tx_timeout,
+       .ndo_change_mtu         = eth_change_mtu,
+       .ndo_set_mac_address    = eth_mac_addr,
+       .ndo_validate_addr      = eth_validate_addr,
+};
+
 static int __init el16_probe1(struct net_device *dev, int ioaddr)
 {
-       static unsigned char init_ID_done, version_printed;
+       static unsigned char init_ID_done;
        int i, irq, irqval, retval;
        struct net_local *lp;
-       DECLARE_MAC_BUF(mac);
 
        if (init_ID_done == 0) {
                ushort lrs_state = 0xff;
@@ -382,19 +392,17 @@ static int __init el16_probe1(struct net_device *dev, int ioaddr)
                goto out;
        }
 
-       if (net_debug  &&  version_printed++ == 0)
-               printk(version);
-
-       printk("%s: 3c507 at %#x,", dev->name, ioaddr);
+       pr_info("%s: 3c507 at %#x,", dev->name, ioaddr);
 
        /* We should make a few more checks here, like the first three octets of
           the S.A. for the manufacturer's code. */
 
        irq = inb(ioaddr + IRQ_CONFIG) & 0x0f;
 
-       irqval = request_irq(irq, &el16_interrupt, 0, DRV_NAME, dev);
+       irqval = request_irq(irq, el16_interrupt, 0, DRV_NAME, dev);
        if (irqval) {
-               printk(KERN_ERR "3c507: unable to get IRQ %d (irqval=%d).\n", irq, irqval);
+               pr_cont("\n");
+               pr_err("3c507: unable to get IRQ %d (irqval=%d).\n", irq, irqval);
                retval = -EAGAIN;
                goto out;
        }
@@ -405,7 +413,7 @@ static int __init el16_probe1(struct net_device *dev, int ioaddr)
        outb(0x01, ioaddr + MISC_CTRL);
        for (i = 0; i < 6; i++)
                dev->dev_addr[i] = inb(ioaddr + i);
-       printk(" %s", print_mac(mac, dev->dev_addr));
+       pr_cont(" %pM", dev->dev_addr);
 
        if (mem_start)
                net_debug = mem_start & 7;
@@ -434,26 +442,22 @@ static int __init el16_probe1(struct net_device *dev, int ioaddr)
        dev->if_port = (inb(ioaddr + ROM_CONFIG) & 0x80) ? 1 : 0;
        dev->irq = inb(ioaddr + IRQ_CONFIG) & 0x0f;
 
-       printk(", IRQ %d, %sternal xcvr, memory %#lx-%#lx.\n", dev->irq,
+       pr_cont(", IRQ %d, %sternal xcvr, memory %#lx-%#lx.\n", dev->irq,
                   dev->if_port ? "ex" : "in", dev->mem_start, dev->mem_end-1);
 
        if (net_debug)
-               printk(version);
+               pr_debug("%s", version);
 
        lp = netdev_priv(dev);
-       memset(lp, 0, sizeof(*lp));
        spin_lock_init(&lp->lock);
        lp->base = ioremap(dev->mem_start, RX_BUF_END);
        if (!lp->base) {
-               printk(KERN_ERR "3c507: unable to remap memory\n");
+               pr_err("3c507: unable to remap memory\n");
                retval = -EAGAIN;
                goto out1;
        }
 
-       dev->open = el16_open;
-       dev->stop = el16_close;
-       dev->hard_start_xmit = el16_send_packet;
-       dev->tx_timeout = el16_tx_timeout;
+       dev->netdev_ops = &netdev_ops;
        dev->watchdog_timeo = TX_TIMEOUT;
        dev->ethtool_ops = &netdev_ethtool_ops;
        dev->flags &= ~IFF_MULTICAST;   /* Multicast doesn't work */
@@ -482,30 +486,31 @@ static void el16_tx_timeout (struct net_device *dev)
        void __iomem *shmem = lp->base;
 
        if (net_debug > 1)
-               printk ("%s: transmit timed out, %s?  ", dev->name,
+               pr_debug("%s: transmit timed out, %s?  ", dev->name,
                        readw(shmem + iSCB_STATUS) & 0x8000 ? "IRQ conflict" :
                        "network cable problem");
        /* Try to restart the adaptor. */
        if (lp->last_restart == dev->stats.tx_packets) {
                if (net_debug > 1)
-                       printk ("Resetting board.\n");
+                       pr_cont("Resetting board.\n");
                /* Completely reset the adaptor. */
                init_82586_mem (dev);
                lp->tx_pkts_in_ring = 0;
        } else {
                /* Issue the channel attention signal and hope it "gets better". */
                if (net_debug > 1)
-                       printk ("Kicking board.\n");
+                       pr_cont("Kicking board.\n");
                writew(0xf000 | CUC_START | RX_START, shmem + iSCB_CMD);
                outb (0, ioaddr + SIGNAL_CA);   /* Issue channel-attn. */
                lp->last_restart = dev->stats.tx_packets;
        }
-       dev->trans_start = jiffies;
+       dev->trans_start = jiffies; /* prevent tx timeout */
        netif_wake_queue (dev);
 }
 
 
-static int el16_send_packet (struct sk_buff *skb, struct net_device *dev)
+static netdev_tx_t el16_send_packet (struct sk_buff *skb,
+                                    struct net_device *dev)
 {
        struct net_local *lp = netdev_priv(dev);
        int ioaddr = dev->base_addr;
@@ -523,7 +528,6 @@ static int el16_send_packet (struct sk_buff *skb, struct net_device *dev)
 
        hardware_send_packet (dev, buf, skb->len, length - skb->len);
 
-       dev->trans_start = jiffies;
        /* Enable the 82586 interrupt input. */
        outb (0x84, ioaddr + MISC_CTRL);
 
@@ -533,7 +537,7 @@ static int el16_send_packet (struct sk_buff *skb, struct net_device *dev)
 
        /* You might need to clean up and record Tx statistics here. */
 
-       return 0;
+       return NETDEV_TX_OK;
 }
 
 /*     The typical workload of the driver:
@@ -547,7 +551,7 @@ static irqreturn_t el16_interrupt(int irq, void *dev_id)
        void __iomem *shmem;
 
        if (dev == NULL) {
-               printk ("net_interrupt(): irq %d for unknown device.\n", irq);
+               pr_err("net_interrupt(): irq %d for unknown device.\n", irq);
                return IRQ_NONE;
        }
 
@@ -560,7 +564,7 @@ static irqreturn_t el16_interrupt(int irq, void *dev_id)
        status = readw(shmem+iSCB_STATUS);
 
        if (net_debug > 4) {
-               printk("%s: 3c507 interrupt, status %4.4x.\n", dev->name, status);
+               pr_debug("%s: 3c507 interrupt, status %4.4x.\n", dev->name, status);
        }
 
        /* Disable the 82586's input to the interrupt line. */
@@ -571,7 +575,7 @@ static irqreturn_t el16_interrupt(int irq, void *dev_id)
          unsigned short tx_status = readw(shmem+lp->tx_reap);
          if (!(tx_status & 0x8000)) {
                if (net_debug > 5)
-                       printk("Tx command incomplete (%#x).\n", lp->tx_reap);
+                       pr_debug("Tx command incomplete (%#x).\n", lp->tx_reap);
                break;
          }
          /* Tx unsuccessful or some interesting status bit set. */
@@ -585,7 +589,7 @@ static irqreturn_t el16_interrupt(int irq, void *dev_id)
          }
          dev->stats.tx_packets++;
          if (net_debug > 5)
-                 printk("Reaped %x, Tx status %04x.\n" , lp->tx_reap, tx_status);
+                 pr_debug("Reaped %x, Tx status %04x.\n" , lp->tx_reap, tx_status);
          lp->tx_reap += TX_BUF_SIZE;
          if (lp->tx_reap > RX_BUF_START - TX_BUF_SIZE)
                lp->tx_reap = TX_BUF_START;
@@ -600,7 +604,7 @@ static irqreturn_t el16_interrupt(int irq, void *dev_id)
 
        if (status & 0x4000) { /* Packet received. */
                if (net_debug > 5)
-                       printk("Received packet, rx_head %04x.\n", lp->rx_head);
+                       pr_debug("Received packet, rx_head %04x.\n", lp->rx_head);
                el16_rx(dev);
        }
 
@@ -609,7 +613,7 @@ static irqreturn_t el16_interrupt(int irq, void *dev_id)
 
        if ((status & 0x0700) != 0x0200 && netif_running(dev)) {
                if (net_debug)
-                       printk("%s: Command unit stopped, status %04x, restarting.\n",
+                       pr_debug("%s: Command unit stopped, status %04x, restarting.\n",
                                   dev->name, status);
                /* If this ever occurs we should really re-write the idle loop, reset
                   the Tx list, and do a complete restart of the command unit.
@@ -621,7 +625,7 @@ static irqreturn_t el16_interrupt(int irq, void *dev_id)
                /* The Rx unit is not ready, it must be hung.  Restart the receiver by
                   initializing the rx buffers, and issuing an Rx start command. */
                if (net_debug)
-                       printk("%s: Rx unit stopped, status %04x, restarting.\n",
+                       pr_debug("%s: Rx unit stopped, status %04x, restarting.\n",
                                   dev->name, status);
                init_rx_bufs(dev);
                writew(RX_BUF_START,shmem+iSCB_RFA);
@@ -727,8 +731,7 @@ static void init_82586_mem(struct net_device *dev)
        memcpy_toio(lp->base, init_words + 5, sizeof(init_words) - 10);
 
        /* Fill in the station address. */
-       memcpy_toio(lp->base+SA_OFFSET, dev->dev_addr,
-                  sizeof(dev->dev_addr));
+       memcpy_toio(lp->base+SA_OFFSET, dev->dev_addr, ETH_ALEN);
 
        /* The Tx-block list is written as needed.  We just set up the values. */
        lp->tx_cmd_link = IDLELOOP + 4;
@@ -747,9 +750,8 @@ static void init_82586_mem(struct net_device *dev)
                int boguscnt = 50;
                while (readw(shmem+iSCB_STATUS) == 0)
                        if (--boguscnt == 0) {
-                               printk("%s: i82586 initialization timed out with status %04x, "
-                                          "cmd %04x.\n", dev->name,
-                                          readw(shmem+iSCB_STATUS), readw(shmem+iSCB_CMD));
+                               pr_warning("%s: i82586 initialization timed out with status %04x, cmd %04x.\n",
+                                       dev->name, readw(shmem+iSCB_STATUS), readw(shmem+iSCB_CMD));
                                break;
                        }
                /* Issue channel-attn -- the 82586 won't start. */
@@ -759,9 +761,8 @@ static void init_82586_mem(struct net_device *dev)
        /* Disable loopback and enable interrupts. */
        outb(0x84, ioaddr + MISC_CTRL);
        if (net_debug > 4)
-               printk("%s: Initialized 82586, status %04x.\n", dev->name,
+               pr_debug("%s: Initialized 82586, status %04x.\n", dev->name,
                           readw(shmem+iSCB_STATUS));
-       return;
 }
 
 static void hardware_send_packet(struct net_device *dev, void *buf, short length, short pad)
@@ -804,7 +805,7 @@ static void hardware_send_packet(struct net_device *dev, void *buf, short length
                lp->tx_head = TX_BUF_START;
 
        if (net_debug > 4) {
-               printk("%s: 3c507 @%x send length = %d, tx_block %3x, next %3x.\n",
+               pr_debug("%s: 3c507 @%x send length = %d, tx_block %3x, next %3x.\n",
                           dev->name, ioaddr, length, tx_block, lp->tx_head);
        }
 
@@ -830,9 +831,9 @@ static void el16_rx(struct net_device *dev)
                void __iomem *data_frame = lp->base + data_buffer_addr;
                ushort pkt_len = readw(data_frame);
 
-               if (rfd_cmd != 0 || data_buffer_addr != rx_head + 22
-                       || (pkt_len & 0xC000) != 0xC000) {
-                       printk(KERN_ERR "%s: Rx frame at %#x corrupted, "
+               if (rfd_cmd != 0 || data_buffer_addr != rx_head + 22 ||
+                   (pkt_len & 0xC000) != 0xC000) {
+                       pr_err("%s: Rx frame at %#x corrupted, "
                               "status %04x cmd %04x next %04x "
                               "data-buf @%04x %04x.\n",
                               dev->name, rx_head, frame_status, rfd_cmd,
@@ -852,8 +853,7 @@ static void el16_rx(struct net_device *dev)
                        pkt_len &= 0x3fff;
                        skb = dev_alloc_skb(pkt_len+2);
                        if (skb == NULL) {
-                               printk(KERN_ERR "%s: Memory squeeze, "
-                                      "dropping packet.\n",
+                               pr_err("%s: Memory squeeze, dropping packet.\n",
                                       dev->name);
                                dev->stats.rx_dropped++;
                                break;
@@ -866,7 +866,6 @@ static void el16_rx(struct net_device *dev)
 
                        skb->protocol=eth_type_trans(skb,dev);
                        netif_rx(skb);
-                       dev->last_rx = jiffies;
                        dev->stats.rx_packets++;
                        dev->stats.rx_bytes += pkt_len;
                }
@@ -921,7 +920,7 @@ MODULE_PARM_DESC(irq, "(ignored)");
 int __init init_module(void)
 {
        if (io == 0)
-               printk("3c507: You should not use auto-probing with insmod!\n");
+               pr_notice("3c507: You should not use auto-probing with insmod!\n");
        dev_3c507 = el16_probe(-1);
        return IS_ERR(dev_3c507) ? PTR_ERR(dev_3c507) : 0;
 }
@@ -938,14 +937,3 @@ cleanup_module(void)
 }
 #endif /* MODULE */
 MODULE_LICENSE("GPL");
-
-
-/*
- * Local variables:
- *  compile-command: "gcc -D__KERNEL__ -I/usr/src/linux/net/inet -I/usr/src/linux/drivers/net -Wall -Wstrict-prototypes -O6 -m486 -c 3c507.c"
- *  version-control: t
- *  kept-new-versions: 5
- *  tab-width: 4
- *  c-indent-level: 4
- * End:
- */