X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/ce9505f94bf87d40caeed0b0452e39f95ed521b1..829bad30b94beb92822c1a23ef5887175957c94f:/lincan/src/unican.c diff --git a/lincan/src/unican.c b/lincan/src/unican.c index 4efabc8..7b27ade 100644 --- a/lincan/src/unican.c +++ b/lincan/src/unican.c @@ -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;*/