X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/d659fb1c5ce646e10820cfd349d8a4220d1ee67d..95c031e101c74ae6472a7e538f3128f67a490082:/lincan/src/unican.c diff --git a/lincan/src/unican.c b/lincan/src/unican.c index 5cab054..d93063a 100644 --- a/lincan/src/unican.c +++ b/lincan/src/unican.c @@ -3,7 +3,7 @@ * Written for new CAN driver version by Pavel Pisa - OCERA team member * email:pisa@cmp.felk.cvut.cz * This software is released under the GPL-License. - * Version lincan-0.2 9 Jul 2003 + * Version lincan-0.3 17 Jun 2004 */ #include "../include/can.h" @@ -43,12 +43,12 @@ long unican_bus_latency(struct msgobj_t *obj) /* * * unican Chip Functionality * * */ -int unican_enable_configuration(struct chip_t *chip) +int unican_enable_configuration(struct canchip_t *chip) { return 0; } -int unican_disable_configuration(struct chip_t *chip) +int unican_disable_configuration(struct canchip_t *chip) { return 0; } @@ -60,7 +60,7 @@ int unican_disable_configuration(struct chip_t *chip) * Return Value: negative value reports error. * File: src/unican.c */ -int unican_chip_config(struct chip_t *chip) +int unican_chip_config(struct canchip_t *chip) { int ret; sCAN_CARD *chipext = (sCAN_CARD *)chip->chip_data; @@ -125,7 +125,7 @@ int unican_chip_config(struct chip_t *chip) * Return Value: negative value reports error. * File: src/unican.c */ -int unican_extended_mask(struct chip_t *chip, unsigned long code, unsigned long mask) +int unican_extended_mask(struct canchip_t *chip, unsigned long code, unsigned long mask) { return 0; } @@ -142,7 +142,7 @@ int unican_extended_mask(struct chip_t *chip, unsigned long code, unsigned long * Return Value: negative value reports error. * File: src/unican.c */ -int unican_baud_rate(struct chip_t *chip, int rate, int clock, int sjw, +int unican_baud_rate(struct canchip_t *chip, int rate, int clock, int sjw, int sampl_pt, int flags) { int ret; @@ -184,7 +184,7 @@ int unican_baud_rate(struct chip_t *chip, int rate, int clock, int sjw, * * File: src/unican.c */ -void unican_read(struct chip_t *chip, struct msgobj_t *obj) { +void unican_read(struct canchip_t *chip, struct msgobj_t *obj) { sCAN_CARD *chipext = (sCAN_CARD *)chip->chip_data; __u16 *ptr16; __u16 u; @@ -193,14 +193,14 @@ void unican_read(struct chip_t *chip, struct msgobj_t *obj) { do { ptr16 = (__u16*)chipext->rxBufPtr; - u = readw(ptr16++); + u = unican_readw(ptr16++); if ( !(u & CL2_MESSAGE_VALID) ) break; /* No more messages in the queue */ obj->rx_msg.id = ((__u32)(u & 0xFF00 )) << 16; - u = readw(ptr16++); + u = unican_readw(ptr16++); obj->rx_msg.id |= ((__u32)( u & 0x00FF )) << 16; obj->rx_msg.id |= (__u32)( u & 0xFF00 ); - u = readw(ptr16++); + u = unican_readw(ptr16++); obj->rx_msg.id |= (__u32)( u & 0x00FF ); @@ -221,17 +221,17 @@ void unican_read(struct chip_t *chip, struct msgobj_t *obj) { if(obj->rx_msg.length > CAN_MSG_LENGTH) obj->rx_msg.length = CAN_MSG_LENGTH; for ( i = 0; i < obj->rx_msg.length; ) { - u = readw(ptr16++); + u = unican_readw(ptr16++); obj->rx_msg.data[i++] = (__u8)( u ); obj->rx_msg.data[i++] = (__u8)( u >> 8 ); } if ( obj->rx_msg.length & 0x01 ) { /* odd */ - timestamp = ( (readw(ptr16++) & 0x00FF) | (u & 0xFF00) ); + timestamp = ( (unican_readw(ptr16++) & 0x00FF) | (u & 0xFF00) ); } else { /* even */ - u = readw(ptr16++); + u = unican_readw(ptr16++); timestamp = (u << 8) | (u >> 8); } - writew(0x000,(__u16*)chipext->rxBufPtr); + unican_writew(0x000,(__u16*)chipext->rxBufPtr); #ifdef CAN_MSG_VERSION_2 obj->rx_msg.timestamp.tv_sec = 0; @@ -259,7 +259,7 @@ void unican_read(struct chip_t *chip, struct msgobj_t *obj) { * Positive value indicates immediate reception of message. * File: src/unican.c */ -int unican_pre_read_config(struct chip_t *chip, struct msgobj_t *obj) +int unican_pre_read_config(struct canchip_t *chip, struct msgobj_t *obj) { return 0; } @@ -274,7 +274,7 @@ int unican_pre_read_config(struct chip_t *chip, struct msgobj_t *obj) * Return Value: negative value reports error. * File: src/unican.c */ -int unican_pre_write_config(struct chip_t *chip, struct msgobj_t *obj, +int unican_pre_write_config(struct canchip_t *chip, struct msgobj_t *obj, struct canmsg_t *msg) { return 0; @@ -291,7 +291,7 @@ int unican_pre_write_config(struct chip_t *chip, struct msgobj_t *obj, * Return Value: negative value reports error. * File: src/unican.c */ -int unican_send_msg(struct chip_t *chip, struct msgobj_t *obj, +int unican_send_msg(struct canchip_t *chip, struct msgobj_t *obj, struct canmsg_t *msg) { return 0; @@ -306,7 +306,7 @@ int unican_send_msg(struct chip_t *chip, struct msgobj_t *obj, * Zero value indicates finishing of all issued transmission requests. * File: src/unican.c */ -int unican_check_tx_stat(struct chip_t *chip) +int unican_check_tx_stat(struct canchip_t *chip) { return 0; } @@ -320,7 +320,7 @@ int unican_check_tx_stat(struct chip_t *chip) * Return Value: negative value reports error. * File: src/unican.c */ -int unican_set_btregs(struct chip_t *chip, unsigned short btr0, +int unican_set_btregs(struct canchip_t *chip, unsigned short btr0, unsigned short btr1) { int ret; @@ -342,7 +342,7 @@ int unican_set_btregs(struct chip_t *chip, unsigned short btr0, * Return Value: negative value reports error. * File: src/unican.c */ -int unican_start_chip(struct chip_t *chip) +int unican_start_chip(struct canchip_t *chip) { return 0; } @@ -354,7 +354,7 @@ int unican_start_chip(struct chip_t *chip) * Return Value: negative value reports error. * File: src/unican.c */ -int unican_stop_chip(struct chip_t *chip) +int unican_stop_chip(struct canchip_t *chip) { return 0; } @@ -368,7 +368,7 @@ int unican_stop_chip(struct chip_t *chip) * Return Value: negative value reports error. * File: src/unican.c */ -int unican_remote_request(struct chip_t *chip, struct msgobj_t *obj) +int unican_remote_request(struct canchip_t *chip, struct msgobj_t *obj) { CANMSG("unican_remote_request not implemented\n"); return -ENOSYS; @@ -383,7 +383,7 @@ int unican_remote_request(struct chip_t *chip, struct msgobj_t *obj) * Return Value: negative value reports error. * File: src/unican.c */ -int unican_standard_mask(struct chip_t *chip, unsigned short code, +int unican_standard_mask(struct canchip_t *chip, unsigned short code, unsigned short mask) { CANMSG("unican_standard_mask not implemented\n"); @@ -397,7 +397,7 @@ int unican_standard_mask(struct chip_t *chip, unsigned short code, * Return Value: negative value reports error. * File: src/unican.c */ -int unican_clear_objects(struct chip_t *chip) +int unican_clear_objects(struct canchip_t *chip) { CANMSG("unican_clear_objects not implemented\n"); return -ENOSYS; @@ -411,7 +411,7 @@ int unican_clear_objects(struct chip_t *chip) * Return Value: negative value reports error. * File: src/unican.c */ -int unican_config_irqs(struct chip_t *chip, short irqs) +int unican_config_irqs(struct canchip_t *chip, short irqs) { CANMSG("unican_config_irqs not implemented\n"); @@ -429,7 +429,7 @@ int unican_config_irqs(struct chip_t *chip, short irqs) * unican_irq_write_handler() for transmit events. * File: src/unican.c */ -void unican_irq_write_handler(struct chip_t *chip, struct msgobj_t *obj) +void unican_irq_write_handler(struct canchip_t *chip, struct msgobj_t *obj) { int cmd; sCAN_CARD *chipext = (sCAN_CARD *)chip->chip_data; @@ -460,7 +460,7 @@ void unican_irq_write_handler(struct chip_t *chip, struct msgobj_t *obj) do { ptr16 = (__u16*)chipext->asyncTxBufPtr; - if(readw(ptr16) & CL2_MESSAGE_VALID) + if(unican_readw(ptr16) & CL2_MESSAGE_VALID) return; /* No free space in asynchronous Tx queue */ cmd=canque_test_outslot(obj->qends, &obj->tx_qedge, &obj->tx_slot); @@ -477,7 +477,7 @@ void unican_irq_write_handler(struct chip_t *chip, struct msgobj_t *obj) } ptr16++; u = ((cobid>>16) & 0x00FF ) + (cobid & 0xFF00); - writew(u,ptr16++); + unican_writew(u,ptr16++); len = obj->tx_slot->msg.length; if(len > CAN_MSG_LENGTH) @@ -489,24 +489,24 @@ void unican_irq_write_handler(struct chip_t *chip, struct msgobj_t *obj) if ( obj->tx_slot->msg.flags & MSG_EXT ) u |= CL2_EXT_FRAME<<8; - writew(u,ptr16++); + unican_writew(u,ptr16++); for ( i = 0; i < len-1; ) { u = obj->tx_slot->msg.data[i++]; u |= ((__u16)obj->tx_slot->msg.data[i]<<8); i++; - writew(u,ptr16++); + unican_writew(u,ptr16++); } if(i == len) { - writew(timestamp,ptr16); + unican_writew(timestamp,ptr16); } else { u = obj->tx_slot->msg.data[i++]; u |= ((timestamp & 0x00FF)<<8); - writew(u,ptr16++); - writew(timestamp & 0x00FF, ptr16); + unican_writew(u,ptr16++); + unican_writew(timestamp & 0x00FF, ptr16); } u = ((cobid>>16) & 0xFF00) | CL2_MESSAGE_VALID; - writew(u,(__u16*)chipext->asyncTxBufPtr); + unican_writew(u,(__u16*)chipext->asyncTxBufPtr); if ( (chipext->asyncTxBufBase + chipext->asyncTxBufSize*16) <= (chipext->asyncTxBufPtr += 16) ) { @@ -531,7 +531,7 @@ void unican_irq_write_handler(struct chip_t *chip, struct msgobj_t *obj) } -void unican_irq_sync_activities(struct chip_t *chip, struct msgobj_t *obj) +void unican_irq_sync_activities(struct canchip_t *chip, struct msgobj_t *obj) { while(!can_msgobj_test_and_set_fl(obj,TX_LOCK)) { @@ -560,7 +560,7 @@ void unican_irq_sync_activities(struct chip_t *chip, struct msgobj_t *obj) * @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 chip_t + * to chip state structure - @struct canchip_t * @regs: system dependent value pointing to registers stored in exception frame * * Interrupt handler is activated when state of CAN controller chip changes, @@ -570,9 +570,8 @@ void unican_irq_sync_activities(struct chip_t *chip, struct msgobj_t *obj) * message queues. * File: src/unican.c */ -can_irqreturn_t unican_irq_handler(int irq, void *dev_id, struct pt_regs *regs) +int unican_irq_handler(int irq, struct canchip_t *chip) { - struct chip_t *chip=(struct chip_t *)dev_id; sCAN_CARD *chipext = (sCAN_CARD *)chip->chip_data; struct msgobj_t *obj=chip->msgobj[0]; __u16 status; @@ -580,11 +579,11 @@ can_irqreturn_t unican_irq_handler(int irq, void *dev_id, struct pt_regs *regs) if(!(chip->flags&CHIP_CONFIGURED)) { CANMSG("unican_irq_handler: called for non-configured device\n"); - return CAN_IRQ_NONE; + return CANCHIP_IRQ_NONE; } if (cl2_get_status(chipext, &status) == CL2_NO_REQUEST) - return CAN_IRQ_NONE; + return CANCHIP_IRQ_NONE; cl2_clear_interrupt(chipext); @@ -609,7 +608,7 @@ can_irqreturn_t unican_irq_handler(int irq, void *dev_id, struct pt_regs *regs) cl2_gen_interrupt(chipext); - return CAN_IRQ_HANDLED; + return CANCHIP_IRQ_HANDLED; } @@ -627,7 +626,7 @@ can_irqreturn_t unican_irq_handler(int irq, void *dev_id, struct pt_regs *regs) * Return Value: negative value reports error. * File: src/unican.c */ -int unican_wakeup_tx(struct chip_t *chip, struct msgobj_t *obj) +int unican_wakeup_tx(struct canchip_t *chip, struct msgobj_t *obj) { can_preempt_disable(); @@ -698,7 +697,7 @@ int unican_reset(struct candevice_t *candev) { int ret; int i; - struct chip_t *chip = candev->chip[0]; + struct canchip_t *chip = candev->chip[0]; sCAN_CARD *chipext; @@ -759,8 +758,6 @@ int unican_init_hw_data(struct candevice_t *candev) return 0; } -#define CHIP_TYPE "unican" - /** * unican_init_chip_data - Initialize chips * @candev: Pointer to candevice/board structure @@ -771,8 +768,8 @@ int unican_init_hw_data(struct candevice_t *candev) */ int unican_init_chip_data(struct candevice_t *candev, int chipnr) { - struct chip_t *chip = candev->chip[chipnr]; - chip->chip_type = CHIP_TYPE; + struct canchip_t *chip = candev->chip[chipnr]; + chip->chip_type = "unican"; chip->chip_base_addr = 0; chip->clock = 10000000; chip->int_clk_reg = 0x0; @@ -812,7 +809,7 @@ int unican_init_chip_data(struct candevice_t *candev, int chipnr) * Return Value: The function always returns zero * File: src/unican.c */ -int unican_init_obj_data(struct chip_t *chip, int objnr) +int unican_init_obj_data(struct canchip_t *chip, int objnr) { struct msgobj_t *obj=chip->msgobj[objnr]; obj->obj_base_addr=chip->chip_base_addr; @@ -854,6 +851,8 @@ int unican_register(struct hwspecops_t *hwspecops) int unican_pci_request_io(struct candevice_t *candev) { + unsigned long remap_addr; + #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,21)) if(pci_request_region(candev->sysdevptr.pcidev, 0, "unican_pci") != 0){ CANMSG("Request of Unican PCI range failed\n"); @@ -866,12 +865,32 @@ 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; + + if ( !( remap_addr = (long) 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); + #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; + + } + 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); + return 0; } int unican_pci_release_io(struct candevice_t *candev) { + iounmap((void*)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))*/ @@ -900,7 +919,7 @@ 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); /*S5920*/ + candev->dev_base_addr=pci_resource_start(pcidev,0); candev->io_addr=candev->dev_base_addr; candev->res_addr=candev->dev_base_addr; @@ -918,7 +937,7 @@ int unican_pci_init_chip_data(struct candevice_t *candev, int chipnr) { int ret; candev->chip[chipnr]->chip_irq=candev->sysdevptr.pcidev->irq; - ret = unican_pci_init_chip_data(candev, chipnr); + ret = unican_init_chip_data(candev, chipnr); candev->chip[chipnr]->flags |= CHIP_IRQ_PCI; return ret; } @@ -941,26 +960,6 @@ int unican_pci_register(struct hwspecops_t *hwspecops) #ifdef CAN_ENABLE_VME_SUPPORT -int unican_vme_reset(struct candevice_t *candev) -{ - struct chip_t *chip = candev->chip[0]; - writew(chip->chip_irq,chip->chip_base_addr+CL2_VME_INT_VECTOR); - return unican_reset(candev); -} - - -int unican_vme_register(struct hwspecops_t *hwspecops) -{ - hwspecops->request_io = unican_request_io; - hwspecops->release_io = unican_release_io; - hwspecops->reset = unican_vme_reset; - hwspecops->init_hw_data = unican_init_hw_data; - hwspecops->init_chip_data = unican_init_chip_data; - hwspecops->init_obj_data = unican_init_obj_data; - hwspecops->write_register = NULL; - hwspecops->read_register = NULL; - hwspecops->program_irq = unican_program_irq; - return 0; -} +#include "unican_vme.c" #endif /*CAN_ENABLE_VME_SUPPORT*/