From 081fc75264b9a07fdaf6ad59744f48e6164154f1 Mon Sep 17 00:00:00 2001 From: ppisa Date: Wed, 15 Aug 2007 20:06:04 +0000 Subject: [PATCH] Changes in CAN/PCI-200 card sources to be more clean in types 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 | 138 +++++++++++++++++++++++------------------ lincan/src/pimx1.c | 2 +- 2 files changed, 77 insertions(+), 63 deletions(-) diff --git a/lincan/src/esdpci200.c b/lincan/src/esdpci200.c index ead998b..1b62e7e 100644 --- a/lincan/src/esdpci200.c +++ b/lincan/src/esdpci200.c @@ -14,10 +14,10 @@ #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 @@ -62,14 +61,14 @@ 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; diff --git a/lincan/src/pimx1.c b/lincan/src/pimx1.c index 00b7d6d..1cf71e7 100644 --- a/lincan/src/pimx1.c +++ b/lincan/src/pimx1.c @@ -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"); -- 2.39.2