1. 26 4月, 2014 11 次提交
  2. 25 4月, 2014 17 次提交
    • T
      serial_core: fix uart PORT_UNKNOWN handling · 7deb39ed
      Thomas Pfaff 提交于
      While porting a RS485 driver from 2.6.29 to 3.14, i noticed that the serial tty
      driver could break it by using uart ports that it does not own :
      
      1. uart_change_pm ist called during uart_open and calls the uart pm function
         without checking for PORT_UNKNOWN.
         The fix is to move uart_change_pm from uart_open to uart_port_startup.
      2. The return code from the uart request_port call in uart_set_info is not
         handled properly, leading to the situation that the serial driver also
         thinks it owns the uart ports.
         This can triggered by doing following actions :
      
         setserial /dev/ttyS0 uart none    # release the uart ports
         modprobe lirc-serial              # or any other device that uses the uart
         setserial /dev/ttyS0 uart 16550   # gives no error and the uart tty driver
                                           # can use the ports as well
      Signed-off-by: NThomas Pfaff <tpfaff@pcs.com>
      Reviewed-by: NAlan Cox <alan@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7deb39ed
    • D
      serial: samsung: Change barrier() to cpu_relax() in console output · f94b0572
      Doug Anderson 提交于
      The two functions to write out to the console (one used in normal
      console mode and one in polling console mode) were slightly different.
      One used a barrier() in its loop and the other a cpu_relax().  The
      barrier() really doesn't do anything since we're using rd_regl() to
      read the port anyway.  Switch it to cpu_relax() to make things
      consistent.
      
      No known bugs / issues are fixed by this change--it just makes things
      more consistent.
      Signed-off-by: NDoug Anderson <dianders@chromium.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      f94b0572
    • D
      serial: samsung: don't check config for every character · ab88c8dc
      Doug Anderson 提交于
      The s3c24xx_serial_console_putchar() is _only_ ever used by
      s3c24xx_serial_console_write() and is called in a loop (indirectly
      through uart_console_write()).  There's no reason to call
      s3c24xx_port_configured() for every iteration through the loop.  Move
      it outside the loop.
      Signed-off-by: NDoug Anderson <dianders@chromium.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      ab88c8dc
    • D
      serial: samsung: Use the passed in "port", fixing kgdb w/ no console · bb7f09ba
      Doug Anderson 提交于
      The two functions in the samsung serial driver used for writing
      characters out to the port were inconsistent about whether they used
      the passed in "port" or the global "cons_uart".  There was no reason
      to use the global and the use of the global in
      s3c24xx_serial_put_poll_char() caused a crash in the case where you
      used the serial port for kgdboc but not for console.
      
      Fix it so we used the passed in variable.
      
      Note that this doesn't fix all problems with the samsung serial
      driver.  Specifically:
      * s3c24xx_serial_console_putchar() is still 99% identical to
        s3c24xx_serial_put_poll_char() (the function signature is different,
        but that's about it).  A future patch will make them slightly less
        identical and judging by other serial drivers we may need yet more
        differences eventually.
      * The samsung serial driver still doesn't allow you to have more than
        one console port since it still uses the global cons_uart in
        s3c24xx_serial_console_write().
      Signed-off-by: NDoug Anderson <dianders@chromium.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      bb7f09ba
    • L
      serial: 8250: Fix thread unsafe __dma_tx_complete function · f8fd1b03
      Loic Poulain 提交于
      __dma_tx_complete is not protected against concurrent
      call of serial8250_tx_dma. it can lead to circular tail
      index corruption or parallel call of serial_tx_dma on the
      same data portion.
      
      This patch fixes this issue by holding the port lock.
      Signed-off-by: NLoic Poulain <loic.poulain@intel.com>
      Reviewed-by: NHeikki Krogerus <heikki.krogerus@linux.intel.com>
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      f8fd1b03
    • L
      8250_core: Fix unwanted TX chars write · b08c9c31
      Loic Poulain 提交于
      On transmit-hold-register empty, serial8250_tx_chars
      should be called only if we don't use DMA.
      DMA has its own tx cycle.
      Signed-off-by: NLoic Poulain <loic.poulain@intel.com>
      Reviewed-by: NHeikki Krogerus <heikki.krogerus@linux.intel.com>
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      b08c9c31
    • M
      tty: Fix race condition between __tty_buffer_request_room and flush_to_ldisc · 6a20dbd6
      Manfred Schlaegl 提交于
      The race was introduced while development of linux-3.11 by
      e8437d7e and
      e9975fde.
      Originally it was found and reproduced on linux-3.12.15 and
      linux-3.12.15-rt25, by sending 500 byte blocks with 115kbaud to the
      target uart in a loop with 100 milliseconds delay.
      
      In short:
       1. The consumer flush_to_ldisc is on to remove the head tty_buffer.
       2. The producer adds a number of bytes, so that a new tty_buffer must
      	be allocated and added by __tty_buffer_request_room.
       3. The consumer removes the head tty_buffer element, without handling
      	newly committed data.
      
      Detailed example:
       * Initial buffer:
         * Head, Tail -> 0: used=250; commit=250; read=240; next=NULL
       * Consumer: ''flush_to_ldisc''
         * consumed 10 Byte
         * buffer:
           * Head, Tail -> 0: used=250; commit=250; read=250; next=NULL
      {{{
      		count = head->commit - head->read;	// count = 0
      		if (!count) {				// enter
      			// INTERRUPTED BY PRODUCER ->
      			if (head->next == NULL)
      				break;
      			buf->head = head->next;
      			tty_buffer_free(port, head);
      			continue;
      		}
      }}}
       * Producer: tty_insert_flip_... 10 bytes + tty_flip_buffer_push
         * buffer:
           * Head, Tail -> 0: used=250; commit=250; read=250; next=NULL
         * added 6 bytes: head-element filled to maximum.
           * buffer:
             * Head, Tail -> 0: used=256; commit=250; read=250; next=NULL
         * added 4 bytes: __tty_buffer_request_room is called
           * buffer:
             * Head -> 0: used=256; commit=256; read=250; next=1
             * Tail -> 1: used=4; commit=0; read=250 next=NULL
         * push (tty_flip_buffer_push)
           * buffer:
             * Head -> 0: used=256; commit=256; read=250; next=1
             * Tail -> 1: used=4; commit=4; read=250 next=NULL
       * Consumer
      {{{
      		count = head->commit - head->read;
      		if (!count) {
      			// INTERRUPTED BY PRODUCER <-
      			if (head->next == NULL)		// -> no break
      				break;
      			buf->head = head->next;
      			tty_buffer_free(port, head);
      			// ERROR: tty_buffer head freed -> 6 bytes lost
      			continue;
      		}
      }}}
      
      This patch reintroduces a spin_lock to protect this case. Perhaps later
      a lock-less solution could be found.
      Signed-off-by: NManfred Schlaegl <manfred.schlaegl@gmx.at>
      Cc: stable <stable@vger.kernel.org> # 3.11
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      6a20dbd6
    • S
      phy: fix kernel oops in phy_lookup() · 743bb387
      Sergei Shtylyov 提交于
      The kernel oopses in phy_lookup() due to 'phy->init_data' being NULL if we
      register PHYs from a device tree probing driver and then call phy_get() on a
      device that has no representation in the device tree (e.g. a PCI device).
      Checking the pointer before dereferening it and skipping an interation if
      it's NULL prevents this kernel oops.
      Signed-off-by: NSergei Shtylyov <sergei.shtylyov@cogentembedded.com>
      Signed-off-by: NKishon Vijay Abraham I <kishon@ti.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      743bb387
    • J
      phy: restore OMAP_CONTROL_PHY dependencies · 907aa3aa
      Jean Delvare 提交于
      When OMAP_CONTROL_USB was renamed to OMAP_CONTROL_PHY (commit
      14da699b), its dependencies were lost in the process. Nothing in the
      commit message indicates that this removal was intentional, so I think
      it was by accident and the dependencies should be restored.
      Signed-off-by: NJean Delvare <jdelvare@suse.de>
      Acked-by: NRoger Quadros <rogerq@ti.com>
      Cc: Felipe Balbi <balbi@ti.com>
      Signed-off-by: NKishon Vijay Abraham I <kishon@ti.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      907aa3aa
    • A
      phy: exynos: fix building as a module · d1481832
      Arnd Bergmann 提交于
      The top-level phy-samsung-usb2 driver may be configured as a
      loadable module, which currently causes link errors because
      of the dependency on the exynos{5250,4x12,4210}_usb2_phy_config
      symbol. Solving this could be achieved by exporting these
      symbols, but as the SoC-specific parts of the driver are not
      currently built as modules, it seems better to just link
      everything into one module and avoid the need for the export.
      Signed-off-by: NArnd Bergmann <arnd@arndb.de>
      Acked-by: NKamil Debski <k.debski@samsung.com>
      Signed-off-by: NKishon Vijay Abraham I <kishon@ti.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      d1481832
    • J
      USB: serial: fix sysfs-attribute removal deadlock · 10164c2a
      Johan Hovold 提交于
      Fix driver new_id sysfs-attribute removal deadlock by making sure to
      not hold any locks that the attribute operations grab when removing the
      attribute.
      
      Specifically, usb_serial_deregister holds the table mutex when
      deregistering the driver, which includes removing the new_id attribute.
      This can lead to a deadlock as writing to new_id increments the
      attribute's active count before trying to grab the same mutex in
      usb_serial_probe.
      
      The deadlock can easily be triggered by inserting a sleep in
      usb_serial_deregister and writing the id of an unbound device to new_id
      during module unload.
      
      As the table mutex (in this case) is used to prevent subdriver unload
      during probe, it should be sufficient to only hold the lock while
      manipulating the usb-serial driver list during deregister. A racing
      probe will then either fail to find a matching subdriver or fail to get
      the corresponding module reference.
      
      Since v3.15-rc1 this also triggers the following lockdep warning:
      
      ======================================================
      [ INFO: possible circular locking dependency detected ]
      3.15.0-rc2 #123 Tainted: G        W
      -------------------------------------------------------
      modprobe/190 is trying to acquire lock:
       (s_active#4){++++.+}, at: [<c0167aa0>] kernfs_remove_by_name_ns+0x4c/0x94
      
      but task is already holding lock:
       (table_lock){+.+.+.}, at: [<bf004d84>] usb_serial_deregister+0x3c/0x78 [usbserial]
      
      which lock already depends on the new lock.
      
      the existing dependency chain (in reverse order) is:
      
      -> #1 (table_lock){+.+.+.}:
             [<c0075f84>] __lock_acquire+0x1694/0x1ce4
             [<c0076de8>] lock_acquire+0xb4/0x154
             [<c03af3cc>] _raw_spin_lock+0x4c/0x5c
             [<c02bbc24>] usb_store_new_id+0x14c/0x1ac
             [<bf007eb4>] new_id_store+0x68/0x70 [usbserial]
             [<c025f568>] drv_attr_store+0x30/0x3c
             [<c01690e0>] sysfs_kf_write+0x5c/0x60
             [<c01682c0>] kernfs_fop_write+0xd4/0x194
             [<c010881c>] vfs_write+0xbc/0x198
             [<c0108e4c>] SyS_write+0x4c/0xa0
             [<c000f880>] ret_fast_syscall+0x0/0x48
      
      -> #0 (s_active#4){++++.+}:
             [<c03a7a28>] print_circular_bug+0x68/0x2f8
             [<c0076218>] __lock_acquire+0x1928/0x1ce4
             [<c0076de8>] lock_acquire+0xb4/0x154
             [<c0166b70>] __kernfs_remove+0x254/0x310
             [<c0167aa0>] kernfs_remove_by_name_ns+0x4c/0x94
             [<c0169fb8>] remove_files.isra.1+0x48/0x84
             [<c016a2fc>] sysfs_remove_group+0x58/0xac
             [<c016a414>] sysfs_remove_groups+0x34/0x44
             [<c02623b8>] driver_remove_groups+0x1c/0x20
             [<c0260e9c>] bus_remove_driver+0x3c/0xe4
             [<c026235c>] driver_unregister+0x38/0x58
             [<bf007fb4>] usb_serial_bus_deregister+0x84/0x88 [usbserial]
             [<bf004db4>] usb_serial_deregister+0x6c/0x78 [usbserial]
             [<bf005330>] usb_serial_deregister_drivers+0x2c/0x4c [usbserial]
             [<bf016618>] usb_serial_module_exit+0x14/0x1c [sierra]
             [<c009d6cc>] SyS_delete_module+0x184/0x210
             [<c000f880>] ret_fast_syscall+0x0/0x48
      
      other info that might help us debug this:
      
       Possible unsafe locking scenario:
      
             CPU0                    CPU1
             ----                    ----
        lock(table_lock);
                                     lock(s_active#4);
                                     lock(table_lock);
        lock(s_active#4);
      
       *** DEADLOCK ***
      
      1 lock held by modprobe/190:
       #0:  (table_lock){+.+.+.}, at: [<bf004d84>] usb_serial_deregister+0x3c/0x78 [usbserial]
      
      stack backtrace:
      CPU: 0 PID: 190 Comm: modprobe Tainted: G        W     3.15.0-rc2 #123
      [<c0015e10>] (unwind_backtrace) from [<c0013728>] (show_stack+0x20/0x24)
      [<c0013728>] (show_stack) from [<c03a9a54>] (dump_stack+0x24/0x28)
      [<c03a9a54>] (dump_stack) from [<c03a7cac>] (print_circular_bug+0x2ec/0x2f8)
      [<c03a7cac>] (print_circular_bug) from [<c0076218>] (__lock_acquire+0x1928/0x1ce4)
      [<c0076218>] (__lock_acquire) from [<c0076de8>] (lock_acquire+0xb4/0x154)
      [<c0076de8>] (lock_acquire) from [<c0166b70>] (__kernfs_remove+0x254/0x310)
      [<c0166b70>] (__kernfs_remove) from [<c0167aa0>] (kernfs_remove_by_name_ns+0x4c/0x94)
      [<c0167aa0>] (kernfs_remove_by_name_ns) from [<c0169fb8>] (remove_files.isra.1+0x48/0x84)
      [<c0169fb8>] (remove_files.isra.1) from [<c016a2fc>] (sysfs_remove_group+0x58/0xac)
      [<c016a2fc>] (sysfs_remove_group) from [<c016a414>] (sysfs_remove_groups+0x34/0x44)
      [<c016a414>] (sysfs_remove_groups) from [<c02623b8>] (driver_remove_groups+0x1c/0x20)
      [<c02623b8>] (driver_remove_groups) from [<c0260e9c>] (bus_remove_driver+0x3c/0xe4)
      [<c0260e9c>] (bus_remove_driver) from [<c026235c>] (driver_unregister+0x38/0x58)
      [<c026235c>] (driver_unregister) from [<bf007fb4>] (usb_serial_bus_deregister+0x84/0x88 [usbserial])
      [<bf007fb4>] (usb_serial_bus_deregister [usbserial]) from [<bf004db4>] (usb_serial_deregister+0x6c/0x78 [usbserial])
      [<bf004db4>] (usb_serial_deregister [usbserial]) from [<bf005330>] (usb_serial_deregister_drivers+0x2c/0x4c [usbserial])
      [<bf005330>] (usb_serial_deregister_drivers [usbserial]) from [<bf016618>] (usb_serial_module_exit+0x14/0x1c [sierra])
      [<bf016618>] (usb_serial_module_exit [sierra]) from [<c009d6cc>] (SyS_delete_module+0x184/0x210)
      [<c009d6cc>] (SyS_delete_module) from [<c000f880>] (ret_fast_syscall+0x0/0x48)
      Signed-off-by: NJohan Hovold <jhovold@gmail.com>
      Cc: stable <stable@vger.kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      10164c2a
    • T
      usb: wusbcore: fix panic in wusbhc_chid_set · bd130ada
      Thomas Pugliese 提交于
      If no valid CHID value has previously been set on an HWA, writing a
      value of all zeros will cause a kernel panic in uwb_radio_stop because
      wusbhc->uwb_rc has not been set.  This patch skips the call to
      uwb_radio_stop if wusbhc->uwb_rc has not been initialized.
      Signed-off-by: NThomas Pugliese <thomas.pugliese@gmail.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      bd130ada
    • T
      usb: wusbcore: convert nested lock to use spin_lock instead of spin_lock_irq · 7584f2eb
      Thomas Pugliese 提交于
      Nesting a spin_lock_irq/unlock_irq inside a lock that has already
      disabled interrupts will enable interrupts before we are ready when
      spin_unlock_irq is called.  This patch converts the inner lock to use
      spin_lock and spin_unlock instead.
      Signed-off-by: NThomas Pugliese <thomas.pugliese@gmail.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      7584f2eb
    • T
      uwb: don't call spin_unlock_irq in a USB completion handler · c996b937
      Thomas Pugliese 提交于
      This patch converts the use of spin_lock_irq/spin_unlock_irq to
      spin_lock_irqsave/spin_unlock_irqrestore in uwb_rc_set_drp_cmd_done
      which is called from a USB completion handler.  There are also
      whitespace cleanups to make checkpatch.pl happy.
      Signed-off-by: NThomas Pugliese <thomas.pugliese@gmail.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      c996b937
    • P
      usb: chipidea: coordinate usb phy initialization for different phy type · cd84f009
      Peter Chen 提交于
      For internal PHY (like UTMI), the phy clock may from internal pll,
      it is on/off on the fly, the access PORTSC.PTS will hang without
      phy clock. So, the usb_phy_init which will open phy clock needs to
      be called before hw_phymode_configure.
      See: http://marc.info/?l=linux-arm-kernel&m=139350618732108&w=2
      
      For external PHY (like ulpi), it needs to configure portsc.pts before
      visit viewport, or the viewport can't be visited. so phy_phymode_configure
      needs to be called before usb_phy_init.
      See: cd0b42c2
      
      It may not the best solution, but it can work for all situations.
      
      Cc: Sascha Hauer <s.hauer@pengutronix.de>
      Cc: Chris Ruehl <chris.ruehl@gtsys.com.hk>
      Cc: shc_work@mail.ru
      Cc: denis@eukrea.com
      Cc: festevam@gmail.com
      Cc: stable <stable@vger.kernel.org> # 3.14
      Signed-off-by: NPeter Chen <peter.chen@freescale.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      cd84f009
    • R
      ACPI / notify: Do not block unknown type notifications in root handler · f66abe92
      Rafael J. Wysocki 提交于
      Commit 1a699476 "ACPI / hotplug / PCI: Hotplug notifications from
      acpi_bus_notify()" changed the root notify handler, acpi_bus_notify(),
      to block unknown type norifications, but it overlooked the fact that
      they might be propagated to drivers via the ->notify() callback.
      
      Fix the problem by allowing drivers to receive unknown type
      notifications via ->notify() as before.
      
      Fixes: 1a699476 (ACPI / hotplug / PCI: Hotplug notifications from acpi_bus_notify())
      Reported-and-tested-by: NMantas Mikulėnas <grawity@gmail.com>
      Reported-and-tested-by: NSitsofe Wheeler <sitsofe@yahoo.com>
      Signed-off-by: NRafael J. Wysocki <rafael.j.wysocki@intel.com>
      f66abe92
    • P
      power/reset: vexpress: Fix restart/power off operation · d08b8037
      Pawel Moll 提交于
      The restart/power off implementation in the vexpress driver
      used to obtain the config function when necessary. This was
      wrong in two respects:
      
      1. It required memory allocation with disabled interrupts
      (it worked, but lockdep - when enabled - reported warnings).
      
      2. Used jiffies-based timeout, while jiffies are not running
      at this stage of system shutdown (therefore a config
      transaction error - if happened - would have never be reported).
      
      Fixed by pre-allocating the config function per device
      and using mdelay for timeout.
      Signed-off-by: NPawel Moll <pawel.moll@arm.com>
      d08b8037
  3. 24 4月, 2014 7 次提交
  4. 23 4月, 2014 2 次提交
  5. 22 4月, 2014 3 次提交