]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/src/unican.c
Merge branch 'master' into can-usb1
[lincan.git] / lincan / src / unican.c
index 4efabc874e98ef4be97510e1effc2f184fd08b93..7b27ade51705b63b41d7102bf25bdc14a37c9a7b 100644 (file)
@@ -29,18 +29,6 @@ static void unican_delay(long msdelay)
 
 }
 
-
-long unican_bus_latency(struct msgobj_t *obj)
-{
-       long latency;
-       latency=obj->hostchip->baudrate;
-       if(latency){
-               latency=(long)HZ*1000/latency;
-       }
-       return latency;
-}
-
-
 /* * * unican Chip Functionality * * */
 
 int unican_enable_configuration(struct canchip_t *chip)
@@ -359,6 +347,34 @@ int unican_stop_chip(struct canchip_t *chip)
        return 0;
 }
 
+/**
+ * unican_attach_to_chip: - attaches to the chip, setups registers and state
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/sja1000p.c
+ */
+int unican_attach_to_chip(struct canchip_t *chip)
+{
+       return 0;
+}
+
+/**
+ * unican_release_chip: - called before chip structure removal if %CHIP_ATTACHED is set
+ * @chip: pointer to chip state structure
+ *
+ * Return Value: negative value reports error.
+ * File: src/sja1000p.c
+ */
+int unican_release_chip(struct canchip_t *chip)
+{
+       sCAN_CARD *chipext = (sCAN_CARD *)chip->chip_data;
+
+       unican_stop_chip(chip);
+       cl2_clear_interrupt(chipext);
+
+       return 0;
+}
 
 /**
  * unican_remote_request: - configures message object and asks for RTR message
@@ -558,10 +574,7 @@ void unican_irq_sync_activities(struct canchip_t *chip, struct msgobj_t *obj)
 /**
  * unican_irq_handler: - interrupt service routine
  * @irq: interrupt vector number, this value is system specific
- * @dev_id: driver private pointer registered at time of request_irq() call.
- *     The CAN driver uses this pointer to store relationship of interrupt
- *     to chip state structure - @struct canchip_t
- * @regs: system dependent value pointing to registers stored in exception frame
+ * @chip: pointer to chip state structure
  * 
  * Interrupt handler is activated when state of CAN controller chip changes,
  * there is message to be read or there is more space for new messages or
@@ -582,8 +595,13 @@ int unican_irq_handler(int irq, struct canchip_t *chip)
                return CANCHIP_IRQ_NONE;
        }
 
-       if (cl2_get_status(chipext, &status) == CL2_NO_REQUEST)
+       if (cl2_get_status(chipext, &status) == CL2_NO_REQUEST) {
+               /* Reenable interrupts generation, this has to be even there, 
+                * because irq_accept disables interrupts
+                */
+               cl2_gen_interrupt(chipext);
                return CANCHIP_IRQ_NONE;
+       }
 
        cl2_clear_interrupt(chipext);
 
@@ -606,12 +624,31 @@ int unican_irq_handler(int irq, struct canchip_t *chip)
                unican_read(chip, obj);
        }
 
+       /* Reenable interrupts generation */
        cl2_gen_interrupt(chipext);
 
        return CANCHIP_IRQ_HANDLED;
 }
 
 
+/**
+ * unican_irq_accept: - fast irq accept routine, blocks further interrupts
+ * @irq: interrupt vector number, this value is system specific
+ * @chip: pointer to chip state structure
+ * 
+ * This routine only accepts interrupt reception and stops further
+ * incoming interrupts, but does not handle situation causing interrupt.
+ * File: src/unican.c
+ */
+int unican_irq_accept(int irq, struct canchip_t *chip)
+{
+       sCAN_CARD *chipext = (sCAN_CARD *)chip->chip_data;
+
+       cl2_clear_interrupt(chipext);
+
+       return CANCHIP_IRQ_ACCEPTED;
+}
+
 /*void unican_do_tx_timeout(unsigned long data)
 {
        struct msgobj_t *obj=(struct msgobj_t *)data;
@@ -656,12 +693,12 @@ int unican_wakeup_tx(struct canchip_t *chip, struct msgobj_t *obj)
  */
 int unican_request_io(struct candevice_t *candev)
 {
-        unsigned long remap_addr;
+        can_ioptr_t remap_addr;
        if (!can_request_mem_region(candev->io_addr,IO_RANGE,DEVICE_NAME " - unican")) {
                CANMSG("Unable to request IO-memory: 0x%lx\n",candev->io_addr);
                return -ENODEV;
        }
-       if ( !( remap_addr = (long) ioremap( candev->io_addr, IO_RANGE ) ) ) {
+       if ( !( remap_addr = ioremap( candev->io_addr, IO_RANGE ) ) ) {
                CANMSG("Unable to access I/O memory at: 0x%lx\n", candev->io_addr);
                can_release_mem_region(candev->io_addr,IO_RANGE);
                return -ENODEV;
@@ -681,7 +718,7 @@ int unican_request_io(struct candevice_t *candev)
  */
 int unican_release_io(struct candevice_t *candev)
 {
-       iounmap((void*)candev->dev_base_addr);
+       iounmap(candev->dev_base_addr);
        can_release_mem_region(candev->io_addr,IO_RANGE);
        return 0;
 }
@@ -775,7 +812,7 @@ int unican_init_chip_data(struct candevice_t *candev, int chipnr)
        chip->int_clk_reg = 0x0;
        chip->int_bus_reg = 0x0;
        chip->max_objects = 1;
-       chip->chip_base_addr=candev->io_addr;
+       chip->chip_base_addr=candev->dev_base_addr;
                        
        CANMSG("initializing unican chip operations\n");
        chip->chipspecops->chip_config=unican_chip_config;
@@ -794,10 +831,12 @@ int unican_init_chip_data(struct candevice_t *candev, int chipnr)
        chip->chipspecops->enable_configuration=unican_enable_configuration;
        chip->chipspecops->disable_configuration=unican_disable_configuration;
        chip->chipspecops->set_btregs=unican_set_btregs;
+       chip->chipspecops->attach_to_chip=unican_attach_to_chip;
+       chip->chipspecops->release_chip=unican_release_chip;
        chip->chipspecops->start_chip=unican_start_chip;
        chip->chipspecops->stop_chip=unican_stop_chip;
        chip->chipspecops->irq_handler=unican_irq_handler;
-       chip->chipspecops->irq_accept=NULL;
+       chip->chipspecops->irq_accept=unican_irq_accept;
 
        return 0;
 }
@@ -852,7 +891,7 @@ int unican_register(struct hwspecops_t *hwspecops)
 
 int unican_pci_request_io(struct candevice_t *candev)
 {
-        unsigned long remap_addr;
+        can_ioptr_t remap_addr;
 
     #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
        if(pci_request_region(candev->sysdevptr.pcidev, 0, "unican_pci") != 0){
@@ -866,11 +905,10 @@ int unican_pci_request_io(struct candevice_t *candev)
        }
     #endif /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
 
-       candev->dev_base_addr=pci_resource_start(candev->sysdevptr.pcidev,0);
-       candev->io_addr=candev->dev_base_addr;
-       candev->res_addr=candev->dev_base_addr;
+       candev->io_addr=pci_resource_start(candev->sysdevptr.pcidev,0);
+       candev->res_addr=candev->io_addr;
 
-       if ( !( remap_addr = (long) ioremap( candev->io_addr, IO_RANGE ) ) ) {
+       if ( !( remap_addr = ioremap( candev->io_addr, IO_RANGE ) ) ) {
                CANMSG("Unable to access I/O memory at: 0x%lx\n", candev->io_addr);
            #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
                pci_release_region(candev->sysdevptr.pcidev, 0);
@@ -883,7 +921,8 @@ int unican_pci_request_io(struct candevice_t *candev)
        can_base_addr_fixup(candev, remap_addr);
        DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", candev->io_addr, candev->io_addr + IO_RANGE - 1);
        DEBUGMSG("VMA: dev_base_addr: 0x%lx chip_base_addr: 0x%lx\n", 
-               candev->dev_base_addr, candev->chip[0]->chip_base_addr);
+               can_ioptr2ulong(candev->dev_base_addr),
+               can_ioptr2ulong(candev->chip[0]->chip_base_addr));
 
        return 0;
 }
@@ -891,7 +930,7 @@ int unican_pci_request_io(struct candevice_t *candev)
 
 int unican_pci_release_io(struct candevice_t *candev)
 {
-       iounmap((void*)candev->dev_base_addr);
+       iounmap(candev->dev_base_addr);
     #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))
        pci_release_region(candev->sysdevptr.pcidev, 0);
     #else /*(LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21))*/
@@ -920,9 +959,9 @@ int unican_pci_init_hw_data(struct candevice_t *candev)
                printk(KERN_CRIT "Unican PCI region 0 is not MEM\n");
                return -EIO;
        }
-       candev->dev_base_addr=pci_resource_start(pcidev,0);
-       candev->io_addr=candev->dev_base_addr;
-       candev->res_addr=candev->dev_base_addr;
+       candev->io_addr=pci_resource_start(pcidev,0);
+       candev->res_addr=candev->io_addr;
+       candev->dev_base_addr=NULL;
        
        /*candev->flags |= CANDEV_PROGRAMMABLE_IRQ;*/