X-Git-Url: http://rtime.felk.cvut.cz/gitweb/lincan.git/blobdiff_plain/02003635287383cbe34c3da8107e9984ce4d894a..a682f9de48bcce43fba6141fbdb4d451914e0bb4:/lincan/src/setup.c diff --git a/lincan/src/setup.c b/lincan/src/setup.c index 394704c..9c4af76 100644 --- a/lincan/src/setup.c +++ b/lincan/src/setup.c @@ -23,7 +23,7 @@ int init_hwspecops(struct candevice_t *candev, int *irqnum_p); int init_device_struct(int card, int *chan_param_idx_p, int *irq_param_idx_p); int init_chip_struct(struct candevice_t *candev, int chipnr, int irq, long baudrate); -int init_obj_struct(struct candevice_t *candev, struct chip_t *hostchip, int objnr); +int init_obj_struct(struct candevice_t *candev, struct canchip_t *hostchip, int objnr); /** * can_checked_malloc - memory allocation with registering of requested blocks @@ -278,7 +278,7 @@ int register_obj_struct(struct msgobj_t *obj, int minorbase) * * Return Value: returns negative number in the case of fail */ -int register_chip_struct(struct chip_t *chip, int minorbase) +int register_chip_struct(struct canchip_t *chip, int minorbase) { static int next_chip_slot=0; int i; @@ -403,7 +403,7 @@ int init_device_struct(int card, int *chan_param_idx_p, int *irq_param_idx_p) for (chipnr=0; chipnr < candev->nr_all_chips; chipnr++) { int m=minor[*chan_param_idx_p+chipnr]; - struct chip_t *chip=candev->chip[chipnr]; + struct canchip_t *chip=candev->chip[chipnr]; int objnr; register_chip_struct(chip, m); @@ -451,15 +451,15 @@ int init_device_struct(int card, int *chan_param_idx_p, int *irq_param_idx_p) */ int init_chip_struct(struct candevice_t *candev, int chipnr, int irq, long baudrate) { - struct chip_t *chip; + struct canchip_t *chip; int objnr; int ret; - candev->chip[chipnr]=(struct chip_t *)can_checked_malloc(sizeof(struct chip_t)); + candev->chip[chipnr]=(struct canchip_t *)can_checked_malloc(sizeof(struct canchip_t)); if ((chip=candev->chip[chipnr])==NULL) return -ENOMEM; - memset(chip, 0, sizeof(struct chip_t)); + memset(chip, 0, sizeof(struct canchip_t)); chip->write_register=candev->hwspecops->write_register; chip->read_register=candev->hwspecops->read_register; @@ -498,7 +498,7 @@ int init_chip_struct(struct candevice_t *candev, int chipnr, int irq, long baudr * * Return Value: returns negative number in the case of fail */ -int init_obj_struct(struct candevice_t *candev, struct chip_t *hostchip, int objnr) +int init_obj_struct(struct candevice_t *candev, struct canchip_t *hostchip, int objnr) { struct canque_ends_t *qends; struct msgobj_t *obj; @@ -568,21 +568,32 @@ int init_hwspecops(struct candevice_t *candev, int *irqnum_p) #ifndef CAN_WITH_RTL +can_irqreturn_t can_default_irq_dispatch(int irq, void *dev_id, struct pt_regs *regs) +{ + int retval; + struct canchip_t *chip=(struct canchip_t *)dev_id; + + retval=chip->chipspecops->irq_handler(irq, chip); + return CAN_IRQ_RETVAL(retval); +} + /** * can_chip_setup_irq - attaches chip to the system interrupt processing * @chip: pointer to CAN chip structure * * Return Value: returns negative number in the case of fail */ -int can_chip_setup_irq(struct chip_t *chip) +int can_chip_setup_irq(struct canchip_t *chip) { if(chip==NULL) return -1; if(!chip->chipspecops->irq_handler) return 0; + if(chip->flags & CHIP_IRQ_CUSTOM) + return 1; if ((chip->flags & CHIP_IRQ_VME) == 0) { - if (request_irq(chip->chip_irq,chip->chipspecops->irq_handler,SA_SHIRQ,DEVICE_NAME,chip)) + if (request_irq(chip->chip_irq,can_default_irq_dispatch,SA_SHIRQ,DEVICE_NAME,chip)) return -1; else { DEBUGMSG("Registered interrupt %d\n",chip->chip_irq); @@ -595,7 +606,7 @@ int can_chip_setup_irq(struct chip_t *chip) return -EINVAL; } - request_vmeirq(chip->chip_irq, chip->chipspecops->irq_handler, chip); + request_vmeirq(chip->chip_irq, can_default_irq_dispatch, chip); DEBUGMSG("Registered VME interrupt vector %d\n",chip->chip_irq); chip->flags |= CHIP_IRQ_SETUP; #endif @@ -608,9 +619,12 @@ int can_chip_setup_irq(struct chip_t *chip) * can_chip_free_irq - unregisters chip interrupt handler from the system * @chip: pointer to CAN chip structure */ -void can_chip_free_irq(struct chip_t *chip) +void can_chip_free_irq(struct canchip_t *chip) { if((chip->flags & CHIP_IRQ_SETUP) && (chip->chip_irq>=0)) { + if(chip->flags & CHIP_IRQ_CUSTOM) + return; + if ((chip->flags & CHIP_IRQ_VME) == 0) free_irq(chip->chip_irq, chip); else {