Blame view

drivers/bluetooth/hci_intel.c 31 KB
16e3887f9   Marcel Holtmann   Bluetooth: hci_ua...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  /*
   *
   *  Bluetooth HCI UART driver for Intel devices
   *
   *  Copyright (C) 2015  Intel Corporation
   *
   *
   *  This program is free software; you can redistribute it and/or modify
   *  it under the terms of the GNU General Public License as published by
   *  the Free Software Foundation; either version 2 of the License, or
   *  (at your option) any later version.
   *
   *  This program is distributed in the hope that it will be useful,
   *  but WITHOUT ANY WARRANTY; without even the implied warranty of
   *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   *  GNU General Public License for more details.
   *
   *  You should have received a copy of the GNU General Public License
   *  along with this program; if not, write to the Free Software
   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   *
   */
  
  #include <linux/kernel.h>
  #include <linux/errno.h>
  #include <linux/skbuff.h>
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
27
  #include <linux/firmware.h>
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
28
  #include <linux/module.h>
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
29
  #include <linux/wait.h>
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
30
31
32
33
  #include <linux/tty.h>
  #include <linux/platform_device.h>
  #include <linux/gpio/consumer.h>
  #include <linux/acpi.h>
765ea3abd   Loic Poulain   Bluetooth: hci_in...
34
  #include <linux/interrupt.h>
74cdad37c   Loic Poulain   Bluetooth: hci_in...
35
  #include <linux/pm_runtime.h>
16e3887f9   Marcel Holtmann   Bluetooth: hci_ua...
36
37
38
39
40
  
  #include <net/bluetooth/bluetooth.h>
  #include <net/bluetooth/hci_core.h>
  
  #include "hci_uart.h"
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
41
42
43
44
45
46
47
  #include "btintel.h"
  
  #define STATE_BOOTLOADER	0
  #define STATE_DOWNLOADING	1
  #define STATE_FIRMWARE_LOADED	2
  #define STATE_FIRMWARE_FAILED	3
  #define STATE_BOOTING		4
b98469f4b   Loic Poulain   Bluetooth: hci_in...
48
49
  #define STATE_LPM_ENABLED	5
  #define STATE_TX_ACTIVE		6
894365468   Loic Poulain   Bluetooth: hci_in...
50
51
  #define STATE_SUSPENDED		7
  #define STATE_LPM_TRANSACTION	8
b98469f4b   Loic Poulain   Bluetooth: hci_in...
52

894365468   Loic Poulain   Bluetooth: hci_in...
53
  #define HCI_LPM_WAKE_PKT 0xf0
b98469f4b   Loic Poulain   Bluetooth: hci_in...
54
55
56
57
58
  #define HCI_LPM_PKT 0xf1
  #define HCI_LPM_MAX_SIZE 10
  #define HCI_LPM_HDR_SIZE HCI_EVENT_HDR_SIZE
  
  #define LPM_OP_TX_NOTIFY 0x00
894365468   Loic Poulain   Bluetooth: hci_in...
59
60
  #define LPM_OP_SUSPEND_ACK 0x02
  #define LPM_OP_RESUME_ACK 0x03
b98469f4b   Loic Poulain   Bluetooth: hci_in...
61

74cdad37c   Loic Poulain   Bluetooth: hci_in...
62
  #define LPM_SUSPEND_DELAY_MS 1000
b98469f4b   Loic Poulain   Bluetooth: hci_in...
63
64
65
66
67
  struct hci_lpm_pkt {
  	__u8 opcode;
  	__u8 dlen;
  	__u8 data[0];
  } __packed;
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
68

1ab1f239b   Loic Poulain   Bluetooth: hci_in...
69
70
71
72
  struct intel_device {
  	struct list_head list;
  	struct platform_device *pdev;
  	struct gpio_desc *reset;
aa6802df0   Loic Poulain   Bluetooth: hci_in...
73
74
  	struct hci_uart *hu;
  	struct mutex hu_lock;
765ea3abd   Loic Poulain   Bluetooth: hci_in...
75
  	int irq;
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
76
77
78
  };
  
  static LIST_HEAD(intel_device_list);
67c8bde04   Loic Poulain   Bluetooth: hci_in...
79
  static DEFINE_MUTEX(intel_device_list_lock);
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
80

ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
81
82
83
  struct intel_data {
  	struct sk_buff *rx_skb;
  	struct sk_buff_head txq;
74cdad37c   Loic Poulain   Bluetooth: hci_in...
84
85
  	struct work_struct busy_work;
  	struct hci_uart *hu;
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
86
87
  	unsigned long flags;
  };
ff2895592   Loic Poulain   Bluetooth: hci_in...
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
  static u8 intel_convert_speed(unsigned int speed)
  {
  	switch (speed) {
  	case 9600:
  		return 0x00;
  	case 19200:
  		return 0x01;
  	case 38400:
  		return 0x02;
  	case 57600:
  		return 0x03;
  	case 115200:
  		return 0x04;
  	case 230400:
  		return 0x05;
  	case 460800:
  		return 0x06;
  	case 921600:
  		return 0x07;
  	case 1843200:
  		return 0x08;
  	case 3250000:
  		return 0x09;
  	case 2000000:
  		return 0x0a;
  	case 3000000:
  		return 0x0b;
  	default:
  		return 0xff;
  	}
  }
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
119
120
121
122
123
124
125
126
  static int intel_wait_booting(struct hci_uart *hu)
  {
  	struct intel_data *intel = hu->priv;
  	int err;
  
  	err = wait_on_bit_timeout(&intel->flags, STATE_BOOTING,
  				  TASK_INTERRUPTIBLE,
  				  msecs_to_jiffies(1000));
f0a70a04c   Bart Van Assche   Bluetooth: btusb,...
127
  	if (err == -EINTR) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
128
  		bt_dev_err(hu->hdev, "Device boot interrupted");
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
129
130
131
132
  		return -EINTR;
  	}
  
  	if (err) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
133
  		bt_dev_err(hu->hdev, "Device boot timeout");
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
134
135
136
137
138
  		return -ETIMEDOUT;
  	}
  
  	return err;
  }
a9cb0fe48   Loic Poulain   Bluetooth: hci_in...
139
  #ifdef CONFIG_PM
894365468   Loic Poulain   Bluetooth: hci_in...
140
141
142
143
144
145
146
147
  static int intel_wait_lpm_transaction(struct hci_uart *hu)
  {
  	struct intel_data *intel = hu->priv;
  	int err;
  
  	err = wait_on_bit_timeout(&intel->flags, STATE_LPM_TRANSACTION,
  				  TASK_INTERRUPTIBLE,
  				  msecs_to_jiffies(1000));
f0a70a04c   Bart Van Assche   Bluetooth: btusb,...
148
  	if (err == -EINTR) {
894365468   Loic Poulain   Bluetooth: hci_in...
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
  		bt_dev_err(hu->hdev, "LPM transaction interrupted");
  		return -EINTR;
  	}
  
  	if (err) {
  		bt_dev_err(hu->hdev, "LPM transaction timeout");
  		return -ETIMEDOUT;
  	}
  
  	return err;
  }
  
  static int intel_lpm_suspend(struct hci_uart *hu)
  {
  	static const u8 suspend[] = { 0x01, 0x01, 0x01 };
  	struct intel_data *intel = hu->priv;
  	struct sk_buff *skb;
  
  	if (!test_bit(STATE_LPM_ENABLED, &intel->flags) ||
  	    test_bit(STATE_SUSPENDED, &intel->flags))
  		return 0;
  
  	if (test_bit(STATE_TX_ACTIVE, &intel->flags))
  		return -EAGAIN;
  
  	bt_dev_dbg(hu->hdev, "Suspending");
  
  	skb = bt_skb_alloc(sizeof(suspend), GFP_KERNEL);
  	if (!skb) {
  		bt_dev_err(hu->hdev, "Failed to alloc memory for LPM packet");
  		return -ENOMEM;
  	}
  
  	memcpy(skb_put(skb, sizeof(suspend)), suspend, sizeof(suspend));
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
183
  	hci_skb_pkt_type(skb) = HCI_LPM_PKT;
894365468   Loic Poulain   Bluetooth: hci_in...
184
185
  
  	set_bit(STATE_LPM_TRANSACTION, &intel->flags);
30e945fb2   Loic Poulain   Bluetooth: hci_in...
186
187
  	/* LPM flow is a priority, enqueue packet at list head */
  	skb_queue_head(&intel->txq, skb);
894365468   Loic Poulain   Bluetooth: hci_in...
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
  	hci_uart_tx_wakeup(hu);
  
  	intel_wait_lpm_transaction(hu);
  	/* Even in case of failure, continue and test the suspended flag */
  
  	clear_bit(STATE_LPM_TRANSACTION, &intel->flags);
  
  	if (!test_bit(STATE_SUSPENDED, &intel->flags)) {
  		bt_dev_err(hu->hdev, "Device suspend error");
  		return -EINVAL;
  	}
  
  	bt_dev_dbg(hu->hdev, "Suspended");
  
  	hci_uart_set_flow_control(hu, true);
  
  	return 0;
  }
  
  static int intel_lpm_resume(struct hci_uart *hu)
  {
  	struct intel_data *intel = hu->priv;
  	struct sk_buff *skb;
  
  	if (!test_bit(STATE_LPM_ENABLED, &intel->flags) ||
  	    !test_bit(STATE_SUSPENDED, &intel->flags))
  		return 0;
  
  	bt_dev_dbg(hu->hdev, "Resuming");
  
  	hci_uart_set_flow_control(hu, false);
  
  	skb = bt_skb_alloc(0, GFP_KERNEL);
  	if (!skb) {
  		bt_dev_err(hu->hdev, "Failed to alloc memory for LPM packet");
  		return -ENOMEM;
  	}
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
225
  	hci_skb_pkt_type(skb) = HCI_LPM_WAKE_PKT;
894365468   Loic Poulain   Bluetooth: hci_in...
226
227
  
  	set_bit(STATE_LPM_TRANSACTION, &intel->flags);
30e945fb2   Loic Poulain   Bluetooth: hci_in...
228
229
  	/* LPM flow is a priority, enqueue packet at list head */
  	skb_queue_head(&intel->txq, skb);
894365468   Loic Poulain   Bluetooth: hci_in...
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
  	hci_uart_tx_wakeup(hu);
  
  	intel_wait_lpm_transaction(hu);
  	/* Even in case of failure, continue and test the suspended flag */
  
  	clear_bit(STATE_LPM_TRANSACTION, &intel->flags);
  
  	if (test_bit(STATE_SUSPENDED, &intel->flags)) {
  		bt_dev_err(hu->hdev, "Device resume error");
  		return -EINVAL;
  	}
  
  	bt_dev_dbg(hu->hdev, "Resumed");
  
  	return 0;
  }
a9cb0fe48   Loic Poulain   Bluetooth: hci_in...
246
  #endif /* CONFIG_PM */
894365468   Loic Poulain   Bluetooth: hci_in...
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
  
  static int intel_lpm_host_wake(struct hci_uart *hu)
  {
  	static const u8 lpm_resume_ack[] = { LPM_OP_RESUME_ACK, 0x00 };
  	struct intel_data *intel = hu->priv;
  	struct sk_buff *skb;
  
  	hci_uart_set_flow_control(hu, false);
  
  	clear_bit(STATE_SUSPENDED, &intel->flags);
  
  	skb = bt_skb_alloc(sizeof(lpm_resume_ack), GFP_KERNEL);
  	if (!skb) {
  		bt_dev_err(hu->hdev, "Failed to alloc memory for LPM packet");
  		return -ENOMEM;
  	}
  
  	memcpy(skb_put(skb, sizeof(lpm_resume_ack)), lpm_resume_ack,
  	       sizeof(lpm_resume_ack));
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
266
  	hci_skb_pkt_type(skb) = HCI_LPM_PKT;
894365468   Loic Poulain   Bluetooth: hci_in...
267

30e945fb2   Loic Poulain   Bluetooth: hci_in...
268
269
  	/* LPM flow is a priority, enqueue packet at list head */
  	skb_queue_head(&intel->txq, skb);
894365468   Loic Poulain   Bluetooth: hci_in...
270
271
272
273
274
275
  	hci_uart_tx_wakeup(hu);
  
  	bt_dev_dbg(hu->hdev, "Resumed by controller");
  
  	return 0;
  }
765ea3abd   Loic Poulain   Bluetooth: hci_in...
276
277
278
279
280
281
  static irqreturn_t intel_irq(int irq, void *dev_id)
  {
  	struct intel_device *idev = dev_id;
  
  	dev_info(&idev->pdev->dev, "hci_intel irq
  ");
aa6802df0   Loic Poulain   Bluetooth: hci_in...
282
283
284
285
  	mutex_lock(&idev->hu_lock);
  	if (idev->hu)
  		intel_lpm_host_wake(idev->hu);
  	mutex_unlock(&idev->hu_lock);
74cdad37c   Loic Poulain   Bluetooth: hci_in...
286
287
288
289
  	/* Host/Controller are now LPM resumed, trigger a new delayed suspend */
  	pm_runtime_get(&idev->pdev->dev);
  	pm_runtime_mark_last_busy(&idev->pdev->dev);
  	pm_runtime_put_autosuspend(&idev->pdev->dev);
765ea3abd   Loic Poulain   Bluetooth: hci_in...
290
291
  	return IRQ_HANDLED;
  }
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
292
293
294
295
  static int intel_set_power(struct hci_uart *hu, bool powered)
  {
  	struct list_head *p;
  	int err = -ENODEV;
67c8bde04   Loic Poulain   Bluetooth: hci_in...
296
  	mutex_lock(&intel_device_list_lock);
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
  
  	list_for_each(p, &intel_device_list) {
  		struct intel_device *idev = list_entry(p, struct intel_device,
  						       list);
  
  		/* tty device and pdev device should share the same parent
  		 * which is the UART port.
  		 */
  		if (hu->tty->dev->parent != idev->pdev->dev.parent)
  			continue;
  
  		if (!idev->reset) {
  			err = -ENOTSUPP;
  			break;
  		}
  
  		BT_INFO("hu %p, Switching compatible pm device (%s) to %u",
  			hu, dev_name(&idev->pdev->dev), powered);
  
  		gpiod_set_value(idev->reset, powered);
765ea3abd   Loic Poulain   Bluetooth: hci_in...
317

aa6802df0   Loic Poulain   Bluetooth: hci_in...
318
319
320
321
322
323
324
325
  		/* Provide to idev a hu reference which is used to run LPM
  		 * transactions (lpm suspend/resume) from PM callbacks.
  		 * hu needs to be protected against concurrent removing during
  		 * these PM ops.
  		 */
  		mutex_lock(&idev->hu_lock);
  		idev->hu = powered ? hu : NULL;
  		mutex_unlock(&idev->hu_lock);
765ea3abd   Loic Poulain   Bluetooth: hci_in...
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
  		if (idev->irq < 0)
  			break;
  
  		if (powered && device_can_wakeup(&idev->pdev->dev)) {
  			err = devm_request_threaded_irq(&idev->pdev->dev,
  							idev->irq, NULL,
  							intel_irq,
  							IRQF_ONESHOT,
  							"bt-host-wake", idev);
  			if (err) {
  				BT_ERR("hu %p, unable to allocate irq-%d",
  				       hu, idev->irq);
  				break;
  			}
  
  			device_wakeup_enable(&idev->pdev->dev);
74cdad37c   Loic Poulain   Bluetooth: hci_in...
342
343
344
345
346
347
  
  			pm_runtime_set_active(&idev->pdev->dev);
  			pm_runtime_use_autosuspend(&idev->pdev->dev);
  			pm_runtime_set_autosuspend_delay(&idev->pdev->dev,
  							 LPM_SUSPEND_DELAY_MS);
  			pm_runtime_enable(&idev->pdev->dev);
765ea3abd   Loic Poulain   Bluetooth: hci_in...
348
349
350
  		} else if (!powered && device_may_wakeup(&idev->pdev->dev)) {
  			devm_free_irq(&idev->pdev->dev, idev->irq, idev);
  			device_wakeup_disable(&idev->pdev->dev);
74cdad37c   Loic Poulain   Bluetooth: hci_in...
351
352
  
  			pm_runtime_disable(&idev->pdev->dev);
765ea3abd   Loic Poulain   Bluetooth: hci_in...
353
  		}
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
354
  	}
67c8bde04   Loic Poulain   Bluetooth: hci_in...
355
  	mutex_unlock(&intel_device_list_lock);
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
356
357
358
  
  	return err;
  }
74cdad37c   Loic Poulain   Bluetooth: hci_in...
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
  static void intel_busy_work(struct work_struct *work)
  {
  	struct list_head *p;
  	struct intel_data *intel = container_of(work, struct intel_data,
  						busy_work);
  
  	/* Link is busy, delay the suspend */
  	mutex_lock(&intel_device_list_lock);
  	list_for_each(p, &intel_device_list) {
  		struct intel_device *idev = list_entry(p, struct intel_device,
  						       list);
  
  		if (intel->hu->tty->dev->parent == idev->pdev->dev.parent) {
  			pm_runtime_get(&idev->pdev->dev);
  			pm_runtime_mark_last_busy(&idev->pdev->dev);
  			pm_runtime_put_autosuspend(&idev->pdev->dev);
  			break;
  		}
  	}
  	mutex_unlock(&intel_device_list_lock);
  }
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
380
381
382
383
384
385
386
387
388
389
390
  static int intel_open(struct hci_uart *hu)
  {
  	struct intel_data *intel;
  
  	BT_DBG("hu %p", hu);
  
  	intel = kzalloc(sizeof(*intel), GFP_KERNEL);
  	if (!intel)
  		return -ENOMEM;
  
  	skb_queue_head_init(&intel->txq);
74cdad37c   Loic Poulain   Bluetooth: hci_in...
391
392
393
  	INIT_WORK(&intel->busy_work, intel_busy_work);
  
  	intel->hu = hu;
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
394
395
  
  	hu->priv = intel;
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
396
397
398
  
  	if (!intel_set_power(hu, true))
  		set_bit(STATE_BOOTING, &intel->flags);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
399
400
401
402
403
404
405
406
  	return 0;
  }
  
  static int intel_close(struct hci_uart *hu)
  {
  	struct intel_data *intel = hu->priv;
  
  	BT_DBG("hu %p", hu);
74cdad37c   Loic Poulain   Bluetooth: hci_in...
407
  	cancel_work_sync(&intel->busy_work);
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
408
  	intel_set_power(hu, false);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
  	skb_queue_purge(&intel->txq);
  	kfree_skb(intel->rx_skb);
  	kfree(intel);
  
  	hu->priv = NULL;
  	return 0;
  }
  
  static int intel_flush(struct hci_uart *hu)
  {
  	struct intel_data *intel = hu->priv;
  
  	BT_DBG("hu %p", hu);
  
  	skb_queue_purge(&intel->txq);
  
  	return 0;
  }
  
  static int inject_cmd_complete(struct hci_dev *hdev, __u16 opcode)
  {
  	struct sk_buff *skb;
  	struct hci_event_hdr *hdr;
  	struct hci_ev_cmd_complete *evt;
  
  	skb = bt_skb_alloc(sizeof(*hdr) + sizeof(*evt) + 1, GFP_ATOMIC);
  	if (!skb)
  		return -ENOMEM;
  
  	hdr = (struct hci_event_hdr *)skb_put(skb, sizeof(*hdr));
  	hdr->evt = HCI_EV_CMD_COMPLETE;
  	hdr->plen = sizeof(*evt) + 1;
  
  	evt = (struct hci_ev_cmd_complete *)skb_put(skb, sizeof(*evt));
  	evt->ncmd = 0x01;
  	evt->opcode = cpu_to_le16(opcode);
  
  	*skb_put(skb, 1) = 0x00;
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
447
  	hci_skb_pkt_type(skb) = HCI_EVENT_PKT;
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
448
449
450
  
  	return hci_recv_frame(hdev, skb);
  }
ff2895592   Loic Poulain   Bluetooth: hci_in...
451
452
453
454
455
456
  static int intel_set_baudrate(struct hci_uart *hu, unsigned int speed)
  {
  	struct intel_data *intel = hu->priv;
  	struct hci_dev *hdev = hu->hdev;
  	u8 speed_cmd[] = { 0x06, 0xfc, 0x01, 0x00 };
  	struct sk_buff *skb;
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
457
458
459
460
461
462
463
464
465
466
  	int err;
  
  	/* This can be the first command sent to the chip, check
  	 * that the controller is ready.
  	 */
  	err = intel_wait_booting(hu);
  
  	clear_bit(STATE_BOOTING, &intel->flags);
  
  	/* In case of timeout, try to continue anyway */
2be1149ed   Anton Protopopov   Bluetooth: hci_in...
467
  	if (err && err != -ETIMEDOUT)
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
468
  		return err;
ff2895592   Loic Poulain   Bluetooth: hci_in...
469

f44e78a5f   Loic Poulain   Bluetooth: hci_in...
470
  	bt_dev_info(hdev, "Change controller speed to %d", speed);
ff2895592   Loic Poulain   Bluetooth: hci_in...
471
472
473
  
  	speed_cmd[3] = intel_convert_speed(speed);
  	if (speed_cmd[3] == 0xff) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
474
  		bt_dev_err(hdev, "Unsupported speed");
ff2895592   Loic Poulain   Bluetooth: hci_in...
475
476
477
478
479
480
  		return -EINVAL;
  	}
  
  	/* Device will not accept speed change if Intel version has not been
  	 * previously requested.
  	 */
a0c382451   Loic Poulain   Bluetooth: hci_in...
481
  	skb = __hci_cmd_sync(hdev, 0xfc05, 0, NULL, HCI_CMD_TIMEOUT);
ff2895592   Loic Poulain   Bluetooth: hci_in...
482
  	if (IS_ERR(skb)) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
483
484
  		bt_dev_err(hdev, "Reading Intel version information failed (%ld)",
  			   PTR_ERR(skb));
ff2895592   Loic Poulain   Bluetooth: hci_in...
485
486
487
488
489
490
  		return PTR_ERR(skb);
  	}
  	kfree_skb(skb);
  
  	skb = bt_skb_alloc(sizeof(speed_cmd), GFP_KERNEL);
  	if (!skb) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
491
  		bt_dev_err(hdev, "Failed to alloc memory for baudrate packet");
ff2895592   Loic Poulain   Bluetooth: hci_in...
492
493
494
495
  		return -ENOMEM;
  	}
  
  	memcpy(skb_put(skb, sizeof(speed_cmd)), speed_cmd, sizeof(speed_cmd));
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
496
  	hci_skb_pkt_type(skb) = HCI_COMMAND_PKT;
ff2895592   Loic Poulain   Bluetooth: hci_in...
497
498
499
500
501
502
503
504
505
506
507
508
509
510
  
  	hci_uart_set_flow_control(hu, true);
  
  	skb_queue_tail(&intel->txq, skb);
  	hci_uart_tx_wakeup(hu);
  
  	/* wait 100ms to change baudrate on controller side */
  	msleep(100);
  
  	hci_uart_set_baudrate(hu, speed);
  	hci_uart_set_flow_control(hu, false);
  
  	return 0;
  }
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
511
512
513
514
515
516
517
  static int intel_setup(struct hci_uart *hu)
  {
  	static const u8 reset_param[] = { 0x00, 0x01, 0x00, 0x01,
  					  0x00, 0x08, 0x04, 0x00 };
  	struct intel_data *intel = hu->priv;
  	struct hci_dev *hdev = hu->hdev;
  	struct sk_buff *skb;
6c483de1b   Loic Poulain   Bluetooth: btinte...
518
  	struct intel_version ver;
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
519
  	struct intel_boot_params *params;
b98469f4b   Loic Poulain   Bluetooth: hci_in...
520
  	struct list_head *p;
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
521
522
523
524
525
526
  	const struct firmware *fw;
  	const u8 *fw_ptr;
  	char fwname[64];
  	u32 frag_len;
  	ktime_t calltime, delta, rettime;
  	unsigned long long duration;
ff2895592   Loic Poulain   Bluetooth: hci_in...
527
528
  	unsigned int init_speed, oper_speed;
  	int speed_change = 0;
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
529
  	int err;
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
530
  	bt_dev_dbg(hdev, "start intel_setup");
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
531

6d2e50d24   Marcel Holtmann   Bluetooth: btinte...
532
  	hu->hdev->set_diag = btintel_set_diag;
35ab8150e   Marcel Holtmann   Bluetooth: hci_ua...
533
  	hu->hdev->set_bdaddr = btintel_set_bdaddr;
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
534
  	calltime = ktime_get();
ff2895592   Loic Poulain   Bluetooth: hci_in...
535
536
537
538
539
540
541
542
543
544
545
546
  	if (hu->init_speed)
  		init_speed = hu->init_speed;
  	else
  		init_speed = hu->proto->init_speed;
  
  	if (hu->oper_speed)
  		oper_speed = hu->oper_speed;
  	else
  		oper_speed = hu->proto->oper_speed;
  
  	if (oper_speed && init_speed && oper_speed != init_speed)
  		speed_change = 1;
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
547
548
549
550
551
552
  	/* Check that the controller is ready */
  	err = intel_wait_booting(hu);
  
  	clear_bit(STATE_BOOTING, &intel->flags);
  
  	/* In case of timeout, try to continue anyway */
2be1149ed   Anton Protopopov   Bluetooth: hci_in...
553
  	if (err && err != -ETIMEDOUT)
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
554
  		return err;
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
555
556
557
558
559
560
  	set_bit(STATE_BOOTLOADER, &intel->flags);
  
  	/* Read the Intel version information to determine if the device
  	 * is in bootloader mode or if it already has operational firmware
  	 * loaded.
  	 */
6c483de1b   Loic Poulain   Bluetooth: btinte...
561
562
  	 err = btintel_read_version(hdev, &ver);
  	 if (err)
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
563
  		return err;
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
564
565
566
567
  
  	/* The hardware platform number has a fixed value of 0x37 and
  	 * for now only accept this single value.
  	 */
6c483de1b   Loic Poulain   Bluetooth: btinte...
568
  	if (ver.hw_platform != 0x37) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
569
  		bt_dev_err(hdev, "Unsupported Intel hardware platform (%u)",
6c483de1b   Loic Poulain   Bluetooth: btinte...
570
  			   ver.hw_platform);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
571
572
573
574
575
576
577
578
  		return -EINVAL;
  	}
  
  	/* At the moment only the hardware variant iBT 3.0 (LnP/SfP) is
  	 * supported by this firmware loading method. This check has been
  	 * put in place to ensure correct forward compatibility options
  	 * when newer hardware variants come along.
  	 */
6c483de1b   Loic Poulain   Bluetooth: btinte...
579
  	if (ver.hw_variant != 0x0b) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
580
  		bt_dev_err(hdev, "Unsupported Intel hardware variant (%u)",
6c483de1b   Loic Poulain   Bluetooth: btinte...
581
  			   ver.hw_variant);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
582
583
  		return -EINVAL;
  	}
6c483de1b   Loic Poulain   Bluetooth: btinte...
584
  	btintel_version_info(hdev, &ver);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
585
586
587
588
589
590
591
592
593
594
595
596
597
598
  
  	/* The firmware variant determines if the device is in bootloader
  	 * mode or is running operational firmware. The value 0x06 identifies
  	 * the bootloader and the value 0x23 identifies the operational
  	 * firmware.
  	 *
  	 * When the operational firmware is already present, then only
  	 * the check for valid Bluetooth device address is needed. This
  	 * determines if the device will be added as configured or
  	 * unconfigured controller.
  	 *
  	 * It is not possible to use the Secure Boot Parameters in this
  	 * case since that command is only available in bootloader mode.
  	 */
6c483de1b   Loic Poulain   Bluetooth: btinte...
599
  	if (ver.fw_variant == 0x23) {
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
600
601
602
603
604
605
606
607
  		clear_bit(STATE_BOOTLOADER, &intel->flags);
  		btintel_check_bdaddr(hdev);
  		return 0;
  	}
  
  	/* If the device is not in bootloader mode, then the only possible
  	 * choice is to return an error and abort the device initialization.
  	 */
6c483de1b   Loic Poulain   Bluetooth: btinte...
608
  	if (ver.fw_variant != 0x06) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
609
  		bt_dev_err(hdev, "Unsupported Intel firmware variant (%u)",
6c483de1b   Loic Poulain   Bluetooth: btinte...
610
  			   ver.fw_variant);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
611
612
  		return -ENODEV;
  	}
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
613
614
615
  	/* Read the secure boot parameters to identify the operating
  	 * details of the bootloader.
  	 */
a0c382451   Loic Poulain   Bluetooth: hci_in...
616
  	skb = __hci_cmd_sync(hdev, 0xfc0d, 0, NULL, HCI_CMD_TIMEOUT);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
617
  	if (IS_ERR(skb)) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
618
619
  		bt_dev_err(hdev, "Reading Intel boot parameters failed (%ld)",
  			   PTR_ERR(skb));
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
620
621
622
623
  		return PTR_ERR(skb);
  	}
  
  	if (skb->len != sizeof(*params)) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
624
  		bt_dev_err(hdev, "Intel boot parameters size mismatch");
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
625
626
627
628
629
630
  		kfree_skb(skb);
  		return -EILSEQ;
  	}
  
  	params = (struct intel_boot_params *)skb->data;
  	if (params->status) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
631
632
  		bt_dev_err(hdev, "Intel boot parameters command failure (%02x)",
  			   params->status);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
633
634
635
636
  		err = -bt_to_errno(params->status);
  		kfree_skb(skb);
  		return err;
  	}
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
637
638
  	bt_dev_info(hdev, "Device revision is %u",
  		    le16_to_cpu(params->dev_revid));
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
639

f44e78a5f   Loic Poulain   Bluetooth: hci_in...
640
641
  	bt_dev_info(hdev, "Secure boot is %s",
  		    params->secure_boot ? "enabled" : "disabled");
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
642

f44e78a5f   Loic Poulain   Bluetooth: hci_in...
643
  	bt_dev_info(hdev, "Minimum firmware build %u week %u %u",
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
644
645
646
647
648
649
650
651
  		params->min_fw_build_nn, params->min_fw_build_cw,
  		2000 + params->min_fw_build_yy);
  
  	/* It is required that every single firmware fragment is acknowledged
  	 * with a command complete event. If the boot parameters indicate
  	 * that this bootloader does not send them, then abort the setup.
  	 */
  	if (params->limited_cce != 0x00) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
652
653
  		bt_dev_err(hdev, "Unsupported Intel firmware loading method (%u)",
  			   params->limited_cce);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
654
655
656
657
658
659
660
661
  		kfree_skb(skb);
  		return -EINVAL;
  	}
  
  	/* If the OTP has no valid Bluetooth device address, then there will
  	 * also be no valid address for the operational firmware.
  	 */
  	if (!bacmp(&params->otp_bdaddr, BDADDR_ANY)) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
662
  		bt_dev_info(hdev, "No device address configured");
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
663
664
665
666
667
668
669
670
671
672
673
674
675
676
  		set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
  	}
  
  	/* With this Intel bootloader only the hardware variant and device
  	 * revision information are used to select the right firmware.
  	 *
  	 * Currently this bootloader support is limited to hardware variant
  	 * iBT 3.0 (LnP/SfP) which is identified by the value 11 (0x0b).
  	 */
  	snprintf(fwname, sizeof(fwname), "intel/ibt-11-%u.sfi",
  		 le16_to_cpu(params->dev_revid));
  
  	err = request_firmware(&fw, fwname, &hdev->dev);
  	if (err < 0) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
677
678
  		bt_dev_err(hdev, "Failed to load Intel firmware file (%d)",
  			   err);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
679
680
681
  		kfree_skb(skb);
  		return err;
  	}
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
682
  	bt_dev_info(hdev, "Found device firmware: %s", fwname);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
683

1cfbabdd1   Loic Poulain   Bluetooth: hci_in...
684
685
686
  	/* Save the DDC file name for later */
  	snprintf(fwname, sizeof(fwname), "intel/ibt-11-%u.ddc",
  		 le16_to_cpu(params->dev_revid));
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
687
688
689
  	kfree_skb(skb);
  
  	if (fw->size < 644) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
690
691
  		bt_dev_err(hdev, "Invalid size of firmware file (%zu)",
  			   fw->size);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
692
693
694
695
696
697
698
699
700
  		err = -EBADF;
  		goto done;
  	}
  
  	set_bit(STATE_DOWNLOADING, &intel->flags);
  
  	/* Start the firmware download transaction with the Init fragment
  	 * represented by the 128 bytes of CSS header.
  	 */
09df123d2   Marcel Holtmann   Bluetooth: btinte...
701
  	err = btintel_secure_send(hdev, 0x00, 128, fw->data);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
702
  	if (err < 0) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
703
  		bt_dev_err(hdev, "Failed to send firmware header (%d)", err);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
704
705
706
707
708
709
  		goto done;
  	}
  
  	/* Send the 256 bytes of public key information from the firmware
  	 * as the PKey fragment.
  	 */
09df123d2   Marcel Holtmann   Bluetooth: btinte...
710
  	err = btintel_secure_send(hdev, 0x03, 256, fw->data + 128);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
711
  	if (err < 0) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
712
713
  		bt_dev_err(hdev, "Failed to send firmware public key (%d)",
  			   err);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
714
715
716
717
718
719
  		goto done;
  	}
  
  	/* Send the 256 bytes of signature information from the firmware
  	 * as the Sign fragment.
  	 */
09df123d2   Marcel Holtmann   Bluetooth: btinte...
720
  	err = btintel_secure_send(hdev, 0x02, 256, fw->data + 388);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
721
  	if (err < 0) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
722
723
  		bt_dev_err(hdev, "Failed to send firmware signature (%d)",
  			   err);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
724
725
726
727
728
729
730
731
732
733
  		goto done;
  	}
  
  	fw_ptr = fw->data + 644;
  	frag_len = 0;
  
  	while (fw_ptr - fw->data < fw->size) {
  		struct hci_command_hdr *cmd = (void *)(fw_ptr + frag_len);
  
  		frag_len += sizeof(*cmd) + cmd->plen;
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
734
735
  		bt_dev_dbg(hdev, "Patching %td/%zu", (fw_ptr - fw->data),
  			   fw->size);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
  
  		/* The parameter length of the secure send command requires
  		 * a 4 byte alignment. It happens so that the firmware file
  		 * contains proper Intel_NOP commands to align the fragments
  		 * as needed.
  		 *
  		 * Send set of commands with 4 byte alignment from the
  		 * firmware data buffer as a single Data fragement.
  		 */
  		if (frag_len % 4)
  			continue;
  
  		/* Send each command from the firmware data buffer as
  		 * a single Data fragment.
  		 */
09df123d2   Marcel Holtmann   Bluetooth: btinte...
751
  		err = btintel_secure_send(hdev, 0x01, frag_len, fw_ptr);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
752
  		if (err < 0) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
753
754
  			bt_dev_err(hdev, "Failed to send firmware data (%d)",
  				   err);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
755
756
757
758
759
760
761
762
  			goto done;
  		}
  
  		fw_ptr += frag_len;
  		frag_len = 0;
  	}
  
  	set_bit(STATE_FIRMWARE_LOADED, &intel->flags);
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
763
  	bt_dev_info(hdev, "Waiting for firmware download to complete");
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
  
  	/* Before switching the device into operational mode and with that
  	 * booting the loaded firmware, wait for the bootloader notification
  	 * that all fragments have been successfully received.
  	 *
  	 * When the event processing receives the notification, then the
  	 * STATE_DOWNLOADING flag will be cleared.
  	 *
  	 * The firmware loading should not take longer than 5 seconds
  	 * and thus just timeout if that happens and fail the setup
  	 * of this device.
  	 */
  	err = wait_on_bit_timeout(&intel->flags, STATE_DOWNLOADING,
  				  TASK_INTERRUPTIBLE,
  				  msecs_to_jiffies(5000));
f0a70a04c   Bart Van Assche   Bluetooth: btusb,...
779
  	if (err == -EINTR) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
780
  		bt_dev_err(hdev, "Firmware loading interrupted");
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
781
782
783
784
785
  		err = -EINTR;
  		goto done;
  	}
  
  	if (err) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
786
  		bt_dev_err(hdev, "Firmware loading timeout");
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
787
788
789
790
791
  		err = -ETIMEDOUT;
  		goto done;
  	}
  
  	if (test_bit(STATE_FIRMWARE_FAILED, &intel->flags)) {
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
792
  		bt_dev_err(hdev, "Firmware loading failed");
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
793
794
795
796
797
798
799
  		err = -ENOEXEC;
  		goto done;
  	}
  
  	rettime = ktime_get();
  	delta = ktime_sub(rettime, calltime);
  	duration = (unsigned long long) ktime_to_ns(delta) >> 10;
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
800
  	bt_dev_info(hdev, "Firmware loaded in %llu usecs", duration);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
801
802
803
804
805
806
  
  done:
  	release_firmware(fw);
  
  	if (err < 0)
  		return err;
ff2895592   Loic Poulain   Bluetooth: hci_in...
807
808
809
810
811
812
  	/* We need to restore the default speed before Intel reset */
  	if (speed_change) {
  		err = intel_set_baudrate(hu, init_speed);
  		if (err)
  			return err;
  	}
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
813
814
815
816
817
  	calltime = ktime_get();
  
  	set_bit(STATE_BOOTING, &intel->flags);
  
  	skb = __hci_cmd_sync(hdev, 0xfc01, sizeof(reset_param), reset_param,
a0c382451   Loic Poulain   Bluetooth: hci_in...
818
  			     HCI_CMD_TIMEOUT);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
819
820
821
822
823
824
825
826
827
828
829
830
  	if (IS_ERR(skb))
  		return PTR_ERR(skb);
  
  	kfree_skb(skb);
  
  	/* The bootloader will not indicate when the device is ready. This
  	 * is done by the operational firmware sending bootup notification.
  	 *
  	 * Booting into operational firmware should not take longer than
  	 * 1 second. However if that happens, then just fail the setup
  	 * since something went wrong.
  	 */
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
831
  	bt_dev_info(hdev, "Waiting for device to boot");
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
832

1ab1f239b   Loic Poulain   Bluetooth: hci_in...
833
834
835
  	err = intel_wait_booting(hu);
  	if (err)
  		return err;
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
836

1ab1f239b   Loic Poulain   Bluetooth: hci_in...
837
  	clear_bit(STATE_BOOTING, &intel->flags);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
838
839
840
841
  
  	rettime = ktime_get();
  	delta = ktime_sub(rettime, calltime);
  	duration = (unsigned long long) ktime_to_ns(delta) >> 10;
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
842
  	bt_dev_info(hdev, "Device booted in %llu usecs", duration);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
843

31eff2670   Loic Poulain   Bluetooth: hci_in...
844
845
846
  	/* Enable LPM if matching pdev with wakeup enabled, set TX active
  	 * until further LPM TX notification.
  	 */
67c8bde04   Loic Poulain   Bluetooth: hci_in...
847
  	mutex_lock(&intel_device_list_lock);
b98469f4b   Loic Poulain   Bluetooth: hci_in...
848
849
850
851
  	list_for_each(p, &intel_device_list) {
  		struct intel_device *dev = list_entry(p, struct intel_device,
  						      list);
  		if (hu->tty->dev->parent == dev->pdev->dev.parent) {
31eff2670   Loic Poulain   Bluetooth: hci_in...
852
853
854
855
  			if (device_may_wakeup(&dev->pdev->dev)) {
  				set_bit(STATE_LPM_ENABLED, &intel->flags);
  				set_bit(STATE_TX_ACTIVE, &intel->flags);
  			}
b98469f4b   Loic Poulain   Bluetooth: hci_in...
856
857
858
  			break;
  		}
  	}
67c8bde04   Loic Poulain   Bluetooth: hci_in...
859
  	mutex_unlock(&intel_device_list_lock);
b98469f4b   Loic Poulain   Bluetooth: hci_in...
860

1cfbabdd1   Loic Poulain   Bluetooth: hci_in...
861
862
  	/* Ignore errors, device can work without DDC parameters */
  	btintel_load_ddc_config(hdev, fwname);
ff2895592   Loic Poulain   Bluetooth: hci_in...
863
864
865
866
867
868
869
870
871
872
  	skb = __hci_cmd_sync(hdev, HCI_OP_RESET, 0, NULL, HCI_CMD_TIMEOUT);
  	if (IS_ERR(skb))
  		return PTR_ERR(skb);
  	kfree_skb(skb);
  
  	if (speed_change) {
  		err = intel_set_baudrate(hu, oper_speed);
  		if (err)
  			return err;
  	}
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
873
  	bt_dev_info(hdev, "Setup complete");
ff2895592   Loic Poulain   Bluetooth: hci_in...
874

ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
875
876
877
878
879
880
881
882
883
884
  	clear_bit(STATE_BOOTLOADER, &intel->flags);
  
  	return 0;
  }
  
  static int intel_recv_event(struct hci_dev *hdev, struct sk_buff *skb)
  {
  	struct hci_uart *hu = hci_get_drvdata(hdev);
  	struct intel_data *intel = hu->priv;
  	struct hci_event_hdr *hdr;
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
885
886
  	if (!test_bit(STATE_BOOTLOADER, &intel->flags) &&
  	    !test_bit(STATE_BOOTING, &intel->flags))
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
  		goto recv;
  
  	hdr = (void *)skb->data;
  
  	/* When the firmware loading completes the device sends
  	 * out a vendor specific event indicating the result of
  	 * the firmware loading.
  	 */
  	if (skb->len == 7 && hdr->evt == 0xff && hdr->plen == 0x05 &&
  	    skb->data[2] == 0x06) {
  		if (skb->data[3] != 0x00)
  			set_bit(STATE_FIRMWARE_FAILED, &intel->flags);
  
  		if (test_and_clear_bit(STATE_DOWNLOADING, &intel->flags) &&
  		    test_bit(STATE_FIRMWARE_LOADED, &intel->flags)) {
  			smp_mb__after_atomic();
  			wake_up_bit(&intel->flags, STATE_DOWNLOADING);
  		}
  
  	/* When switching to the operational firmware the device
  	 * sends a vendor specific event indicating that the bootup
  	 * completed.
  	 */
  	} else if (skb->len == 9 && hdr->evt == 0xff && hdr->plen == 0x07 &&
  		   skb->data[2] == 0x02) {
  		if (test_and_clear_bit(STATE_BOOTING, &intel->flags)) {
  			smp_mb__after_atomic();
  			wake_up_bit(&intel->flags, STATE_BOOTING);
  		}
  	}
  recv:
  	return hci_recv_frame(hdev, skb);
  }
b98469f4b   Loic Poulain   Bluetooth: hci_in...
920
921
922
923
  static void intel_recv_lpm_notify(struct hci_dev *hdev, int value)
  {
  	struct hci_uart *hu = hci_get_drvdata(hdev);
  	struct intel_data *intel = hu->priv;
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
924
  	bt_dev_dbg(hdev, "TX idle notification (%d)", value);
b98469f4b   Loic Poulain   Bluetooth: hci_in...
925

74cdad37c   Loic Poulain   Bluetooth: hci_in...
926
  	if (value) {
b98469f4b   Loic Poulain   Bluetooth: hci_in...
927
  		set_bit(STATE_TX_ACTIVE, &intel->flags);
74cdad37c   Loic Poulain   Bluetooth: hci_in...
928
929
  		schedule_work(&intel->busy_work);
  	} else {
b98469f4b   Loic Poulain   Bluetooth: hci_in...
930
  		clear_bit(STATE_TX_ACTIVE, &intel->flags);
74cdad37c   Loic Poulain   Bluetooth: hci_in...
931
  	}
b98469f4b   Loic Poulain   Bluetooth: hci_in...
932
933
934
935
936
  }
  
  static int intel_recv_lpm(struct hci_dev *hdev, struct sk_buff *skb)
  {
  	struct hci_lpm_pkt *lpm = (void *)skb->data;
894365468   Loic Poulain   Bluetooth: hci_in...
937
938
  	struct hci_uart *hu = hci_get_drvdata(hdev);
  	struct intel_data *intel = hu->priv;
b98469f4b   Loic Poulain   Bluetooth: hci_in...
939
940
941
  
  	switch (lpm->opcode) {
  	case LPM_OP_TX_NOTIFY:
1b1975749   Loic Poulain   Bluetooth: hci_in...
942
943
944
945
946
  		if (lpm->dlen < 1) {
  			bt_dev_err(hu->hdev, "Invalid LPM notification packet");
  			break;
  		}
  		intel_recv_lpm_notify(hdev, lpm->data[0]);
b98469f4b   Loic Poulain   Bluetooth: hci_in...
947
  		break;
894365468   Loic Poulain   Bluetooth: hci_in...
948
949
950
951
952
953
954
955
956
957
958
959
960
961
  	case LPM_OP_SUSPEND_ACK:
  		set_bit(STATE_SUSPENDED, &intel->flags);
  		if (test_and_clear_bit(STATE_LPM_TRANSACTION, &intel->flags)) {
  			smp_mb__after_atomic();
  			wake_up_bit(&intel->flags, STATE_LPM_TRANSACTION);
  		}
  		break;
  	case LPM_OP_RESUME_ACK:
  		clear_bit(STATE_SUSPENDED, &intel->flags);
  		if (test_and_clear_bit(STATE_LPM_TRANSACTION, &intel->flags)) {
  			smp_mb__after_atomic();
  			wake_up_bit(&intel->flags, STATE_LPM_TRANSACTION);
  		}
  		break;
b98469f4b   Loic Poulain   Bluetooth: hci_in...
962
  	default:
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
963
  		bt_dev_err(hdev, "Unknown LPM opcode (%02x)", lpm->opcode);
b98469f4b   Loic Poulain   Bluetooth: hci_in...
964
965
966
967
968
969
970
971
972
973
974
975
976
977
  		break;
  	}
  
  	kfree_skb(skb);
  
  	return 0;
  }
  
  #define INTEL_RECV_LPM \
  	.type = HCI_LPM_PKT, \
  	.hlen = HCI_LPM_HDR_SIZE, \
  	.loff = 1, \
  	.lsize = 1, \
  	.maxlen = HCI_LPM_MAX_SIZE
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
978
  static const struct h4_recv_pkt intel_recv_pkts[] = {
b98469f4b   Loic Poulain   Bluetooth: hci_in...
979
980
981
982
  	{ H4_RECV_ACL,    .recv = hci_recv_frame   },
  	{ H4_RECV_SCO,    .recv = hci_recv_frame   },
  	{ H4_RECV_EVENT,  .recv = intel_recv_event },
  	{ INTEL_RECV_LPM, .recv = intel_recv_lpm   },
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
983
984
985
986
987
988
989
990
991
992
993
994
995
996
  };
  
  static int intel_recv(struct hci_uart *hu, const void *data, int count)
  {
  	struct intel_data *intel = hu->priv;
  
  	if (!test_bit(HCI_UART_REGISTERED, &hu->flags))
  		return -EUNATCH;
  
  	intel->rx_skb = h4_recv_buf(hu->hdev, intel->rx_skb, data, count,
  				    intel_recv_pkts,
  				    ARRAY_SIZE(intel_recv_pkts));
  	if (IS_ERR(intel->rx_skb)) {
  		int err = PTR_ERR(intel->rx_skb);
f44e78a5f   Loic Poulain   Bluetooth: hci_in...
997
  		bt_dev_err(hu->hdev, "Frame reassembly failed (%d)", err);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
998
999
1000
1001
1002
1003
1004
1005
1006
1007
  		intel->rx_skb = NULL;
  		return err;
  	}
  
  	return count;
  }
  
  static int intel_enqueue(struct hci_uart *hu, struct sk_buff *skb)
  {
  	struct intel_data *intel = hu->priv;
74cdad37c   Loic Poulain   Bluetooth: hci_in...
1008
  	struct list_head *p;
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
1009
1010
  
  	BT_DBG("hu %p skb %p", hu, skb);
74cdad37c   Loic Poulain   Bluetooth: hci_in...
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
  	/* Be sure our controller is resumed and potential LPM transaction
  	 * completed before enqueuing any packet.
  	 */
  	mutex_lock(&intel_device_list_lock);
  	list_for_each(p, &intel_device_list) {
  		struct intel_device *idev = list_entry(p, struct intel_device,
  						       list);
  
  		if (hu->tty->dev->parent == idev->pdev->dev.parent) {
  			pm_runtime_get_sync(&idev->pdev->dev);
  			pm_runtime_mark_last_busy(&idev->pdev->dev);
  			pm_runtime_put_autosuspend(&idev->pdev->dev);
  			break;
  		}
  	}
  	mutex_unlock(&intel_device_list_lock);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
  	skb_queue_tail(&intel->txq, skb);
  
  	return 0;
  }
  
  static struct sk_buff *intel_dequeue(struct hci_uart *hu)
  {
  	struct intel_data *intel = hu->priv;
  	struct sk_buff *skb;
  
  	skb = skb_dequeue(&intel->txq);
  	if (!skb)
  		return skb;
  
  	if (test_bit(STATE_BOOTLOADER, &intel->flags) &&
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
1042
  	    (hci_skb_pkt_type(skb) == HCI_COMMAND_PKT)) {
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
  		struct hci_command_hdr *cmd = (void *)skb->data;
  		__u16 opcode = le16_to_cpu(cmd->opcode);
  
  		/* When the 0xfc01 command is issued to boot into
  		 * the operational firmware, it will actually not
  		 * send a command complete event. To keep the flow
  		 * control working inject that event here.
  		 */
  		if (opcode == 0xfc01)
  			inject_cmd_complete(hu->hdev, opcode);
  	}
  
  	/* Prepend skb with frame type */
618e8bc22   Marcel Holtmann   Bluetooth: Use ne...
1056
  	memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
1057
1058
1059
1060
1061
1062
1063
  
  	return skb;
  }
  
  static const struct hci_uart_proto intel_proto = {
  	.id		= HCI_UART_INTEL,
  	.name		= "Intel",
aee61f7aa   Marcel Holtmann   Bluetooth: hci_ua...
1064
  	.manufacturer	= 2,
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
1065
  	.init_speed	= 115200,
ff2895592   Loic Poulain   Bluetooth: hci_in...
1066
  	.oper_speed	= 3000000,
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
1067
1068
1069
1070
  	.open		= intel_open,
  	.close		= intel_close,
  	.flush		= intel_flush,
  	.setup		= intel_setup,
ff2895592   Loic Poulain   Bluetooth: hci_in...
1071
  	.set_baudrate	= intel_set_baudrate,
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
1072
1073
1074
1075
  	.recv		= intel_recv,
  	.enqueue	= intel_enqueue,
  	.dequeue	= intel_dequeue,
  };
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
1076
1077
1078
1079
1080
1081
  #ifdef CONFIG_ACPI
  static const struct acpi_device_id intel_acpi_match[] = {
  	{ "INT33E1", 0 },
  	{ },
  };
  MODULE_DEVICE_TABLE(acpi, intel_acpi_match);
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
1082
  #endif
74cdad37c   Loic Poulain   Bluetooth: hci_in...
1083
  #ifdef CONFIG_PM
f75524737   Loic Poulain   Bluetooth: hci_in...
1084
  static int intel_suspend_device(struct device *dev)
aa6802df0   Loic Poulain   Bluetooth: hci_in...
1085
1086
  {
  	struct intel_device *idev = dev_get_drvdata(dev);
aa6802df0   Loic Poulain   Bluetooth: hci_in...
1087
1088
1089
1090
1091
1092
1093
  	mutex_lock(&idev->hu_lock);
  	if (idev->hu)
  		intel_lpm_suspend(idev->hu);
  	mutex_unlock(&idev->hu_lock);
  
  	return 0;
  }
f75524737   Loic Poulain   Bluetooth: hci_in...
1094
  static int intel_resume_device(struct device *dev)
aa6802df0   Loic Poulain   Bluetooth: hci_in...
1095
1096
  {
  	struct intel_device *idev = dev_get_drvdata(dev);
aa6802df0   Loic Poulain   Bluetooth: hci_in...
1097
1098
1099
1100
1101
1102
1103
1104
  	mutex_lock(&idev->hu_lock);
  	if (idev->hu)
  		intel_lpm_resume(idev->hu);
  	mutex_unlock(&idev->hu_lock);
  
  	return 0;
  }
  #endif
f75524737   Loic Poulain   Bluetooth: hci_in...
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
  #ifdef CONFIG_PM_SLEEP
  static int intel_suspend(struct device *dev)
  {
  	struct intel_device *idev = dev_get_drvdata(dev);
  
  	if (device_may_wakeup(dev))
  		enable_irq_wake(idev->irq);
  
  	return intel_suspend_device(dev);
  }
  
  static int intel_resume(struct device *dev)
  {
  	struct intel_device *idev = dev_get_drvdata(dev);
  
  	if (device_may_wakeup(dev))
  		disable_irq_wake(idev->irq);
  
  	return intel_resume_device(dev);
  }
  #endif
aa6802df0   Loic Poulain   Bluetooth: hci_in...
1126
1127
  static const struct dev_pm_ops intel_pm_ops = {
  	SET_SYSTEM_SLEEP_PM_OPS(intel_suspend, intel_resume)
f75524737   Loic Poulain   Bluetooth: hci_in...
1128
  	SET_RUNTIME_PM_OPS(intel_suspend_device, intel_resume_device, NULL)
aa6802df0   Loic Poulain   Bluetooth: hci_in...
1129
  };
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
1130
1131
1132
1133
1134
1135
1136
  static int intel_probe(struct platform_device *pdev)
  {
  	struct intel_device *idev;
  
  	idev = devm_kzalloc(&pdev->dev, sizeof(*idev), GFP_KERNEL);
  	if (!idev)
  		return -ENOMEM;
aa6802df0   Loic Poulain   Bluetooth: hci_in...
1137
  	mutex_init(&idev->hu_lock);
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
1138
  	idev->pdev = pdev;
32b9ccbc3   Loic Poulain   Bluetooth: hci_in...
1139
  	idev->reset = devm_gpiod_get(&pdev->dev, "reset", GPIOD_OUT_LOW);
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
1140
1141
1142
1143
1144
  	if (IS_ERR(idev->reset)) {
  		dev_err(&pdev->dev, "Unable to retrieve gpio
  ");
  		return PTR_ERR(idev->reset);
  	}
765ea3abd   Loic Poulain   Bluetooth: hci_in...
1145
1146
1147
1148
1149
1150
  	idev->irq = platform_get_irq(pdev, 0);
  	if (idev->irq < 0) {
  		struct gpio_desc *host_wake;
  
  		dev_err(&pdev->dev, "No IRQ, falling back to gpio-irq
  ");
32b9ccbc3   Loic Poulain   Bluetooth: hci_in...
1151
  		host_wake = devm_gpiod_get(&pdev->dev, "host-wake", GPIOD_IN);
765ea3abd   Loic Poulain   Bluetooth: hci_in...
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
  		if (IS_ERR(host_wake)) {
  			dev_err(&pdev->dev, "Unable to retrieve IRQ
  ");
  			goto no_irq;
  		}
  
  		idev->irq = gpiod_to_irq(host_wake);
  		if (idev->irq < 0) {
  			dev_err(&pdev->dev, "No corresponding irq for gpio
  ");
  			goto no_irq;
  		}
  	}
  
  	/* Only enable wake-up/irq when controller is powered */
  	device_set_wakeup_capable(&pdev->dev, true);
  	device_wakeup_disable(&pdev->dev);
  
  no_irq:
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
1171
1172
1173
  	platform_set_drvdata(pdev, idev);
  
  	/* Place this instance on the device list */
67c8bde04   Loic Poulain   Bluetooth: hci_in...
1174
  	mutex_lock(&intel_device_list_lock);
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
1175
  	list_add_tail(&idev->list, &intel_device_list);
67c8bde04   Loic Poulain   Bluetooth: hci_in...
1176
  	mutex_unlock(&intel_device_list_lock);
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
1177

765ea3abd   Loic Poulain   Bluetooth: hci_in...
1178
1179
1180
  	dev_info(&pdev->dev, "registered, gpio(%d)/irq(%d).
  ",
  		 desc_to_gpio(idev->reset), idev->irq);
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
1181
1182
1183
1184
1185
1186
1187
  
  	return 0;
  }
  
  static int intel_remove(struct platform_device *pdev)
  {
  	struct intel_device *idev = platform_get_drvdata(pdev);
765ea3abd   Loic Poulain   Bluetooth: hci_in...
1188
  	device_wakeup_disable(&pdev->dev);
67c8bde04   Loic Poulain   Bluetooth: hci_in...
1189
  	mutex_lock(&intel_device_list_lock);
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
1190
  	list_del(&idev->list);
67c8bde04   Loic Poulain   Bluetooth: hci_in...
1191
  	mutex_unlock(&intel_device_list_lock);
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
  
  	dev_info(&pdev->dev, "unregistered.
  ");
  
  	return 0;
  }
  
  static struct platform_driver intel_driver = {
  	.probe = intel_probe,
  	.remove = intel_remove,
  	.driver = {
  		.name = "hci_intel",
  		.acpi_match_table = ACPI_PTR(intel_acpi_match),
aa6802df0   Loic Poulain   Bluetooth: hci_in...
1205
  		.pm = &intel_pm_ops,
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
1206
1207
  	},
  };
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
1208
1209
  int __init intel_init(void)
  {
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
1210
  	platform_driver_register(&intel_driver);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
1211
1212
1213
1214
1215
  	return hci_uart_register_proto(&intel_proto);
  }
  
  int __exit intel_deinit(void)
  {
1ab1f239b   Loic Poulain   Bluetooth: hci_in...
1216
  	platform_driver_unregister(&intel_driver);
ca93cee5a   Loic Poulain   Bluetooth: hci_ua...
1217
1218
  	return hci_uart_unregister_proto(&intel_proto);
  }