• R
    usb: gadget: f_fs: add "no_disconnect" mode · 18d6b32f
    Robert Baldyga 提交于
    Since we can compose gadgets from many functions, there is the problem
    related to gadget breakage while FunctionFS daemon being closed. FFS
    function is userspace code so there is no way to know when it will close
    files (it doesn't matter what is the reason of this situation, it can
    be daemon logic, program breakage, process kill or any other). So when
    we have another function in gadget which, for example, sends some amount
    of data, does some software update or implements some real-time functionality,
    we may want to keep the gadget connected despite FFS function is no longer
    functional.
    
    We can't just remove one of functions from gadget since it has been
    enumerated, so the only way to keep entire gadget working is to make
    broken FFS function deactivated but still visible to host. For this
    purpose this patch introduces "no_disconnect" mode. It can be enabled
    by setting mount option "no_disconnect=1", and results with defering
    function disconnect to the moment of reopen ep0 file or filesystem
    unmount. After closing all endpoint files, FunctionFS is set to state
    FFS_DEACTIVATED.
    
    When ffs->state == FFS_DEACTIVATED:
    - function is still bound and visible to host,
    - setup requests are automatically stalled,
    - transfers on other endpoints are refused,
    - epfiles, except ep0, are deleted from the filesystem,
    - opening ep0 causes the function to be closed, and then FunctionFS
      is ready for descriptors and string write,
    - altsetting change causes the function to be closed - we want to keep
      function alive until another functions are potentialy used, altsetting
      change means that another configuration is being selected or USB cable
      was unplugged, which indicates that we don't need to stay longer in
      FFS_DEACTIVATED state
    - unmounting of the FunctionFS instance causes the function to be closed.
    Tested-by: NDavid Cohen <david.a.cohen@linux.intel.com>
    Acked-by: NMichal Nazarewicz <mina86@mina86.com>
    Signed-off-by: NRobert Baldyga <r.baldyga@samsung.com>
    Signed-off-by: NFelipe Balbi <balbi@ti.com>
    18d6b32f
u_fs.h 8.1 KB