Merge to kernel-2.6.20-1.2949.fc6.vs2.2.0.1
[linux-2.6.git] / drivers / net / tokenring / olympic.c
index 654b931..8f4ecc1 100644 (file)
@@ -80,7 +80,6 @@
 #define OLYMPIC_DEBUG 0
 
 
-#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
 #include <linux/pci.h>
 #include <linux/spinlock.h>
 #include <linux/bitops.h>
+#include <linux/jiffies.h>
 
 #include <net/checksum.h>
 
@@ -150,17 +150,17 @@ MODULE_DESCRIPTION("Olympic PCI/Cardbus Chipset Driver") ;
  */
 
 static int ringspeed[OLYMPIC_MAX_ADAPTERS] = {0,} ;
-MODULE_PARM(ringspeed, "1-" __MODULE_STRING(OLYMPIC_MAX_ADAPTERS) "i");
+module_param_array(ringspeed, int, NULL, 0);
 
 /* Packet buffer size */
 
 static int pkt_buf_sz[OLYMPIC_MAX_ADAPTERS] = {0,} ;
-MODULE_PARM(pkt_buf_sz, "1-" __MODULE_STRING(OLYMPIC_MAX_ADAPTERS) "i") ; 
+module_param_array(pkt_buf_sz, int, NULL, 0) ;
 
 /* Message Level */
 
 static int message_level[OLYMPIC_MAX_ADAPTERS] = {0,} ; 
-MODULE_PARM(message_level, "1-" __MODULE_STRING(OLYMPIC_MAX_ADAPTERS) "i") ; 
+module_param_array(message_level, int, NULL, 0) ;
 
 /* Change network_monitor to receive mac frames through the arb channel.
  * Will also create a /proc/net/olympic_tr%d entry, where %d is the tr
@@ -169,7 +169,7 @@ MODULE_PARM(message_level, "1-" __MODULE_STRING(OLYMPIC_MAX_ADAPTERS) "i") ;
  * i.e. it will give you the source address of beaconers on the ring 
  */
 static int network_monitor[OLYMPIC_MAX_ADAPTERS] = {0,};
-MODULE_PARM(network_monitor, "1-" __MODULE_STRING(OLYMPIC_MAX_ADAPTERS) "i");
+module_param_array(network_monitor, int, NULL, 0);
 
 static struct pci_device_id olympic_pci_tbl[] = {
        {PCI_VENDOR_ID_IBM,PCI_DEVICE_ID_IBM_TR_WAKE,PCI_ANY_ID,PCI_ANY_ID,},
@@ -185,7 +185,7 @@ static int olympic_xmit(struct sk_buff *skb, struct net_device *dev);
 static int olympic_close(struct net_device *dev);
 static void olympic_set_rx_mode(struct net_device *dev);
 static void olympic_freemem(struct net_device *dev) ;  
-static irqreturn_t olympic_interrupt(int irq, void *dev_id, struct pt_regs *regs);
+static irqreturn_t olympic_interrupt(int irq, void *dev_id);
 static struct net_device_stats * olympic_get_stats(struct net_device *dev);
 static int olympic_set_mac_address(struct net_device *dev, void *addr) ; 
 static void olympic_arb_cmd(struct net_device *dev);
@@ -216,7 +216,7 @@ static int __devinit olympic_probe(struct pci_dev *pdev, const struct pci_device
        dev = alloc_trdev(sizeof(struct olympic_private)) ; 
        if (!dev) {
                i = -ENOMEM; 
-               goto op_free_dev;
+               goto op_release_dev;
        }
 
        olympic_priv = dev->priv ;
@@ -281,8 +281,8 @@ op_free_iomap:
        if (olympic_priv->olympic_lap)
                iounmap(olympic_priv->olympic_lap);
 
-op_free_dev:
        free_netdev(dev);
+op_release_dev:
        pci_release_regions(pdev); 
 
 op_disable_dev:
@@ -307,7 +307,7 @@ static int __devinit olympic_init(struct net_device *dev)
        t=jiffies;
        while((readl(olympic_mmio+BCTL)) & BCTL_SOFTRESET) {
                schedule();             
-               if(jiffies-t > 40*HZ) {
+               if(time_after(jiffies, t + 40*HZ)) {
                        printk(KERN_ERR "IBM PCI tokenring card not responding.\n");
                        return -ENODEV;
                }
@@ -359,7 +359,7 @@ static int __devinit olympic_init(struct net_device *dev)
                t=jiffies;
                while (!readl(olympic_mmio+CLKCTL) & CLKCTL_PAUSE) { 
                        schedule() ; 
-                       if(jiffies-t > 2*HZ) { 
+                       if(time_after(jiffies, t + 2*HZ)) {
                                printk(KERN_ERR "IBM Cardbus tokenring adapter not responsing.\n") ; 
                                return -ENODEV;
                        }
@@ -373,7 +373,7 @@ static int __devinit olympic_init(struct net_device *dev)
        t=jiffies;
        while(!((readl(olympic_mmio+SISR_RR)) & SISR_SRB_REPLY)) {
                schedule();             
-               if(jiffies-t > 15*HZ) {
+               if(time_after(jiffies, t + 15*HZ)) {
                        printk(KERN_ERR "IBM PCI tokenring card not responding.\n");
                        return -ENODEV;
                }
@@ -438,14 +438,14 @@ static int olympic_open(struct net_device *dev)
        struct olympic_private *olympic_priv=(struct olympic_private *)dev->priv;
        u8 __iomem *olympic_mmio=olympic_priv->olympic_mmio,*init_srb;
        unsigned long flags, t;
-       char open_error[255] ; 
        int i, open_finished = 1 ;
+       u8 resp, err;
 
        DECLARE_WAITQUEUE(wait,current) ; 
 
        olympic_init(dev);
 
-       if(request_irq(dev->irq, &olympic_interrupt, SA_SHIRQ , "olympic", dev)) {
+       if(request_irq(dev->irq, &olympic_interrupt, IRQF_SHARED , "olympic", dev)) {
                return -EAGAIN;
        }
 
@@ -519,7 +519,7 @@ static int olympic_open(struct net_device *dev)
                                olympic_priv->srb_queued=0;
                                break;
                        }
-                       if ((jiffies-t) > 10*HZ) { 
+                       if (time_after(jiffies, t + 10*HZ)) {
                                printk(KERN_WARNING "%s: SRB timed out. \n",dev->name) ; 
                                olympic_priv->srb_queued=0;
                                break ; 
@@ -540,52 +540,48 @@ static int olympic_open(struct net_device *dev)
                  * timed out.
                 */
 
-               if(readb(init_srb+2)== OLYMPIC_CLEAR_RET_CODE) {
+               switch (resp = readb(init_srb+2)) {
+               case OLYMPIC_CLEAR_RET_CODE:
                        printk(KERN_WARNING "%s: Adapter Open time out or error.\n", dev->name) ; 
-                       return -EIO ; 
-               }       
-
-               if(readb(init_srb+2)!=0) {
-                       if (readb(init_srb+2) == 0x07) {  
-                               if (!olympic_priv->olympic_ring_speed && open_finished) { /* Autosense , first time around */
-                                       printk(KERN_WARNING "%s: Retrying at different ring speed \n", dev->name); 
-                                       open_finished = 0 ;  
-                               } else {
+                       goto out;
+               case 0:
+                       open_finished = 1;
+                       break;
+               case 0x07:
+                       if (!olympic_priv->olympic_ring_speed && open_finished) { /* Autosense , first time around */
+                               printk(KERN_WARNING "%s: Retrying at different ring speed \n", dev->name); 
+                               open_finished = 0 ;  
+                               continue;
+                       }
 
-                                       strcpy(open_error, open_maj_error[(readb(init_srb+7) & 0xf0) >> 4]) ; 
-                                       strcat(open_error," - ") ; 
-                                       strcat(open_error, open_min_error[(readb(init_srb+7) & 0x0f)]) ;
+                       err = readb(init_srb+7);
 
-                                       if (!olympic_priv->olympic_ring_speed && ((readb(init_srb+7) & 0x0f) == 0x0d)) { 
-                                               printk(KERN_WARNING "%s: Tried to autosense ring speed with no monitors present\n",dev->name);
-                                               printk(KERN_WARNING "%s: Please try again with a specified ring speed \n",dev->name);
-                                               free_irq(dev->irq, dev);
-                                               return -EIO ;
-                                       }
+                       if (!olympic_priv->olympic_ring_speed && ((err & 0x0f) == 0x0d)) { 
+                               printk(KERN_WARNING "%s: Tried to autosense ring speed with no monitors present\n",dev->name);
+                               printk(KERN_WARNING "%s: Please try again with a specified ring speed \n",dev->name);
+                       } else {
+                               printk(KERN_WARNING "%s: %s - %s\n", dev->name,
+                                       open_maj_error[(err & 0xf0) >> 4],
+                                       open_min_error[(err & 0x0f)]);
+                       }
+                       goto out;
+
+               case 0x32:
+                       printk(KERN_WARNING "%s: Invalid LAA: %02x:%02x:%02x:%02x:%02x:%02x\n",
+                               dev->name, 
+                               olympic_priv->olympic_laa[0],
+                               olympic_priv->olympic_laa[1],
+                               olympic_priv->olympic_laa[2],
+                               olympic_priv->olympic_laa[3],
+                               olympic_priv->olympic_laa[4],
+                               olympic_priv->olympic_laa[5]) ; 
+                       goto out;
 
-                                       printk(KERN_WARNING "%s: %s\n",dev->name,open_error);
-                                       free_irq(dev->irq,dev) ; 
-                                       return -EIO ; 
-                               }       /* if autosense && open_finished */
-                       } else if (init_srb[2] == 0x32) {
-                               printk(KERN_WARNING "%s: Invalid LAA: %02x:%02x:%02x:%02x:%02x:%02x\n",
-                                       dev->name, 
-                                       olympic_priv->olympic_laa[0],
-                                       olympic_priv->olympic_laa[1],
-                                       olympic_priv->olympic_laa[2],
-                                       olympic_priv->olympic_laa[3],
-                                       olympic_priv->olympic_laa[4],
-                                       olympic_priv->olympic_laa[5]) ; 
-                               free_irq(dev->irq,dev) ; 
-                               return -EIO ; 
-                       } else {  
-                               printk(KERN_WARNING "%s: Bad OPEN response: %x\n", dev->name,init_srb[2]);
-                               free_irq(dev->irq, dev);
-                               return -EIO;
-                       } 
-               } else 
-                       open_finished = 1 ; 
+               default:
+                       printk(KERN_WARNING "%s: Bad OPEN response: %x\n", dev->name, resp);
+                       goto out;
+
+               }
        } while (!(open_finished)) ; /* Will only loop if ring speed mismatch re-open attempted && autosense is on */   
 
        if (readb(init_srb+18) & (1<<3)) 
@@ -634,8 +630,7 @@ static int olympic_open(struct net_device *dev)
 
        if (i==0) {
                printk(KERN_WARNING "%s: Not enough memory to allocate rx buffers. Adapter disabled\n",dev->name);
-               free_irq(dev->irq, dev);
-               return -EIO;
+               goto out;
        }
 
        olympic_priv->rx_ring_dma_addr = pci_map_single(olympic_priv->pdev,olympic_priv->olympic_rx_ring, 
@@ -737,7 +732,10 @@ static int olympic_open(struct net_device *dev)
        
        netif_start_queue(dev);
        return 0;
-       
+
+out:
+       free_irq(dev->irq, dev);
+       return -EIO;
 }      
 
 /*
@@ -927,7 +925,7 @@ static void olympic_freemem(struct net_device *dev)
        return ; 
 }
  
-static irqreturn_t olympic_interrupt(int irq, void *dev_id, struct pt_regs *regs
+static irqreturn_t olympic_interrupt(int irq, void *dev_id) 
 {
        struct net_device *dev= (struct net_device *)dev_id;
        struct olympic_private *olympic_priv=(struct olympic_private *)dev->priv;
@@ -1103,7 +1101,7 @@ static int olympic_close(struct net_device *dev)
 
        while(olympic_priv->srb_queued) {
 
-               t = schedule_timeout(60*HZ); 
+               t = schedule_timeout_interruptible(60*HZ);
 
                if(signal_pending(current))     {            
                        printk(KERN_WARNING "%s: SRB timed out.\n",dev->name);
@@ -1773,7 +1771,7 @@ static struct pci_driver olympic_driver = {
 
 static int __init olympic_pci_init(void) 
 {
-       return pci_module_init (&olympic_driver) ; 
+       return pci_register_driver(&olympic_driver) ;
 }
 
 static void __exit olympic_pci_cleanup(void)