Commit 54f1aa2e authored by David S. Miller's avatar David S. Miller

Merge branch 'for-upstream' of...

Merge branch 'for-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next

Johan Hedberg says:

====================
pull request: bluetooth-next 2015-11-23

Here's the first bluetooth-next pull request for the 4.5 kernel.

 - Add new Get Advertising Size Information management command
 - Add support for new system note message type on monitor channel
 - Refactor LE scan changes behind separate workqueue to avoid races
 - Fix issue with privacy feature when powering on adapter
 - Various minor fixes & cleanups here and there

Please let me know if there are any issues pulling. Thanks.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 73b1c90d dc4270c0
...@@ -324,7 +324,7 @@ static inline int bfusb_recv_block(struct bfusb_data *data, int hdr, unsigned ch ...@@ -324,7 +324,7 @@ static inline int bfusb_recv_block(struct bfusb_data *data, int hdr, unsigned ch
return -ENOMEM; return -ENOMEM;
} }
bt_cb(skb)->pkt_type = pkt_type; hci_skb_pkt_type(skb) = pkt_type;
data->reassembly = skb; data->reassembly = skb;
} else { } else {
...@@ -469,9 +469,10 @@ static int bfusb_send_frame(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -469,9 +469,10 @@ static int bfusb_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
unsigned char buf[3]; unsigned char buf[3];
int sent = 0, size, count; int sent = 0, size, count;
BT_DBG("hdev %p skb %p type %d len %d", hdev, skb, bt_cb(skb)->pkt_type, skb->len); BT_DBG("hdev %p skb %p type %d len %d", hdev, skb,
hci_skb_pkt_type(skb), skb->len);
switch (bt_cb(skb)->pkt_type) { switch (hci_skb_pkt_type(skb)) {
case HCI_COMMAND_PKT: case HCI_COMMAND_PKT:
hdev->stat.cmd_tx++; hdev->stat.cmd_tx++;
break; break;
...@@ -484,7 +485,7 @@ static int bfusb_send_frame(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -484,7 +485,7 @@ static int bfusb_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
} }
/* Prepend skb with frame type */ /* Prepend skb with frame type */
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1);
count = skb->len; count = skb->len;
......
...@@ -261,7 +261,7 @@ static void bluecard_write_wakeup(struct bluecard_info *info) ...@@ -261,7 +261,7 @@ static void bluecard_write_wakeup(struct bluecard_info *info)
if (!skb) if (!skb)
break; break;
if (bt_cb(skb)->pkt_type & 0x80) { if (hci_skb_pkt_type(skb) & 0x80) {
/* Disable RTS */ /* Disable RTS */
info->ctrl_reg |= REG_CONTROL_RTS; info->ctrl_reg |= REG_CONTROL_RTS;
outb(info->ctrl_reg, iobase + REG_CONTROL); outb(info->ctrl_reg, iobase + REG_CONTROL);
...@@ -279,13 +279,13 @@ static void bluecard_write_wakeup(struct bluecard_info *info) ...@@ -279,13 +279,13 @@ static void bluecard_write_wakeup(struct bluecard_info *info)
/* Mark the buffer as dirty */ /* Mark the buffer as dirty */
clear_bit(ready_bit, &(info->tx_state)); clear_bit(ready_bit, &(info->tx_state));
if (bt_cb(skb)->pkt_type & 0x80) { if (hci_skb_pkt_type(skb) & 0x80) {
DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq); DECLARE_WAIT_QUEUE_HEAD_ONSTACK(wq);
DEFINE_WAIT(wait); DEFINE_WAIT(wait);
unsigned char baud_reg; unsigned char baud_reg;
switch (bt_cb(skb)->pkt_type) { switch (hci_skb_pkt_type(skb)) {
case PKT_BAUD_RATE_460800: case PKT_BAUD_RATE_460800:
baud_reg = REG_CONTROL_BAUD_RATE_460800; baud_reg = REG_CONTROL_BAUD_RATE_460800;
break; break;
...@@ -402,9 +402,9 @@ static void bluecard_receive(struct bluecard_info *info, ...@@ -402,9 +402,9 @@ static void bluecard_receive(struct bluecard_info *info,
if (info->rx_state == RECV_WAIT_PACKET_TYPE) { if (info->rx_state == RECV_WAIT_PACKET_TYPE) {
bt_cb(info->rx_skb)->pkt_type = buf[i]; hci_skb_pkt_type(info->rx_skb) = buf[i];
switch (bt_cb(info->rx_skb)->pkt_type) { switch (hci_skb_pkt_type(info->rx_skb)) {
case 0x00: case 0x00:
/* init packet */ /* init packet */
...@@ -436,7 +436,8 @@ static void bluecard_receive(struct bluecard_info *info, ...@@ -436,7 +436,8 @@ static void bluecard_receive(struct bluecard_info *info,
default: default:
/* unknown packet */ /* unknown packet */
BT_ERR("Unknown HCI packet with type 0x%02x received", bt_cb(info->rx_skb)->pkt_type); BT_ERR("Unknown HCI packet with type 0x%02x received",
hci_skb_pkt_type(info->rx_skb));
info->hdev->stat.err_rx++; info->hdev->stat.err_rx++;
kfree_skb(info->rx_skb); kfree_skb(info->rx_skb);
...@@ -578,21 +579,21 @@ static int bluecard_hci_set_baud_rate(struct hci_dev *hdev, int baud) ...@@ -578,21 +579,21 @@ static int bluecard_hci_set_baud_rate(struct hci_dev *hdev, int baud)
switch (baud) { switch (baud) {
case 460800: case 460800:
cmd[4] = 0x00; cmd[4] = 0x00;
bt_cb(skb)->pkt_type = PKT_BAUD_RATE_460800; hci_skb_pkt_type(skb) = PKT_BAUD_RATE_460800;
break; break;
case 230400: case 230400:
cmd[4] = 0x01; cmd[4] = 0x01;
bt_cb(skb)->pkt_type = PKT_BAUD_RATE_230400; hci_skb_pkt_type(skb) = PKT_BAUD_RATE_230400;
break; break;
case 115200: case 115200:
cmd[4] = 0x02; cmd[4] = 0x02;
bt_cb(skb)->pkt_type = PKT_BAUD_RATE_115200; hci_skb_pkt_type(skb) = PKT_BAUD_RATE_115200;
break; break;
case 57600: case 57600:
/* Fall through... */ /* Fall through... */
default: default:
cmd[4] = 0x03; cmd[4] = 0x03;
bt_cb(skb)->pkt_type = PKT_BAUD_RATE_57600; hci_skb_pkt_type(skb) = PKT_BAUD_RATE_57600;
break; break;
} }
...@@ -660,7 +661,7 @@ static int bluecard_hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -660,7 +661,7 @@ static int bluecard_hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
{ {
struct bluecard_info *info = hci_get_drvdata(hdev); struct bluecard_info *info = hci_get_drvdata(hdev);
switch (bt_cb(skb)->pkt_type) { switch (hci_skb_pkt_type(skb)) {
case HCI_COMMAND_PKT: case HCI_COMMAND_PKT:
hdev->stat.cmd_tx++; hdev->stat.cmd_tx++;
break; break;
...@@ -673,7 +674,7 @@ static int bluecard_hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -673,7 +674,7 @@ static int bluecard_hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
} }
/* Prepend skb with frame type */ /* Prepend skb with frame type */
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1);
skb_queue_tail(&(info->txq), skb); skb_queue_tail(&(info->txq), skb);
bluecard_write_wakeup(info); bluecard_write_wakeup(info);
......
...@@ -295,9 +295,9 @@ static int bpa10x_send_frame(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -295,9 +295,9 @@ static int bpa10x_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
return -ENOMEM; return -ENOMEM;
/* Prepend skb with frame type */ /* Prepend skb with frame type */
*skb_push(skb, 1) = bt_cb(skb)->pkt_type; *skb_push(skb, 1) = hci_skb_pkt_type(skb);
switch (bt_cb(skb)->pkt_type) { switch (hci_skb_pkt_type(skb)) {
case HCI_COMMAND_PKT: case HCI_COMMAND_PKT:
dr = kmalloc(sizeof(*dr), GFP_ATOMIC); dr = kmalloc(sizeof(*dr), GFP_ATOMIC);
if (!dr) { if (!dr) {
......
...@@ -246,10 +246,10 @@ static void bt3c_receive(struct bt3c_info *info) ...@@ -246,10 +246,10 @@ static void bt3c_receive(struct bt3c_info *info)
if (info->rx_state == RECV_WAIT_PACKET_TYPE) { if (info->rx_state == RECV_WAIT_PACKET_TYPE) {
bt_cb(info->rx_skb)->pkt_type = inb(iobase + DATA_L); hci_skb_pkt_type(info->rx_skb) = inb(iobase + DATA_L);
inb(iobase + DATA_H); inb(iobase + DATA_H);
switch (bt_cb(info->rx_skb)->pkt_type) { switch (hci_skb_pkt_type(info->rx_skb)) {
case HCI_EVENT_PKT: case HCI_EVENT_PKT:
info->rx_state = RECV_WAIT_EVENT_HEADER; info->rx_state = RECV_WAIT_EVENT_HEADER;
...@@ -268,7 +268,8 @@ static void bt3c_receive(struct bt3c_info *info) ...@@ -268,7 +268,8 @@ static void bt3c_receive(struct bt3c_info *info)
default: default:
/* Unknown packet */ /* Unknown packet */
BT_ERR("Unknown HCI packet with type 0x%02x received", bt_cb(info->rx_skb)->pkt_type); BT_ERR("Unknown HCI packet with type 0x%02x received",
hci_skb_pkt_type(info->rx_skb));
info->hdev->stat.err_rx++; info->hdev->stat.err_rx++;
kfree_skb(info->rx_skb); kfree_skb(info->rx_skb);
...@@ -411,7 +412,7 @@ static int bt3c_hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -411,7 +412,7 @@ static int bt3c_hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
struct bt3c_info *info = hci_get_drvdata(hdev); struct bt3c_info *info = hci_get_drvdata(hdev);
unsigned long flags; unsigned long flags;
switch (bt_cb(skb)->pkt_type) { switch (hci_skb_pkt_type(skb)) {
case HCI_COMMAND_PKT: case HCI_COMMAND_PKT:
hdev->stat.cmd_tx++; hdev->stat.cmd_tx++;
break; break;
...@@ -424,7 +425,7 @@ static int bt3c_hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -424,7 +425,7 @@ static int bt3c_hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
} }
/* Prepend skb with frame type */ /* Prepend skb with frame type */
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1);
skb_queue_tail(&(info->txq), skb); skb_queue_tail(&(info->txq), skb);
spin_lock_irqsave(&(info->lock), flags); spin_lock_irqsave(&(info->lock), flags);
......
...@@ -196,7 +196,7 @@ static int btmrvl_send_sync_cmd(struct btmrvl_private *priv, u16 opcode, ...@@ -196,7 +196,7 @@ static int btmrvl_send_sync_cmd(struct btmrvl_private *priv, u16 opcode,
if (len) if (len)
memcpy(skb_put(skb, len), param, len); memcpy(skb_put(skb, len), param, len);
bt_cb(skb)->pkt_type = MRVL_VENDOR_PKT; hci_skb_pkt_type(skb) = MRVL_VENDOR_PKT;
skb_queue_head(&priv->adapter->tx_queue, skb); skb_queue_head(&priv->adapter->tx_queue, skb);
...@@ -387,7 +387,7 @@ static int btmrvl_tx_pkt(struct btmrvl_private *priv, struct sk_buff *skb) ...@@ -387,7 +387,7 @@ static int btmrvl_tx_pkt(struct btmrvl_private *priv, struct sk_buff *skb)
skb->data[0] = (skb->len & 0x0000ff); skb->data[0] = (skb->len & 0x0000ff);
skb->data[1] = (skb->len & 0x00ff00) >> 8; skb->data[1] = (skb->len & 0x00ff00) >> 8;
skb->data[2] = (skb->len & 0xff0000) >> 16; skb->data[2] = (skb->len & 0xff0000) >> 16;
skb->data[3] = bt_cb(skb)->pkt_type; skb->data[3] = hci_skb_pkt_type(skb);
if (priv->hw_host_to_card) if (priv->hw_host_to_card)
ret = priv->hw_host_to_card(priv, skb->data, skb->len); ret = priv->hw_host_to_card(priv, skb->data, skb->len);
...@@ -434,9 +434,9 @@ static int btmrvl_send_frame(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -434,9 +434,9 @@ static int btmrvl_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
{ {
struct btmrvl_private *priv = hci_get_drvdata(hdev); struct btmrvl_private *priv = hci_get_drvdata(hdev);
BT_DBG("type=%d, len=%d", skb->pkt_type, skb->len); BT_DBG("type=%d, len=%d", hci_skb_pkt_type(skb), skb->len);
switch (bt_cb(skb)->pkt_type) { switch (hci_skb_pkt_type(skb)) {
case HCI_COMMAND_PKT: case HCI_COMMAND_PKT:
hdev->stat.cmd_tx++; hdev->stat.cmd_tx++;
break; break;
......
...@@ -698,7 +698,7 @@ static int btmrvl_sdio_card_to_host(struct btmrvl_private *priv) ...@@ -698,7 +698,7 @@ static int btmrvl_sdio_card_to_host(struct btmrvl_private *priv)
case HCI_ACLDATA_PKT: case HCI_ACLDATA_PKT:
case HCI_SCODATA_PKT: case HCI_SCODATA_PKT:
case HCI_EVENT_PKT: case HCI_EVENT_PKT:
bt_cb(skb)->pkt_type = type; hci_skb_pkt_type(skb) = type;
skb_put(skb, buf_len); skb_put(skb, buf_len);
skb_pull(skb, SDIO_HEADER_LEN); skb_pull(skb, SDIO_HEADER_LEN);
...@@ -713,7 +713,7 @@ static int btmrvl_sdio_card_to_host(struct btmrvl_private *priv) ...@@ -713,7 +713,7 @@ static int btmrvl_sdio_card_to_host(struct btmrvl_private *priv)
break; break;
case MRVL_VENDOR_PKT: case MRVL_VENDOR_PKT:
bt_cb(skb)->pkt_type = HCI_VENDOR_PKT; hci_skb_pkt_type(skb) = HCI_VENDOR_PKT;
skb_put(skb, buf_len); skb_put(skb, buf_len);
skb_pull(skb, SDIO_HEADER_LEN); skb_pull(skb, SDIO_HEADER_LEN);
......
...@@ -86,7 +86,7 @@ static int btsdio_tx_packet(struct btsdio_data *data, struct sk_buff *skb) ...@@ -86,7 +86,7 @@ static int btsdio_tx_packet(struct btsdio_data *data, struct sk_buff *skb)
skb->data[0] = (skb->len & 0x0000ff); skb->data[0] = (skb->len & 0x0000ff);
skb->data[1] = (skb->len & 0x00ff00) >> 8; skb->data[1] = (skb->len & 0x00ff00) >> 8;
skb->data[2] = (skb->len & 0xff0000) >> 16; skb->data[2] = (skb->len & 0xff0000) >> 16;
skb->data[3] = bt_cb(skb)->pkt_type; skb->data[3] = hci_skb_pkt_type(skb);
err = sdio_writesb(data->func, REG_TDAT, skb->data, skb->len); err = sdio_writesb(data->func, REG_TDAT, skb->data, skb->len);
if (err < 0) { if (err < 0) {
...@@ -158,7 +158,7 @@ static int btsdio_rx_packet(struct btsdio_data *data) ...@@ -158,7 +158,7 @@ static int btsdio_rx_packet(struct btsdio_data *data)
data->hdev->stat.byte_rx += len; data->hdev->stat.byte_rx += len;
bt_cb(skb)->pkt_type = hdr[3]; hci_skb_pkt_type(skb) = hdr[3];
err = hci_recv_frame(data->hdev, skb); err = hci_recv_frame(data->hdev, skb);
if (err < 0) if (err < 0)
...@@ -252,7 +252,7 @@ static int btsdio_send_frame(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -252,7 +252,7 @@ static int btsdio_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
BT_DBG("%s", hdev->name); BT_DBG("%s", hdev->name);
switch (bt_cb(skb)->pkt_type) { switch (hci_skb_pkt_type(skb)) {
case HCI_COMMAND_PKT: case HCI_COMMAND_PKT:
hdev->stat.cmd_tx++; hdev->stat.cmd_tx++;
break; break;
......
...@@ -200,9 +200,9 @@ static void btuart_receive(struct btuart_info *info) ...@@ -200,9 +200,9 @@ static void btuart_receive(struct btuart_info *info)
if (info->rx_state == RECV_WAIT_PACKET_TYPE) { if (info->rx_state == RECV_WAIT_PACKET_TYPE) {
bt_cb(info->rx_skb)->pkt_type = inb(iobase + UART_RX); hci_skb_pkt_type(info->rx_skb) = inb(iobase + UART_RX);
switch (bt_cb(info->rx_skb)->pkt_type) { switch (hci_skb_pkt_type(info->rx_skb)) {
case HCI_EVENT_PKT: case HCI_EVENT_PKT:
info->rx_state = RECV_WAIT_EVENT_HEADER; info->rx_state = RECV_WAIT_EVENT_HEADER;
...@@ -221,7 +221,8 @@ static void btuart_receive(struct btuart_info *info) ...@@ -221,7 +221,8 @@ static void btuart_receive(struct btuart_info *info)
default: default:
/* Unknown packet */ /* Unknown packet */
BT_ERR("Unknown HCI packet with type 0x%02x received", bt_cb(info->rx_skb)->pkt_type); BT_ERR("Unknown HCI packet with type 0x%02x received",
hci_skb_pkt_type(info->rx_skb));
info->hdev->stat.err_rx++; info->hdev->stat.err_rx++;
kfree_skb(info->rx_skb); kfree_skb(info->rx_skb);
...@@ -424,7 +425,7 @@ static int btuart_hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -424,7 +425,7 @@ static int btuart_hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
{ {
struct btuart_info *info = hci_get_drvdata(hdev); struct btuart_info *info = hci_get_drvdata(hdev);
switch (bt_cb(skb)->pkt_type) { switch (hci_skb_pkt_type(skb)) {
case HCI_COMMAND_PKT: case HCI_COMMAND_PKT:
hdev->stat.cmd_tx++; hdev->stat.cmd_tx++;
break; break;
...@@ -437,7 +438,7 @@ static int btuart_hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -437,7 +438,7 @@ static int btuart_hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
} }
/* Prepend skb with frame type */ /* Prepend skb with frame type */
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1);
skb_queue_tail(&(info->txq), skb); skb_queue_tail(&(info->txq), skb);
btuart_write_wakeup(info); btuart_write_wakeup(info);
......
...@@ -437,22 +437,22 @@ static int btusb_recv_intr(struct btusb_data *data, void *buffer, int count) ...@@ -437,22 +437,22 @@ static int btusb_recv_intr(struct btusb_data *data, void *buffer, int count)
break; break;
} }
bt_cb(skb)->pkt_type = HCI_EVENT_PKT; hci_skb_pkt_type(skb) = HCI_EVENT_PKT;
bt_cb(skb)->expect = HCI_EVENT_HDR_SIZE; hci_skb_expect(skb) = HCI_EVENT_HDR_SIZE;
} }
len = min_t(uint, bt_cb(skb)->expect, count); len = min_t(uint, hci_skb_expect(skb), count);
memcpy(skb_put(skb, len), buffer, len); memcpy(skb_put(skb, len), buffer, len);
count -= len; count -= len;
buffer += len; buffer += len;
bt_cb(skb)->expect -= len; hci_skb_expect(skb) -= len;
if (skb->len == HCI_EVENT_HDR_SIZE) { if (skb->len == HCI_EVENT_HDR_SIZE) {
/* Complete event header */ /* Complete event header */
bt_cb(skb)->expect = hci_event_hdr(skb)->plen; hci_skb_expect(skb) = hci_event_hdr(skb)->plen;
if (skb_tailroom(skb) < bt_cb(skb)->expect) { if (skb_tailroom(skb) < hci_skb_expect(skb)) {
kfree_skb(skb); kfree_skb(skb);
skb = NULL; skb = NULL;
...@@ -461,7 +461,7 @@ static int btusb_recv_intr(struct btusb_data *data, void *buffer, int count) ...@@ -461,7 +461,7 @@ static int btusb_recv_intr(struct btusb_data *data, void *buffer, int count)
} }
} }
if (bt_cb(skb)->expect == 0) { if (!hci_skb_expect(skb)) {
/* Complete frame */ /* Complete frame */
data->recv_event(data->hdev, skb); data->recv_event(data->hdev, skb);
skb = NULL; skb = NULL;
...@@ -492,24 +492,24 @@ static int btusb_recv_bulk(struct btusb_data *data, void *buffer, int count) ...@@ -492,24 +492,24 @@ static int btusb_recv_bulk(struct btusb_data *data, void *buffer, int count)
break; break;
} }
bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT; hci_skb_pkt_type(skb) = HCI_ACLDATA_PKT;
bt_cb(skb)->expect = HCI_ACL_HDR_SIZE; hci_skb_expect(skb) = HCI_ACL_HDR_SIZE;
} }
len = min_t(uint, bt_cb(skb)->expect, count); len = min_t(uint, hci_skb_expect(skb), count);
memcpy(skb_put(skb, len), buffer, len); memcpy(skb_put(skb, len), buffer, len);
count -= len; count -= len;
buffer += len; buffer += len;
bt_cb(skb)->expect -= len; hci_skb_expect(skb) -= len;
if (skb->len == HCI_ACL_HDR_SIZE) { if (skb->len == HCI_ACL_HDR_SIZE) {
__le16 dlen = hci_acl_hdr(skb)->dlen; __le16 dlen = hci_acl_hdr(skb)->dlen;
/* Complete ACL header */ /* Complete ACL header */
bt_cb(skb)->expect = __le16_to_cpu(dlen); hci_skb_expect(skb) = __le16_to_cpu(dlen);
if (skb_tailroom(skb) < bt_cb(skb)->expect) { if (skb_tailroom(skb) < hci_skb_expect(skb)) {
kfree_skb(skb); kfree_skb(skb);
skb = NULL; skb = NULL;
...@@ -518,7 +518,7 @@ static int btusb_recv_bulk(struct btusb_data *data, void *buffer, int count) ...@@ -518,7 +518,7 @@ static int btusb_recv_bulk(struct btusb_data *data, void *buffer, int count)
} }
} }
if (bt_cb(skb)->expect == 0) { if (!hci_skb_expect(skb)) {
/* Complete frame */ /* Complete frame */
hci_recv_frame(data->hdev, skb); hci_recv_frame(data->hdev, skb);
skb = NULL; skb = NULL;
...@@ -549,22 +549,22 @@ static int btusb_recv_isoc(struct btusb_data *data, void *buffer, int count) ...@@ -549,22 +549,22 @@ static int btusb_recv_isoc(struct btusb_data *data, void *buffer, int count)
break; break;
} }
bt_cb(skb)->pkt_type = HCI_SCODATA_PKT; hci_skb_pkt_type(skb) = HCI_SCODATA_PKT;
bt_cb(skb)->expect = HCI_SCO_HDR_SIZE; hci_skb_expect(skb) = HCI_SCO_HDR_SIZE;
} }
len = min_t(uint, bt_cb(skb)->expect, count); len = min_t(uint, hci_skb_expect(skb), count);
memcpy(skb_put(skb, len), buffer, len); memcpy(skb_put(skb, len), buffer, len);
count -= len; count -= len;
buffer += len; buffer += len;
bt_cb(skb)->expect -= len; hci_skb_expect(skb) -= len;
if (skb->len == HCI_SCO_HDR_SIZE) { if (skb->len == HCI_SCO_HDR_SIZE) {
/* Complete SCO header */ /* Complete SCO header */
bt_cb(skb)->expect = hci_sco_hdr(skb)->dlen; hci_skb_expect(skb) = hci_sco_hdr(skb)->dlen;
if (skb_tailroom(skb) < bt_cb(skb)->expect) { if (skb_tailroom(skb) < hci_skb_expect(skb)) {
kfree_skb(skb); kfree_skb(skb);
skb = NULL; skb = NULL;
...@@ -573,7 +573,7 @@ static int btusb_recv_isoc(struct btusb_data *data, void *buffer, int count) ...@@ -573,7 +573,7 @@ static int btusb_recv_isoc(struct btusb_data *data, void *buffer, int count)
} }
} }
if (bt_cb(skb)->expect == 0) { if (!hci_skb_expect(skb)) {
/* Complete frame */ /* Complete frame */
hci_recv_frame(data->hdev, skb); hci_recv_frame(data->hdev, skb);
skb = NULL; skb = NULL;
...@@ -1257,7 +1257,7 @@ static int btusb_send_frame(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -1257,7 +1257,7 @@ static int btusb_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
BT_DBG("%s", hdev->name); BT_DBG("%s", hdev->name);
switch (bt_cb(skb)->pkt_type) { switch (hci_skb_pkt_type(skb)) {
case HCI_COMMAND_PKT: case HCI_COMMAND_PKT:
urb = alloc_ctrl_urb(hdev, skb); urb = alloc_ctrl_urb(hdev, skb);
if (IS_ERR(urb)) if (IS_ERR(urb))
...@@ -1853,7 +1853,7 @@ static int inject_cmd_complete(struct hci_dev *hdev, __u16 opcode) ...@@ -1853,7 +1853,7 @@ static int inject_cmd_complete(struct hci_dev *hdev, __u16 opcode)
*skb_put(skb, 1) = 0x00; *skb_put(skb, 1) = 0x00;
bt_cb(skb)->pkt_type = HCI_EVENT_PKT; hci_skb_pkt_type(skb) = HCI_EVENT_PKT;
return hci_recv_frame(hdev, skb); return hci_recv_frame(hdev, skb);
} }
...@@ -1945,7 +1945,7 @@ static int btusb_send_frame_intel(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -1945,7 +1945,7 @@ static int btusb_send_frame_intel(struct hci_dev *hdev, struct sk_buff *skb)
BT_DBG("%s", hdev->name); BT_DBG("%s", hdev->name);
switch (bt_cb(skb)->pkt_type) { switch (hci_skb_pkt_type(skb)) {
case HCI_COMMAND_PKT: case HCI_COMMAND_PKT:
if (test_bit(BTUSB_BOOTLOADER, &data->flags)) { if (test_bit(BTUSB_BOOTLOADER, &data->flags)) {
struct hci_command_hdr *cmd = (void *)skb->data; struct hci_command_hdr *cmd = (void *)skb->data;
......
...@@ -249,10 +249,10 @@ static int ti_st_send_frame(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -249,10 +249,10 @@ static int ti_st_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
hst = hci_get_drvdata(hdev); hst = hci_get_drvdata(hdev);
/* Prepend skb with frame type */ /* Prepend skb with frame type */
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1);
BT_DBG("%s: type %d len %d", hdev->name, bt_cb(skb)->pkt_type, BT_DBG("%s: type %d len %d", hdev->name, hci_skb_pkt_type(skb),
skb->len); skb->len);
/* Insert skb to shared transport layer's transmit queue. /* Insert skb to shared transport layer's transmit queue.
* Freeing skb memory is taken care in shared transport layer, * Freeing skb memory is taken care in shared transport layer,
...@@ -268,7 +268,7 @@ static int ti_st_send_frame(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -268,7 +268,7 @@ static int ti_st_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
/* ST accepted our skb. So, Go ahead and do rest */ /* ST accepted our skb. So, Go ahead and do rest */
hdev->stat.byte_tx += len; hdev->stat.byte_tx += len;
ti_st_tx_complete(hst, bt_cb(skb)->pkt_type); ti_st_tx_complete(hst, hci_skb_pkt_type(skb));
return 0; return 0;
} }
......
...@@ -239,7 +239,7 @@ static void dtl1_receive(struct dtl1_info *info) ...@@ -239,7 +239,7 @@ static void dtl1_receive(struct dtl1_info *info)
info->rx_count = nsh->len + (nsh->len & 0x0001); info->rx_count = nsh->len + (nsh->len & 0x0001);
break; break;
case RECV_WAIT_DATA: case RECV_WAIT_DATA:
bt_cb(info->rx_skb)->pkt_type = nsh->type; hci_skb_pkt_type(info->rx_skb) = nsh->type;
/* remove PAD byte if it exists */ /* remove PAD byte if it exists */
if (nsh->len & 0x0001) { if (nsh->len & 0x0001) {
...@@ -250,7 +250,7 @@ static void dtl1_receive(struct dtl1_info *info) ...@@ -250,7 +250,7 @@ static void dtl1_receive(struct dtl1_info *info)
/* remove NSH */ /* remove NSH */
skb_pull(info->rx_skb, NSHL); skb_pull(info->rx_skb, NSHL);
switch (bt_cb(info->rx_skb)->pkt_type) { switch (hci_skb_pkt_type(info->rx_skb)) {
case 0x80: case 0x80:
/* control data for the Nokia Card */ /* control data for the Nokia Card */
dtl1_control(info, info->rx_skb); dtl1_control(info, info->rx_skb);
...@@ -259,12 +259,13 @@ static void dtl1_receive(struct dtl1_info *info) ...@@ -259,12 +259,13 @@ static void dtl1_receive(struct dtl1_info *info)
case 0x83: case 0x83:
case 0x84: case 0x84:
/* send frame to the HCI layer */ /* send frame to the HCI layer */
bt_cb(info->rx_skb)->pkt_type &= 0x0f; hci_skb_pkt_type(info->rx_skb) &= 0x0f;
hci_recv_frame(info->hdev, info->rx_skb); hci_recv_frame(info->hdev, info->rx_skb);
break; break;
default: default:
/* unknown packet */ /* unknown packet */
BT_ERR("Unknown HCI packet with type 0x%02x received", bt_cb(info->rx_skb)->pkt_type); BT_ERR("Unknown HCI packet with type 0x%02x received",
hci_skb_pkt_type(info->rx_skb));
kfree_skb(info->rx_skb); kfree_skb(info->rx_skb);
break; break;
} }
...@@ -386,7 +387,7 @@ static int dtl1_hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -386,7 +387,7 @@ static int dtl1_hci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
struct sk_buff *s; struct sk_buff *s;
struct nsh nsh; struct nsh nsh;
switch (bt_cb(skb)->pkt_type) { switch (hci_skb_pkt_type(skb)) {
case HCI_COMMAND_PKT: case HCI_COMMAND_PKT:
hdev->stat.cmd_tx++; hdev->stat.cmd_tx++;
nsh.type = 0x81; nsh.type = 0x81;
......
...@@ -205,7 +205,7 @@ static int ath_enqueue(struct hci_uart *hu, struct sk_buff *skb) ...@@ -205,7 +205,7 @@ static int ath_enqueue(struct hci_uart *hu, struct sk_buff *skb)
{ {
struct ath_struct *ath = hu->priv; struct ath_struct *ath = hu->priv;
if (bt_cb(skb)->pkt_type == HCI_SCODATA_PKT) { if (hci_skb_pkt_type(skb) == HCI_SCODATA_PKT) {
kfree_skb(skb); kfree_skb(skb);
return 0; return 0;
} }
...@@ -213,7 +213,7 @@ static int ath_enqueue(struct hci_uart *hu, struct sk_buff *skb) ...@@ -213,7 +213,7 @@ static int ath_enqueue(struct hci_uart *hu, struct sk_buff *skb)
/* Update power management enable flag with parameters of /* Update power management enable flag with parameters of
* HCI sleep enable vendor specific HCI command. * HCI sleep enable vendor specific HCI command.
*/ */
if (bt_cb(skb)->pkt_type == HCI_COMMAND_PKT) { if (hci_skb_pkt_type(skb) == HCI_COMMAND_PKT) {
struct hci_command_hdr *hdr = (void *)skb->data; struct hci_command_hdr *hdr = (void *)skb->data;
if (__le16_to_cpu(hdr->opcode) == HCI_OP_ATH_SLEEP) if (__le16_to_cpu(hdr->opcode) == HCI_OP_ATH_SLEEP)
...@@ -223,7 +223,7 @@ static int ath_enqueue(struct hci_uart *hu, struct sk_buff *skb) ...@@ -223,7 +223,7 @@ static int ath_enqueue(struct hci_uart *hu, struct sk_buff *skb)
BT_DBG("hu %p skb %p", hu, skb); BT_DBG("hu %p skb %p", hu, skb);
/* Prepend skb with frame type */ /* Prepend skb with frame type */
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1);
skb_queue_tail(&ath->txq, skb); skb_queue_tail(&ath->txq, skb);
set_bit(HCI_UART_SENDING, &hu->tx_state); set_bit(HCI_UART_SENDING, &hu->tx_state);
......
...@@ -472,7 +472,7 @@ static int bcm_enqueue(struct hci_uart *hu, struct sk_buff *skb) ...@@ -472,7 +472,7 @@ static int bcm_enqueue(struct hci_uart *hu, struct sk_buff *skb)
bt_dev_dbg(hu->hdev, "hu %p skb %p", hu, skb); bt_dev_dbg(hu->hdev, "hu %p skb %p", hu, skb);
/* Prepend skb with frame type */ /* Prepend skb with frame type */
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1);
skb_queue_tail(&bcm->txq, skb); skb_queue_tail(&bcm->txq, skb);
return 0; return 0;
......
...@@ -155,7 +155,7 @@ static int bcsp_enqueue(struct hci_uart *hu, struct sk_buff *skb) ...@@ -155,7 +155,7 @@ static int bcsp_enqueue(struct hci_uart *hu, struct sk_buff *skb)
return 0; return 0;
} }
switch (bt_cb(skb)->pkt_type) { switch (hci_skb_pkt_type(skb)) {
case HCI_ACLDATA_PKT: case HCI_ACLDATA_PKT:
case HCI_COMMAND_PKT: case HCI_COMMAND_PKT:
skb_queue_tail(&bcsp->rel, skb); skb_queue_tail(&bcsp->rel, skb);
...@@ -231,7 +231,7 @@ static struct sk_buff *bcsp_prepare_pkt(struct bcsp_struct *bcsp, u8 *data, ...@@ -231,7 +231,7 @@ static struct sk_buff *bcsp_prepare_pkt(struct bcsp_struct *bcsp, u8 *data,
if (!nskb) if (!nskb)
return NULL; return NULL;
bt_cb(nskb)->pkt_type = pkt_type; hci_skb_pkt_type(nskb) = pkt_type;
bcsp_slip_msgdelim(nskb); bcsp_slip_msgdelim(nskb);
...@@ -291,7 +291,10 @@ static struct sk_buff *bcsp_dequeue(struct hci_uart *hu) ...@@ -291,7 +291,10 @@ static struct sk_buff *bcsp_dequeue(struct hci_uart *hu)
skb = skb_dequeue(&bcsp->unrel); skb = skb_dequeue(&bcsp->unrel);
if (skb != NULL) { if (skb != NULL) {
struct sk_buff *nskb = bcsp_prepare_pkt(bcsp, skb->data, skb->len, bt_cb(skb)->pkt_type); struct sk_buff *nskb;
nskb = bcsp_prepare_pkt(bcsp, skb->data, skb->len,
hci_skb_pkt_type(skb));
if (nskb) { if (nskb) {
kfree_skb(skb); kfree_skb(skb);
return nskb; return nskb;
...@@ -310,8 +313,10 @@ static struct sk_buff *bcsp_dequeue(struct hci_uart *hu) ...@@ -310,8 +313,10 @@ static struct sk_buff *bcsp_dequeue(struct hci_uart *hu)
if (bcsp->unack.qlen < BCSP_TXWINSIZE) { if (bcsp->unack.qlen < BCSP_TXWINSIZE) {
skb = skb_dequeue(&bcsp->rel); skb = skb_dequeue(&bcsp->rel);
if (skb != NULL) { if (skb != NULL) {
struct sk_buff *nskb = bcsp_prepare_pkt(bcsp, skb->data, skb->len, struct sk_buff *nskb;
bt_cb(skb)->pkt_type);
nskb = bcsp_prepare_pkt(bcsp, skb->data, skb->len,
hci_skb_pkt_type(skb));
if (nskb) { if (nskb) {
__skb_queue_tail(&bcsp->unack, skb); __skb_queue_tail(&bcsp->unack, skb);
mod_timer(&bcsp->tbcsp, jiffies + HZ / 4); mod_timer(&bcsp->tbcsp, jiffies + HZ / 4);
...@@ -412,7 +417,7 @@ static void bcsp_handle_le_pkt(struct hci_uart *hu) ...@@ -412,7 +417,7 @@ static void bcsp_handle_le_pkt(struct hci_uart *hu)
if (!nskb) if (!nskb)
return; return;
memcpy(skb_put(nskb, 4), conf_rsp_pkt, 4); memcpy(skb_put(nskb, 4), conf_rsp_pkt, 4);
bt_cb(nskb)->pkt_type = BCSP_LE_PKT; hci_skb_pkt_type(nskb) = BCSP_LE_PKT;
skb_queue_head(&bcsp->unrel, nskb); skb_queue_head(&bcsp->unrel, nskb);
hci_uart_tx_wakeup(hu); hci_uart_tx_wakeup(hu);
...@@ -494,14 +499,14 @@ static void bcsp_complete_rx_pkt(struct hci_uart *hu) ...@@ -494,14 +499,14 @@ static void bcsp_complete_rx_pkt(struct hci_uart *hu)
bcsp_pkt_cull(bcsp); bcsp_pkt_cull(bcsp);
if ((bcsp->rx_skb->data[1] & 0x0f) == 6 && if ((bcsp->rx_skb->data[1] & 0x0f) == 6 &&
bcsp->rx_skb->data[0] & 0x80) { bcsp->rx_skb->data[0] & 0x80) {
bt_cb(bcsp->rx_skb)->pkt_type = HCI_ACLDATA_PKT; hci_skb_pkt_type(bcsp->rx_skb) = HCI_ACLDATA_PKT;
pass_up = 1; pass_up = 1;
} else if ((bcsp->rx_skb->data[1] & 0x0f) == 5 && } else if ((bcsp->rx_skb->data[1] & 0x0f) == 5 &&
bcsp->rx_skb->data[0] & 0x80) { bcsp->rx_skb->data[0] & 0x80) {
bt_cb(bcsp->rx_skb)->pkt_type = HCI_EVENT_PKT; hci_skb_pkt_type(bcsp->rx_skb) = HCI_EVENT_PKT;
pass_up = 1; pass_up = 1;
} else if ((bcsp->rx_skb->data[1] & 0x0f) == 7) { } else if ((bcsp->rx_skb->data[1] & 0x0f) == 7) {
bt_cb(bcsp->rx_skb)->pkt_type = HCI_SCODATA_PKT; hci_skb_pkt_type(bcsp->rx_skb) = HCI_SCODATA_PKT;
pass_up = 1; pass_up = 1;
} else if ((bcsp->rx_skb->data[1] & 0x0f) == 1 && } else if ((bcsp->rx_skb->data[1] & 0x0f) == 1 &&
!(bcsp->rx_skb->data[0] & 0x80)) { !(bcsp->rx_skb->data[0] & 0x80)) {
...@@ -523,7 +528,7 @@ static void bcsp_complete_rx_pkt(struct hci_uart *hu) ...@@ -523,7 +528,7 @@ static void bcsp_complete_rx_pkt(struct hci_uart *hu)
hdr.evt = 0xff; hdr.evt = 0xff;
hdr.plen = bcsp->rx_skb->len; hdr.plen = bcsp->rx_skb->len;
memcpy(skb_push(bcsp->rx_skb, HCI_EVENT_HDR_SIZE), &hdr, HCI_EVENT_HDR_SIZE); memcpy(skb_push(bcsp->rx_skb, HCI_EVENT_HDR_SIZE), &hdr, HCI_EVENT_HDR_SIZE);
bt_cb(bcsp->rx_skb)->pkt_type = HCI_EVENT_PKT; hci_skb_pkt_type(bcsp->rx_skb) = HCI_EVENT_PKT;
hci_recv_frame(hu->hdev, bcsp->rx_skb); hci_recv_frame(hu->hdev, bcsp->rx_skb);
} else { } else {
......
...@@ -108,7 +108,7 @@ static int h4_enqueue(struct hci_uart *hu, struct sk_buff *skb) ...@@ -108,7 +108,7 @@ static int h4_enqueue(struct hci_uart *hu, struct sk_buff *skb)
BT_DBG("hu %p skb %p", hu, skb); BT_DBG("hu %p skb %p", hu, skb);
/* Prepend skb with frame type */ /* Prepend skb with frame type */
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1);
skb_queue_tail(&h4->txq, skb); skb_queue_tail(&h4->txq, skb);
return 0; return 0;
...@@ -184,8 +184,8 @@ struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb, ...@@ -184,8 +184,8 @@ struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb,
if (!skb) if (!skb)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
bt_cb(skb)->pkt_type = (&pkts[i])->type; hci_skb_pkt_type(skb) = (&pkts[i])->type;
bt_cb(skb)->expect = (&pkts[i])->hlen; hci_skb_expect(skb) = (&pkts[i])->hlen;
break; break;
} }
...@@ -197,18 +197,18 @@ struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb, ...@@ -197,18 +197,18 @@ struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb,
buffer += 1; buffer += 1;
} }
len = min_t(uint, bt_cb(skb)->expect - skb->len, count); len = min_t(uint, hci_skb_expect(skb) - skb->len, count);
memcpy(skb_put(skb, len), buffer, len); memcpy(skb_put(skb, len), buffer, len);
count -= len; count -= len;
buffer += len; buffer += len;
/* Check for partial packet */ /* Check for partial packet */
if (skb->len < bt_cb(skb)->expect) if (skb->len < hci_skb_expect(skb))
continue; continue;
for (i = 0; i < pkts_count; i++) { for (i = 0; i < pkts_count; i++) {
if (bt_cb(skb)->pkt_type == (&pkts[i])->type) if (hci_skb_pkt_type(skb) == (&pkts[i])->type)
break; break;
} }
...@@ -228,7 +228,7 @@ struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb, ...@@ -228,7 +228,7 @@ struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb,
case 1: case 1:
/* Single octet variable length */ /* Single octet variable length */
dlen = skb->data[(&pkts[i])->loff]; dlen = skb->data[(&pkts[i])->loff];
bt_cb(skb)->expect += dlen; hci_skb_expect(skb) += dlen;
if (skb_tailroom(skb) < dlen) { if (skb_tailroom(skb) < dlen) {
kfree_skb(skb); kfree_skb(skb);
...@@ -239,7 +239,7 @@ struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb, ...@@ -239,7 +239,7 @@ struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb,
/* Double octet variable length */ /* Double octet variable length */
dlen = get_unaligned_le16(skb->data + dlen = get_unaligned_le16(skb->data +
(&pkts[i])->loff); (&pkts[i])->loff);
bt_cb(skb)->expect += dlen; hci_skb_expect(skb) += dlen;
if (skb_tailroom(skb) < dlen) { if (skb_tailroom(skb) < dlen) {
kfree_skb(skb); kfree_skb(skb);
......
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
#define H5_HDR_CRC(hdr) (((hdr)[0] >> 6) & 0x01) #define H5_HDR_CRC(hdr) (((hdr)[0] >> 6) & 0x01)
#define H5_HDR_RELIABLE(hdr) (((hdr)[0] >> 7) & 0x01) #define H5_HDR_RELIABLE(hdr) (((hdr)[0] >> 7) & 0x01)
#define H5_HDR_PKT_TYPE(hdr) ((hdr)[1] & 0x0f) #define H5_HDR_PKT_TYPE(hdr) ((hdr)[1] & 0x0f)
#define H5_HDR_LEN(hdr) ((((hdr)[1] >> 4) & 0xff) + ((hdr)[2] << 4)) #define H5_HDR_LEN(hdr) ((((hdr)[1] >> 4) & 0x0f) + ((hdr)[2] << 4))
#define SLIP_DELIMITER 0xc0 #define SLIP_DELIMITER 0xc0
#define SLIP_ESC 0xdb #define SLIP_ESC 0xdb
...@@ -107,7 +107,7 @@ static void h5_link_control(struct hci_uart *hu, const void *data, size_t len) ...@@ -107,7 +107,7 @@ static void h5_link_control(struct hci_uart *hu, const void *data, size_t len)
if (!nskb) if (!nskb)
return; return;
bt_cb(nskb)->pkt_type = HCI_3WIRE_LINK_PKT; hci_skb_pkt_type(nskb) = HCI_3WIRE_LINK_PKT;
memcpy(skb_put(nskb, len), data, len); memcpy(skb_put(nskb, len), data, len);
...@@ -119,7 +119,7 @@ static u8 h5_cfg_field(struct h5 *h5) ...@@ -119,7 +119,7 @@ static u8 h5_cfg_field(struct h5 *h5)
u8 field = 0; u8 field = 0;
/* Sliding window size (first 3 bits) */ /* Sliding window size (first 3 bits) */
field |= (h5->tx_win & 7); field |= (h5->tx_win & 0x07);
return field; return field;
} }
...@@ -360,7 +360,7 @@ static void h5_complete_rx_pkt(struct hci_uart *hu) ...@@ -360,7 +360,7 @@ static void h5_complete_rx_pkt(struct hci_uart *hu)
case HCI_EVENT_PKT: case HCI_EVENT_PKT:
case HCI_ACLDATA_PKT: case HCI_ACLDATA_PKT:
case HCI_SCODATA_PKT: case HCI_SCODATA_PKT:
bt_cb(h5->rx_skb)->pkt_type = H5_HDR_PKT_TYPE(hdr); hci_skb_pkt_type(h5->rx_skb) = H5_HDR_PKT_TYPE(hdr);
/* Remove Three-wire header */ /* Remove Three-wire header */
skb_pull(h5->rx_skb, 4); skb_pull(h5->rx_skb, 4);
...@@ -562,7 +562,7 @@ static int h5_enqueue(struct hci_uart *hu, struct sk_buff *skb) ...@@ -562,7 +562,7 @@ static int h5_enqueue(struct hci_uart *hu, struct sk_buff *skb)
return 0; return 0;
} }
switch (bt_cb(skb)->pkt_type) { switch (hci_skb_pkt_type(skb)) {
case HCI_ACLDATA_PKT: case HCI_ACLDATA_PKT:
case HCI_COMMAND_PKT: case HCI_COMMAND_PKT:
skb_queue_tail(&h5->rel, skb); skb_queue_tail(&h5->rel, skb);
...@@ -573,7 +573,7 @@ static int h5_enqueue(struct hci_uart *hu, struct sk_buff *skb) ...@@ -573,7 +573,7 @@ static int h5_enqueue(struct hci_uart *hu, struct sk_buff *skb)
break; break;
default: default:
BT_ERR("Unknown packet type %u", bt_cb(skb)->pkt_type); BT_ERR("Unknown packet type %u", hci_skb_pkt_type(skb));
kfree_skb(skb); kfree_skb(skb);
break; break;
} }
...@@ -642,7 +642,7 @@ static struct sk_buff *h5_prepare_pkt(struct hci_uart *hu, u8 pkt_type, ...@@ -642,7 +642,7 @@ static struct sk_buff *h5_prepare_pkt(struct hci_uart *hu, u8 pkt_type,
if (!nskb) if (!nskb)
return NULL; return NULL;
bt_cb(nskb)->pkt_type = pkt_type; hci_skb_pkt_type(nskb) = pkt_type;
h5_slip_delim(nskb); h5_slip_delim(nskb);
...@@ -697,7 +697,7 @@ static struct sk_buff *h5_dequeue(struct hci_uart *hu) ...@@ -697,7 +697,7 @@ static struct sk_buff *h5_dequeue(struct hci_uart *hu)
skb = skb_dequeue(&h5->unrel); skb = skb_dequeue(&h5->unrel);
if (skb) { if (skb) {
nskb = h5_prepare_pkt(hu, bt_cb(skb)->pkt_type, nskb = h5_prepare_pkt(hu, hci_skb_pkt_type(skb),
skb->data, skb->len); skb->data, skb->len);
if (nskb) { if (nskb) {
kfree_skb(skb); kfree_skb(skb);
...@@ -715,7 +715,7 @@ static struct sk_buff *h5_dequeue(struct hci_uart *hu) ...@@ -715,7 +715,7 @@ static struct sk_buff *h5_dequeue(struct hci_uart *hu)
skb = skb_dequeue(&h5->rel); skb = skb_dequeue(&h5->rel);
if (skb) { if (skb) {
nskb = h5_prepare_pkt(hu, bt_cb(skb)->pkt_type, nskb = h5_prepare_pkt(hu, hci_skb_pkt_type(skb),
skb->data, skb->len); skb->data, skb->len);
if (nskb) { if (nskb) {
__skb_queue_tail(&h5->unack, skb); __skb_queue_tail(&h5->unack, skb);
......
...@@ -186,7 +186,7 @@ static int intel_lpm_suspend(struct hci_uart *hu) ...@@ -186,7 +186,7 @@ static int intel_lpm_suspend(struct hci_uart *hu)
} }
memcpy(skb_put(skb, sizeof(suspend)), suspend, sizeof(suspend)); memcpy(skb_put(skb, sizeof(suspend)), suspend, sizeof(suspend));
bt_cb(skb)->pkt_type = HCI_LPM_PKT; hci_skb_pkt_type(skb) = HCI_LPM_PKT;
set_bit(STATE_LPM_TRANSACTION, &intel->flags); set_bit(STATE_LPM_TRANSACTION, &intel->flags);
...@@ -230,7 +230,7 @@ static int intel_lpm_resume(struct hci_uart *hu) ...@@ -230,7 +230,7 @@ static int intel_lpm_resume(struct hci_uart *hu)
return -ENOMEM; return -ENOMEM;
} }
bt_cb(skb)->pkt_type = HCI_LPM_WAKE_PKT; hci_skb_pkt_type(skb) = HCI_LPM_WAKE_PKT;
set_bit(STATE_LPM_TRANSACTION, &intel->flags); set_bit(STATE_LPM_TRANSACTION, &intel->flags);
...@@ -272,7 +272,7 @@ static int intel_lpm_host_wake(struct hci_uart *hu) ...@@ -272,7 +272,7 @@ static int intel_lpm_host_wake(struct hci_uart *hu)
memcpy(skb_put(skb, sizeof(lpm_resume_ack)), lpm_resume_ack, memcpy(skb_put(skb, sizeof(lpm_resume_ack)), lpm_resume_ack,
sizeof(lpm_resume_ack)); sizeof(lpm_resume_ack));
bt_cb(skb)->pkt_type = HCI_LPM_PKT; hci_skb_pkt_type(skb) = HCI_LPM_PKT;
/* LPM flow is a priority, enqueue packet at list head */ /* LPM flow is a priority, enqueue packet at list head */
skb_queue_head(&intel->txq, skb); skb_queue_head(&intel->txq, skb);
...@@ -467,7 +467,7 @@ static int inject_cmd_complete(struct hci_dev *hdev, __u16 opcode) ...@@ -467,7 +467,7 @@ static int inject_cmd_complete(struct hci_dev *hdev, __u16 opcode)
*skb_put(skb, 1) = 0x00; *skb_put(skb, 1) = 0x00;
bt_cb(skb)->pkt_type = HCI_EVENT_PKT; hci_skb_pkt_type(skb) = HCI_EVENT_PKT;
return hci_recv_frame(hdev, skb); return hci_recv_frame(hdev, skb);
} }
...@@ -517,7 +517,7 @@ static int intel_set_baudrate(struct hci_uart *hu, unsigned int speed) ...@@ -517,7 +517,7 @@ static int intel_set_baudrate(struct hci_uart *hu, unsigned int speed)
} }
memcpy(skb_put(skb, sizeof(speed_cmd)), speed_cmd, sizeof(speed_cmd)); memcpy(skb_put(skb, sizeof(speed_cmd)), speed_cmd, sizeof(speed_cmd));
bt_cb(skb)->pkt_type = HCI_COMMAND_PKT; hci_skb_pkt_type(skb) = HCI_COMMAND_PKT;
hci_uart_set_flow_control(hu, true); hci_uart_set_flow_control(hu, true);
...@@ -1126,7 +1126,7 @@ static struct sk_buff *intel_dequeue(struct hci_uart *hu) ...@@ -1126,7 +1126,7 @@ static struct sk_buff *intel_dequeue(struct hci_uart *hu)
return skb; return skb;
if (test_bit(STATE_BOOTLOADER, &intel->flags) && if (test_bit(STATE_BOOTLOADER, &intel->flags) &&
(bt_cb(skb)->pkt_type == HCI_COMMAND_PKT)) { (hci_skb_pkt_type(skb) == HCI_COMMAND_PKT)) {
struct hci_command_hdr *cmd = (void *)skb->data; struct hci_command_hdr *cmd = (void *)skb->data;
__u16 opcode = le16_to_cpu(cmd->opcode); __u16 opcode = le16_to_cpu(cmd->opcode);
...@@ -1140,7 +1140,7 @@ static struct sk_buff *intel_dequeue(struct hci_uart *hu) ...@@ -1140,7 +1140,7 @@ static struct sk_buff *intel_dequeue(struct hci_uart *hu)
} }
/* Prepend skb with frame type */ /* Prepend skb with frame type */
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1);
return skb; return skb;
} }
......
...@@ -162,7 +162,7 @@ static void hci_uart_write_work(struct work_struct *work) ...@@ -162,7 +162,7 @@ static void hci_uart_write_work(struct work_struct *work)
break; break;
} }
hci_uart_tx_complete(hu, bt_cb(skb)->pkt_type); hci_uart_tx_complete(hu, hci_skb_pkt_type(skb));
kfree_skb(skb); kfree_skb(skb);
} }
...@@ -248,7 +248,8 @@ static int hci_uart_send_frame(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -248,7 +248,8 @@ static int hci_uart_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
{ {
struct hci_uart *hu = hci_get_drvdata(hdev); struct hci_uart *hu = hci_get_drvdata(hdev);
BT_DBG("%s: type %d len %d", hdev->name, bt_cb(skb)->pkt_type, skb->len); BT_DBG("%s: type %d len %d", hdev->name, hci_skb_pkt_type(skb),
skb->len);
hu->proto->enqueue(hu, skb); hu->proto->enqueue(hu, skb);
......
...@@ -307,7 +307,7 @@ static int ll_enqueue(struct hci_uart *hu, struct sk_buff *skb) ...@@ -307,7 +307,7 @@ static int ll_enqueue(struct hci_uart *hu, struct sk_buff *skb)
BT_DBG("hu %p skb %p", hu, skb); BT_DBG("hu %p skb %p", hu, skb);
/* Prepend skb with frame type */ /* Prepend skb with frame type */
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1);
/* lock hcill state */ /* lock hcill state */
spin_lock_irqsave(&ll->hcill_lock, flags); spin_lock_irqsave(&ll->hcill_lock, flags);
...@@ -493,7 +493,7 @@ static int ll_recv(struct hci_uart *hu, const void *data, int count) ...@@ -493,7 +493,7 @@ static int ll_recv(struct hci_uart *hu, const void *data, int count)
return -ENOMEM; return -ENOMEM;
} }
bt_cb(ll->rx_skb)->pkt_type = type; hci_skb_pkt_type(ll->rx_skb) = type;
} }
return count; return count;
......
...@@ -678,7 +678,7 @@ static int qca_enqueue(struct hci_uart *hu, struct sk_buff *skb) ...@@ -678,7 +678,7 @@ static int qca_enqueue(struct hci_uart *hu, struct sk_buff *skb)
qca->tx_ibs_state); qca->tx_ibs_state);
/* Prepend skb with frame type */ /* Prepend skb with frame type */
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1);
/* Don't go to sleep in middle of patch download or /* Don't go to sleep in middle of patch download or
* Out-Of-Band(GPIOs control) sleep is selected. * Out-Of-Band(GPIOs control) sleep is selected.
...@@ -873,7 +873,7 @@ static int qca_set_baudrate(struct hci_dev *hdev, uint8_t baudrate) ...@@ -873,7 +873,7 @@ static int qca_set_baudrate(struct hci_dev *hdev, uint8_t baudrate)
/* Assign commands to change baudrate and packet type. */ /* Assign commands to change baudrate and packet type. */
memcpy(skb_put(skb, sizeof(cmd)), cmd, sizeof(cmd)); memcpy(skb_put(skb, sizeof(cmd)), cmd, sizeof(cmd));
bt_cb(skb)->pkt_type = HCI_COMMAND_PKT; hci_skb_pkt_type(skb) = HCI_COMMAND_PKT;
skb_queue_tail(&qca->txq, skb); skb_queue_tail(&qca->txq, skb);
hci_uart_tx_wakeup(hu); hci_uart_tx_wakeup(hu);
......
...@@ -80,7 +80,7 @@ static int vhci_send_frame(struct hci_dev *hdev, struct sk_buff *skb) ...@@ -80,7 +80,7 @@ static int vhci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
{ {
struct vhci_data *data = hci_get_drvdata(hdev); struct vhci_data *data = hci_get_drvdata(hdev);
memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1);
skb_queue_tail(&data->readq, skb); skb_queue_tail(&data->readq, skb);
wake_up_interruptible(&data->read_wait); wake_up_interruptible(&data->read_wait);
...@@ -140,7 +140,7 @@ static int vhci_create_device(struct vhci_data *data, __u8 opcode) ...@@ -140,7 +140,7 @@ static int vhci_create_device(struct vhci_data *data, __u8 opcode)
return -EBUSY; return -EBUSY;
} }
bt_cb(skb)->pkt_type = HCI_VENDOR_PKT; hci_skb_pkt_type(skb) = HCI_VENDOR_PKT;
*skb_put(skb, 1) = 0xff; *skb_put(skb, 1) = 0xff;
*skb_put(skb, 1) = opcode; *skb_put(skb, 1) = opcode;
...@@ -183,7 +183,7 @@ static inline ssize_t vhci_get_user(struct vhci_data *data, ...@@ -183,7 +183,7 @@ static inline ssize_t vhci_get_user(struct vhci_data *data,
return -ENODEV; return -ENODEV;
} }
bt_cb(skb)->pkt_type = pkt_type; hci_skb_pkt_type(skb) = pkt_type;
ret = hci_recv_frame(data->hdev, skb); ret = hci_recv_frame(data->hdev, skb);
break; break;
...@@ -234,7 +234,7 @@ static inline ssize_t vhci_put_user(struct vhci_data *data, ...@@ -234,7 +234,7 @@ static inline ssize_t vhci_put_user(struct vhci_data *data,
data->hdev->stat.byte_tx += len; data->hdev->stat.byte_tx += len;
switch (bt_cb(skb)->pkt_type) { switch (hci_skb_pkt_type(skb)) {
case HCI_COMMAND_PKT: case HCI_COMMAND_PKT:
data->hdev->stat.cmd_tx++; data->hdev->stat.cmd_tx++;
break; break;
......
...@@ -29,6 +29,8 @@ ...@@ -29,6 +29,8 @@
#include <net/sock.h> #include <net/sock.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#define BT_SUBSYS_VERSION "2.21"
#ifndef AF_BLUETOOTH #ifndef AF_BLUETOOTH
#define AF_BLUETOOTH 31 #define AF_BLUETOOTH 31
#define PF_BLUETOOTH AF_BLUETOOTH #define PF_BLUETOOTH AF_BLUETOOTH
...@@ -296,12 +298,17 @@ typedef void (*hci_req_complete_t)(struct hci_dev *hdev, u8 status, u16 opcode); ...@@ -296,12 +298,17 @@ typedef void (*hci_req_complete_t)(struct hci_dev *hdev, u8 status, u16 opcode);
typedef void (*hci_req_complete_skb_t)(struct hci_dev *hdev, u8 status, typedef void (*hci_req_complete_skb_t)(struct hci_dev *hdev, u8 status,
u16 opcode, struct sk_buff *skb); u16 opcode, struct sk_buff *skb);
#define HCI_REQ_START BIT(0)
#define HCI_REQ_SKB BIT(1)
struct hci_ctrl { struct hci_ctrl {
__u16 opcode; __u16 opcode;
bool req_start; u8 req_flags;
u8 req_event; u8 req_event;
hci_req_complete_t req_complete; union {
hci_req_complete_skb_t req_complete_skb; hci_req_complete_t req_complete;
hci_req_complete_skb_t req_complete_skb;
};
}; };
struct bt_skb_cb { struct bt_skb_cb {
...@@ -316,15 +323,17 @@ struct bt_skb_cb { ...@@ -316,15 +323,17 @@ struct bt_skb_cb {
}; };
#define bt_cb(skb) ((struct bt_skb_cb *)((skb)->cb)) #define bt_cb(skb) ((struct bt_skb_cb *)((skb)->cb))
#define hci_skb_pkt_type(skb) bt_cb((skb))->pkt_type
#define hci_skb_expect(skb) bt_cb((skb))->expect
#define hci_skb_opcode(skb) bt_cb((skb))->hci.opcode
static inline struct sk_buff *bt_skb_alloc(unsigned int len, gfp_t how) static inline struct sk_buff *bt_skb_alloc(unsigned int len, gfp_t how)
{ {
struct sk_buff *skb; struct sk_buff *skb;
skb = alloc_skb(len + BT_SKB_RESERVE, how); skb = alloc_skb(len + BT_SKB_RESERVE, how);
if (skb) { if (skb)
skb_reserve(skb, BT_SKB_RESERVE); skb_reserve(skb, BT_SKB_RESERVE);
bt_cb(skb)->incoming = 0;
}
return skb; return skb;
} }
...@@ -334,10 +343,8 @@ static inline struct sk_buff *bt_skb_send_alloc(struct sock *sk, ...@@ -334,10 +343,8 @@ static inline struct sk_buff *bt_skb_send_alloc(struct sock *sk,
struct sk_buff *skb; struct sk_buff *skb;
skb = sock_alloc_send_skb(sk, len + BT_SKB_RESERVE, nb, err); skb = sock_alloc_send_skb(sk, len + BT_SKB_RESERVE, nb, err);
if (skb) { if (skb)
skb_reserve(skb, BT_SKB_RESERVE); skb_reserve(skb, BT_SKB_RESERVE);
bt_cb(skb)->incoming = 0;
}
if (!skb && *err) if (!skb && *err)
return NULL; return NULL;
......
...@@ -452,7 +452,8 @@ enum { ...@@ -452,7 +452,8 @@ enum {
#define HCI_ERROR_REMOTE_POWER_OFF 0x15 #define HCI_ERROR_REMOTE_POWER_OFF 0x15
#define HCI_ERROR_LOCAL_HOST_TERM 0x16 #define HCI_ERROR_LOCAL_HOST_TERM 0x16
#define HCI_ERROR_PAIRING_NOT_ALLOWED 0x18 #define HCI_ERROR_PAIRING_NOT_ALLOWED 0x18
#define HCI_ERROR_INVALID_LL_PARAMS 0x1E #define HCI_ERROR_INVALID_LL_PARAMS 0x1e
#define HCI_ERROR_UNSPECIFIED 0x1f
#define HCI_ERROR_ADVERTISING_TIMEOUT 0x3c #define HCI_ERROR_ADVERTISING_TIMEOUT 0x3c
/* Flow control modes */ /* Flow control modes */
......
...@@ -327,6 +327,11 @@ struct hci_dev { ...@@ -327,6 +327,11 @@ struct hci_dev {
struct work_struct cmd_work; struct work_struct cmd_work;
struct work_struct tx_work; struct work_struct tx_work;
struct work_struct discov_update;
struct work_struct bg_scan_update;
struct delayed_work le_scan_disable;
struct delayed_work le_scan_restart;
struct sk_buff_head rx_q; struct sk_buff_head rx_q;
struct sk_buff_head raw_q; struct sk_buff_head raw_q;
struct sk_buff_head cmd_q; struct sk_buff_head cmd_q;
...@@ -370,9 +375,6 @@ struct hci_dev { ...@@ -370,9 +375,6 @@ struct hci_dev {
DECLARE_BITMAP(dev_flags, __HCI_NUM_FLAGS); DECLARE_BITMAP(dev_flags, __HCI_NUM_FLAGS);
struct delayed_work le_scan_disable;
struct delayed_work le_scan_restart;
__s8 adv_tx_power; __s8 adv_tx_power;
__u8 adv_data[HCI_MAX_AD_LENGTH]; __u8 adv_data[HCI_MAX_AD_LENGTH];
__u8 adv_data_len; __u8 adv_data_len;
...@@ -875,7 +877,7 @@ struct hci_chan *hci_chan_lookup_handle(struct hci_dev *hdev, __u16 handle); ...@@ -875,7 +877,7 @@ struct hci_chan *hci_chan_lookup_handle(struct hci_dev *hdev, __u16 handle);
struct hci_conn *hci_connect_le_scan(struct hci_dev *hdev, bdaddr_t *dst, struct hci_conn *hci_connect_le_scan(struct hci_dev *hdev, bdaddr_t *dst,
u8 dst_type, u8 sec_level, u8 dst_type, u8 sec_level,
u16 conn_timeout, u8 role); u16 conn_timeout);
struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst, struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
u8 dst_type, u8 sec_level, u16 conn_timeout, u8 dst_type, u8 sec_level, u16 conn_timeout,
u8 role); u8 role);
...@@ -1036,7 +1038,6 @@ struct hci_conn_params *hci_conn_params_lookup(struct hci_dev *hdev, ...@@ -1036,7 +1038,6 @@ struct hci_conn_params *hci_conn_params_lookup(struct hci_dev *hdev,
struct hci_conn_params *hci_conn_params_add(struct hci_dev *hdev, struct hci_conn_params *hci_conn_params_add(struct hci_dev *hdev,
bdaddr_t *addr, u8 addr_type); bdaddr_t *addr, u8 addr_type);
void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type); void hci_conn_params_del(struct hci_dev *hdev, bdaddr_t *addr, u8 addr_type);
void hci_conn_params_clear_all(struct hci_dev *hdev);
void hci_conn_params_clear_disabled(struct hci_dev *hdev); void hci_conn_params_clear_disabled(struct hci_dev *hdev);
struct hci_conn_params *hci_pend_le_action_lookup(struct list_head *list, struct hci_conn_params *hci_pend_le_action_lookup(struct list_head *list,
...@@ -1473,6 +1474,8 @@ void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status); ...@@ -1473,6 +1474,8 @@ void mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status);
void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class, void mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
u8 status); u8 status);
void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status); void mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status);
void mgmt_start_discovery_complete(struct hci_dev *hdev, u8 status);
void mgmt_stop_discovery_complete(struct hci_dev *hdev, u8 status);
void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, void mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
u8 addr_type, u8 *dev_class, s8 rssi, u32 flags, u8 addr_type, u8 *dev_class, s8 rssi, u32 flags,
u8 *eir, u16 eir_len, u8 *scan_rsp, u8 scan_rsp_len); u8 *eir, u16 eir_len, u8 *scan_rsp, u8 scan_rsp_len);
......
...@@ -43,6 +43,8 @@ struct hci_mon_hdr { ...@@ -43,6 +43,8 @@ struct hci_mon_hdr {
#define HCI_MON_CLOSE_INDEX 9 #define HCI_MON_CLOSE_INDEX 9
#define HCI_MON_INDEX_INFO 10 #define HCI_MON_INDEX_INFO 10
#define HCI_MON_VENDOR_DIAG 11 #define HCI_MON_VENDOR_DIAG 11
#define HCI_MON_SYSTEM_NOTE 12
#define HCI_MON_USER_LOGGING 13
struct hci_mon_new_index { struct hci_mon_new_index {
__u8 type; __u8 type;
......
...@@ -45,6 +45,7 @@ struct sockaddr_hci { ...@@ -45,6 +45,7 @@ struct sockaddr_hci {
#define HCI_CHANNEL_USER 1 #define HCI_CHANNEL_USER 1
#define HCI_CHANNEL_MONITOR 2 #define HCI_CHANNEL_MONITOR 2
#define HCI_CHANNEL_CONTROL 3 #define HCI_CHANNEL_CONTROL 3
#define HCI_CHANNEL_LOGGING 4
struct hci_filter { struct hci_filter {
unsigned long type_mask; unsigned long type_mask;
......
...@@ -571,6 +571,19 @@ struct mgmt_rp_remove_advertising { ...@@ -571,6 +571,19 @@ struct mgmt_rp_remove_advertising {
__u8 instance; __u8 instance;
} __packed; } __packed;
#define MGMT_OP_GET_ADV_SIZE_INFO 0x0040
struct mgmt_cp_get_adv_size_info {
__u8 instance;
__le32 flags;
} __packed;
#define MGMT_GET_ADV_SIZE_INFO_SIZE 5
struct mgmt_rp_get_adv_size_info {
__u8 instance;
__le32 flags;
__u8 max_adv_data_len;
__u8 max_scan_rsp_len;
} __packed;
#define MGMT_EV_CMD_COMPLETE 0x0001 #define MGMT_EV_CMD_COMPLETE 0x0001
struct mgmt_ev_cmd_complete { struct mgmt_ev_cmd_complete {
__le16 opcode; __le16 opcode;
......
...@@ -33,8 +33,6 @@ ...@@ -33,8 +33,6 @@
#include "selftest.h" #include "selftest.h"
#define VERSION "2.21"
/* Bluetooth sockets */ /* Bluetooth sockets */
#define BT_MAX_PROTO 8 #define BT_MAX_PROTO 8
static const struct net_proto_family *bt_proto[BT_MAX_PROTO]; static const struct net_proto_family *bt_proto[BT_MAX_PROTO];
...@@ -671,7 +669,7 @@ static const struct file_operations bt_fops = { ...@@ -671,7 +669,7 @@ static const struct file_operations bt_fops = {
}; };
int bt_procfs_init(struct net *net, const char *name, int bt_procfs_init(struct net *net, const char *name,
struct bt_sock_list* sk_list, struct bt_sock_list *sk_list,
int (* seq_show)(struct seq_file *, void *)) int (* seq_show)(struct seq_file *, void *))
{ {
sk_list->custom_seq_show = seq_show; sk_list->custom_seq_show = seq_show;
...@@ -687,7 +685,7 @@ void bt_procfs_cleanup(struct net *net, const char *name) ...@@ -687,7 +685,7 @@ void bt_procfs_cleanup(struct net *net, const char *name)
} }
#else #else
int bt_procfs_init(struct net *net, const char *name, int bt_procfs_init(struct net *net, const char *name,
struct bt_sock_list* sk_list, struct bt_sock_list *sk_list,
int (* seq_show)(struct seq_file *, void *)) int (* seq_show)(struct seq_file *, void *))
{ {
return 0; return 0;
...@@ -715,7 +713,7 @@ static int __init bt_init(void) ...@@ -715,7 +713,7 @@ static int __init bt_init(void)
sock_skb_cb_check_size(sizeof(struct bt_skb_cb)); sock_skb_cb_check_size(sizeof(struct bt_skb_cb));
BT_INFO("Core ver %s", VERSION); BT_INFO("Core ver %s", BT_SUBSYS_VERSION);
err = bt_selftest(); err = bt_selftest();
if (err < 0) if (err < 0)
...@@ -789,7 +787,7 @@ subsys_initcall(bt_init); ...@@ -789,7 +787,7 @@ subsys_initcall(bt_init);
module_exit(bt_exit); module_exit(bt_exit);
MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>"); MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
MODULE_DESCRIPTION("Bluetooth Core ver " VERSION); MODULE_DESCRIPTION("Bluetooth Core ver " BT_SUBSYS_VERSION);
MODULE_VERSION(VERSION); MODULE_VERSION(BT_SUBSYS_VERSION);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS_NETPROTO(PF_BLUETOOTH); MODULE_ALIAS_NETPROTO(PF_BLUETOOTH);
...@@ -178,8 +178,7 @@ static inline int cmtp_recv_frame(struct cmtp_session *session, struct sk_buff * ...@@ -178,8 +178,7 @@ static inline int cmtp_recv_frame(struct cmtp_session *session, struct sk_buff *
cmtp_add_msgpart(session, id, skb->data + hdrlen, len); cmtp_add_msgpart(session, id, skb->data + hdrlen, len);
break; break;
default: default:
if (session->reassembly[id] != NULL) kfree_skb(session->reassembly[id]);
kfree_skb(session->reassembly[id]);
session->reassembly[id] = NULL; session->reassembly[id] = NULL;
break; break;
} }
......
...@@ -178,6 +178,10 @@ static void hci_connect_le_scan_remove(struct hci_conn *conn) ...@@ -178,6 +178,10 @@ static void hci_connect_le_scan_remove(struct hci_conn *conn)
hci_dev_hold(conn->hdev); hci_dev_hold(conn->hdev);
hci_conn_get(conn); hci_conn_get(conn);
/* Even though we hold a reference to the hdev, many other
* things might get cleaned up meanwhile, including the hdev's
* own workqueue, so we can't use that for scheduling.
*/
schedule_work(&conn->le_scan_cleanup); schedule_work(&conn->le_scan_cleanup);
} }
...@@ -781,7 +785,7 @@ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst, ...@@ -781,7 +785,7 @@ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
u8 role) u8 role)
{ {
struct hci_conn_params *params; struct hci_conn_params *params;
struct hci_conn *conn, *conn_unfinished; struct hci_conn *conn;
struct smp_irk *irk; struct smp_irk *irk;
struct hci_request req; struct hci_request req;
int err; int err;
...@@ -794,35 +798,22 @@ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst, ...@@ -794,35 +798,22 @@ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
return ERR_PTR(-EOPNOTSUPP); return ERR_PTR(-EOPNOTSUPP);
} }
/* Some devices send ATT messages as soon as the physical link is
* established. To be able to handle these ATT messages, the user-
* space first establishes the connection and then starts the pairing
* process.
*
* So if a hci_conn object already exists for the following connection
* attempt, we simply update pending_sec_level and auth_type fields
* and return the object found.
*/
conn = hci_conn_hash_lookup_le(hdev, dst, dst_type);
conn_unfinished = NULL;
if (conn) {
if (conn->state == BT_CONNECT &&
test_bit(HCI_CONN_SCANNING, &conn->flags)) {
BT_DBG("will continue unfinished conn %pMR", dst);
conn_unfinished = conn;
} else {
if (conn->pending_sec_level < sec_level)
conn->pending_sec_level = sec_level;
goto done;
}
}
/* Since the controller supports only one LE connection attempt at a /* Since the controller supports only one LE connection attempt at a
* time, we return -EBUSY if there is any connection attempt running. * time, we return -EBUSY if there is any connection attempt running.
*/ */
if (hci_lookup_le_connect(hdev)) if (hci_lookup_le_connect(hdev))
return ERR_PTR(-EBUSY); return ERR_PTR(-EBUSY);
/* If there's already a connection object but it's not in
* scanning state it means it must already be established, in
* which case we can't do anything else except report a failure
* to connect.
*/
conn = hci_conn_hash_lookup_le(hdev, dst, dst_type);
if (conn && !test_bit(HCI_CONN_SCANNING, &conn->flags)) {
return ERR_PTR(-EBUSY);
}
/* When given an identity address with existing identity /* When given an identity address with existing identity
* resolving key, the connection needs to be established * resolving key, the connection needs to be established
* to a resolvable random address. * to a resolvable random address.
...@@ -838,23 +829,20 @@ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst, ...@@ -838,23 +829,20 @@ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
dst_type = ADDR_LE_DEV_RANDOM; dst_type = ADDR_LE_DEV_RANDOM;
} }
if (conn_unfinished) { if (conn) {
conn = conn_unfinished;
bacpy(&conn->dst, dst); bacpy(&conn->dst, dst);
} else { } else {
conn = hci_conn_add(hdev, LE_LINK, dst, role); conn = hci_conn_add(hdev, LE_LINK, dst, role);
if (!conn)
return ERR_PTR(-ENOMEM);
hci_conn_hold(conn);
conn->pending_sec_level = sec_level;
} }
if (!conn)
return ERR_PTR(-ENOMEM);
conn->dst_type = dst_type; conn->dst_type = dst_type;
conn->sec_level = BT_SECURITY_LOW; conn->sec_level = BT_SECURITY_LOW;
conn->conn_timeout = conn_timeout; conn->conn_timeout = conn_timeout;
if (!conn_unfinished)
conn->pending_sec_level = sec_level;
hci_req_init(&req, hdev); hci_req_init(&req, hdev);
/* Disable advertising if we're active. For master role /* Disable advertising if we're active. For master role
...@@ -918,37 +906,9 @@ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst, ...@@ -918,37 +906,9 @@ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
return ERR_PTR(err); return ERR_PTR(err);
} }
done:
/* If this is continuation of connect started by hci_connect_le_scan,
* it already called hci_conn_hold and calling it again would mess the
* counter.
*/
if (!conn_unfinished)
hci_conn_hold(conn);
return conn; return conn;
} }
static void hci_connect_le_scan_complete(struct hci_dev *hdev, u8 status,
u16 opcode)
{
struct hci_conn *conn;
if (!status)
return;
BT_ERR("Failed to add device to auto conn whitelist: status 0x%2.2x",
status);
hci_dev_lock(hdev);
conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
if (conn)
hci_le_conn_failed(conn, status);
hci_dev_unlock(hdev);
}
static bool is_connected(struct hci_dev *hdev, bdaddr_t *addr, u8 type) static bool is_connected(struct hci_dev *hdev, bdaddr_t *addr, u8 type)
{ {
struct hci_conn *conn; struct hci_conn *conn;
...@@ -964,10 +924,9 @@ static bool is_connected(struct hci_dev *hdev, bdaddr_t *addr, u8 type) ...@@ -964,10 +924,9 @@ static bool is_connected(struct hci_dev *hdev, bdaddr_t *addr, u8 type)
} }
/* This function requires the caller holds hdev->lock */ /* This function requires the caller holds hdev->lock */
static int hci_explicit_conn_params_set(struct hci_request *req, static int hci_explicit_conn_params_set(struct hci_dev *hdev,
bdaddr_t *addr, u8 addr_type) bdaddr_t *addr, u8 addr_type)
{ {
struct hci_dev *hdev = req->hdev;
struct hci_conn_params *params; struct hci_conn_params *params;
if (is_connected(hdev, addr, addr_type)) if (is_connected(hdev, addr, addr_type))
...@@ -995,7 +954,6 @@ static int hci_explicit_conn_params_set(struct hci_request *req, ...@@ -995,7 +954,6 @@ static int hci_explicit_conn_params_set(struct hci_request *req,
} }
params->explicit_connect = true; params->explicit_connect = true;
__hci_update_background_scan(req);
BT_DBG("addr %pMR (type %u) auto_connect %u", addr, addr_type, BT_DBG("addr %pMR (type %u) auto_connect %u", addr, addr_type,
params->auto_connect); params->auto_connect);
...@@ -1006,11 +964,9 @@ static int hci_explicit_conn_params_set(struct hci_request *req, ...@@ -1006,11 +964,9 @@ static int hci_explicit_conn_params_set(struct hci_request *req,
/* This function requires the caller holds hdev->lock */ /* This function requires the caller holds hdev->lock */
struct hci_conn *hci_connect_le_scan(struct hci_dev *hdev, bdaddr_t *dst, struct hci_conn *hci_connect_le_scan(struct hci_dev *hdev, bdaddr_t *dst,
u8 dst_type, u8 sec_level, u8 dst_type, u8 sec_level,
u16 conn_timeout, u8 role) u16 conn_timeout)
{ {
struct hci_conn *conn; struct hci_conn *conn;
struct hci_request req;
int err;
/* Let's make sure that le is enabled.*/ /* Let's make sure that le is enabled.*/
if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED)) { if (!hci_dev_test_flag(hdev, HCI_LE_ENABLED)) {
...@@ -1038,29 +994,22 @@ struct hci_conn *hci_connect_le_scan(struct hci_dev *hdev, bdaddr_t *dst, ...@@ -1038,29 +994,22 @@ struct hci_conn *hci_connect_le_scan(struct hci_dev *hdev, bdaddr_t *dst,
BT_DBG("requesting refresh of dst_addr"); BT_DBG("requesting refresh of dst_addr");
conn = hci_conn_add(hdev, LE_LINK, dst, role); conn = hci_conn_add(hdev, LE_LINK, dst, HCI_ROLE_MASTER);
if (!conn) if (!conn)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
hci_req_init(&req, hdev); if (hci_explicit_conn_params_set(hdev, dst, dst_type) < 0)
if (hci_explicit_conn_params_set(&req, dst, dst_type) < 0)
return ERR_PTR(-EBUSY); return ERR_PTR(-EBUSY);
conn->state = BT_CONNECT; conn->state = BT_CONNECT;
set_bit(HCI_CONN_SCANNING, &conn->flags); set_bit(HCI_CONN_SCANNING, &conn->flags);
err = hci_req_run(&req, hci_connect_le_scan_complete);
if (err && err != -ENODATA) {
hci_conn_del(conn);
return ERR_PTR(err);
}
conn->dst_type = dst_type; conn->dst_type = dst_type;
conn->sec_level = BT_SECURITY_LOW; conn->sec_level = BT_SECURITY_LOW;
conn->pending_sec_level = sec_level; conn->pending_sec_level = sec_level;
conn->conn_timeout = conn_timeout; conn->conn_timeout = conn_timeout;
hci_update_background_scan(hdev);
done: done:
hci_conn_hold(conn); hci_conn_hold(conn);
return conn; return conn;
......
This diff is collapsed.
This diff is collapsed.
...@@ -20,6 +20,9 @@ ...@@ -20,6 +20,9 @@
SOFTWARE IS DISCLAIMED. SOFTWARE IS DISCLAIMED.
*/ */
#define hci_req_sync_lock(hdev) mutex_lock(&hdev->req_lock)
#define hci_req_sync_unlock(hdev) mutex_unlock(&hdev->req_lock)
struct hci_request { struct hci_request {
struct hci_dev *hdev; struct hci_dev *hdev;
struct sk_buff_head cmd_q; struct sk_buff_head cmd_q;
...@@ -41,21 +44,37 @@ void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status, ...@@ -41,21 +44,37 @@ void hci_req_cmd_complete(struct hci_dev *hdev, u16 opcode, u8 status,
hci_req_complete_t *req_complete, hci_req_complete_t *req_complete,
hci_req_complete_skb_t *req_complete_skb); hci_req_complete_skb_t *req_complete_skb);
int hci_req_sync(struct hci_dev *hdev, int (*req)(struct hci_request *req,
unsigned long opt),
unsigned long opt, u32 timeout, u8 *hci_status);
int __hci_req_sync(struct hci_dev *hdev, int (*func)(struct hci_request *req,
unsigned long opt),
unsigned long opt, u32 timeout, u8 *hci_status);
void hci_req_sync_cancel(struct hci_dev *hdev, int err);
struct sk_buff *hci_prepare_cmd(struct hci_dev *hdev, u16 opcode, u32 plen, struct sk_buff *hci_prepare_cmd(struct hci_dev *hdev, u16 opcode, u32 plen,
const void *param); const void *param);
void hci_req_add_le_scan_disable(struct hci_request *req); void hci_req_add_le_scan_disable(struct hci_request *req);
void hci_req_add_le_passive_scan(struct hci_request *req); void hci_req_add_le_passive_scan(struct hci_request *req);
/* Returns true if HCI commands were queued */
bool hci_req_stop_discovery(struct hci_request *req);
void hci_update_page_scan(struct hci_dev *hdev); void hci_update_page_scan(struct hci_dev *hdev);
void __hci_update_page_scan(struct hci_request *req); void __hci_update_page_scan(struct hci_request *req);
int hci_update_random_address(struct hci_request *req, bool require_privacy, int hci_update_random_address(struct hci_request *req, bool require_privacy,
u8 *own_addr_type); u8 *own_addr_type);
void hci_update_background_scan(struct hci_dev *hdev);
void __hci_update_background_scan(struct hci_request *req);
int hci_abort_conn(struct hci_conn *conn, u8 reason); int hci_abort_conn(struct hci_conn *conn, u8 reason);
void __hci_abort_conn(struct hci_request *req, struct hci_conn *conn, void __hci_abort_conn(struct hci_request *req, struct hci_conn *conn,
u8 reason); u8 reason);
static inline void hci_update_background_scan(struct hci_dev *hdev)
{
queue_work(hdev->req_workqueue, &hdev->bg_scan_update);
}
void hci_request_setup(struct hci_dev *hdev);
void hci_request_cancel_all(struct hci_dev *hdev);
This diff is collapsed.
...@@ -6538,8 +6538,6 @@ static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control, ...@@ -6538,8 +6538,6 @@ static int l2cap_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control, static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
struct sk_buff *skb) struct sk_buff *skb)
{ {
int err = 0;
BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb, BT_DBG("chan %p, control %p, skb %p, state %d", chan, control, skb,
chan->rx_state); chan->rx_state);
...@@ -6570,7 +6568,7 @@ static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control, ...@@ -6570,7 +6568,7 @@ static int l2cap_stream_rx(struct l2cap_chan *chan, struct l2cap_ctrl *control,
chan->last_acked_seq = control->txseq; chan->last_acked_seq = control->txseq;
chan->expected_tx_seq = __next_seq(chan, control->txseq); chan->expected_tx_seq = __next_seq(chan, control->txseq);
return err; return 0;
} }
static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) static int l2cap_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb)
...@@ -7113,8 +7111,6 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, ...@@ -7113,8 +7111,6 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
chan->dcid = cid; chan->dcid = cid;
if (bdaddr_type_is_le(dst_type)) { if (bdaddr_type_is_le(dst_type)) {
u8 role;
/* Convert from L2CAP channel address type to HCI address type /* Convert from L2CAP channel address type to HCI address type
*/ */
if (dst_type == BDADDR_LE_PUBLIC) if (dst_type == BDADDR_LE_PUBLIC)
...@@ -7123,14 +7119,15 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid, ...@@ -7123,14 +7119,15 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
dst_type = ADDR_LE_DEV_RANDOM; dst_type = ADDR_LE_DEV_RANDOM;
if (hci_dev_test_flag(hdev, HCI_ADVERTISING)) if (hci_dev_test_flag(hdev, HCI_ADVERTISING))
role = HCI_ROLE_SLAVE; hcon = hci_connect_le(hdev, dst, dst_type,
chan->sec_level,
HCI_LE_CONN_TIMEOUT,
HCI_ROLE_SLAVE);
else else
role = HCI_ROLE_MASTER; hcon = hci_connect_le_scan(hdev, dst, dst_type,
chan->sec_level,
HCI_LE_CONN_TIMEOUT);
hcon = hci_connect_le_scan(hdev, dst, dst_type,
chan->sec_level,
HCI_LE_CONN_TIMEOUT,
role);
} else { } else {
u8 auth_type = l2cap_get_auth_type(chan); u8 auth_type = l2cap_get_auth_type(chan);
hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type); hcon = hci_connect_acl(hdev, dst, chan->sec_level, auth_type);
......
This diff is collapsed.
...@@ -217,8 +217,7 @@ __ieee802154_rx_handle_packet(struct ieee802154_local *local, ...@@ -217,8 +217,7 @@ __ieee802154_rx_handle_packet(struct ieee802154_local *local,
break; break;
} }
if (skb) kfree_skb(skb);
kfree_skb(skb);
} }
static void static void
......
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