Commit 0cd06647 authored by John W. Linville's avatar John W. Linville
parents e8c7b335 e0482103
...@@ -81,6 +81,18 @@ config BT_HCIUART_LL ...@@ -81,6 +81,18 @@ config BT_HCIUART_LL
Say Y here to compile support for HCILL protocol. Say Y here to compile support for HCILL protocol.
config BT_HCIUART_3WIRE
bool "Three-wire UART (H5) protocol support"
depends on BT_HCIUART
help
The HCI Three-wire UART Transport Layer makes it possible to
user the Bluetooth HCI over a serial port interface. The HCI
Three-wire UART Transport Layer assumes that the UART
communication may have bit errors, overrun errors or burst
errors and thereby making CTS/RTS lines unnecessary.
Say Y here to compile support for Three-wire UART protocol.
config BT_HCIBCM203X config BT_HCIBCM203X
tristate "HCI BCM203x USB driver" tristate "HCI BCM203x USB driver"
depends on USB depends on USB
......
...@@ -28,4 +28,5 @@ hci_uart-$(CONFIG_BT_HCIUART_H4) += hci_h4.o ...@@ -28,4 +28,5 @@ hci_uart-$(CONFIG_BT_HCIUART_H4) += hci_h4.o
hci_uart-$(CONFIG_BT_HCIUART_BCSP) += hci_bcsp.o hci_uart-$(CONFIG_BT_HCIUART_BCSP) += hci_bcsp.o
hci_uart-$(CONFIG_BT_HCIUART_LL) += hci_ll.o hci_uart-$(CONFIG_BT_HCIUART_LL) += hci_ll.o
hci_uart-$(CONFIG_BT_HCIUART_ATH3K) += hci_ath.o hci_uart-$(CONFIG_BT_HCIUART_ATH3K) += hci_ath.o
hci_uart-$(CONFIG_BT_HCIUART_3WIRE) += hci_h5.o
hci_uart-objs := $(hci_uart-y) hci_uart-objs := $(hci_uart-y)
...@@ -621,7 +621,6 @@ static int bluecard_hci_flush(struct hci_dev *hdev) ...@@ -621,7 +621,6 @@ static int bluecard_hci_flush(struct hci_dev *hdev)
static int bluecard_hci_open(struct hci_dev *hdev) static int bluecard_hci_open(struct hci_dev *hdev)
{ {
bluecard_info_t *info = hci_get_drvdata(hdev); bluecard_info_t *info = hci_get_drvdata(hdev);
unsigned int iobase = info->p_dev->resource[0]->start;
if (test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state))) if (test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state)))
bluecard_hci_set_baud_rate(hdev, DEFAULT_BAUD_RATE); bluecard_hci_set_baud_rate(hdev, DEFAULT_BAUD_RATE);
...@@ -630,6 +629,8 @@ static int bluecard_hci_open(struct hci_dev *hdev) ...@@ -630,6 +629,8 @@ static int bluecard_hci_open(struct hci_dev *hdev)
return 0; return 0;
if (test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state))) { if (test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state))) {
unsigned int iobase = info->p_dev->resource[0]->start;
/* Enable LED */ /* Enable LED */
outb(0x08 | 0x20, iobase + 0x30); outb(0x08 | 0x20, iobase + 0x30);
} }
...@@ -641,7 +642,6 @@ static int bluecard_hci_open(struct hci_dev *hdev) ...@@ -641,7 +642,6 @@ static int bluecard_hci_open(struct hci_dev *hdev)
static int bluecard_hci_close(struct hci_dev *hdev) static int bluecard_hci_close(struct hci_dev *hdev)
{ {
bluecard_info_t *info = hci_get_drvdata(hdev); bluecard_info_t *info = hci_get_drvdata(hdev);
unsigned int iobase = info->p_dev->resource[0]->start;
if (!test_and_clear_bit(HCI_RUNNING, &(hdev->flags))) if (!test_and_clear_bit(HCI_RUNNING, &(hdev->flags)))
return 0; return 0;
...@@ -649,6 +649,8 @@ static int bluecard_hci_close(struct hci_dev *hdev) ...@@ -649,6 +649,8 @@ static int bluecard_hci_close(struct hci_dev *hdev)
bluecard_hci_flush(hdev); bluecard_hci_flush(hdev);
if (test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state))) { if (test_bit(CARD_HAS_PCCARD_ID, &(info->hw_state))) {
unsigned int iobase = info->p_dev->resource[0]->start;
/* Disable LED */ /* Disable LED */
outb(0x00, iobase + 0x30); outb(0x00, iobase + 0x30);
} }
......
...@@ -664,7 +664,7 @@ static int bt3c_check_config(struct pcmcia_device *p_dev, void *priv_data) ...@@ -664,7 +664,7 @@ static int bt3c_check_config(struct pcmcia_device *p_dev, void *priv_data)
{ {
int *try = priv_data; int *try = priv_data;
if (try == 0) if (!try)
p_dev->io_lines = 16; p_dev->io_lines = 16;
if ((p_dev->resource[0]->end != 8) || (p_dev->resource[0]->start == 0)) if ((p_dev->resource[0]->end != 8) || (p_dev->resource[0]->start == 0))
......
...@@ -47,10 +47,11 @@ EXPORT_SYMBOL_GPL(btmrvl_interrupt); ...@@ -47,10 +47,11 @@ EXPORT_SYMBOL_GPL(btmrvl_interrupt);
bool btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb) bool btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb)
{ {
struct hci_event_hdr *hdr = (void *) skb->data; struct hci_event_hdr *hdr = (void *) skb->data;
struct hci_ev_cmd_complete *ec;
u16 opcode, ocf, ogf;
if (hdr->evt == HCI_EV_CMD_COMPLETE) { if (hdr->evt == HCI_EV_CMD_COMPLETE) {
struct hci_ev_cmd_complete *ec;
u16 opcode, ocf, ogf;
ec = (void *) (skb->data + HCI_EVENT_HDR_SIZE); ec = (void *) (skb->data + HCI_EVENT_HDR_SIZE);
opcode = __le16_to_cpu(ec->opcode); opcode = __le16_to_cpu(ec->opcode);
ocf = hci_opcode_ocf(opcode); ocf = hci_opcode_ocf(opcode);
...@@ -64,7 +65,8 @@ bool btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb) ...@@ -64,7 +65,8 @@ bool btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb)
} }
if (ogf == OGF) { if (ogf == OGF) {
BT_DBG("vendor event skipped: ogf 0x%4.4x", ogf); BT_DBG("vendor event skipped: ogf 0x%4.4x ocf 0x%4.4x",
ogf, ocf);
kfree_skb(skb); kfree_skb(skb);
return false; return false;
} }
......
...@@ -568,8 +568,9 @@ static int btmrvl_sdio_card_to_host(struct btmrvl_private *priv) ...@@ -568,8 +568,9 @@ static int btmrvl_sdio_card_to_host(struct btmrvl_private *priv)
if (type == HCI_EVENT_PKT) { if (type == HCI_EVENT_PKT) {
if (btmrvl_check_evtpkt(priv, skb)) if (btmrvl_check_evtpkt(priv, skb))
hci_recv_frame(skb); hci_recv_frame(skb);
} else } else {
hci_recv_frame(skb); hci_recv_frame(skb);
}
hdev->stat.byte_rx += buf_len; hdev->stat.byte_rx += buf_len;
break; break;
......
...@@ -593,7 +593,7 @@ static int btuart_check_config(struct pcmcia_device *p_dev, void *priv_data) ...@@ -593,7 +593,7 @@ static int btuart_check_config(struct pcmcia_device *p_dev, void *priv_data)
{ {
int *try = priv_data; int *try = priv_data;
if (try == 0) if (!try)
p_dev->io_lines = 16; p_dev->io_lines = 16;
if ((p_dev->resource[0]->end != 8) || (p_dev->resource[0]->start == 0)) if ((p_dev->resource[0]->end != 8) || (p_dev->resource[0]->start == 0))
......
...@@ -586,29 +586,31 @@ static int dtl1_confcheck(struct pcmcia_device *p_dev, void *priv_data) ...@@ -586,29 +586,31 @@ static int dtl1_confcheck(struct pcmcia_device *p_dev, void *priv_data)
static int dtl1_config(struct pcmcia_device *link) static int dtl1_config(struct pcmcia_device *link)
{ {
dtl1_info_t *info = link->priv; dtl1_info_t *info = link->priv;
int i; int ret;
/* Look for a generic full-sized window */ /* Look for a generic full-sized window */
link->resource[0]->end = 8; link->resource[0]->end = 8;
if (pcmcia_loop_config(link, dtl1_confcheck, NULL) < 0) ret = pcmcia_loop_config(link, dtl1_confcheck, NULL);
if (ret)
goto failed; goto failed;
i = pcmcia_request_irq(link, dtl1_interrupt); ret = pcmcia_request_irq(link, dtl1_interrupt);
if (i != 0) if (ret)
goto failed; goto failed;
i = pcmcia_enable_device(link); ret = pcmcia_enable_device(link);
if (i != 0) if (ret)
goto failed; goto failed;
if (dtl1_open(info) != 0) ret = dtl1_open(info);
if (ret)
goto failed; goto failed;
return 0; return 0;
failed: failed:
dtl1_detach(link); dtl1_detach(link);
return -ENODEV; return ret;
} }
static const struct pcmcia_device_id dtl1_ids[] = { static const struct pcmcia_device_id dtl1_ids[] = {
......
This diff is collapsed.
...@@ -156,6 +156,35 @@ int hci_uart_tx_wakeup(struct hci_uart *hu) ...@@ -156,6 +156,35 @@ int hci_uart_tx_wakeup(struct hci_uart *hu)
return 0; return 0;
} }
static void hci_uart_init_work(struct work_struct *work)
{
struct hci_uart *hu = container_of(work, struct hci_uart, init_ready);
int err;
if (!test_and_clear_bit(HCI_UART_INIT_PENDING, &hu->hdev_flags))
return;
err = hci_register_dev(hu->hdev);
if (err < 0) {
BT_ERR("Can't register HCI device");
hci_free_dev(hu->hdev);
hu->hdev = NULL;
hu->proto->close(hu);
}
set_bit(HCI_UART_REGISTERED, &hu->flags);
}
int hci_uart_init_ready(struct hci_uart *hu)
{
if (!test_bit(HCI_UART_INIT_PENDING, &hu->hdev_flags))
return -EALREADY;
schedule_work(&hu->init_ready);
return 0;
}
/* ------- Interface to HCI layer ------ */ /* ------- Interface to HCI layer ------ */
/* Initialize device */ /* Initialize device */
static int hci_uart_open(struct hci_dev *hdev) static int hci_uart_open(struct hci_dev *hdev)
...@@ -264,6 +293,8 @@ static int hci_uart_tty_open(struct tty_struct *tty) ...@@ -264,6 +293,8 @@ static int hci_uart_tty_open(struct tty_struct *tty)
hu->tty = tty; hu->tty = tty;
tty->receive_room = 65536; tty->receive_room = 65536;
INIT_WORK(&hu->init_ready, hci_uart_init_work);
spin_lock_init(&hu->rx_lock); spin_lock_init(&hu->rx_lock);
/* Flush any pending characters in the driver and line discipline. */ /* Flush any pending characters in the driver and line discipline. */
...@@ -286,28 +317,30 @@ static int hci_uart_tty_open(struct tty_struct *tty) ...@@ -286,28 +317,30 @@ static int hci_uart_tty_open(struct tty_struct *tty)
static void hci_uart_tty_close(struct tty_struct *tty) static void hci_uart_tty_close(struct tty_struct *tty)
{ {
struct hci_uart *hu = (void *)tty->disc_data; struct hci_uart *hu = (void *)tty->disc_data;
struct hci_dev *hdev;
BT_DBG("tty %p", tty); BT_DBG("tty %p", tty);
/* Detach from the tty */ /* Detach from the tty */
tty->disc_data = NULL; tty->disc_data = NULL;
if (hu) { if (!hu)
struct hci_dev *hdev = hu->hdev; return;
if (hdev) hdev = hu->hdev;
hci_uart_close(hdev); if (hdev)
hci_uart_close(hdev);
if (test_and_clear_bit(HCI_UART_PROTO_SET, &hu->flags)) { if (test_and_clear_bit(HCI_UART_PROTO_SET, &hu->flags)) {
if (hdev) { if (hdev) {
if (test_bit(HCI_UART_REGISTERED, &hu->flags))
hci_unregister_dev(hdev); hci_unregister_dev(hdev);
hci_free_dev(hdev); hci_free_dev(hdev);
}
hu->proto->close(hu);
} }
hu->proto->close(hu);
kfree(hu);
} }
kfree(hu);
} }
/* hci_uart_tty_wakeup() /* hci_uart_tty_wakeup()
...@@ -401,12 +434,17 @@ static int hci_uart_register_dev(struct hci_uart *hu) ...@@ -401,12 +434,17 @@ static int hci_uart_register_dev(struct hci_uart *hu)
else else
hdev->dev_type = HCI_BREDR; hdev->dev_type = HCI_BREDR;
if (test_bit(HCI_UART_INIT_PENDING, &hu->hdev_flags))
return 0;
if (hci_register_dev(hdev) < 0) { if (hci_register_dev(hdev) < 0) {
BT_ERR("Can't register HCI device"); BT_ERR("Can't register HCI device");
hci_free_dev(hdev); hci_free_dev(hdev);
return -ENODEV; return -ENODEV;
} }
set_bit(HCI_UART_REGISTERED, &hu->flags);
return 0; return 0;
} }
...@@ -558,6 +596,9 @@ static int __init hci_uart_init(void) ...@@ -558,6 +596,9 @@ static int __init hci_uart_init(void)
#ifdef CONFIG_BT_HCIUART_ATH3K #ifdef CONFIG_BT_HCIUART_ATH3K
ath_init(); ath_init();
#endif #endif
#ifdef CONFIG_BT_HCIUART_3WIRE
h5_init();
#endif
return 0; return 0;
} }
...@@ -578,6 +619,9 @@ static void __exit hci_uart_exit(void) ...@@ -578,6 +619,9 @@ static void __exit hci_uart_exit(void)
#ifdef CONFIG_BT_HCIUART_ATH3K #ifdef CONFIG_BT_HCIUART_ATH3K
ath_deinit(); ath_deinit();
#endif #endif
#ifdef CONFIG_BT_HCIUART_3WIRE
h5_deinit();
#endif
/* Release tty registration of line discipline */ /* Release tty registration of line discipline */
if ((err = tty_unregister_ldisc(N_HCI))) if ((err = tty_unregister_ldisc(N_HCI)))
......
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
#define HCI_UART_RAW_DEVICE 0 #define HCI_UART_RAW_DEVICE 0
#define HCI_UART_RESET_ON_INIT 1 #define HCI_UART_RESET_ON_INIT 1
#define HCI_UART_CREATE_AMP 2 #define HCI_UART_CREATE_AMP 2
#define HCI_UART_INIT_PENDING 3
struct hci_uart; struct hci_uart;
...@@ -66,6 +67,8 @@ struct hci_uart { ...@@ -66,6 +67,8 @@ struct hci_uart {
unsigned long flags; unsigned long flags;
unsigned long hdev_flags; unsigned long hdev_flags;
struct work_struct init_ready;
struct hci_uart_proto *proto; struct hci_uart_proto *proto;
void *priv; void *priv;
...@@ -76,6 +79,7 @@ struct hci_uart { ...@@ -76,6 +79,7 @@ struct hci_uart {
/* HCI_UART proto flag bits */ /* HCI_UART proto flag bits */
#define HCI_UART_PROTO_SET 0 #define HCI_UART_PROTO_SET 0
#define HCI_UART_REGISTERED 1
/* TX states */ /* TX states */
#define HCI_UART_SENDING 1 #define HCI_UART_SENDING 1
...@@ -84,6 +88,7 @@ struct hci_uart { ...@@ -84,6 +88,7 @@ struct hci_uart {
int hci_uart_register_proto(struct hci_uart_proto *p); int hci_uart_register_proto(struct hci_uart_proto *p);
int hci_uart_unregister_proto(struct hci_uart_proto *p); int hci_uart_unregister_proto(struct hci_uart_proto *p);
int hci_uart_tx_wakeup(struct hci_uart *hu); int hci_uart_tx_wakeup(struct hci_uart *hu);
int hci_uart_init_ready(struct hci_uart *hu);
#ifdef CONFIG_BT_HCIUART_H4 #ifdef CONFIG_BT_HCIUART_H4
int h4_init(void); int h4_init(void);
...@@ -104,3 +109,8 @@ int ll_deinit(void); ...@@ -104,3 +109,8 @@ int ll_deinit(void);
int ath_init(void); int ath_init(void);
int ath_deinit(void); int ath_deinit(void);
#endif #endif
#ifdef CONFIG_BT_HCIUART_3WIRE
int h5_init(void);
int h5_deinit(void);
#endif
...@@ -139,11 +139,12 @@ enum { ...@@ -139,11 +139,12 @@ enum {
#define HCIINQUIRY _IOR('H', 240, int) #define HCIINQUIRY _IOR('H', 240, int)
/* HCI timeouts */ /* HCI timeouts */
#define HCI_DISCONN_TIMEOUT (2000) /* 2 seconds */ #define HCI_DISCONN_TIMEOUT msecs_to_jiffies(2000) /* 2 seconds */
#define HCI_PAIRING_TIMEOUT (60000) /* 60 seconds */ #define HCI_PAIRING_TIMEOUT msecs_to_jiffies(60000) /* 60 seconds */
#define HCI_INIT_TIMEOUT (10000) /* 10 seconds */ #define HCI_INIT_TIMEOUT msecs_to_jiffies(10000) /* 10 seconds */
#define HCI_CMD_TIMEOUT (1000) /* 1 seconds */ #define HCI_CMD_TIMEOUT msecs_to_jiffies(1000) /* 1 second */
#define HCI_ACL_TX_TIMEOUT (45000) /* 45 seconds */ #define HCI_ACL_TX_TIMEOUT msecs_to_jiffies(45000) /* 45 seconds */
#define HCI_AUTO_OFF_TIMEOUT msecs_to_jiffies(2000) /* 2 seconds */
/* HCI data types */ /* HCI data types */
#define HCI_COMMAND_PKT 0x01 #define HCI_COMMAND_PKT 0x01
......
...@@ -587,18 +587,24 @@ void hci_conn_put_device(struct hci_conn *conn); ...@@ -587,18 +587,24 @@ void hci_conn_put_device(struct hci_conn *conn);
static inline void hci_conn_hold(struct hci_conn *conn) static inline void hci_conn_hold(struct hci_conn *conn)
{ {
BT_DBG("hcon %p refcnt %d -> %d", conn, atomic_read(&conn->refcnt),
atomic_read(&conn->refcnt) + 1);
atomic_inc(&conn->refcnt); atomic_inc(&conn->refcnt);
cancel_delayed_work(&conn->disc_work); cancel_delayed_work(&conn->disc_work);
} }
static inline void hci_conn_put(struct hci_conn *conn) static inline void hci_conn_put(struct hci_conn *conn)
{ {
BT_DBG("hcon %p refcnt %d -> %d", conn, atomic_read(&conn->refcnt),
atomic_read(&conn->refcnt) - 1);
if (atomic_dec_and_test(&conn->refcnt)) { if (atomic_dec_and_test(&conn->refcnt)) {
unsigned long timeo; unsigned long timeo;
if (conn->type == ACL_LINK || conn->type == LE_LINK) { if (conn->type == ACL_LINK || conn->type == LE_LINK) {
del_timer(&conn->idle_timer); del_timer(&conn->idle_timer);
if (conn->state == BT_CONNECTED) { if (conn->state == BT_CONNECTED) {
timeo = msecs_to_jiffies(conn->disc_timeout); timeo = conn->disc_timeout;
if (!conn->out) if (!conn->out)
timeo *= 2; timeo *= 2;
} else { } else {
......
...@@ -464,6 +464,7 @@ struct l2cap_chan { ...@@ -464,6 +464,7 @@ struct l2cap_chan {
__u16 tx_win; __u16 tx_win;
__u16 tx_win_max; __u16 tx_win_max;
__u16 ack_win;
__u8 max_tx; __u8 max_tx;
__u16 retrans_timeout; __u16 retrans_timeout;
__u16 monitor_timeout; __u16 monitor_timeout;
...@@ -672,11 +673,15 @@ enum { ...@@ -672,11 +673,15 @@ enum {
static inline void l2cap_chan_hold(struct l2cap_chan *c) static inline void l2cap_chan_hold(struct l2cap_chan *c)
{ {
BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->refcnt));
atomic_inc(&c->refcnt); atomic_inc(&c->refcnt);
} }
static inline void l2cap_chan_put(struct l2cap_chan *c) static inline void l2cap_chan_put(struct l2cap_chan *c)
{ {
BT_DBG("chan %p orig refcnt %d", c, atomic_read(&c->refcnt));
if (atomic_dec_and_test(&c->refcnt)) if (atomic_dec_and_test(&c->refcnt))
kfree(c); kfree(c);
} }
......
...@@ -444,7 +444,7 @@ struct mgmt_ev_auth_failed { ...@@ -444,7 +444,7 @@ struct mgmt_ev_auth_failed {
struct mgmt_ev_device_found { struct mgmt_ev_device_found {
struct mgmt_addr_info addr; struct mgmt_addr_info addr;
__s8 rssi; __s8 rssi;
__u8 flags[4]; __le32 flags;
__le16 eir_len; __le16 eir_len;
__u8 eir[0]; __u8 eir[0];
} __packed; } __packed;
......
...@@ -501,7 +501,7 @@ static struct l2cap_chan *a2mp_chan_open(struct l2cap_conn *conn) ...@@ -501,7 +501,7 @@ static struct l2cap_chan *a2mp_chan_open(struct l2cap_conn *conn)
/* AMP Manager functions */ /* AMP Manager functions */
void amp_mgr_get(struct amp_mgr *mgr) void amp_mgr_get(struct amp_mgr *mgr)
{ {
BT_DBG("mgr %p", mgr); BT_DBG("mgr %p orig refcnt %d", mgr, atomic_read(&mgr->kref.refcount));
kref_get(&mgr->kref); kref_get(&mgr->kref);
} }
...@@ -517,7 +517,7 @@ static void amp_mgr_destroy(struct kref *kref) ...@@ -517,7 +517,7 @@ static void amp_mgr_destroy(struct kref *kref)
int amp_mgr_put(struct amp_mgr *mgr) int amp_mgr_put(struct amp_mgr *mgr)
{ {
BT_DBG("mgr %p", mgr); BT_DBG("mgr %p orig refcnt %d", mgr, atomic_read(&mgr->kref.refcount));
return kref_put(&mgr->kref, &amp_mgr_destroy); return kref_put(&mgr->kref, &amp_mgr_destroy);
} }
......
...@@ -107,7 +107,7 @@ static void hci_acl_connect_cancel(struct hci_conn *conn) ...@@ -107,7 +107,7 @@ static void hci_acl_connect_cancel(struct hci_conn *conn)
{ {
struct hci_cp_create_conn_cancel cp; struct hci_cp_create_conn_cancel cp;
BT_DBG("%p", conn); BT_DBG("hcon %p", conn);
if (conn->hdev->hci_ver < BLUETOOTH_VER_1_2) if (conn->hdev->hci_ver < BLUETOOTH_VER_1_2)
return; return;
...@@ -120,7 +120,7 @@ void hci_acl_disconn(struct hci_conn *conn, __u8 reason) ...@@ -120,7 +120,7 @@ void hci_acl_disconn(struct hci_conn *conn, __u8 reason)
{ {
struct hci_cp_disconnect cp; struct hci_cp_disconnect cp;
BT_DBG("%p", conn); BT_DBG("hcon %p", conn);
conn->state = BT_DISCONN; conn->state = BT_DISCONN;
...@@ -134,7 +134,7 @@ void hci_add_sco(struct hci_conn *conn, __u16 handle) ...@@ -134,7 +134,7 @@ void hci_add_sco(struct hci_conn *conn, __u16 handle)
struct hci_dev *hdev = conn->hdev; struct hci_dev *hdev = conn->hdev;
struct hci_cp_add_sco cp; struct hci_cp_add_sco cp;
BT_DBG("%p", conn); BT_DBG("hcon %p", conn);
conn->state = BT_CONNECT; conn->state = BT_CONNECT;
conn->out = true; conn->out = true;
...@@ -152,7 +152,7 @@ void hci_setup_sync(struct hci_conn *conn, __u16 handle) ...@@ -152,7 +152,7 @@ void hci_setup_sync(struct hci_conn *conn, __u16 handle)
struct hci_dev *hdev = conn->hdev; struct hci_dev *hdev = conn->hdev;
struct hci_cp_setup_sync_conn cp; struct hci_cp_setup_sync_conn cp;
BT_DBG("%p", conn); BT_DBG("hcon %p", conn);
conn->state = BT_CONNECT; conn->state = BT_CONNECT;
conn->out = true; conn->out = true;
...@@ -196,7 +196,7 @@ void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __u8 rand[8], ...@@ -196,7 +196,7 @@ void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __u8 rand[8],
struct hci_dev *hdev = conn->hdev; struct hci_dev *hdev = conn->hdev;
struct hci_cp_le_start_enc cp; struct hci_cp_le_start_enc cp;
BT_DBG("%p", conn); BT_DBG("hcon %p", conn);
memset(&cp, 0, sizeof(cp)); memset(&cp, 0, sizeof(cp));
...@@ -213,11 +213,11 @@ void hci_sco_setup(struct hci_conn *conn, __u8 status) ...@@ -213,11 +213,11 @@ void hci_sco_setup(struct hci_conn *conn, __u8 status)
{ {
struct hci_conn *sco = conn->link; struct hci_conn *sco = conn->link;
BT_DBG("%p", conn);
if (!sco) if (!sco)
return; return;
BT_DBG("hcon %p", conn);
if (!status) { if (!status) {
if (lmp_esco_capable(conn->hdev)) if (lmp_esco_capable(conn->hdev))
hci_setup_sync(sco, conn->handle); hci_setup_sync(sco, conn->handle);
...@@ -235,7 +235,7 @@ static void hci_conn_timeout(struct work_struct *work) ...@@ -235,7 +235,7 @@ static void hci_conn_timeout(struct work_struct *work)
disc_work.work); disc_work.work);
__u8 reason; __u8 reason;
BT_DBG("conn %p state %s", conn, state_to_string(conn->state)); BT_DBG("hcon %p state %s", conn, state_to_string(conn->state));
if (atomic_read(&conn->refcnt)) if (atomic_read(&conn->refcnt))
return; return;
...@@ -266,7 +266,7 @@ static void hci_conn_enter_sniff_mode(struct hci_conn *conn) ...@@ -266,7 +266,7 @@ static void hci_conn_enter_sniff_mode(struct hci_conn *conn)
{ {
struct hci_dev *hdev = conn->hdev; struct hci_dev *hdev = conn->hdev;
BT_DBG("conn %p mode %d", conn, conn->mode); BT_DBG("hcon %p mode %d", conn, conn->mode);
if (test_bit(HCI_RAW, &hdev->flags)) if (test_bit(HCI_RAW, &hdev->flags))
return; return;
...@@ -301,7 +301,7 @@ static void hci_conn_idle(unsigned long arg) ...@@ -301,7 +301,7 @@ static void hci_conn_idle(unsigned long arg)
{ {
struct hci_conn *conn = (void *) arg; struct hci_conn *conn = (void *) arg;
BT_DBG("conn %p mode %d", conn, conn->mode); BT_DBG("hcon %p mode %d", conn, conn->mode);
hci_conn_enter_sniff_mode(conn); hci_conn_enter_sniff_mode(conn);
} }
...@@ -382,7 +382,7 @@ int hci_conn_del(struct hci_conn *conn) ...@@ -382,7 +382,7 @@ int hci_conn_del(struct hci_conn *conn)
{ {
struct hci_dev *hdev = conn->hdev; struct hci_dev *hdev = conn->hdev;
BT_DBG("%s conn %p handle %d", hdev->name, conn, conn->handle); BT_DBG("%s hcon %p handle %d", hdev->name, conn, conn->handle);
del_timer(&conn->idle_timer); del_timer(&conn->idle_timer);
...@@ -442,7 +442,8 @@ struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src) ...@@ -442,7 +442,8 @@ struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src)
list_for_each_entry(d, &hci_dev_list, list) { list_for_each_entry(d, &hci_dev_list, list) {
if (!test_bit(HCI_UP, &d->flags) || if (!test_bit(HCI_UP, &d->flags) ||
test_bit(HCI_RAW, &d->flags)) test_bit(HCI_RAW, &d->flags) ||
d->dev_type != HCI_BREDR)
continue; continue;
/* Simple routing: /* Simple routing:
...@@ -557,7 +558,7 @@ struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, ...@@ -557,7 +558,7 @@ struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst,
/* Check link security requirement */ /* Check link security requirement */
int hci_conn_check_link_mode(struct hci_conn *conn) int hci_conn_check_link_mode(struct hci_conn *conn)
{ {
BT_DBG("conn %p", conn); BT_DBG("hcon %p", conn);
if (hci_conn_ssp_enabled(conn) && !(conn->link_mode & HCI_LM_ENCRYPT)) if (hci_conn_ssp_enabled(conn) && !(conn->link_mode & HCI_LM_ENCRYPT))
return 0; return 0;
...@@ -568,7 +569,7 @@ int hci_conn_check_link_mode(struct hci_conn *conn) ...@@ -568,7 +569,7 @@ int hci_conn_check_link_mode(struct hci_conn *conn)
/* Authenticate remote device */ /* Authenticate remote device */
static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type) static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
{ {
BT_DBG("conn %p", conn); BT_DBG("hcon %p", conn);
if (conn->pending_sec_level > sec_level) if (conn->pending_sec_level > sec_level)
sec_level = conn->pending_sec_level; sec_level = conn->pending_sec_level;
...@@ -602,7 +603,7 @@ static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type) ...@@ -602,7 +603,7 @@ static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
/* Encrypt the the link */ /* Encrypt the the link */
static void hci_conn_encrypt(struct hci_conn *conn) static void hci_conn_encrypt(struct hci_conn *conn)
{ {
BT_DBG("conn %p", conn); BT_DBG("hcon %p", conn);
if (!test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) { if (!test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
struct hci_cp_set_conn_encrypt cp; struct hci_cp_set_conn_encrypt cp;
...@@ -616,7 +617,7 @@ static void hci_conn_encrypt(struct hci_conn *conn) ...@@ -616,7 +617,7 @@ static void hci_conn_encrypt(struct hci_conn *conn)
/* Enable security */ /* Enable security */
int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type) int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
{ {
BT_DBG("conn %p", conn); BT_DBG("hcon %p", conn);
/* For sdp we don't need the link key. */ /* For sdp we don't need the link key. */
if (sec_level == BT_SECURITY_SDP) if (sec_level == BT_SECURITY_SDP)
...@@ -669,7 +670,7 @@ EXPORT_SYMBOL(hci_conn_security); ...@@ -669,7 +670,7 @@ EXPORT_SYMBOL(hci_conn_security);
/* Check secure link requirement */ /* Check secure link requirement */
int hci_conn_check_secure(struct hci_conn *conn, __u8 sec_level) int hci_conn_check_secure(struct hci_conn *conn, __u8 sec_level)
{ {
BT_DBG("conn %p", conn); BT_DBG("hcon %p", conn);
if (sec_level != BT_SECURITY_HIGH) if (sec_level != BT_SECURITY_HIGH)
return 1; /* Accept if non-secure is required */ return 1; /* Accept if non-secure is required */
...@@ -684,7 +685,7 @@ EXPORT_SYMBOL(hci_conn_check_secure); ...@@ -684,7 +685,7 @@ EXPORT_SYMBOL(hci_conn_check_secure);
/* Change link key */ /* Change link key */
int hci_conn_change_link_key(struct hci_conn *conn) int hci_conn_change_link_key(struct hci_conn *conn)
{ {
BT_DBG("conn %p", conn); BT_DBG("hcon %p", conn);
if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) { if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
struct hci_cp_change_conn_link_key cp; struct hci_cp_change_conn_link_key cp;
...@@ -699,7 +700,7 @@ int hci_conn_change_link_key(struct hci_conn *conn) ...@@ -699,7 +700,7 @@ int hci_conn_change_link_key(struct hci_conn *conn)
/* Switch role */ /* Switch role */
int hci_conn_switch_role(struct hci_conn *conn, __u8 role) int hci_conn_switch_role(struct hci_conn *conn, __u8 role)
{ {
BT_DBG("conn %p", conn); BT_DBG("hcon %p", conn);
if (!role && conn->link_mode & HCI_LM_MASTER) if (!role && conn->link_mode & HCI_LM_MASTER)
return 1; return 1;
...@@ -720,7 +721,7 @@ void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active) ...@@ -720,7 +721,7 @@ void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active)
{ {
struct hci_dev *hdev = conn->hdev; struct hci_dev *hdev = conn->hdev;
BT_DBG("conn %p mode %d", conn, conn->mode); BT_DBG("hcon %p mode %d", conn, conn->mode);
if (test_bit(HCI_RAW, &hdev->flags)) if (test_bit(HCI_RAW, &hdev->flags))
return; return;
...@@ -894,7 +895,7 @@ struct hci_chan *hci_chan_create(struct hci_conn *conn) ...@@ -894,7 +895,7 @@ struct hci_chan *hci_chan_create(struct hci_conn *conn)
struct hci_dev *hdev = conn->hdev; struct hci_dev *hdev = conn->hdev;
struct hci_chan *chan; struct hci_chan *chan;
BT_DBG("%s conn %p", hdev->name, conn); BT_DBG("%s hcon %p", hdev->name, conn);
chan = kzalloc(sizeof(struct hci_chan), GFP_KERNEL); chan = kzalloc(sizeof(struct hci_chan), GFP_KERNEL);
if (!chan) if (!chan)
...@@ -913,7 +914,7 @@ int hci_chan_del(struct hci_chan *chan) ...@@ -913,7 +914,7 @@ int hci_chan_del(struct hci_chan *chan)
struct hci_conn *conn = chan->conn; struct hci_conn *conn = chan->conn;
struct hci_dev *hdev = conn->hdev; struct hci_dev *hdev = conn->hdev;
BT_DBG("%s conn %p chan %p", hdev->name, conn, chan); BT_DBG("%s hcon %p chan %p", hdev->name, conn, chan);
list_del_rcu(&chan->list); list_del_rcu(&chan->list);
...@@ -929,7 +930,7 @@ void hci_chan_list_flush(struct hci_conn *conn) ...@@ -929,7 +930,7 @@ void hci_chan_list_flush(struct hci_conn *conn)
{ {
struct hci_chan *chan, *n; struct hci_chan *chan, *n;
BT_DBG("conn %p", conn); BT_DBG("hcon %p", conn);
list_for_each_entry_safe(chan, n, &conn->chan_list, list) list_for_each_entry_safe(chan, n, &conn->chan_list, list)
hci_chan_del(chan); hci_chan_del(chan);
......
...@@ -33,8 +33,6 @@ ...@@ -33,8 +33,6 @@
#include <net/bluetooth/bluetooth.h> #include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h> #include <net/bluetooth/hci_core.h>
#define AUTO_OFF_TIMEOUT 2000
static void hci_rx_work(struct work_struct *work); static void hci_rx_work(struct work_struct *work);
static void hci_cmd_work(struct work_struct *work); static void hci_cmd_work(struct work_struct *work);
static void hci_tx_work(struct work_struct *work); static void hci_tx_work(struct work_struct *work);
...@@ -61,7 +59,7 @@ static void hci_notify(struct hci_dev *hdev, int event) ...@@ -61,7 +59,7 @@ static void hci_notify(struct hci_dev *hdev, int event)
void hci_req_complete(struct hci_dev *hdev, __u16 cmd, int result) void hci_req_complete(struct hci_dev *hdev, __u16 cmd, int result)
{ {
BT_DBG("%s command 0x%04x result 0x%2.2x", hdev->name, cmd, result); BT_DBG("%s command 0x%4.4x result 0x%2.2x", hdev->name, cmd, result);
/* If this is the init phase check if the completed command matches /* If this is the init phase check if the completed command matches
* the last init command, and if not just return. * the last init command, and if not just return.
...@@ -188,12 +186,6 @@ static void bredr_init(struct hci_dev *hdev) ...@@ -188,12 +186,6 @@ static void bredr_init(struct hci_dev *hdev)
/* Mandatory initialization */ /* Mandatory initialization */
/* Reset */
if (!test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks)) {
set_bit(HCI_RESET, &hdev->flags);
hci_send_cmd(hdev, HCI_OP_RESET, 0, NULL);
}
/* Read Local Supported Features */ /* Read Local Supported Features */
hci_send_cmd(hdev, HCI_OP_READ_LOCAL_FEATURES, 0, NULL); hci_send_cmd(hdev, HCI_OP_READ_LOCAL_FEATURES, 0, NULL);
...@@ -234,9 +226,6 @@ static void amp_init(struct hci_dev *hdev) ...@@ -234,9 +226,6 @@ static void amp_init(struct hci_dev *hdev)
{ {
hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_BLOCK_BASED; hdev->flow_ctl_mode = HCI_FLOW_CTL_MODE_BLOCK_BASED;
/* Reset */
hci_send_cmd(hdev, HCI_OP_RESET, 0, NULL);
/* Read Local Version */ /* Read Local Version */
hci_send_cmd(hdev, HCI_OP_READ_LOCAL_VERSION, 0, NULL); hci_send_cmd(hdev, HCI_OP_READ_LOCAL_VERSION, 0, NULL);
...@@ -262,6 +251,10 @@ static void hci_init_req(struct hci_dev *hdev, unsigned long opt) ...@@ -262,6 +251,10 @@ static void hci_init_req(struct hci_dev *hdev, unsigned long opt)
} }
skb_queue_purge(&hdev->driver_init); skb_queue_purge(&hdev->driver_init);
/* Reset */
if (!test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks))
hci_reset_req(hdev, 0);
switch (hdev->dev_type) { switch (hdev->dev_type) {
case HCI_BREDR: case HCI_BREDR:
bredr_init(hdev); bredr_init(hdev);
...@@ -690,12 +683,11 @@ int hci_dev_open(__u16 dev) ...@@ -690,12 +683,11 @@ int hci_dev_open(__u16 dev)
set_bit(HCI_INIT, &hdev->flags); set_bit(HCI_INIT, &hdev->flags);
hdev->init_last_cmd = 0; hdev->init_last_cmd = 0;
ret = __hci_request(hdev, hci_init_req, 0, ret = __hci_request(hdev, hci_init_req, 0, HCI_INIT_TIMEOUT);
msecs_to_jiffies(HCI_INIT_TIMEOUT));
if (lmp_host_le_capable(hdev)) if (lmp_host_le_capable(hdev))
ret = __hci_request(hdev, hci_le_init_req, 0, ret = __hci_request(hdev, hci_le_init_req, 0,
msecs_to_jiffies(HCI_INIT_TIMEOUT)); HCI_INIT_TIMEOUT);
clear_bit(HCI_INIT, &hdev->flags); clear_bit(HCI_INIT, &hdev->flags);
} }
...@@ -782,8 +774,7 @@ static int hci_dev_do_close(struct hci_dev *hdev) ...@@ -782,8 +774,7 @@ static int hci_dev_do_close(struct hci_dev *hdev)
if (!test_bit(HCI_RAW, &hdev->flags) && if (!test_bit(HCI_RAW, &hdev->flags) &&
test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks)) { test_bit(HCI_QUIRK_RESET_ON_CLOSE, &hdev->quirks)) {
set_bit(HCI_INIT, &hdev->flags); set_bit(HCI_INIT, &hdev->flags);
__hci_request(hdev, hci_reset_req, 0, __hci_request(hdev, hci_reset_req, 0, HCI_CMD_TIMEOUT);
msecs_to_jiffies(250));
clear_bit(HCI_INIT, &hdev->flags); clear_bit(HCI_INIT, &hdev->flags);
} }
...@@ -872,8 +863,7 @@ int hci_dev_reset(__u16 dev) ...@@ -872,8 +863,7 @@ int hci_dev_reset(__u16 dev)
hdev->acl_cnt = 0; hdev->sco_cnt = 0; hdev->le_cnt = 0; hdev->acl_cnt = 0; hdev->sco_cnt = 0; hdev->le_cnt = 0;
if (!test_bit(HCI_RAW, &hdev->flags)) if (!test_bit(HCI_RAW, &hdev->flags))
ret = __hci_request(hdev, hci_reset_req, 0, ret = __hci_request(hdev, hci_reset_req, 0, HCI_INIT_TIMEOUT);
msecs_to_jiffies(HCI_INIT_TIMEOUT));
done: done:
hci_req_unlock(hdev); hci_req_unlock(hdev);
...@@ -913,7 +903,7 @@ int hci_dev_cmd(unsigned int cmd, void __user *arg) ...@@ -913,7 +903,7 @@ int hci_dev_cmd(unsigned int cmd, void __user *arg)
switch (cmd) { switch (cmd) {
case HCISETAUTH: case HCISETAUTH:
err = hci_request(hdev, hci_auth_req, dr.dev_opt, err = hci_request(hdev, hci_auth_req, dr.dev_opt,
msecs_to_jiffies(HCI_INIT_TIMEOUT)); HCI_INIT_TIMEOUT);
break; break;
case HCISETENCRYPT: case HCISETENCRYPT:
...@@ -925,23 +915,23 @@ int hci_dev_cmd(unsigned int cmd, void __user *arg) ...@@ -925,23 +915,23 @@ int hci_dev_cmd(unsigned int cmd, void __user *arg)
if (!test_bit(HCI_AUTH, &hdev->flags)) { if (!test_bit(HCI_AUTH, &hdev->flags)) {
/* Auth must be enabled first */ /* Auth must be enabled first */
err = hci_request(hdev, hci_auth_req, dr.dev_opt, err = hci_request(hdev, hci_auth_req, dr.dev_opt,
msecs_to_jiffies(HCI_INIT_TIMEOUT)); HCI_INIT_TIMEOUT);
if (err) if (err)
break; break;
} }
err = hci_request(hdev, hci_encrypt_req, dr.dev_opt, err = hci_request(hdev, hci_encrypt_req, dr.dev_opt,
msecs_to_jiffies(HCI_INIT_TIMEOUT)); HCI_INIT_TIMEOUT);
break; break;
case HCISETSCAN: case HCISETSCAN:
err = hci_request(hdev, hci_scan_req, dr.dev_opt, err = hci_request(hdev, hci_scan_req, dr.dev_opt,
msecs_to_jiffies(HCI_INIT_TIMEOUT)); HCI_INIT_TIMEOUT);
break; break;
case HCISETLINKPOL: case HCISETLINKPOL:
err = hci_request(hdev, hci_linkpol_req, dr.dev_opt, err = hci_request(hdev, hci_linkpol_req, dr.dev_opt,
msecs_to_jiffies(HCI_INIT_TIMEOUT)); HCI_INIT_TIMEOUT);
break; break;
case HCISETLINKMODE: case HCISETLINKMODE:
...@@ -1091,8 +1081,7 @@ static void hci_power_on(struct work_struct *work) ...@@ -1091,8 +1081,7 @@ static void hci_power_on(struct work_struct *work)
return; return;
if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags)) if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags))
schedule_delayed_work(&hdev->power_off, schedule_delayed_work(&hdev->power_off, HCI_AUTO_OFF_TIMEOUT);
msecs_to_jiffies(AUTO_OFF_TIMEOUT));
if (test_and_clear_bit(HCI_SETUP, &hdev->dev_flags)) if (test_and_clear_bit(HCI_SETUP, &hdev->dev_flags))
mgmt_index_added(hdev); mgmt_index_added(hdev);
...@@ -1369,11 +1358,19 @@ int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr) ...@@ -1369,11 +1358,19 @@ int hci_remove_ltk(struct hci_dev *hdev, bdaddr_t *bdaddr)
} }
/* HCI command timer function */ /* HCI command timer function */
static void hci_cmd_timer(unsigned long arg) static void hci_cmd_timeout(unsigned long arg)
{ {
struct hci_dev *hdev = (void *) arg; struct hci_dev *hdev = (void *) arg;
BT_ERR("%s command tx timeout", hdev->name); if (hdev->sent_cmd) {
struct hci_command_hdr *sent = (void *) hdev->sent_cmd->data;
u16 opcode = __le16_to_cpu(sent->opcode);
BT_ERR("%s command 0x%4.4x tx timeout", hdev->name, opcode);
} else {
BT_ERR("%s command tx timeout", hdev->name);
}
atomic_set(&hdev->cmd_cnt, 1); atomic_set(&hdev->cmd_cnt, 1);
queue_work(hdev->workqueue, &hdev->cmd_work); queue_work(hdev->workqueue, &hdev->cmd_work);
} }
...@@ -1671,7 +1668,7 @@ struct hci_dev *hci_alloc_dev(void) ...@@ -1671,7 +1668,7 @@ struct hci_dev *hci_alloc_dev(void)
init_waitqueue_head(&hdev->req_wait_q); init_waitqueue_head(&hdev->req_wait_q);
setup_timer(&hdev->cmd_timer, hci_cmd_timer, (unsigned long) hdev); setup_timer(&hdev->cmd_timer, hci_cmd_timeout, (unsigned long) hdev);
hci_init_sysfs(hdev); hci_init_sysfs(hdev);
discovery_init(hdev); discovery_init(hdev);
...@@ -1746,8 +1743,11 @@ int hci_register_dev(struct hci_dev *hdev) ...@@ -1746,8 +1743,11 @@ int hci_register_dev(struct hci_dev *hdev)
} }
} }
set_bit(HCI_AUTO_OFF, &hdev->dev_flags);
set_bit(HCI_SETUP, &hdev->dev_flags); set_bit(HCI_SETUP, &hdev->dev_flags);
if (hdev->dev_type != HCI_AMP)
set_bit(HCI_AUTO_OFF, &hdev->dev_flags);
schedule_work(&hdev->power_on); schedule_work(&hdev->power_on);
hci_notify(hdev, HCI_DEV_REG); hci_notify(hdev, HCI_DEV_REG);
...@@ -2087,7 +2087,7 @@ int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param) ...@@ -2087,7 +2087,7 @@ int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param)
struct hci_command_hdr *hdr; struct hci_command_hdr *hdr;
struct sk_buff *skb; struct sk_buff *skb;
BT_DBG("%s opcode 0x%x plen %d", hdev->name, opcode, plen); BT_DBG("%s opcode 0x%4.4x plen %d", hdev->name, opcode, plen);
skb = bt_skb_alloc(len, GFP_ATOMIC); skb = bt_skb_alloc(len, GFP_ATOMIC);
if (!skb) { if (!skb) {
...@@ -2129,7 +2129,7 @@ void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode) ...@@ -2129,7 +2129,7 @@ void *hci_sent_cmd_data(struct hci_dev *hdev, __u16 opcode)
if (hdr->opcode != cpu_to_le16(opcode)) if (hdr->opcode != cpu_to_le16(opcode))
return NULL; return NULL;
BT_DBG("%s opcode 0x%x", hdev->name, opcode); BT_DBG("%s opcode 0x%4.4x", hdev->name, opcode);
return hdev->sent_cmd->data + HCI_COMMAND_HDR_SIZE; return hdev->sent_cmd->data + HCI_COMMAND_HDR_SIZE;
} }
...@@ -2199,7 +2199,7 @@ void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags) ...@@ -2199,7 +2199,7 @@ void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags)
struct hci_conn *conn = chan->conn; struct hci_conn *conn = chan->conn;
struct hci_dev *hdev = conn->hdev; struct hci_dev *hdev = conn->hdev;
BT_DBG("%s chan %p flags 0x%x", hdev->name, chan, flags); BT_DBG("%s chan %p flags 0x%4.4x", hdev->name, chan, flags);
skb->dev = (void *) hdev; skb->dev = (void *) hdev;
...@@ -2455,7 +2455,7 @@ static void __check_timeout(struct hci_dev *hdev, unsigned int cnt) ...@@ -2455,7 +2455,7 @@ static void __check_timeout(struct hci_dev *hdev, unsigned int cnt)
/* ACL tx timeout must be longer than maximum /* ACL tx timeout must be longer than maximum
* link supervision timeout (40.9 seconds) */ * link supervision timeout (40.9 seconds) */
if (!cnt && time_after(jiffies, hdev->acl_last_tx + if (!cnt && time_after(jiffies, hdev->acl_last_tx +
msecs_to_jiffies(HCI_ACL_TX_TIMEOUT))) HCI_ACL_TX_TIMEOUT))
hci_link_tx_to(hdev, ACL_LINK); hci_link_tx_to(hdev, ACL_LINK);
} }
} }
...@@ -2699,7 +2699,7 @@ static void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -2699,7 +2699,7 @@ static void hci_acldata_packet(struct hci_dev *hdev, struct sk_buff *skb)
flags = hci_flags(handle); flags = hci_flags(handle);
handle = hci_handle(handle); handle = hci_handle(handle);
BT_DBG("%s len %d handle 0x%x flags 0x%x", hdev->name, skb->len, BT_DBG("%s len %d handle 0x%4.4x flags 0x%4.4x", hdev->name, skb->len,
handle, flags); handle, flags);
hdev->stat.acl_rx++; hdev->stat.acl_rx++;
...@@ -2741,7 +2741,7 @@ static void hci_scodata_packet(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -2741,7 +2741,7 @@ static void hci_scodata_packet(struct hci_dev *hdev, struct sk_buff *skb)
handle = __le16_to_cpu(hdr->handle); handle = __le16_to_cpu(hdr->handle);
BT_DBG("%s len %d handle 0x%x", hdev->name, skb->len, handle); BT_DBG("%s len %d handle 0x%4.4x", hdev->name, skb->len, handle);
hdev->stat.sco_rx++; hdev->stat.sco_rx++;
...@@ -2821,7 +2821,8 @@ static void hci_cmd_work(struct work_struct *work) ...@@ -2821,7 +2821,8 @@ static void hci_cmd_work(struct work_struct *work)
struct hci_dev *hdev = container_of(work, struct hci_dev, cmd_work); struct hci_dev *hdev = container_of(work, struct hci_dev, cmd_work);
struct sk_buff *skb; struct sk_buff *skb;
BT_DBG("%s cmd %d", hdev->name, atomic_read(&hdev->cmd_cnt)); BT_DBG("%s cmd_cnt %d cmd queued %d", hdev->name,
atomic_read(&hdev->cmd_cnt), skb_queue_len(&hdev->cmd_q));
/* Send queued commands */ /* Send queued commands */
if (atomic_read(&hdev->cmd_cnt)) { if (atomic_read(&hdev->cmd_cnt)) {
...@@ -2839,7 +2840,7 @@ static void hci_cmd_work(struct work_struct *work) ...@@ -2839,7 +2840,7 @@ static void hci_cmd_work(struct work_struct *work)
del_timer(&hdev->cmd_timer); del_timer(&hdev->cmd_timer);
else else
mod_timer(&hdev->cmd_timer, mod_timer(&hdev->cmd_timer,
jiffies + msecs_to_jiffies(HCI_CMD_TIMEOUT)); jiffies + HCI_CMD_TIMEOUT);
} else { } else {
skb_queue_head(&hdev->cmd_q, skb); skb_queue_head(&hdev->cmd_q, skb);
queue_work(hdev->workqueue, &hdev->cmd_work); queue_work(hdev->workqueue, &hdev->cmd_work);
......
This diff is collapsed.
This diff is collapsed.
...@@ -210,7 +210,7 @@ static int cmd_status(struct sock *sk, u16 index, u16 cmd, u8 status) ...@@ -210,7 +210,7 @@ static int cmd_status(struct sock *sk, u16 index, u16 cmd, u8 status)
BT_DBG("sock %p, index %u, cmd %u, status %u", sk, index, cmd, status); BT_DBG("sock %p, index %u, cmd %u, status %u", sk, index, cmd, status);
skb = alloc_skb(sizeof(*hdr) + sizeof(*ev), GFP_ATOMIC); skb = alloc_skb(sizeof(*hdr) + sizeof(*ev), GFP_KERNEL);
if (!skb) if (!skb)
return -ENOMEM; return -ENOMEM;
...@@ -241,7 +241,7 @@ static int cmd_complete(struct sock *sk, u16 index, u16 cmd, u8 status, ...@@ -241,7 +241,7 @@ static int cmd_complete(struct sock *sk, u16 index, u16 cmd, u8 status,
BT_DBG("sock %p", sk); BT_DBG("sock %p", sk);
skb = alloc_skb(sizeof(*hdr) + sizeof(*ev) + rp_len, GFP_ATOMIC); skb = alloc_skb(sizeof(*hdr) + sizeof(*ev) + rp_len, GFP_KERNEL);
if (!skb) if (!skb)
return -ENOMEM; return -ENOMEM;
...@@ -687,14 +687,14 @@ static struct pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode, ...@@ -687,14 +687,14 @@ static struct pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode,
{ {
struct pending_cmd *cmd; struct pending_cmd *cmd;
cmd = kmalloc(sizeof(*cmd), GFP_ATOMIC); cmd = kmalloc(sizeof(*cmd), GFP_KERNEL);
if (!cmd) if (!cmd)
return NULL; return NULL;
cmd->opcode = opcode; cmd->opcode = opcode;
cmd->index = hdev->id; cmd->index = hdev->id;
cmd->param = kmalloc(len, GFP_ATOMIC); cmd->param = kmalloc(len, GFP_KERNEL);
if (!cmd->param) { if (!cmd->param) {
kfree(cmd); kfree(cmd);
return NULL; return NULL;
...@@ -812,7 +812,7 @@ static int mgmt_event(u16 event, struct hci_dev *hdev, void *data, u16 data_len, ...@@ -812,7 +812,7 @@ static int mgmt_event(u16 event, struct hci_dev *hdev, void *data, u16 data_len,
struct sk_buff *skb; struct sk_buff *skb;
struct mgmt_hdr *hdr; struct mgmt_hdr *hdr;
skb = alloc_skb(sizeof(*hdr) + data_len, GFP_ATOMIC); skb = alloc_skb(sizeof(*hdr) + data_len, GFP_KERNEL);
if (!skb) if (!skb)
return -ENOMEM; return -ENOMEM;
...@@ -1268,7 +1268,7 @@ static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len) ...@@ -1268,7 +1268,7 @@ static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
goto failed; goto failed;
} }
uuid = kmalloc(sizeof(*uuid), GFP_ATOMIC); uuid = kmalloc(sizeof(*uuid), GFP_KERNEL);
if (!uuid) { if (!uuid) {
err = -ENOMEM; err = -ENOMEM;
goto failed; goto failed;
...@@ -1611,7 +1611,7 @@ static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data, ...@@ -1611,7 +1611,7 @@ static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
} }
dc.handle = cpu_to_le16(conn->handle); dc.handle = cpu_to_le16(conn->handle);
dc.reason = 0x13; /* Remote User Terminated Connection */ dc.reason = HCI_ERROR_REMOTE_USER_TERM;
err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc); err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
if (err < 0) if (err < 0)
...@@ -1667,7 +1667,7 @@ static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data, ...@@ -1667,7 +1667,7 @@ static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data,
} }
rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info)); rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
rp = kmalloc(rp_len, GFP_ATOMIC); rp = kmalloc(rp_len, GFP_KERNEL);
if (!rp) { if (!rp) {
err = -ENOMEM; err = -ENOMEM;
goto unlock; goto unlock;
...@@ -1778,29 +1778,6 @@ static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data, ...@@ -1778,29 +1778,6 @@ static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
return err; return err;
} }
static int pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
void *data, u16 len)
{
struct mgmt_cp_pin_code_neg_reply *cp = data;
int err;
BT_DBG("");
hci_dev_lock(hdev);
if (!hdev_is_powered(hdev)) {
err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_NEG_REPLY,
MGMT_STATUS_NOT_POWERED);
goto failed;
}
err = send_pin_code_neg_reply(sk, hdev, cp);
failed:
hci_dev_unlock(hdev);
return err;
}
static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data, static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data,
u16 len) u16 len)
{ {
...@@ -2083,6 +2060,18 @@ static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev, ...@@ -2083,6 +2060,18 @@ static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
return err; return err;
} }
static int pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
void *data, u16 len)
{
struct mgmt_cp_pin_code_neg_reply *cp = data;
BT_DBG("");
return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
MGMT_OP_PIN_CODE_NEG_REPLY,
HCI_OP_PIN_CODE_NEG_REPLY, 0);
}
static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data, static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data,
u16 len) u16 len)
{ {
...@@ -2607,8 +2596,8 @@ static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev, ...@@ -2607,8 +2596,8 @@ static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
if (cp->val) { if (cp->val) {
type = PAGE_SCAN_TYPE_INTERLACED; type = PAGE_SCAN_TYPE_INTERLACED;
/* 22.5 msec page scan interval */ /* 160 msec page scan interval */
acp.interval = __constant_cpu_to_le16(0x0024); acp.interval = __constant_cpu_to_le16(0x0100);
} else { } else {
type = PAGE_SCAN_TYPE_STANDARD; /* default */ type = PAGE_SCAN_TYPE_STANDARD; /* default */
...@@ -3546,9 +3535,9 @@ int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, ...@@ -3546,9 +3535,9 @@ int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
ev->addr.type = link_to_bdaddr(link_type, addr_type); ev->addr.type = link_to_bdaddr(link_type, addr_type);
ev->rssi = rssi; ev->rssi = rssi;
if (cfm_name) if (cfm_name)
ev->flags[0] |= MGMT_DEV_FOUND_CONFIRM_NAME; ev->flags |= cpu_to_le32(MGMT_DEV_FOUND_CONFIRM_NAME);
if (!ssp) if (!ssp)
ev->flags[0] |= MGMT_DEV_FOUND_LEGACY_PAIRING; ev->flags |= cpu_to_le32(MGMT_DEV_FOUND_LEGACY_PAIRING);
if (eir_len > 0) if (eir_len > 0)
memcpy(ev->eir, eir, eir_len); memcpy(ev->eir, eir, eir_len);
...@@ -3558,7 +3547,6 @@ int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, ...@@ -3558,7 +3547,6 @@ int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
dev_class, 3); dev_class, 3);
ev->eir_len = cpu_to_le16(eir_len); ev->eir_len = cpu_to_le16(eir_len);
ev_size = sizeof(*ev) + eir_len; ev_size = sizeof(*ev) + eir_len;
return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL); return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment