]> rtime.felk.cvut.cz Git - lincan.git/commitdiff
Merge branch 'master' into can-usb1
authorPavel Pisa <pisa@cmp.felk.cvut.cz>
Sat, 1 Oct 2011 16:29:51 +0000 (18:29 +0200)
committerPavel Pisa <pisa@cmp.felk.cvut.cz>
Sat, 1 Oct 2011 16:29:51 +0000 (18:29 +0200)
1  2 
lincan/src/main.c

diff --combined lincan/src/main.c
index 367c98db26e13da5687768b0ec9927fa7b24da43,c2c8b1e945ba734acc577002d6fdf21300e4ae7c..a0740eb16cb357b9cbed438eabf9c7e895caeff1
  #include "../include/can_iortl.h"
  #endif /*CAN_WITH_RTL*/
  
 +#if defined(CONFIG_OC_LINCAN_CARD_usbcan)
 +      #include "../include/usbcan.h"
 +#endif
 +
  can_spinlock_t canuser_manipulation_lock;
  
  int major=CAN_MAJOR;
@@@ -204,6 -200,13 +204,13 @@@ devfs_handle_t  devfs_handles[MAX_TOT_M
  #endif
  #endif
  
+ #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36))
+ static int can_oldapi_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
+ {
+       return can_ioctl(file, cmd, arg);
+ }
+ #endif /* 2.6.36 */
  /* Pointers to dynamically allocated memory are maintained in a linked list
   * to ease memory deallocation.
   */
@@@ -217,7 -220,11 +224,11 @@@ struct file_operations can_fops
        read:           can_read,
        write:          can_write,
        poll:           can_poll,
-       ioctl:          can_ioctl,
+   #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,36))
+       ioctl:          can_oldapi_ioctl,
+   #else /* Linux 3.x */
+       unlocked_ioctl: can_ioctl,
+   #endif /* Linux 3.x */
        open:           can_open,
        release:        can_close,
    #ifdef CAN_ENABLE_KERN_FASYNC
@@@ -391,15 -398,6 +402,15 @@@ int init_module(void
                }
          }
  #endif
 +
 +#if defined(CONFIG_OC_LINCAN_CARD_usbcan)
 +      res = usbcan_init();
 +      if (res){
 +              CANMSG("usb_register for usbcan failed. Error number %d.\n", res);
 +              goto memory_error;
 +      }
 +#endif
 +
        return 0;
  
  #ifdef CONFIG_PROC_FS
                return -ENODEV;
  }
  
 +
 +
 +
 +struct candevice_t* register_hotplug_dev(const char *hwname,int (*chipdataregfnc)(struct canchip_t *ch,void *data),void *devdata){
 +      int i=0, j, board=0;
 +      struct candevice_t *candev;
 +      struct canchip_t *chip;
 +      struct boardtype_t *brp;
 +
 +      while ( (hw[board] != NULL) && (board < MAX_HW_CARDS) )
 +              board++;
 +      if (board>=MAX_HW_CARDS){
 +              CANMSG("Maximum number of devices has been reached, no space for new device");
 +              return NULL;
 +      }
 +      brp = boardtype_find(hwname);
 +      if(!brp) {
 +              CANMSG("Sorry, hardware \"%s\" is currently not supported.\n",hwname);
 +              return NULL;
 +      }
 +      if (board==MAX_HW_CARDS){
 +                      CANMSG("Device \"%s\" could not be registered due to internal limits.\n",hwname);
 +                      return NULL;
 +      }
 +      hw[board]=brp->boardtype;
 +
 +      if (init_new_hw_struct(board)){
 +              CANMSG("HW struct creation failed.\n");
 +              return NULL;
 +      }
 +
 +      #ifdef CAN_DEBUG
 +              list_hw();
 +      #endif
 +
 +      candev=hardware_p->candevice[board];
 +
 +      /* Adding link to usb device structure into can device */
 +      candev->sysdevptr.anydev=devdata;
 +
 +      if (candev->hwspecops->request_io(candev))
 +              goto request_io_error;
 +      candev->flags|=CANDEV_IO_RESERVED;
 +
 +      if (candev->hwspecops->reset(candev))
 +              goto reset_error;
 +
 +      for(j=0; j<candev->nr_all_chips; j++) {
 +              if((chip=candev->chip[j])==NULL)
 +                      continue;
 +
 +              if (chipdataregfnc && devdata){
 +                      if (chipdataregfnc(chip,devdata))
 +                              goto interrupt_error;
 +              }
 +
 +              if(chip->chipspecops->attach_to_chip(chip)<0) {
 +                      CANMSG("Initial attach to the chip HW failed\n");
 +                      goto interrupt_error;
 +              }
 +
 +              chip->flags |= CHIP_ATTACHED;
 +
 +              if(can_chip_setup_irq(chip)<0) {
 +                      CANMSG("Error to setup chip IRQ\n");
 +                      goto interrupt_error;
 +              }
 +      }
 +
 +      if (candev->flags & CANDEV_PROGRAMMABLE_IRQ)
 +              if (candev->hwspecops->program_irq(candev)){
 +                      CANMSG("Error to program board interrupt\n");
 +                      goto interrupt_error;
 +              }
 +      CANMSG("Registering /proc entry\n");
 +#ifdef CONFIG_PROC_FS
 +      if (can_init_procentry(board))
 +              goto proc_error;
 +#endif
 +
 +#if defined(CONFIG_DEVFS_FS) || (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
 +      {
 +              #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,0))
 +              char dev_name[32];
 +              #else
 +              struct class_device *this_dev;
 +              #endif
 +              int dev_minor;
 +              for(i=0;i<MAX_TOT_MSGOBJS;i++) {
 +                      if(!objects_p[i]) continue;
 +                      if(objects_p[i]->hostchip->hostdevice != candev) continue;
 +
 +                      dev_minor=objects_p[i]->minor;
 +                      #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,0))
 +                      sprintf (dev_name, "can%d", dev_minor);
 +                      devfs_handles[i]=devfs_register(NULL, dev_name,
 +                      DEVFS_FL_DEFAULT, major, dev_minor,
 +                      S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP,
 +                      &can_fops, (void*)objects_p[i]);
 +                      #else
 +                      #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,14))
 +                      this_dev=class_device_create(can_class, MKDEV(major, dev_minor), NULL,  "can%d", dev_minor);
 +                      #elif  LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25) /* >= 2.6.15 */
 +                      this_dev=class_device_create(can_class, NULL, MKDEV(major, dev_minor), NULL,  "can%d", dev_minor);
 +                      #elif  LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,27)
 +                      this_dev=device_create_drvdata(can_class, NULL, MKDEV(major, dev_minor), objects_p[i],  "can%d", dev_minor);
 +                      #else /* >= 2.6.28 */
 +                      this_dev=device_create(can_class, NULL, MKDEV(major, dev_minor), objects_p[i],  "can%d", dev_minor);
 +                      #endif /* >= 2.6.28 */
 +                      if(IS_ERR(this_dev)){
 +                              CANMSG("problem to create device \"can%d\" in the class \"can\"\n", dev_minor);
 +                    #if  LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25)
 +                      }else{
 +                              /*this_dev->class_data=objects_p[i];*/
 +                              class_set_devdata(this_dev,objects_p[i]);
 +                    #endif /* <= 2.6.25 */
 +                      }
 +                      #ifdef CONFIG_DEVFS_FS
 +                      devfs_mk_cdev(MKDEV(major, dev_minor), S_IFCHR | S_IRUGO | S_IWUGO, "can%d", dev_minor);
 +                      #endif
 +                      #endif
 +              }
 +      }
 +#endif
 +      return candev;
 +
 +#ifdef CONFIG_PROC_FS
 +      proc_error: ;
 +              CANMSG("Error registering /proc entry.\n");
 +              goto memory_error;
 +#endif
 +
 +      interrupt_error: ;
 +              goto memory_error;
 +
 +      reset_error: ;
 +              CANMSG("Error resetting device.\n");
 +              goto memory_error;
 +
 +      request_io_error: ;
 +              CANMSG("Error to request IO resources for device.\n");
 +              goto memory_error;
 +
 +      memory_error: ;
 +
 +              #ifdef CAN_WITH_RTL
 +      rtldev_error:
 +              #endif /*CAN_WITH_RTL*/
 +
 +//    register_error:
 +//            if ( can_del_mem_list() )
 +//                    CANMSG("Error deallocating memory\n");
 +
 +              return NULL;
 +}
 +
 +void deregister_hotplug_dev(struct candevice_t *dev)
 +{
 +      int i=0;
 +      int dev_minor;
 +
 +      if (!dev)
 +              return;
 +      DEBUGMSG("Deregistering hotplug device.\n");
 +
 +#ifdef CONFIG_PROC_FS
 +      if (can_delete_procentry(dev))
 +              CANMSG("Error unregistering /proc/can entry.\n");
 +#endif
 +
 +#if defined(CONFIG_DEVFS_FS) || (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
 +      for(i=0;i<MAX_TOT_MSGOBJS;i++) {
 +              if(!objects_p[i]) continue;
 +              if(objects_p[i]->hostchip->hostdevice != dev) continue;
 +              #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,0))
 +              if(devfs_handles[i])
 +                      devfs_unregister(devfs_handles[i]);
 +              #else
 +              dev_minor=objects_p[i]->minor;
 +              if(dev_minor>=0){
 +                      #ifdef CONFIG_DEVFS_FS
 +                      devfs_remove("can%d", dev_minor);
 +                      #endif
 +                      #if  LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,25)
 +                      class_device_destroy(can_class, MKDEV(major, dev_minor));
 +                      #else /* >= 2.6.26 */
 +                      device_destroy(can_class, MKDEV(major, dev_minor));
 +                      #endif /* >= 2.6.26 */
 +              }
 +              #endif
 +      }
 +#endif
 +
 +}
 +
 +
 +void cleanup_hotplug_dev(struct candevice_t *dev)
 +{
 +      int i=0;
 +      int dev_minor;
 +
 +      if (!dev)
 +              return;
 +      DEBUGMSG("Cleaning up hotplug device.\n");
 +
 +      for(i=0;i<MAX_TOT_CHIPS;i++){
 +              if(!chips_p[i]) continue;
 +              if(chips_p[i]->hostdevice != dev) continue;
 +              chips_p[i]=NULL;
 +      }
 +
 +      hardware_p->candevice[dev->candev_idx]=NULL;
 +      hardware_p->nr_boards--;
 +      hw[dev->candev_idx]=NULL;
 +
 +      candevice_done(dev);
 +      can_checked_free(dev);
 +}
 +
 +
 +
 +
  void cleanup_module(void)
  {
  #if defined(CONFIG_DEVFS_FS) || (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0))
        int i=0;
  #endif
  
 +#if defined(CONFIG_OC_LINCAN_CARD_usbcan)
 +      DEBUGMSG("Unregistering usbcan.\n");
 +      usbcan_exit();
 +#endif
 +
 +      DEBUGMSG("Continuing with coldplug cleanup.\n");
  #ifdef CONFIG_PROC_FS
        if (can_delete_procdir())
                CANMSG("Error unregistering /proc/can entry.\n");
        canqueue_rtl_done();
        #endif /*CAN_WITH_RTL*/
  
 +      DEBUGMSG("Can hardware cleanup done, freeing memory.\n");
 +
        if ( can_del_mem_list() )
                CANMSG("Error deallocating memory\n");