Hi.

This is my attempt at converting the rcpci45 driver (240t13p2) to the new
PCI API interface. I fully expect to have missed something so please
comment away. BTW, I do not consider this the final version of this patch;
therefore the maintainers are not explicitly on the recipients lists.

There are some other cleanups I want to do, and I need to make my indentation
match the drivers, but that will be after the basic conversion is done.


--- linux-240-t13-pre1-clean/drivers/net/rcpci45.c      Sat Nov  4 23:27:08 2000
+++ linux/drivers/net/rcpci45.c Thu Dec 14 21:41:17 2000
@@ -36,6 +36,8 @@
 **  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 **
 **   
+**  Rasmus Andersen, December 2000: Converted to new PCI API.
+**
 **  Pete Popov, January 11,99: Fixed a couple of 2.1.x problems 
 **  (virt_to_bus() not called), tested it under 2.2pre5 (as a module), and 
 **  added a #define(s) to enable the use of the same file for both, the 2.0.x 
@@ -47,10 +49,6 @@
 **
 ***************************************************************************/
 
-static char *version =
-"RedCreek Communications PCI linux driver version 2.02\n";
-
-
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sched.h>
@@ -75,6 +73,9 @@
 #include <linux/skbuff.h>
 
 
+static char version[] __initdata =
+"RedCreek Communications PCI linux driver version 2.03\n";
+
 #define RC_LINUX_MODULE
 #include "rclanmtl.h"
 #include "rcif.h"
@@ -123,7 +124,6 @@
     U32    function;
     struct timer_list timer;        /*  timer */
     struct net_device_stats  stats; /* the statistics structure */
-    struct net_device *next;            /* points to the next RC adapter */
     unsigned long numOutRcvBuffers;/* number of outstanding receive buffers*/
     unsigned char shutdown;
     unsigned char reboot;
@@ -138,8 +138,6 @@
 static PDPA  PCIAdapters[MAX_ADAPTERS];
 
 static int RCinit(struct net_device *dev);
-static int RCscan(void);
-static int RCfound_device(int, int, int, int, int, int);
 
 static int RCopen(struct net_device *);
 static int RC_xmit_packet(struct sk_buff *, struct net_device *);
@@ -155,71 +153,29 @@
 static int RC_allocate_and_post_buffers(struct net_device *, int);
 
 
-/* A list of all installed RC devices, for removing the driver module. */
-static struct net_device *root_RCdev;
+static struct pci_device_id rcpci45_pci_table[] __devinitdata = {
+       { RC_PCI45_VENDOR_ID, RC_PCI45_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID, },
+       { }
+};
+MODULE_DEVICE_TABLE(pci, rcpci_pci_table);
 
-static int __init rcpci_init_module (void)
+static void rcpci45_remove_one(struct pci_dev *pdev)
 {
-    int cards_found;
-
-    cards_found = RCscan();
-    if (cards_found)
-        printk(version);
-    return cards_found ? 0 : -ENODEV;
-}
+       struct net_device *dev = pdev->driver_data;
+       PDPA pDpa = dev->priv;
 
-static int RCscan(void)
-{
-    int cards_found = 0;
-    static int pci_index;
-
-    if (!pcibios_present()) 
-        return cards_found;
-
-    for (;pci_index < 0x8; pci_index++) 
-    {
-        unsigned char pci_bus, pci_device_fn;
-        int scan_status;
-        int board_index = 0;
-        unsigned char pci_irq_line;
-        unsigned int pci_ioaddr;
-       struct pci_dev *pdev;
-
-        scan_status =  
-            (pcibios_find_device (RC_PCI45_VENDOR_ID, 
-                                  RC_PCI45_DEVICE_ID, 
-                                  pci_index, 
-                                  &pci_bus, 
-                                  &pci_device_fn));
-#ifdef RCDEBUG
-        printk("rc scan_status = 0x%X\n", scan_status);
-#endif
-        if (scan_status != PCIBIOS_SUCCESSFUL ||
-           !((pdev = pci_find_slot(pci_bus, pci_device_fn))))
-            break;
-       pci_irq_line = pdev->irq;
-       pci_ioaddr = pci_resource_start (pdev, 0);
+        if (!dev) {
+                printk (KERN_ERR "remove non-existent device\n");
+                return;
+        }
 
-#ifdef RCDEBUG
-        printk("rc: Found RedCreek PCI adapter\n");
-        printk("rc: pci_bus = %d,  pci_device_fn = %d\n", pci_bus, pci_device_fn);
-        printk("rc: pci_irq_line = 0x%x \n", pci_irq_line);
-        printk("rc: pci_ioaddr = 0x%x\n", pci_ioaddr);
-#endif
+       printk("IOP reset: 0x%x\n", RCResetIOP(pDpa->id));
 
-       if (pci_enable_device(pdev))
-               break;
-       pci_set_master(pdev);
+       unregister_netdev(dev);
+       iounmap((void *)dev->base_addr);
+        free_irq(dev->irq, dev);
 
-        if (!RCfound_device(pci_ioaddr, pci_irq_line,
-                          pci_bus, pci_device_fn,
-                          board_index++, cards_found))
-            cards_found++;
-    }
-#ifdef RCDEBUG
-    printk("rc: found %d cards \n", cards_found);
-#endif
-    return cards_found;
+       kfree(dev);
 }
 
 static int RCinit(struct net_device *dev)
@@ -233,17 +189,22 @@
     return 0;
 }
 
-static int
-RCfound_device(int memaddr, int irq, 
-               int bus, int function, int product_index, int card_idx)
+static int rcpci45_init_one(struct pci_dev *pdev, 
+                           const struct pci_device_id *ent)
 {
     int dev_size = 32768;        
     unsigned long *vaddr=0;
     PDPA pDpa;
     int init_status;
 
+    long memaddr = pci_resource_start(pdev, 0);
+    int card_idx;    
     struct net_device *dev;
-    
+
+    static int card_counter = 0;
+
+    card_idx = card_counter++; /* Yeah, icky hack. */
+
     /* 
      * Allocate and fill new device structure. 
      * We need enough for struct net_device plus DPA plus the LAN API private
@@ -256,10 +217,13 @@
     dev = (struct net_device *) kmalloc(dev_size, GFP_DMA | GFP_KERNEL |GFP_ATOMIC);
     if (!dev)
     {
-        printk("rc: unable to kmalloc dev\n");
+        printk("rcpci45 driver: unable to kmalloc dev struct\n");
         return 1;   
     }
     memset(dev, 0, dev_size);
+
+    pdev->driver_data = dev;
+
     /*
      * dev->priv will point to the start of DPA.
      */
@@ -268,15 +232,16 @@
 #ifdef RCDEBUG
     printk("rc: dev = 0x%x, dev->priv = 0x%x\n", (uint)dev, (uint)dev->priv);
 #endif
-
+    
     pDpa = dev->priv;
 
     pDpa->dev = dev;            /* this is just for easy reference */
-    pDpa->function = function;
-    pDpa->bus = bus;
+    pDpa->function = pdev->devfn;
+    pDpa->bus = (unsigned char)pdev->bus->number;
     pDpa->id = card_idx;        /* the device number */
     pDpa->pci_addr = memaddr;
     PCIAdapters[card_idx] = pDpa;
+
 #ifdef RCDEBUG
     printk("rc: pDpa = 0x%x, id = %d \n", (uint)pDpa, (uint)pDpa->id);
 #endif
@@ -300,7 +265,7 @@
            (uint)dev, (uint)dev->priv, (uint)vaddr);
 #endif
     dev->base_addr = (unsigned long)vaddr;
-    dev->irq = irq;
+    dev->irq = pdev->irq;
 
     /*
      * Request a shared interrupt line.
@@ -342,9 +307,6 @@
     dev->init = &RCinit;
     ether_setup(dev);            /* linux kernel interface */
 
-    pDpa->next = root_RCdev;
-    root_RCdev = dev;
-
     if (register_netdev(dev) != 0) /* linux kernel interface */
     {
         printk("rc: unable to register device \n");
@@ -359,6 +321,22 @@
     return 0; /* success */
 }
 
+static struct pci_driver rcpci45_driver = {
+       name: "rcpci45",
+       id_table: rcpci45_pci_table,
+       probe: rcpci45_init_one,
+       remove: rcpci45_remove_one,
+};
+
+static int __init rcpci_init_module (void)
+{
+       int rc = pci_module_init(&rcpci45_driver);
+
+       if (!rc)
+               printk(version);
+       return rc;
+}
+
 static int
 RCopen(struct net_device *dev)
 {
@@ -1185,31 +1163,7 @@
 
 static void __exit rcpci_cleanup_module (void)
 {
-    PDPA pDpa;
-    struct net_device *next;
-
-
-#ifdef RCDEBUG
-    printk("rc: RC cleanup_module\n");
-    printk("rc: root_RCdev = 0x%x\n", (uint)root_RCdev);
-#endif
-
-
-    while (root_RCdev)
-    {
-        pDpa = (PDPA) root_RCdev->priv;
-#ifdef RCDEBUG
-        printk("rc: cleanup 0x%08X\n", (uint)root_RCdev);
-#endif
-        printk("IOP reset: 0x%x\n", RCResetIOP(pDpa->id));
-        unregister_netdev(root_RCdev);
-        next = pDpa->next;
-
-        iounmap((unsigned long *)root_RCdev->base_addr); 
-        free_irq( root_RCdev->irq, root_RCdev );
-        kfree(root_RCdev);
-        root_RCdev = next;
-    }
+       pci_unregister_driver(&rcpci45_driver);
 }
 
 module_init(rcpci_init_module);


-- 
Regards,
        Rasmus([EMAIL PROTECTED])

If a man says something in a forest and there are no women around to 
hear him, is he still wrong? -- Anonymous
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/

Reply via email to