Changes in CAN/PCI-200 card sources to be more clean in types
authorppisa <ppisa>
Wed, 15 Aug 2007 20:06:04 +0000 (20:06 +0000)
committerppisa <ppisa>
Wed, 15 Aug 2007 20:06:04 +0000 (20:06 +0000)
The newer kernels are very picky about diferentiate of numbers,
virtual and IO afddresses types. Try to follow rules and allow
compatability with older kernels is little csardas.

lincan/src/esdpci200.c
lincan/src/pimx1.c

index ead998b..1b62e7e 100644 (file)
 #ifdef CAN_ENABLE_PCI_SUPPORT
 
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10))
-       #define ioread32        readl
-       #define iowrite32       writel
-       #define ioread8         readb
-       #define iowrite8        writeb
+       #define ioread32        can_readl
+       #define iowrite32       can_writel
+       #define ioread8         can_readb
+       #define iowrite8        can_writeb
        #define wmb()
        #define rmb()
 #else
@@ -51,7 +51,6 @@
 #define PLX9052_CNTRL_SWRESET 0x40000000 /* PCI Adapter Software Reset to Local Bus */
 
 #define IO_RANGE 0x100
-#define RESET_ADDR 0x00
 
 // Standard value: Pushpull  (OCTP1|OCTN1|OCPOL1|OCTP0|OCTN0|OCM1)
 #define ESDPCI200_OCR_DEFAULT_STD 0xFA
 void esdpci200_pci_soft_reset(struct candevice_t *candev)
 {
        unsigned long reg_reset;
-       reg_reset = inl( candev->dev_base_addr+PLX9052_CNTRL);
+       reg_reset = inl( candev->res_addr+PLX9052_CNTRL);
        reg_reset &= ~(PLX9052_CNTRL_SWRESET);
        rmb();
        /* PCI Adapter Software Reset plus reset local bus */
-       outl( (reg_reset | PLX9052_CNTRL_SWRESET ), candev->dev_base_addr+PLX9052_CNTRL);
+       outl( (reg_reset | PLX9052_CNTRL_SWRESET ), candev->res_addr+PLX9052_CNTRL);
        wmb();
        udelay(2500);
-       outl(reg_reset, candev->dev_base_addr+PLX9052_CNTRL);
+       outl(reg_reset, candev->res_addr+PLX9052_CNTRL);
        wmb();
        udelay(2500);
 }
@@ -78,7 +77,7 @@ void esdpci200_disconnect_irq(struct candevice_t *candev)
 {
     /* writing 0x0 into the PLX's INTCSR register disables interrupts */
        /* 0x0 is also the value in the register after a power-on reset */
-       outl(0x0, candev->dev_base_addr + PLX9052_INTCSR);
+       outl(0x0, candev->res_addr + PLX9052_INTCSR);
        DEBUGMSG("disabled interrupts on the PLX\n");
 }
 
@@ -86,7 +85,7 @@ void esdpci200_connect_irq(struct candevice_t *candev)
 {
         /* enable interrupts for the SJA1000's, enable PCI interrupts */
        outl(   PLX9052_INTCSR_LI1EN | PLX9052_INTCSR_PIEN,
-               candev->dev_base_addr+PLX9052_INTCSR);
+               candev->res_addr+PLX9052_INTCSR);
        DEBUGMSG("enabled interrupts on the PLX\n"); 
 }
 
@@ -98,7 +97,7 @@ int esdpci200_irq_handler(int irq, struct canchip_t *chip)
        candev = chip->hostdevice;
        retcode = CANCHIP_IRQ_NONE;
        //DEBUGMSG("Starting to handle an IRQ\n");
-       it_reg = inl(candev->dev_base_addr+PLX9052_INTCSR);
+       it_reg = inl(candev->res_addr+PLX9052_INTCSR);
        rmb();
        if((it_reg & (PLX9052_INTCSR_LI1S | PLX9052_INTCSR_LI1EN) ) 
                == (PLX9052_INTCSR_LI1S | PLX9052_INTCSR_LI1EN) ) 
@@ -124,7 +123,7 @@ int esdpci200_irq_handler(int irq, struct canchip_t *chip)
                        //Either we have a problem with IRQ malfunctions, or our IRQ is shared with some other device.
                        //
                        //not actually disabled, unless outl() below is uncommented
-                       //outl(it_reg,(void*)(candev->dev_base_addr+PLX9052_INTCSR));
+                       //outl(it_reg,(void*)(candev->res_addr+PLX9052_INTCSR));
                        //CANMSG("CAN Interrupt disabled due to malfunction\n");
                }
        }
@@ -133,7 +132,61 @@ int esdpci200_irq_handler(int irq, struct canchip_t *chip)
 
 int esdpci200_request_io(struct candevice_t *candev)
 {
+       struct pci_dev *pcidev = candev->sysdevptr.pcidev;
+       can_ioptr_t remap_addr;
+       unsigned long bar2_addr;
+
+       #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
+       if(pci_request_region(pcidev, 0, "esdpci200_plx9050") != 0){
+               CANMSG("Request of esdpci200_plx9050 range failed\n");
+               return -ENODEV;
+       }else if(pci_request_region(pcidev, 1, "esdpci200_io") != 0){
+               CANMSG("Request of esdpci200_io range failed\n");
+               pci_release_region(pcidev, 0);
+               return -ENODEV;
+       }else if(pci_request_region(pcidev, 2, "esdpci200_sja") != 0){
+               CANMSG("Request of esdpci200_sja range failed\n");
+               pci_release_region(pcidev, 1);
+               pci_release_region(pcidev, 0);
+               return -ENODEV;
+       }
+       #else /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+       if(pci_request_regions(pcidev, "esdpci200") != 0){
+               CANMSG("Request of esdpci200_plx9050 regions failed\n");
+               return -ENODEV;
+       }
+       #endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+
+
+        /* ioports, PLX local configuration registers */
+       candev->res_addr=pci_resource_start(pcidev,1);
+       /*MEM window for SJA1000 chips*/
+       bar2_addr = pci_resource_start(pcidev,2);
+       candev->io_addr = bar2_addr;
+       if( ! (remap_addr=ioremap(bar2_addr, 
+               pci_resource_len(pcidev,2)))) /*MEM window for SJA1000 chips*/
+       {
+               CANMSG("Unable to access I/O memory at: 0x%lx\n", (unsigned long)bar2_addr);
+               goto ioremap_error;
+       }
+
+       can_base_addr_fixup(candev, remap_addr);
+       CANMSG("esdpci200_sja IO-memory: 0x%lx - 0x%lx (VMA 0x%lx)\n", 
+               (unsigned long) bar2_addr,
+               (unsigned long) bar2_addr + pci_resource_len(pcidev,2) - 1,
+               (long) remap_addr);
+
        return 0;
+
+    ioremap_error:
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
+       pci_release_region(pcidev, 2);
+       pci_release_region(pcidev, 1);
+       pci_release_region(pcidev, 0);
+#else /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+       pci_release_regions(pcidev);
+#endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
+       return -ENODEV;
 }
 
 int esdpci200_release_io(struct candevice_t *candev)
@@ -141,7 +194,7 @@ int esdpci200_release_io(struct candevice_t *candev)
        esdpci200_disconnect_irq(candev);
        esdpci200_pci_soft_reset(candev);
 
-       iounmap((void*)candev->io_addr);
+       iounmap(candev->dev_base_addr);
     #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
        pci_release_region(candev->sysdevptr.pcidev, 2);
        pci_release_region(candev->sysdevptr.pcidev, 1);
@@ -153,16 +206,14 @@ int esdpci200_release_io(struct candevice_t *candev)
        return 0;
 }
 
-void esdpci200_write_register(unsigned data, unsigned long address)
+void esdpci200_write_register(unsigned data, can_ioptr_t address)
 {
-       //writeb(data,address); 
        iowrite8((u8)data,(void*)address);
        wmb();
 }
 
-unsigned esdpci200_read_register(unsigned long address)
+unsigned esdpci200_read_register(can_ioptr_t address)
 {
-       //return readb(address);
        return ioread8((void*)address);
 }
 
@@ -213,7 +264,6 @@ int esdpci200_reset(struct candevice_t *candev)
 int esdpci200_init_hw_data(struct candevice_t *candev)
 {
        struct pci_dev *pcidev = NULL;
-       unsigned long bar2_addr;
 
        do {
                pcidev = pci_find_device(ESDPCI200_PCI_VENDOR_ID, ESDPCI200_PCI_PRODUCT_ID, pcidev);
@@ -244,39 +294,15 @@ int esdpci200_init_hw_data(struct candevice_t *candev)
           printk(KERN_CRIT "PCI200 region %d is not MEM\n",2);
           return -EIO;
        }
-       
-
-       #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
-       if(pci_request_region(candev->sysdevptr.pcidev, 0, "esdpci200_plx9050") != 0){
-               CANMSG("Request of esdpci200_plx9050 range failed\n");
-               return -ENODEV;
-       }else if(pci_request_region(candev->sysdevptr.pcidev, 1, "esdpci200_io") != 0){
-               CANMSG("Request of esdpci200_io range failed\n");
-               pci_release_region(candev->sysdevptr.pcidev, 0);
-               return -ENODEV;
-       }else if(pci_request_region(candev->sysdevptr.pcidev, 2, "esdpci200_sja") != 0){
-               CANMSG("Request of esdpci200_sja range failed\n");
-               pci_release_region(candev->sysdevptr.pcidev, 1);
-               pci_release_region(candev->sysdevptr.pcidev, 0);
-               return -ENODEV;
-       }
-       #else /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
-       if(pci_request_regions(candev->sysdevptr.pcidev, "esdpci200") != 0){
-               CANMSG("Request of esdpci200_plx9050 regions failed\n");
-               return -ENODEV;
-       }
-       #endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
 
+        /* Reset/control field - used to store port of PLX9052 control region */
+       candev->res_addr = pci_resource_start(pcidev,1);;
 
-       candev->res_addr=RESET_ADDR; /* reset address not used currently. Not used by other Lincan parts either */
-       candev->dev_base_addr=pci_resource_start(pcidev,1); /* ioports, PLX local configuration registers */
-       bar2_addr = pci_resource_start(pcidev,2);
-       if( ! (candev->io_addr=(long)ioremap(bar2_addr, 
-               pci_resource_len(pcidev,2)))) /*MEM window for SJA1000 chips*/
-       {
-               CANMSG("Unable to access I/O memory at: 0x%lx\n", bar2_addr);
-               goto ioremap_error;
-       }
+       /* Physical address of SJA1000 window, stored for debugging only */
+       candev->io_addr = pci_resource_start(pcidev,2);
+       
+       candev->aux_base_addr=NULL; /* mapped dynamically in esdpci200_request_io() */
+       candev->dev_base_addr=NULL; /* mapped dynamically in esdpci200_request_io() */
        /*candev->flags |= CANDEV_PROGRAMMABLE_IRQ;*/
 
        candev->nr_82527_chips=0;
@@ -284,16 +310,6 @@ int esdpci200_init_hw_data(struct candevice_t *candev)
        candev->nr_all_chips=2;
 
        return 0;
-
-    ioremap_error:
-       #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
-       pci_release_region(candev->sysdevptr.pcidev, 2);
-       pci_release_region(candev->sysdevptr.pcidev, 1);
-       pci_release_region(candev->sysdevptr.pcidev, 0);
-       #else /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
-       pci_release_regions(candev->sysdevptr.pcidev);
-       #endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
-       return -ENODEV;
 }
 
 int esdpci200_init_chip_data(struct candevice_t *candev, int chipnr)
@@ -306,9 +322,7 @@ int esdpci200_init_chip_data(struct candevice_t *candev, int chipnr)
 
 
        sja1000p_fill_chipspecops(candev->chip[chipnr]);
-//     candev->chip[chipnr]->chip_base_addr= candev->io_addr + chipnr*IO_RANGE;
-       //candev->chip[chipnr]->chip_base_addr= (long)ioremap( candev->io_addr, IO_RANGE ) + chipnr * IO_RANGE;
-       candev->chip[chipnr]->chip_base_addr=candev->io_addr + chipnr * IO_RANGE;
+       candev->chip[chipnr]->chip_base_addr=candev->dev_base_addr + chipnr * IO_RANGE;
 
        candev->chip[chipnr]->chipspecops->irq_handler=esdpci200_irq_handler;
 
index 00b7d6d..1cf71e7 100644 (file)
@@ -79,7 +79,7 @@ int pimx1_setup_hardware(struct candevice_t *candev)
  */
 int pimx1_request_io(struct candevice_t *candev)
 {
-        int remap_addr;
+        can_ioptr_t remap_addr;
 
        if(pimx1_setup_hardware(candev)<0){
                CANMSG("PiMX1 board hardware setup failure\n");