xref: /linux/Documentation/driver-api/usb/callbacks.rst (revision 79790b6818e96c58fe2bffee1b418c16e64e7b80)
13b38e4f2SMauro Carvalho ChehabUSB core callbacks
23b38e4f2SMauro Carvalho Chehab~~~~~~~~~~~~~~~~~~
33b38e4f2SMauro Carvalho Chehab
43b38e4f2SMauro Carvalho ChehabWhat callbacks will usbcore do?
53b38e4f2SMauro Carvalho Chehab===============================
63b38e4f2SMauro Carvalho Chehab
73b38e4f2SMauro Carvalho ChehabUsbcore will call into a driver through callbacks defined in the driver
83b38e4f2SMauro Carvalho Chehabstructure and through the completion handler of URBs a driver submits.
93b38e4f2SMauro Carvalho ChehabOnly the former are in the scope of this document. These two kinds of
103b38e4f2SMauro Carvalho Chehabcallbacks are completely independent of each other. Information on the
11e1c3e6e1SMauro Carvalho Chehabcompletion callback can be found in :ref:`usb-urb`.
123b38e4f2SMauro Carvalho Chehab
133b38e4f2SMauro Carvalho ChehabThe callbacks defined in the driver structure are:
143b38e4f2SMauro Carvalho Chehab
153b38e4f2SMauro Carvalho Chehab1. Hotplugging callbacks:
163b38e4f2SMauro Carvalho Chehab
173b38e4f2SMauro Carvalho Chehab - @probe:
183b38e4f2SMauro Carvalho Chehab	Called to see if the driver is willing to manage a particular
193b38e4f2SMauro Carvalho Chehab	interface on a device.
203b38e4f2SMauro Carvalho Chehab
213b38e4f2SMauro Carvalho Chehab - @disconnect:
223b38e4f2SMauro Carvalho Chehab	Called when the interface is no longer accessible, usually
233b38e4f2SMauro Carvalho Chehab	because its device has been (or is being) disconnected or the
243b38e4f2SMauro Carvalho Chehab	driver module is being unloaded.
253b38e4f2SMauro Carvalho Chehab
263b38e4f2SMauro Carvalho Chehab2. Odd backdoor through usbfs:
273b38e4f2SMauro Carvalho Chehab
283b38e4f2SMauro Carvalho Chehab - @ioctl:
293b38e4f2SMauro Carvalho Chehab	Used for drivers that want to talk to userspace through
303b38e4f2SMauro Carvalho Chehab	the "usbfs" filesystem.  This lets devices provide ways to
313b38e4f2SMauro Carvalho Chehab	expose information to user space regardless of where they
323b38e4f2SMauro Carvalho Chehab	do (or don't) show up otherwise in the filesystem.
333b38e4f2SMauro Carvalho Chehab
343b38e4f2SMauro Carvalho Chehab3. Power management (PM) callbacks:
353b38e4f2SMauro Carvalho Chehab
363b38e4f2SMauro Carvalho Chehab - @suspend:
373b38e4f2SMauro Carvalho Chehab	Called when the device is going to be suspended.
383b38e4f2SMauro Carvalho Chehab
393b38e4f2SMauro Carvalho Chehab - @resume:
403b38e4f2SMauro Carvalho Chehab	Called when the device is being resumed.
413b38e4f2SMauro Carvalho Chehab
423b38e4f2SMauro Carvalho Chehab - @reset_resume:
433b38e4f2SMauro Carvalho Chehab	Called when the suspended device has been reset instead
443b38e4f2SMauro Carvalho Chehab	of being resumed.
453b38e4f2SMauro Carvalho Chehab
463b38e4f2SMauro Carvalho Chehab4. Device level operations:
473b38e4f2SMauro Carvalho Chehab
483b38e4f2SMauro Carvalho Chehab - @pre_reset:
493b38e4f2SMauro Carvalho Chehab	Called when the device is about to be reset.
503b38e4f2SMauro Carvalho Chehab
513b38e4f2SMauro Carvalho Chehab - @post_reset:
523b38e4f2SMauro Carvalho Chehab	Called after the device has been reset
533b38e4f2SMauro Carvalho Chehab
543b38e4f2SMauro Carvalho ChehabThe ioctl interface (2) should be used only if you have a very good
553b38e4f2SMauro Carvalho Chehabreason. Sysfs is preferred these days. The PM callbacks are covered
56e1c3e6e1SMauro Carvalho Chehabseparately in :ref:`usb-power-management`.
573b38e4f2SMauro Carvalho Chehab
583b38e4f2SMauro Carvalho ChehabCalling conventions
593b38e4f2SMauro Carvalho Chehab===================
603b38e4f2SMauro Carvalho Chehab
613b38e4f2SMauro Carvalho ChehabAll callbacks are mutually exclusive. There's no need for locking
623b38e4f2SMauro Carvalho Chehabagainst other USB callbacks. All callbacks are called from a task
633b38e4f2SMauro Carvalho Chehabcontext. You may sleep. However, it is important that all sleeps have a
643b38e4f2SMauro Carvalho Chehabsmall fixed upper limit in time. In particular you must not call out to
653b38e4f2SMauro Carvalho Chehabuser space and await results.
663b38e4f2SMauro Carvalho Chehab
673b38e4f2SMauro Carvalho ChehabHotplugging callbacks
683b38e4f2SMauro Carvalho Chehab=====================
693b38e4f2SMauro Carvalho Chehab
703b38e4f2SMauro Carvalho ChehabThese callbacks are intended to associate and disassociate a driver with
713b38e4f2SMauro Carvalho Chehaban interface. A driver's bond to an interface is exclusive.
723b38e4f2SMauro Carvalho Chehab
733b38e4f2SMauro Carvalho ChehabThe probe() callback
743b38e4f2SMauro Carvalho Chehab--------------------
753b38e4f2SMauro Carvalho Chehab
763b38e4f2SMauro Carvalho Chehab::
773b38e4f2SMauro Carvalho Chehab
783b38e4f2SMauro Carvalho Chehab  int (*probe) (struct usb_interface *intf,
793b38e4f2SMauro Carvalho Chehab		const struct usb_device_id *id);
803b38e4f2SMauro Carvalho Chehab
813b38e4f2SMauro Carvalho ChehabAccept or decline an interface. If you accept the device return 0,
823b38e4f2SMauro Carvalho Chehabotherwise -ENODEV or -ENXIO. Other error codes should be used only if a
833b38e4f2SMauro Carvalho Chehabgenuine error occurred during initialisation which prevented a driver
843b38e4f2SMauro Carvalho Chehabfrom accepting a device that would else have been accepted.
853b38e4f2SMauro Carvalho ChehabYou are strongly encouraged to use usbcore's facility,
863b38e4f2SMauro Carvalho Chehabusb_set_intfdata(), to associate a data structure with an interface, so
873b38e4f2SMauro Carvalho Chehabthat you know which internal state and identity you associate with a
883b38e4f2SMauro Carvalho Chehabparticular interface. The device will not be suspended and you may do IO
893b38e4f2SMauro Carvalho Chehabto the interface you are called for and endpoint 0 of the device. Device
903b38e4f2SMauro Carvalho Chehabinitialisation that doesn't take too long is a good idea here.
913b38e4f2SMauro Carvalho Chehab
923b38e4f2SMauro Carvalho ChehabThe disconnect() callback
933b38e4f2SMauro Carvalho Chehab-------------------------
943b38e4f2SMauro Carvalho Chehab
953b38e4f2SMauro Carvalho Chehab::
963b38e4f2SMauro Carvalho Chehab
973b38e4f2SMauro Carvalho Chehab  void (*disconnect) (struct usb_interface *intf);
983b38e4f2SMauro Carvalho Chehab
993b38e4f2SMauro Carvalho ChehabThis callback is a signal to break any connection with an interface.
1003b38e4f2SMauro Carvalho ChehabYou are not allowed any IO to a device after returning from this
1013b38e4f2SMauro Carvalho Chehabcallback. You also may not do any other operation that may interfere
102*9f2a3933SMichal Peciowith another driver bound to the interface, eg. a power management
103*9f2a3933SMichal Peciooperation. Outstanding operations on the device must be completed or
104*9f2a3933SMichal Pecioaborted before this callback may return.
105*9f2a3933SMichal Pecio
1063b38e4f2SMauro Carvalho ChehabIf you are called due to a physical disconnection, all your URBs will be
1073b38e4f2SMauro Carvalho Chehabkilled by usbcore. Note that in this case disconnect will be called some
1083b38e4f2SMauro Carvalho Chehabtime after the physical disconnection. Thus your driver must be prepared
1093b38e4f2SMauro Carvalho Chehabto deal with failing IO even prior to the callback.
1103b38e4f2SMauro Carvalho Chehab
1113b38e4f2SMauro Carvalho ChehabDevice level callbacks
1123b38e4f2SMauro Carvalho Chehab======================
1133b38e4f2SMauro Carvalho Chehab
1143b38e4f2SMauro Carvalho Chehabpre_reset
1153b38e4f2SMauro Carvalho Chehab---------
1163b38e4f2SMauro Carvalho Chehab
1173b38e4f2SMauro Carvalho Chehab::
1183b38e4f2SMauro Carvalho Chehab
1193b38e4f2SMauro Carvalho Chehab  int (*pre_reset)(struct usb_interface *intf);
1203b38e4f2SMauro Carvalho Chehab
1213b38e4f2SMauro Carvalho ChehabA driver or user space is triggering a reset on the device which
1223b38e4f2SMauro Carvalho Chehabcontains the interface passed as an argument. Cease IO, wait for all
1233b38e4f2SMauro Carvalho Chehaboutstanding URBs to complete, and save any device state you need to
1243b38e4f2SMauro Carvalho Chehabrestore.  No more URBs may be submitted until the post_reset method
1253b38e4f2SMauro Carvalho Chehabis called.
1263b38e4f2SMauro Carvalho Chehab
1273b38e4f2SMauro Carvalho ChehabIf you need to allocate memory here, use GFP_NOIO or GFP_ATOMIC, if you
1283b38e4f2SMauro Carvalho Chehabare in atomic context.
1293b38e4f2SMauro Carvalho Chehab
1303b38e4f2SMauro Carvalho Chehabpost_reset
1313b38e4f2SMauro Carvalho Chehab----------
1323b38e4f2SMauro Carvalho Chehab
1333b38e4f2SMauro Carvalho Chehab::
1343b38e4f2SMauro Carvalho Chehab
1353b38e4f2SMauro Carvalho Chehab  int (*post_reset)(struct usb_interface *intf);
1363b38e4f2SMauro Carvalho Chehab
1373b38e4f2SMauro Carvalho ChehabThe reset has completed.  Restore any saved device state and begin
1383b38e4f2SMauro Carvalho Chehabusing the device again.
1393b38e4f2SMauro Carvalho Chehab
1403b38e4f2SMauro Carvalho ChehabIf you need to allocate memory here, use GFP_NOIO or GFP_ATOMIC, if you
1413b38e4f2SMauro Carvalho Chehabare in atomic context.
1423b38e4f2SMauro Carvalho Chehab
1433b38e4f2SMauro Carvalho ChehabCall sequences
1443b38e4f2SMauro Carvalho Chehab==============
1453b38e4f2SMauro Carvalho Chehab
1463b38e4f2SMauro Carvalho ChehabNo callbacks other than probe will be invoked for an interface
1473b38e4f2SMauro Carvalho Chehabthat isn't bound to your driver.
1483b38e4f2SMauro Carvalho Chehab
1493b38e4f2SMauro Carvalho ChehabProbe will never be called for an interface bound to a driver.
1503b38e4f2SMauro Carvalho ChehabHence following a successful probe, disconnect will be called
1513b38e4f2SMauro Carvalho Chehabbefore there is another probe for the same interface.
1523b38e4f2SMauro Carvalho Chehab
1533b38e4f2SMauro Carvalho ChehabOnce your driver is bound to an interface, disconnect can be
1543b38e4f2SMauro Carvalho Chehabcalled at any time except in between pre_reset and post_reset.
1553b38e4f2SMauro Carvalho Chehabpre_reset is always followed by post_reset, even if the reset
1563b38e4f2SMauro Carvalho Chehabfailed or the device has been unplugged.
1573b38e4f2SMauro Carvalho Chehab
1583b38e4f2SMauro Carvalho Chehabsuspend is always followed by one of: resume, reset_resume, or
1593b38e4f2SMauro Carvalho Chehabdisconnect.
160