1. 28 8月, 2013 1 次提交
    • G
      USB: gadget: audit sysfs attribute permissions · ce26bd23
      Greg Kroah-Hartman 提交于
      Convert all USB gadget sysfs attributes to use the _RO or _RW variants,
      to make them easier to audit and ensure that the permissions are
      correct.
      
      Note, two are left using the DEVICE_ATTR() macro, as there is no
      DEVICE_ATTR_WO() in Linus's tree, that will happen after 3.12-rc1 is
      out, a follow-on patch will be sent then.
      Reviewed-by: NFelipe Balbi <balbi@ti.com>
      Acked-by: NFelipe Balbi <balbi@ti.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      
      --
       drivers/usb/gadget/composite.c      |    8 +++-----
       drivers/usb/gadget/dummy_hcd.c      |    8 ++++----
       drivers/usb/gadget/f_mass_storage.c |   14 ++++++--------
       drivers/usb/gadget/net2272.c        |    4 ++--
       drivers/usb/gadget/net2280.c        |   18 +++++++++---------
       drivers/usb/gadget/storage_common.c |   25 ++++++++++++-------------
       drivers/usb/gadget/udc-core.c       |   14 +++++++-------
       7 files changed, 43 insertions(+), 48 deletions(-)
      ce26bd23
  2. 03 4月, 2013 1 次提交
    • S
      usb: gadget: the start of the configfs interface · 88af8bbe
      Sebastian Andrzej Siewior 提交于
      |# modprobe dummy_hcd num=2
      |# modprobe libcomposite
      
      |# lsmod
      |Module                  Size  Used by
      |libcomposite           31648  0
      |dummy_hcd              19871  0
      
      |# mkdir /sys/kernel/config/usb_gadget/oha
      |# cd /sys/kernel/config/usb_gadget/oha
      |# mkdir configs/def.1
      |# mkdir configs/def.2
      |# mkdir functions/acm.ttyS1
      |# mkdir strings/0x1
      |mkdir: cannot create directory `strings/0x1': Invalid argument
      |# mkdir strings/0x409
      |# mkdir strings/1033
      |mkdir: cannot create directory `strings/1033': File exists
      |# mkdir strings/1032
      |# mkdir configs/def.1/strings/0x409
      |# mkdir configs/def.2/strings/0x409
      
      |#find . -ls
      |   975    0 drwxr-xr-x   5 root     root            0 Dec 23 17:40 .
      |   978    0 drwxr-xr-x   4 root     root            0 Dec 23 17:43 ./strings
      |  4100    0 drwxr-xr-x   2 root     root            0 Dec 23 17:43 ./strings/1032
      |   995    0 -rw-r--r--   1 root     root         4096 Dec 23 17:43 ./strings/1032/serialnumber
      |   996    0 -rw-r--r--   1 root     root         4096 Dec 23 17:43 ./strings/1032/product
      |   997    0 -rw-r--r--   1 root     root         4096 Dec 23 17:43 ./strings/1032/manufacturer
      |  2002    0 drwxr-xr-x   2 root     root            0 Dec 23 17:41 ./strings/0x409
      |   998    0 -rw-r--r--   1 root     root         4096 Dec 23 17:43 ./strings/0x409/serialnumber
      |   999    0 -rw-r--r--   1 root     root         4096 Dec 23 17:43 ./strings/0x409/product
      |  1000    0 -rw-r--r--   1 root     root         4096 Dec 23 17:43 ./strings/0x409/manufacturer
      |   977    0 drwxr-xr-x   4 root     root            0 Dec 23 17:41 ./configs
      |  4081    0 drwxr-xr-x   3 root     root            0 Dec 23 17:41 ./configs/def.2
      |  4082    0 drwxr-xr-x   3 root     root            0 Dec 23 17:42 ./configs/def.2/strings
      |  2016    0 drwxr-xr-x   2 root     root            0 Dec 23 17:42 ./configs/def.2/strings/0x409
      |  1001    0 -rw-r--r--   1 root     root         4096 Dec 23 17:43 ./configs/def.2/strings/0x409/configuration
      |  1002    0 -rw-r--r--   1 root     root         4096 Dec 23 17:43 ./configs/def.2/bmAttributes
      |  1003    0 -rw-r--r--   1 root     root         4096 Dec 23 17:43 ./configs/def.2/MaxPower
      |   979    0 drwxr-xr-x   3 root     root            0 Dec 23 17:42 ./configs/def.1
      |   980    0 drwxr-xr-x   3 root     root            0 Dec 23 17:42 ./configs/def.1/strings
      |  5122    0 drwxr-xr-x   2 root     root            0 Dec 23 17:42 ./configs/def.1/strings/0x409
      |  1004    0 -rw-r--r--   1 root     root         4096 Dec 23 17:43 ./configs/def.1/strings/0x409/configuration
      |  1005    0 -rw-r--r--   1 root     root         4096 Dec 23 17:43 ./configs/def.1/bmAttributes
      |  1006    0 -rw-r--r--   1 root     root         4096 Dec 23 17:43 ./configs/def.1/MaxPower
      |   976    0 drwxr-xr-x   3 root     root            0 Dec 23 17:41 ./functions
      |   981    0 drwxr-xr-x   2 root     root            0 Dec 23 17:41 ./functions/acm.ttyS1
      |  1007    0 -r--r--r--   1 root     root         4096 Dec 23 17:43 ./functions/acm.ttyS1/port_num
      |  1008    0 -rw-r--r--   1 root     root         4096 Dec 23 17:43 ./UDC
      |  1009    0 -rw-r--r--   1 root     root         4096 Dec 23 17:43 ./bcdUSB
      |  1010    0 -rw-r--r--   1 root     root         4096 Dec 23 17:43 ./bcdDevice
      |  1011    0 -rw-r--r--   1 root     root         4096 Dec 23 17:43 ./idProduct
      |  1012    0 -rw-r--r--   1 root     root         4096 Dec 23 17:43 ./idVendor
      |  1013    0 -rw-r--r--   1 root     root         4096 Dec 23 17:43 ./bMaxPacketSize0
      |  1014    0 -rw-r--r--   1 root     root         4096 Dec 23 17:43 ./bDeviceProtocol
      |  1015    0 -rw-r--r--   1 root     root         4096 Dec 23 17:43 ./bDeviceSubClass
      |  1016    0 -rw-r--r--   1 root     root         4096 Dec 23 17:43 ./bDeviceClass
      
      |# cat functions/acm.ttyS1/port_num
      |0
      |# ls -lah /dev/ttyGS*
      |crw-rw---T 1 root dialout 252, 0 Dec 23 17:41 /dev/ttyGS0
      |
      |# echo 0x1234 > idProduct
      |# echo 0xabcd > idVendor
      |# echo 1122 > strings/0x409/serialnumber
      |# echo "The manufacturer" > strings/0x409/manufacturer
      |# echo 1 > strings/1032/manufacturer
      |# echo 1sa > strings/1032/product
      |# echo tada > strings/1032/serialnumber
      |echo "Primary configuration" > configs/def.1/strings/0x409/configuration
      |# echo "Secondary configuration" > configs/def.2/strings/0x409/configuration
      |# ln -s functions/acm.ttyS1 configs/def.1/
      |# ln -s functions/acm.ttyS1 configs/def.2/
      |find configs/def.1/ -ls
      |   979    0 drwxr-xr-x   3 root     root            0 Dec 23 17:49 configs/def.1/
      |  6264    0 lrwxrwxrwx   1 root     root            0 Dec 23 17:48 configs/def.1/acm.ttyS1 -> ../../../../usb_gadget/oha/functions/acm.ttyS1
      |   980    0 drwxr-xr-x   3 root     root            0 Dec 23 17:42 configs/def.1/strings
      |  5122    0 drwxr-xr-x   2 root     root            0 Dec 23 17:49 configs/def.1/strings/0x409
      |  6284    0 -rw-r--r--   1 root     root         4096 Dec 23 17:47 configs/def.1/strings/0x409/configuration
      |  6285    0 -rw-r--r--   1 root     root         4096 Dec 23 17:49 configs/def.1/bmAttributes
      |  6286    0 -rw-r--r--   1 root     root         4096 Dec 23 17:49 configs/def.1/MaxPower
      |
      |echo 120 > configs/def.1/MaxPower
      |
      |# ls -lh /sys/class/udc/
      |total 0
      |lrwxrwxrwx 1 root root 0 Dec 23 17:50 dummy_udc.0 -> ../../devices/platform/dummy_udc.0/udc/dummy_udc.0
      |lrwxrwxrwx 1 root root 0 Dec 23 17:50 dummy_udc.1 -> ../../devices/platform/dummy_udc.1/udc/dummy_udc.1
      |# echo dummy_udc.0 > UDC
      |# lsusb
      |Bus 001 Device 002: ID abcd:1234 Unknown
      |
      |lsusb -d abcd:1234 -v
      |Device Descriptor:
      …
      |  idVendor           0xabcd Unknown
      |  idProduct          0x1234
      |  bcdDevice            3.06
      |  iManufacturer           1 The manufacturer
      |  iProduct                2
      |  iSerial                 3 1122
      |  bNumConfigurations      2
      …
      |echo "" > UDC
      
      v5…v6
      - wired up strings with usb_gstrings_attach()
      - add UDC attribe. Write "udc-name" will bind the gadget. Write an empty
        string (it should contain \n since 0 bytes write get optimzed away)
        will unbind the UDC from the gadget. The name of available UDCs can be
        obtained from /sys/class/udc/
      
      v4…v5
      - string rework. This will add a strings folder incl. language code like
          strings/409/manufacturer
        as suggested by Alan.
      - rebased ontop reworked functions.c which has usb_function_instance
        which is used prior after "mkdir acm.instance" and can be directly
        used for configuration via configfs.
      
      v3…v4
       - moved functions from the root folde down to the gadget as suggested
         by Michał
       - configs have now their own configs folder as suggested by Michał.
         The folder is still name.bConfigurationValue where name becomes the
         sConfiguration. Is this usefull should we just stilc
         configs/bConfigurationValue/ ?
       - added configfs support to the ACM function. The port_num attribute is
         exported by f_acm. An argument has been added to the USB alloc
         function to distinguish between "old" (use facm_configure() to
         configure and configfs interface (expose a config_node).
         The port_num is currently a dumb counter. It will
         require some function re-work to make it work.
      
      scheduled for v5:
      - sym linking function into config.
      
      v2…v3
      - replaced one ifndef by ifdef as suggested by Micahał
      - strstr()/strchr() function_make as suggested by Micahł
      - replace [iSerialNumber|iProduct|iManufacturer] with
        [sSerialNumber|sProduct|sManufacturer] as suggested by Alan
      - added creation of config descriptors
      
      v1…v2
      - moved gadgets from configfs' root directory into /udcs/ within our
        "usb_gadget" folder. Requested by Andrzej & Michał
      - use a dot as a delimiter between function's name and its instance's name
        as suggested by Michał
      - renamed all config_item_type, configfs_group_operations, make_group,
        drop_item as suggested by suggested by Andrzej to remain consisten
        within this file and within other configfs users
      - Since configfs.c and functions.c are now part of the udc-core module,
        the module itself is now called udc. Also added a tiny ifdef around
        init code becuase udc-core is subsys init and this is too early for
        configfs in the built-in case. In the module case, we can only have
        one init function.
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      88af8bbe
  3. 05 3月, 2013 1 次提交
    • N
      usb: gadget: composite: fix kernel-doc warnings · 43febb27
      Nishanth Menon 提交于
      A few trivial fixes for composite driver:
      
      Warning(include/linux/usb/composite.h:165): No description found for parameter
      	'fs_descriptors'
      Warning(include/linux/usb/composite.h:165): Excess struct/union/enum/typedef
      	member 'descriptors' description in 'usb_function'
      Warning(include/linux/usb/composite.h:321): No description found for parameter
      	'gadget_driver'
      Warning(drivers/usb/gadget/composite.c:1777): Excess function parameter 'bind'
      	description in 'usb_composite_probe'
      
      Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
      Cc: Jiri Kosina <trivial@kernel.org>
      Cc: linux-usb@vger.kernel.org
      Cc: linux-kernel@vger.kernel.org
      Signed-off-by: NNishanth Menon <nm@ti.com>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      43febb27
  4. 22 1月, 2013 7 次提交
    • S
      usb: gadget: f_acm: use usb_gstrings_attach() · 27a46633
      Sebastian Andrzej Siewior 提交于
      Use usb_gstrings_attach() to assign strings in f_acm to assign strings
      ids.
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      27a46633
    • S
      usb: gadget: composite: introduce usb_gstrings_attach() · 9bb2859f
      Sebastian Andrzej Siewior 提交于
      The USB strings don't (yet) fully work in multiple configs/gadget
      environment. The string id is assigned to the descriptor and the struct
      usb_strings. We create a copy of the individual descriptor so we don't
      clash if we use a function more than once. However, we have only one
      struct usb_string for each string.
      
      Currently each function which is used multiple times checks for
      "id != 0" and only assigns string ids if it did not happen yet. This
      works well if we use the same function multiple times as long as we do
      it within the "one" gadget we have. Trouble starts once we use the same
      function in a second gadget.
      
      In order to solve this I introduce usb_gstrings_attach(). This function will
      crate a copy all structs except for the strings which are not copied.
      After the copy it will assign USB ids and attach it to cdev.
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      9bb2859f
    • S
      usb: gadget: export composite's setup & disconnect function · 2d5a8899
      Sebastian Andrzej Siewior 提交于
      The configfs can't use all of composite's hooks because ->bind() and
      ->unbind() has to be done a little differently. ->disconnect() and
      ->setup() on the hand can be recycled.
      This patch exports them both so configfs can use them.
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      2d5a8899
    • S
      usb: gadget: factor out two helper functions from composite_bind() · a5923340
      Sebastian Andrzej Siewior 提交于
      This patch factors out two helper functions from composite_bind()
      that is composite_dev_prepare() and its counterpart
      composite_dev_cleanup().
      
      This will be used by the configfs which requries a slightly different
      bind/setup code because part of its configurations (i.e. config
      descripts, cdev, …) are setup in advance and VID/PID and so one should
      not be overwritten. Also the setup of ep0 endpoint can be delayed until
      the UDC is assigned.
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      a5923340
    • S
      usb: gadget: composite: add usb_remove_function() · b4735778
      Sebastian Andrzej Siewior 提交于
      This will be used to remove a single function from a given config. Right
      now "ignore" that an error at ->bind() time and cleanup later during
      composite_unbind() / remove_config().
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      b4735778
    • S
      usb: gadget: add some infracture to register/unregister functions · de53c254
      Sebastian Andrzej Siewior 提交于
      This patch provides an infrastructure to register & unregister a USB
      function. This allows to turn a function into a module and avoid the
      '#include "f_.*.c"' magic and we get a clear API / cut between the bare
      gadget and its functions.
      The concept is simple:
      Each function defines the DECLARE_USB_FUNCTION_INIT macro whith an unique
      name of the function and two allocation functions.
      - one to create an "instance". The instance holds the current configuration
        set. In case there are two usb_configudations with one function there will
        be one instance and two usb_functions
      - one to create an "function" from the instance.
      
      The name of the instance is used to automaticaly load the module if it the
      instance is not yet available.
      The usb_function callbacks are slightly modified and extended:
      - usb_get_function()
        creates a struct usb_function inclunding all pointers (bind,
        unbind,…). It uses the "instance" to map its configuration. So we can
        have _two_ struct usb_function, one for each usb_configuration.
      - ->unbind()
        Since the struct usb_function was not allocated in ->bind() it should
        not kfree()d here. This function should only reverse what happens in
        ->bind() that is request cleanup and the cleanup of allocated
        descriptors.
      - ->free_func()
        a simple kfree() of the struct usb_function
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      de53c254
    • S
      usb: gadget: composite: don't call driver's unbind() if bind() failed · 779d516c
      Sebastian Andrzej Siewior 提交于
      Lets assume nokia_bind() starts with "return -EINVAL". After loading the
      gadget we end up with:
      
      |udc dummy_udc.0: registering UDC driver [g_nokia]
      |BUG: unable to handle kernel NULL pointer dereference at 00000040
      |IP: [<c11f9555>] __list_add+0x25/0xf0
      |Call Trace:
      | [<c12d4e21>] rollback_registered+0x21/0x40
      | [<c12d513f>] unregister_netdevice_queue+0x4f/0xa0
      | [<c12d5259>] unregister_netdev+0x19/0x30
      | [<f81335b2>] gphonet_cleanup+0x32/0x50 [g_nokia]
      | [<f8133f1c>] nokia_unbind+0x1c/0x2a [g_nokia]
      | [<f802509f>] __composite_unbind.constprop.10+0x4f/0xb0 [libcomposite]
      | [<f80255be>] composite_bind+0x1ae/0x230 [libcomposite]
      | [<c129e576>] usb_gadget_probe_driver+0xc6/0x1b0
      | [<f8024aba>] usb_composite_probe+0x7a/0xa0 [libcomposite]
      
      That is crash from nokia_unbind() invoked via nokia_bind(). This crash
      will look different we if make it until usb_string_ids_tab() before we
      enter an error condition in the probe function.
      nokia_bind_config() tries to clean up which is IMHO the right thing to
      do. Leaving things as-is and hoping that its unbind() will clean it up
      is kinda backwards. Especially since the bind function never succeeded so
      it can't know how much it needs to clean up.
      This fixes the behaviour by not calling the driver's unbind function if
      its bind function failed.
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      779d516c
  5. 10 1月, 2013 1 次提交
    • S
      usb: gadget: consider link speed for bMaxPower · 8f900a9a
      Sebastian Andrzej Siewior 提交于
      The USB 2.0 specification says that bMaxPower is the maximum power
      consumption expressed in 2 mA units and the USB 3.0 specification says
      that it is expressed in 8 mA units.
      
      This patch renames bMaxPower to MaxPower and the various /2 and *2 are
      removed. Before reporting the config descriptor, the proper value is
      computer based on the speed, all in-tree users are updated. MaxPower is
      also increased to u16 so we can store the nokia gadget value which is
      larger than the max value allowed for u8.
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      8f900a9a
  6. 31 10月, 2012 1 次提交
    • S
      usb: gadget: always update HS/SS descriptors and create a copy of them · 10287bae
      Sebastian Andrzej Siewior 提交于
      HS and SS descriptors are staticaly created. They are updated during the
      bind process with the endpoint address, string id or interface numbers.
      
      After that, the descriptor chain is linked to struct usb_function which
      is used by composite in order to serve the GET_DESCRIPTOR requests,
      number of available configs and so on.
      
      There is no need to assign the HS descriptor only if the UDC supports
      HS speed because composite won't report those to the host if HS support
      has not been reached. The same reasoning is valid for SS.
      
      This patch makes sure each function updates HS/SS descriptors
      unconditionally and uses the newly introduced helper function to create a
      copy the descriptors for the speed which is supported by the UDC.
      
      While at that, also rename f->descriptors to f->fs_descriptors in order
      to make it more explicit what that means.
      
      Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
      Signed-off-by: NSebastian Andrzej Siewior <bigeasy@linutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      10287bae
  7. 10 9月, 2012 16 次提交
  8. 31 8月, 2012 1 次提交
    • M
      usb: gadget: get rid of USB_GADGET_{DUAL,SUPER}SPEED · 85b8614d
      Michal Nazarewicz 提交于
      This commit removes USB_GADGET_DUALSPEED and USB_GADGET_SUPERSPEED
      Kconfig options.  Since now kernel allows many UDC drivers to be
      compiled, those options may turn to no longer be valid.  For
      instance, if someone decides to build UDC that supports super
      speed and UDC that supports high speed only, the latter will be
      "assumed" to support super speed since USB_GADGET_SUPERSPEED will
      be selected by the former.
      
      The test of whether CONFIG_USB_GADGET_*SPEED was defined was just
      an optimisation which removed otherwise dead code (ie. if UDC is
      not dual speed, there is no need to handle cases that can happen
      if speed is high).  This commit removes those checks.
      Signed-off-by: NMichal Nazarewicz <mina86@mina86.com>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      85b8614d
  9. 23 8月, 2012 1 次提交
    • M
      usb composite: fix locking in usb_function_activate · 4fefe9f6
      Michael Grzeschik 提交于
      The lockdep hunter mentions a non consistent usage of spin_lock and
      spin_lock_irqsafe in the composite_disconnect and usb_function_activate
      function:
      
      [   15.700897] =================================
      [   15.705255] [ INFO: inconsistent lock state ]
      [   15.709617] 3.5.0-rc5+ #413 Not tainted
      [   15.713453] ---------------------------------
      [   15.717812] inconsistent {HARDIRQ-ON-W} -> {IN-HARDIRQ-W} usage.
      [   15.723822] uvc-gadget/116 [HC1[1]:SC0[0]:HE0:SE1] takes:
      [   15.729222]  (&(&cdev->lock)->rlock){?.+...}, at: [<7f0049e8>] composite_disconnect+0x2c/0x74 [g_webcam]
      [   15.738797] {HARDIRQ-ON-W} state was registered at:
      [   15.743677]   [<8006de3c>] mark_lock+0x148/0x688
      [   15.748325]   [<8006ecb0>] __lock_acquire+0x934/0x1b74
      [   15.753481]   [<8007047c>] lock_acquire+0x98/0x138
      [   15.758288]   [<804c776c>] _raw_spin_lock+0x4c/0x84
      [   15.763188]   [<7f006ae4>] usb_function_activate+0x28/0x94 [g_webcam]
      [   15.769652]   [<7f00820c>] usb_ep_autoconfig_reset+0x78/0x98 [g_webcam]
      [   15.776287]   [<7f0082a4>] uvc_v4l2_open+0x78/0x94 [g_webcam]
      [   15.782054]   [<80366a38>] v4l2_open+0x104/0x130
      [   15.786697]   [<800efd30>] chrdev_open+0xa0/0x170
      [   15.791423]   [<800e9718>] do_dentry_open.isra.13+0x1e8/0x264
      [   15.797186]   [<800ea5d4>] nameidata_to_filp+0x58/0x94
      [   15.802340]   [<800fa29c>] do_last.isra.31+0x2a0/0x808
      [   15.807497]   [<800faa40>] path_openat+0xc8/0x3e8
      [   15.812216]   [<800fae90>] do_filp_open+0x3c/0x90
      [   15.816936]   [<800ea6fc>] do_sys_open+0xec/0x184
      [   15.821655]   [<800ea7c4>] sys_open+0x30/0x34
      [   15.826027]   [<8000e5c0>] ret_fast_syscall+0x0/0x48
      [   15.831015] irq event stamp: 6048
      [   15.834330] hardirqs last  enabled at (6047): [<804c81b8>] _raw_spin_unlock_irqrestore+0x40/0x54
      [   15.843132] hardirqs last disabled at (6048): [<8000e174>] __irq_svc+0x34/0x60
      [   15.850370] softirqs last  enabled at (5940): [<80028380>] __do_softirq+0x188/0x270
      [   15.858043] softirqs last disabled at (5935): [<80028944>] irq_exit+0xa0/0xa8
      [   15.865195]
      [   15.865195] other info that might help us debug this:
      [   15.871724]  Possible unsafe locking scenario:
      [   15.871724]
      [   15.877645]        CPU0
      [   15.880091]        ----
      [   15.882537]   lock(&(&cdev->lock)->rlock);
      [   15.886659]   <Interrupt>
      [   15.889278]     lock(&(&cdev->lock)->rlock);
      [   15.893573]
      [   15.893573]  *** DEADLOCK ***
      [   15.893573]
      [   15.899496] no locks held by uvc-gadget/116.
      [   15.903765]
      [   15.903765] stack backtrace:
      [   15.908125] Backtrace:
      [   15.910604] [<80012038>] (dump_backtrace+0x0/0x114) from [<804bf8a4>] (dump_stack+0x20/0x24)
      [   15.919043]  r6:dfb8e6f0 r5:dfb8e400 r4:809717ec r3:60000193
      [   15.924766] [<804bf884>] (dump_stack+0x0/0x24) from [<804c0c0c>] (print_usage_bug+0x258/0x2c0)
      [   15.933388] [<804c09b4>] (print_usage_bug+0x0/0x2c0) from [<8006e240>] (mark_lock+0x54c/0x688)
      [   15.942006] [<8006dcf4>] (mark_lock+0x0/0x688) from [<8006edb8>] (__lock_acquire+0xa3c/0x1b74)
      [   15.950625] [<8006e37c>] (__lock_acquire+0x0/0x1b74) from [<8007047c>] (lock_acquire+0x98/0x138)
      [   15.959418] [<800703e4>] (lock_acquire+0x0/0x138) from [<804c78fc>] (_raw_spin_lock_irqsave+0x58/0x94)
      [   15.968736] [<804c78a4>] (_raw_spin_lock_irqsave+0x0/0x94) from [<7f0049e8>] (composite_disconnect+0x2c/0x74 [g_webcam])
      [   15.979605]  r7:00000012 r6:df82b0c4 r5:ded755bc r4:ded75580
      [   15.985331] [<7f0049bc>] (composite_disconnect+0x0/0x74 [g_webcam]) from [<8033c170>] (_gadget_stop_activity+0xc4/0x120)
      [   15.996200]  r6:df82b0c4 r5:df82b0c8 r4:df82b0d0 r3:7f0049bc
      [   16.001919] [<8033c0ac>] (_gadget_stop_activity+0x0/0x120) from [<8033e390>] (udc_irq+0x724/0xcb8)
      [   16.010877]  r6:df82b010 r5:00000000 r4:df82b010 r3:00000000
      [   16.016595] [<8033dc6c>] (udc_irq+0x0/0xcb8) from [<8033baec>] (ci_irq+0x64/0xdc)
      [   16.024086] [<8033ba88>] (ci_irq+0x0/0xdc) from [<80086538>] (handle_irq_event_percpu+0x74/0x298)
      [   16.032958]  r5:807fd414 r4:df38fdc0
      [   16.036566] [<800864c4>] (handle_irq_event_percpu+0x0/0x298) from [<800867a8>] (handle_irq_event+0x4c/0x6c)
      [   16.046315] [<8008675c>] (handle_irq_event+0x0/0x6c) from [<80089318>] (handle_level_irq+0xbc/0x11c)
      [   16.055447]  r6:def04000 r5:807fd414 r4:807fd3c0 r3:00020000
      [   16.061166] [<8008925c>] (handle_level_irq+0x0/0x11c) from [<80085cc8>] (generic_handle_irq+0x38/0x4c)
      [   16.070472]  r5:807f7f64 r4:8081e9f8
      [   16.074082] [<80085c90>] (generic_handle_irq+0x0/0x4c) from [<8000ef98>] (handle_IRQ+0x5c/0xbc)
      [   16.082788] [<8000ef3c>] (handle_IRQ+0x0/0xbc) from [<800085cc>] (tzic_handle_irq+0x6c/0x9c)
      [   16.091225]  r8:00000000 r7:def059b0 r6:00000001 r5:00000000 r4:00000000
      r3:00000012
      [   16.099141] [<80008560>] (tzic_handle_irq+0x0/0x9c) from [<8000e184>] (__irq_svc+0x44/0x60)
      [   16.107494] Exception stack(0xdef059b0 to 0xdef059f8)
      [   16.112550] 59a0:                                     00000001 00000001 00000000 dfb8e400
      [   16.120732] 59c0: 40000013 81a2e500 00000000 81a2e500 00000000 00000000 80862418 def05a0c
      [   16.128912] 59e0: def059c8 def059f8 80070e24 804c81bc 20000013 ffffffff
      [   16.135542] [<804c8178>] (_raw_spin_unlock_irqrestore+0x0/0x54) from [<8003d0ec>] (__queue_work+0x108/0x470)
      [   16.145369]  r5:dfb1a30c r4:81b93c00
      [   16.148978] [<8003cfe4>] (__queue_work+0x0/0x470) from [<8003d4e0>] (queue_work_on+0x4c/0x54)
      [   16.157511] [<8003d494>] (queue_work_on+0x0/0x54) from [<8003d544>] (queue_work+0x30/0x34)
      [   16.165774]  r6:df2e6900 r5:80e0c2f8 r4:dfb1a2c8 r3:def04000
      [   16.171495] [<8003d514>] (queue_work+0x0/0x34) from [<80493284>] (rpc_make_runnable+0x9c/0xac)
      [   16.180113] [<804931e8>] (rpc_make_runnable+0x0/0xac) from [<80493c88>] (rpc_execute+0x40/0xa8)
      [   16.188811]  r5:def05ad4 r4:dfb1a2c8
      [   16.192426] [<80493c48>] (rpc_execute+0x0/0xa8) from [<8048c734>] (rpc_run_task+0xa8/0xb4)
      [   16.200690]  r8:00000001 r7:df74f520 r6:ded75700 r5:def05ad4 r4:dfb1a2c8
      r3:00000002
      [   16.208618] [<8048c68c>] (rpc_run_task+0x0/0xb4) from [<801f1608>] (nfs_initiate_read+0xb4/0xd4)
      [   16.217403]  r5:df3e86c0 r4:00000000
      [   16.221015] [<801f1554>] (nfs_initiate_read+0x0/0xd4) from [<801f1c64>] (nfs_generic_pg_readpages+0x9c/0x114)
      [   16.230937] [<801f1bc8>] (nfs_generic_pg_readpages+0x0/0x114) from [<801f0744>] (__nfs_pageio_add_request+0xe8/0x214)
      [   16.241545]  r8:000bf000 r7:00000000 r6:00000000 r5:deef4640 r4:def05c1c
      r3:801f1bc8
      [   16.249463] [<801f065c>] (__nfs_pageio_add_request+0x0/0x214) from [<801f0e3c>] (nfs_pageio_add_request+0x28/0x54)
      [   16.259818] [<801f0e14>] (nfs_pageio_add_request+0x0/0x54) from [<801f1394>] (readpage_async_filler+0x114/0x170)
      [   16.269992]  r5:def05c58 r4:80fd7300
      [   16.273607] [<801f1280>] (readpage_async_filler+0x0/0x170) from [<800bb418>] (read_cache_pages+0xa0/0x108)
      [   16.283259]  r8:00200200 r7:00100100 r6:df74f654 r5:def05cd0 r4:80fd7300
      [   16.290034] [<800bb378>] (read_cache_pages+0x0/0x108) from [<801f218c>] (nfs_readpages+0xc4/0x168)
      [   16.298999] [<801f20c8>] (nfs_readpages+0x0/0x168) from [<800bb1d0>] (__do_page_cache_readahead+0x254/0x354)
      [   16.308833] [<800baf7c>] (__do_page_cache_readahead+0x0/0x354) from [<800bb5d0>] (ra_submit+0x38/0x40)
      [   16.318145] [<800bb598>] (ra_submit+0x0/0x40) from [<800bb6b0>] (ondemand_readahead+0xd8/0x3b0)
      [   16.326851] [<800bb5d8>] (ondemand_readahead+0x0/0x3b0) from [<800bba20>] (page_cache_async_readahead+0x98/0xa8)
      [   16.337043] [<800bb988>] (page_cache_async_readahead+0x0/0xa8) from [<800b2118>] (generic_file_aio_read+0x5b4/0x7c4)
      [   16.347565]  r6:00000000 r5:df74f654 r4:80fd70a0
      [   16.352231] [<800b1b64>] (generic_file_aio_read+0x0/0x7c4) from [<801e82c0>] (nfs_file_read+0x7c/0xcc)
      [   16.361544] [<801e8244>] (nfs_file_read+0x0/0xcc) from [<800eab80>] (do_sync_read+0xb4/0xf4)
      [   16.369981]  r9:00000000 r8:def05f70 r7:00000000 r6:00000000 r5:dec34900
      r4:fffffdee
      [   16.377896] [<800eaacc>] (do_sync_read+0x0/0xf4) from [<800eb548>] (vfs_read+0xb4/0x144)
      [   16.385987]  r8:00000000 r7:def05f70 r6:76a95008 r5:003e3dd6 r4:dec34900
      [   16.392761] [<800eb494>] (vfs_read+0x0/0x144) from [<800eb624>] (sys_read+0x4c/0x78)
      [   16.400504]  r8:00000000 r7:00000003 r6:003e3dd6 r5:76a95008 r4:dec34900
      [   16.407279] [<800eb5d8>] (sys_read+0x0/0x78) from [<8000e5c0>] (ret_fast_syscall+0x0/0x48)
      [   16.415543]  r9:def04000 r8:8000e864 r6:000086b4 r5:00000000 r4:00000000
      [   20.872729]  gadget: high-speed config #1: Video
      [   20.877368]  gadget: uvc_function_set_alt(0, 0)
      [   20.881908]  gadget: uvc_function_set_alt(1, 0)
      [   20.891464]  gadget: uvc_function_set_alt(1, 0)
      Signed-off-by: NMichael Grzeschik <m.grzeschik@pengutronix.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      4fefe9f6
  10. 12 6月, 2012 1 次提交
  11. 11 5月, 2012 4 次提交
  12. 04 5月, 2012 2 次提交
    • D
      usb: gadget: add a sparse endian notation · 20c5e74c
      Dan Carpenter 提交于
      The original code works fine, but Sparse complains because it isn't
      annotated properly.
      
      drivers/usb/gadget/composite.c:793:26: warning: incorrect type in assignment (different base types)
      drivers/usb/gadget/composite.c:793:26:    expected unsigned short [unsigned] [usertype] language
      devel/drivers/usb/gadget/composite.c:793:26:    got restricted __le16 [usertype] <noident>
      devel/drivers/usb/gadget/composite.c:795:29: warning: restricted __le16 degrades to integer
      drivers/usb/gadget/composite.c:798:24: warning: incorrect type in assignment (different base types)
      drivers/usb/gadget/composite.c:798:24:    expected restricted __le16 [usertype] <noident>
      devel/drivers/usb/gadget/composite.c:798:24:    got unsigned short [unsigned] [usertype] language
      Signed-off-by: NDan Carpenter <dan.carpenter@oracle.com>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      20c5e74c
    • Y
      usb: gadget: composite: prevent a memory leak when configuration bind fails · 124ef389
      Yongsul Oh 提交于
      In some USB composite gadget drivers, the configuration's bind function called
      by the usb_add_config() calls multiple bind config functions. (for example cdc2
      configuration bind function in the cdc_do_config() of the cdc2.c has two
      functionality bind config functions.
        - the ecm_bind_config() & the acm_bind_config())
      
      In each functionality bind config function, new instance is allocated and
      finally added by the usb_add_function().
      
      So if an error occurred during the second functionality bind config (for
      example an error occurred at the acm_bind_config() after succeeding of the
      ecm_bind_function()), the instance created by the acm_bind_config() cannot be
      freed creating a memory leak.
      
      This patch fixes this issue.
      Signed-off-by: NYongsul Oh <yongsul96.oh@samsung.com>
      Acked-by: NMichal Nazarewicz <mina86@mina86.com>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      124ef389
  13. 24 1月, 2012 1 次提交
  14. 12 12月, 2011 1 次提交
    • M
      usb: gadget: rename usb_gadget_driver::speed to max_speed · 7177aed4
      Michal Nazarewicz 提交于
      This commit renames the “speed” field of the usb_gadget_driver
      structure to “max_speed”.  This is so that to make it more
      apparent that the field represents the maximum speed gadget
      driver can support.
      
      This also make the field look more like fields with the same
      name in usb_gadget and usb_composite_driver structures.  All
      of those represent the *maximal* speed given entity supports.
      
      After this commit, there are the following fields in various
      structures:
      * usb_gadget::speed - the current connection speed,
      * usb_gadget::max_speed - maximal speed UDC supports,
      * usb_gadget_driver::max_speed - maximal speed gadget driver
        supports, and
      * usb_composite_driver::max_speed - maximal speed composite
        gadget supports.
      Signed-off-by: NMichal Nazarewicz <mina86@mina86.com>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      7177aed4
  15. 01 11月, 2011 1 次提交