Re: any way to detect usb detached from a device driver ?

2007-01-10 Thread Luigi Rizzo
On Wed, Jan 10, 2007 at 11:34:54PM +0100, Hans Petter Selasky wrote:
 Hi Luigi,
 
 On Wednesday 10 January 2007 13:46, Luigi Rizzo wrote:
  On Tue, Jan 09, 2007 at 09:37:21PM +0100, Hans Petter Selasky wrote:
   On Tuesday 09 January 2007 17:34, Luigi Rizzo wrote:
 
 [...]
 
 
  sorry but i cannot figure out how the above helps in the
  detach case e.g. when a process is waiting for an ioctl
  or read operation to complete - can you give more details ?
 
 usb_cdev is an abstraction layer for pluggable devices that wants to create 
 a device under /dev, to read/write some data. It does not help unless you 
 port your PWC driver over to using the usb_cdev system, instead of devfs 
 directly.
 
 
  In my case, i did the following:
 
  USB_DETACH(pwc)
  {
  USB_DETACH_START(pwc, sc);
  again:
  if(sc-sc_videopipe != NULL) {
  usbd_abort_pipe(sc-sc_videopipe);
  usbd_close_pipe(sc-sc_videopipe);
  sc-sc_videopipe = NULL;
  }
  sc-error_status = EPIPE;
  if(sc-vopen) {
  if(sc-state  PWC_ASLEEP)
  wakeup(sc);
  if(sc-state  PWC_POLL) {
  sc-state = ~PWC_POLL;
  selwakeuppri(sc-rsel,PZERO);
  }
  device_printf(sc-sc_dev, Disconnected while webcam is in
  use!\n); usb_detach_wait(USBDEV(sc-sc_dev));
  goto again;
  }
 
  if(sc-sc_dev_t != NULL)
  destroy_dev(sc-sc_dev_t);
 
  mtx_destroy(sc-ptrlock);
  pwc_free_buffers(sc,1);
 
  usbd_add_drv_event(USB_EVENT_DRIVER_DETACH,sc-udev,USBDEV(sc-sc_dev));
  return 0;
  }
 
  and at the end of the close routine
 
   ...
  sc-vopen = 0;
  usb_detach_wakeup(USBDEV(sc-sc_dev));
  }
 
  so the USB_DETACH() will wake up any process blocked,
  the sc-error_status = EPIPE; should force an error and
  cause the process to call close().
 
  The down side is that you are still in the hands
  of the process to let the detach complete. Ideally one
  would just flag the descriptor as 'detach_pending'
  and get rid of it at the end of the close(), while the
  DETACH() could terminate without doing the free()
 
 What I do is to ensure that no thread is executing in any of the devfs 
 callbacks. This might imply some waiting. Then I simply destroy the device 
 using destroy_dev(). This way you don't have to wait for the userland process 
 to call close(), which might not happen right away.

ok... so if i understand well, once all processes have exited
the callbacks you destroy, which means that afterwards they will
not be able to invoke the callbacks anymore (nor crash the machine)
even if they retain a handle ?

cheers
luigi
___
freebsd-usb@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-usb
To unsubscribe, send any mail to [EMAIL PROTECTED]


any way to detect usb detached from a device driver ?

2007-01-09 Thread Luigi Rizzo
I am modifying a kernel device driver for webcams
(see http://info.iet.unipi.it/~luigi/FreeBSD/usb-cameras.html)
packing together various projects around, and i was wondering
how to handle the situation of a device being
detached while in use.

Right now the code (from ports/multimedia/pwcbsd) detects
that the device is in use while the driver-specific USB_DETACH
routine is called, however then it goes on without doing
anything.

In another driver in the dree (urio.c) i see the driver
calls usb_detach_wait() to wait up to 60s for the
drivers to complete. However that function is not documented
and used a bit inconsistently in the rest of /sys/dev/usb

Any suggestions ?

cheers
luigi
___
freebsd-usb@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-usb
To unsubscribe, send any mail to [EMAIL PROTECTED]


Re: any way to detect usb detached from a device driver ?

2007-01-09 Thread Hans Petter Selasky
On Tuesday 09 January 2007 17:34, Luigi Rizzo wrote:
 [sorry for the repost, not sure it went through]

 On Tue, Jan 09, 2007 at 08:16:29AM -0800, Luigi Rizzo wrote:
 I am modifying a kernel device driver for webcams
 (see http://info.iet.unipi.it/~luigi/FreeBSD/usb-cameras.html)
 packing together various projects around, and i was wondering
 how to handle the situation of a device being
 detached while in use.

If you look at the my USB driver for FreeBSD, 
http://www.turbocat.net/~hselasky/usb4bsd , there has been created a new 
device system, usb_cdev, with that goal in mind that you should not have to 
worry about detaching devices, hence this is somewhat complicated:

http://www.turbocat.net/~hselasky/isdn4bsd/sources/src/sys/dev/usb/usb_cdev.c

For example, have a look a the new URIO driver:

http://www.turbocat.net/~hselasky/isdn4bsd/sources/src/sys/dev/usb/urio.c


 Right now the code (from ports/multimedia/pwcbsd) detects
 that the device is in use while the driver-specific USB_DETACH
 routine is called, however then it goes on without doing
 anything.

Very bad!


 In another driver in the dree (urio.c) i see the driver
 calls usb_detach_wait() to wait up to 60s for the
 drivers to complete. However that function is not documented
 and used a bit inconsistently in the rest of /sys/dev/usb


--HPS
___
freebsd-usb@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-usb
To unsubscribe, send any mail to [EMAIL PROTECTED]