]> git.neil.brown.name Git - history.git/commitdiff
Import 2.3.44pre1 2.3.44pre1
authorLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:30:59 +0000 (15:30 -0500)
committerLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:30:59 +0000 (15:30 -0500)
46 files changed:
Makefile
arch/i386/kernel/i8259.c
arch/i386/kernel/setup.c
drivers/char/keyboard.c
drivers/char/mem.c
drivers/char/pc_keyb.c
drivers/net/3c523.c
drivers/net/3c527.c
drivers/net/cs89x0.c
drivers/net/de620.c
drivers/net/dmfe.c
drivers/net/eexpress.c
drivers/net/irda/irport.c
drivers/net/irda/irtty.c
drivers/net/irda/nsc-ircc.c
drivers/net/irda/toshoboe.c
drivers/net/irda/w83977af_ir.c
drivers/net/ne2.c
drivers/net/sb1000.c
drivers/net/sk_mca.c
drivers/net/smc-ultra.c
drivers/net/smc-ultra32.c
drivers/net/tlan.c
drivers/net/tokenring/ibmtr.c
drivers/net/tokenring/olympic.c
drivers/net/tokenring/smctr.c
drivers/net/tokenring/tms380tr.c
drivers/net/wan/dlci.c
drivers/net/wan/hostess_sv11.c
drivers/net/wan/sdla.c
drivers/net/wan/sealevel.c
drivers/net/wan/z85230.c
drivers/usb/acm.c
drivers/usb/hid-debug.h
drivers/usb/hid.c
drivers/usb/hid.h
drivers/usb/hub.c
drivers/usb/input.c
drivers/usb/keybdev.c
drivers/usb/printer.c
drivers/usb/usb-core.c
drivers/usb/usb-serial.c
include/asm-i386/io.h
include/linux/input.h
init/main.c
kernel/ksyms.c

index 02cd723517e778f4a753d57153adc143187bfb2d..4be320a0f0f8e014947a543c7b16ef0b3b82765b 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
 VERSION = 2
 PATCHLEVEL = 3
-SUBLEVEL = 43
+SUBLEVEL = 44
 EXTRAVERSION =
 
 ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/)
index c62e5c2d222ec24ba3f35b83371b8517c1f1b49f..1e1a5c718abd5101ed750f69ce934d60d46e8598 100644 (file)
@@ -311,7 +311,7 @@ spurious_8259A_irq:
        }
 }
 
-void init_8259A(int auto_eoi)
+void __init init_8259A(int auto_eoi)
 {
        unsigned long flags;
 
index e72f95160ffaebff30019dd3483d17388902c764..cd2a3d8afb63dece65851e69e588038980493381 100644 (file)
@@ -1515,7 +1515,7 @@ unsigned long cpu_initialized = 0;
  * and IDT. We reload them nevertheless, this function acts as a
  * 'CPU state barrier', nothing should get across.
  */
-void cpu_init (void)
+void __init cpu_init (void)
 {
        int nr = smp_processor_id();
        struct tss_struct * t = &init_tss[nr];
index 1688fe181dee2e4a121818a0cbef4a7894251aba..2315edf77bc6d20a5846ed0e543c8e598a4f5813 100644 (file)
@@ -909,6 +909,7 @@ static void kbd_bh(unsigned long dummy)
        }
 }
 
+EXPORT_SYMBOL(keyboard_tasklet);
 DECLARE_TASKLET_DISABLED(keyboard_tasklet, kbd_bh, 0);
 
 int __init kbd_init(void)
index eff2ab8c0e627e0c7c49c8b189982ac108e8b8da..f6dfb0bda41fcb7c4a2877abcc84fcbfed1557d8 100644 (file)
@@ -58,9 +58,6 @@ extern void mda_console_init(void);
 #if defined(CONFIG_ADB)
 extern void adbdev_init(void);
 #endif
-#ifdef CONFIG_USB
-extern void usb_init(void);
-#endif
 #ifdef CONFIG_PHONE
 extern void telephony_init(void);
 #endif
@@ -581,9 +578,6 @@ int __init chr_dev_init(void)
                printk("unable to get major %d for memory devs\n", MEM_MAJOR);
        rand_initialize();
        raw_init();
-#ifdef CONFIG_USB
-       usb_init();
-#endif
 #ifdef CONFIG_I2C
        i2c_init_all();
 #endif
index 725b41462b86f9c635e205973825925d08ffc0d1..9f3e06586dfb4bdcdd6c937fe34f7ad413de20ff 100644 (file)
@@ -413,9 +413,12 @@ static inline void handle_mouse_event(unsigned char scancode)
 #endif
 }
 
+static unsigned char kbd_exists = 1;
+
 static inline void handle_keyboard_event(unsigned char scancode)
 {
 #ifdef CONFIG_VT
+       kbd_exists = 1;
        if (do_acknowledge(scancode))
                handle_scancode(scancode, !(scancode & 0x80));
 #endif                         
@@ -512,8 +515,10 @@ static int send_data(unsigned char data)
 
 void pckbd_leds(unsigned char leds)
 {
-       if (!send_data(KBD_CMD_SET_LEDS) || !send_data(leds))
-           send_data(KBD_CMD_ENABLE);  /* re-enable kbd if any errors */
+       if (kbd_exists && (!send_data(KBD_CMD_SET_LEDS) || !send_data(leds))) {
+               send_data(KBD_CMD_ENABLE);      /* re-enable kbd if any errors */
+               kbd_exists = 0;
+       }
 }
 
 /*
index fe150fac53c1227122e41b7f9e548f4adf70e8a2..3313e85143ec101aff3b61bf33ca9183d5760093 100644 (file)
@@ -297,7 +297,7 @@ static int elmc_open(struct net_device *dev)
        alloc586(dev);
        init586(dev);
        startrecv586(dev);
-       netif_wake_queue(dev);
+       netif_start_queue(dev);
        MOD_INC_USE_COUNT;
        return 0;               /* most done by init */
 }
index 9cce2fa7694007ced0796f17f43b3b48f61ed5b9..1735d03b474fc6f401b06291895efe205c1eed17 100644 (file)
@@ -902,7 +902,7 @@ static int mc32_open(struct net_device *dev)
        mc32_rx_begin(dev);
        mc32_tx_begin(dev);
 
-       netif_wake_queue(dev);  
+       netif_start_queue(dev); 
        MOD_INC_USE_COUNT;
 
        return 0;
index ac6ff986c8f8d1c72edfba75c1cb28210bf51c07..f50b14b04fc7f036d2713531c442cf97707b2cf2 100644 (file)
@@ -120,6 +120,7 @@ static int net_open(struct net_device *dev);
 static int     net_send_packet(struct sk_buff *skb, struct net_device *dev);
 static void net_interrupt(int irq, void *dev_id, struct pt_regs *regs);
 static void set_multicast_list(struct net_device *dev);
+static void net_timeout(struct net_device *dev);
 static void net_rx(struct net_device *dev);
 static int net_close(struct net_device *dev);
 static struct net_device_stats *net_get_stats(struct net_device *dev);
@@ -139,14 +140,8 @@ static int set_mac_address(struct net_device *dev, void *addr);
    If dev->base_addr == 2, allocate space for the device and return success
    (detachable devices only).
    */
-#ifdef HAVE_DEVLIST
-/* Support for a alternate probe manager, which will eliminate the
-   boilerplate below. */
-struct netdev_entry netcard_drv =
-{"netcard", cs89x0_probe1, NETCARD_IO_EXTENT, netcard_portlist};
-#else
-int __init 
-cs89x0_probe(struct net_device *dev)
+
+int __init cs89x0_probe(struct net_device *dev)
 {
        int i;
        int base_addr = dev ? dev->base_addr : 0;
@@ -166,37 +161,31 @@ cs89x0_probe(struct net_device *dev)
        printk("cs89x0: no cs8900 or cs8920 detected.  Be sure to disable PnP with SETUP\n");
        return ENODEV;
 }
-#endif
 
-static int inline
-readreg(struct net_device *dev, int portno)
+extern int inline readreg(struct net_device *dev, int portno)
 {
        outw(portno, dev->base_addr + ADD_PORT);
        return inw(dev->base_addr + DATA_PORT);
 }
 
-static void inline
-writereg(struct net_device *dev, int portno, int value)
+extern  void inline writereg(struct net_device *dev, int portno, int value)
 {
        outw(portno, dev->base_addr + ADD_PORT);
        outw(value, dev->base_addr + DATA_PORT);
 }
 
 
-static int inline
-readword(struct net_device *dev, int portno)
+extern int inline readword(struct net_device *dev, int portno)
 {
        return inw(dev->base_addr + portno);
 }
 
-static void inline
-writeword(struct net_device *dev, int portno, int value)
+extern void inline writeword(struct net_device *dev, int portno, int value)
 {
        outw(value, dev->base_addr + portno);
 }
 
-static int __init 
-wait_eeprom_ready(struct net_device *dev)
+static int __init wait_eeprom_ready(struct net_device *dev)
 {
        int timeout = jiffies;
        /* check to see if the EEPROM is ready, a timeout is used -
@@ -208,8 +197,7 @@ wait_eeprom_ready(struct net_device *dev)
        return 0;
 }
 
-static int __init 
-get_eeprom_data(struct net_device *dev, int off, int len, int *buffer)
+static int __init get_eeprom_data(struct net_device *dev, int off, int len, int *buffer)
 {
        int i;
 
@@ -226,8 +214,7 @@ get_eeprom_data(struct net_device *dev, int off, int len, int *buffer)
         return 0;
 }
 
-static int  __init 
-get_eeprom_cksum(int off, int len, int *buffer)
+static int  __init  get_eeprom_cksum(int off, int len, int *buffer)
 {
        int i, cksum;
 
@@ -378,10 +365,12 @@ static int __init cs89x0_probe1(struct net_device *dev, int ioaddr)
 
        dev->open               = net_open;
        dev->stop               = net_close;
-       dev->hard_start_xmit = net_send_packet;
-       dev->get_stats  = net_get_stats;
-       dev->set_multicast_list = &set_multicast_list;
-       dev->set_mac_address = &set_mac_address;
+       dev->tx_timeout         = net_timeout;
+       dev->watchdog_timeo     = HZ;
+       dev->hard_start_xmit    = net_send_packet;
+       dev->get_stats          = net_get_stats;
+       dev->set_multicast_list = set_multicast_list;
+       dev->set_mac_address    = set_mac_address;
 
        /* Fill in the fields of the device structure with ethernet values. */
        ether_setup(dev);
@@ -720,85 +709,69 @@ net_open(struct net_device *dev)
        /* now that we've got our act together, enable everything */
        writereg(dev, PP_BusCTL, ENABLE_IRQ
                  );
-       dev->tbusy = 0;
-       dev->interrupt = 0;
-       dev->start = 1;
         MOD_INC_USE_COUNT;
+        netif_start_queue(dev);
        return 0;
 }
 
-static int
-net_send_packet(struct sk_buff *skb, struct net_device *dev)
+static void net_timeout(struct net_device *dev)
 {
-       if (dev->tbusy) {
-               /* If we get here, some higher level has decided we are broken.
-                  There should really be a "kick me" function call instead. */
-               int tickssofar = jiffies - dev->trans_start;
-               if (tickssofar < 5)
-                       return 1;
-               if (net_debug > 0) printk("%s: transmit timed out, %s?\n", dev->name,
-                          tx_done(dev) ? "IRQ conflict ?" : "network cable problem");
-               /* Try to restart the adaptor. */
-               dev->tbusy=0;
-               dev->trans_start = jiffies;
-       }
+       /* If we get here, some higher level has decided we are broken.
+          There should really be a "kick me" function call instead. */
+       if (net_debug > 0) printk("%s: transmit timed out, %s?\n", dev->name,
+                  tx_done(dev) ? "IRQ conflict ?" : "network cable problem");
+       /* Try to restart the adaptor. */
+       netif_wake_queue(dev);
+}
 
-       /* Block a timer-based transmit from overlapping.  This could better be
-          done with atomic_swap(1, dev->tbusy), but set_bit() works as well. */
-       if (test_and_set_bit(0, (void*)&dev->tbusy) != 0)
-               printk("%s: Transmitter access conflict.\n", dev->name);
-       else {
-               struct net_local *lp = (struct net_local *)dev->priv;
-               short ioaddr = dev->base_addr;
-               unsigned long flags;
-
-               if (net_debug > 3)printk("%s: sent %d byte packet of type %x\n", dev->name, skb->len, (skb->data[ETH_ALEN+ETH_ALEN] << 8) | skb->data[ETH_ALEN+ETH_ALEN+1]);
-
-               /* keep the upload from being interrupted, since we
-                   ask the chip to start transmitting before the
-                   whole packet has been completely uploaded. */
-               save_flags(flags);
-               cli();
-
-               /* initiate a transmit sequence */
-               outw(lp->send_cmd, ioaddr + TX_CMD_PORT);
-               outw(skb->len, ioaddr + TX_LEN_PORT);
-
-               /* Test to see if the chip has allocated memory for the packet */
-               if ((readreg(dev, PP_BusST) & READY_FOR_TX_NOW) == 0) {
-                       /* Gasp!  It hasn't.  But that shouldn't happen since
-                          we're waiting for TxOk, so return 1 and requeue this packet. */
-                       restore_flags(flags);
-                       return 1;
-               }
+static int net_send_packet(struct sk_buff *skb, struct net_device *dev)
+{
+       struct net_local *lp = (struct net_local *)dev->priv;
+       short ioaddr = dev->base_addr;
+       unsigned long flags;
+
+       if (net_debug > 3)
+               printk("%s: sent %d byte packet of type %x\n", dev->name, skb->len, (skb->data[ETH_ALEN+ETH_ALEN] << 8) | skb->data[ETH_ALEN+ETH_ALEN+1]);
+
+       /* keep the upload from being interrupted, since we
+                  ask the chip to start transmitting before the
+                  whole packet has been completely uploaded. */
 
-               /* Write the contents of the packet */
-                outsw(ioaddr + TX_FRAME_PORT,skb->data,(skb->len+1) >>1);
+       save_flags(flags);
+       cli();
+       netif_stop_queue(dev);
+       
+       /* initiate a transmit sequence */
+       outw(lp->send_cmd, ioaddr + TX_CMD_PORT);
+       outw(skb->len, ioaddr + TX_LEN_PORT);
 
+       /* Test to see if the chip has allocated memory for the packet */
+       if ((readreg(dev, PP_BusST) & READY_FOR_TX_NOW) == 0) {
+               /* Gasp!  It hasn't.  But that shouldn't happen since
+                  we're waiting for TxOk, so return 1 and requeue this packet. */
                restore_flags(flags);
-               dev->trans_start = jiffies;
+               return 1;
        }
-       dev_kfree_skb (skb);
+       /* Write the contents of the packet */
+        outsw(ioaddr + TX_FRAME_PORT,skb->data,(skb->len+1) >>1);
 
+       restore_flags(flags);
+       dev->trans_start = jiffies;
+       dev_kfree_skb (skb);
+       netif_wake_queue(dev);
+       
        return 0;
 }
 \f
 /* The typical workload of the driver:
    Handle the network interface interrupts. */
+   
 static void net_interrupt(int irq, void *dev_id, struct pt_regs * regs)
 {
        struct net_device *dev = dev_id;
        struct net_local *lp;
        int ioaddr, status;
 
-       if (dev == NULL) {
-               printk ("net_interrupt(): irq %d for unknown device.\n", irq);
-               return;
-       }
-       if (dev->interrupt)
-               printk("%s: Re-entering the interrupt handler.\n", dev->name);
-       dev->interrupt = 1;
-
        ioaddr = dev->base_addr;
        lp = (struct net_local *)dev->priv;
 
@@ -818,8 +791,7 @@ static void net_interrupt(int irq, void *dev_id, struct pt_regs * regs)
                        break;
                case ISQ_TRANSMITTER_EVENT:
                        lp->stats.tx_packets++;
-                       dev->tbusy = 0;
-                       mark_bh(NET_BH);        /* Inform upper layers. */
+                       netif_wake_queue(dev);  /* Inform upper layers. */
                        if ((status & TX_OK) == 0) lp->stats.tx_errors++;
                        if (status & TX_LOST_CRS) lp->stats.tx_carrier_errors++;
                        if (status & TX_SQE_ERROR) lp->stats.tx_heartbeat_errors++;
@@ -833,8 +805,7 @@ static void net_interrupt(int irq, void *dev_id, struct pt_regs * regs)
                                    That shouldn't happen since we only ever
                                    load one packet.  Shrug.  Do the right
                                    thing anyway. */
-                               dev->tbusy = 0;
-                               mark_bh(NET_BH);        /* Inform upper layers. */
+                               netif_wake_queue(dev);  /* Inform upper layers. */
                        }
                        if (status & TX_UNDERRUN) {
                                if (net_debug > 0) printk("%s: transmit underrun\n", dev->name);
@@ -846,8 +817,7 @@ static void net_interrupt(int irq, void *dev_id, struct pt_regs * regs)
                                   avoids having to wait for the upper
                                   layers to timeout on us, in the
                                   event of a tx underrun */
-                               dev->tbusy = 0;
-                               mark_bh(NET_BH);        /* Inform upper layers. */
+                               netif_wake_queue(dev);  /* Inform upper layers. */
                         }
                        break;
                case ISQ_RX_MISS_EVENT:
@@ -858,8 +828,6 @@ static void net_interrupt(int irq, void *dev_id, struct pt_regs * regs)
                        break;
                }
        }
-       dev->interrupt = 0;
-       return;
 }
 
 /* We have a good packet(s), get it/them out of the buffers. */
@@ -913,14 +881,13 @@ net_rx(struct net_device *dev)
 static int
 net_close(struct net_device *dev)
 {
-
+       netif_stop_queue(dev);
+       
        writereg(dev, PP_RxCFG, 0);
        writereg(dev, PP_TxCFG, 0);
        writereg(dev, PP_BufCFG, 0);
        writereg(dev, PP_BusCTL, 0);
 
-       dev->start = 0;
-
        free_irq(dev->irq, dev);
 
        /* Update the statistics here. */
@@ -974,7 +941,7 @@ static void set_multicast_list(struct net_device *dev)
 static int set_mac_address(struct net_device *dev, void *addr)
 {
        int i;
-       if (dev->start)
+       if (test_bit(LINK_STATE_START, &dev->state))
                return -EBUSY;
        printk("%s: Setting MAC address to ", dev->name);
        for (i = 0; i < 6; i++)
index 3f138239fde74e8f323a629216e8a640d63ea8f0..440ac99515c6ed08c9bbe634b287025428c999b8 100644 (file)
@@ -435,19 +435,18 @@ de620_get_register(struct net_device *dev, byte reg)
  * there is a non-reboot way to recover if something goes wrong.
  *
  */
-static int
-de620_open(struct net_device *dev)
+static int de620_open(struct net_device *dev)
 {
        if (request_irq(dev->irq, de620_interrupt, 0, "de620", dev)) {
-               printk ("%s: unable to get IRQ %d\n", dev->name, dev->irq);
+               printk (KERN_ERR "%s: unable to get IRQ %d\n", dev->name, dev->irq);
                return 1;
        }
 
-       MOD_INC_USE_COUNT;
-       if (adapter_init(dev)) {
+       if (adapter_init(dev))
                return 1;
-       }
-       dev->start = 1;
+
+       MOD_INC_USE_COUNT;
+       netif_start_queue(dev);
        return 0;
 }
 
@@ -456,15 +455,13 @@ de620_open(struct net_device *dev)
  * The inverse routine to de620_open().
  *
  */
-static int
-de620_close(struct net_device *dev)
+
+static int de620_close(struct net_device *dev)
 {
+       netif_stop_queue(dev);
        /* disable recv */
        de620_set_register(dev, W_TCR, RXOFF);
-
        free_irq(dev->irq, dev);
-
-       dev->start = 0;
        MOD_DEC_USE_COUNT;
        return 0;
 }
@@ -505,39 +502,38 @@ static void de620_set_multicast_list(struct net_device *dev)
        }
 }
 
+/*******************************************************
+ *     
+ * Handle timeouts on transmit
+ */
+static void de620_timeout(struct net_device *dev)
+{
+       printk("%s: transmit timed out, %s?\n",
+               dev->name,
+               "network cable problem"
+               );
+       /* Restart the adapter. */
+       if (!adapter_init(dev)) /* maybe close it */
+               netif_wake_queue(dev);
+}
+
 /*******************************************************
  *
  * Copy a buffer to the adapter transmit page memory.
  * Start sending.
  */
-static int
-de620_start_xmit(struct sk_buff *skb, struct net_device *dev)
+static int de620_start_xmit(struct sk_buff *skb, struct net_device *dev)
 {
        unsigned long flags;
        int len;
-       int tickssofar;
        byte *buffer = skb->data;
        byte using_txbuf;
 
        using_txbuf = de620_tx_buffs(dev); /* Peek at the adapter */
-       dev->tbusy = (using_txbuf == (TXBF0 | TXBF1)); /* Boolean! */
-
-       if (dev->tbusy) {       /* Do timeouts, to avoid hangs. */
-               tickssofar = jiffies - dev->trans_start;
-
-               if (tickssofar < 5)
-                       return 1;
-
-               /* else */
-               printk("%s: transmit timed out (%d), %s?\n",
-                       dev->name,
-                       tickssofar,
-                       "network cable problem"
-                       );
-               /* Restart the adapter. */
-               if (adapter_init(dev)) /* maybe close it */
-                       return 1;
-       }
+       
+       netif_stop_queue(dev);
+       
 
        if ((len = skb->len) < RUNT)
                len = RUNT;
@@ -565,7 +561,7 @@ de620_start_xmit(struct sk_buff *skb, struct net_device *dev)
                break;
 
        case (TXBF0 | TXBF1): /* NONE!!! */
-               printk("de620: Ouch! No tx-buffer available!\n");
+               printk(KERN_WARNING "%s: No tx-buffer available!\n", dev->name);
                restore_flags(flags);
                return 1;
                break;
@@ -573,14 +569,12 @@ de620_start_xmit(struct sk_buff *skb, struct net_device *dev)
        de620_write_block(dev, buffer, len);
 
        dev->trans_start = jiffies;
-       dev->tbusy = (using_txbuf == (TXBF0 | TXBF1)); /* Boolean! */
+       if(!(using_txbuf == (TXBF0 | TXBF1)))
+               netif_wake_queue(dev);
 
        ((struct net_device_stats *)(dev->priv))->tx_packets++;
-
        restore_flags(flags); /* interrupts maybe back on */
-
        dev_kfree_skb (skb);
-
        return 0;
 }
 \f
@@ -589,8 +583,7 @@ de620_start_xmit(struct sk_buff *skb, struct net_device *dev)
  * Handle the network interface interrupts.
  *
  */
-static void
-de620_interrupt(int irq_in, void *dev_id, struct pt_regs *regs)
+static void de620_interrupt(int irq_in, void *dev_id, struct pt_regs *regs)
 {
        struct net_device *dev = dev_id;
        byte irq_status;
@@ -603,9 +596,6 @@ de620_interrupt(int irq_in, void *dev_id, struct pt_regs *regs)
                return;
        }
 
-       cli();
-       dev->interrupt = 1;
-
        /* Read the status register (_not_ the status port) */
        irq_status = de620_get_register(dev, R_STS);
 
@@ -619,11 +609,8 @@ de620_interrupt(int irq_in, void *dev_id, struct pt_regs *regs)
                while (again && (++bogus_count < 100));
        }
 
-       dev->tbusy = (de620_tx_buffs(dev) == (TXBF0 | TXBF1)); /* Boolean! */
-
-       dev->interrupt = 0;
-       sti();
-       return;
+       if(de620_tx_buffs(dev) != (TXBF0 | TXBF1))
+               netif_wake_queue(dev);
 }
 
 /**************************************
@@ -633,8 +620,7 @@ de620_interrupt(int irq_in, void *dev_id, struct pt_regs *regs)
  * Send it "upstairs"
  *
  */
-static int
-de620_rx_intr(struct net_device *dev)
+static int de620_rx_intr(struct net_device *dev)
 {
        struct header_buf {
                byte            status;
@@ -663,9 +649,10 @@ de620_rx_intr(struct net_device *dev)
        pagelink = header_buf.Rx_NextPage;
        if ((pagelink < first_rx_page) || (last_rx_page < pagelink)) {
                /* Ouch... Forget it! Skip all and start afresh... */
-               printk("%s: Ring overrun? Restoring...\n", dev->name);
+               printk(KERN_WARNING "%s: Ring overrun? Restoring...\n", dev->name);
                /* You win some, you lose some. And sometimes plenty... */
                adapter_init(dev);
+               netif_wake_queue(dev);
                ((struct net_device_stats *)(dev->priv))->rx_over_errors++;
                return 0;
        }
@@ -682,7 +669,7 @@ de620_rx_intr(struct net_device *dev)
        /* Is the _computed_ next page number equal to what the adapter says? */
        if (pagelink != header_buf.Rx_NextPage) {
                /* Naah, we'll skip this packet. Probably bogus data as well */
-               printk("%s: Page link out of sync! Restoring...\n", dev->name);
+               printk(KERN_WARNING "%s: Page link out of sync! Restoring...\n", dev->name);
                next_rx_page = header_buf.Rx_NextPage; /* at least a try... */
                de620_send_command(dev, W_DUMMY);
                de620_set_register(dev, W_NPRF, next_rx_page);
@@ -693,12 +680,12 @@ de620_rx_intr(struct net_device *dev)
 
        size = header_buf.Rx_ByteCount - 4;
        if ((size < RUNT) || (GIANT < size)) {
-               printk("%s: Illegal packet size: %d!\n", dev->name, size);
+               printk(KERN_WARNING "%s: Illegal packet size: %d!\n", dev->name, size);
        }
        else { /* Good packet? */
                skb = dev_alloc_skb(size+2);
                if (skb == NULL) { /* Yeah, but no place to put it... */
-                       printk("%s: Couldn't allocate a sk_buff of size %d.\n",
+                       printk(KERN_WARNING "%s: Couldn't allocate a sk_buff of size %d.\n",
                                dev->name, size);
                        ((struct net_device_stats *)(dev->priv))->rx_dropped++;
                }
@@ -732,8 +719,7 @@ de620_rx_intr(struct net_device *dev)
  * Reset the adapter to a known state
  *
  */
-static int
-adapter_init(struct net_device *dev)
+static int adapter_init(struct net_device *dev)
 {
        int i;
        static int was_down = 0;
@@ -787,11 +773,11 @@ adapter_init(struct net_device *dev)
         /* ignore:   EEDI                RXGOOD                   COLS  LNKS*/
 
        if (((i = de620_get_register(dev, R_STS)) & CHECK_MASK) != CHECK_OK) {
-               printk("Something has happened to the DE-620!  Please check it"
+               printk(KERN_ERR "%s: Something has happened to the DE-620!  Please check it"
 #ifdef SHUTDOWN_WHEN_LOST
                        " and do a new ifconfig"
 #endif
-                       "! (%02x)\n", i);
+                       "! (%02x)\n", dev->name, i);
 #ifdef SHUTDOWN_WHEN_LOST
                /* Goodbye, cruel world... */
                dev->flags &= ~IFF_UP;
@@ -801,7 +787,7 @@ adapter_init(struct net_device *dev)
                return 1; /* failed */
        }
        if (was_down) {
-               printk("Thanks, I feel much better now!\n");
+               printk(KERN_WARNING "%s: Thanks, I feel much better now!\n", dev->name);
                was_down = 0;
        }
 
@@ -820,8 +806,7 @@ adapter_init(struct net_device *dev)
  *
  * Check if there is a DE-620 connected
  */
-int __init 
-de620_probe(struct net_device *dev)
+int __init de620_probe(struct net_device *dev)
 {
        static struct net_device_stats de620_netstats;
        int i;
@@ -837,7 +822,7 @@ de620_probe(struct net_device *dev)
        if (de620_debug)
                printk(version);
 
-       printk("D-Link DE-620 pocket adapter");
+       printk(KERN_INFO "D-Link DE-620 pocket adapter");
 
        /* Initially, configure basic nibble mode, so we can read the EEPROM */
        NIC_Cmd = DEF_NIC_CMD;
@@ -880,11 +865,14 @@ de620_probe(struct net_device *dev)
        dev->priv = &de620_netstats;
 
        memset(dev->priv, 0, sizeof(struct net_device_stats));
-       dev->get_stats = get_stats;
-       dev->open = de620_open;
-       dev->stop = de620_close;
-       dev->hard_start_xmit = &de620_start_xmit;
-       dev->set_multicast_list = &de620_set_multicast_list;
+       dev->get_stats          = get_stats;
+       dev->open               = de620_open;
+       dev->stop               = de620_close;
+       dev->hard_start_xmit    = de620_start_xmit;
+       dev->tx_timeout         = de620_timeout;
+       dev->watchdog_timeo     = HZ*2;
+       dev->set_multicast_list = de620_set_multicast_list;
+       
        /* base_addr and irq are already set, see above! */
 
        ether_setup(dev);
@@ -913,8 +901,7 @@ de620_probe(struct net_device *dev)
  */
 #define sendit(dev,data) de620_set_register(dev, W_EIP, data | EIPRegister);
 
-static unsigned short __init 
-ReadAWord(struct net_device *dev, int from)
+static unsigned short __init ReadAWord(struct net_device *dev, int from)
 {
        unsigned short data;
        int nbits;
@@ -956,8 +943,7 @@ ReadAWord(struct net_device *dev, int from)
        return data;
 }
 
-static int __init 
-read_eeprom(struct net_device *dev)
+static int __init read_eeprom(struct net_device *dev)
 {
        unsigned short wrd;
 
@@ -1003,16 +989,14 @@ static char nullname[8] = "";
 static struct net_device de620_dev = {
        nullname, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, de620_probe };
 
-int
-init_module(void)
+int init_module(void)
 {
        if (register_netdev(&de620_dev) != 0)
                return -EIO;
        return 0;
 }
 
-void
-cleanup_module(void)
+void cleanup_module(void)
 {
        unregister_netdev(&de620_dev);
        release_region(de620_dev.base_addr, 3);
index e341ed22638dcb21e2ead7a9313238c2e96d1e04..01a32afd56e4d6da80fea1e3f3b13c7e0fbbcbf0 100644 (file)
@@ -460,8 +460,6 @@ static int dmfe_open(struct net_device *dev)
        dmfe_init_dm910x(dev);
 
        /* Active System Interface */
-       dev->tbusy = 0;         /* Can transmit packet */
-       dev->start = 1;         /* interface ready */
        MOD_INC_USE_COUNT;
 
        /* set and active a timer process */
@@ -470,6 +468,8 @@ static int dmfe_open(struct net_device *dev)
        db->timer.data = (unsigned long) dev;
        db->timer.function = &dmfe_timer;
        add_timer(&db->timer);
+       
+       netif_wake_queue(dev);
 
        return 0;
 }
@@ -543,24 +543,18 @@ static int dmfe_start_xmit(struct sk_buff *skb, struct net_device *dev)
        struct tx_desc *txptr;
 
        DMFE_DBUG(0, "dmfe_start_xmit", 0);
-
-       if ((dev->tbusy == 1) && (db->tx_packet_cnt != 0))
-               return 1;
-       else
-               dev->tbusy = 0;
-
+       netif_stop_queue(dev);
+       
        /* Too large packet check */
        if (skb->len > MAX_PACKET_SIZE) {
-               printk(KERN_ERR "%s: oversized frame (%d bytes) received.\n", dev->name, (u16) skb->len);
+               printk(KERN_ERR "%s: oversized frame (%d bytes) for transmit.\n", dev->name, (u16) skb->len);
                dev_kfree_skb(skb);
                return 0;
        }
        /* No Tx resource check, it never happen nromally */
        if (db->tx_packet_cnt >= TX_FREE_DESC_CNT) {
-               printk(KERN_WARNING "%s: No Tx resource, enter xmit() again \n", dev->name);
-               dev_kfree_skb(skb);
-               dev->tbusy = 1;
-               return -EBUSY;
+               return 1;
        }
 
        /* transmit this packet */
@@ -580,8 +574,8 @@ static int dmfe_start_xmit(struct sk_buff *skb, struct net_device *dev)
        outl(0x1, dev->base_addr + DCR1);
 
        /* Tx resource check */
-       if (db->tx_packet_cnt >= TX_FREE_DESC_CNT)
-               dev->tbusy = 1;
+       if (db->tx_packet_cnt < TX_FREE_DESC_CNT)
+               netif_wake_queue(dev);
 
        /* Set transmit time stamp */
        dev->trans_start = jiffies;     /* saved the time stamp */
@@ -603,9 +597,7 @@ static int dmfe_stop(struct net_device *dev)
 
        DMFE_DBUG(0, "dmfe_stop", 0);
 
-       /* disable system */
-       dev->start = 0;         /* interface disable */
-       dev->tbusy = 1;         /* can't transmit */
+       netif_stop_queue(dev);
 
        /* Reset & stop DM910X board */
        outl(DM910X_RESET, ioaddr + DCR0);
@@ -645,13 +637,8 @@ static void dmfe_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                DMFE_DBUG(1, "dmfe_interrupt() without device arg", 0);
                return;
        }
-       if (dev->interrupt) {
-               DMFE_DBUG(1, "dmfe_interrupt() re-entry ", 0);
-               return;
-       }
 
        /* A real interrupt coming */
-       dev->interrupt = 1;     /* Lock interrupt */
        db = (struct dmfe_board_info *) dev->priv;
        ioaddr = dev->base_addr;
 
@@ -669,10 +656,9 @@ static void dmfe_interrupt(int irq, void *dev_id, struct pt_regs *regs)
        if (db->cr5_data & 0x2000) {
                /* A system bus error occurred */
                DMFE_DBUG(1, "A system bus error occurred. CR5=", db->cr5_data);
-               dev->tbusy = 1;
+               netif_stop_queue(dev);
                db->wait_reset = 1;             /* Need to RESET */
                outl(0, ioaddr + DCR7);         /* disable all interrupt */
-               dev->interrupt = 0;             /* unlock interrupt */
                return;
        }
        /* Free the transmitted descriptor */
@@ -690,10 +676,9 @@ static void dmfe_interrupt(int irq, void *dev_id, struct pt_regs *regs)
        }
        db->tx_remove_ptr = (struct tx_desc *) txptr;
 
-       if (dev->tbusy && (db->tx_packet_cnt < TX_FREE_DESC_CNT)) {
-               dev->tbusy = 0;         /* free a resource */
-               mark_bh(NET_BH);        /* active bottom half */
-       }
+       if (db->tx_packet_cnt < TX_FREE_DESC_CNT)
+               netif_wake_queue(dev);
+
        /* Received the coming packet */
        if (db->rx_avail_cnt)
                dmfe_rx_packet(dev, db);
@@ -708,7 +693,6 @@ static void dmfe_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                db->cr6_data |= 0x100;
                update_cr6(db->cr6_data, db->ioaddr);
        }
-       dev->interrupt = 0;     /* release interrupt lock */
 
        /* Restore CR7 to enable interrupt mask */
        
@@ -935,9 +919,8 @@ static void dmfe_dynamic_reset(struct net_device *dev)
        db->in_reset_state = 1;
 
        /* Disable upper layer interface */
-       dev->tbusy = 1;         /* transmit packet disable */
-       dev->start = 0;         /* interface not ready */
-
+       netif_stop_queue(dev);
+       
        db->cr6_data &= ~(CR6_RXSC | CR6_TXSC);         /* Disable Tx/Rx */
        update_cr6(db->cr6_data, dev->base_addr);
 
@@ -954,12 +937,11 @@ static void dmfe_dynamic_reset(struct net_device *dev)
        /* Re-initilize DM910X board */
        dmfe_init_dm910x(dev);
 
-       /* Restart upper layer interface */
-       dev->tbusy = 0;         /* Can transmit packet */
-       dev->start = 1;         /* interface ready */
-
        /* Leave dynamic reser route */
        db->in_reset_state = 0;
+
+       /* Restart upper layer interface */
+       netif_wake_queue(dev);
 }
 
 /*
@@ -1113,7 +1095,7 @@ static void send_filter_frame(struct net_device *dev, int mc_cnt)
 
        /* prepare the setup frame */
        db->tx_packet_cnt++;
-       dev->tbusy = 1;
+       netif_stop_queue(dev);
        txptr->tdes1 = 0x890000c0;
        txptr->tdes0 = 0x80000000;
        db->tx_insert_ptr = (struct tx_desc *) txptr->next_tx_desc;
index 0b04615efc4688aab7f7de17071309562e644073..41756f9f0cdb5efcf91639bbe4a12a1d58b709f1 100644 (file)
@@ -251,6 +251,7 @@ static char mca_irqmap[] = { 12, 9, 3, 4, 5, 10, 11, 15 };
 extern int express_probe(struct net_device *dev);
 static int eexp_open(struct net_device *dev);
 static int eexp_close(struct net_device *dev);
+static void eexp_timeout(struct net_device *dev);
 static struct net_device_stats *eexp_stats(struct net_device *dev);
 static int eexp_xmit(struct sk_buff *buf, struct net_device *dev);
 
@@ -437,8 +438,6 @@ static int eexp_open(struct net_device *dev)
        request_region(ioaddr+0x4000, 16, "EtherExpress shadow");
        request_region(ioaddr+0x8000, 16, "EtherExpress shadow");
        request_region(ioaddr+0xc000, 16, "EtherExpress shadow");
-       dev->tbusy = 0;
-       dev->interrupt = 0;
        
        if (lp->width) {
                printk("%s: forcing ASIC to 8-bit mode\n", dev->name);
@@ -446,8 +445,8 @@ static int eexp_open(struct net_device *dev)
        }
 
        eexp_hw_init586(dev);
-       dev->start = 1;
        MOD_INC_USE_COUNT;
+       netif_start_queue(dev);
 #if NET_DEBUG > 6
        printk(KERN_DEBUG "%s: leaving eexp_open()\n", dev->name);
 #endif
@@ -465,9 +464,8 @@ static int eexp_close(struct net_device *dev)
 
        int irq = dev->irq;
 
-       dev->tbusy = 1;
-       dev->start = 0;
-
+       netif_stop_queue(dev);
+       
        outb(SIRQ_dis|irqrmap[irq],ioaddr+SET_IRQ);
        lp->started = 0;
        scb_command(dev, SCB_CUsuspend|SCB_RUsuspend);
@@ -530,8 +528,7 @@ static void unstick_cu(struct net_device *dev)
                                                outb(0,ioaddr+SIGNAL_CA);
                                        }
                                }
-                               dev->tbusy = 0;
-                               mark_bh(NET_BH);
+                               netif_wake_queue(dev);
                        }
                        else
                        {
@@ -546,13 +543,12 @@ static void unstick_cu(struct net_device *dev)
                                else
                                {
                                        unsigned short txstatus = eexp_hw_lasttxstat(dev);
-                                       if (dev->tbusy && !txstatus)
+                                       if (test_bit(LINK_STATE_XOFF, &dev->state) && !txstatus)
                                        {
                                                printk(KERN_WARNING "%s: CU wedged, status %04x %04x, resetting...\n",
                                                       dev->name,status,txstatus);
                                                eexp_hw_init586(dev);
-                                               dev->tbusy = 0;
-                                               mark_bh(NET_BH);
+                                               netif_wake_queue(dev);
                                        }
                                        else
                                        {
@@ -570,12 +566,47 @@ static void unstick_cu(struct net_device *dev)
                        printk(KERN_WARNING "%s: i82586 startup timed out, status %04x, resetting...\n",
                               dev->name, status);
                        eexp_hw_init586(dev);
-                       dev->tbusy = 0;
-                       mark_bh(NET_BH);
+                       netif_wake_queue(dev);
                }
        }
 }
 
+static void eexp_timeout(struct net_device *dev)
+{
+       struct net_local *lp = (struct net_local *)dev->priv;
+#ifdef CONFIG_SMP
+       unsigned long flags;
+#endif
+       int status;
+       
+       disable_irq(dev->irq);
+
+       /*
+        *      Best would be to use synchronize_irq(); spin_lock() here
+        *      lets make it work first..
+        */
+        
+#ifdef CONFIG_SMP
+       spin_lock_irqsave(&lp->lock, flags);
+#endif
+
+       status = scb_status(dev);
+       unstick_cu(dev);
+       printk(KERN_INFO "%s: transmit timed out, %s?", dev->name,
+              (SCB_complete(status)?"lost interrupt":
+               "board on fire"));
+       lp->stats.tx_errors++;
+       lp->last_tx = jiffies;
+       if (!SCB_complete(status)) {
+               scb_command(dev, SCB_CUabort);
+               outb(0,dev->base_addr+SIGNAL_CA);
+       }
+       netif_wake_queue(dev);  
+#ifdef CONFIG_SMP
+       spin_unlock_irqrestore(&lp->lock, flags);
+#endif
+}
+
 /*
  * Called to transmit a packet, or to allow us to right ourselves
  * if the kernel thinks we've died.
@@ -601,38 +632,7 @@ static int eexp_xmit(struct sk_buff *buf, struct net_device *dev)
 #ifdef CONFIG_SMP
        spin_lock_irqsave(&lp->lock, flags);
 #endif
-
-       /* If dev->tbusy is set, all our tx buffers are full but the kernel
-        * is calling us anyway.  Check that nothing bad is happening.
-        */
-       if (dev->tbusy) {
-               int status = scb_status(dev);
-               unstick_cu(dev);
-               if ((jiffies - lp->last_tx) < HZ)
-               {
-#ifdef CONFIG_SMP
-                       spin_unlock_irqrestore(&lp->lock, flags);
-#endif
-
-                       return 1;
-               }
-               printk(KERN_INFO "%s: transmit timed out, %s?", dev->name,
-                      (SCB_complete(status)?"lost interrupt":
-                       "board on fire"));
-               lp->stats.tx_errors++;
-               dev->tbusy = 0;
-               lp->last_tx = jiffies;
-               if (!SCB_complete(status)) {
-                       scb_command(dev, SCB_CUabort);
-                       outb(0,dev->base_addr+SIGNAL_CA);
-               }
-       }
   
-       if (test_and_set_bit(0,(void *)&dev->tbusy))
-       {
-               lp->stats.tx_dropped++;
-       }
-       else
        {
                unsigned short length = (ETH_ZLEN < buf->len) ? buf->len :
                        ETH_ZLEN;
@@ -756,8 +756,6 @@ static void eexp_irq(int irq, void *dev_info, struct pt_regs *regs)
        outb(SIRQ_dis|irqrmap[irq],ioaddr+SET_IRQ);
 
        
-       dev->interrupt = 1;
-
        status = scb_status(dev);
 
 #if NET_DEBUG > 4
@@ -825,7 +823,6 @@ static void eexp_irq(int irq, void *dev_info, struct pt_regs *regs)
 
        outb(SIRQ_en|irqrmap[irq],ioaddr+SET_IRQ); 
 
-       dev->interrupt = 0;
 #if NET_DEBUG > 6 
        printk("%s: leaving eexp_irq()\n", dev->name);
 #endif
@@ -1004,8 +1001,8 @@ static void eexp_hw_tx_pio(struct net_device *dev, unsigned short *buf,
        else
                lp->tx_head += TX_BUF_SIZE;
        if (lp->tx_head != lp->tx_reap)
-               dev->tbusy = 0;
-
+               netif_wake_queue(dev);
+               
        if (LOCKUP16 || lp->width) {
                /* Restart the CU so that the packet can actually
                   be transmitted. (Zoltan Szilagyi 10-12-96) */
@@ -1141,6 +1138,8 @@ static int __init eexp_hw_probe(struct net_device *dev, unsigned short ioaddr)
        dev->hard_start_xmit = eexp_xmit;
        dev->get_stats = eexp_stats;
        dev->set_multicast_list = &eexp_set_multicast;
+       dev->tx_timeout = eexp_timeout;
+       dev->watchdog_timeo = 2*HZ;
        ether_setup(dev);
        return 0;
 }
@@ -1205,7 +1204,7 @@ static unsigned short eexp_hw_lasttxstat(struct net_device *dev)
        unsigned short tx_block = lp->tx_reap;
        unsigned short status;
 
-       if ((!dev->tbusy) && lp->tx_head==lp->tx_reap)
+       if (!test_bit(LINK_STATE_XOFF, &dev->state) && lp->tx_head==lp->tx_reap)
                return 0x0000;
 
        do
@@ -1254,8 +1253,7 @@ static unsigned short eexp_hw_lasttxstat(struct net_device *dev)
                        lp->tx_reap = tx_block = TX_BUF_START;
                else
                        lp->tx_reap = tx_block += TX_BUF_SIZE;
-               dev->tbusy = 0;
-               mark_bh(NET_BH);
+               netif_wake_queue(dev);
        }
        while (lp->tx_reap != lp->tx_head);
 
@@ -1298,8 +1296,7 @@ static void eexp_hw_txrestart(struct net_device *dev)
                                {
                                        printk(KERN_WARNING "%s: Failed to restart CU, resetting board...\n",dev->name);
                                        eexp_hw_init586(dev);
-                                       dev->tbusy = 0;
-                                       mark_bh(NET_BH);
+                                       netif_wake_queue(dev);
                                        return;
                                }
                        }
index d8832292a9c3196faaaebf315dc4e32a40fa3439..bf001d83d87ab2cac00157eb02617347497035a2 100644 (file)
@@ -85,6 +85,7 @@ static int  irport_set_dtr_rts(struct net_device *dev, int dtr, int rts);
 static int  irport_raw_write(struct net_device *dev, __u8 *buf, int len);
 static struct net_device_stats *irport_net_get_stats(struct net_device *dev);
 static int irport_change_speed_complete(struct irda_task *task);
+static void irport_timeout(struct net_device *dev);
 
 EXPORT_SYMBOL(irport_open);
 EXPORT_SYMBOL(irport_close);
@@ -92,6 +93,7 @@ EXPORT_SYMBOL(irport_start);
 EXPORT_SYMBOL(irport_stop);
 EXPORT_SYMBOL(irport_interrupt);
 EXPORT_SYMBOL(irport_hard_xmit);
+EXPORT_SYMBOL(irport_timeout);
 EXPORT_SYMBOL(irport_change_speed);
 EXPORT_SYMBOL(irport_net_open);
 EXPORT_SYMBOL(irport_net_close);
@@ -227,6 +229,8 @@ irport_open(int i, unsigned int iobase, unsigned int irq)
        /* Override the network functions we need to use */
        dev->init            = irport_net_init;
        dev->hard_start_xmit = irport_hard_xmit;
+       dev->tx_timeout      = irport_timeout;
+       dev->watchdog_timeo  = HZ/20;
        dev->open            = irport_net_open;
        dev->stop            = irport_net_close;
        dev->get_stats       = irport_net_get_stats;
@@ -505,16 +509,11 @@ static void irport_write_wakeup(struct irport_cb *self)
                                          NULL, (void *) self->new_speed);
                        self->new_speed = 0;
                } else {
-                       self->netdev->tbusy = 0; /* Unlock */
-               
                        /* Tell network layer that we want more frames */
-                       mark_bh(NET_BH);
+                       netif_wake_queue(self->netdev);
                }
                self->stats.tx_packets++;
 
-               /* Schedule network layer, so we can get some more frames */
-               mark_bh(NET_BH);
-
                /* 
                 * Reset Rx FIFO to make sure that all reflected transmit data
                 * is discarded. This is needed for half duplex operation
@@ -577,16 +576,37 @@ static int irport_change_speed_complete(struct irda_task *task)
        ASSERT(self->netdev != NULL, return -1;);
 
        /* Finished changing speed, so we are not busy any longer */
-       self->netdev->tbusy = 0;
-
        /* Signal network layer so it can try to send the frame */
-       mark_bh(NET_BH);
 
+       netif_wake_queue(self->netdev);
+       
        return 0;
 }
 
 /*
- * Function irport_xmit (void)
+ * Function irport_timeout (struct net_device *dev)
+ *
+ *    The networking layer thinks we timed out.
+ *
+ */
+
+static void irport_timeout(struct net_device *dev)
+{
+       struct irport_cb *self;
+       int iobase;
+
+       self = (struct irport_cb *) dev->priv;
+       iobase = self->io.sir_base;
+       
+       WARNING("%s: transmit timed out\n", dev->name);
+       irport_start(self);
+       self->change_speed(self->priv, self->io.speed);
+       dev->trans_start = jiffies;
+       netif_wake_queue(dev);
+}
+/*
+ * Function irport_hard_start_xmit (struct sk_buff *skb, struct net_device *dev)
  *
  *    Transmits the current frame until FIFO is full, then
  *    waits until the next transmitt interrupt, and continues until the
@@ -606,19 +626,8 @@ int irport_hard_xmit(struct sk_buff *skb, struct net_device *dev)
 
        iobase = self->io.sir_base;
 
-       /* Lock transmit buffer */
-       if (irda_lock((void *) &dev->tbusy) == FALSE) {
-               int tickssofar = jiffies - dev->trans_start;
-               if ((tickssofar < 5) || !dev->start)
-                       return -EBUSY;
-
-               WARNING("%s: transmit timed out\n", dev->name);
-               irport_start(self);
-               self->change_speed(self->priv, self->io.speed);
-
-               dev->trans_start = jiffies;
-       }
-
+       netif_stop_queue(dev);
+       
        /* Check if we need to change the speed */
        if ((speed = irda_get_speed(skb)) != self->io.speed)
                self->new_speed = speed;
@@ -696,8 +705,6 @@ void irport_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 
        spin_lock(&self->lock);
 
-       dev->interrupt = 1;
-
        iobase = self->io.sir_base;
 
        iir = inb(iobase+UART_IIR) & UART_IIR_ID;
@@ -733,8 +740,6 @@ void irport_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 
                iir = inb(iobase + UART_IIR) & UART_IIR_ID;
        }
-       dev->interrupt = 0;
-
        spin_unlock(&self->lock);
 }
 
@@ -770,10 +775,6 @@ int irport_net_open(struct net_device *dev)
 
        irport_start(self);
 
-       /* Ready to play! */
-       dev->tbusy = 0;
-       dev->interrupt = 0;
-       dev->start = 1;
 
        /* 
         * Open new IrLAP layer instance, now that everything should be
@@ -782,7 +783,10 @@ int irport_net_open(struct net_device *dev)
        self->irlap = irlap_open(dev, &self->qos);
 
        /* FIXME: change speed of dongle */
+       /* Ready to play! */
 
+       netif_start_queue(dev);
+       
        MOD_INC_USE_COUNT;
 
        return 0;
@@ -809,9 +813,8 @@ int irport_net_close(struct net_device *dev)
        iobase = self->io.sir_base;
 
        /* Stop device */
-       dev->tbusy = 1;
-       dev->start = 0;
-
+       netif_stop_queue(dev);
+       
        /* Stop and remove instance of IrLAP */
        if (self->irlap)
                irlap_close(self->irlap);
index 370a9c7fede110e4ea1b757157bfd9d0711cb94d..931ae9c4c1ee03f0d30302b020c603a9f6d1653b 100644 (file)
@@ -615,11 +615,9 @@ static int irtty_change_speed_complete(struct irda_task *task)
        ASSERT(self->netdev != NULL, return -1;);
 
        /* Finished changing speed, so we are not busy any longer */
-       self->netdev->tbusy = 0;
-
        /* Signal network layer so it can try to send the frame */
-       mark_bh(NET_BH);
-
+       netif_wake_queue(self->netdev);
+       
        return 0;
 }
 
@@ -639,9 +637,8 @@ static int irtty_hard_xmit(struct sk_buff *skb, struct net_device *dev)
        ASSERT(self != NULL, return 0;);
 
        /* Lock transmit buffer */
-       if (irda_lock((void *) &dev->tbusy) == FALSE)
-               return -EBUSY;
-
+       netif_stop_queue(dev);
+       
        /* Check if we need to change the speed */
        if ((speed = irda_get_speed(skb)) != self->io.speed)
                self->new_speed = speed;
@@ -727,10 +724,8 @@ static void irtty_write_wakeup(struct tty_struct *tty)
                                          NULL, (void *) self->new_speed);
                        self->new_speed = 0;
                } else {
-                       self->netdev->tbusy = 0; /* Unlock */
-               
                        /* Tell network layer that we want more frames */
-                       mark_bh(NET_BH);
+                       netif_wake_queue(self->netdev);
                }
        }
 }
@@ -899,10 +894,8 @@ static int irtty_net_open(struct net_device *dev)
        IRDA_DEBUG(0, __FUNCTION__ "()\n");
        
        /* Ready to play! */
-       dev->tbusy = 0;
-       dev->interrupt = 0;
-       dev->start = 1;
-
+       netif_start_queue(dev);
+       
        /* Make sure we can receive more data */
        irtty_stop_receiver(self, FALSE);
 
@@ -928,9 +921,8 @@ static int irtty_net_close(struct net_device *dev)
        irtty_stop_receiver(self, TRUE);
 
        /* Stop device */
-       dev->tbusy = 1;
-       dev->start = 0;
-
+       netif_stop_queue(dev);
+       
        /* Stop and remove instance of IrLAP */
        if (self->irlap)
                irlap_close(self->irlap);
index 5e30b22adceb8f8daeb8914aaa5e9ccc23af7849..1886ec73a35263a3a1f1face8fae35a9ac1021d2 100644 (file)
@@ -1033,8 +1033,6 @@ static void nsc_ircc_change_speed(struct nsc_ircc_cb *self, __u32 speed)
        switch_bank(iobase, BANK2);
        outb(EXCR2_RFSIZ|EXCR2_TFSIZ, iobase+EXCR2);
        
-       self->netdev->tbusy = 0;
-       
        /* Enable some interrupts so we can receive frames */
        switch_bank(iobase, BANK0); 
        if (speed > 115200) {
@@ -1050,6 +1048,8 @@ static void nsc_ircc_change_speed(struct nsc_ircc_cb *self, __u32 speed)
        
        /* Restore BSR */
        outb(bank, iobase+BSR);
+       netif_wake_queue(dev);
+       
 }
 
 /*
@@ -1072,10 +1072,8 @@ static int nsc_ircc_hard_xmit_sir(struct sk_buff *skb, struct net_device *dev)
 
        iobase = self->io.fir_base;
 
-       /* Lock transmit buffer */
-       if (irda_lock((void *) &dev->tbusy) == FALSE)
-               return -EBUSY;
-       
+       netif_stop_queue(dev);
+               
        /* Check if we need to change the speed */
        if ((speed = irda_get_speed(skb)) != self->io.speed)
                self->new_speed = speed;
@@ -1118,10 +1116,8 @@ static int nsc_ircc_hard_xmit_fir(struct sk_buff *skb, struct net_device *dev)
        self = (struct nsc_ircc_cb *) dev->priv;
        iobase = self->io.fir_base;
 
-       /* Lock transmit buffer */
-       if (irda_lock((void *) &dev->tbusy) == FALSE)
-               return -EBUSY;
-
+       netif_stop_queue(dev);
+       
        /* Check if we need to change the speed */
        if ((speed = irda_get_speed(skb)) != self->io.speed)
                self->new_speed = speed;
@@ -1199,7 +1195,7 @@ static int nsc_ircc_hard_xmit_fir(struct sk_buff *skb, struct net_device *dev)
  out:
        /* Not busy transmitting anymore if window is not full */
        if (self->tx_fifo.free < MAX_TX_WINDOW)
-               dev->tbusy = 0;
+               netif_wake_queue(self->netdev);
 
        /* Restore bank register */
        outb(bank, iobase+BSR);
@@ -1347,10 +1343,8 @@ static int nsc_ircc_dma_xmit_complete(struct nsc_ircc_cb *self)
        /* Make sure we have room for more frames */
        if (self->tx_fifo.free < MAX_TX_WINDOW) {
                /* Not busy transmitting anymore */
-               self->netdev->tbusy = 0;
-
                /* Tell the network layer, that we can accept more frames */
-               mark_bh(NET_BH);
+               netif_wake_queue(self->netdev);
        }
 
        /* Restore bank */
@@ -1601,11 +1595,9 @@ static void nsc_ircc_sir_interrupt(struct nsc_ircc_cb *self, int eir)
                if (self->tx_buff.len > 0)
                        self->ier = IER_TXLDL_IE;
                else { 
-                       self->netdev->tbusy = 0; /* Unlock */
-                       self->stats.tx_packets++;
-                       
-                       mark_bh(NET_BH);        
 
+                       self->stats.tx_packets++;
+                       netif_wakeup_queue(self->netdev);
                        self->ier = IER_TXEMP_IE;
                }
                        
@@ -1731,7 +1723,6 @@ static void nsc_ircc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
        self = (struct nsc_ircc_cb *) dev->priv;
 
        spin_lock(&self->lock); 
-       dev->interrupt = 1;
 
        iobase = self->io.fir_base;
 
@@ -1754,7 +1745,6 @@ static void nsc_ircc_interrupt(int irq, void *dev_id, struct pt_regs *regs)
        outb(self->ier, iobase+IER); /* Restore interrupts */
        outb(bsr, iobase+BSR);       /* Restore bank register */
 
-       dev->interrupt = 0;
        spin_unlock(&self->lock);
 }
 
@@ -1860,10 +1850,9 @@ static int nsc_ircc_net_open(struct net_device *dev)
        outb(bank, iobase+BSR);
 
        /* Ready to play! */
-       dev->tbusy = 0;
-       dev->interrupt = 0;
-       dev->start = 1;
 
+       netif_start_queue(dev);
+       
        /* 
         * Open new IrLAP layer instance, now that everything should be
         * initialized properly 
@@ -1895,9 +1884,8 @@ static int nsc_ircc_net_close(struct net_device *dev)
        ASSERT(self != NULL, return 0;);
 
        /* Stop device */
-       dev->tbusy = 1;
-       dev->start = 0;
-
+       netif_stop_queue(dev);
+       
        /* Stop and remove instance of IrLAP */
        if (self->irlap)
                irlap_close(self->irlap);
index 3420b670b4fa42b0439fcc2364b15b7cb4bb4518..951b08d8f090c2f51e4ffe444c18e9652a661df6 100644 (file)
@@ -275,6 +275,8 @@ toshoboe_hard_xmit (struct sk_buff *skb, struct net_device *dev)
   if ((speed = irda_get_speed(skb)) != self->io.speed)
          self->new_speed = speed;
 
+  netif_stop_queue(dev);
+  
   if (self->stopped) {
          dev_kfree_skb(skb);
     return 0;
@@ -318,17 +320,14 @@ toshoboe_hard_xmit (struct sk_buff *skb, struct net_device *dev)
 
   self->txpending++;
 
-  /*FIXME: ask about tbusy,media_busy stuff, for the moment */
-  /*tbusy means can't queue any more */
+  /*FIXME: ask about busy,media_busy stuff, for the moment */
+  /*busy means can't queue any more */
 #ifndef ONETASK
-  if (self->txpending == TX_SLOTS)
-    {
-#else
+  if (self->txpending != TX_SLOTS)
   {
-#endif
-    if (irda_lock ((void *) &dev->tbusy) == FALSE)
-      return -EBUSY;
+       netif_wake_queue(dev);
   }
+#endif
 
   outb_p (0x80, OBOE_RST);
   outb_p (1, OBOE_REG_9);
@@ -379,10 +378,8 @@ toshoboe_interrupt (int irq, void *dev_id, struct pt_regs *regs)
 
              self->new_speed = 0;
       }
-      self->netdev->tbusy = 0; /* Unlock */
-      
       /* Tell network layer that we want more frames */
-      mark_bh(NET_BH);
+      netif_wake_queue(self->netdev);
     }
 
   if (irqstat & OBOE_ISR_RXDONE)
@@ -529,10 +526,7 @@ toshoboe_net_open (struct net_device *dev)
   toshoboe_initptrs (self);
 
   /* Ready to play! */
-  dev->tbusy = 0;
-  dev->interrupt = 0;
-  dev->start = 1;
-  
+  netif_start_queue(dev);  
   /* 
    * Open new IrLAP layer instance, now that everything should be
    * initialized properly 
@@ -559,9 +553,8 @@ toshoboe_net_close (struct net_device *dev)
   self = (struct toshoboe_cb *) dev->priv;
 
   /* Stop device */
-  dev->tbusy = 1;
-  dev->start = 0;
-  
+  netif_stop_queue(dev);
+    
   /* Stop and remove instance of IrLAP */
   if (self->irlap)
          irlap_close(self->irlap);
@@ -926,11 +919,7 @@ toshoboe_wakeup (struct toshoboe_cb *self)
 
   toshoboe_initptrs (self);
 
-  dev->tbusy = 0;
-  dev->interrupt = 0;
-  dev->start = 1;
-  self->stopped = 0;
-
+  netif_wake_queue(self->netdev);
   restore_flags (flags);
   printk (KERN_WARNING "ToshOboe: waking up\n");
 
index 7f781719c45d1147a61757c8834db5c5c7043e62..239120e51fee46b3ee6531212f4e017cdef0ccd9 100644 (file)
@@ -475,8 +475,8 @@ void w83977af_change_speed(struct w83977af_ir *self, __u32 speed)
        outb(UFR_EN_FIFO, iobase+UFR); /* First we must enable FIFO */
        outb(0xa7, iobase+UFR);
 
-       self->netdev->tbusy = 0;
-       
+       netif_wake_queue(self->netdev);
+               
        /* Enable some interrupts so we can receive frames */
        switch_bank(iobase, SET0);
        if (speed > PIO_MAX_SPEED) {
@@ -511,9 +511,8 @@ int w83977af_hard_xmit(struct sk_buff *skb, struct net_device *dev)
                   (int) skb->len);
        
        /* Lock transmit buffer */
-       if (irda_lock((void *) &dev->tbusy) == FALSE)
-               return -EBUSY;
-
+       netif_stop_queue(dev);
+       
        /* Check if we need to change the speed */
        if ((speed = irda_get_speed(skb)) != self->io.speed)
                self->new_speed = speed;
@@ -715,11 +714,9 @@ void w83977af_dma_xmit_complete(struct w83977af_ir *self)
        }
 
        /* Unlock tx_buff and request another frame */
-       self->netdev->tbusy = 0; /* Unlock */
-       
        /* Tell the network layer, that we want more frames */
-       mark_bh(NET_BH);
-
+       netif_wake_queue(self->netdev);
+       
        /* Restore set */
        outb(set, iobase+SSR);
 }
@@ -991,12 +988,10 @@ static __u8 w83977af_sir_interrupt(struct w83977af_ir *self, int isr)
                        outb(AUDR_SFEND, iobase+AUDR);
                        outb(set, iobase+SSR); 
 
-                       self->netdev->tbusy = 0; /* Unlock */
                        self->stats.tx_packets++;
 
-                       /* Schedule network layer */
-                       mark_bh(NET_BH);        
-
+                       /* Feed me more packets */
+                       netif_wake_queue(self->netdev);
                        new_icr |= ICR_ETBREI;
                }
        }
@@ -1124,8 +1119,6 @@ static void w83977af_interrupt(int irq, void *dev_id, struct pt_regs *regs)
        }
        self = (struct w83977af_ir *) dev->priv;
 
-       dev->interrupt = 1;
-
        iobase = self->io.fir_base;
 
        /* Save current bank */
@@ -1148,7 +1141,6 @@ static void w83977af_interrupt(int irq, void *dev_id, struct pt_regs *regs)
        outb(icr, iobase+ICR);    /* Restore (new) interrupts */
        outb(set, iobase+SSR);    /* Restore bank register */
 
-       self->netdev->interrupt = 0;
 }
 
 /*
@@ -1250,10 +1242,8 @@ static int w83977af_net_open(struct net_device *dev)
        outb(set, iobase+SSR);
 
        /* Ready to play! */
-       dev->tbusy = 0;
-       dev->interrupt = 0;
-       dev->start = 1;
-
+       netif_start_queue(dev);
+       
        /* 
         * Open new IrLAP layer instance, now that everything should be
         * initialized properly 
@@ -1288,9 +1278,8 @@ static int w83977af_net_close(struct net_device *dev)
        iobase = self->io.fir_base;
 
        /* Stop device */
-       dev->tbusy = 1;
-       dev->start = 0;
-
+       netif_stop_queue(dev);
+       
        /* Stop and remove instance of IrLAP */
        if (self->irlap)
                irlap_close(self->irlap);
index 0a69d9004988bc3c8cbea4ab4f53b11e49e5449a..269300c0dcec7f1fd614365035e2bfbc27902739 100644 (file)
@@ -425,9 +425,8 @@ static void ne_get_8390_hdr(struct net_device *dev, struct e8390_pkt_hdr *hdr,
           If it does, it's the last thing you'll see */
        if (ei_status.dmaing) {
                printk("%s: DMAing conflict in ne_get_8390_hdr "
-                               "[DMAstat:%d][irqlock:%d][intr:%ld].\n",
-                               dev->name, ei_status.dmaing, ei_status.irqlock,
-                               dev->interrupt);
+                               "[DMAstat:%d][irqlock:%d].\n",
+                               dev->name, ei_status.dmaing, ei_status.irqlock);
                return;
        }
 
@@ -468,9 +467,8 @@ static void ne_block_input(struct net_device *dev, int count, struct sk_buff *sk
           If it does, it's the last thing you'll see */
        if (ei_status.dmaing) {
                printk("%s: DMAing conflict in ne_block_input "
-                               "[DMAstat:%d][irqlock:%d][intr:%ld].\n",
-                               dev->name, ei_status.dmaing, ei_status.irqlock,
-                               dev->interrupt);
+                               "[DMAstat:%d][irqlock:%d].\n",
+                               dev->name, ei_status.dmaing, ei_status.irqlock);
                return;
        }
        ei_status.dmaing |= 0x01;
@@ -537,9 +535,8 @@ static void ne_block_output(struct net_device *dev, int count,
           If it does, it's the last thing you'll see */
        if (ei_status.dmaing) {
                printk("%s: DMAing conflict in ne_block_output."
-                               "[DMAstat:%d][irqlock:%d][intr:%ld]\n",
-                               dev->name, ei_status.dmaing, ei_status.irqlock,
-                               dev->interrupt);
+                               "[DMAstat:%d][irqlock:%d]\n",
+                               dev->name, ei_status.dmaing, ei_status.irqlock);
                return;
        }
        ei_status.dmaing |= 0x01;
index 5bdb0176a5045922f7d5f48789a77a1a71d188f5..9b17cc79d60faa6be9440e8300ba49765d6674c9 100644 (file)
@@ -1002,10 +1002,8 @@ sb1000_open(struct net_device *dev)
                        "(should be %x.%02x)\n", name, version[0], version[1],
                        FirmwareVersion[0], FirmwareVersion[1]);
 
-       dev->interrupt = 0;
-       dev->tbusy = 0;
-       dev->start = 1;
 
+       netif_start_queue(dev);
        MOD_INC_USE_COUNT;
        return 0;                                       /* Always succeed */
 }
@@ -1122,10 +1120,6 @@ static void sb1000_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                        irq);
                return;
        }
-       if (dev->interrupt)
-               printk(KERN_ERR "%s: Re-entering the interrupt handler.\n",
-                       dev->name);
-       dev->interrupt = 1;
 
        ioaddr[0] = dev->base_addr;
        /* rmem_end holds the second I/O address - fv */
@@ -1135,7 +1129,6 @@ static void sb1000_interrupt(int irq, void *dev_id, struct pt_regs *regs)
        /* is it a good interrupt? */
        st = inb(ioaddr[1] + 6);
        if (!(st & 0x08 && st & 0x20)) {
-               dev->interrupt = 0;
                return;
        }
 
@@ -1167,7 +1160,6 @@ static void sb1000_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                lp->rx_error_count = 0;
        }
 
-       dev->interrupt = 0;
        return;
 }
 
@@ -1186,9 +1178,8 @@ static int sb1000_close(struct net_device *dev)
        if (sb1000_debug > 2)
                printk(KERN_DEBUG "%s: Shutting down sb1000.\n", dev->name);
 
-       dev->tbusy = 1;
-       dev->start = 0;
-
+       netif_stop_queue(dev);
+       
        ioaddr[0] = dev->base_addr;
        /* rmem_end holds the second I/O address - fv */
        ioaddr[1] = dev->rmem_end;
index 9026441624bcced7f7b758a8d5521ec4f079d427..088b89388fed6914560a1eae51445954e7ce22b2 100644 (file)
@@ -96,12 +96,13 @@ History:
  * have to pack all state info into the device struct!
  * ------------------------------------------------------------------------ */
 
-static char *MediaNames[Media_Count]=
-            {"10Base2", "10BaseT", "10Base5", "Unknown"};
+static char *MediaNames[Media_Count] = {
+       "10Base2", "10BaseT", "10Base5", "Unknown" };
 
-static unsigned char poly[] =
-       {1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0,
-        1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0};
+static unsigned char poly[] = { 
+       1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0,
+       1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0
+};
 
 /* ------------------------------------------------------------------------
  * private subfunctions
@@ -112,64 +113,70 @@ static unsigned char poly[] =
 #ifdef DEBUG
 static void dumpmem(struct net_device *dev, u32 start, u32 len)
 {
-  int z;
-
-  for (z = 0; z < len; z++)
-  {
-    if ((z & 15) == 0)
-      printk("%04x:", z);
-    printk(" %02x", readb(dev->mem_start + start + z));
-    if ((z & 15) == 15)
-      printk("\n");
-  }
+       int z;
+
+       for (z = 0; z < len; z++) {
+               if ((z & 15) == 0)
+                       printk("%04x:", z);
+               printk(" %02x", readb(dev->mem_start + start + z));
+               if ((z & 15) == 15)
+                       printk("\n");
+       }
 }
 
 /* print exact time - ditto */
 
 static void PrTime(void)
 {
-  struct timeval tv;
+       struct timeval tv;
 
-  do_gettimeofday(&tv);
-  printk("%9d:%06d: ", tv.tv_sec, tv.tv_usec);
+       do_gettimeofday(&tv);
+       printk("%9d:%06d: ", tv.tv_sec, tv.tv_usec);
 }
+
 #endif
 
 /* deduce resources out of POS registers */
 
 static void getaddrs(int slot, int junior, int *base, int *irq,
-                     skmca_medium *medium)
+                    skmca_medium * medium)
 {
-  u_char pos0, pos1, pos2;
-  
-  if (junior)
-  {
-    pos0 = mca_read_stored_pos(slot, 2);
-    *base = ((pos0 & 0x0e) << 13) + 0xc0000;
-    *irq = ((pos0 & 0x10) >> 4) + 10;
-    *medium = Media_Unknown;
-  }
-  else
-  {
-    /* reset POS 104 Bits 0+1 so the shared memory region goes to the
-       configured area between 640K and 1M.  Afterwards, enable the MC2.
-       I really don't know what rode SK to do this... */
-       
-    mca_write_pos(slot, 4, mca_read_stored_pos(slot, 4) & 0xfc);
-    mca_write_pos(slot, 2, mca_read_stored_pos(slot, 2) | 0x01);
-       
-    pos1 = mca_read_stored_pos(slot, 3);
-    pos2 = mca_read_stored_pos(slot, 4);
-    *base = ((pos1 & 0x07) << 14) + 0xc0000;
-    switch (pos2 & 0x0c)
-    {
-      case 0: *irq = 3; break;
-      case 4: *irq = 5; break;
-      case 8: *irq = 10; break;
-      case 12: *irq = 11; break;
-    }
-    *medium = (pos2 >> 6) & 3;
-  }
+       u_char pos0, pos1, pos2;
+
+       if (junior) {
+               pos0 = mca_read_stored_pos(slot, 2);
+               *base = ((pos0 & 0x0e) << 13) + 0xc0000;
+               *irq = ((pos0 & 0x10) >> 4) + 10;
+               *medium = Media_Unknown;
+       } else {
+               /* reset POS 104 Bits 0+1 so the shared memory region goes to the
+                  configured area between 640K and 1M.  Afterwards, enable the MC2.
+                  I really don't know what rode SK to do this... */
+
+               mca_write_pos(slot, 4,
+                             mca_read_stored_pos(slot, 4) & 0xfc);
+               mca_write_pos(slot, 2,
+                             mca_read_stored_pos(slot, 2) | 0x01);
+
+               pos1 = mca_read_stored_pos(slot, 3);
+               pos2 = mca_read_stored_pos(slot, 4);
+               *base = ((pos1 & 0x07) << 14) + 0xc0000;
+               switch (pos2 & 0x0c) {
+               case 0:
+                       *irq = 3;
+                       break;
+               case 4:
+                       *irq = 5;
+                       break;
+               case 8:
+                       *irq = 10;
+                       break;
+               case 12:
+                       *irq = 11;
+                       break;
+               }
+               *medium = (pos2 >> 6) & 3;
+       }
 }
 
 /* check for both cards:
@@ -179,157 +186,162 @@ static void getaddrs(int slot, int junior, int *base, int *irq,
 
 static int dofind(int *junior, int firstslot)
 {
-  int slot;
-  unsigned int id;
-
-  for (slot = firstslot; slot < MCA_MAX_SLOT_NR; slot++)
-  {
-    id = mca_read_stored_pos(slot, 0)
-       + (((unsigned int) mca_read_stored_pos(slot, 1)) << 8);
-       
-    *junior = 0;
-    if (id == SKNET_MCA_ID)
-      return slot;
-    *junior = 1;
-    if (id == SKNET_JUNIOR_MCA_ID)
-      return slot;
-  }
-  return MCA_NOTFOUND;
+       int slot;
+       unsigned int id;
+
+       for (slot = firstslot; slot < MCA_MAX_SLOT_NR; slot++) {
+               id = mca_read_stored_pos(slot, 0)
+                   + (((unsigned int) mca_read_stored_pos(slot, 1)) << 8);
+
+               *junior = 0;
+               if (id == SKNET_MCA_ID)
+                       return slot;
+               *junior = 1;
+               if (id == SKNET_JUNIOR_MCA_ID)
+                       return slot;
+       }
+       return MCA_NOTFOUND;
 }
 
 /* reset the whole board */
 
 static void ResetBoard(struct net_device *dev)
 {
-  skmca_priv *priv = (skmca_priv*) dev->priv;
+       skmca_priv *priv = (skmca_priv *) dev->priv;
 
-  writeb(CTRL_RESET_ON, priv->ctrladdr);
-  udelay(10);
-  writeb(CTRL_RESET_OFF, priv->ctrladdr);
+       writeb(CTRL_RESET_ON, priv->ctrladdr);
+       udelay(10);
+       writeb(CTRL_RESET_OFF, priv->ctrladdr);
 }
 
 /* set LANCE register - must be atomic */
 
 static void SetLANCE(struct net_device *dev, u16 addr, u16 value)
 {
-  skmca_priv *priv = (skmca_priv*) dev->priv;
-  unsigned long flags;
+       skmca_priv *priv = (skmca_priv *) dev->priv;
+       unsigned long flags;
 
-  /* disable interrupts */
+       /* disable interrupts */
 
-  save_flags(flags);
-  cli();
+       save_flags(flags);
+       cli();
 
-  /* wait until no transfer is pending */
-  
-  while ((readb(priv->ctrladdr) & STAT_IO_BUSY) == STAT_IO_BUSY);
+       /* wait until no transfer is pending */
 
-  /* transfer register address to RAP */
+       while ((readb(priv->ctrladdr) & STAT_IO_BUSY) == STAT_IO_BUSY);
 
-  writeb(CTRL_RESET_OFF | CTRL_RW_WRITE | CTRL_ADR_RAP, priv->ctrladdr);
-  writew(addr, priv->ioregaddr);
-  writeb(IOCMD_GO, priv->cmdaddr);
-  udelay(1);
-  while ((readb(priv->ctrladdr) & STAT_IO_BUSY) == STAT_IO_BUSY);
+       /* transfer register address to RAP */
 
-  /* transfer data to register */
+       writeb(CTRL_RESET_OFF | CTRL_RW_WRITE | CTRL_ADR_RAP,
+              priv->ctrladdr);
+       writew(addr, priv->ioregaddr);
+       writeb(IOCMD_GO, priv->cmdaddr);
+       udelay(1);
+       while ((readb(priv->ctrladdr) & STAT_IO_BUSY) == STAT_IO_BUSY);
 
-  writeb(CTRL_RESET_OFF | CTRL_RW_WRITE | CTRL_ADR_DATA, priv->ctrladdr);
-  writew(value, priv->ioregaddr);
-  writeb(IOCMD_GO, priv->cmdaddr);
-  udelay(1);
-  while ((readb(priv->ctrladdr) & STAT_IO_BUSY) == STAT_IO_BUSY);
+       /* transfer data to register */
 
-  /* reenable interrupts */
+       writeb(CTRL_RESET_OFF | CTRL_RW_WRITE | CTRL_ADR_DATA,
+              priv->ctrladdr);
+       writew(value, priv->ioregaddr);
+       writeb(IOCMD_GO, priv->cmdaddr);
+       udelay(1);
+       while ((readb(priv->ctrladdr) & STAT_IO_BUSY) == STAT_IO_BUSY);
 
-  restore_flags(flags);
+       /* reenable interrupts */
+
+       restore_flags(flags);
 }
 
 /* get LANCE register */
 
 static u16 GetLANCE(struct net_device *dev, u16 addr)
 {
-  skmca_priv *priv = (skmca_priv*) dev->priv;
-  unsigned long flags;
-  unsigned int res;
+       skmca_priv *priv = (skmca_priv *) dev->priv;
+       unsigned long flags;
+       unsigned int res;
 
-  /* disable interrupts */
+       /* disable interrupts */
 
-  save_flags(flags);
-  cli();
+       save_flags(flags);
+       cli();
 
-  /* wait until no transfer is pending */
+       /* wait until no transfer is pending */
 
-  while ((readb(priv->ctrladdr) & STAT_IO_BUSY) == STAT_IO_BUSY);
+       while ((readb(priv->ctrladdr) & STAT_IO_BUSY) == STAT_IO_BUSY);
 
-  /* transfer register address to RAP */
+       /* transfer register address to RAP */
 
-  writeb(CTRL_RESET_OFF | CTRL_RW_WRITE | CTRL_ADR_RAP, priv->ctrladdr);
-  writew(addr, priv->ioregaddr);
-  writeb(IOCMD_GO, priv->cmdaddr);
-  udelay(1);
-  while ((readb(priv->ctrladdr) & STAT_IO_BUSY) == STAT_IO_BUSY);
+       writeb(CTRL_RESET_OFF | CTRL_RW_WRITE | CTRL_ADR_RAP,
+              priv->ctrladdr);
+       writew(addr, priv->ioregaddr);
+       writeb(IOCMD_GO, priv->cmdaddr);
+       udelay(1);
+       while ((readb(priv->ctrladdr) & STAT_IO_BUSY) == STAT_IO_BUSY);
 
-  /* transfer data from register */
+       /* transfer data from register */
 
-  writeb(CTRL_RESET_OFF | CTRL_RW_READ | CTRL_ADR_DATA, priv->ctrladdr);
-  writeb(IOCMD_GO, priv->cmdaddr);
-  udelay(1);
-  while ((readb(priv->ctrladdr) & STAT_IO_BUSY) == STAT_IO_BUSY);
-  res = readw(priv->ioregaddr);
+       writeb(CTRL_RESET_OFF | CTRL_RW_READ | CTRL_ADR_DATA,
+              priv->ctrladdr);
+       writeb(IOCMD_GO, priv->cmdaddr);
+       udelay(1);
+       while ((readb(priv->ctrladdr) & STAT_IO_BUSY) == STAT_IO_BUSY);
+       res = readw(priv->ioregaddr);
 
-  /* reenable interrupts */
+       /* reenable interrupts */
 
-  restore_flags(flags);
+       restore_flags(flags);
 
-  return res;
+       return res;
 }
 
 /* build up descriptors in shared RAM */
 
 static void InitDscrs(struct net_device *dev)
 {
-  u32 bufaddr;
-
-  /* Set up Tx descriptors. The board has only 16K RAM so bits 16..23
-     are always 0. */
-
-  bufaddr = RAM_DATABASE;
-  {
-    LANCE_TxDescr descr;
-    int z;
-
-    for (z = 0; z < TXCOUNT; z++)
-    {
-      descr.LowAddr = bufaddr;
-      descr.Flags = 0;
-      descr.Len = 0xf000;
-      descr.Status = 0;
-      isa_memcpy_toio(dev->mem_start + RAM_TXBASE + (z * sizeof(LANCE_TxDescr)),
-                  &descr, sizeof(LANCE_TxDescr));
-      memset_io(dev->mem_start + bufaddr, 0, RAM_BUFSIZE);
-      bufaddr += RAM_BUFSIZE;
-    }
-  }
-
-  /* do the same for the Rx descriptors */
-  {
-    LANCE_RxDescr descr;
-    int z;
-
-    for (z = 0; z < RXCOUNT; z++)
-    {
-      descr.LowAddr = bufaddr;
-      descr.Flags = RXDSCR_FLAGS_OWN;
-      descr.MaxLen = -RAM_BUFSIZE;
-      descr.Len = 0;
-      isa_memcpy_toio(dev->mem_start + RAM_RXBASE + (z * sizeof(LANCE_RxDescr)),
-                  &descr, sizeof(LANCE_RxDescr));
-      isa_memset_io(dev->mem_start + bufaddr, 0, RAM_BUFSIZE);
-      bufaddr += RAM_BUFSIZE;
-    }
-  }
+       u32 bufaddr;
+
+       /* Set up Tx descriptors. The board has only 16K RAM so bits 16..23
+          are always 0. */
+
+       bufaddr = RAM_DATABASE;
+       {
+               LANCE_TxDescr descr;
+               int z;
+
+               for (z = 0; z < TXCOUNT; z++) {
+                       descr.LowAddr = bufaddr;
+                       descr.Flags = 0;
+                       descr.Len = 0xf000;
+                       descr.Status = 0;
+                       isa_memcpy_toio(dev->mem_start + RAM_TXBASE +
+                                       (z * sizeof(LANCE_TxDescr)),
+                                       &descr, sizeof(LANCE_TxDescr));
+                       memset_io(dev->mem_start + bufaddr, 0,
+                                 RAM_BUFSIZE);
+                       bufaddr += RAM_BUFSIZE;
+               }
+       }
+
+       /* do the same for the Rx descriptors */
+
+       {
+               LANCE_RxDescr descr;
+               int z;
+
+               for (z = 0; z < RXCOUNT; z++) {
+                       descr.LowAddr = bufaddr;
+                       descr.Flags = RXDSCR_FLAGS_OWN;
+                       descr.MaxLen = -RAM_BUFSIZE;
+                       descr.Len = 0;
+                       isa_memcpy_toio(dev->mem_start + RAM_RXBASE +
+                                       (z * sizeof(LANCE_RxDescr)),
+                                       &descr, sizeof(LANCE_RxDescr));
+                       isa_memset_io(dev->mem_start + bufaddr, 0,
+                                     RAM_BUFSIZE);
+                       bufaddr += RAM_BUFSIZE;
+               }
+       }
 }
 
 /* calculate the hash bit position for a given multicast address
@@ -337,136 +349,138 @@ static void InitDscrs(struct net_device *dev)
 
 static void UpdateCRC(unsigned char *CRC, int bit)
 {
-  int j;
+       int j;
 
-  /* shift CRC one bit */
+       /* shift CRC one bit */
 
-  memmove(CRC + 1, CRC, 32 * sizeof(unsigned char));
-  CRC[0] = 0;
+       memmove(CRC + 1, CRC, 32 * sizeof(unsigned char));
+       CRC[0] = 0;
 
-  /* if bit XOR controlbit = 1, set CRC = CRC XOR polynomial */
+       /* if bit XOR controlbit = 1, set CRC = CRC XOR polynomial */
 
-  if (bit ^ CRC[32])
-    for (j = 0; j < 32; j++)
-      CRC[j] ^= poly[j];
+       if (bit ^ CRC[32])
+               for (j = 0; j < 32; j++)
+                       CRC[j] ^= poly[j];
 }
 
 static unsigned int GetHash(char *address)
 {
-  unsigned char CRC[33];
-  int i, byte, hashcode;
+       unsigned char CRC[33];
+       int i, byte, hashcode;
 
-  /* a multicast address has bit 0 in the first byte set */
+       /* a multicast address has bit 0 in the first byte set */
 
-  if ((address[0] & 1) == 0)
-    return -1;
+       if ((address[0] & 1) == 0)
+               return -1;
 
-  /* initialize CRC */
+       /* initialize CRC */
 
-  memset(CRC, 1, sizeof(CRC));
+       memset(CRC, 1, sizeof(CRC));
 
-  /* loop through address bits */
+       /* loop through address bits */
 
-  for (byte = 0; byte < 6; byte++)
-    for (i = 0; i < 8; i++)
-      UpdateCRC(CRC, (address[byte] >> i) & 1);
+       for (byte = 0; byte < 6; byte++)
+               for (i = 0; i < 8; i++)
+                       UpdateCRC(CRC, (address[byte] >> i) & 1);
 
-  /* hashcode is the 6 least significant bits of the CRC */
+       /* hashcode is the 6 least significant bits of the CRC */
 
-  hashcode = 0;
-  for (i = 0; i < 6; i++)
-    hashcode = (hashcode << 1) + CRC[i];
-  return hashcode;
+       hashcode = 0;
+       for (i = 0; i < 6; i++)
+               hashcode = (hashcode << 1) + CRC[i];
+       return hashcode;
 }
 
 /* feed ready-built initialization block into LANCE */
 
 static void InitLANCE(struct net_device *dev)
 {
-  skmca_priv *priv = (skmca_priv*) dev->priv;
-
-  /* build up descriptors. */
+       skmca_priv *priv = (skmca_priv *) dev->priv;
 
-  InitDscrs(dev);
+       /* build up descriptors. */
 
-  /* next RX descriptor to be read is the first one.  Since the LANCE
-     will start from the beginning after initialization, we have to 
-     reset out pointers too. */
+       InitDscrs(dev);
 
-  priv->nextrx = 0;
+       /* next RX descriptor to be read is the first one.  Since the LANCE
+          will start from the beginning after initialization, we have to 
+          reset out pointers too. */
 
-  /* no TX descriptors active */
+       priv->nextrx = 0;
 
-  priv->nexttxput = priv->nexttxdone = priv->txbusy = 0;
+       /* no TX descriptors active */
 
-  /* set up the LANCE bus control register - constant for SKnet boards */
+       priv->nexttxput = priv->nexttxdone = priv->txbusy = 0;
 
-  SetLANCE(dev, LANCE_CSR3, CSR3_BSWAP_OFF | CSR3_ALE_LOW | CSR3_BCON_HOLD);
+       /* set up the LANCE bus control register - constant for SKnet boards */
 
-  /* write address of initialization block into LANCE */
+       SetLANCE(dev, LANCE_CSR3,
+                CSR3_BSWAP_OFF | CSR3_ALE_LOW | CSR3_BCON_HOLD);
 
-  SetLANCE(dev, LANCE_CSR1, RAM_INITBASE & 0xffff);
-  SetLANCE(dev, LANCE_CSR2, (RAM_INITBASE >> 16) & 0xff);
+       /* write address of initialization block into LANCE */
 
-  /* we don't get ready until the LANCE has read the init block */
+       SetLANCE(dev, LANCE_CSR1, RAM_INITBASE & 0xffff);
+       SetLANCE(dev, LANCE_CSR2, (RAM_INITBASE >> 16) & 0xff);
 
-  dev->tbusy = 1;
+       /* we don't get ready until the LANCE has read the init block */
 
-  /* let LANCE read the initialization block.  LANCE is ready
-     when we receive the corresponding interrupt. */
+       netif_stop_queue(dev);
+       
+       /* let LANCE read the initialization block.  LANCE is ready
+          when we receive the corresponding interrupt. */
 
-  SetLANCE(dev, LANCE_CSR0, CSR0_INEA | CSR0_INIT);
+       SetLANCE(dev, LANCE_CSR0, CSR0_INEA | CSR0_INIT);
 }
 
 /* stop the LANCE so we can reinitialize it */
 
 static void StopLANCE(struct net_device *dev)
 {
-  /* can't take frames any more */
+       /* can't take frames any more */
 
-  dev->tbusy = 1;
+       netif_stop_queue(dev);
+       
+       /* disable interrupts, stop it */
 
-  /* disable interrupts, stop it */
-
-  SetLANCE(dev, LANCE_CSR0, CSR0_STOP);
+       SetLANCE(dev, LANCE_CSR0, CSR0_STOP);
 }
 
 /* initialize card and LANCE for proper operation */
 
 static void InitBoard(struct net_device *dev)
 {
-  LANCE_InitBlock block;
+       LANCE_InitBlock block;
 
-  /* Lay out the shared RAM - first we create the init block for the LANCE.
-     We do not overwrite it later because we need it again when we switch
-     promiscous mode on/off. */
+       /* Lay out the shared RAM - first we create the init block for the LANCE.
+          We do not overwrite it later because we need it again when we switch
+          promiscous mode on/off. */
 
-  block.Mode = 0;
-  if (dev->flags & IFF_PROMISC)
-    block.Mode |= LANCE_INIT_PROM;
-  memcpy(block.PAdr, dev->dev_addr, 6);
-  memset(block.LAdrF, 0, sizeof(block.LAdrF));
-  block.RdrP = (RAM_RXBASE & 0xffffff) | (LRXCOUNT << 29);
-  block.TdrP = (RAM_TXBASE & 0xffffff) | (LTXCOUNT << 29);
+       block.Mode = 0;
+       if (dev->flags & IFF_PROMISC)
+               block.Mode |= LANCE_INIT_PROM;
+       memcpy(block.PAdr, dev->dev_addr, 6);
+       memset(block.LAdrF, 0, sizeof(block.LAdrF));
+       block.RdrP = (RAM_RXBASE & 0xffffff) | (LRXCOUNT << 29);
+       block.TdrP = (RAM_TXBASE & 0xffffff) | (LTXCOUNT << 29);
 
-  isa_memcpy_toio(dev->mem_start + RAM_INITBASE, &block, sizeof(block));
+       isa_memcpy_toio(dev->mem_start + RAM_INITBASE, &block,
+                       sizeof(block));
 
-  /* initialize LANCE. Implicitly sets up other structures in RAM. */
+       /* initialize LANCE. Implicitly sets up other structures in RAM. */
 
-  InitLANCE(dev);
+       InitLANCE(dev);
 }
 
 /* deinitialize card and LANCE */
 
 static void DeinitBoard(struct net_device *dev)
 {
-  /* stop LANCE */
+       /* stop LANCE */
 
-  StopLANCE(dev);
+       StopLANCE(dev);
 
-  /* reset board */
+       /* reset board */
 
-  ResetBoard(dev);
+       ResetBoard(dev);
 }
 
 /* ------------------------------------------------------------------------
@@ -477,210 +491,201 @@ static void DeinitBoard(struct net_device *dev)
 
 static u16 irqstart_handler(struct net_device *dev, u16 oldcsr0)
 {
-  /* now we're ready to transmit */
-
-  dev->tbusy = 0;
+       /* now we're ready to transmit */
 
-  /* reset IDON bit, start LANCE */
+       netif_wake_queue(dev);
+       
+       /* reset IDON bit, start LANCE */
 
-  SetLANCE(dev, LANCE_CSR0, oldcsr0 | CSR0_IDON | CSR0_STRT);
-  return GetLANCE(dev, LANCE_CSR0);
+       SetLANCE(dev, LANCE_CSR0, oldcsr0 | CSR0_IDON | CSR0_STRT);
+       return GetLANCE(dev, LANCE_CSR0);
 }
 
 /* receive interrupt */
 
 static u16 irqrx_handler(struct net_device *dev, u16 oldcsr0)
 {
-  skmca_priv *priv = (skmca_priv*) dev->priv;
-  LANCE_RxDescr descr;
-  unsigned int descraddr;
+       skmca_priv *priv = (skmca_priv *) dev->priv;
+       LANCE_RxDescr descr;
+       unsigned int descraddr;
+
+       /* did we loose blocks due to a FIFO overrun ? */
 
-  /* did we loose blocks due to a FIFO overrun ? */
+       if (oldcsr0 & CSR0_MISS)
+               priv->stat.rx_fifo_errors++;
 
-  if (oldcsr0 & CSR0_MISS)
-    priv->stat.rx_fifo_errors++;
+       /* run through queue until we reach a descriptor we do not own */
 
-  /* run through queue until we reach a descriptor we do not own */
+       descraddr = RAM_RXBASE + (priv->nextrx * sizeof(LANCE_RxDescr));
+       while (1) {
+               /* read descriptor */
+               isa_memcpy_fromio(&descr, dev->mem_start + descraddr,
+                                 sizeof(LANCE_RxDescr));
 
-  descraddr = RAM_RXBASE + (priv->nextrx * sizeof(LANCE_RxDescr));
-  while (1)
-  {
-    /* read descriptor */
-    isa_memcpy_fromio(&descr, dev->mem_start + descraddr, sizeof(LANCE_RxDescr));
-    /* if we reach a descriptor we do not own, we're done */
-    if ((descr.Flags & RXDSCR_FLAGS_OWN) != 0)
-      break;
+               /* if we reach a descriptor we do not own, we're done */
+               if ((descr.Flags & RXDSCR_FLAGS_OWN) != 0)
+                       break;
 
 #ifdef DEBUG
-    PrTime(); printk("Receive packet on descr %d len %d\n", priv->nextrx, descr.Len);
+               PrTime();
+               printk("Receive packet on descr %d len %d\n", priv->nextrx,
+                      descr.Len);
 #endif
 
-    /* erroneous packet ? */
-    if ((descr.Flags & RXDSCR_FLAGS_ERR) != 0)
-    {
-      priv->stat.rx_errors++;
-      if ((descr.Flags & RXDSCR_FLAGS_CRC) != 0)
-        priv->stat.rx_crc_errors++;
-      else if ((descr.Flags & RXDSCR_FLAGS_CRC) != 0)
-        priv->stat.rx_frame_errors++;
-      else if ((descr.Flags & RXDSCR_FLAGS_OFLO) != 0)
-        priv->stat.rx_fifo_errors++;
-    }
-
-    /* good packet ? */
-    else
-    {
-      struct sk_buff *skb;
-
-      skb = dev_alloc_skb(descr.Len + 2);
-      if (skb == NULL)
-        priv->stat.rx_dropped++;
-      else
-      {
-        isa_memcpy_fromio(skb_put(skb, descr.Len),
-                      dev->mem_start + descr.LowAddr, descr.Len);
-        skb->dev = dev;
-        skb->protocol = eth_type_trans(skb, dev);
-        skb->ip_summed = CHECKSUM_NONE;
-        priv->stat.rx_packets++;
-#if LINUX_VERSION_CODE >= 0x020119       /* byte counters for >= 2.1.25 */
-        priv->stat.rx_bytes += descr.Len;
+               /* erroneous packet ? */
+               if ((descr.Flags & RXDSCR_FLAGS_ERR) != 0) {
+                       priv->stat.rx_errors++;
+                       if ((descr.Flags & RXDSCR_FLAGS_CRC) != 0)
+                               priv->stat.rx_crc_errors++;
+                       else if ((descr.Flags & RXDSCR_FLAGS_CRC) != 0)
+                               priv->stat.rx_frame_errors++;
+                       else if ((descr.Flags & RXDSCR_FLAGS_OFLO) != 0)
+                               priv->stat.rx_fifo_errors++;
+               }
+
+               /* good packet ? */
+               else {
+                       struct sk_buff *skb;
+
+                       skb = dev_alloc_skb(descr.Len + 2);
+                       if (skb == NULL)
+                               priv->stat.rx_dropped++;
+                       else {
+                               isa_memcpy_fromio(skb_put(skb, descr.Len),
+                                                 dev->mem_start +
+                                                 descr.LowAddr,
+                                                 descr.Len);
+                               skb->dev = dev;
+                               skb->protocol = eth_type_trans(skb, dev);
+                               skb->ip_summed = CHECKSUM_NONE;
+                               priv->stat.rx_packets++;
+#if LINUX_VERSION_CODE >= 0x020119     /* byte counters for >= 2.1.25 */
+                               priv->stat.rx_bytes += descr.Len;
 #endif
-        netif_rx(skb);
-      }
-    }
-
-    /* give descriptor back to LANCE */
-    descr.Len = 0;
-    descr.Flags |= RXDSCR_FLAGS_OWN;
-
-    /* update descriptor in shared RAM */
-    isa_memcpy_toio(dev->mem_start + descraddr, &descr, sizeof(LANCE_RxDescr));
-
-    /* go to next descriptor */
-    priv->nextrx++; descraddr += sizeof(LANCE_RxDescr);
-    if (priv->nextrx >= RXCOUNT)
-    {
-      priv->nextrx = 0;
-      descraddr = RAM_RXBASE;
-    }
-  }
-
-  /* reset RINT bit */
-
-  SetLANCE(dev, LANCE_CSR0, oldcsr0 | CSR0_RINT);
-  return GetLANCE(dev, LANCE_CSR0);
+                               netif_rx(skb);
+                       }
+               }
+
+               /* give descriptor back to LANCE */
+               descr.Len = 0;
+               descr.Flags |= RXDSCR_FLAGS_OWN;
+
+               /* update descriptor in shared RAM */
+               isa_memcpy_toio(dev->mem_start + descraddr, &descr,
+                               sizeof(LANCE_RxDescr));
+
+               /* go to next descriptor */
+               priv->nextrx++;
+               descraddr += sizeof(LANCE_RxDescr);
+               if (priv->nextrx >= RXCOUNT) {
+                       priv->nextrx = 0;
+                       descraddr = RAM_RXBASE;
+               }
+       }
+
+       /* reset RINT bit */
+
+       SetLANCE(dev, LANCE_CSR0, oldcsr0 | CSR0_RINT);
+       return GetLANCE(dev, LANCE_CSR0);
 }
 
 /* transmit interrupt */
 
 static u16 irqtx_handler(struct net_device *dev, u16 oldcsr0)
 {
-  skmca_priv *priv = (skmca_priv*) dev->priv;
-  LANCE_TxDescr descr;
-  unsigned int descraddr;
+       skmca_priv *priv = (skmca_priv *) dev->priv;
+       LANCE_TxDescr descr;
+       unsigned int descraddr;
 
-  /* check descriptors at most until no busy one is left */
+       /* check descriptors at most until no busy one is left */
 
-  descraddr = RAM_TXBASE + (priv->nexttxdone * sizeof(LANCE_TxDescr));
-  while (priv->txbusy > 0)
-  {
-    /* read descriptor */
-    isa_memcpy_fromio(&descr, dev->mem_start + descraddr, sizeof(LANCE_TxDescr));
+       descraddr =
+           RAM_TXBASE + (priv->nexttxdone * sizeof(LANCE_TxDescr));
+       while (priv->txbusy > 0) {
+               /* read descriptor */
+               isa_memcpy_fromio(&descr, dev->mem_start + descraddr,
+                                 sizeof(LANCE_TxDescr));
 
-    /* if the LANCE still owns this one, we've worked out all sent packets */
-    if ((descr.Flags & TXDSCR_FLAGS_OWN) != 0)
-      break;
+               /* if the LANCE still owns this one, we've worked out all sent packets */
+               if ((descr.Flags & TXDSCR_FLAGS_OWN) != 0)
+                       break;
 
 #ifdef DEBUG
-    PrTime(); printk("Send packet done on descr %d\n", priv->nexttxdone);
+               PrTime();
+               printk("Send packet done on descr %d\n", priv->nexttxdone);
 #endif
 
-    /* update statistics */
-    if ((descr.Flags & TXDSCR_FLAGS_ERR) == 0)
-    {
-      priv->stat.tx_packets++;
-#if LINUX_VERSION_CODE >= 0x020119       /* byte counters for >= 2.1.25 */
-      priv->stat.tx_bytes++;
+               /* update statistics */
+               if ((descr.Flags & TXDSCR_FLAGS_ERR) == 0) {
+                       priv->stat.tx_packets++;
+#if LINUX_VERSION_CODE >= 0x020119     /* byte counters for >= 2.1.25 */
+                       priv->stat.tx_bytes++;
 #endif
-    }
-    else
-    {
-      priv->stat.tx_errors++;
-      if ((descr.Status & TXDSCR_STATUS_UFLO) != 0)
-      {
-        priv->stat.tx_fifo_errors++;
-        InitLANCE(dev);
-      }
-      else if ((descr.Status & TXDSCR_STATUS_LCOL) != 0)
-        priv->stat.tx_window_errors++;
-      else if ((descr.Status & TXDSCR_STATUS_LCAR) != 0)
-        priv->stat.tx_carrier_errors++;
-      else if ((descr.Status & TXDSCR_STATUS_RTRY) != 0)
-        priv->stat.tx_aborted_errors++;
-    }
-
-    /* go to next descriptor */
-    priv->nexttxdone++;
-    descraddr += sizeof(LANCE_TxDescr);
-    if (priv->nexttxdone >= TXCOUNT)
-    {
-      priv->nexttxdone = 0;
-      descraddr = RAM_TXBASE;
-    }
-    priv->txbusy--;
-  }
-
-  /* reset TX interrupt bit */
-
-  SetLANCE(dev, LANCE_CSR0, oldcsr0 | CSR0_TINT);
-  oldcsr0 = GetLANCE(dev, LANCE_CSR0);
-
-  /* at least one descriptor is freed.  Therefore we can accept
-     a new one */
-
-  dev->tbusy = 0;
-
-  /* inform upper layers we're in business again */
-
-  mark_bh(NET_BH);
-
-  return oldcsr0;
+               } else {
+                       priv->stat.tx_errors++;
+                       if ((descr.Status & TXDSCR_STATUS_UFLO) != 0) {
+                               priv->stat.tx_fifo_errors++;
+                               InitLANCE(dev);
+                       }
+                               else
+                           if ((descr.Status & TXDSCR_STATUS_LCOL) !=
+                               0) priv->stat.tx_window_errors++;
+                       else if ((descr.Status & TXDSCR_STATUS_LCAR) != 0)
+                               priv->stat.tx_carrier_errors++;
+                       else if ((descr.Status & TXDSCR_STATUS_RTRY) != 0)
+                               priv->stat.tx_aborted_errors++;
+               }
+
+               /* go to next descriptor */
+               priv->nexttxdone++;
+               descraddr += sizeof(LANCE_TxDescr);
+               if (priv->nexttxdone >= TXCOUNT) {
+                       priv->nexttxdone = 0;
+                       descraddr = RAM_TXBASE;
+               }
+               priv->txbusy--;
+       }
+
+       /* reset TX interrupt bit */
+
+       SetLANCE(dev, LANCE_CSR0, oldcsr0 | CSR0_TINT);
+       oldcsr0 = GetLANCE(dev, LANCE_CSR0);
+
+       /* at least one descriptor is freed.  Therefore we can accept
+          a new one */
+
+       netif_wake_queue(dev);
+       
+       return oldcsr0;
 }
 
 /* general interrupt entry */
 
 static void irq_handler(int irq, void *device, struct pt_regs *regs)
 {
-  struct net_device *dev = (struct net_device*) device;
-  u16 csr0val;
-
-  /* read CSR0 to get interrupt cause */
-
-  csr0val = GetLANCE(dev, LANCE_CSR0);
+       struct net_device *dev = (struct net_device *) device;
+       u16 csr0val;
 
-  /* in case we're not meant... */
+       /* read CSR0 to get interrupt cause */
 
-  if ((csr0val & CSR0_INTR) == 0)
-    return;
+       csr0val = GetLANCE(dev, LANCE_CSR0);
 
-  dev->interrupt = 1;
+       /* in case we're not meant... */
 
-  /* loop through the interrupt bits until everything is clear */
+       if ((csr0val & CSR0_INTR) == 0)
+               return;
 
-  do
-  {
-    if ((csr0val & CSR0_IDON) != 0)
-      csr0val = irqstart_handler(dev, csr0val);
-    if ((csr0val & CSR0_RINT) != 0)
-      csr0val = irqrx_handler(dev, csr0val);
-    if ((csr0val & CSR0_TINT) != 0)
-      csr0val = irqtx_handler(dev, csr0val);
-  }
-  while ((csr0val & CSR0_INTR) != 0);
+       /* loop through the interrupt bits until everything is clear */
 
-  dev->interrupt = 0;
+       do {
+               if ((csr0val & CSR0_IDON) != 0)
+                       csr0val = irqstart_handler(dev, csr0val);
+               if ((csr0val & CSR0_RINT) != 0)
+                       csr0val = irqrx_handler(dev, csr0val);
+               if ((csr0val & CSR0_TINT) != 0)
+                       csr0val = irqtx_handler(dev, csr0val);
+       }
+       while ((csr0val & CSR0_INTR) != 0);
 }
 
 /* ------------------------------------------------------------------------
@@ -691,184 +696,177 @@ static void irq_handler(int irq, void *device, struct pt_regs *regs)
 
 static int skmca_getinfo(char *buf, int slot, void *d)
 {
-  int len = 0, i;
-  struct net_device *dev = (struct net_device*) d;
-  skmca_priv *priv;
-  
-  /* can't say anything about an uninitialized device... */
-
-  if (dev == NULL)
-    return len;
-  if (dev->priv == NULL)
-    return len;
-  priv = (skmca_priv*) dev->priv;
-
-  /* print info */
-
-  len += sprintf(buf + len, "IRQ: %d\n", priv->realirq);
-  len += sprintf(buf + len, "Memory: %#lx-%#lx\n", dev->mem_start,
-                 dev->mem_end - 1);
-  len += sprintf(buf + len, "Transceiver: %s\n", MediaNames[priv->medium]);
-  len += sprintf(buf + len, "Device: %s\n", dev->name);
-  len += sprintf(buf + len, "MAC address:");
-  for (i = 0; i < 6; i ++ )
-    len += sprintf( buf+len, " %02x", dev->dev_addr[i] );
-  buf[len++] = '\n';
-  buf[len] = 0;
-
-  return len;
+       int len = 0, i;
+       struct net_device *dev = (struct net_device *) d;
+       skmca_priv *priv;
+
+       /* can't say anything about an uninitialized device... */
+
+       if (dev == NULL)
+               return len;
+       if (dev->priv == NULL)
+               return len;
+       priv = (skmca_priv *) dev->priv;
+
+       /* print info */
+
+       len += sprintf(buf + len, "IRQ: %d\n", priv->realirq);
+       len += sprintf(buf + len, "Memory: %#lx-%#lx\n", dev->mem_start,
+                      dev->mem_end - 1);
+       len +=
+           sprintf(buf + len, "Transceiver: %s\n",
+                   MediaNames[priv->medium]);
+       len += sprintf(buf + len, "Device: %s\n", dev->name);
+       len += sprintf(buf + len, "MAC address:");
+       for (i = 0; i < 6; i++)
+               len += sprintf(buf + len, " %02x", dev->dev_addr[i]);
+       buf[len++] = '\n';
+       buf[len] = 0;
+
+       return len;
 }
 
 /* open driver.  Means also initialization and start of LANCE */
 
 static int skmca_open(struct net_device *dev)
 {
-  int result;
-  skmca_priv *priv = (skmca_priv*) dev->priv;
-
-  /* register resources - only necessary for IRQ */
-  result = request_irq(priv->realirq, irq_handler, SA_SHIRQ | SA_SAMPLE_RANDOM,
-                       "sk_mca", dev);
-  if (result != 0)
-  {
-    printk("%s: failed to register irq %d\n", dev->name, dev->irq);
-    return result;
-  }
-  dev->irq = priv->realirq;
-
-  /* set up the card and LANCE */
-  InitBoard(dev);
+       int result;
+       skmca_priv *priv = (skmca_priv *) dev->priv;
+
+       /* register resources - only necessary for IRQ */
+       result =
+           request_irq(priv->realirq, irq_handler,
+                       SA_SHIRQ | SA_SAMPLE_RANDOM, "sk_mca", dev);
+       if (result != 0) {
+               printk("%s: failed to register irq %d\n", dev->name,
+                      dev->irq);
+               return result;
+       }
+       dev->irq = priv->realirq;
+
+       /* set up the card and LANCE */
+       InitBoard(dev);
 
 #ifdef MODULE
-  MOD_INC_USE_COUNT;
+       MOD_INC_USE_COUNT;
 #endif
 
-  return 0;
+       return 0;
 }
 
 /* close driver.  Shut down board and free allocated resources */
 
 static int skmca_close(struct net_device *dev)
 {
-  /* turn off board */
-  DeinitBoard(dev);
+       /* turn off board */
+       DeinitBoard(dev);
 
-  /* release resources */
-  if (dev->irq != 0)
-    free_irq(dev->irq, dev);
-  dev->irq = 0;
+       /* release resources */
+       if (dev->irq != 0)
+               free_irq(dev->irq, dev);
+       dev->irq = 0;
 
 #ifdef MODULE
-  MOD_DEC_USE_COUNT;
+       MOD_DEC_USE_COUNT;
 #endif
 
-  return 0;
+       return 0;
 }
 
 /* transmit a block. */
 
 static int skmca_tx(struct sk_buff *skb, struct net_device *dev)
 {
-  skmca_priv *priv = (skmca_priv*) dev->priv;
-  LANCE_TxDescr descr;
-  unsigned int address;
-  int tmplen, retval = 0;
-  unsigned long flags;
-
-  /* if we get called with a NULL descriptor, the Ethernet layer thinks 
-     our card is stuck an we should reset it.  We'll do this completely: */
-
-  if (skb == NULL)
-  {
-    DeinitBoard(dev);
-    InitBoard(dev);
-    return 0; /* don't try to free the block here ;-) */
-  }
-
-  /* is there space in the Tx queue ? If no, the upper layer gave us a
-     packet in spite of us not being ready and is really in trouble.
-     We'll do the dropping for him: */
-  if (priv->txbusy >= TXCOUNT)
-  {
-    priv->stat.tx_dropped++;
-    retval = -EIO;
-    goto tx_done;
-  }
-
-  /* get TX descriptor */
-  address = RAM_TXBASE + (priv->nexttxput * sizeof(LANCE_TxDescr));
-  isa_memcpy_fromio(&descr, dev->mem_start + address, sizeof(LANCE_TxDescr));
-
-  /* enter packet length as 2s complement - assure minimum length */
-  tmplen = skb->len;
-  if (tmplen < 60)
-    tmplen = 60;
-  descr.Len = 65536 - tmplen;
-
-  /* copy filler into RAM - in case we're filling up... 
-     we're filling a bit more than necessary, but that doesn't harm
-     since the buffer is far larger... */
-  if (tmplen > skb->len)
-  {
-    char *fill = "NetBSD is a nice OS too! ";
-    unsigned int destoffs = 0, l = strlen(fill);
-
-    while (destoffs < tmplen)
-    {
-      isa_memcpy_toio(dev->mem_start + descr.LowAddr + destoffs, fill, l);
-      destoffs += l;
-    }
-  }
-
-  /* do the real data copying */
-  isa_memcpy_toio(dev->mem_start + descr.LowAddr, skb->data, skb->len);
-
-  /* hand descriptor over to LANCE - this is the first and last chunk */
-  descr.Flags = TXDSCR_FLAGS_OWN | TXDSCR_FLAGS_STP | TXDSCR_FLAGS_ENP;
+       skmca_priv *priv = (skmca_priv *) dev->priv;
+       LANCE_TxDescr descr;
+       unsigned int address;
+       int tmplen, retval = 0;
+       unsigned long flags;
+
+       netif_stop_queue(dev);
+       
+       /* is there space in the Tx queue ? If no, the upper layer gave us a
+          packet in spite of us not being ready and is really in trouble.
+          We'll do the dropping for him: */
+       if (priv->txbusy >= TXCOUNT) {
+               priv->stat.tx_dropped++;
+               retval = -EIO;
+               goto tx_done;
+       }
+
+       /* get TX descriptor */
+       address = RAM_TXBASE + (priv->nexttxput * sizeof(LANCE_TxDescr));
+       isa_memcpy_fromio(&descr, dev->mem_start + address,
+                         sizeof(LANCE_TxDescr));
+
+       /* enter packet length as 2s complement - assure minimum length */
+       tmplen = skb->len;
+       if (tmplen < 60)
+               tmplen = 60;
+       descr.Len = 65536 - tmplen;
+
+       /* copy filler into RAM - in case we're filling up... 
+          we're filling a bit more than necessary, but that doesn't harm
+          since the buffer is far larger... */
+       if (tmplen > skb->len) {
+               char *fill = "NetBSD is a nice OS too! ";
+               unsigned int destoffs = 0, l = strlen(fill);
+
+               while (destoffs < tmplen) {
+                       isa_memcpy_toio(dev->mem_start + descr.LowAddr +
+                                       destoffs, fill, l);
+                       destoffs += l;
+               }
+       }
+
+       /* do the real data copying */
+       isa_memcpy_toio(dev->mem_start + descr.LowAddr, skb->data,
+                       skb->len);
+
+       /* hand descriptor over to LANCE - this is the first and last chunk */
+       descr.Flags =
+           TXDSCR_FLAGS_OWN | TXDSCR_FLAGS_STP | TXDSCR_FLAGS_ENP;
 
 #ifdef DEBUG
-  PrTime(); printk("Send packet on descr %d len %d\n", priv->nexttxput, skb->len);
+       PrTime();
+       printk("Send packet on descr %d len %d\n", priv->nexttxput,
+              skb->len);
 #endif
 
-  /* one more descriptor busy */
-  save_flags(flags);
-  cli();
-  priv->nexttxput++;
-  if (priv->nexttxput >= TXCOUNT)
-    priv->nexttxput = 0;
-  priv->txbusy++;
-  dev->tbusy = (priv->txbusy >= TXCOUNT);
+       /* one more descriptor busy */
+       save_flags(flags);
+       cli();
+       priv->nexttxput++;
+       if (priv->nexttxput >= TXCOUNT)
+               priv->nexttxput = 0;
+       priv->txbusy++;
+       if (priv->txbusy < TXCOUNT)
+               netif_wake_queue(dev);
 
-  /* write descriptor back to RAM */
-  isa_memcpy_toio(dev->mem_start + address, &descr, sizeof(LANCE_TxDescr));
+       /* write descriptor back to RAM */
+       isa_memcpy_toio(dev->mem_start + address, &descr,
+                       sizeof(LANCE_TxDescr));
 
-  /* if no descriptors were active, give the LANCE a hint to read it
-     immediately */
+       /* if no descriptors were active, give the LANCE a hint to read it
+          immediately */
 
-  if (priv->txbusy == 0)
-    SetLANCE(dev, LANCE_CSR0, CSR0_INEA | CSR0_TDMD);
+       if (priv->txbusy == 0)
+               SetLANCE(dev, LANCE_CSR0, CSR0_INEA | CSR0_TDMD);
 
-  restore_flags(flags);
+       restore_flags(flags);
 
 tx_done:
-
-  /* When did that change exactly ? */
-
-#if LINUX_VERSION_CODE >= 0x020200
-  dev_kfree_skb(skb);
-#else
-  dev_kfree_skb(skb, FREE_WRITE);
-#endif
-  return retval;
+       /* When did that change exactly ? */
+       dev_kfree_skb(skb);
+       return retval;
 }
 
 /* return pointer to Ethernet statistics */
 
 static struct enet_statistics *skmca_stats(struct net_device *dev)
 {
-  skmca_priv *priv = (skmca_priv*) dev->priv;
-
-  return &(priv->stat);
+       skmca_priv *priv = (skmca_priv *) dev->priv;
+       return &(priv->stat);
 }
 
 /* we don't support runtime reconfiguration, since an MCA card can
@@ -876,7 +874,7 @@ static struct enet_statistics *skmca_stats(struct net_device *dev)
 
 static int skmca_config(struct net_device *dev, struct ifmap *map)
 {
-  return 0;
+       return 0;
 }
 
 /* switch receiver mode.  We use the LANCE's multicast filter to prefilter
@@ -884,39 +882,38 @@ static int skmca_config(struct net_device *dev, struct ifmap *map)
 
 static void skmca_set_multicast_list(struct net_device *dev)
 {
-  LANCE_InitBlock block;
-
-  /* first stop the LANCE... */
-  StopLANCE(dev);
-
-  /* ...then modify the initialization block... */
-  isa_memcpy_fromio(&block, dev->mem_start + RAM_INITBASE, sizeof(block));
-  if (dev->flags & IFF_PROMISC)
-    block.Mode |= LANCE_INIT_PROM;
-  else
-    block.Mode &= ~LANCE_INIT_PROM;
-
-  if (dev->flags & IFF_ALLMULTI)   /* get all multicasts */
-  {
-    memset(block.LAdrF, 8, 0xff);
-  }
-  else                             /* get selected/no multicasts */
-  {
-    struct dev_mc_list *mptr;
-    int code;
-
-    memset(block.LAdrF, 8, 0x00);
-    for (mptr = dev->mc_list; mptr != NULL; mptr = mptr->next)
-    {
-      code = GetHash(mptr->dmi_addr);
-      block.LAdrF[(code >> 3) & 7] |= 1 << (code & 7);
-    }
-  }
-
-  isa_memcpy_toio(dev->mem_start + RAM_INITBASE, &block, sizeof(block));
-
-  /* ...then reinit LANCE with the correct flags */
-  InitLANCE(dev);
+       LANCE_InitBlock block;
+
+       /* first stop the LANCE... */
+       StopLANCE(dev);
+
+       /* ...then modify the initialization block... */
+       isa_memcpy_fromio(&block, dev->mem_start + RAM_INITBASE,
+                         sizeof(block));
+       if (dev->flags & IFF_PROMISC)
+               block.Mode |= LANCE_INIT_PROM;
+       else
+               block.Mode &= ~LANCE_INIT_PROM;
+
+       if (dev->flags & IFF_ALLMULTI) {        /* get all multicasts */
+               memset(block.LAdrF, 8, 0xff);
+       } else {                /* get selected/no multicasts */
+
+               struct dev_mc_list *mptr;
+               int code;
+
+               memset(block.LAdrF, 8, 0x00);
+               for (mptr = dev->mc_list; mptr != NULL; mptr = mptr->next) {
+                       code = GetHash(mptr->dmi_addr);
+                       block.LAdrF[(code >> 3) & 7] |= 1 << (code & 7);
+               }
+       }
+
+       isa_memcpy_toio(dev->mem_start + RAM_INITBASE, &block,
+                       sizeof(block));
+
+       /* ...then reinit LANCE with the correct flags */
+       InitLANCE(dev);
 }
 
 /* ------------------------------------------------------------------------
@@ -924,149 +921,143 @@ static void skmca_set_multicast_list(struct net_device *dev)
  * ------------------------------------------------------------------------ */
 
 #ifdef MODULE
-static int startslot; /* counts through slots when probing multiple devices */
+static int startslot;          /* counts through slots when probing multiple devices */
 #else
-#define startslot 0   /* otherwise a dummy, since there is only eth0 in-kern*/
+#define startslot 0            /* otherwise a dummy, since there is only eth0 in-kern */
 #endif
 
 int skmca_probe(struct net_device *dev)
 {
-  int force_detect = 0;
-  int junior, slot, i;
-  int base = 0, irq = 0;
-  skmca_priv *priv;
-  skmca_medium medium;
+       int force_detect = 0;
+       int junior, slot, i;
+       int base = 0, irq = 0;
+       skmca_priv *priv;
+       skmca_medium medium;
 
-  /* can't work without an MCA bus ;-) */
-  
-  if (MCA_bus == 0)
-    return ENODEV;
-    
-  /* start address of 1 --> forced detection */
-  
-  if (dev->mem_start == 1)
-    force_detect = 1;
+       /* can't work without an MCA bus ;-) */
 
-  /* search through slots */
-  
-  if (dev != NULL)
-  {
-    base = dev->mem_start;
-    irq = dev->irq;
-  }
-  slot = dofind(&junior, startslot);
+       if (MCA_bus == 0)
+               return ENODEV;
+
+       /* start address of 1 --> forced detection */
+
+       if (dev->mem_start == 1)
+               force_detect = 1;
+
+       /* search through slots */
+
+       if (dev != NULL) {
+               base = dev->mem_start;
+               irq = dev->irq;
+       }
+       slot = dofind(&junior, startslot);
 
-  while (slot != -1)
-  {
-    /* deduce card addresses */
+       while (slot != -1) {
+               /* deduce card addresses */
 
-    getaddrs(slot, junior, &base, &irq, &medium);
+               getaddrs(slot, junior, &base, &irq, &medium);
 
 #if LINUX_VERSION_CODE >= 0x020200
-    /* slot already in use ? */
+               /* slot already in use ? */
 
-    if (mca_is_adapter_used(slot))
-    {
-      slot = dofind(&junior, slot + 1);
-      continue;
-    }
+               if (mca_is_adapter_used(slot)) {
+                       slot = dofind(&junior, slot + 1);
+                       continue;
+               }
 #endif
 
-    /* were we looking for something different ? */
-    
-    if ((dev->irq != 0) || (dev->mem_start != 0))
-    {
-      if ((dev->irq != 0) && (dev->irq != irq))
-      {
-        slot = dofind(&junior, slot + 1);
-        continue;
-      }
-      if ((dev->mem_start != 0) && (dev->mem_start != base))
-      {
-        slot = dofind(&junior, slot + 1);
-        continue;
-      }
-    }
-  
-    /* found something that matches */
-    
-    break;
-  }
+               /* were we looking for something different ? */
 
-  /* nothing found ? */
-  
-  if (slot == -1)
-    return ((base != 0) || (irq != 0)) ? ENXIO : ENODEV;
-    
-  /* make procfs entries */
-    
-  if (junior)
-    mca_set_adapter_name(slot, "SKNET junior MC2 Ethernet Adapter");
-  else
-    mca_set_adapter_name(slot, "SKNET MC2+ Ethernet Adapter");
-  mca_set_adapter_procfn(slot, (MCA_ProcFn) skmca_getinfo, dev);
+               if ((dev->irq != 0) || (dev->mem_start != 0)) {
+                       if ((dev->irq != 0) && (dev->irq != irq)) {
+                               slot = dofind(&junior, slot + 1);
+                               continue;
+                       }
+                       if ((dev->mem_start != 0)
+                           && (dev->mem_start != base)) {
+                               slot = dofind(&junior, slot + 1);
+                               continue;
+                       }
+               }
+
+               /* found something that matches */
+
+               break;
+       }
+
+       /* nothing found ? */
+
+       if (slot == -1)
+               return ((base != 0) || (irq != 0)) ? ENXIO : ENODEV;
+
+       /* make procfs entries */
+
+       if (junior)
+               mca_set_adapter_name(slot,
+                                    "SKNET junior MC2 Ethernet Adapter");
+       else
+               mca_set_adapter_name(slot, "SKNET MC2+ Ethernet Adapter");
+       mca_set_adapter_procfn(slot, (MCA_ProcFn) skmca_getinfo, dev);
 
 #if LINUX_VERSION_CODE >= 0x020200
-  mca_mark_as_used(slot);
+       mca_mark_as_used(slot);
 #endif
-  
-  /* announce success */
-  printk("%s: SKNet %s adapter found in slot %d\n", dev->name, 
-         junior ? "Junior MC2" : "MC2+", slot + 1);
-
-  /* allocate structure */
-  priv = dev->priv = (skmca_priv*) kmalloc(sizeof(skmca_priv), GFP_KERNEL);
-  priv->slot = slot;
-  priv->macbase = base + 0x3fc0;
-  priv->ioregaddr = base + 0x3ff0;
-  priv->ctrladdr = base + 0x3ff2;
-  priv->cmdaddr = base + 0x3ff3;
-  priv->realirq = irq;
-  priv->medium = medium;
-  memset(&(priv->stat), 0, sizeof(struct enet_statistics));
-  
-  /* set base + irq for this device (irq not allocated so far) */
-  dev->irq = 0;
-  dev->mem_start = base;
-  dev->mem_end = base + 0x4000;
-  /* set methods */
-  dev->open = skmca_open;
-  dev->stop = skmca_close;
-  dev->set_config = skmca_config;
-  dev->hard_start_xmit = skmca_tx;
-  dev->do_ioctl = NULL;
-  dev->get_stats = skmca_stats;
-  dev->set_multicast_list = skmca_set_multicast_list;
-  dev->flags |= IFF_MULTICAST;
-
-  /* generic setup */
-  ether_setup(dev);
-  dev->interrupt = 0;
-  dev->tbusy = 0;
-  dev->start = 0;
-  /* copy out MAC address */
-  for (i = 0; i < 6; i++)
-    dev->dev_addr[i] = readb(priv->macbase + (i << 1));
-
-  /* print config */
-  printk("%s: IRQ %d, memory %#lx-%#lx, "
-         "MAC address %02x:%02x:%02x:%02x:%02x:%02x.\n",
-         dev->name, priv->realirq,  dev->mem_start, dev->mem_end - 1,
-         dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
-         dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
-  printk("%s: %s medium\n", dev->name, MediaNames[priv->medium]);
-
-  /* reset board */
-
-  ResetBoard(dev);
+
+       /* announce success */
+       printk("%s: SKNet %s adapter found in slot %d\n", dev->name,
+              junior ? "Junior MC2" : "MC2+", slot + 1);
+
+       /* allocate structure */
+       priv = dev->priv =
+           (skmca_priv *) kmalloc(sizeof(skmca_priv), GFP_KERNEL);
+       priv->slot = slot;
+       priv->macbase = base + 0x3fc0;
+       priv->ioregaddr = base + 0x3ff0;
+       priv->ctrladdr = base + 0x3ff2;
+       priv->cmdaddr = base + 0x3ff3;
+       priv->realirq = irq;
+       priv->medium = medium;
+       memset(&(priv->stat), 0, sizeof(struct enet_statistics));
+
+       /* set base + irq for this device (irq not allocated so far) */
+       dev->irq = 0;
+       dev->mem_start = base;
+       dev->mem_end = base + 0x4000;
+
+       /* set methods */
+       dev->open = skmca_open;
+       dev->stop = skmca_close;
+       dev->set_config = skmca_config;
+       dev->hard_start_xmit = skmca_tx;
+       dev->do_ioctl = NULL;
+       dev->get_stats = skmca_stats;
+       dev->set_multicast_list = skmca_set_multicast_list;
+       dev->flags |= IFF_MULTICAST;
+
+       /* generic setup */
+       ether_setup(dev);
+
+       /* copy out MAC address */
+       for (i = 0; i < 6; i++)
+               dev->dev_addr[i] = readb(priv->macbase + (i << 1));
+
+       /* print config */
+       printk("%s: IRQ %d, memory %#lx-%#lx, "
+              "MAC address %02x:%02x:%02x:%02x:%02x:%02x.\n",
+              dev->name, priv->realirq, dev->mem_start, dev->mem_end - 1,
+              dev->dev_addr[0], dev->dev_addr[1], dev->dev_addr[2],
+              dev->dev_addr[3], dev->dev_addr[4], dev->dev_addr[5]);
+       printk("%s: %s medium\n", dev->name, MediaNames[priv->medium]);
+
+       /* reset board */
+
+       ResetBoard(dev);
 
 #ifdef MODULE
-  startslot = slot + 1;
+       startslot = slot + 1;
 #endif
 
-  return 0;
+       return 0;
 }
 
 /* ------------------------------------------------------------------------
@@ -1079,61 +1070,58 @@ int skmca_probe(struct net_device *dev)
 
 static char NameSpace[8 * DEVMAX];
 static struct net_device moddevs[DEVMAX] =
-       {{NameSpace +  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, skmca_probe},
-        {NameSpace +  8, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, skmca_probe},
-        {NameSpace + 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, skmca_probe},
-        {NameSpace + 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, skmca_probe},
-        {NameSpace + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, skmca_probe}};
+    { {NameSpace + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, skmca_probe},
+{NameSpace + 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, skmca_probe},
+{NameSpace + 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, skmca_probe},
+{NameSpace + 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, skmca_probe},
+{NameSpace + 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, NULL, skmca_probe}
+};
 
-int irq=0;
-int io=0;
+int irq = 0;
+int io = 0;
 
 int init_module(void)
 {
-  int z, res;
-
-  startslot = 0;
-  for (z = 0; z < DEVMAX; z++)
-  {
-    strcpy(moddevs[z].name, "     ");
-    res = register_netdev(moddevs + z);
-    if (res != 0)
-      return (z > 0) ? 0 : -EIO;
-  }
-
-  return 0;
+       int z, res;
+
+       startslot = 0;
+       for (z = 0; z < DEVMAX; z++) {
+               strcpy(moddevs[z].name, "     ");
+               res = register_netdev(moddevs + z);
+               if (res != 0)
+                       return (z > 0) ? 0 : -EIO;
+       }
+
+       return 0;
 }
 
 void cleanup_module(void)
 {
-  struct net_device *dev;
-  skmca_priv *priv;
-  int z;
-
-  if (MOD_IN_USE)
-  {
-    printk("cannot unload, module in use\n");
-    return;
-  }
-
-  for (z = 0; z < DEVMAX; z++)
-  {
-    dev = moddevs + z;
-    if (dev->priv != NULL)
-    {
-      priv = (skmca_priv*) dev->priv;
-      DeinitBoard(dev);
-      if (dev->irq != 0)
-        free_irq(dev->irq, dev);
-      dev->irq = 0;
-      unregister_netdev(dev);
+       struct net_device *dev;
+       skmca_priv *priv;
+       int z;
+
+       if (MOD_IN_USE) {
+               printk("cannot unload, module in use\n");
+               return;
+       }
+
+       for (z = 0; z < DEVMAX; z++) {
+               dev = moddevs + z;
+               if (dev->priv != NULL) {
+                       priv = (skmca_priv *) dev->priv;
+                       DeinitBoard(dev);
+                       if (dev->irq != 0)
+                               free_irq(dev->irq, dev);
+                       dev->irq = 0;
+                       unregister_netdev(dev);
 #if LINUX_VERSION_CODE >= 0x020200
-      mca_mark_as_unused(priv->slot);
+                       mca_mark_as_unused(priv->slot);
 #endif
-      mca_set_adapter_procfn(priv->slot, NULL, NULL);
-      kfree_s(dev->priv, sizeof(skmca_priv));
-      dev->priv = NULL;
-    }
-  }
+                       mca_set_adapter_procfn(priv->slot, NULL, NULL);
+                       kfree_s(dev->priv, sizeof(skmca_priv));
+                       dev->priv = NULL;
+               }
+       }
 }
-#endif /* MODULE */
+#endif                         /* MODULE */
index 6a5555983f9e9de55805aeecbd085d8a199b082d..217159ea77e9babcd91ed6bb78782f6eec431142 100644 (file)
@@ -403,8 +403,7 @@ ultra_close_card(struct net_device *dev)
 {
        int ioaddr = dev->base_addr - ULTRA_NIC_OFFSET; /* CMDREG */
 
-       dev->start = 0;
-       dev->tbusy = 1;
+       netif_stop_queue(dev);
 
        if (ei_debug > 1)
                printk("%s: Shutting down ethercard.\n", dev->name);
index 4657500f0d8bd874ded754b4f82df21d7ef8ed65..22fdc650551aaf9e782ffa81abf143a525cbebb4 100644 (file)
@@ -265,9 +265,8 @@ static int ultra32_close(struct net_device *dev)
 {
        int ioaddr = dev->base_addr - ULTRA32_NIC_OFFSET; /* CMDREG */
 
-       dev->start = 0;
-       dev->tbusy = 1;
-
+       netif_stop_queue(dev);
+       
        if (ei_debug > 1)
                printk("%s: Shutting down ethercard.\n", dev->name);
 
index 9b21a13ea54bfe03f7a03cd5d568aba2201af8d0..8ea4db90b599a96f44526d146772347082ba5c98 100644 (file)
  *                            driver (almost)
  *                          - Other minor stuff
  *
+ *     v1.4 Feb 10, 2000    - Updated with more changes required after Dave's
+ *                            network cleanup in 2.3.43pre7 (Tigran & myself)
+ *                          - Minor stuff.
+ *
  *******************************************************************************/
 
 
@@ -102,7 +106,7 @@ static      int             bbuf = 0;
 static u8              *TLanPadBuffer;
 static char            TLanSignature[] = "TLAN";
 static int             TLanVersionMajor = 1;
-static int             TLanVersionMinor = 3;
+static int             TLanVersionMinor = 4;
 
 
 static TLanAdapterEntry TLanAdapterList[] __initdata = {
@@ -361,7 +365,7 @@ static int __init tlan_probe(void)
        u32                io_base, index;
        int                found;
        
-       printk(KERN_INFO "ThunderLAN driver v%d.%d:\n", 
+       printk(KERN_INFO "ThunderLAN driver v%d.%d\n", 
                                        TLanVersionMajor,
                                        TLanVersionMinor);
 
@@ -461,7 +465,7 @@ module_exit(tlan_exit);
         *
         **************************************************************/
 
-int TLan_PciProbe(u8 *pci_dfn, u8 *pci_irq, u8 *pci_rev, u32 *pci_io_base, u32 *dl_ix )
+static int __init TLan_PciProbe(u8 *pci_dfn, u8 *pci_irq, u8 *pci_rev, u32 *pci_io_base, u32 *dl_ix )
 {
        static int dl_index = 0;
        static struct pci_dev * pdev = NULL;
@@ -626,7 +630,7 @@ static int TLan_Init( struct net_device *dev )
         *
         **************************************************************/
 
-int TLan_Open( struct net_device *dev )
+static int TLan_Open( struct net_device *dev )
 {
        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        int             err;
@@ -642,7 +646,7 @@ int TLan_Open( struct net_device *dev )
        }
        
        netif_start_queue(dev);
-
+       
        /* NOTE: It might not be necessary to read the stats before a
                         reset if you don't care what the values are.
        */
@@ -680,7 +684,7 @@ int TLan_Open( struct net_device *dev )
         *
         **************************************************************/
 
-int TLan_StartTx( struct sk_buff *skb, struct net_device *dev )
+static int TLan_StartTx( struct sk_buff *skb, struct net_device *dev )
 {
        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        TLanList        *tail_list;
@@ -690,7 +694,10 @@ int TLan_StartTx( struct sk_buff *skb, struct net_device *dev )
 
        if ( ! priv->phyOnline ) {
                TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT:  %s PHY is not ready\n", dev->name );
-               dev_kfree_skb( skb );
+               if (in_irq())
+                       dev_kfree_skb_irq(skb);
+               else
+                       dev_kfree_skb(skb);
                return 0;
        }
 
@@ -748,7 +755,10 @@ int TLan_StartTx( struct sk_buff *skb, struct net_device *dev )
        CIRC_INC( priv->txTail, TLAN_NUM_TX_LISTS );
 
        if ( bbuf ) {
-               dev_kfree_skb( skb );
+               if (in_irq())
+                       dev_kfree_skb_irq(skb);
+               else
+                       dev_kfree_skb(skb);
        }
                
        dev->trans_start = jiffies;
@@ -780,7 +790,7 @@ int TLan_StartTx( struct sk_buff *skb, struct net_device *dev )
         *
         **************************************************************/
 
-void TLan_HandleInterrupt(int irq, void *dev_id, struct pt_regs *regs)
+static void TLan_HandleInterrupt(int irq, void *dev_id, struct pt_regs *regs)
 {
        u32             ack;
        struct net_device       *dev;
@@ -828,7 +838,7 @@ void TLan_HandleInterrupt(int irq, void *dev_id, struct pt_regs *regs)
         *
         **************************************************************/
 
-int TLan_Close(struct net_device *dev)
+static int TLan_Close(struct net_device *dev)
 {
        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
 
@@ -866,7 +876,7 @@ int TLan_Close(struct net_device *dev)
         *
         **************************************************************/
 
-struct net_device_stats *TLan_GetStats( struct net_device *dev )
+static struct net_device_stats *TLan_GetStats( struct net_device *dev )
 {
        TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;
        int i;
@@ -914,7 +924,7 @@ struct net_device_stats *TLan_GetStats( struct net_device *dev )
         *
         **************************************************************/
 
-void TLan_SetMulticastList( struct net_device *dev )
+static void TLan_SetMulticastList( struct net_device *dev )
 {      
        struct dev_mc_list      *dmi = dev->mc_list;
        u32                     hash1 = 0;
@@ -1033,7 +1043,11 @@ u32 TLan_HandleTxEOF( struct net_device *dev, u16 host_int )
        head_list = priv->txList + priv->txHead;
 
        if ( ! bbuf ) {
-               dev_kfree_skb( (struct sk_buff *) head_list->buffer[9].address );
+               if (in_irq())
+                       dev_kfree_skb_irq( (struct sk_buff *) head_list->buffer[9].address );
+               else
+                       dev_kfree_skb( (struct sk_buff *) head_list->buffer[9].address );
+               
                head_list->buffer[9].address = 0;
        }
 
@@ -1046,7 +1060,9 @@ u32 TLan_HandleTxEOF( struct net_device *dev, u16 host_int )
        priv->stats.tx_bytes += head_list->frameSize;
 
        head_list->cStat = TLAN_CSTAT_UNUSED;
+       
        netif_start_queue(dev);
+       
        CIRC_INC( priv->txHead, TLAN_NUM_TX_LISTS );
        if ( eoc ) {
                TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT:  Handling TX EOC (Head=%d Tail=%d)\n", priv->txHead, priv->txTail );
@@ -2413,6 +2429,7 @@ int TLan_MiiReadReg( struct net_device *dev, u16 phy, u16 reg, u16 *val )
        *val = tmp;
 
        spin_unlock_irqrestore(&priv->lock, flags);
+
        return err;
 
 } /* TLan_MiiReadReg */
@@ -2552,6 +2569,7 @@ void TLan_MiiWriteReg( struct net_device *dev, u16 phy, u16 reg, u16 val )
                TLan_SetBit( TLAN_NET_SIO_MINTEN, sio );
 
        spin_unlock_irqrestore(&priv->lock, flags);
+
 } /* TLan_MiiWriteReg */
 
 
@@ -2775,9 +2793,9 @@ int TLan_EeReadByte( struct net_device *dev, u8 ee_addr, u8 *data )
                goto fail;
        }
        TLan_EeReceiveByte( dev->base_addr, data, TLAN_EEPROM_STOP );
-
 fail:
        spin_unlock_irqrestore(&priv->lock, flags);
+
        return ret;
 
 } /* TLan_EeReadByte */
index 26956af06f30d22a3385c39201977262f4c65c77..0c45caf2451a0f9ccb53fe0930db7276834b55f5 100644 (file)
@@ -833,11 +833,8 @@ static int tok_open(struct net_device *dev)
        if (ti->open_status==IN_PROGRESS) sleep_on(&ti->wait_for_reset);
 
        if (ti->open_status==SUCCESS) {
-               dev->tbusy=0;
-               dev->interrupt=0;
-               dev->start=1;
                /* NEED to see smem size *AND* reset high 512 bytes if needed */
-
+               netif_start_queue(dev);
                MOD_INC_USE_COUNT;
 
                return 0;
@@ -850,6 +847,8 @@ static int tok_close(struct net_device *dev)
 
        struct tok_info *ti=(struct tok_info *) dev->priv;
 
+       netif_stop_queue(dev);
+       
        isa_writeb(DIR_CLOSE_ADAPTER,
               ti->srb + offsetof(struct srb_close_adapter, command));
        isa_writeb(CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
@@ -862,7 +861,6 @@ static int tok_close(struct net_device *dev)
                DPRINTK("close adapter failed: %02X\n",
                        (int)isa_readb(ti->srb + offsetof(struct srb_close_adapter, ret_code)));
 
-        dev->start = 0;
 #ifdef PCMCIA
        ti->sram = 0 ;
 #endif
@@ -886,7 +884,6 @@ void tok_interrupt (int irq, void *dev_id, struct pt_regs *regs)
        spin_lock(&(ti->lock));
 
        /* Disable interrupts till processing is finished */
-       dev->interrupt=1;
        isa_writeb((~INT_ENABLE), ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_EVEN);
 
        /* Reset interrupt for ISA boards */
@@ -911,7 +908,6 @@ void tok_interrupt (int irq, void *dev_id, struct pt_regs *regs)
                        {
                          DPRINTK("PCMCIA card removed.\n");
                          spin_unlock(&(ti->lock));
-                         dev->interrupt = 0;
                          return;
                        }
 
@@ -920,7 +916,6 @@ void tok_interrupt (int irq, void *dev_id, struct pt_regs *regs)
                {
                         DPRINTK("PCMCIA card removed.\n");
                         spin_unlock(&(ti->lock));
-                        dev->interrupt = 0;
                         return;
                 }
 #endif
@@ -941,7 +936,6 @@ void tok_interrupt (int irq, void *dev_id, struct pt_regs *regs)
 
                        isa_writeb((~ADAP_CHK_INT), ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_ODD);
                        isa_writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET  + ISRP_EVEN);
-                       dev->interrupt=0;
 
                } else if (isa_readb(ti->mmio + ACA_OFFSET + ACA_RW + ISRP_EVEN)
                                 & (TCR_INT | ERR_INT | ACCESS_INT)) {
@@ -951,7 +945,6 @@ void tok_interrupt (int irq, void *dev_id, struct pt_regs *regs)
                        isa_writeb(~(TCR_INT | ERR_INT | ACCESS_INT),
                               ti->mmio + ACA_OFFSET + ACA_RESET + ISRP_EVEN);
                        isa_writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET  + ISRP_EVEN);
-                       dev->interrupt=0;
 
                } else if (status
                           & (SRB_RESP_INT | ASB_FREE_INT | ARB_CMD_INT | SSB_RESP_INT)) {
@@ -972,7 +965,7 @@ void tok_interrupt (int irq, void *dev_id, struct pt_regs *regs)
                                                              dev_kfree_skb(ti->current_skb);
                                                              ti->current_skb=NULL;
                                                      }
-                                                     dev->tbusy=0;
+                                                     netif_wake_queue(dev);
                                                      if (ti->readlog_pending) ibmtr_readlog(dev);
                                              }
                                      }
@@ -989,8 +982,9 @@ void tok_interrupt (int irq, void *dev_id, struct pt_regs *regs)
                                                              dev_kfree_skb(ti->current_skb);
                                                              ti->current_skb=NULL;
                                                      }
-                                                     dev->tbusy=0;
-                                                     if (ti->readlog_pending) ibmtr_readlog(dev);
+                                                     netif_wake_queue(dev);
+                                                     if (ti->readlog_pending)
+                                                               ibmtr_readlog(dev);
                                              }
                                      }
                                      break;
@@ -1115,7 +1109,7 @@ void tok_interrupt (int irq, void *dev_id, struct pt_regs *regs)
                                                        (int)isa_readb(ti->srb+offsetof(struct srb_read_log,
                                                                                                    token_errors)));
                                            }
-                                       dev->tbusy=0;
+                                       netif_wake_queue(dev);
                                        break;
 
                                      default:
@@ -1183,7 +1177,7 @@ void tok_interrupt (int irq, void *dev_id, struct pt_regs *regs)
                                                      DPRINTK("New ring status: %02X\n", ring_status);
 
                                              if (ring_status & LOG_OVERFLOW) {
-                                                     if (dev->tbusy)
+                                                     if (test_bit(LINK_STATE_XOFF, &dev->state))
                                                               ti->readlog_pending = 1;
                                                      else
                                                               ibmtr_readlog(dev);
@@ -1235,7 +1229,6 @@ void tok_interrupt (int irq, void *dev_id, struct pt_regs *regs)
 
                }        /* SRB, ARB, ASB or SSB response */
 
-               dev->interrupt=0;
                isa_writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN);
                break;
 
@@ -1330,7 +1323,7 @@ static int tok_init_card(struct net_device *dev)
        ti->do_tok_int=FIRST_INT;
 
        /* Reset adapter */
-       dev->tbusy=1; /* nothing can be done before reset and open completed */
+       netif_stop_queue(dev);
 
 #ifdef ENABLE_PAGING
        if(ti->page_mask)
@@ -1498,10 +1491,9 @@ static void tr_tx(struct net_device *dev)
 
        isa_writeb(RESP_IN_ASB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
        ti->tr_stats.tx_bytes+=ti->current_skb->len;
-       dev->tbusy=0;
        dev_kfree_skb(ti->current_skb);
        ti->current_skb=NULL;
-       mark_bh(NET_BH);
+       netif_wake_queue(dev);
        if (ti->readlog_pending) ibmtr_readlog(dev);
 }
 
@@ -1661,38 +1653,22 @@ static void tr_rx(struct net_device *dev)
 static int tok_send_packet(struct sk_buff *skb, struct net_device *dev)
 {
        struct tok_info *ti;
+       unsigned long flags;
        ti=(struct tok_info *) dev->priv;
 
-       if (dev->tbusy) {
-               int ticks_waited;
-
-               ticks_waited=jiffies - dev->trans_start;
-               if (ticks_waited<TR_BUSY_INTERVAL) return 1;
-
-               DPRINTK("Arrg. Transmitter busy.\n");
-               dev->trans_start+=5; /* we fake the transmission start time... */
-               return 1;
-       }
-
-       if (test_and_set_bit(0,(void *)&dev->tbusy)!=0)
-               DPRINTK("Transmitter access conflict\n");
-       else {
-               int flags;
-
-               /* lock against other CPUs */
-               spin_lock_irqsave(&(ti->lock), flags);
-
-               /* Save skb; we'll need it when the adapter asks for the data */
-               ti->current_skb=skb;
-               isa_writeb(XMIT_UI_FRAME, ti->srb + offsetof(struct srb_xmit, command));
-               isa_writew(ti->exsap_station_id, ti->srb
-                      +offsetof(struct srb_xmit, station_id));
-               isa_writeb(CMD_IN_SRB, (ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD));
-               spin_unlock_irqrestore(&(ti->lock), flags);
-
-               dev->trans_start=jiffies;
-       }
-
+       netif_stop_queue(dev);
+       
+       /* lock against other CPUs */
+       spin_lock_irqsave(&(ti->lock), flags);
+
+       /* Save skb; we'll need it when the adapter asks for the data */
+       ti->current_skb=skb;
+       isa_writeb(XMIT_UI_FRAME, ti->srb + offsetof(struct srb_xmit, command));
+       isa_writew(ti->exsap_station_id, ti->srb
+              +offsetof(struct srb_xmit, station_id));
+       isa_writeb(CMD_IN_SRB, (ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD));
+       spin_unlock_irqrestore(&(ti->lock), flags);
+       dev->trans_start=jiffies;
        return 0;
 }
 
@@ -1712,7 +1688,8 @@ void ibmtr_readlog(struct net_device *dev) {
         isa_writeb(DIR_READ_LOG, ti->srb);
         isa_writeb(INT_ENABLE, ti->mmio + ACA_OFFSET + ACA_SET + ISRP_EVEN);
         isa_writeb(CMD_IN_SRB, ti->mmio + ACA_OFFSET + ACA_SET + ISRA_ODD);
-        dev->tbusy=1; /* really srb busy... */
+        
+        netif_stop_queue(dev);
 }
 
 /* tok_get_stats():  Basically a scaffold routine which will return
index fcb3ccd76e70cf0c2bfe172a7ae253ce5118a451..d448d48f7bea6438d8531a4c4bca5ac6db891a5a 100644 (file)
@@ -615,10 +615,7 @@ static int olympic_open(struct net_device *dev)
 
 #endif         
        
-       dev->start = 1;
-       dev->interrupt=0;
-       dev->tbusy=0;
-
+       netif_start_queue(dev);
        MOD_INC_USE_COUNT ;
        return 0;
        
@@ -762,11 +759,6 @@ static void olympic_interrupt(int irq, void *dev_id, struct pt_regs *regs)
 
        spin_lock(&olympic_priv->olympic_lock);
 
-       if (dev->interrupt) 
-               printk(KERN_WARNING "%s: Re-entering interrupt \n",dev->name) ; 
-
-       dev->interrupt = 1 ; 
-
        if (sisr & (SISR_SRB_REPLY | SISR_TX1_EOF | SISR_RX_STATUS | SISR_ADAPTER_CHECK |  
                        SISR_ASB_FREE | SISR_ARB_CMD | SISR_TRB_REPLY | SISR_RX_NOBUF)) {  
        
@@ -788,11 +780,7 @@ static void olympic_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                        dev_kfree_skb(olympic_priv->tx_ring_skb[olympic_priv->tx_ring_last_status]);
                        olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_last_status].buffer=0xdeadbeef;
                        olympic_priv->olympic_tx_status_ring[olympic_priv->tx_ring_last_status].status=0;
-
-                       if(dev->tbusy) {
-                               dev->tbusy=0;
-                               mark_bh(NET_BH);
-                       }
+                       netif_wake_queue(dev);
                } /* SISR_TX1_EOF */
        
                if (sisr & SISR_RX_STATUS) {
@@ -804,7 +792,6 @@ static void olympic_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                        writel(readl(olympic_mmio+LAPWWO),olympic_mmio+LAPA);
                        adapter_check_area = (__u8 *)(olympic_mmio+LAPWWO) ; 
                        printk(KERN_WARNING "%s: Bytes %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n",dev->name, readb(adapter_check_area+0), readb(adapter_check_area+1), readb(adapter_check_area+2), readb(adapter_check_area+3), readb(adapter_check_area+4), readb(adapter_check_area+5), readb(adapter_check_area+6), readb(adapter_check_area+7)) ; 
-                       dev->interrupt = 0  ;   
                        free_irq(dev->irq, dev) ; 
        
                } /* SISR_ADAPTER_CHECK */
@@ -837,8 +824,6 @@ static void olympic_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                printk(KERN_WARNING "%s: SISR_MASK: %x\n",dev->name, readl(olympic_mmio+SISR_MASK)) ;
        } /* One if the interrupts we want */
 
-       dev->interrupt = 0 ;  
-
        writel(SISR_MI,olympic_mmio+SISR_MASK_SUM);
        
        spin_unlock(&olympic_priv->olympic_lock) ; 
@@ -852,11 +837,8 @@ static int olympic_xmit(struct sk_buff *skb, struct net_device *dev)
 
        spin_lock_irqsave(&olympic_priv->olympic_lock, flags);
 
-       if (test_and_set_bit(0, (void*)&dev->tbusy) != 0) {
-               spin_unlock_irqrestore(&olympic_priv->olympic_lock,flags);
-               return 1;
-       }
-
+       netif_stop_queue(dev);
+       
        if(olympic_priv->free_tx_ring_entries) {
                olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_free].buffer=virt_to_bus(skb->data);
                olympic_priv->olympic_tx_ring[olympic_priv->tx_ring_free].status_length=skb->len | (0x80000000);
@@ -869,7 +851,7 @@ static int olympic_xmit(struct sk_buff *skb, struct net_device *dev)
 
                writew((((readw(olympic_mmio+TXENQ_1)) & 0x8000) ^ 0x8000) | 1,olympic_mmio+TXENQ_1);
 
-               dev->tbusy=0;           
+               netif_wake_queue(dev);
                spin_unlock_irqrestore(&olympic_priv->olympic_lock,flags);
                return 0;
        } else {
@@ -887,6 +869,8 @@ static int olympic_close(struct net_device *dev)
        unsigned long flags;
        int i;
 
+       netif_stop_queue(dev);
+       
        writel(olympic_priv->srb,olympic_mmio+LAPA);
        srb=olympic_priv->olympic_lap + (olympic_priv->srb & (~0xf800));
        
@@ -936,7 +920,6 @@ static int olympic_close(struct net_device *dev)
                printk("%x ",readb(srb+i));
        printk("\n");
 #endif
-       dev->start = 0;
        free_irq(dev->irq,dev);
 
        MOD_DEC_USE_COUNT ; 
@@ -1169,7 +1152,7 @@ static int olympic_set_mac_address (struct net_device *dev, void *addr)
        struct sockaddr *saddr = addr ; 
        struct olympic_private *olympic_priv = (struct olympic_private *)dev->priv ; 
 
-       if (dev->start) { 
+       if (test_bit(LINK_STATE_START, &dev->state)) { 
                printk(KERN_WARNING "%s: Cannot set mac/laa address while card is open\n", dev->name) ; 
                return -EIO ; 
        }
@@ -1304,9 +1287,7 @@ static void olympic_arb_cmd(struct net_device *dev)
                        writel(readl(olympic_mmio+BCTL)|(3<<13),olympic_mmio+BCTL);
                        udelay(1);
                        writel(readl(olympic_mmio+BCTL)&~(3<<13),olympic_mmio+BCTL);
-                       dev->tbusy = 1 ;
-                       dev->interrupt = 1 ; 
-                       dev->start = 0 ; 
+                       netif_stop_queue(dev);
                        olympic_priv->srb = readw(olympic_priv->olympic_lap + LAPWWO) ; 
                        free_irq(dev->irq,dev);
                        
index 5e4093b1492ef61d2ed04c63771e0117c13ed8d7..739c3cf2fd4fa192fde08f9c4c918bd560a080f3 100644 (file)
@@ -131,7 +131,6 @@ static int smctr_get_upstream_neighbor_addr(struct net_device *dev);
 /* H */
 static int smctr_hardware_send_packet(struct net_device *dev,
         struct net_local *tp);
-
 /* I */
 static int smctr_init_acbs(struct net_device *dev);
 static int smctr_init_adapter(struct net_device *dev);
@@ -282,6 +281,7 @@ static char *smctr_malloc(struct net_device *dev, __u16 size);
 static int smctr_status_chg(struct net_device *dev);
 
 /* T */
+static void smctr_timeout(struct net_device *dev);
 static int smctr_trc_send_packet(struct net_device *dev, FCBlock *fcb,
         __u16 queue);
 static __u16 smctr_tx_complete(struct net_device *dev, __u16 queue);
@@ -730,9 +730,8 @@ static int smctr_close(struct net_device *dev)
         struct sk_buff *skb;
         int err;
 
-        dev->tbusy = 1;
-        dev->start = 0;
-
+       netif_stop_queue(dev);
+       
 #ifdef MODULE
         MOD_DEC_USE_COUNT;
 #endif
@@ -2030,13 +2029,9 @@ static void smctr_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                 return;
         }
 
-        dev->interrupt = 1;
-
         ioaddr = dev->base_addr;
         tp = (struct net_local *)dev->priv;
 
-        dev->interrupt = 0;
-
         if(tp->status == NOT_INITIALIZED)
                 return;
 
@@ -3749,6 +3744,8 @@ static int __init smctr_probe1(struct net_device *dev, int ioaddr)
         dev->open               = smctr_open;
         dev->stop               = smctr_close;
         dev->hard_start_xmit    = smctr_send_packet;
+        dev->tx_timeout                = smctr_timeout;
+        dev->watchdog_timeo    = HZ;
         dev->get_stats          = smctr_get_stats;
         dev->set_multicast_list = &smctr_set_multicast_list;
 
@@ -4723,6 +4720,20 @@ static int smctr_send_dat(struct net_device *dev)
         return (0);
 }
 
+static void smctr_timeout(struct net_device *dev)
+{
+       /*
+         * If we get here, some higher level has decided we are broken.
+         * There should really be a "kick me" function call instead.
+         *
+         * Resetting the token ring adapter takes a long time so just
+         * fake transmission time and go on trying. Our own timeout
+         * routine is in sktr_timer_chk()
+         */
+        dev->trans_start = jiffies;
+        netif_wake_queue(dev);
+}
+
 /*
  * Gets skb from system, queues it and checks if it can be sent
  */
@@ -4733,37 +4744,11 @@ static int smctr_send_packet(struct sk_buff *skb, struct net_device *dev)
         if(smctr_debug > 10)
                 printk("%s: smctr_send_packet\n", dev->name);
 
-        if(dev->tbusy)
-        {
-                /*
-                 * If we get here, some higher level has decided we are broken.
-                 * There should really be a "kick me" function call instead.
-                 *
-                 * Resetting the token ring adapter takes a long time so just
-                 * fake transmission time and go on trying. Our own timeout
-                 * routine is in sktr_timer_chk()
-                 */
-                dev->tbusy       = 0;
-                dev->trans_start = jiffies;
-                return (1);
-        }
-
-        /*
-         * If some higher layer thinks we've missed an tx-done interrupt we
-         * are passed NULL.
-         */
-        if(skb == NULL)
-                return (0);
-
         /*
-         * Block a timer-based transmit from overlapping. This could better be
-         * done with atomic_swap(1, dev->tbusy), but set_bit() works as well.
+         * Block a transmit overlap
          */
-        if(test_and_set_bit(0, (void*)&dev->tbusy) != 0)
-        {
-                printk("%s: Transmitter access conflict.\n", dev->name);
-                return (1);
-        }
+         
+        netif_stop_queue(dev);
 
         if(tp->QueueSkb == 0)
                 return (1);     /* Return with tbusy set: queue full */
@@ -4772,8 +4757,8 @@ static int smctr_send_packet(struct sk_buff *skb, struct net_device *dev)
         skb_queue_tail(&tp->SendSkbQueue, skb);
         smctr_hardware_send_packet(dev, tp);
         if(tp->QueueSkb > 0)
-                dev->tbusy = 0;
-
+               netif_wake_queue(dev);
+               
         return (0);
 }
 
@@ -5749,7 +5734,7 @@ static int smctr_update_tx_chain(struct net_device *dev, FCBlock *fcb,
                 tp->num_tx_fcbs_used[queue]--;
                 fcb->frame_status = 0;
                 tp->tx_fcb_end[queue] = fcb->next_ptr;
-
+               netif_wake_queue(dev);
                 return (0);
         }
 }
index 7e19338954b49f21f604de56f86a65da9bd5143c..417cc7c2928b20136af2d35596dbebd64c0d075d 100644 (file)
@@ -280,10 +280,8 @@ int tms380tr_open(struct net_device *dev)
        tms380tr_enable_interrupts(dev);
        tms380tr_open_adapter(dev);
 
-       dev->tbusy = 0;
-       dev->interrupt = 0;
-       dev->start = 0;
-
+       netif_start_queue(dev);
+       
        /* Wait for interrupt from hardware. If interrupt does not come,
         * there will be a timeout from the timer.
         */
@@ -298,8 +296,6 @@ int tms380tr_open(struct net_device *dev)
                return (-1);
        }
 
-       dev->start = 1;
-
        tp->StartTime = jiffies;
 
        /* Start function control timer */
@@ -571,6 +567,20 @@ static void tms380tr_exec_cmd(struct net_device *dev, unsigned short Command)
        return;
 }
 
+static void tms380tr_timeout(struct net_device *dev)
+{
+       /*
+        * If we get here, some higher level has decided we are broken.
+        * There should really be a "kick me" function call instead.
+        *
+        * Resetting the token ring adapter takes a long time so just
+        * fake transmission time and go on trying. Our own timeout
+        * routine is in tms380tr_timer_chk()
+        */
+       dev->trans_start = jiffies;
+       netif_wake_queue(dev);
+}
+
 /*
  * Gets skb from system, queues it and checks if it can be sent
  */
@@ -578,38 +588,12 @@ static int tms380tr_send_packet(struct sk_buff *skb, struct net_device *dev)
 {
        struct net_local *tp = (struct net_local *)dev->priv;
 
-       if(dev->tbusy)
-       {
-               /*
-                * If we get here, some higher level has decided we are broken.
-                * There should really be a "kick me" function call instead.
-                *
-                * Resetting the token ring adapter takes a long time so just
-                * fake transmission time and go on trying. Our own timeout
-                * routine is in tms380tr_timer_chk()
-                */
-               dev->tbusy       = 0;
-               dev->trans_start = jiffies;
-               return (1);
-       }
-
        /*
-        * If some higher layer thinks we've missed an tx-done interrupt we
-        * are passed NULL.
+        * Block transmits from overlapping. 
         */
-       if(skb == NULL)
-               return (0);
-
-       /*
-        * Block a timer-based transmit from overlapping. This could better be
-        * done with atomic_swap(1, dev->tbusy), but set_bit() works as well.
-        */
-       if(test_and_set_bit(0, (void*)&dev->tbusy) != 0)
-       {
-               printk("%s: Transmitter access conflict.\n", dev->name);
-               return (1);
-       }
-
+        
+       netif_stop_queue(dev);
+       
        if(tp->QueueSkb == 0)
                return (1);     /* Return with tbusy set: queue full */
 
@@ -617,8 +601,7 @@ static int tms380tr_send_packet(struct sk_buff *skb, struct net_device *dev)
        skb_queue_tail(&tp->SendSkbQueue, skb);
        tms380tr_hardware_send_packet(dev, tp);
        if(tp->QueueSkb > 0)
-               dev->tbusy = 0;
-
+               netif_wake_queue(dev);
        return (0);
 }
 
@@ -773,8 +756,6 @@ void tms380tr_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                return;
        }
 
-       dev->interrupt = 1;
-
        tp = (struct net_local *)dev->priv;
 
        irq_type = SIFREADW(SIFSTS);
@@ -854,8 +835,6 @@ void tms380tr_interrupt(int irq, void *dev_id, struct pt_regs *regs)
                irq_type = SIFREADW(SIFSTS);
        }
 
-       dev->interrupt = 0;
-
        return;
 }
 
@@ -1148,9 +1127,8 @@ static void tms380tr_cmd_status_irq(struct net_device *dev)
 int tms380tr_close(struct net_device *dev)
 {
        struct net_local *tp = (struct net_local *)dev->priv;
-       dev->tbusy = 1;
-       dev->start = 0;
-
+       netif_stop_queue(dev);
+       
        del_timer(&tp->timer);
 
        /* Flush the Tx and disable Rx here. */
@@ -2081,10 +2059,9 @@ static void tms380tr_tx_status_irq(struct net_device *dev)
                tpl->BusyFlag = 0;      /* "free" TPL */
        }
 
-       dev->tbusy = 0;
+       netif_wake_queue(dev);
        if(tp->QueueSkb < MAX_TX_QUEUE)
                tms380tr_hardware_send_packet(dev, tp);
-
        return;
 }
 
@@ -2367,6 +2344,8 @@ int tmsdev_init(struct net_device *dev)
        dev->stop               = tms380tr_close;
        dev->do_ioctl           = NULL; 
        dev->hard_start_xmit    = tms380tr_send_packet;
+       dev->tx_timeout         = tms380tr_timeout;
+       dev->watchdog_timeo     = HZ;
        dev->get_stats          = tms380tr_get_stats;
        dev->set_multicast_list = &tms380tr_set_multicast_list;
        dev->set_mac_address    = tms380tr_set_mac_address;
index a8c52f0d6aee0e606d35a32a38bc33a4e7c02535..f767bf67ceccaf4e16a53ec5a4f746e2ed375ca7 100644 (file)
@@ -244,43 +244,34 @@ static int dlci_transmit(struct sk_buff *skb, struct net_device *dev)
        if (!skb || !dev)
                return(0);
 
-       if (dev->tbusy)
-               return(1);
-
        dlp = dev->priv;
 
-       if (test_and_set_bit(0, (void*)&dev->tbusy) != 0)
-               printk(KERN_WARNING "%s: transmitter access conflict.\n", dev->name);
-       else
+       netif_stop_queue(dev);
+       
+       ret = dlp->slave->hard_start_xmit(skb, dlp->slave);
+       switch (ret)
        {
-               ret = dlp->slave->hard_start_xmit(skb, dlp->slave);
-               switch (ret)
-               {
-                       case DLCI_RET_OK:
-                               dlp->stats.tx_packets++;
-                               ret = 0;
-                               break;
-
+               case DLCI_RET_OK:
+                       dlp->stats.tx_packets++;
+                       ret = 0;
+                       break;
                        case DLCI_RET_ERR:
-                               dlp->stats.tx_errors++;
-                               ret = 0;
-                               break;
-
+                       dlp->stats.tx_errors++;
+                       ret = 0;
+                       break;
                        case DLCI_RET_DROP:
-                               dlp->stats.tx_dropped++;
-                               ret = 1;
-                               break;
-               }
-
-               /* Alan Cox recommends always returning 0, and always freeing the packet */
-               /* experience suggest a slightly more conservative approach */
-
-               if (!ret)
-                       dev_kfree_skb(skb);
-
-               dev->tbusy = 0;
+                       dlp->stats.tx_dropped++;
+                       ret = 1;
+                       break;
        }
+       /* Alan Cox recommends always returning 0, and always freeing the packet */
+       /* experience suggest a slightly more conservative approach */
 
+       if (!ret)
+       {
+               dev_kfree_skb(skb);
+               netif_wake_queue(dev);
+       }
        return(ret);
 }
 
@@ -370,19 +361,16 @@ static int dlci_open(struct net_device *dev)
        if (!*(short *)(dev->dev_addr))
                return(-EINVAL);
 
-       if (!dlp->slave->start)
+       if (!test_bit(LINK_STATE_START, &dlp->slave->state))
                return(-ENOTCONN);
 
-       dev->flags = 0;
-       dev->tbusy = 0;
-       dev->interrupt = 0;
-       dev->start = 1;
-
        flp = dlp->slave->priv;
        err = (*flp->activate)(dlp->slave, dev);
        if (err)
                return(err);
 
+       netif_start_queue(dev);
+
        return 0;
 }
 
@@ -392,14 +380,13 @@ static int dlci_close(struct net_device *dev)
        struct frad_local       *flp;
        int                     err;
 
+       netif_stop_queue(dev);
+
        dlp = dev->priv;
 
        flp = dlp->slave->priv;
        err = (*flp->deactivate)(dlp->slave, dev);
 
-       dev->start = 0;
-       dev->tbusy = 1;
-
        return 0;
 }
 
@@ -508,7 +495,7 @@ int dlci_del(struct dlci_add *dlci)
        if (!master)
                return(-ENODEV);
 
-       if (master->start)
+       if (test_bit(LINK_STATE_START, &master->state))
                return(-EBUSY);
 
        dlp = master->priv;
index d5c7ebd5e6905be0d637652fc67a66764f2f070a..6220d7fdd498f5cf6b2c1ca9e22747a92aefe064 100644 (file)
@@ -122,7 +122,8 @@ static int hostess_open(struct net_device *d)
        /*
         *      Go go go
         */
-       d->tbusy=0;
+
+       netif_start_queue(d);
        MOD_INC_USE_COUNT;
        return 0;
 }
@@ -141,8 +142,8 @@ static int hostess_close(struct net_device *d)
        /*
         *      Link layer down
         */
-       d->tbusy=1;
-       
+       netif_stop_queue(d);
+               
        switch(dma)
        {
                case 0:
index 29bedf8f9635caff919f671ffefe7bf083a1535a..d88b94845bb2266490b4037410158823a90ffb9c 100644 (file)
@@ -510,7 +510,7 @@ int sdla_activate(struct net_device *slave, struct net_device *master)
 
        flp->dlci[i] = abs(flp->dlci[i]);
 
-       if (slave->start && (flp->config.station == FRAD_STATION_NODE))
+       if (test_bit(LINK_STATE_START, &slave->state) && (flp->config.station == FRAD_STATION_NODE))
                sdla_cmd(slave, SDLA_ACTIVATE_DLCI, 0, 0, &flp->dlci[i], sizeof(short), NULL, NULL);
 
        return(0);
@@ -532,7 +532,7 @@ int sdla_deactivate(struct net_device *slave, struct net_device *master)
 
        flp->dlci[i] = -abs(flp->dlci[i]);
 
-       if (slave->start && (flp->config.station == FRAD_STATION_NODE))
+       if (test_bit(LINK_STATE_START, &slave->state) && (flp->config.station == FRAD_STATION_NODE))
                sdla_cmd(slave, SDLA_DEACTIVATE_DLCI, 0, 0, &flp->dlci[i], sizeof(short), NULL, NULL);
 
        return(0);
@@ -565,7 +565,7 @@ int sdla_assoc(struct net_device *slave, struct net_device *master)
        flp->dlci[i] = -*(short *)(master->dev_addr);
        master->mtu = slave->mtu;
 
-       if (slave->start) {
+       if (test_bit(LINK_STATE_START, &slave->state)) {
                if (flp->config.station == FRAD_STATION_CPE)
                        sdla_reconfig(slave);
                else
@@ -594,7 +594,7 @@ int sdla_deassoc(struct net_device *slave, struct net_device *master)
 
        MOD_DEC_USE_COUNT;
 
-       if (slave->start) {
+       if (test_bit(LINK_STATE_START, &slave->state)) {
                if (flp->config.station == FRAD_STATION_CPE)
                        sdla_reconfig(slave);
                else
@@ -624,7 +624,7 @@ int sdla_dlci_conf(struct net_device *slave, struct net_device *master, int get)
 
        ret = SDLA_RET_OK;
        len = sizeof(struct dlci_conf);
-       if (slave->start) {
+       if (test_bit(LINK_STATE_START, &slave->state)) {
                if (get)
                        ret = sdla_cmd(slave, SDLA_READ_DLCI_CONFIGURATION, abs(flp->dlci[i]), 0,  
                                    NULL, 0, &dlp->config, &len);
@@ -646,7 +646,7 @@ int sdla_dlci_conf(struct net_device *slave, struct net_device *master, int get)
 static int sdla_transmit(struct sk_buff *skb, struct net_device *dev)
 {
        struct frad_local *flp;
-       int               ret, addr, accept;
+       int               ret, addr, accept, i;
        short             size;
        unsigned long     flags;
        struct buf_entry  *pbuf;
@@ -655,90 +655,80 @@ static int sdla_transmit(struct sk_buff *skb, struct net_device *dev)
        ret = 0;
        accept = 1;
 
-       if (dev->tbusy) 
-               return(1);
+       netif_stop_queue(dev);
 
-       if (skb == NULL) 
-               return(0);
+       /*
+        * stupid GateD insists on setting up the multicast router thru us
+        * and we're ill equipped to handle a non Frame Relay packet at this
+        * time!
+        */
 
-       if (test_and_set_bit(0, (void*)&dev->tbusy) != 0)
-               printk(KERN_WARNING "%s: transmitter access conflict.\n", dev->name);
-       else
+       accept = 1;
+       switch (dev->type)
        {
-               /*
-                * stupid GateD insists on setting up the multicast router thru us
-                * and we're ill equipped to handle a non Frame Relay packet at this
-                * time!
-                */
-
-               accept = 1;
-               switch (dev->type)
+               case ARPHRD_FRAD:
+                       if (skb->dev->type != ARPHRD_DLCI)
+                       {
+                               printk(KERN_WARNING "%s: Non DLCI device, type %i, tried to send on FRAD module.\n", dev->name, skb->dev->type);
+                               accept = 0;
+                       }
+                       break;
+               default:
+                       printk(KERN_WARNING "%s: unknown firmware type 0x%4.4X\n", dev->name, dev->type);
+                       accept = 0;
+                       break;
+       }
+       if (accept)
+       {
+               /* this is frame specific, but till there's a PPP module, it's the default */
+               switch (flp->type)
                {
-                       case ARPHRD_FRAD:
-                               if (skb->dev->type != ARPHRD_DLCI)
+                       case SDLA_S502A:
+                       case SDLA_S502E:
+                               ret = sdla_cmd(dev, SDLA_INFORMATION_WRITE, *(short *)(skb->dev->dev_addr), 0, skb->data, skb->len, NULL, NULL);
+                               break;
+                               case SDLA_S508:
+                               size = sizeof(addr);
+                               ret = sdla_cmd(dev, SDLA_INFORMATION_WRITE, *(short *)(skb->dev->dev_addr), 0, NULL, skb->len, &addr, &size);
+                               if (ret == SDLA_RET_OK)
                                {
-                                       printk(KERN_WARNING "%s: Non DLCI device, type %i, tried to send on FRAD module.\n", dev->name, skb->dev->type);
-                                       accept = 0;
+                                       save_flags(flags); 
+                                       cli();
+                                       SDLA_WINDOW(dev, addr);
+                                       pbuf = (void *)(((int) dev->mem_start) + (addr & SDLA_ADDR_MASK));
+                                               sdla_write(dev, pbuf->buf_addr, skb->data, skb->len);
+                                               SDLA_WINDOW(dev, addr);
+                                       pbuf->opp_flag = 1;
+                                       restore_flags(flags);
                                }
                                break;
-
-                       default:
-                               printk(KERN_WARNING "%s: unknown firmware type 0x%4.4X\n", dev->name, dev->type);
-                               accept = 0;
-                               break;
                }
-
-               if (accept)
+               switch (ret)
                {
-                       /* this is frame specific, but till there's a PPP module, it's the default */
-                       switch (flp->type)
-                       {
-                               case SDLA_S502A:
-                               case SDLA_S502E:
-                                       ret = sdla_cmd(dev, SDLA_INFORMATION_WRITE, *(short *)(skb->dev->dev_addr), 0, skb->data, skb->len, NULL, NULL);
-                                       break;
-
-                               case SDLA_S508:
-                                       size = sizeof(addr);
-                                       ret = sdla_cmd(dev, SDLA_INFORMATION_WRITE, *(short *)(skb->dev->dev_addr), 0, NULL, skb->len, &addr, &size);
-                                       if (ret == SDLA_RET_OK)
-                                       {
-                                               save_flags(flags); 
-                                               cli();
-                                               SDLA_WINDOW(dev, addr);
-                                               pbuf = (void *)(((int) dev->mem_start) + (addr & SDLA_ADDR_MASK));
-
-                                               sdla_write(dev, pbuf->buf_addr, skb->data, skb->len);
-
-                                               SDLA_WINDOW(dev, addr);
-                                               pbuf->opp_flag = 1;
-                                               restore_flags(flags);
-                                       }
-                                       break;
-                       }
-
-                       switch (ret)
-                       {
-                               case SDLA_RET_OK:
-                                       flp->stats.tx_packets++;
-                                       ret = DLCI_RET_OK;
-                                       break;
+                       case SDLA_RET_OK:
+                               flp->stats.tx_packets++;
+                               ret = DLCI_RET_OK;
+                               break;
 
-                               case SDLA_RET_CIR_OVERFLOW:
-                               case SDLA_RET_BUF_OVERSIZE:
-                               case SDLA_RET_NO_BUFS:
-                                       flp->stats.tx_dropped++;
-                                       ret = DLCI_RET_DROP;
-                                       break;
+                       case SDLA_RET_CIR_OVERFLOW:
+                       case SDLA_RET_BUF_OVERSIZE:
+                       case SDLA_RET_NO_BUFS:
+                               flp->stats.tx_dropped++;
+                               ret = DLCI_RET_DROP;
+                               break;
 
-                               default:
-                                       flp->stats.tx_errors++;
-                                       ret = DLCI_RET_ERR;
-                                       break;
-                       }
+                       default:
+                               flp->stats.tx_errors++;
+                               ret = DLCI_RET_ERR;
+                               break;
                }
-               dev->tbusy = 0;
        }
+       netif_wake_queue(dev);
+       for(i=0;i<CONFIG_DLCI_MAX;i++)
+       {
+               if(flp->master[i]!=NULL)
+                       netif_wake_queue(flp->master[i]);
+       }               
        return(ret);
 }
 
@@ -892,7 +882,6 @@ static void sdla_isr(int irq, void *dev_id, struct pt_regs * regs)
                return;
        }
 
-       dev->interrupt = 1;
        byte = sdla_byte(dev, flp->type == SDLA_S508 ? SDLA_508_IRQ_INTERFACE : SDLA_502_IRQ_INTERFACE);
        switch (byte)
        {
@@ -925,7 +914,6 @@ static void sdla_isr(int irq, void *dev_id, struct pt_regs * regs)
        /* this clears the byte, informing the Z80 we're done */
        byte = 0;
        sdla_write(dev, flp->type == SDLA_S508 ? SDLA_508_IRQ_INTERFACE : SDLA_502_IRQ_INTERFACE, &byte, sizeof(byte));
-       dev->interrupt = 0;
 }
 
 static void sdla_poll(unsigned long device)
@@ -992,9 +980,8 @@ static int sdla_close(struct net_device *dev)
 
        sdla_cmd(dev, SDLA_DISABLE_COMMUNICATIONS, 0, 0, NULL, 0, NULL, NULL);
 
-       dev->tbusy = 1;
-       dev->start = 0;
-
+       netif_stop_queue(dev);
+       
        MOD_DEC_USE_COUNT;
 
        return(0);
@@ -1096,10 +1083,8 @@ static int sdla_open(struct net_device *dev)
                                sdla_cmd(dev, SDLA_SET_DLCI_CONFIGURATION, abs(flp->dlci[i]), 0, &dlp->config, sizeof(struct dlci_conf), NULL, NULL);
                }
 
-       dev->tbusy = 0;
-       dev->interrupt = 0;
-       dev->start = 1;
-
+       netif_start_queue(dev);
+       
        MOD_INC_USE_COUNT;
 
        return(0);
@@ -1119,7 +1104,7 @@ static int sdla_config(struct net_device *dev, struct frad_conf *conf, int get)
 
        if (!get)
        {
-               if (dev->start)
+               if (test_bit(LINK_STATE_START, &dev->state))
                        return(-EBUSY);
 
                if(copy_from_user(&data.config, conf, sizeof(struct frad_conf)))
@@ -1182,7 +1167,7 @@ static int sdla_config(struct net_device *dev, struct frad_conf *conf, int get)
        else
        {
                /* no sense reading if the CPU isn't started */
-               if (dev->start)
+               if (test_bit(LINK_STATE_START, &dev->state))
                {
                        size = sizeof(data);
                        if (sdla_cmd(dev, SDLA_READ_DLCI_CONFIGURATION, 0, 0, NULL, 0, &data, &size) != SDLA_RET_OK)
@@ -1331,7 +1316,7 @@ int sdla_change_mtu(struct net_device *dev, int new_mtu)
 
        flp = dev->priv;
 
-       if (dev->start)
+       if (test_bit(LINK_STATE_START, &dev->state))
                return(-EBUSY);
 
        /* for now, you can't change the MTU! */
index 90cccf81ddca4e53979ae591fd2a2f0087592348..8fd2ff10577ed30e370e1d6a5acd74c2b0ae90c1 100644 (file)
@@ -119,7 +119,7 @@ static int sealevel_open(struct net_device *d)
        /*
         *      Go go go
         */
-       d->tbusy=0;
+       netif_start_queue(d);
        MOD_INC_USE_COUNT;
        return 0;
 }
@@ -142,8 +142,9 @@ static int sealevel_close(struct net_device *d)
        /*
         *      Link layer down
         */
-       d->tbusy=1;
-       
+
+       netif_stop_queue(d);
+               
        switch(unit)
        {
                case 0:
index f6b385de502645a43a698a674568659e4d90b403..c5e1c4bd52b646fab06a339f7dfd801846efef0f 100644 (file)
@@ -637,6 +637,7 @@ EXPORT_SYMBOL(z8530_sync_open);
 int z8530_sync_close(struct net_device *dev, struct z8530_channel *c)
 {
        u8 chk;
+       
        c->irqs = &z8530_nop;
        c->max = 0;
        c->sync = 0;
@@ -753,6 +754,7 @@ int z8530_sync_dma_open(struct net_device *dev, struct z8530_channel *c)
        c->irqs = &z8530_dma_sync;
        z8530_rtsdtr(c,1);
        write_zsreg(c, R3, c->regs[R3]|RxENABLE);
+       
        return 0;
 }
 
@@ -898,6 +900,7 @@ int z8530_sync_txdma_open(struct net_device *dev, struct z8530_channel *c)
        z8530_rtsdtr(c,1);
        printk("Rx interrupts ON\n");   
        write_zsreg(c, R3, c->regs[R3]|RxENABLE);
+       
        return 0;
 }
 
@@ -907,6 +910,7 @@ int z8530_sync_txdma_close(struct net_device *dev, struct z8530_channel *c)
 {
        unsigned long flags;
        u8 chk;
+       
        c->irqs = &z8530_nop;
        c->max = 0;
        c->sync = 0;
@@ -1102,7 +1106,7 @@ static void z8530_tx_begin(struct z8530_channel *c)
        c->tx_next_skb=NULL;
        c->tx_ptr=c->tx_next_ptr;
        
-       mark_bh(NET_BH);
+       netif_wake_queue(c->netdevice);
        if(c->tx_skb==NULL)
        {
                /* Idle on */
@@ -1184,7 +1188,7 @@ static void z8530_tx_done(struct z8530_channel *c)
        struct sk_buff *skb;
 
        spin_lock_irqsave(&z8530_buffer_lock, flags);
-       c->netdevice->tbusy=0;
+       netif_wake_queue(c->netdevice);
        /* Actually this can happen.*/
        if(c->tx_skb==NULL)
        {
@@ -1379,9 +1383,10 @@ extern inline int spans_boundary(struct sk_buff *skb)
 int z8530_queue_xmit(struct z8530_channel *c, struct sk_buff *skb)
 {
        unsigned long flags;
+       
+       netif_stop_queue(c->netdevice);
        if(c->tx_next_skb)
        {
-               skb->dev->tbusy=1;
                return 1;
        }
        
@@ -1414,6 +1419,8 @@ int z8530_queue_xmit(struct z8530_channel *c, struct sk_buff *skb)
        spin_lock_irqsave(&z8530_buffer_lock, flags);
        z8530_tx_begin(c);
        spin_unlock_irqrestore(&z8530_buffer_lock, flags);
+       
+       netif_wake_queue(c->netdevice);
        return 0;
 }
 
index 585a8a2780074673e1a8f0bc36267b6f3e6c97b7..4db73a777f43f1aa8c17ddda6e48fefe63287dd7 100644 (file)
@@ -665,3 +665,5 @@ int usb_acm_init(void)
 
        return 0;
 }
+
+__initcall(usb_acm_init);
index 52fc94adb13d93144fdcc47b3c056caccf94c4c1..8aaf4be8151b3fc553fc49d0e7c9760413ad19e9 100644 (file)
@@ -67,19 +67,19 @@ static struct hid_usage_entry hid_usage_table[] = {
       {0, 0x45, "Vbrz"},
       {0, 0x46, "Vno"},
     {0, 0x80, "SystemControl"}, 
-      {0, 0x81, "System PowerDown"},
-      {0, 0x82, "System Sleep"},
-      {0, 0x83, "System WakeUp"},
-      {0, 0x84, "System ContextMenu"},
-      {0, 0x85, "System MainMenu"},
-      {0, 0x86, "System AppMenu"},
-      {0, 0x87, "System MenuHelp"},
-      {0, 0x88, "System MenuExit"},
-      {0, 0x89, "System MenuSelect"},
-      {0, 0x8a, "System MenuRight"},
-      {0, 0x8b, "System MenuLeft"},
-      {0, 0x8c, "System MenuUp"},
-      {0, 0x8d, "System MenuDown"},
+      {0, 0x81, "SystemPowerDown"},
+      {0, 0x82, "SystemSleep"},
+      {0, 0x83, "SystemWakeUp"},
+      {0, 0x84, "SystemContextMenu"},
+      {0, 0x85, "SystemMainMenu"},
+      {0, 0x86, "SystemAppMenu"},
+      {0, 0x87, "SystemMenuHelp"},
+      {0, 0x88, "SystemMenuExit"},
+      {0, 0x89, "SystemMenuSelect"},
+      {0, 0x8a, "SystemMenuRight"},
+      {0, 0x8b, "SystemMenuLeft"},
+      {0, 0x8c, "SystemMenuUp"},
+      {0, 0x8d, "SystemMenuDown"},
     {0, 0x90, "D-padUp"},
     {0, 0x91, "D-padDown"},
     {0, 0x92, "D-padRight"},
@@ -87,6 +87,7 @@ static struct hid_usage_entry hid_usage_table[] = {
   {  7, 0, "Keyboard" },
   {  8, 0, "LED" },
   {  9, 0, "Button" },
+  { 12, 0, "Hotkey" },
   { 13, 0, "Digitizers" },
     {0, 0x01, "Digitizer"},
     {0, 0x02, "Pen"},
index 96e6337755a2f87f41ccc6e7edd576a718d8aa15..349a127a845a7a9bacbfa9c28d2255d65ab437a7 100644 (file)
@@ -754,8 +754,25 @@ static void hid_configure_usage(struct hid_device *device, struct hid_field *fie
 
                case HID_UP_GENDESK:
 
+                       if ((usage->hid & 0xf0) == 0x80) {      /* SystemControl */
+                               switch (usage->hid & 0xf) {
+                                       case 0x1: usage->code = KEY_POWER;  break;
+                                       case 0x2: usage->code = KEY_SLEEP;  break;
+                                       case 0x3: usage->code = KEY_WAKEUP; break;
+                                       default: usage->code = KEY_UNKNOWN; break;
+                               }
+                               usage->type = EV_KEY; bit = input->keybit; max = KEY_MAX;
+                               break;
+                       }
+
                        usage->code = usage->hid & 0xf;
 
+                       if (field->report_size == 1) {
+                               usage->code = BTN_MISC;
+                               usage->type = EV_KEY; bit = input->keybit; max = KEY_MAX;
+                               break;
+                       }
+
                        if (field->flags & HID_MAIN_ITEM_RELATIVE) {
                                usage->type = EV_REL; bit = input->relbit; max = REL_MAX;
                                break;
@@ -816,14 +833,31 @@ static void hid_configure_usage(struct hid_device *device, struct hid_field *fie
                        }
                        break;
 
-               default:
-               unknown:
+               case HID_UP_HOTKEY:
+                       
+                       switch (usage->hid & HID_USAGE) {
+
+                               case 0x0034: usage->code = KEY_PHONE;           break;
+                               case 0x0036: usage->code = KEY_NOTEPAD;         break;
+                               case 0x008a: usage->code = KEY_MAIL;            break;
+                               case 0x0095: usage->code = KEY_CALENDAR;        break;
+                               case 0x00b7: usage->code = KEY_PRINT;           break;
+                               case 0x00b8: usage->code = KEY_HELP;            break;
+                               case 0x00cd: usage->code = KEY_SOUND;           break;
+                               case 0x00e2: usage->code = KEY_PROG1;           break;
+                               case 0x00e9: usage->code = KEY_PROG2;           break;
+                               case 0x00ea: usage->code = KEY_PROG3;           break;
+                               case 0x018a: usage->code = KEY_WWW;             break;
+                               case 0x0223: usage->code = KEY_FULLSCREEN;      break;
+                               default:     usage->code = KEY_UNKNOWN;         break;
 
-                       if (field->flags & HID_MAIN_ITEM_RELATIVE) {
-                               usage->code = REL_MISC;
-                               usage->type = EV_REL; bit = input->relbit; max = REL_MAX;
-                               break;
                        }
+               
+                       usage->type = EV_KEY; bit = input->keybit; max = KEY_MAX;
+                       break;
+
+               default:
+               unknown:
 
                        if (field->report_size == 1) {
                                usage->code = BTN_MISC;
@@ -831,6 +865,12 @@ static void hid_configure_usage(struct hid_device *device, struct hid_field *fie
                                break;
                        }
 
+                       if (field->flags & HID_MAIN_ITEM_RELATIVE) {
+                               usage->code = REL_MISC;
+                               usage->type = EV_REL; bit = input->relbit; max = REL_MAX;
+                               break;
+                       }
+
                        usage->code = ABS_MISC;
                        usage->type = EV_ABS; bit = input->absbit; max = ABS_MAX;
                        break;
@@ -864,7 +904,7 @@ static void hid_configure_usage(struct hid_device *device, struct hid_field *fie
        }
 }
 
-static void hid_process_event(struct input_dev *input, struct hid_usage *usage, __s32 value)
+static void hid_process_event(struct input_dev *input, int flags, struct hid_usage *usage, __s32 value)
 {
        hid_dump_input(usage, value);
 
@@ -876,6 +916,9 @@ static void hid_process_event(struct input_dev *input, struct hid_usage *usage,
        }
 
        input_event(input, usage->type, usage->code, value);
+
+       if ((flags & HID_MAIN_ITEM_RELATIVE) && (usage->type == EV_KEY))
+               input_event(input, usage->type, usage->code, 0);
 }
 
 /*
@@ -917,19 +960,19 @@ static void hid_input_field(struct hid_device *dev, struct hid_field *field, __u
                        } else {
                                if (value[n] == field->value[n]) continue;
                        }
-                       hid_process_event(&dev->input, &field->usage[n], value[n]);
+                       hid_process_event(&dev->input, field->flags, &field->usage[n], value[n]);
 
                } else {
 
                        if (field->value[n] >= min && field->value[n] <= max                    /* non-NULL value */
                                && field->usage[field->value[n] - min].hid                      /* nonzero usage */
                                && search(value, field->value[n], count))
-                                       hid_process_event(&dev->input, &field->usage[field->value[n] - min], 0);
+                                       hid_process_event(&dev->input, field->flags, &field->usage[field->value[n] - min], 0);
 
                        if (value[n] >= min && value[n] <= max                                  /* non-NULL value */
                                && field->usage[value[n] - min].hid                             /* nonzero usage */
                                && search(field->value, value[n], count))
-                                       hid_process_event(&dev->input, &field->usage[value[n] - min], 1);
+                                       hid_process_event(&dev->input, field->flags, &field->usage[value[n] - min], 1);
                }
        }
 
@@ -1340,3 +1383,5 @@ int hid_init(void)
        usb_register(&hid_driver);
        return 0;
 }
+
+__initcall(hid_init);
index e53135f1ed7d479d695f990454cf2b1ac79ea480..69b3fc31f61be7d8c8de1f8e9904d305481fb800 100644 (file)
@@ -158,6 +158,7 @@ struct hid_item {
 #define HID_UP_KEYBOARD        0x00070000
 #define HID_UP_LED             0x00080000
 #define HID_UP_BUTTON          0x00090000
+#define HID_UP_HOTKEY          0x000c0000
 #define HID_UP_DIGITIZER       0x000d0000
 #define HID_UP_PID             0x000f0000
 
index 4267971ab9101f9bcc061165cec34f5e3914e5ec..4134574c2979a8ecbbaa8056492239c1dafb1ee2 100644 (file)
@@ -453,7 +453,7 @@ static void usb_hub_events(void)
                                // be shutdown by the hub, this hack enables them again.
                                // Works at least with mouse driver. 
                                if (!(portstatus & USB_PORT_STAT_ENABLE) && 
-                                   (portstatus & USB_PORT_STAT_CONNECTION)) {
+                                   (portstatus & USB_PORT_STAT_CONNECTION) && (dev->children[i])) {
                                        err("already running port %i disabled by hub (EMI?), re-enabling...",
                                                i + 1);
                                        usb_hub_port_connect_change(dev, i);
index fa370c9af8afe975e8555548d071cc9c6888699c..d613976f58d0d9a376935582dd06a5ad4d6f5fb4 100644 (file)
@@ -333,3 +333,5 @@ void cleanup_module(void)
 {
 }
 #endif
+
+__initcall(input_init);
index cd89cedb2a6d557de9c41c77b37fc4e43738136a..c157e62f7aba039721132acc89ec5091cce6d3b6 100644 (file)
@@ -118,10 +118,17 @@ void keybdev_event(struct input_handle *handle, unsigned int type, unsigned int
 static int keybdev_connect(struct input_handler *handler, struct input_dev *dev)
 {
        struct input_handle *handle;
+       int i;
 
-       if (!test_bit(EV_KEY, dev->evbit) || !test_bit(KEY_A, dev->keybit) || !test_bit(KEY_Z, dev->keybit))
+       if (!test_bit(EV_KEY, dev->evbit))
                return -1;
 
+       for (i = KEY_RESERVED; i < BTN_MISC; i++)
+               if (test_bit(i, dev->keybit)) break;
+
+       if (i == BTN_MISC)
+               return -1;
+
        if (!(handle = kmalloc(sizeof(struct input_handle), GFP_KERNEL)))
                return -1;
        memset(handle, 0, sizeof(struct input_handle));
index 7a4bcd1084ff55987df11cc34767d258f62baff4..a645dbfc23bcb47a462187a73e71aca55ea76d12 100644 (file)
@@ -447,3 +447,5 @@ int usb_printer_init(void)
 
        return 0;
 }
+
+__initcall(usb_printer_init);
index 9e7557e8fac15ecb112aa94f5e408e6cfbca4565..57238eb0b3316824f5969cefba382e3e84e0fc6a 100644 (file)
@@ -29,19 +29,14 @@ void usb_major_cleanup(void);
  * USB device drivers
  */
 
-int usb_acm_init(void);
 int usb_audio_init(void);
 int usb_cpia_init(void);
 int usb_ibmcam_init(void);
 int usb_ov511_init(void);
 int usb_dc2xx_init(void);
 int usb_scanner_init(void);
-int usb_printer_init(void);
 int usb_stor_init(void);
-int usb_serial_init(void);
 int dabusb_init(void);
-int hid_init(void);
-int input_init(void);
 int usb_mouse_init(void);
 int usb_kbd_init(void);
 int graphire_init(void);
@@ -62,9 +57,8 @@ int ohci_hcd_init(void);
 void cleanup_module(void)
 {
        usb_major_cleanup();
-        usbdevfs_cleanup();
+       usbdevfs_cleanup();
        usb_hub_cleanup();
-
 }
 
 /*
@@ -87,15 +81,6 @@ int usb_init(void)
 #ifdef CONFIG_USB_AUDIO
        usb_audio_init();
 #endif
-#ifdef CONFIG_USB_ACM
-       usb_acm_init();
-#endif
-#ifdef CONFIG_USB_PRINTER
-       usb_printer_init();
-#endif
-#ifdef CONFIG_USB_SERIAL
-       usb_serial_init();
-#endif
 #ifdef CONFIG_USB_CPIA
        usb_cpia_init();
 #endif
@@ -114,12 +99,6 @@ int usb_init(void)
 #ifdef CONFIG_USB_DABUSB
        dabusb_init();
 #endif
-#if defined(CONFIG_USB_HID) || defined(CONFIG_USB_MOUSE) || defined(CONFIG_USB_KBD) || defined(CONFIG_USB_GRAPHIRE)
-       input_init();
-#endif
-#ifdef CONFIG_USB_HID
-       hid_init();
-#endif
 #ifdef CONFIG_USB_MOUSE
        usb_mouse_init();
 #endif
index 4796ec2442b5cda138701158e239aef1045958f9..22e045cac33b2359b1bb7e920303fe15c4cf5d46 100644 (file)
@@ -1403,5 +1403,7 @@ void cleanup_module(void)
        usb_deregister(&usb_serial_driver);
 }
 
+#else
+__initcall(usb_serial_init);
 #endif
 
index 4ec380c2d753ccd7f796c37059a8376fa9b803d3..7a4e9facc0d4b11e1dcd161c6314020da44cda53 100644 (file)
@@ -195,15 +195,15 @@ extern void iounmap(void *addr);
  */
 #define __ISA_IO_base ((char *)(PAGE_OFFSET))
 
-#define isa_readb(a) readb(__ISA_IO_base + (unsigned long)(a))
-#define isa_readw(a) readw(__ISA_IO_base + (unsigned long)(a))
-#define isa_readl(a) readl(__ISA_IO_base + (unsigned long)(a))
-#define isa_writeb(b,a) writeb(b,__ISA_IO_base + (unsigned long)(a))
-#define isa_writew(w,a) writew(w,__ISA_IO_base + (unsigned long)(a))
-#define isa_writel(l,a) writel(l,__ISA_IO_base + (unsigned long)(a))
-#define isa_memset_io(a,b,c)           memset_io(__ISA_IO_base + (unsigned long)(a),(b),(c))
-#define isa_memcpy_fromio(a,b,c)       memcpy_fromio((a),__ISA_IO_base + (unsigned long)(b),(c))
-#define isa_memcpy_toio(a,b,c)         memcpy_toio(__ISA_IO_base + (unsigned long)(a),(b),(c))
+#define isa_readb(a) readb(__ISA_IO_base + (a))
+#define isa_readw(a) readw(__ISA_IO_base + (a))
+#define isa_readl(a) readl(__ISA_IO_base + (a))
+#define isa_writeb(b,a) writeb(b,__ISA_IO_base + (a))
+#define isa_writew(w,a) writew(w,__ISA_IO_base + (a))
+#define isa_writel(l,a) writel(l,__ISA_IO_base + (a))
+#define isa_memset_io(a,b,c)           memset_io(__ISA_IO_base + (a),(b),(c))
+#define isa_memcpy_fromio(a,b,c)       memcpy_fromio((a),__ISA_IO_base + (b),(c))
+#define isa_memcpy_toio(a,b,c)         memcpy_toio(__ISA_IO_base + (a),(b),(c))
 
 
 /*
@@ -211,7 +211,7 @@ extern void iounmap(void *addr);
  */
 
 #define eth_io_copy_and_sum(a,b,c,d)           eth_copy_and_sum((a),__io_virt(b),(c),(d))
-#define isa_eth_io_copy_and_sum(a,b,c,d)       eth_copy_and_sum((a),__io_virt(__ISA_IO_base + (unsigned long)(b)),(c),(d))
+#define isa_eth_io_copy_and_sum(a,b,c,d)       eth_copy_and_sum((a),__io_virt(__ISA_IO_base + (b)),(c),(d))
 
 static inline int check_signature(unsigned long io_addr,
        const unsigned char *signature, int length)
index 3fdfa7e92cf60fa69162317efe018fe6711ea016..b9e87d6d7394ff76a380bc925e212184bb39feaf 100644 (file)
@@ -233,6 +233,13 @@ struct input_event {
 #define KEY_STOPCD             166             
 #define KEY_RECORD             167             
 #define KEY_REWIND             168             
+#define KEY_PHONE              169
+#define KEY_CALENDAR           170
+#define KEY_NOTEPAD            171
+#define KEY_PROG3              172
+#define KEY_PRINT              173
+#define KEY_SOUND              174
+#define KEY_FULLSCREEN         175
 
 #define KEY_UNKNOWN            180
 
index d22fa6fa472815505dd7f4513ca587830a92227a..9056cc1d0fe5ebfc07e8bffdc9427ef8dbdc75f2 100644 (file)
@@ -91,6 +91,7 @@ extern void filescache_init(void);
 extern void signals_init(void);
 extern void bdev_init(void);
 extern int init_pcmcia_ds(void);
+extern int usb_init(void);
 
 extern void free_initmem(void);
 extern void filesystem_setup(void);
@@ -647,6 +648,10 @@ static void __init do_basic_setup(void)
 #ifdef CONFIG_ISAPNP
        isapnp_init();
 #endif
+#ifdef CONFIG_USB
+       usb_init();     /* Do this before doing initcalls, so that we can make
+                       usbcore initialize here, and all drivers initialize later */
+#endif
 
        /* Networking initialization needs a process context */ 
        sock_init();
index 3672877a93e1fe4c6c9656a536c4f27b937869c8..b1d76f7a5e02a7a948bc4fb6b475aff353d2a169 100644 (file)
@@ -461,6 +461,7 @@ EXPORT_SYMBOL(strnicmp);
 
 /* software interrupts */
 EXPORT_SYMBOL(tasklet_hi_vec);
+EXPORT_SYMBOL(tasklet_vec);
 EXPORT_SYMBOL(bh_task_vec);
 EXPORT_SYMBOL(init_bh);
 EXPORT_SYMBOL(remove_bh);