Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Bluetooth: hci_uart: Add Marvell support

This patch introduces support for Marvell Bluetooth controller over
UART (8897 for now). In order to send the final firmware at full speed,
a helper firmware is firstly sent. Firmware download is driven by the
controller which sends request firmware packets (including expected
size).

This driver is a global rework of the one proposed by
Amitkumar Karwar <akarwar@marvell.com>.

Signed-off-by: Loic Poulain <loic.poulain@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>

authored by

Loic Poulain and committed by
Marcel Holtmann
162f812f 9e69130c

+412 -1
+11
drivers/bluetooth/Kconfig
··· 180 180 181 181 Say Y here to compile support for Intel AG6XX protocol. 182 182 183 + config BT_HCIUART_MRVL 184 + bool "Marvell protocol support" 185 + depends on BT_HCIUART 186 + select BT_HCIUART_H4 187 + help 188 + Marvell is serial protocol for communication between Bluetooth 189 + device and host. This protocol is required for most Marvell Bluetooth 190 + devices with UART interface. 191 + 192 + Say Y here to compile support for HCI MRVL protocol. 193 + 183 194 config BT_HCIBCM203X 184 195 tristate "HCI BCM203x USB driver" 185 196 depends on USB
+1
drivers/bluetooth/Makefile
··· 38 38 hci_uart-$(CONFIG_BT_HCIUART_BCM) += hci_bcm.o 39 39 hci_uart-$(CONFIG_BT_HCIUART_QCA) += hci_qca.o 40 40 hci_uart-$(CONFIG_BT_HCIUART_AG6XX) += hci_ag6xx.o 41 + hci_uart-$(CONFIG_BT_HCIUART_MRVL) += hci_mrvl.o 41 42 hci_uart-objs := $(hci_uart-y) 42 43 43 44 ccflags-y += -D__CHECK_ENDIAN__
+6
drivers/bluetooth/hci_ldisc.c
··· 810 810 #ifdef CONFIG_BT_HCIUART_AG6XX 811 811 ag6xx_init(); 812 812 #endif 813 + #ifdef CONFIG_BT_HCIUART_MRVL 814 + mrvl_init(); 815 + #endif 813 816 814 817 return 0; 815 818 } ··· 847 844 #endif 848 845 #ifdef CONFIG_BT_HCIUART_AG6XX 849 846 ag6xx_deinit(); 847 + #endif 848 + #ifdef CONFIG_BT_HCIUART_MRVL 849 + mrvl_deinit(); 850 850 #endif 851 851 852 852 /* Release tty registration of line discipline */
+387
drivers/bluetooth/hci_mrvl.c
··· 1 + /* 2 + * 3 + * Bluetooth HCI UART driver for marvell devices 4 + * 5 + * Copyright (C) 2016 Marvell International Ltd. 6 + * Copyright (C) 2016 Intel Corporation 7 + * 8 + * This program is free software; you can redistribute it and/or modify 9 + * it under the terms of the GNU General Public License as published by 10 + * the Free Software Foundation; either version 2 of the License, or 11 + * (at your option) any later version. 12 + * 13 + * This program is distributed in the hope that it will be useful, 14 + * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 + * GNU General Public License for more details. 17 + * 18 + * You should have received a copy of the GNU General Public License 19 + * along with this program; if not, write to the Free Software 20 + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 21 + * 22 + */ 23 + 24 + #include <linux/kernel.h> 25 + #include <linux/errno.h> 26 + #include <linux/skbuff.h> 27 + #include <linux/firmware.h> 28 + #include <linux/module.h> 29 + #include <linux/tty.h> 30 + 31 + #include <net/bluetooth/bluetooth.h> 32 + #include <net/bluetooth/hci_core.h> 33 + 34 + #include "hci_uart.h" 35 + 36 + #define HCI_FW_REQ_PKT 0xA5 37 + #define HCI_CHIP_VER_PKT 0xAA 38 + 39 + #define MRVL_ACK 0x5A 40 + #define MRVL_NAK 0xBF 41 + #define MRVL_RAW_DATA 0x1F 42 + 43 + enum { 44 + STATE_CHIP_VER_PENDING, 45 + STATE_FW_REQ_PENDING, 46 + }; 47 + 48 + struct mrvl_data { 49 + struct sk_buff *rx_skb; 50 + struct sk_buff_head txq; 51 + struct sk_buff_head rawq; 52 + unsigned long flags; 53 + unsigned int tx_len; 54 + u8 id, rev; 55 + }; 56 + 57 + struct hci_mrvl_pkt { 58 + __le16 lhs; 59 + __le16 rhs; 60 + } __packed; 61 + #define HCI_MRVL_PKT_SIZE 4 62 + 63 + static int mrvl_open(struct hci_uart *hu) 64 + { 65 + struct mrvl_data *mrvl; 66 + 67 + BT_DBG("hu %p", hu); 68 + 69 + mrvl = kzalloc(sizeof(*mrvl), GFP_KERNEL); 70 + if (!mrvl) 71 + return -ENOMEM; 72 + 73 + skb_queue_head_init(&mrvl->txq); 74 + skb_queue_head_init(&mrvl->rawq); 75 + 76 + set_bit(STATE_CHIP_VER_PENDING, &mrvl->flags); 77 + 78 + hu->priv = mrvl; 79 + return 0; 80 + } 81 + 82 + static int mrvl_close(struct hci_uart *hu) 83 + { 84 + struct mrvl_data *mrvl = hu->priv; 85 + 86 + BT_DBG("hu %p", hu); 87 + 88 + skb_queue_purge(&mrvl->txq); 89 + skb_queue_purge(&mrvl->rawq); 90 + kfree_skb(mrvl->rx_skb); 91 + kfree(mrvl); 92 + 93 + hu->priv = NULL; 94 + return 0; 95 + } 96 + 97 + static int mrvl_flush(struct hci_uart *hu) 98 + { 99 + struct mrvl_data *mrvl = hu->priv; 100 + 101 + BT_DBG("hu %p", hu); 102 + 103 + skb_queue_purge(&mrvl->txq); 104 + skb_queue_purge(&mrvl->rawq); 105 + 106 + return 0; 107 + } 108 + 109 + static struct sk_buff *mrvl_dequeue(struct hci_uart *hu) 110 + { 111 + struct mrvl_data *mrvl = hu->priv; 112 + struct sk_buff *skb; 113 + 114 + skb = skb_dequeue(&mrvl->txq); 115 + if (!skb) { 116 + /* Any raw data ? */ 117 + skb = skb_dequeue(&mrvl->rawq); 118 + } else { 119 + /* Prepend skb with frame type */ 120 + memcpy(skb_push(skb, 1), &bt_cb(skb)->pkt_type, 1); 121 + } 122 + 123 + return skb; 124 + } 125 + 126 + static int mrvl_enqueue(struct hci_uart *hu, struct sk_buff *skb) 127 + { 128 + struct mrvl_data *mrvl = hu->priv; 129 + 130 + skb_queue_tail(&mrvl->txq, skb); 131 + return 0; 132 + } 133 + 134 + static void mrvl_send_ack(struct hci_uart *hu, unsigned char type) 135 + { 136 + struct mrvl_data *mrvl = hu->priv; 137 + struct sk_buff *skb; 138 + 139 + /* No H4 payload, only 1 byte header */ 140 + skb = bt_skb_alloc(0, GFP_ATOMIC); 141 + if (!skb) { 142 + bt_dev_err(hu->hdev, "Unable to alloc ack/nak packet"); 143 + return; 144 + } 145 + hci_skb_pkt_type(skb) = type; 146 + 147 + skb_queue_tail(&mrvl->txq, skb); 148 + hci_uart_tx_wakeup(hu); 149 + } 150 + 151 + static int mrvl_recv_fw_req(struct hci_dev *hdev, struct sk_buff *skb) 152 + { 153 + struct hci_mrvl_pkt *pkt = (void *)skb->data; 154 + struct hci_uart *hu = hci_get_drvdata(hdev); 155 + struct mrvl_data *mrvl = hu->priv; 156 + int ret = 0; 157 + 158 + if ((pkt->lhs ^ pkt->rhs) != 0xffff) { 159 + bt_dev_err(hdev, "Corrupted mrvl header"); 160 + mrvl_send_ack(hu, MRVL_NAK); 161 + ret = -EINVAL; 162 + goto done; 163 + } 164 + mrvl_send_ack(hu, MRVL_ACK); 165 + 166 + if (!test_bit(STATE_FW_REQ_PENDING, &mrvl->flags)) { 167 + bt_dev_err(hdev, "Received unexpected firmware request"); 168 + ret = -EINVAL; 169 + goto done; 170 + } 171 + 172 + mrvl->tx_len = le16_to_cpu(pkt->lhs); 173 + 174 + clear_bit(STATE_FW_REQ_PENDING, &mrvl->flags); 175 + smp_mb__after_atomic(); 176 + wake_up_bit(&mrvl->flags, STATE_FW_REQ_PENDING); 177 + 178 + done: 179 + kfree_skb(skb); 180 + return ret; 181 + } 182 + 183 + static int mrvl_recv_chip_ver(struct hci_dev *hdev, struct sk_buff *skb) 184 + { 185 + struct hci_mrvl_pkt *pkt = (void *)skb->data; 186 + struct hci_uart *hu = hci_get_drvdata(hdev); 187 + struct mrvl_data *mrvl = hu->priv; 188 + u16 version = le16_to_cpu(pkt->lhs); 189 + int ret = 0; 190 + 191 + if ((pkt->lhs ^ pkt->rhs) != 0xffff) { 192 + bt_dev_err(hdev, "Corrupted mrvl header"); 193 + mrvl_send_ack(hu, MRVL_NAK); 194 + ret = -EINVAL; 195 + goto done; 196 + } 197 + mrvl_send_ack(hu, MRVL_ACK); 198 + 199 + if (!test_bit(STATE_CHIP_VER_PENDING, &mrvl->flags)) { 200 + bt_dev_err(hdev, "Received unexpected chip version"); 201 + goto done; 202 + } 203 + 204 + mrvl->id = version; 205 + mrvl->rev = version >> 8; 206 + 207 + bt_dev_info(hdev, "Controller id = %x, rev = %x", mrvl->id, mrvl->rev); 208 + 209 + clear_bit(STATE_CHIP_VER_PENDING, &mrvl->flags); 210 + smp_mb__after_atomic(); 211 + wake_up_bit(&mrvl->flags, STATE_CHIP_VER_PENDING); 212 + 213 + done: 214 + kfree_skb(skb); 215 + return ret; 216 + } 217 + 218 + #define HCI_RECV_CHIP_VER \ 219 + .type = HCI_CHIP_VER_PKT, \ 220 + .hlen = HCI_MRVL_PKT_SIZE, \ 221 + .loff = 0, \ 222 + .lsize = 0, \ 223 + .maxlen = HCI_MRVL_PKT_SIZE 224 + 225 + #define HCI_RECV_FW_REQ \ 226 + .type = HCI_FW_REQ_PKT, \ 227 + .hlen = HCI_MRVL_PKT_SIZE, \ 228 + .loff = 0, \ 229 + .lsize = 0, \ 230 + .maxlen = HCI_MRVL_PKT_SIZE 231 + 232 + static const struct h4_recv_pkt mrvl_recv_pkts[] = { 233 + { H4_RECV_ACL, .recv = hci_recv_frame }, 234 + { H4_RECV_SCO, .recv = hci_recv_frame }, 235 + { H4_RECV_EVENT, .recv = hci_recv_frame }, 236 + { HCI_RECV_FW_REQ, .recv = mrvl_recv_fw_req }, 237 + { HCI_RECV_CHIP_VER, .recv = mrvl_recv_chip_ver }, 238 + }; 239 + 240 + static int mrvl_recv(struct hci_uart *hu, const void *data, int count) 241 + { 242 + struct mrvl_data *mrvl = hu->priv; 243 + 244 + if (!test_bit(HCI_UART_REGISTERED, &hu->flags)) 245 + return -EUNATCH; 246 + 247 + mrvl->rx_skb = h4_recv_buf(hu->hdev, mrvl->rx_skb, data, count, 248 + mrvl_recv_pkts, 249 + ARRAY_SIZE(mrvl_recv_pkts)); 250 + if (IS_ERR(mrvl->rx_skb)) { 251 + int err = PTR_ERR(mrvl->rx_skb); 252 + bt_dev_err(hu->hdev, "Frame reassembly failed (%d)", err); 253 + mrvl->rx_skb = NULL; 254 + return err; 255 + } 256 + 257 + return count; 258 + } 259 + 260 + static int mrvl_load_firmware(struct hci_dev *hdev, const char *name) 261 + { 262 + struct hci_uart *hu = hci_get_drvdata(hdev); 263 + struct mrvl_data *mrvl = hu->priv; 264 + const struct firmware *fw = NULL; 265 + const u8 *fw_ptr, *fw_max; 266 + int err; 267 + 268 + err = request_firmware(&fw, name, &hdev->dev); 269 + if (err < 0) { 270 + bt_dev_err(hdev, "Failed to load firmware file %s", name); 271 + return err; 272 + } 273 + 274 + fw_ptr = fw->data; 275 + fw_max = fw->data + fw->size; 276 + 277 + bt_dev_info(hdev, "Loading %s", name); 278 + 279 + set_bit(STATE_FW_REQ_PENDING, &mrvl->flags); 280 + 281 + while (fw_ptr <= fw_max) { 282 + struct sk_buff *skb; 283 + 284 + /* Controller drives the firmware load by sending firmware 285 + * request packets containing the expected fragment size. 286 + */ 287 + err = wait_on_bit_timeout(&mrvl->flags, STATE_FW_REQ_PENDING, 288 + TASK_INTERRUPTIBLE, 289 + msecs_to_jiffies(2000)); 290 + if (err == 1) { 291 + bt_dev_err(hdev, "Firmware load interrupted"); 292 + err = -EINTR; 293 + break; 294 + } else if (err) { 295 + bt_dev_err(hdev, "Firmware request timeout"); 296 + err = -ETIMEDOUT; 297 + break; 298 + } 299 + 300 + bt_dev_dbg(hdev, "Firmware request, expecting %d bytes", 301 + mrvl->tx_len); 302 + 303 + if (fw_ptr == fw_max) { 304 + /* Controller requests a null size once firmware is 305 + * fully loaded. If controller expects more data, there 306 + * is an issue. 307 + */ 308 + if (!mrvl->tx_len) { 309 + bt_dev_info(hdev, "Firmware loading complete"); 310 + } else { 311 + bt_dev_err(hdev, "Firmware loading failure"); 312 + err = -EINVAL; 313 + } 314 + break; 315 + } 316 + 317 + if (fw_ptr + mrvl->tx_len > fw_max) { 318 + mrvl->tx_len = fw_max - fw_ptr; 319 + bt_dev_dbg(hdev, "Adjusting tx_len to %d", 320 + mrvl->tx_len); 321 + } 322 + 323 + skb = bt_skb_alloc(mrvl->tx_len, GFP_KERNEL); 324 + if (!skb) { 325 + bt_dev_err(hdev, "Failed to alloc mem for FW packet"); 326 + err = -ENOMEM; 327 + break; 328 + } 329 + bt_cb(skb)->pkt_type = MRVL_RAW_DATA; 330 + 331 + memcpy(skb_put(skb, mrvl->tx_len), fw_ptr, mrvl->tx_len); 332 + fw_ptr += mrvl->tx_len; 333 + 334 + set_bit(STATE_FW_REQ_PENDING, &mrvl->flags); 335 + 336 + skb_queue_tail(&mrvl->rawq, skb); 337 + hci_uart_tx_wakeup(hu); 338 + } 339 + 340 + release_firmware(fw); 341 + return err; 342 + } 343 + 344 + static int mrvl_setup(struct hci_uart *hu) 345 + { 346 + int err; 347 + 348 + hci_uart_set_flow_control(hu, true); 349 + 350 + err = mrvl_load_firmware(hu->hdev, "mrvl/helper_uart_3000000.bin"); 351 + if (err) { 352 + bt_dev_err(hu->hdev, "Unable to download firmware helper"); 353 + return -EINVAL; 354 + } 355 + 356 + hci_uart_set_baudrate(hu, 3000000); 357 + hci_uart_set_flow_control(hu, false); 358 + 359 + err = mrvl_load_firmware(hu->hdev, "mrvl/uart8897_bt.bin"); 360 + if (err) 361 + return err; 362 + 363 + return 0; 364 + } 365 + 366 + static const struct hci_uart_proto mrvl_proto = { 367 + .id = HCI_UART_MRVL, 368 + .name = "Marvell", 369 + .init_speed = 115200, 370 + .open = mrvl_open, 371 + .close = mrvl_close, 372 + .flush = mrvl_flush, 373 + .setup = mrvl_setup, 374 + .recv = mrvl_recv, 375 + .enqueue = mrvl_enqueue, 376 + .dequeue = mrvl_dequeue, 377 + }; 378 + 379 + int __init mrvl_init(void) 380 + { 381 + return hci_uart_register_proto(&mrvl_proto); 382 + } 383 + 384 + int __exit mrvl_deinit(void) 385 + { 386 + return hci_uart_unregister_proto(&mrvl_proto); 387 + }
+7 -1
drivers/bluetooth/hci_uart.h
··· 35 35 #define HCIUARTGETFLAGS _IOR('U', 204, int) 36 36 37 37 /* UART protocols */ 38 - #define HCI_UART_MAX_PROTO 11 38 + #define HCI_UART_MAX_PROTO 12 39 39 40 40 #define HCI_UART_H4 0 41 41 #define HCI_UART_BCSP 1 ··· 48 48 #define HCI_UART_QCA 8 49 49 #define HCI_UART_AG6XX 9 50 50 #define HCI_UART_NOKIA 10 51 + #define HCI_UART_MRVL 11 51 52 52 53 #define HCI_UART_RAW_DEVICE 0 53 54 #define HCI_UART_RESET_ON_INIT 1 ··· 190 189 #ifdef CONFIG_BT_HCIUART_AG6XX 191 190 int ag6xx_init(void); 192 191 int ag6xx_deinit(void); 192 + #endif 193 + 194 + #ifdef CONFIG_BT_HCIUART_MRVL 195 + int mrvl_init(void); 196 + int mrvl_deinit(void); 193 197 #endif