Merge branch 'for-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth
This commit is contained in:
commit
b82c29d81d
|
@ -63,6 +63,7 @@ static struct usb_device_id ath3k_table[] = {
|
||||||
|
|
||||||
/* Atheros AR3011 with sflash firmware*/
|
/* Atheros AR3011 with sflash firmware*/
|
||||||
{ USB_DEVICE(0x0CF3, 0x3002) },
|
{ USB_DEVICE(0x0CF3, 0x3002) },
|
||||||
|
{ USB_DEVICE(0x0CF3, 0xE019) },
|
||||||
{ USB_DEVICE(0x13d3, 0x3304) },
|
{ USB_DEVICE(0x13d3, 0x3304) },
|
||||||
{ USB_DEVICE(0x0930, 0x0215) },
|
{ USB_DEVICE(0x0930, 0x0215) },
|
||||||
{ USB_DEVICE(0x0489, 0xE03D) },
|
{ USB_DEVICE(0x0489, 0xE03D) },
|
||||||
|
@ -77,6 +78,7 @@ static struct usb_device_id ath3k_table[] = {
|
||||||
{ USB_DEVICE(0x04CA, 0x3005) },
|
{ USB_DEVICE(0x04CA, 0x3005) },
|
||||||
{ USB_DEVICE(0x13d3, 0x3362) },
|
{ USB_DEVICE(0x13d3, 0x3362) },
|
||||||
{ USB_DEVICE(0x0CF3, 0xE004) },
|
{ USB_DEVICE(0x0CF3, 0xE004) },
|
||||||
|
{ USB_DEVICE(0x0930, 0x0219) },
|
||||||
|
|
||||||
/* Atheros AR5BBU12 with sflash firmware */
|
/* Atheros AR5BBU12 with sflash firmware */
|
||||||
{ USB_DEVICE(0x0489, 0xE02C) },
|
{ USB_DEVICE(0x0489, 0xE02C) },
|
||||||
|
@ -101,6 +103,7 @@ static struct usb_device_id ath3k_blist_tbl[] = {
|
||||||
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
|
||||||
|
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
||||||
|
|
||||||
/* Atheros AR5BBU22 with sflash firmware */
|
/* Atheros AR5BBU22 with sflash firmware */
|
||||||
{ USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0489, 0xE03C), .driver_info = BTUSB_ATH3012 },
|
||||||
|
|
|
@ -136,7 +136,7 @@ int btmrvl_remove_card(struct btmrvl_private *priv);
|
||||||
|
|
||||||
void btmrvl_interrupt(struct btmrvl_private *priv);
|
void btmrvl_interrupt(struct btmrvl_private *priv);
|
||||||
|
|
||||||
void btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb);
|
bool btmrvl_check_evtpkt(struct btmrvl_private *priv, struct sk_buff *skb);
|
||||||
int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb);
|
int btmrvl_process_event(struct btmrvl_private *priv, struct sk_buff *skb);
|
||||||
|
|
||||||
int btmrvl_send_module_cfg_cmd(struct btmrvl_private *priv, int subcmd);
|
int btmrvl_send_module_cfg_cmd(struct btmrvl_private *priv, int subcmd);
|
||||||
|
|
|
@ -44,23 +44,33 @@ void btmrvl_interrupt(struct btmrvl_private *priv)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(btmrvl_interrupt);
|
EXPORT_SYMBOL_GPL(btmrvl_interrupt);
|
||||||
|
|
||||||
void 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;
|
struct hci_ev_cmd_complete *ec;
|
||||||
u16 opcode, ocf;
|
u16 opcode, ocf, ogf;
|
||||||
|
|
||||||
if (hdr->evt == HCI_EV_CMD_COMPLETE) {
|
if (hdr->evt == HCI_EV_CMD_COMPLETE) {
|
||||||
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);
|
||||||
|
ogf = hci_opcode_ogf(opcode);
|
||||||
|
|
||||||
if (ocf == BT_CMD_MODULE_CFG_REQ &&
|
if (ocf == BT_CMD_MODULE_CFG_REQ &&
|
||||||
priv->btmrvl_dev.sendcmdflag) {
|
priv->btmrvl_dev.sendcmdflag) {
|
||||||
priv->btmrvl_dev.sendcmdflag = false;
|
priv->btmrvl_dev.sendcmdflag = false;
|
||||||
priv->adapter->cmd_complete = true;
|
priv->adapter->cmd_complete = true;
|
||||||
wake_up_interruptible(&priv->adapter->cmd_wait_q);
|
wake_up_interruptible(&priv->adapter->cmd_wait_q);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ogf == OGF) {
|
||||||
|
BT_DBG("vendor event skipped: ogf 0x%4.4x", ogf);
|
||||||
|
kfree_skb(skb);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(btmrvl_check_evtpkt);
|
EXPORT_SYMBOL_GPL(btmrvl_check_evtpkt);
|
||||||
|
|
||||||
|
|
|
@ -565,10 +565,12 @@ static int btmrvl_sdio_card_to_host(struct btmrvl_private *priv)
|
||||||
skb_put(skb, buf_len);
|
skb_put(skb, buf_len);
|
||||||
skb_pull(skb, SDIO_HEADER_LEN);
|
skb_pull(skb, SDIO_HEADER_LEN);
|
||||||
|
|
||||||
if (type == HCI_EVENT_PKT)
|
if (type == HCI_EVENT_PKT) {
|
||||||
btmrvl_check_evtpkt(priv, skb);
|
if (btmrvl_check_evtpkt(priv, skb))
|
||||||
|
hci_recv_frame(skb);
|
||||||
|
} else
|
||||||
|
hci_recv_frame(skb);
|
||||||
|
|
||||||
hci_recv_frame(skb);
|
|
||||||
hdev->stat.byte_rx += buf_len;
|
hdev->stat.byte_rx += buf_len;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -117,6 +117,7 @@ static struct usb_device_id blacklist_table[] = {
|
||||||
|
|
||||||
/* Atheros 3011 with sflash firmware */
|
/* Atheros 3011 with sflash firmware */
|
||||||
{ USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE },
|
{ USB_DEVICE(0x0cf3, 0x3002), .driver_info = BTUSB_IGNORE },
|
||||||
|
{ USB_DEVICE(0x0cf3, 0xe019), .driver_info = BTUSB_IGNORE },
|
||||||
{ USB_DEVICE(0x13d3, 0x3304), .driver_info = BTUSB_IGNORE },
|
{ USB_DEVICE(0x13d3, 0x3304), .driver_info = BTUSB_IGNORE },
|
||||||
{ USB_DEVICE(0x0930, 0x0215), .driver_info = BTUSB_IGNORE },
|
{ USB_DEVICE(0x0930, 0x0215), .driver_info = BTUSB_IGNORE },
|
||||||
{ USB_DEVICE(0x0489, 0xe03d), .driver_info = BTUSB_IGNORE },
|
{ USB_DEVICE(0x0489, 0xe03d), .driver_info = BTUSB_IGNORE },
|
||||||
|
@ -131,6 +132,7 @@ static struct usb_device_id blacklist_table[] = {
|
||||||
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
|
||||||
|
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
||||||
|
|
||||||
/* Atheros AR5BBU12 with sflash firmware */
|
/* Atheros AR5BBU12 with sflash firmware */
|
||||||
{ USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
|
{ USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
|
||||||
|
|
|
@ -3278,12 +3278,14 @@ static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len)
|
||||||
while (len >= L2CAP_CONF_OPT_SIZE) {
|
while (len >= L2CAP_CONF_OPT_SIZE) {
|
||||||
len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
|
len -= l2cap_get_conf_opt(&rsp, &type, &olen, &val);
|
||||||
|
|
||||||
switch (type) {
|
if (type != L2CAP_CONF_RFC)
|
||||||
case L2CAP_CONF_RFC:
|
continue;
|
||||||
if (olen == sizeof(rfc))
|
|
||||||
memcpy(&rfc, (void *)val, olen);
|
if (olen != sizeof(rfc))
|
||||||
goto done;
|
break;
|
||||||
}
|
|
||||||
|
memcpy(&rfc, (void *)val, olen);
|
||||||
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Use sane default values in case a misbehaving remote device
|
/* Use sane default values in case a misbehaving remote device
|
||||||
|
|
|
@ -1598,7 +1598,7 @@ static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
|
||||||
else
|
else
|
||||||
conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
|
conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
|
||||||
|
|
||||||
if (!conn) {
|
if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) {
|
||||||
err = cmd_status(sk, hdev->id, MGMT_OP_DISCONNECT,
|
err = cmd_status(sk, hdev->id, MGMT_OP_DISCONNECT,
|
||||||
MGMT_STATUS_NOT_CONNECTED);
|
MGMT_STATUS_NOT_CONNECTED);
|
||||||
goto failed;
|
goto failed;
|
||||||
|
|
Loading…
Reference in New Issue