Initial Contribution
msm-2.6.38: tag AU_LINUX_ANDROID_GINGERBREAD.02.03.04.00.142
Signed-off-by: Bryan Huntsman <bryanh@codeaurora.org>
diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c
index 48ad2a7..b07af02 100644
--- a/drivers/bluetooth/hci_ldisc.c
+++ b/drivers/bluetooth/hci_ldisc.c
@@ -2,9 +2,9 @@
*
* Bluetooth HCI UART driver
*
- * Copyright (C) 2000-2001 Qualcomm Incorporated
* Copyright (C) 2002-2003 Maxim Krasnyansky <maxk@qualcomm.com>
* Copyright (C) 2004-2005 Marcel Holtmann <marcel@holtmann.org>
+ * Copyright (c) 2000-2001, 2010-2011, Code Aurora Forum. All rights reserved.
*
*
* This program is free software; you can redistribute it and/or modify
@@ -359,6 +359,7 @@
*/
static void hci_uart_tty_receive(struct tty_struct *tty, const u8 *data, char *flags, int count)
{
+ int ret;
struct hci_uart *hu = (void *)tty->disc_data;
if (!hu || tty != hu->tty)
@@ -368,8 +369,9 @@
return;
spin_lock(&hu->rx_lock);
- hu->proto->recv(hu, (void *) data, count);
- hu->hdev->stat.byte_rx += count;
+ ret = hu->proto->recv(hu, (void *) data, count);
+ if (ret > 0)
+ hu->hdev->stat.byte_rx += count;
spin_unlock(&hu->rx_lock);
tty_unthrottle(tty);
@@ -468,11 +470,18 @@
switch (cmd) {
case HCIUARTSETPROTO:
- if (!test_and_set_bit(HCI_UART_PROTO_SET, &hu->flags)) {
+ if (!test_and_set_bit(HCI_UART_PROTO_SET_IN_PROGRESS,
+ &hu->flags) && !test_bit(HCI_UART_PROTO_SET,
+ &hu->flags)) {
err = hci_uart_set_proto(hu, arg);
if (err) {
- clear_bit(HCI_UART_PROTO_SET, &hu->flags);
+ clear_bit(HCI_UART_PROTO_SET_IN_PROGRESS,
+ &hu->flags);
return err;
+ } else {
+ set_bit(HCI_UART_PROTO_SET, &hu->flags);
+ clear_bit(HCI_UART_PROTO_SET_IN_PROGRESS,
+ &hu->flags);
}
} else
return -EBUSY;
@@ -565,6 +574,9 @@
#ifdef CONFIG_BT_HCIUART_ATH3K
ath_init();
#endif
+#ifdef CONFIG_BT_HCIUART_IBS
+ ibs_init();
+#endif
return 0;
}
@@ -585,6 +597,9 @@
#ifdef CONFIG_BT_HCIUART_ATH3K
ath_deinit();
#endif
+#ifdef CONFIG_BT_HCIUART_IBS
+ ibs_deinit();
+#endif
/* Release tty registration of line discipline */
if ((err = tty_unregister_ldisc(N_HCI)))