Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth
This commit is contained in:
commit
7c6a4acc64
7 changed files with 42 additions and 40 deletions
|
@ -85,6 +85,7 @@ static struct usb_device_id ath3k_table[] = {
|
||||||
{ USB_DEVICE(0x04CA, 0x3008) },
|
{ USB_DEVICE(0x04CA, 0x3008) },
|
||||||
{ USB_DEVICE(0x13d3, 0x3362) },
|
{ USB_DEVICE(0x13d3, 0x3362) },
|
||||||
{ USB_DEVICE(0x0CF3, 0xE004) },
|
{ USB_DEVICE(0x0CF3, 0xE004) },
|
||||||
|
{ USB_DEVICE(0x0CF3, 0xE005) },
|
||||||
{ USB_DEVICE(0x0930, 0x0219) },
|
{ USB_DEVICE(0x0930, 0x0219) },
|
||||||
{ USB_DEVICE(0x0489, 0xe057) },
|
{ USB_DEVICE(0x0489, 0xe057) },
|
||||||
{ USB_DEVICE(0x13d3, 0x3393) },
|
{ USB_DEVICE(0x13d3, 0x3393) },
|
||||||
|
@ -126,6 +127,7 @@ static struct usb_device_id ath3k_blist_tbl[] = {
|
||||||
{ USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x04ca, 0x3008), .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(0x0cf3, 0xe005), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
|
||||||
|
|
|
@ -102,6 +102,7 @@ static struct usb_device_id btusb_table[] = {
|
||||||
|
|
||||||
/* Broadcom BCM20702A0 */
|
/* Broadcom BCM20702A0 */
|
||||||
{ USB_DEVICE(0x0b05, 0x17b5) },
|
{ USB_DEVICE(0x0b05, 0x17b5) },
|
||||||
|
{ USB_DEVICE(0x0b05, 0x17cb) },
|
||||||
{ USB_DEVICE(0x04ca, 0x2003) },
|
{ USB_DEVICE(0x04ca, 0x2003) },
|
||||||
{ USB_DEVICE(0x0489, 0xe042) },
|
{ USB_DEVICE(0x0489, 0xe042) },
|
||||||
{ USB_DEVICE(0x413c, 0x8197) },
|
{ USB_DEVICE(0x413c, 0x8197) },
|
||||||
|
@ -112,6 +113,9 @@ static struct usb_device_id btusb_table[] = {
|
||||||
/*Broadcom devices with vendor specific id */
|
/*Broadcom devices with vendor specific id */
|
||||||
{ USB_VENDOR_AND_INTERFACE_INFO(0x0a5c, 0xff, 0x01, 0x01) },
|
{ USB_VENDOR_AND_INTERFACE_INFO(0x0a5c, 0xff, 0x01, 0x01) },
|
||||||
|
|
||||||
|
/* Belkin F8065bf - Broadcom based */
|
||||||
|
{ USB_VENDOR_AND_INTERFACE_INFO(0x050d, 0xff, 0x01, 0x01) },
|
||||||
|
|
||||||
{ } /* Terminating entry */
|
{ } /* Terminating entry */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -148,6 +152,7 @@ static struct usb_device_id blacklist_table[] = {
|
||||||
{ USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x04ca, 0x3008), .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(0x0cf3, 0xe005), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
|
||||||
|
|
|
@ -104,6 +104,7 @@ enum {
|
||||||
enum {
|
enum {
|
||||||
HCI_SETUP,
|
HCI_SETUP,
|
||||||
HCI_AUTO_OFF,
|
HCI_AUTO_OFF,
|
||||||
|
HCI_RFKILLED,
|
||||||
HCI_MGMT,
|
HCI_MGMT,
|
||||||
HCI_PAIRABLE,
|
HCI_PAIRABLE,
|
||||||
HCI_SERVICE_CACHE,
|
HCI_SERVICE_CACHE,
|
||||||
|
|
|
@ -1146,7 +1146,11 @@ int hci_dev_open(__u16 dev)
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hdev->rfkill && rfkill_blocked(hdev->rfkill)) {
|
/* Check for rfkill but allow the HCI setup stage to proceed
|
||||||
|
* (which in itself doesn't cause any RF activity).
|
||||||
|
*/
|
||||||
|
if (test_bit(HCI_RFKILLED, &hdev->dev_flags) &&
|
||||||
|
!test_bit(HCI_SETUP, &hdev->dev_flags)) {
|
||||||
ret = -ERFKILL;
|
ret = -ERFKILL;
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
@ -1566,10 +1570,13 @@ static int hci_rfkill_set_block(void *data, bool blocked)
|
||||||
|
|
||||||
BT_DBG("%p name %s blocked %d", hdev, hdev->name, blocked);
|
BT_DBG("%p name %s blocked %d", hdev, hdev->name, blocked);
|
||||||
|
|
||||||
if (!blocked)
|
if (blocked) {
|
||||||
return 0;
|
set_bit(HCI_RFKILLED, &hdev->dev_flags);
|
||||||
|
if (!test_bit(HCI_SETUP, &hdev->dev_flags))
|
||||||
hci_dev_do_close(hdev);
|
hci_dev_do_close(hdev);
|
||||||
|
} else {
|
||||||
|
clear_bit(HCI_RFKILLED, &hdev->dev_flags);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1591,9 +1598,13 @@ static void hci_power_on(struct work_struct *work)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags))
|
if (test_bit(HCI_RFKILLED, &hdev->dev_flags)) {
|
||||||
|
clear_bit(HCI_AUTO_OFF, &hdev->dev_flags);
|
||||||
|
hci_dev_do_close(hdev);
|
||||||
|
} else if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
|
||||||
queue_delayed_work(hdev->req_workqueue, &hdev->power_off,
|
queue_delayed_work(hdev->req_workqueue, &hdev->power_off,
|
||||||
HCI_AUTO_OFF_TIMEOUT);
|
HCI_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);
|
||||||
|
@ -2209,6 +2220,9 @@ int hci_register_dev(struct hci_dev *hdev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (hdev->rfkill && rfkill_blocked(hdev->rfkill))
|
||||||
|
set_bit(HCI_RFKILLED, &hdev->dev_flags);
|
||||||
|
|
||||||
set_bit(HCI_SETUP, &hdev->dev_flags);
|
set_bit(HCI_SETUP, &hdev->dev_flags);
|
||||||
|
|
||||||
if (hdev->dev_type != HCI_AMP)
|
if (hdev->dev_type != HCI_AMP)
|
||||||
|
|
|
@ -3557,7 +3557,11 @@ static void hci_le_ltk_request_evt(struct hci_dev *hdev, struct sk_buff *skb)
|
||||||
cp.handle = cpu_to_le16(conn->handle);
|
cp.handle = cpu_to_le16(conn->handle);
|
||||||
|
|
||||||
if (ltk->authenticated)
|
if (ltk->authenticated)
|
||||||
conn->sec_level = BT_SECURITY_HIGH;
|
conn->pending_sec_level = BT_SECURITY_HIGH;
|
||||||
|
else
|
||||||
|
conn->pending_sec_level = BT_SECURITY_MEDIUM;
|
||||||
|
|
||||||
|
conn->enc_key_size = ltk->enc_size;
|
||||||
|
|
||||||
hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
|
hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
|
||||||
|
|
||||||
|
|
|
@ -3755,6 +3755,13 @@ static struct l2cap_chan *l2cap_connect(struct l2cap_conn *conn,
|
||||||
|
|
||||||
sk = chan->sk;
|
sk = chan->sk;
|
||||||
|
|
||||||
|
/* For certain devices (ex: HID mouse), support for authentication,
|
||||||
|
* pairing and bonding is optional. For such devices, inorder to avoid
|
||||||
|
* the ACL alive for too long after L2CAP disconnection, reset the ACL
|
||||||
|
* disc_timeout back to HCI_DISCONN_TIMEOUT during L2CAP connect.
|
||||||
|
*/
|
||||||
|
conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
|
||||||
|
|
||||||
bacpy(&bt_sk(sk)->src, conn->src);
|
bacpy(&bt_sk(sk)->src, conn->src);
|
||||||
bacpy(&bt_sk(sk)->dst, conn->dst);
|
bacpy(&bt_sk(sk)->dst, conn->dst);
|
||||||
chan->psm = psm;
|
chan->psm = psm;
|
||||||
|
|
|
@ -569,7 +569,6 @@ static void rfcomm_dev_data_ready(struct rfcomm_dlc *dlc, struct sk_buff *skb)
|
||||||
static void rfcomm_dev_state_change(struct rfcomm_dlc *dlc, int err)
|
static void rfcomm_dev_state_change(struct rfcomm_dlc *dlc, int err)
|
||||||
{
|
{
|
||||||
struct rfcomm_dev *dev = dlc->owner;
|
struct rfcomm_dev *dev = dlc->owner;
|
||||||
struct tty_struct *tty;
|
|
||||||
if (!dev)
|
if (!dev)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -581,38 +580,8 @@ static void rfcomm_dev_state_change(struct rfcomm_dlc *dlc, int err)
|
||||||
DPM_ORDER_DEV_AFTER_PARENT);
|
DPM_ORDER_DEV_AFTER_PARENT);
|
||||||
|
|
||||||
wake_up_interruptible(&dev->port.open_wait);
|
wake_up_interruptible(&dev->port.open_wait);
|
||||||
} else if (dlc->state == BT_CLOSED) {
|
} else if (dlc->state == BT_CLOSED)
|
||||||
tty = tty_port_tty_get(&dev->port);
|
tty_port_tty_hangup(&dev->port, false);
|
||||||
if (!tty) {
|
|
||||||
if (test_bit(RFCOMM_RELEASE_ONHUP, &dev->flags)) {
|
|
||||||
/* Drop DLC lock here to avoid deadlock
|
|
||||||
* 1. rfcomm_dev_get will take rfcomm_dev_lock
|
|
||||||
* but in rfcomm_dev_add there's lock order:
|
|
||||||
* rfcomm_dev_lock -> dlc lock
|
|
||||||
* 2. tty_port_put will deadlock if it's
|
|
||||||
* the last reference
|
|
||||||
*
|
|
||||||
* FIXME: when we release the lock anything
|
|
||||||
* could happen to dev, even its destruction
|
|
||||||
*/
|
|
||||||
rfcomm_dlc_unlock(dlc);
|
|
||||||
if (rfcomm_dev_get(dev->id) == NULL) {
|
|
||||||
rfcomm_dlc_lock(dlc);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!test_and_set_bit(RFCOMM_TTY_RELEASED,
|
|
||||||
&dev->flags))
|
|
||||||
tty_port_put(&dev->port);
|
|
||||||
|
|
||||||
tty_port_put(&dev->port);
|
|
||||||
rfcomm_dlc_lock(dlc);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
tty_hangup(tty);
|
|
||||||
tty_kref_put(tty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rfcomm_dev_modem_status(struct rfcomm_dlc *dlc, u8 v24_sig)
|
static void rfcomm_dev_modem_status(struct rfcomm_dlc *dlc, u8 v24_sig)
|
||||||
|
|
Loading…
Reference in a new issue