04 Apr, 2013

2 commits


23 Oct, 2012

1 commit

  • hci_ldisc's open checks if tty_struct->disc_data is set. And if so it
    returns with an error. But nothing ensures disc_data to be NULL. And
    since ld->ops->open shall be called only once, we do not need the
    check at all. So remove it.

    Note that this is not an issue now, but n_tty will start using the
    disc_data pointer and this invalid 'if' would trigger then rendering
    TTYs over BT unusable.

    Signed-off-by: Jiri Slaby
    Acked-by: Marcel Holtmann
    Cc: Gustavo Padovan
    Cc: Johan Hedberg
    Cc: linux-bluetooth@vger.kernel.org
    Acked-by: Alan Cox
    Signed-off-by: Greg Kroah-Hartman

    Jiri Slaby
     

19 Sep, 2012

1 commit


18 Jul, 2012

3 commits


05 Jun, 2012

1 commit


09 May, 2012

1 commit

  • We initialize the "struct device" in hci_alloc_dev() for a long time now
    so we can access hdev->dev.parent directly. Hence, we can drop the
    temporary field hdev->parent which is used in no other place than
    hci_add_sysfs().

    SET_HCIDEV_DEV() is never called after registering a device by the
    drivers so we do not overwrite internal device-state. Furthermore,
    hdev->dev is initialized to 0 by kzalloc() inside hci_alloc_dev() so the
    default behavior with dev.parent = NULL is kept.

    Signed-off-by: David Herrmann
    Acked-by: Marcel Holtmann
    Signed-off-by: Johan Hedberg

    David Herrmann
     

28 Mar, 2012

1 commit

  • Do not close protocol driver until device has been unregistered.

    This fixes a race between tty_close and hci_dev_open which can result in
    a NULL-pointer dereference.

    The line discipline closes the protocol driver while we may still have
    hci_dev_open sleeping on the req_lock mutex resulting in a NULL-pointer
    dereference when lock is acquired and hci_init_req called.

    Bug is 100% reproducible using hciattach and a disconnected serial port:

    0. # hciattach -n ttyO1 any noflow

    1. hci_dev_open called from hci_power_on grabs req lock
    2. hci_init_req executes but device fails to initialise (times out
    eventually)
    3. hci_dev_open is called from hci_sock_ioctl and sleeps on req lock
    4. hci_uart_tty_close detaches protocol driver and cancels init req
    5. hci_dev_open (1) releases req lock
    6. hci_dev_open (3) grabs req lock, calls hci_init_req, which triggers oops
    when request is prepared in hci_uart_send_frame

    [ 137.201263] Unable to handle kernel NULL pointer dereference at virtual address 00000028
    [ 137.209838] pgd = c0004000
    [ 137.212677] [00000028] *pgd=00000000
    [ 137.216430] Internal error: Oops: 17 [#1]
    [ 137.220642] Modules linked in:
    [ 137.223846] CPU: 0 Tainted: G W (3.3.0-rc6-dirty #406)
    [ 137.230529] PC is at __lock_acquire+0x5c/0x1ab0
    [ 137.235290] LR is at lock_acquire+0x9c/0x128
    [ 137.239776] pc : [] lr : [] psr: 20000093
    [ 137.239776] sp : cf869dd8 ip : c0529554 fp : c051c730
    [ 137.251800] r10: 00000000 r9 : cf8673c0 r8 : 00000080
    [ 137.257293] r7 : 00000028 r6 : 00000002 r5 : 00000000 r4 : c053fd70
    [ 137.264129] r3 : 00000000 r2 : 00000000 r1 : 00000000 r0 : 00000001
    [ 137.270965] Flags: nzCv IRQs off FIQs on Mode SVC_32 ISA ARM Segment kernel
    [ 137.278717] Control: 10c5387d Table: 8f0f4019 DAC: 00000015
    [ 137.284729] Process kworker/u:1 (pid: 7, stack limit = 0xcf8682e8)
    [ 137.291229] Stack: (0xcf869dd8 to 0xcf86a000)
    [ 137.295776] 9dc0: c0529554 00000000
    [ 137.304351] 9de0: cf8673c0 cf868000 d03ea1ef cf868000 000001ef 00000470 00000000 00000002
    [ 137.312927] 9e00: cf8673c0 00000001 c051c730 c00716ec 0000000c 00000440 c0529554 00000001
    [ 137.321533] 9e20: c051c730 cf868000 d03ea1f3 00000000 c053b978 00000000 00000028 cf868000
    [ 137.330078] 9e40: 00000000 00000000 00000002 00000000 00000000 c00733f8 00000002 00000080
    [ 137.338684] 9e60: 00000000 c02a1d50 00000000 00000001 60000013 c0969a1c 60000093 c053b96c
    [ 137.347259] 9e80: 00000002 00000018 20000013 c02a1d50 cf0ac000 00000000 00000002 cf868000
    [ 137.355834] 9ea0: 00000089 c0374130 00000002 00000000 c02a1d50 cf0ac000 0000000c cf0fc540
    [ 137.364410] 9ec0: 00000018 c02a1d50 cf0fc540 00000000 cf0fc540 c0282238 c028220c cf178d80
    [ 137.372985] 9ee0: 127525d8 c02821cc 9a1fa451 c032727c 9a1fa451 127525d8 cf0fc540 cf0ac4ec
    [ 137.381561] 9f00: cf0ac000 cf0fc540 cf0ac584 c03285f4 c0328580 cf0ac4ec cf85c740 c05510cc
    [ 137.390136] 9f20: ce825400 c004c914 00000002 00000000 c004c884 ce8254f5 cf869f48 00000000
    [ 137.398712] 9f40: c0328580 ce825415 c0a7f914 c061af64 00000000 c048cf3c cf8673c0 cf85c740
    [ 137.407287] 9f60: c05510cc c051a66c c05510ec c05510c4 cf85c750 cf868000 00000089 c004d6ac
    [ 137.415863] 9f80: 00000000 c0073d14 00000001 cf853ed8 cf85c740 c004d558 00000013 00000000
    [ 137.424438] 9fa0: 00000000 00000000 00000000 c00516b0 00000000 00000000 cf85c740 00000000
    [ 137.433013] 9fc0: 00000001 dead4ead ffffffff ffffffff c0551674 00000000 00000000 c0450aa4
    [ 137.441589] 9fe0: cf869fe0 cf869fe0 cf853ed8 c005162c c0013b30 c0013b30 00ffff00 00ffff00
    [ 137.450164] [] (__lock_acquire+0x5c/0x1ab0) from [] (lock_acquire+0x9c/0x128)
    [ 137.459503] [] (lock_acquire+0x9c/0x128) from [] (_raw_spin_lock_irqsave+0x44/0x58)
    [ 137.469360] [] (_raw_spin_lock_irqsave+0x44/0x58) from [] (skb_queue_tail+0x18/0x48)
    [ 137.479339] [] (skb_queue_tail+0x18/0x48) from [] (h4_enqueue+0x2c/0x34)
    [ 137.488189] [] (h4_enqueue+0x2c/0x34) from [] (hci_uart_send_frame+0x34/0x68)
    [ 137.497497] [] (hci_uart_send_frame+0x34/0x68) from [] (hci_send_frame+0x50/0x88)
    [ 137.507171] [] (hci_send_frame+0x50/0x88) from [] (hci_cmd_work+0x74/0xd4)
    [ 137.516204] [] (hci_cmd_work+0x74/0xd4) from [] (process_one_work+0x1a0/0x4ec)
    [ 137.525604] [] (process_one_work+0x1a0/0x4ec) from [] (worker_thread+0x154/0x344)
    [ 137.535278] [] (worker_thread+0x154/0x344) from [] (kthread+0x84/0x90)
    [ 137.543975] [] (kthread+0x84/0x90) from [] (kernel_thread_exit+0x0/0x8)
    [ 137.552734] Code: e59f4e5c e5941000 e3510000 0a000031 (e5971000)
    [ 137.559234] ---[ end trace 1b75b31a2719ed1e ]---

    Cc: stable
    Signed-off-by: Johan Hovold
    Acked-by: Marcel Holtmann
    Signed-off-by: Johan Hedberg

    Johan Hovold
     

25 Feb, 2012

2 commits


16 Feb, 2012

1 commit


13 Feb, 2012

3 commits

  • The linux device model provides dev_set/get_drvdata so we can use this
    to save private driver data.
    This also removes several unnecessary casts.

    Signed-off-by: David Herrmann
    Acked-by: Marcel Holtmann
    Signed-off-by: Johan Hedberg

    David Herrmann
     
  • After unregistering an hci_dev object a bluetooth driver does not have
    any callbacks in the hci_dev structure left over. Therefore, there is no
    need to keep a reference to the module.

    Previously, we needed this to protect the hci-destruct callback.
    However, this callback is no longer available so we do not need this
    owner field, anymore. Drivers now call hci_unregister_dev() and they
    are done with the object.

    Signed-off-by: David Herrmann
    Acked-by: Marcel Holtmann
    Signed-off-by: Johan Hedberg

    David Herrmann
     
  • We currently leak the hci_uart object if HCI_UART_PROTO_SET is never set
    because the hci-destruct callback will then never be called. This fix
    removes the hci-destruct callback and frees the driver internal private
    hci_uart object directly on tty-close. We call hci_unregister_dev() here
    so the hci-core will never call our callbacks again (except destruct).
    Therefore, we can safely free the driver internal data right away and
    set the destruct callback to NULL.

    Signed-off-by: David Herrmann
    Acked-by: Marcel Holtmann
    Signed-off-by: Johan Hedberg

    David Herrmann
     

13 Jan, 2012

1 commit


04 Jun, 2011

1 commit

  • This reverts commit b1c43f82c5aa265442f82dba31ce985ebb7aa71c.

    It was broken in so many ways, and results in random odd pty issues.

    It re-introduced the buggy schedule_work() in flush_to_ldisc() that can
    cause endless work-loops (see commit a5660b41af6a: "tty: fix endless
    work loop when the buffer fills up").

    It also used an "unsigned int" return value fo the ->receive_buf()
    function, but then made multiple functions return a negative error code,
    and didn't actually check for the error in the caller.

    And it didn't actually work at all. BenH bisected down odd tty behavior
    to it:
    "It looks like the patch is causing some major malfunctions of the X
    server for me, possibly related to PTYs. For example, cat'ing a
    large file in a gnome terminal hangs the kernel for -minutes- in a
    loop of what looks like flush_to_ldisc/workqueue code, (some ftrace
    data in the quoted bits further down).

    ...

    Some more data: It -looks- like what happens is that the
    flush_to_ldisc work queue entry constantly re-queues itself (because
    the PTY is full ?) and the workqueue thread will basically loop
    forver calling it without ever scheduling, thus starving the consumer
    process that could have emptied the PTY."

    which is pretty much exactly the problem we fixed in a5660b41af6a.

    Milton Miller pointed out the 'unsigned int' issue.

    Reported-by: Benjamin Herrenschmidt
    Reported-by: Milton Miller
    Cc: Stefan Bigler
    Cc: Toby Gray
    Cc: Felipe Balbi
    Cc: Greg Kroah-Hartman
    Cc: Alan Cox
    Signed-off-by: Linus Torvalds

    Linus Torvalds
     

24 May, 2011

1 commit

  • * 'tty-next' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty-2.6: (48 commits)
    serial: 8250_pci: add support for Cronyx Omega PCI multiserial board.
    tty/serial: Fix break handling for PORT_TEGRA
    tty/serial: Add explicit PORT_TEGRA type
    n_tracerouter and n_tracesink ldisc additions.
    Intel PTI implementaiton of MIPI 1149.7.
    Kernel documentation for the PTI feature.
    export kernel call get_task_comm().
    tty: Remove to support serial for S5P6442
    pch_phub: Support new device ML7223
    8250_pci: Add support for the Digi/IBM PCIe 2-port Adapter
    ASoC: Update cx20442 for TTY API change
    pch_uart: Support new device ML7223 IOH
    parport: Use request_muxed_region for IT87 probe and lock
    tty/serial: add support for Xilinx PS UART
    n_gsm: Use print_hex_dump_bytes
    drivers/tty/moxa.c: Put correct tty value
    TTY: tty_io, annotate locking functions
    TTY: serial_core, remove superfluous set_task_state
    TTY: serial_core, remove invalid test
    Char: moxa, fix locking in moxa_write
    ...

    Fix up trivial conflicts in drivers/bluetooth/hci_ldisc.c and
    drivers/tty/serial/Makefile.

    I did the hci_ldisc thing as an evil merge, cleaning things up.

    Linus Torvalds
     

23 Apr, 2011

1 commit

  • it makes it simpler to keep track of the amount of
    bytes received and simplifies how flush_to_ldisc counts
    the remaining bytes. It also fixes a bug of lost bytes
    on n_tty when flushing too many bytes via the USB
    serial gadget driver.

    Tested-by: Stefan Bigler
    Tested-by: Toby Gray
    Signed-off-by: Felipe Balbi
    Signed-off-by: Greg Kroah-Hartman

    Felipe Balbi
     

13 Apr, 2011

1 commit


17 Feb, 2011

1 commit


08 Dec, 2010

1 commit


24 Oct, 2010

1 commit

  • * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1699 commits)
    bnx2/bnx2x: Unsupported Ethtool operations should return -EINVAL.
    vlan: Calling vlan_hwaccel_do_receive() is always valid.
    tproxy: use the interface primary IP address as a default value for --on-ip
    tproxy: added IPv6 support to the socket match
    cxgb3: function namespace cleanup
    tproxy: added IPv6 support to the TPROXY target
    tproxy: added IPv6 socket lookup function to nf_tproxy_core
    be2net: Changes to use only priority codes allowed by f/w
    tproxy: allow non-local binds of IPv6 sockets if IP_TRANSPARENT is enabled
    tproxy: added tproxy sockopt interface in the IPV6 layer
    tproxy: added udp6_lib_lookup function
    tproxy: added const specifiers to udp lookup functions
    tproxy: split off ipv6 defragmentation to a separate module
    l2tp: small cleanup
    nf_nat: restrict ICMP translation for embedded header
    can: mcp251x: fix generation of error frames
    can: mcp251x: fix endless loop in interrupt handler if CANINTF_MERRF is set
    can-raw: add msg_flags to distinguish local traffic
    9p: client code cleanup
    rds: make local functions/variables static
    ...

    Fix up conflicts in net/core/dev.c, drivers/net/pcmcia/smc91c92_cs.c and
    drivers/net/wireless/ath/ath9k/debug.c as per David

    Linus Torvalds
     

22 Oct, 2010

1 commit

  • Fortunately this is only exploitable on very unusual hardware.

    [Reported a while ago but nothing happened so just fixing it]

    Signed-off-by: Alan Cox
    Cc: stable@kernel.org
    Signed-off-by: Linus Torvalds

    Alan Cox
     

12 Oct, 2010

1 commit


22 Jul, 2010

3 commits

  • Implements Atheros AR300x serial HCI protocol.

    This protocol extends H4 serial protocol to implement enhanced power
    management features supported by Atheros AR300x serial Bluetooth chipsets.

    Signed-off-by: Suraj Sumangala
    Signed-off-by: Marcel Holtmann

    Suraj Sumangala
     
  • This patch introduces two new ioctls: HCIUARTSETFLAGS and
    HCIUARTGETFLAGS. The only flag available for now is HCI_UART_RAW_DEVICE
    which allows to initialize a UART device into RAW mode from userspace.
    This is particularly useful for experimenting with Bluetooth controllers
    that don't yet have proper support in BlueZ.

    Signed-off-by: Johan Hedberg
    Signed-off-by: Marcel Holtmann

    Johan Hedberg
     
  • The patch below fixes a warning message when using gcc 4.6.0.

    CC [M] drivers/bluetooth/hci_ldisc.o
    drivers/bluetooth/hci_ldisc.c: In function 'hci_uart_send_frame':
    drivers/bluetooth/hci_ldisc.c:213:21: warning: variable 'tty' set but not used

    Signed-off-by: Justin P. Mattock
    Reviewed-By: Gustavo F. Padovan
    Signed-off-by: Marcel Holtmann

    Justin P. Mattock
     

27 Feb, 2010

1 commit


04 Dec, 2009

1 commit

  • That is "success", "unknown", "through", "performance", "[re|un]mapping"
    , "access", "default", "reasonable", "[con]currently", "temperature"
    , "channel", "[un]used", "application", "example","hierarchy", "therefore"
    , "[over|under]flow", "contiguous", "threshold", "enough" and others.

    Signed-off-by: André Goddard Rosa
    Signed-off-by: Jiri Kosina

    André Goddard Rosa
     

11 Jun, 2009

2 commits

  • Bluetooth shouldn't be doing this as most drivers don't support the flag,
    furthermore it shouldn't be needed with newer buffering. This becomes rather
    more visible as the locking fixes make the abuse of low_latency visible as
    spew on the users console/dmesg.

    Signed-off-by: Alan Cox
    Signed-off-by: Linus Torvalds

    Alan Cox
     
  • There are several pretty much unfixable races in the old ldisc code, especially
    with respect to pty behaviour and also to hangup. It's easier to rewrite the
    code than simply try and patch it up.

    This patch
    - splits the ldisc from the tty (so we will be able to refcount it more cleanly
    later)
    - introduces a mutex lock for ldisc changing on an active device
    - fixes the complete mess that hangup caused
    - implements hopefully correct setldisc/close/hangup locking

    There are still some problems around pty pairs that have always been there but
    at least it is now possible to understand the code and fix further problems.

    This fixes the following known bugs
    - hang up can leak ldisc references
    - hang up may not call open/close on ldisc in a matched way
    - pty/tty pairs can deadlock during an ldisc change
    - reading the ldisc proc files can cause every ldisc to be loaded

    and probably a few other of the mysterious ldisc race reports.

    I'm sure it also adds the odd new one.

    Signed-off-by: Alan Cox
    Signed-off-by: Linus Torvalds

    Alan Cox
     

30 Nov, 2008

2 commits

  • With the introduction of CONFIG_DYNAMIC_PRINTK_DEBUG it is possible to
    allow debugging without having to recompile the kernel. This patch turns
    all BT_DBG() calls into pr_debug() to support dynamic debug messages.

    As a side effect all CONFIG_BT_*_DEBUG statements are now removed and
    some broken debug entries have been fixed.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     
  • The Bluetooth subsystem was not using the HCI Reset command when doing
    device initialization. The Bluetooth 1.0b specification was ambiguous
    on how the device firmware was suppose to handle it. Almost every device
    was triggering a transport reset at the same time. In case of USB this
    ended up in disconnects from the bus.

    All modern Bluetooth dongles handle this perfectly fine and a lot of
    them actually require that HCI Reset is sent. If not then they are
    either stuck in their HID Proxy mode or their internal structures for
    inquiry and paging are not correctly setup.

    To handle old and new devices smoothly the Bluetooth subsystem contains
    a quirk to force the HCI Reset on initialization. However maintaining
    such a quirk becomes more and more complicated. This patch turns the
    logic around and lets the old devices disable the HCI Reset command.

    The only device where the HCI_QUIRK_NO_RESET is still needed are the
    original Digianswer devices and dongles with an early CSR firmware.

    CSR reported that they fixed this for version 12 firmware. The last
    official release of version 11 firmware is build ID 115. The first
    version 12 candidate was build ID 117.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     

14 Oct, 2008

1 commit


18 Aug, 2008

1 commit

  • The Bluetooth entries for the MAINTAINERS file are a little bit too
    much. Consolidate them into two entries. One for Bluetooth drivers and
    another one for the Bluetooth subsystem.

    Also the MODULE_AUTHOR should indicate the current maintainer of the
    module and actually not the original author. Fix all Bluetooth modules
    to provide current maintainer information.

    Signed-off-by: Marcel Holtmann

    Marcel Holtmann
     

21 Jul, 2008

1 commit

  • Move the line disciplines towards a conventional ->ops arrangement. For
    the moment the actual 'tty_ldisc' struct in the tty is kept as part of
    the tty struct but this can then be changed if it turns out that when it
    all settles down we want to refcount ldiscs separately to the tty.

    Pull the ldisc code out of /proc and put it with our ldisc code.

    Signed-off-by: Alan Cox
    Signed-off-by: Linus Torvalds

    Alan Cox
     

30 Apr, 2008

2 commits

  • Something Arjan suggested which allows us to clean up the code nicely

    Signed-off-by: Alan Cox
    Cc: Arjan van de Ven
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alan Cox
     
  • - Operations are now a shared const function block as with most other Linux
    objects

    - Introduce wrappers for some optional functions to get consistent behaviour

    - Wrap put_char which used to be patched by the tty layer

    - Document which functions are needed/optional

    - Make put_char report success/fail

    - Cache the driver->ops pointer in the tty as tty->ops

    - Remove various surplus lock calls we no longer need

    - Remove proc_write method as noted by Alexey Dobriyan

    - Introduce some missing sanity checks where certain driver/ldisc
    combinations would oops as they didn't check needed methods were present

    [akpm@linux-foundation.org: fix fs/compat_ioctl.c build]
    [akpm@linux-foundation.org: fix isicom]
    [akpm@linux-foundation.org: fix arch/ia64/hp/sim/simserial.c build]
    [akpm@linux-foundation.org: fix kgdb]
    Signed-off-by: Alan Cox
    Acked-by: Greg Kroah-Hartman
    Cc: Jason Wessel
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Alan Cox