]> rtime.felk.cvut.cz Git - lincan.git/blobdiff - lincan/src/setup.c
Separated normal read and RTR assisted read transfer.
[lincan.git] / lincan / src / setup.c
index 564b3c0ecd5995323dc54a0ea61ef93767b167bb..9c4af7669dce09e11cd66fc8bc5b45a3c4f5120a 100644 (file)
 #include "../include/setup.h"
 #include "../include/finish.h"
 
+#ifdef CAN_ENABLE_VME_SUPPORT
+#include "ca91c042.h"
+/* Modified version of ca91c042 driver can be found in
+ * components/comm/contrib directory. */
+#endif
+
 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
@@ -272,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;
@@ -397,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);
@@ -445,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;
@@ -492,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;
@@ -562,31 +568,47 @@ 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);
                        chip->flags |= CHIP_IRQ_SETUP;
                }
        } else {
-#ifdef CAN_ENABLE_VME_SUPPORT          
-               /* TODO: Move here the irq setup from
-                * unican_vme_request_io(). To do this, the VME bridge
-                * driver should be modified. */
+#ifdef CAN_ENABLE_VME_SUPPORT
+               if (chip->chip_irq < 1 || chip->chip_irq > 255) {
+                       CANMSG("Bad irq parameter. (1 <= irq <= 255).\n");
+                       return -EINVAL;
+               }
+               
+               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
        }
        return 1;
@@ -597,16 +619,17 @@ 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 { 
 #ifdef CAN_ENABLE_VME_SUPPORT
-               /* TODO: Move here the irq cleanup from
-                * unican_vme_release_io(). To do this, the VME bridge
-                * driver should be modified. */
+                       free_vmeirq(chip->chip_irq);
 #endif
                }
                        chip->flags &= ~CHIP_IRQ_SETUP;