1 /*******************************************************************
2 uLan Communication - uL_DRV - multiplatform uLan driver
4 ul_linusb.c - Linux USB specific support routines
6 (C) Copyright 1996-2004 by Pavel Pisa - project originator
7 http://cmp.felk.cvut.cz/~pisa
8 (C) Copyright 1996-2004 PiKRON Ltd.
10 (C) Copyright 2002-2004 Petr Smolik
13 The uLan driver project can be used and distributed
14 in compliance with any of next licenses
15 - GPL - GNU Public License
16 See file COPYING for details.
17 - LGPL - Lesser GNU Public License
18 - MPL - Mozilla Public License
19 - and other licenses added by project originator
21 Code can be modified and re-distributed under any combination
22 of the above listed licenses. If contributor does not agree with
23 some of the licenses, he/she can delete appropriate line.
24 WARNING: if you delete all lines, you are not allowed to
25 distribute code or sources in any form.
26 *******************************************************************/
28 /*******************************************************************/
29 /* USB Devices Support */
31 int ul_usb_ps1_init(ul_drv *udrv, int port, int irq, int baud, long baudbase, int options);
34 static int /*__devinit*/
35 ul_usb_init_chan(struct usb_device *dev, unsigned int ifnum,
36 const struct usb_device_id *ent, ul_drv **pudrv,
37 ul_chip_init_fnc *chip_init, int options)
48 kc_devfs_handle_t devfs_handle;
50 #endif /* UL_WITH_DEVFS */
53 /* try to find best minor and parameters */
54 match=ulan_init_find_minor("usb","unknown","unknown",&minor,&i);
56 abaud=baud[i];amy_adr=my_adr[i]; abaudbase=baudbase[i];
60 if(!(udrv=MALLOC(sizeof(ul_drv)))) return -ENOMEM;
62 memset(udrv,0,sizeof(ul_drv));
63 /* set initial state */
64 ul_drv_new_init_state(udrv, amy_adr);
65 udrv->dev=(struct pci_dev *)dev;
66 /* init chip driver */
67 if((ret=(*chip_init)(udrv, ifnum, 0, abaud, abaudbase, options))<0){
68 printk(KERN_CRIT "ul_usb_init_chan: ERROR - chip_init returned %d\n",ret);
72 /* setups buffers, ports and irq for sucesfully detected device */
73 if((ret=ul_drv_new_start(udrv,ulbuffer))<0){
74 printk(KERN_CRIT "ulan_init_chan: ERROR - ul_drv_new_start returned %d\n",ret);
79 sprintf (dev_name, "ulan%d", minor);
80 devfs_handle=kc_devfs_new_cdev(NULL, MKDEV(ulan_major_dev, minor),
81 S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP,
82 &ulan_fops, udrv, dev_name);
83 udrv->devfs_handle=devfs_handle;
84 #endif /* UL_WITH_DEVFS */
86 printk(KERN_INFO "ul_usb_init_chan: minor=%d baud=%d my_adr=%d ready\n",
87 minor,udrv->baud_val,udrv->my_adr);
90 ul_drv_arr[minor]=udrv;
91 kc_class_device_create(ulan_class, NULL, MKDEV(ulan_major_dev, minor),
92 kc_usb_dev_to_dev(dev), "ulan%d", minor);
99 #if (LINUX_VERSION_CODE < VERSION(2,5,41))
100 static void *ul_usb_probe(struct usb_device *dev, unsigned int ifnum, const struct usb_device_id *id)
102 unsigned long driver_info=id->driver_info;
104 printk(KERN_INFO "ulan_init_one: USB device found devnum=%d, ifnum=%d\n",
106 switch(driver_info&~0xff){
108 if(ul_usb_init_chan(dev,ifnum,id,&udrv,ul_usb_ps1_init,driver_info)<0)
110 printk(KERN_INFO "ul_usb_probe: data type\n");
113 printk(KERN_CRIT "ul_usb_probe: No device of specified driver_data type\n");
117 static int ul_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
119 struct usb_device *dev = interface_to_usbdev(intf);
120 int ifnum = intf->altsetting->desc.bInterfaceNumber;
121 unsigned long driver_info=id->driver_info;
123 dev_set_drvdata(&intf->dev,NULL);
124 printk(KERN_INFO "ulan_init_one: USB device found devnum=%d, ifnum=%d\n",
126 switch(driver_info&~0xff){
128 if(ul_usb_init_chan(dev,ifnum,id,&udrv,ul_usb_ps1_init,driver_info)<0)
130 printk(KERN_INFO "ul_usb_probe: data type\n");
131 dev_set_drvdata(&intf->dev,udrv);
134 printk(KERN_CRIT "ul_usb_probe: No device of specified driver_data type\n");
139 #if (LINUX_VERSION_CODE < VERSION(2,5,41))
140 static void ul_usb_disconnect(struct usb_device *dev, void *ptr)
142 ul_drv *udrv, *next_udrv;
146 printk(KERN_CRIT "ulan_remove_one: no uLan drvdata\n");
149 for(;udrv;udrv=next_udrv){
150 if(udrv->magic!=UL_DRV_MAGIC){
151 printk(KERN_CRIT "ulan_remove_one: Wrong uLan MAGIC number!!!\n");
154 next_udrv=udrv->next_chan;
155 if(dev!=(struct usb_device *)udrv->dev){
156 printk(KERN_CRIT "ul_usb_disconnect: BAD - cross USB device remove\n");
158 for(i=0;i<UL_MINORS;i++){
159 if (udrv==ul_drv_arr[i]) ul_drv_arr[i]=NULL;
162 if(udrv->devfs_handle) kc_devfs_delete(udrv->devfs_handle);
163 #endif /* UL_WITH_DEVFS */
166 printk(KERN_INFO "ul_usb_disconnect: USB device removed\n");
169 static void ul_usb_disconnect(struct usb_interface *intf)
171 struct usb_device *dev = interface_to_usbdev(intf);
172 ul_drv *udrv, *next_udrv;
174 udrv=(ul_drv *)dev_get_drvdata(&intf->dev);
175 dev_set_drvdata(&intf->dev,NULL);
177 printk(KERN_CRIT "ulan_remove_one: no uLan drvdata\n");
180 for(;udrv;udrv=next_udrv){
181 if(udrv->magic!=UL_DRV_MAGIC){
182 printk(KERN_CRIT "ulan_remove_one: Wrong uLan MAGIC number!!!\n");
185 next_udrv=udrv->next_chan;
186 if(dev!=(struct usb_device *)udrv->dev){
187 printk(KERN_CRIT "ul_usb_disconnect: BAD - cross USB device remove\n");
189 for(i=0;i<UL_MINORS;i++){
190 if (udrv==ul_drv_arr[i]){
192 kc_class_device_destroy(ulan_class, MKDEV(ulan_major_dev, i));
196 if(udrv->devfs_handle) kc_devfs_delete(udrv->devfs_handle);
197 #endif /* UL_WITH_DEVFS */
200 printk(KERN_INFO "ul_usb_disconnect: USB device removed\n");