fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / drivers / net / smc9194.c
index 8ee249a..bd6e845 100644 (file)
@@ -72,8 +72,8 @@ static const char version[] =
 #include <linux/netdevice.h>
 #include <linux/etherdevice.h>
 #include <linux/skbuff.h>
+#include <linux/bitops.h>
 
-#include <asm/bitops.h>
 #include <asm/io.h>
 
 #include "smc9194.h"
@@ -270,7 +270,7 @@ static void smc_set_multicast_list(struct net_device *dev);
 /*
  . Handles the actual interrupt
 */
-static irqreturn_t smc_interrupt(int irq, void *, struct pt_regs *regs);
+static irqreturn_t smc_interrupt(int irq, void *);
 /*
  . This is a separate procedure to handle the receipt of a packet, to
  . leave the interrupt code looking slightly cleaner
@@ -523,14 +523,13 @@ static int smc_wait_to_send_packet( struct sk_buff * skb, struct net_device * de
        length = skb->len;
 
        if (length < ETH_ZLEN) {
-               skb = skb_padto(skb, ETH_ZLEN);
-               if (skb == NULL) {
+               if (skb_padto(skb, ETH_ZLEN)) {
                        netif_wake_queue(dev);
                        return 0;
                }
                length = ETH_ZLEN;
        }
-               
+
        /*
        ** The MMU wants the number of pages to be the number of 256 bytes
        ** 'pages', minus 1 ( since a packet can't ever have 0 pages :) )
@@ -732,12 +731,9 @@ static int ifport;
 struct net_device * __init smc_init(int unit)
 {
        struct net_device *dev = alloc_etherdev(sizeof(struct smc_local));
-       static struct devlist *smcdev = smc_devlist;
+       struct devlist *smcdev = smc_devlist;
        int err = 0;
 
-#ifndef NO_AUTOPROBE
-       smcdev = smc_devlist;
-#endif
        if (!dev)
                return ERR_PTR(-ENODEV);
 
@@ -1163,7 +1159,7 @@ static int smc_open(struct net_device *dev)
                address  |= dev->dev_addr[ i ];
                outw( address, ioaddr + ADDR0 + i );
        }
-       
+
        netif_start_queue(dev);
        return 0;
 }
@@ -1191,133 +1187,6 @@ static void smc_timeout(struct net_device *dev)
        netif_wake_queue(dev);
 }
 
-/*--------------------------------------------------------------------
- .
- . This is the main routine of the driver, to handle the device when
- . it needs some attention.
- .
- . So:
- .   first, save state of the chipset
- .   branch off into routines to handle each case, and acknowledge
- .         each to the interrupt register
- .   and finally restore state.
- .
- ---------------------------------------------------------------------*/
-
-static irqreturn_t smc_interrupt(int irq, void * dev_id,  struct pt_regs * regs)
-{
-       struct net_device *dev  = dev_id;
-       int ioaddr              = dev->base_addr;
-       struct smc_local *lp = netdev_priv(dev);
-
-       byte    status;
-       word    card_stats;
-       byte    mask;
-       int     timeout;
-       /* state registers */
-       word    saved_bank;
-       word    saved_pointer;
-       int handled = 0;
-
-
-       PRINTK3((CARDNAME": SMC interrupt started \n"));
-
-       saved_bank = inw( ioaddr + BANK_SELECT );
-
-       SMC_SELECT_BANK(2);
-       saved_pointer = inw( ioaddr + POINTER );
-
-       mask = inb( ioaddr + INT_MASK );
-       /* clear all interrupts */
-       outb( 0, ioaddr + INT_MASK );
-
-
-       /* set a timeout value, so I don't stay here forever */
-       timeout = 4;
-
-       PRINTK2((KERN_WARNING CARDNAME ": MASK IS %x \n", mask ));
-       do {
-               /* read the status flag, and mask it */
-               status = inb( ioaddr + INTERRUPT ) & mask;
-               if (!status )
-                       break;
-
-               handled = 1;
-
-               PRINTK3((KERN_WARNING CARDNAME
-                       ": Handling interrupt status %x \n", status ));
-
-               if (status & IM_RCV_INT) {
-                       /* Got a packet(s). */
-                       PRINTK2((KERN_WARNING CARDNAME
-                               ": Receive Interrupt\n"));
-                       smc_rcv(dev);
-               } else if (status & IM_TX_INT ) {
-                       PRINTK2((KERN_WARNING CARDNAME
-                               ": TX ERROR handled\n"));
-                       smc_tx(dev);
-                       outb(IM_TX_INT, ioaddr + INTERRUPT );
-               } else if (status & IM_TX_EMPTY_INT ) {
-                       /* update stats */
-                       SMC_SELECT_BANK( 0 );
-                       card_stats = inw( ioaddr + COUNTER );
-                       /* single collisions */
-                       lp->stats.collisions += card_stats & 0xF;
-                       card_stats >>= 4;
-                       /* multiple collisions */
-                       lp->stats.collisions += card_stats & 0xF;
-
-                       /* these are for when linux supports these statistics */
-
-                       SMC_SELECT_BANK( 2 );
-                       PRINTK2((KERN_WARNING CARDNAME
-                               ": TX_BUFFER_EMPTY handled\n"));
-                       outb( IM_TX_EMPTY_INT, ioaddr + INTERRUPT );
-                       mask &= ~IM_TX_EMPTY_INT;
-                       lp->stats.tx_packets += lp->packets_waiting;
-                       lp->packets_waiting = 0;
-
-               } else if (status & IM_ALLOC_INT ) {
-                       PRINTK2((KERN_DEBUG CARDNAME
-                               ": Allocation interrupt \n"));
-                       /* clear this interrupt so it doesn't happen again */
-                       mask &= ~IM_ALLOC_INT;
-
-                       smc_hardware_send_packet( dev );
-
-                       /* enable xmit interrupts based on this */
-                       mask |= ( IM_TX_EMPTY_INT | IM_TX_INT );
-
-                       /* and let the card send more packets to me */
-                       netif_wake_queue(dev);
-                       
-                       PRINTK2((CARDNAME": Handoff done successfully.\n"));
-               } else if (status & IM_RX_OVRN_INT ) {
-                       lp->stats.rx_errors++;
-                       lp->stats.rx_fifo_errors++;
-                       outb( IM_RX_OVRN_INT, ioaddr + INTERRUPT );
-               } else if (status & IM_EPH_INT ) {
-                       PRINTK((CARDNAME ": UNSUPPORTED: EPH INTERRUPT \n"));
-               } else if (status & IM_ERCV_INT ) {
-                       PRINTK((CARDNAME ": UNSUPPORTED: ERCV INTERRUPT \n"));
-                       outb( IM_ERCV_INT, ioaddr + INTERRUPT );
-               }
-       } while ( timeout -- );
-
-
-       /* restore state register */
-       SMC_SELECT_BANK( 2 );
-       outb( mask, ioaddr + INT_MASK );
-
-       PRINTK3(( KERN_WARNING CARDNAME ": MASK is now %x \n", mask ));
-       outw( saved_pointer, ioaddr + POINTER );
-
-       SMC_SELECT_BANK( saved_bank );
-
-       PRINTK3((CARDNAME ": Interrupt done\n"));
-       return IRQ_RETVAL(handled);
-}
-
 /*-------------------------------------------------------------
  .
  . smc_rcv -  receive a packet from the card
@@ -1509,6 +1378,134 @@ static void smc_tx( struct net_device * dev )
        return;
 }
 
+/*--------------------------------------------------------------------
+ .
+ . This is the main routine of the driver, to handle the device when
+ . it needs some attention.
+ .
+ . So:
+ .   first, save state of the chipset
+ .   branch off into routines to handle each case, and acknowledge
+ .         each to the interrupt register
+ .   and finally restore state.
+ .
+ ---------------------------------------------------------------------*/
+
+static irqreturn_t smc_interrupt(int irq, void * dev_id)
+{
+       struct net_device *dev  = dev_id;
+       int ioaddr              = dev->base_addr;
+       struct smc_local *lp = netdev_priv(dev);
+
+       byte    status;
+       word    card_stats;
+       byte    mask;
+       int     timeout;
+       /* state registers */
+       word    saved_bank;
+       word    saved_pointer;
+       int handled = 0;
+
+
+       PRINTK3((CARDNAME": SMC interrupt started \n"));
+
+       saved_bank = inw( ioaddr + BANK_SELECT );
+
+       SMC_SELECT_BANK(2);
+       saved_pointer = inw( ioaddr + POINTER );
+
+       mask = inb( ioaddr + INT_MASK );
+       /* clear all interrupts */
+       outb( 0, ioaddr + INT_MASK );
+
+
+       /* set a timeout value, so I don't stay here forever */
+       timeout = 4;
+
+       PRINTK2((KERN_WARNING CARDNAME ": MASK IS %x \n", mask ));
+       do {
+               /* read the status flag, and mask it */
+               status = inb( ioaddr + INTERRUPT ) & mask;
+               if (!status )
+                       break;
+
+               handled = 1;
+
+               PRINTK3((KERN_WARNING CARDNAME
+                       ": Handling interrupt status %x \n", status ));
+
+               if (status & IM_RCV_INT) {
+                       /* Got a packet(s). */
+                       PRINTK2((KERN_WARNING CARDNAME
+                               ": Receive Interrupt\n"));
+                       smc_rcv(dev);
+               } else if (status & IM_TX_INT ) {
+                       PRINTK2((KERN_WARNING CARDNAME
+                               ": TX ERROR handled\n"));
+                       smc_tx(dev);
+                       outb(IM_TX_INT, ioaddr + INTERRUPT );
+               } else if (status & IM_TX_EMPTY_INT ) {
+                       /* update stats */
+                       SMC_SELECT_BANK( 0 );
+                       card_stats = inw( ioaddr + COUNTER );
+                       /* single collisions */
+                       lp->stats.collisions += card_stats & 0xF;
+                       card_stats >>= 4;
+                       /* multiple collisions */
+                       lp->stats.collisions += card_stats & 0xF;
+
+                       /* these are for when linux supports these statistics */
+
+                       SMC_SELECT_BANK( 2 );
+                       PRINTK2((KERN_WARNING CARDNAME
+                               ": TX_BUFFER_EMPTY handled\n"));
+                       outb( IM_TX_EMPTY_INT, ioaddr + INTERRUPT );
+                       mask &= ~IM_TX_EMPTY_INT;
+                       lp->stats.tx_packets += lp->packets_waiting;
+                       lp->packets_waiting = 0;
+
+               } else if (status & IM_ALLOC_INT ) {
+                       PRINTK2((KERN_DEBUG CARDNAME
+                               ": Allocation interrupt \n"));
+                       /* clear this interrupt so it doesn't happen again */
+                       mask &= ~IM_ALLOC_INT;
+
+                       smc_hardware_send_packet( dev );
+
+                       /* enable xmit interrupts based on this */
+                       mask |= ( IM_TX_EMPTY_INT | IM_TX_INT );
+
+                       /* and let the card send more packets to me */
+                       netif_wake_queue(dev);
+
+                       PRINTK2((CARDNAME": Handoff done successfully.\n"));
+               } else if (status & IM_RX_OVRN_INT ) {
+                       lp->stats.rx_errors++;
+                       lp->stats.rx_fifo_errors++;
+                       outb( IM_RX_OVRN_INT, ioaddr + INTERRUPT );
+               } else if (status & IM_EPH_INT ) {
+                       PRINTK((CARDNAME ": UNSUPPORTED: EPH INTERRUPT \n"));
+               } else if (status & IM_ERCV_INT ) {
+                       PRINTK((CARDNAME ": UNSUPPORTED: ERCV INTERRUPT \n"));
+                       outb( IM_ERCV_INT, ioaddr + INTERRUPT );
+               }
+       } while ( timeout -- );
+
+
+       /* restore state register */
+       SMC_SELECT_BANK( 2 );
+       outb( mask, ioaddr + INT_MASK );
+
+       PRINTK3(( KERN_WARNING CARDNAME ": MASK is now %x \n", mask ));
+       outw( saved_pointer, ioaddr + POINTER );
+
+       SMC_SELECT_BANK( saved_bank );
+
+       PRINTK3((CARDNAME ": Interrupt done\n"));
+       return IRQ_RETVAL(handled);
+}
+
+
 /*----------------------------------------------------
  . smc_close
  .
@@ -1599,14 +1596,14 @@ static void smc_set_multicast_list(struct net_device *dev)
 static struct net_device *devSMC9194;
 MODULE_LICENSE("GPL");
 
-MODULE_PARM(io, "i");
-MODULE_PARM(irq, "i");
-MODULE_PARM(ifport, "i");
+module_param(io, int, 0);
+module_param(irq, int, 0);
+module_param(ifport, int, 0);
 MODULE_PARM_DESC(io, "SMC 99194 I/O base address");
 MODULE_PARM_DESC(irq, "SMC 99194 IRQ number");
 MODULE_PARM_DESC(ifport, "SMC 99194 interface port (0-default, 1-TP, 2-AUI)");
 
-int init_module(void)
+int __init init_module(void)
 {
        if (io == 0)
                printk(KERN_WARNING
@@ -1619,7 +1616,7 @@ int init_module(void)
        return 0;
 }
 
-void cleanup_module(void)
+void __exit cleanup_module(void)
 {
        unregister_netdev(devSMC9194);
        free_irq(devSMC9194->irq, devSMC9194);