From: johann d. <jd...@us...> - 2002-01-30 19:47:39
|
Update of /cvsroot/linuxconsole/ruby/linux/drivers/input/joystick/iforce In directory usw-pr-cvs1:/tmp/cvs-serv12477 Modified Files: iforce-main.c iforce-usb.c iforce.h Log Message: Added delete functions to delete driver. iforce_delete is only called when the driver is realeased (or on deconnection if it is not used). Index: iforce-main.c =================================================================== RCS file: /cvsroot/linuxconsole/ruby/linux/drivers/input/joystick/iforce/iforce-main.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- iforce-main.c 2002/01/29 23:17:02 1.8 +++ iforce-main.c 2002/01/30 19:47:35 1.9 @@ -276,11 +276,28 @@ switch (iforce->bus) { #ifdef IFORCE_USB case IFORCE_USB: - if (!--iforce->open) + if (!--iforce->open) { usb_unlink_urb(&iforce->irq); + usb_unlink_urb(&iforce->out); + + /* The device was unplugged before the file + * was released */ + if (iforce->usbdev == NULL) { + iforce_delete(iforce); + } + } break; #endif } +} + +void iforce_delete(struct iforce *iforce) +{ +#ifdef IFORCE_USB + iforce_usb_delete(iforce); +#endif + + kfree(iforce); } int iforce_init_device(struct iforce *iforce) Index: iforce-usb.c =================================================================== RCS file: /cvsroot/linuxconsole/ruby/linux/drivers/input/joystick/iforce/iforce-usb.c,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- iforce-usb.c 2002/01/30 17:54:50 1.8 +++ iforce-usb.c 2002/01/30 19:47:35 1.9 @@ -135,15 +135,22 @@ return iforce; } +/* Called by iforce_delete() */ +void iforce_usb_delete(struct iforce* iforce) +{ + usb_unlink_urb(&iforce->irq); + usb_unlink_urb(&iforce->out); + usb_unlink_urb(&iforce->ctrl); +} + static void iforce_usb_disconnect(struct usb_device *dev, void *ptr) { struct iforce *iforce = ptr; - usb_unlink_urb(&iforce->irq); iforce->usbdev = NULL; input_unregister_device(&iforce->dev); -#if 0 - kfree(iforce); -#endif + + if (iforce->open <= 0) + iforce_delete(iforce); } static struct usb_device_id iforce_usb_ids [] = { Index: iforce.h =================================================================== RCS file: /cvsroot/linuxconsole/ruby/linux/drivers/input/joystick/iforce/iforce.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- iforce.h 2002/01/28 22:45:00 1.6 +++ iforce.h 2002/01/30 19:47:35 1.7 @@ -173,9 +173,11 @@ /* iforce-usb.c */ void iforce_usb_xmit(struct iforce *iforce); +void iforce_usb_delete(struct iforce *iforce); /* iforce-main.c */ int iforce_init_device(struct iforce *iforce); +void iforce_delete(struct iforce *iforce); /* iforce-packets.c */ int iforce_control_playback(struct iforce*, u16 id, unsigned int); |