1. 28 4月, 2015 7 次提交
    • A
      usb: gadget: remove incorrect __init/__exit annotations · c94e289f
      Arnd Bergmann 提交于
      A recent change introduced a link error for the composite
      printer gadget driver:
      
      `printer_unbind' referenced in section `.ref.data' of drivers/built-in.o: defined in discarded section `.exit.text' of drivers/built-in.o
      
      Evidently the unbind function should not be marked __exit here,
      because it is called through a callback pointer that is not necessarily
      discarded, __composite_unbind() is indeed called from the error path of
      composite_bind(), which can never work for a built-in driver.
      
      Looking at the surrounding code, I found the same problem in all other
      composite gadget drivers in both the bind and unbind functions, as
      well as the udc platform driver 'remove' functions. Those will break
      if anyone uses the 'unbind' sysfs attribute to detach a device from a
      built-in driver.
      
      This patch removes the incorrect annotations from all the gadget
      drivers.
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      c94e289f
    • A
      usb: phy: isp1301: work around tps65010 dependency · 197d0bdf
      Arnd Bergmann 提交于
      The isp1301-omap driver contains special hooks for the TPS65010
      power management controller. It provides its own 'tps65010_set_vbus_draw'
      wrapper in case that driver is not enabled through Kconfig, but
      fails to handle the case where isp1301-omap is built-in but TPS65010
      is a loadable module, which currently results in a link error:
      
      drivers/built-in.o: In function `isp1301_set_power':
      :(.text+0x14e188): undefined reference to `tps65010_set_vbus_draw'
      
      This is a workaround to use the same trick as before also when
      tps65010 is a module. Doing a proper fix would require much larger
      changes to the driver that is not really worth it when the usb-phy
      drivers are going to eventually get replaced with generic-phy
      drivers.
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      197d0bdf
    • P
      usb: gadget: serial: fix re-ordering of tx data · 3e9d3d2e
      Philip Oberstaller 提交于
      When a single thread is sending out data over the gadget serial port,
      gs_start_tx() will be called both from the sender context and from the
      write completion. Since the port lock is released before the packet is
      queued, the order in which the URBs are submitted is not guaranteed.
      E.g.
      
        sending thread                      completion (interrupt)
      
        gs_write()
          LOCK
                                            gs_write_complete()
                                              LOCK (wait)
          gs_start_tx()
            req1 = list_entry(pool->next)
            UNLOCK
                                              LOCK (acquired)
                                              gs_start_tx()
                                                req2 = list_entry(pool->next)
                                                UNLOCK
                                                usb_ep_queue(req2)
            usb_ep_queue(req1)
      
      I.e., req2 is submitted before req1 but it contains the data that
      comes after req1.
      
      To reproduce, use SMP with sending thread and completion pinned to
      different CPUs, or use PREEMPT_RT, and add the following delay just
      before the call to usb_ep_queue():
      
      		if (port->write_started > 0 && !list_empty(pool))
      			udelay(1000);
      
      To work around this problem, make sure that only one thread is running
      through the gs_start_tx() loop with an extra flag write_busy. Since
      gs_start_tx() is always called with the port lock held, no further
      synchronisation is needed. The original caller will continue through
      the loop when the request was successfully submitted.
      Signed-off-by: NPhilip Oberstaller <Philip.Oberstaller@septentrio.com>
      Signed-off-by: NArnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      3e9d3d2e
    • K
      usb: gadget: hid: Fix static variable usage · f286d487
      Krzysztof Opasiak 提交于
      If we have multiple instances of hid function, each of
      them may have different report descriptor, also their
      length may be different.
      
      Currently we are using static hidg_desc varable which
      is being filled in hidg_bind(). Then we send its content
      to host in hidg_setup() function. This content may
      have been already overwriten if another instance
      has executed hidg_bind().
      Signed-off-by: NKrzysztof Opasiak <k.opasiak@samsung.com>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      f286d487
    • K
      usb: gadget: configfs: Fix interfaces array NULL-termination · 903124fe
      Krzysztof Opasiak 提交于
      memset() to 0 interfaces array before reusing
      usb_configuration structure.
      
      This commit fix bug:
      
      ln -s functions/acm.1 configs/c.1
      ln -s functions/acm.2 configs/c.1
      ln -s functions/acm.3 configs/c.1
      echo "UDC name" > UDC
      echo "" > UDC
      rm configs/c.1/acm.*
      rmdir functions/*
      mkdir functions/ecm.usb0
      ln -s functions/ecm.usb0 configs/c.1
      echo "UDC name" > UDC
      
      [   82.220969] Unable to handle kernel NULL pointer dereference at virtual address 00000000
      [   82.229009] pgd = c0004000
      [   82.231698] [00000000] *pgd=00000000
      [   82.235260] Internal error: Oops: 17 [#1] PREEMPT SMP ARM
      [   82.240638] Modules linked in:
      [   82.243681] CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.0.0-rc2 #39
      [   82.249926] Hardware name: SAMSUNG EXYNOS (Flattened Device Tree)
      [   82.256003] task: c07cd2f0 ti: c07c8000 task.ti: c07c8000
      [   82.261393] PC is at composite_setup+0xe3c/0x1674
      [   82.266073] LR is at composite_setup+0xf20/0x1674
      [   82.270760] pc : [<c03510d4>]    lr : [<c03511b8>]    psr: 600001d3
      [   82.270760] sp : c07c9df0  ip : c0806448  fp : ed8c9c9c
      [   82.282216] r10: 00000001  r9 : 00000000  r8 : edaae918
      [   82.287425] r7 : ed551cc0  r6 : 00007fff  r5 : 00000000  r4 : ed799634
      [   82.293934] r3 : 00000003  r2 : 00010002  r1 : edaae918  r0 : 0000002e
      [   82.300446] Flags: nZCv  IRQs off  FIQs off  Mode SVC_32  ISA ARM  Segment kernel
      [   82.307910] Control: 10c5387d  Table: 6bc1804a  DAC: 00000015
      [   82.313638] Process swapper/0 (pid: 0, stack limit = 0xc07c8210)
      [   82.319627] Stack: (0xc07c9df0 to 0xc07ca000)
      [   82.323969] 9de0:                                     00000000 c06e65f4 00000000 c07c9f68
      [   82.332130] 9e00: 00000067 c07c59ac 000003f7 edaae918 ed8c9c98 ed799690 eca2f140 200001d3
      [   82.340289] 9e20: ee79a2d8 c07c9e88 c07c5304 ffff55db 00010002 edaae810 edaae860 eda96d50
      [   82.348448] 9e40: 00000009 ee264510 00000007 c07ca444 edaae860 c0340890 c0827a40 ffff55e0
      [   82.356607] 9e60: c0827a40 eda96e40 ee264510 edaae810 00000000 edaae860 00000007 c07ca444
      [   82.364766] 9e80: edaae860 c0354170 c03407dc c033db4c edaae810 00000000 00000000 00000010
      [   82.372925] 9ea0: 00000032 c0341670 00000000 00000000 00000001 eda96e00 00000000 00000000
      [   82.381084] 9ec0: 00000000 00000032 c0803a23 ee1aa840 00000001 c005d54c 249e2450 00000000
      [   82.389244] 9ee0: 200001d3 ee1aa840 ee1aa8a0 ed84f4c0 00000000 c07c9f68 00000067 c07c59ac
      [   82.397403] 9f00: 00000000 c005d688 ee1aa840 ee1aa8a0 c07db4b4 c006009c 00000032 00000000
      [   82.405562] 9f20: 00000001 c005ce20 c07c59ac c005cf34 f002000c c07ca780 c07c9f68 00000057
      [   82.413722] 9f40: f0020000 413fc090 00000001 c00086b4 c000f804 60000053 ffffffff c07c9f9c
      [   82.421880] 9f60: c0803a20 c0011fc0 00000000 00000000 c07c9fb8 c001bee0 c07ca4f0 c057004c
      [   82.430040] 9f80: c07ca4fc c0803a20 c0803a20 413fc090 00000001 00000000 01000000 c07c9fb0
      [   82.438199] 9fa0: c000f800 c000f804 60000053 ffffffff 00000000 c0050e70 c0803bc0 c0783bd8
      [   82.446358] 9fc0: ffffffff ffffffff c0783664 00000000 00000000 c07b13e8 00000000 c0803e54
      [   82.454517] 9fe0: c07ca480 c07b13e4 c07ce40c 4000406a 00000000 40008074 00000000 00000000
      [   82.462689] [<c03510d4>] (composite_setup) from [<c0340890>] (s3c_hsotg_complete_setup+0xb4/0x418)
      [   82.471626] [<c0340890>] (s3c_hsotg_complete_setup) from [<c0354170>] (usb_gadget_giveback_request+0xc/0x10)
      [   82.481429] [<c0354170>] (usb_gadget_giveback_request) from [<c033db4c>] (s3c_hsotg_complete_request+0xcc/0x12c)
      [   82.491583] [<c033db4c>] (s3c_hsotg_complete_request) from [<c0341670>] (s3c_hsotg_irq+0x4fc/0x558)
      [   82.500614] [<c0341670>] (s3c_hsotg_irq) from [<c005d54c>] (handle_irq_event_percpu+0x50/0x150)
      [   82.509291] [<c005d54c>] (handle_irq_event_percpu) from [<c005d688>] (handle_irq_event+0x3c/0x5c)
      [   82.518145] [<c005d688>] (handle_irq_event) from [<c006009c>] (handle_fasteoi_irq+0xd4/0x18c)
      [   82.526650] [<c006009c>] (handle_fasteoi_irq) from [<c005ce20>] (generic_handle_irq+0x20/0x30)
      [   82.535242] [<c005ce20>] (generic_handle_irq) from [<c005cf34>] (__handle_domain_irq+0x6c/0xdc)
      [   82.543923] [<c005cf34>] (__handle_domain_irq) from [<c00086b4>] (gic_handle_irq+0x2c/0x6c)
      [   82.552256] [<c00086b4>] (gic_handle_irq) from [<c0011fc0>] (__irq_svc+0x40/0x74)
      [   82.559716] Exception stack(0xc07c9f68 to 0xc07c9fb0)
      [   82.564753] 9f60:                   00000000 00000000 c07c9fb8 c001bee0 c07ca4f0 c057004c
      [   82.572913] 9f80: c07ca4fc c0803a20 c0803a20 413fc090 00000001 00000000 01000000 c07c9fb0
      [   82.581069] 9fa0: c000f800 c000f804 60000053 ffffffff
      [   82.586113] [<c0011fc0>] (__irq_svc) from [<c000f804>] (arch_cpu_idle+0x30/0x3c)
      [   82.593491] [<c000f804>] (arch_cpu_idle) from [<c0050e70>] (cpu_startup_entry+0x128/0x1a4)
      [   82.601740] [<c0050e70>] (cpu_startup_entry) from [<c0783bd8>] (start_kernel+0x350/0x3bc)
      [   82.609890] Code: 0a000002 e3530005 05975010 15975008 (e5953000)
      [   82.615965] ---[ end trace f57d5f599a5f1bfa ]---
      
      Most of kernel code assume that interface array in
      struct usb_configuration is NULL terminated.
      
      When gadget is composed with configfs configuration
      structure may be reused for different functions set.
      
      This bug happens because purge_configs_funcs() sets
      only next_interface_id to 0. Interface array still
      contains pointers to already freed interfaces. If in
      second try we add less interfaces than earlier we
      may access unallocated memory when trying to get
      interface descriptors.
      Signed-off-by: NKrzysztof Opasiak <k.opasiak@samsung.com>
      Cc: <stable@vger.kernel.org> # 3.10+
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      903124fe
    • V
      usb: gadget: xilinx: fix devm_ioremap_resource() check · 49bce159
      Vladimir Zapolskiy 提交于
      devm_ioremap_resource() returns IOMEM_ERR_PTR() and it never
      returns NULL, fix the check to prevent access to invalid
      virtual address.
      Signed-off-by: NVladimir Zapolskiy <vz@mleia.com>
      Reviewed-by: NSören Brinkmann <soren.brinkmann@xilinx.com>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      49bce159
    • B
      usb: dwc3: dwc3-omap: correct the register macros · 22832190
      Bin Liu 提交于
      The macros related to register UTMI_OTG_CTRL and UTMI_OTG_STATUS are
      swapped. Correct them for readability.
      Signed-off-by: NBin Liu <b-liu@ti.com>
      Signed-off-by: NFelipe Balbi <balbi@ti.com>
      22832190
  2. 16 4月, 2015 1 次提交
  3. 15 4月, 2015 1 次提交
    • C
      target: simplify the target template registration API · 9ac8928e
      Christoph Hellwig 提交于
      Instead of calling target_fabric_configfs_init() +
      target_fabric_configfs_register() / target_fabric_configfs_deregister()
      target_fabric_configfs_free() from every target driver, rewrite the API
      so that we have simple register/unregister functions that operate on
      a const operations vector.
      
      This patch also fixes a memory leak in several target drivers. Several
      target drivers namely called target_fabric_configfs_deregister()
      without calling target_fabric_configfs_free().
      
      A large part of this patch is based on earlier changes from
      Bart Van Assche <bart.vanassche@sandisk.com>.
      
      (v2: Add a new TF_CIT_SETUP_DRV macro so that the core configfs code
      can declare attributes as either core only or for drivers)
      Signed-off-by: NChristoph Hellwig <hch@lst.de>
      Signed-off-by: NNicholas Bellinger <nab@linux-iscsi.org>
      9ac8928e
  4. 12 4月, 2015 1 次提交
  5. 10 4月, 2015 2 次提交
  6. 08 4月, 2015 16 次提交
  7. 04 4月, 2015 12 次提交