Skip to content

Commit

Permalink
Merge branch 'for-upstream' of git://git.kernel.org/pub/scm/linux/ker…
Browse files Browse the repository at this point in the history
…nel/git/bluetooth/bluetooth-next

Johan Hedberg says:

====================
pull request: bluetooth-next 2017-05-23

Here's the first Bluetooth & 802.15.4 pull request targeting the 4.13
kernel release.

 - Bluetooth 5.0 improvements (Data Length Extensions and alternate PHY)
 - Support for new Intel Bluetooth adapter [[8087:0aaa]
 - Various fixes to ieee802154 code
 - Various fixes to HCI UART code
====================

Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
davem330 committed May 25, 2017
2 parents a0a32d3 + 7dab546 commit 52c05fc
Show file tree
Hide file tree
Showing 13 changed files with 107 additions and 36 deletions.
4 changes: 2 additions & 2 deletions MAINTAINERS
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ S: Maintained
F: drivers/scsi/53c700*

6LOWPAN GENERIC (BTLE/IEEE 802.15.4)
M: Alexander Aring <[email protected]>
M: Alexander Aring <[email protected]>
M: Jukka Rissanen <[email protected]>
L: [email protected]
L: [email protected]
Expand Down Expand Up @@ -6427,7 +6427,7 @@ F: Documentation/cdrom/ide-cd
F: drivers/ide/ide-cd*

IEEE 802.15.4 SUBSYSTEM
M: Alexander Aring <[email protected]>
M: Alexander Aring <[email protected]>
M: Stefan Schmidt <[email protected]>
L: [email protected]
W: http://wpan.cakelab.org/
Expand Down
3 changes: 2 additions & 1 deletion drivers/bluetooth/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ config BT_HCIUART_NOKIA
depends on BT_HCIUART
depends on BT_HCIUART_SERDEV
depends on PM
select BT_HCIUART_H4
help
Nokia H4+ is serial protocol for communication between Bluetooth
device and host. This protocol is required for Bluetooth devices
Expand Down Expand Up @@ -131,7 +132,7 @@ config BT_HCIUART_ATH3K

config BT_HCIUART_LL
bool "HCILL protocol support"
depends on BT_HCIUART
depends on BT_HCIUART_SERDEV
help
HCILL (HCI Low Level) is a serial protocol for communication
between Bluetooth device and host. This protocol is required for
Expand Down
2 changes: 2 additions & 0 deletions drivers/bluetooth/btintel.c
Original file line number Diff line number Diff line change
Expand Up @@ -575,3 +575,5 @@ MODULE_VERSION(VERSION);
MODULE_LICENSE("GPL");
MODULE_FIRMWARE("intel/ibt-11-5.sfi");
MODULE_FIRMWARE("intel/ibt-11-5.ddc");
MODULE_FIRMWARE("intel/ibt-12-16.sfi");
MODULE_FIRMWARE("intel/ibt-12-16.ddc");
4 changes: 4 additions & 0 deletions drivers/bluetooth/btusb.c
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,7 @@ static const struct usb_device_id blacklist_table[] = {
{ USB_DEVICE(0x8087, 0x0a2a), .driver_info = BTUSB_INTEL },
{ USB_DEVICE(0x8087, 0x0a2b), .driver_info = BTUSB_INTEL_NEW },
{ USB_DEVICE(0x8087, 0x0aa7), .driver_info = BTUSB_INTEL },
{ USB_DEVICE(0x8087, 0x0aaa), .driver_info = BTUSB_INTEL_NEW },

/* Other Intel Bluetooth devices */
{ USB_VENDOR_AND_INTERFACE_INFO(0x8087, 0xe0, 0x01, 0x01),
Expand Down Expand Up @@ -2036,6 +2037,7 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)
switch (ver.hw_variant) {
case 0x0b: /* SfP */
case 0x0c: /* WsP */
case 0x11: /* JfP */
case 0x12: /* ThP */
break;
default:
Expand Down Expand Up @@ -2138,6 +2140,8 @@ static int btusb_setup_intel_new(struct hci_dev *hdev)
* Currently the supported hardware variants are:
* 11 (0x0b) for iBT3.0 (LnP/SfP)
* 12 (0x0c) for iBT3.5 (WsP)
* 17 (0x11) for iBT3.5 (JfP)
* 18 (0x12) for iBT3.5 (ThP)
*/
snprintf(fwname, sizeof(fwname), "intel/ibt-%u-%u.sfi",
le16_to_cpu(ver.hw_variant),
Expand Down
1 change: 0 additions & 1 deletion drivers/bluetooth/btwilink.c
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,6 @@ static int ti_st_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
pkt_type = hci_skb_pkt_type(skb);
len = hst->st_write(skb);
if (len < 0) {
kfree_skb(skb);
BT_ERR("ST write failed (%ld)", len);
/* Try Again, would only fail if UART has gone bad */
return -EAGAIN;
Expand Down
40 changes: 35 additions & 5 deletions drivers/bluetooth/hci_ldisc.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,12 @@ static inline struct sk_buff *hci_uart_dequeue(struct hci_uart *hu)
struct sk_buff *skb = hu->tx_skb;

if (!skb) {
read_lock(&hu->proto_lock);

if (test_bit(HCI_UART_PROTO_READY, &hu->flags))
skb = hu->proto->dequeue(hu);

read_unlock(&hu->proto_lock);
} else {
hu->tx_skb = NULL;
}
Expand All @@ -125,18 +129,23 @@ static inline struct sk_buff *hci_uart_dequeue(struct hci_uart *hu)

int hci_uart_tx_wakeup(struct hci_uart *hu)
{
read_lock(&hu->proto_lock);

if (!test_bit(HCI_UART_PROTO_READY, &hu->flags))
return 0;
goto no_schedule;

if (test_and_set_bit(HCI_UART_SENDING, &hu->tx_state)) {
set_bit(HCI_UART_TX_WAKEUP, &hu->tx_state);
return 0;
goto no_schedule;
}

BT_DBG("");

schedule_work(&hu->write_work);

no_schedule:
read_unlock(&hu->proto_lock);

return 0;
}
EXPORT_SYMBOL_GPL(hci_uart_tx_wakeup);
Expand Down Expand Up @@ -237,9 +246,13 @@ static int hci_uart_flush(struct hci_dev *hdev)
tty_ldisc_flush(tty);
tty_driver_flush_buffer(tty);

read_lock(&hu->proto_lock);

if (test_bit(HCI_UART_PROTO_READY, &hu->flags))
hu->proto->flush(hu);

read_unlock(&hu->proto_lock);

return 0;
}

Expand All @@ -261,10 +274,15 @@ static int hci_uart_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
BT_DBG("%s: type %d len %d", hdev->name, hci_skb_pkt_type(skb),
skb->len);

if (!test_bit(HCI_UART_PROTO_READY, &hu->flags))
read_lock(&hu->proto_lock);

if (!test_bit(HCI_UART_PROTO_READY, &hu->flags)) {
read_unlock(&hu->proto_lock);
return -EUNATCH;
}

hu->proto->enqueue(hu, skb);
read_unlock(&hu->proto_lock);

hci_uart_tx_wakeup(hu);

Expand Down Expand Up @@ -460,6 +478,8 @@ static int hci_uart_tty_open(struct tty_struct *tty)
INIT_WORK(&hu->init_ready, hci_uart_init_work);
INIT_WORK(&hu->write_work, hci_uart_write_work);

rwlock_init(&hu->proto_lock);

/* Flush any pending characters in the driver */
tty_driver_flush_buffer(tty);

Expand All @@ -475,6 +495,7 @@ static void hci_uart_tty_close(struct tty_struct *tty)
{
struct hci_uart *hu = tty->disc_data;
struct hci_dev *hdev;
unsigned long flags;

BT_DBG("tty %p", tty);

Expand All @@ -490,7 +511,11 @@ static void hci_uart_tty_close(struct tty_struct *tty)

cancel_work_sync(&hu->write_work);

if (test_and_clear_bit(HCI_UART_PROTO_READY, &hu->flags)) {
if (test_bit(HCI_UART_PROTO_READY, &hu->flags)) {
write_lock_irqsave(&hu->proto_lock, flags);
clear_bit(HCI_UART_PROTO_READY, &hu->flags);
write_unlock_irqrestore(&hu->proto_lock, flags);

if (hdev) {
if (test_bit(HCI_UART_REGISTERED, &hu->flags))
hci_unregister_dev(hdev);
Expand Down Expand Up @@ -549,13 +574,18 @@ static void hci_uart_tty_receive(struct tty_struct *tty, const u8 *data,
if (!hu || tty != hu->tty)
return;

if (!test_bit(HCI_UART_PROTO_READY, &hu->flags))
read_lock(&hu->proto_lock);

if (!test_bit(HCI_UART_PROTO_READY, &hu->flags)) {
read_unlock(&hu->proto_lock);
return;
}

/* It does not need a lock here as it is already protected by a mutex in
* tty caller
*/
hu->proto->recv(hu, data, count);
read_unlock(&hu->proto_lock);

if (hu->hdev)
hu->hdev->stat.byte_rx += count;
Expand Down
1 change: 1 addition & 0 deletions drivers/bluetooth/hci_ll.c
Original file line number Diff line number Diff line change
Expand Up @@ -624,6 +624,7 @@ static int download_firmware(struct ll_device *lldev)
skb = __hci_cmd_sync(lldev->hu.hdev, cmd->opcode, cmd->plen, &cmd->speed, HCI_INIT_TIMEOUT);
if (IS_ERR(skb)) {
bt_dev_err(lldev->hu.hdev, "send command failed\n");
err = PTR_ERR(skb);
goto out_rel_fw;
}
kfree_skb(skb);
Expand Down
1 change: 1 addition & 0 deletions drivers/bluetooth/hci_uart.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ struct hci_uart {
struct work_struct write_work;

const struct hci_uart_proto *proto;
rwlock_t proto_lock; /* Stop work for proto close */
void *priv;

struct sk_buff *tx_skb;
Expand Down
12 changes: 4 additions & 8 deletions drivers/net/ieee802154/ca8210.c
Original file line number Diff line number Diff line change
Expand Up @@ -912,7 +912,7 @@ static int ca8210_spi_transfer(
)
{
int i, status = 0;
struct ca8210_priv *priv = spi_get_drvdata(spi);
struct ca8210_priv *priv;
struct cas_control *cas_ctl;

if (!spi) {
Expand All @@ -923,6 +923,7 @@ static int ca8210_spi_transfer(
return -ENODEV;
}

priv = spi_get_drvdata(spi);
reinit_completion(&priv->spi_transfer_complete);

dev_dbg(&spi->dev, "ca8210_spi_transfer called\n");
Expand Down Expand Up @@ -1808,10 +1809,9 @@ static int ca8210_skb_rx(

/* Allocate mtu size buffer for every rx packet */
skb = dev_alloc_skb(IEEE802154_MTU + sizeof(hdr));
if (!skb) {
dev_crit(&priv->spi->dev, "dev_alloc_skb failed\n");
if (!skb)
return -ENOMEM;
}

skb_reserve(skb, sizeof(hdr));

msdulen = data_ind[22]; /* msdu_length */
Expand Down Expand Up @@ -3143,10 +3143,6 @@ static int ca8210_probe(struct spi_device *spi_device)

pdata = kmalloc(sizeof(*pdata), GFP_KERNEL);
if (!pdata) {
dev_crit(
&spi_device->dev,
"Could not allocate platform data\n"
);
ret = -ENOMEM;
goto error;
}
Expand Down
8 changes: 8 additions & 0 deletions include/net/bluetooth/hci.h
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,7 @@ enum {
#define HCI_LE_PING 0x10
#define HCI_LE_DATA_LEN_EXT 0x20
#define HCI_LE_EXT_SCAN_POLICY 0x80
#define HCI_LE_CHAN_SEL_ALG2 0x40

/* Connection modes */
#define HCI_CM_ACTIVE 0x0000
Expand Down Expand Up @@ -1498,6 +1499,13 @@ struct hci_rp_le_read_max_data_len {
__le16 rx_time;
} __packed;

#define HCI_OP_LE_SET_DEFAULT_PHY 0x2031
struct hci_cp_le_set_default_phy {
__u8 all_phys;
__u8 tx_phys;
__u8 rx_phys;
} __packed;

/* ---- HCI Events ---- */
#define HCI_EV_INQUIRY_COMPLETE 0x01

Expand Down
11 changes: 3 additions & 8 deletions net/bluetooth/ecdh_helper.c
Original file line number Diff line number Diff line change
Expand Up @@ -89,11 +89,9 @@ bool compute_ecdh_secret(const u8 public_key[64], const u8 private_key[32],
p.curve_id = ECC_CURVE_NIST_P256;
buf_len = crypto_ecdh_key_len(&p);
buf = kmalloc(buf_len, GFP_KERNEL);
if (!buf) {
pr_err("alg: kpp: Failed to allocate %d bytes for buf\n",
buf_len);
if (!buf)
goto free_req;
}

crypto_ecdh_encode_key(buf, buf_len, &p);

/* Set A private Key */
Expand Down Expand Up @@ -170,11 +168,8 @@ bool generate_ecdh_keys(u8 public_key[64], u8 private_key[32])
p.key_size = 32;
buf_len = crypto_ecdh_key_len(&p);
buf = kmalloc(buf_len, GFP_KERNEL);
if (!buf) {
pr_err("alg: kpp: Failed to allocate %d bytes for buf\n",
buf_len);
if (!buf)
goto free_req;
}

do {
if (tries++ >= max_tries)
Expand Down
46 changes: 41 additions & 5 deletions net/bluetooth/hci_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -148,13 +148,13 @@ static ssize_t vendor_diag_write(struct file *file, const char __user *user_buf,
return -EINVAL;

/* When the diagnostic flags are not persistent and the transport
* is not active, then there is no need for the vendor callback.
*
* Instead just store the desired value. If needed the setting
* will be programmed when the controller gets powered on.
* is not active or in user channel operation, then there is no need
* for the vendor callback. Instead just store the desired value and
* the setting will be programmed when the controller gets powered on.
*/
if (test_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks) &&
!test_bit(HCI_RUNNING, &hdev->flags))
(!test_bit(HCI_RUNNING, &hdev->flags) ||
hci_dev_test_flag(hdev, HCI_USER_CHANNEL)))
goto done;

hci_req_sync_lock(hdev);
Expand Down Expand Up @@ -635,6 +635,14 @@ static int hci_init3_req(struct hci_request *req, unsigned long opt)
* Report
*/

/* If the controller supports Channel Selection Algorithm #2
* feature, enable the corresponding event.
*/
if (hdev->le_features[1] & HCI_LE_CHAN_SEL_ALG2)
events[2] |= 0x08; /* LE Channel Selection
* Algorithm
*/

/* If the controller supports the LE Set Scan Enable command,
* enable the corresponding advertising report event.
*/
Expand Down Expand Up @@ -677,6 +685,12 @@ static int hci_init3_req(struct hci_request *req, unsigned long opt)
if (hdev->commands[34] & 0x04)
events[1] |= 0x01; /* LE Generate DHKey Complete */

/* If the controller supports the LE Set Default PHY or
* LE Set PHY commands, enable the corresponding event.
*/
if (hdev->commands[35] & (0x20 | 0x40))
events[1] |= 0x08; /* LE PHY Update Complete */

hci_req_add(req, HCI_OP_LE_SET_EVENT_MASK, sizeof(events),
events);

Expand Down Expand Up @@ -771,6 +785,27 @@ static int hci_init4_req(struct hci_request *req, unsigned long opt)
sizeof(support), &support);
}

/* Set Suggested Default Data Length to maximum if supported */
if (hdev->le_features[0] & HCI_LE_DATA_LEN_EXT) {
struct hci_cp_le_write_def_data_len cp;

cp.tx_len = hdev->le_max_tx_len;
cp.tx_time = hdev->le_max_tx_time;
hci_req_add(req, HCI_OP_LE_WRITE_DEF_DATA_LEN, sizeof(cp), &cp);
}

/* Set Default PHY parameters if command is supported */
if (hdev->commands[35] & 0x20) {
struct hci_cp_le_set_default_phy cp;

/* No transmitter PHY or receiver PHY preferences */
cp.all_phys = 0x03;
cp.tx_phys = 0;
cp.rx_phys = 0;

hci_req_add(req, HCI_OP_LE_SET_DEFAULT_PHY, sizeof(cp), &cp);
}

return 0;
}

Expand Down Expand Up @@ -1384,6 +1419,7 @@ static int hci_dev_do_open(struct hci_dev *hdev)
* completed.
*/
if (test_bit(HCI_QUIRK_NON_PERSISTENT_DIAG, &hdev->quirks) &&
!hci_dev_test_flag(hdev, HCI_USER_CHANNEL) &&
hci_dev_test_flag(hdev, HCI_VENDOR_DIAG) && hdev->set_diag)
ret = hdev->set_diag(hdev, true);

Expand Down
Loading

0 comments on commit 52c05fc

Please sign in to comment.