1. 16 11月, 2011 1 次提交
  2. 26 2月, 2011 1 次提交
    • A
      USB: serial drivers need to use larger bulk-in buffers · 969e3033
      Alan Stern 提交于
      When a driver doesn't know how much data a device is going to send,
      the buffer size should be at least as big as the endpoint's maxpacket
      value.  The serial drivers don't follow this rule; many of them
      request only 256-byte bulk-in buffers.  As a result, they suffer
      overflow errors if a high-speed device wants to send a lot of data,
      because high-speed bulk endpoints are required to have a maxpacket
      size of 512.
      
      This patch (as1450) fixes the problem by using the driver's
      bulk_in_size value as a minimum, always allocating buffers no smaller
      than the endpoint's maxpacket size.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Tested-by: NFlynn Marquardt <flynn@flynnux.de>
      CC: <stable@kernel.org> [after .39-rc1 is out]
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      969e3033
  3. 18 2月, 2011 3 次提交
  4. 23 1月, 2011 1 次提交
    • L
      USB: serial: handle Data Carrier Detect changes · d14fc1a7
      Libor Pechacek 提交于
      Alan's commit 335f8514 introduced
      .carrier_raised function in several drivers.  That also means
      tty_port_block_til_ready can now suspend the process trying to open the serial
      port when Carrier Detect is low and put it into tty_port.open_wait queue.  We
      need to wake up the process when Carrier Detect goes high and trigger TTY
      hangup when CD goes low.
      
      Some of the devices do not report modem status line changes, or at least we
      don't understand the status message, so for those we remove .carrier_raised
      again.
      Signed-off-by: NLibor Pechacek <lpechacek@suse.cz>
      Cc: stable <stable@kernel.org>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      d14fc1a7
  5. 23 10月, 2010 1 次提交
    • A
      tty: Make tiocgicount a handler · d281da7f
      Alan Cox 提交于
      Dan Rosenberg noted that various drivers return the struct with uncleared
      fields. Instead of spending forever trying to stomp all the drivers that
      get it wrong (and every new driver) do the job in one place.
      
      This first patch adds the needed operations and hooks them up, including
      the needed USB midlayer and serial core plumbing.
      Signed-off-by: NAlan Cox <alan@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      d281da7f
  6. 21 8月, 2010 1 次提交
  7. 21 5月, 2010 9 次提交
    • G
      USB: include/usb/*.h checkpatch cleanup · 0858a3a5
      Greg Kroah-Hartman 提交于
      Lots of minor formatting cleanups in includes/usb/ to make checkpatch
      happier.
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      0858a3a5
    • J
      USB: serial: remove multi-urb write from generic driver · c23e5fc1
      Johan Hovold 提交于
      Remove multi-urb write from the generic driver and simplify the
      prepare_write_buffer prototype:
      
      	int (*prepare_write_buffer)(struct usb_serial_port *port,
      						void *dest, size_t size);
      
      The default implementation simply fills dest with data from port write
      fifo but drivers can override it if they need to process the outgoing
      data (e.g. add headers).
      
      Turn ftdi_sio into a generic fifo-based driver, which lowers CPU usage
      significantly for small writes while retaining maximum throughput.
      Signed-off-by: NJohan Hovold <jhovold@gmail.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      c23e5fc1
    • J
      USB: serial: reimplement generic fifo-based writes · 27c7acf2
      Johan Hovold 提交于
      Reimplement fifo-based writes in the generic driver using a multiple
      pre-allocated urb scheme.
      
      In contrast to multi-urb writes, no allocations (of urbs or buffers) are
      made during run-time and there is less pressure on the host stack
      queues as currently only two urbs are used (implementation is generic
      and can handle more than two urbs as well, though).
      
      Initial tests using ftdi_sio show that the implementation achieves the
      same (maximum) throughput at high baudrates as multi-urb writes. The CPU
      usage is much lower than for multi-urb writes for small write requests
      and only slightly higher for large (e.g. 2k) requests (due to extra copy
      via fifo?).
      
      Also outperforms multi-urb writes for small write requests on an
      embedded arm-9 system, where multi-urb writes are CPU-bound at high
      baudrates (perf reveals that a lot of time is spent in the host stack
      enqueue function -- could perhaps be a bug as well).
      
      Keeping the original write_urb, buffer and flag for now as there are
      other drivers depending on them.
      Signed-off-by: NJohan Hovold <jhovold@gmail.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      27c7acf2
    • J
      USB: serial: generalise write buffer preparation · eaa3bcb0
      Johan Hovold 提交于
      Generalise write buffer preparation.
      
      This allows for drivers to manipulate (e.g. add headers) to bulk out
      data before it is sent.
      
      This adds a new function pointer to usb_serial_driver:
      
      int (*prepare_write_buffer)(struct usb_serial_port *port,
      		void **dest, size_t size, const void *src, size_t count);
      
      The function is generic and can be used with either kfifo-based or
      multi-urb writes:
      
      If *dest is NULL the implementation should allocate dest.
      If src is NULL the implementation should use the port write fifo.
      
      If not set, a generic implementation is used which simply uses memcpy or
      kfifo_out.
      Signed-off-by: NJohan Hovold <jhovold@gmail.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      eaa3bcb0
    • J
      USB: serial: re-implement multi-urb writes in generic driver · 25d514ca
      Johan Hovold 提交于
      Use dynamic transfer buffer sizes since it is more efficient to let the
      host controller do the partitioning to fit endpoint size. This way we
      also do not use more than one urb per write request.
      
      Replace max_in_flight_urbs with multi_urb_write flag in struct
      usb_serial_driver to enable multi-urb writes.
      
      Use MAX_TX_URBS=40 and a max buffer size of PAGE_SIZE to prevent DoS
      attacks.
      Signed-off-by: NJohan Hovold <jhovold@gmail.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      25d514ca
    • J
      USB: serial: generalise generic read implementation · 23154320
      Johan Hovold 提交于
      Add process_read_urb to usb_serial_driver so that a driver can rely on
      the generic read (and throttle) mechanism but still do device specific
      processing of incoming data (such as adding tty_flags before pushing to
      line discipline).
      
      The default generic implementation handles sysrq for consoles but
      otherwise simply pushes to tty.
      Signed-off-by: NJohan Hovold <jhovold@gmail.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      23154320
    • J
      USB: serial: refactor read urb submission in generic driver · 41bd72f9
      Johan Hovold 提交于
      Use the already exported function for submitting the read urb associated
      with a usb_serial_port.
      
      Make sure it returns the result of usb_submit_urb and rename to the
      more descriptive usb_serial_generic_submit_read_urb.
      Signed-off-by: NJohan Hovold <jhovold@gmail.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      41bd72f9
    • J
      USB: serial: allow drivers to define bulk buffer sizes · bbcb2b90
      Johan Hovold 提交于
      Allow drivers to define custom bulk in/out buffer sizes in struct
      usb_serial_driver. If not set, fall back to the default buffer size
      which matches the endpoint size.
      
      Three drivers are currently freeing the pre-allocated buffers and
      allocating larger ones to achieve this at port probe (ftdi_sio) or even
      at port open (ipaq and iuu_phoenix), which needless to say is suboptimal.
      Signed-off-by: NJohan Hovold <jhovold@gmail.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      bbcb2b90
    • J
      usb-serial: Use tty_port version console instead of usb_serial_port · bd5afa9e
      Jason Wessel 提交于
      Replace all instances of using the console variable in struct
      usb_serial_port with the struct tty_port version.
      
      CC: Alan Cox <alan@linux.intel.com>
      CC: Alan Stern <stern@rowland.harvard.edu>
      CC: Oliver Neukum <oliver@neukum.org>
      CC: Andrew Morton <akpm@linux-foundation.org>
      CC: linux-usb@vger.kernel.org
      CC: linux-kernel@vger.kernel.org
      Signed-off-by: NJason Wessel <jason.wessel@windriver.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      bd5afa9e
  8. 03 3月, 2010 1 次提交
  9. 24 12月, 2009 1 次提交
  10. 12 12月, 2009 1 次提交
  11. 10 10月, 2009 1 次提交
  12. 23 9月, 2009 1 次提交
    • D
      USB: use kfifo to buffer usb-generic serial writes · 8e8dce06
      David VomLehn 提交于
      When do_output_char() attempts to write a carriage return/line feed sequence,
      it first checks to see how much buffer room is available. If there are at least
      two characters free, it will write the carriage return/line feed with two calls
      to tty_put_char(). It calls the tty_operation functions write() for devices that
      don't support the tty_operations function put_char(). If the USB generic serial
      device's write URB is not in use, it will return the buffer size when asked how
      much room is available. The write() of the carriage return will cause it to mark
      the write URB busy, so the subsequent write() of the line feed will be ignored.
      
      This patch uses the kfifo infrastructure to implement a write FIFO that
      accurately returns the amount of space available in the buffer.
      Signed-off-by: NDavid VomLehn <dvomlehn@cisco.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      8e8dce06
  13. 20 9月, 2009 2 次提交
  14. 11 7月, 2009 1 次提交
  15. 16 6月, 2009 4 次提交
    • A
      USB: usb-serial: replace shutdown with disconnect, release · f9c99bb8
      Alan Stern 提交于
      This patch (as1254) splits up the shutdown method of usb_serial_driver
      into a disconnect and a release method.
      
      The problem is that the usb-serial core was calling shutdown during
      disconnect handling, but drivers didn't expect it to be called until
      after all the open file references had been closed.  The result was an
      oops when the close method tried to use memory that had been
      deallocated by shutdown.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      
      f9c99bb8
    • A
      USB: usb-serial: call port_probe and port_remove at the right times · c706ebdf
      Alan Stern 提交于
      This patch (as1253) prevents the usb-serial core from calling a
      driver's port_probe and port_remove methods more than once per port.
      It also removes some unnecessary try_module_get() calls and adds a
      missing port_remove method call in a failure path.
      Signed-off-by: NAlan Stern <stern@rowland.harvard.edu>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      c706ebdf
    • J
      USB: serial: usb_debug,usb_generic_serial: implement sysrq and serial break · 98fcb5f7
      Jason Wessel 提交于
      The usb_debug driver was modified to implement serial break handling
      by using a "magic" data packet comprised of the sequence:
      
             0x00 0xff 0x01 0xfe   0x00 0xfe 0x01 0xff
      
      When the tty layer requests a serial break the usb_debug driver sends
      the magic packet.  On the receiving side the magic packet is thrown
      away or a sysrq is activated depending on what kernel .config options
      have been set.
      
      The generic serial driver was modified as well as the usb serial
      headers to generically implement sysrq processing in the same way the
      non usb uart based drivers implement the sysrq handling.  This will
      allow other usb serial devices to implement sysrq handling as desired.
      
      The new usb serial functions are named similarly and implemented
      similarly to the uart functions as follows:
      
      usb_serial_handle_break <-> uart_handle_break
      usb_serial_handle_sysrq_char <-> uart_handle_sysrq_char
      Signed-off-by: NJason Wessel <jason.wessel@windriver.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      98fcb5f7
    • J
      USB: usb_debug, usb_generic_serial: implement multi urb write · 715b1dc0
      Jason Wessel 提交于
      The usb_debug driver, when used as the console, will always fail to
      insert the carriage return and new line sequence as well as randomly
      drop console output.  This is a result of only having the single
      write_urb and that the tty layer will have a lock that prevents the
      processing of the back to back urb requests.
      
      The solution is to allow more than one urb to be outstanding and have
      a slightly deeper transmit queue.  The idea and some code is borrowed
      from the ftdi_sio usb driver.
      
      The generic usb serial driver was modified so as to allow the classic
      method of 1 write urb, or a multi write urb scheme with N allowed
      outstanding urbs where N is controlled by max_in_flight_urbs.  When
      max_in_flight_urbs in a "struct usb_serial_driver" is non zero the
      multi write urb scheme will be used.
      
      The size of 4000 was selected for the usb_debug driver so that the
      driver lowers possibility of losing the queued console messages during
      the kernel startup.
      Signed-off-by: NJason Wessel <jason.wessel@windriver.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      715b1dc0
  16. 11 6月, 2009 1 次提交
  17. 14 4月, 2009 1 次提交
  18. 25 3月, 2009 1 次提交
  19. 18 10月, 2008 1 次提交
  20. 14 8月, 2008 1 次提交
  21. 23 7月, 2008 1 次提交
    • A
      usb_serial: API all change · 95da310e
      Alan Cox 提交于
      USB serial likes to use port->tty back pointers for the real work it does and
      to do so without any actual locking. Unfortunately when you consider hangup
      events, hangup/parallel reopen or even worse hangup followed by parallel close
      events the tty->port and port->tty pointers are not guaranteed to be the same
      as port->tty is the active tty while tty->port is the port the tty may or
      may not still be attached to.
      
      So rework the entire API to pass the tty struct. For console cases we need
      to pass both for now. This shows up multiple drivers that immediately crash
      with USB console some of which have been fixed in the process.
      
      Longer term we need a proper tty as console abstraction
      Signed-off-by: NAlan Cox <alan@redhat.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      95da310e
  22. 25 4月, 2008 2 次提交
  23. 02 2月, 2008 3 次提交
    • G
      USB: fix codingstyle issues in include/linux/usb/ · 41dceed5
      Greg Kroah-Hartman 提交于
      Fixes a number of coding style issues in the USB public header files.
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      41dceed5
    • O
      USB: stop io performed by mos7720 upon close() · a1cd7e99
      Oliver Neukum 提交于
      This fixes a problem where the mos7720 driver will make io to a device from
      which it has been logically disconnected. It does so by introducing a flag by
      which the generic usb serial code can signal the subdrivers their
      disconnection and appropriate locking.
      Signed-off-by: NOliver Neukum <oneukum@suse.de>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      
      a1cd7e99
    • A
      USB: usb_serial: clean tty reference in the last close · 9a6b1efa
      Aristeu Rozanski 提交于
      When a usb serial adapter is used as console, the usb serial console
      driver bumps the open_count on the port struct used but doesn't attach
      a real tty to it (only a fake one temporaly). If this port is opened later
      using the regular character device interface, the open method won't
      initialize the port, which is the expected, and will receive a brand new
      tty struct created by tty layer, which will be stored in port->tty.
      
      When the last close is issued, open_count won't be 0 because of the
      console usage and the port->tty will still contain the old tty value. This
      is the last ttyUSB<n> close so the allocated tty will be freed by the
      tty layer. The usb_serial and usb_serial_port are still in use by the
      console, so port_free() won't be called (serial_close() ->
      usb_serial_put() -> destroy_serial() -> port_free()), so the scheduled
      work (port->work, usb_serial_port_work()) will still run. And
      usb_serial_port_work() does:
      (...)
              tty = port->tty;
              if (!tty)
                      return;
      
              tty_wakeup(tty);
      which causes (manually copied):
      
      Faulting instruction address: 0x6b6b6b68
      Oops: Kernel access of bad area, sig: 11 [#1]
      PREEMPT PowerMac
      Modules linked in: binfmt_misc ipv6 nfs lockd nfs_acl sunrpc dm_snapshot dm_mirror dm_mod hfsplus uinput ams input_polldev genrtc cpufreq_powersave i2c_powermac therm_adt746x snd_aoa_codec_tas snd_aoa_fabric_layout snd_aoa joydev snd_aoa_i2sbus snd_pcm_oss snd_mixer_oss snd_pcm snd_timer snd_page_alloc pmac_zilog serial_core evdev ide_cd cdrom snd appletouch soundcore snd_aoa_soundbus bcm43xx firmware_class usbhid ieee80211softmac ff_memless firewire_ohci firewire_core ieee80211 ieee80211_crypt crc_itu_t sungem sungem_phy uninorth_agp agpart ssb
      NIP: 6b6b6b68 LR: c01b2108 CTR: 6b6b6b6b
      REGS: c106de80 TRAP: 0400   Not tainted  (2.6.24-rc2)
      MSR: 40009032 <EE,ME,IR,DR>  CR: 82004024  XER: 00000000
      TASK = c106b4c0[5] 'events/0' THREAD: c106c000
      GPR00: 6b6b6b6b c106df30 c106b4c0 c2d613a0 00009032 00000001 00001a00 00000001
      GPR08: 00000008 00000000 00000000 c106c000 42004028 00000000 016ffbe0 0171a724
      GPR16: 016ffcf4 00240e24 00240e70 016fee68 016ff9a4 c03046c4 c0327f50 c03046fc
      GPR24: c106b6b9 c106b4c0 c101d610 c106c000 c02160fc c1eac1dc c2d613ac c2d613a0
      NIP [6b6b6b68] 0x6b6b6b68
      LR [c01b2108] tty_wakeup+0x6c/0x9c
      Call Trace:
      [c106df30] [c01b20e8] tty_wakeup+0x4c/0x9c (unreliable)
      [c106df40] [c0216138] usb_serial_port_work+0x3c/0x78
      [c106df50] [c00432e8] run_workqueue+0xc4/0x15c
      [c106df90] [c0043798] worker_thread+0xa0/0x124
      [c106dfd0] [c0048224] kthread+0x48/0x84
      [c106dff0] [c00129bc] kernel_thread+0x44/0x60
      Instruction dump:
      XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
      XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
      Slab corruption: size-2048 start=c2d613a0, len=2048
      Redzone: 0x9f911029d74e35b/0x9f911029d74e35b.
      Last user: [<c01b16d8>](release_one_tty+0xbc/0xf4)
      050: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b
      Prev obj: start=c2d60b88, len=2048
      Redzone: 0x9f911029d74e35b/0x9f911029d74e35b.
      Last user: [<c00f30ec>](show_stat+0x410/0x428)
      000: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b
      010: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b
      
      This patch avoids this, clearing port->tty considering if the port is
      used as serial console or not
      Signed-off-by: NAristeu Rozanski <arozansk@redhat.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
      
      9a6b1efa