hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/bluetooth/btsdio.c
....@@ -1,25 +1,10 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /*
23 *
34 * Generic Bluetooth SDIO driver
45 *
56 * Copyright (C) 2007 Cambridge Silicon Radio Ltd.
67 * Copyright (C) 2007 Marcel Holtmann <marcel@holtmann.org>
7
- *
8
- *
9
- * This program is free software; you can redistribute it and/or modify
10
- * it under the terms of the GNU General Public License as published by
11
- * the Free Software Foundation; either version 2 of the License, or
12
- * (at your option) any later version.
13
- *
14
- * This program is distributed in the hope that it will be useful,
15
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- * GNU General Public License for more details.
18
- *
19
- * You should have received a copy of the GNU General Public License
20
- * along with this program; if not, write to the Free Software
21
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22
- *
238 */
249
2510 #include <linux/kernel.h>
....@@ -160,11 +145,20 @@
160145
161146 data->hdev->stat.byte_rx += len;
162147
163
- hci_skb_pkt_type(skb) = hdr[3];
164
-
165
- err = hci_recv_frame(data->hdev, skb);
166
- if (err < 0)
167
- return err;
148
+ switch (hdr[3]) {
149
+ case HCI_EVENT_PKT:
150
+ case HCI_ACLDATA_PKT:
151
+ case HCI_SCODATA_PKT:
152
+ case HCI_ISODATA_PKT:
153
+ hci_skb_pkt_type(skb) = hdr[3];
154
+ err = hci_recv_frame(data->hdev, skb);
155
+ if (err < 0)
156
+ return err;
157
+ break;
158
+ default:
159
+ kfree_skb(skb);
160
+ return -EINVAL;
161
+ }
168162
169163 sdio_writeb(data->func, 0x00, REG_PC_RRT, NULL);
170164
....@@ -293,13 +287,18 @@
293287 tuple = tuple->next;
294288 }
295289
296
- /* BCM43341 devices soldered onto the PCB (non-removable) use an
297
- * uart connection for bluetooth, ignore the BT SDIO interface.
290
+ /* Broadcom devices soldered onto the PCB (non-removable) use an
291
+ * UART connection for Bluetooth, ignore the BT SDIO interface.
298292 */
299293 if (func->vendor == SDIO_VENDOR_ID_BROADCOM &&
300
- func->device == SDIO_DEVICE_ID_BROADCOM_43341 &&
301
- !mmc_card_is_removable(func->card->host))
302
- return -ENODEV;
294
+ !mmc_card_is_removable(func->card->host)) {
295
+ switch (func->device) {
296
+ case SDIO_DEVICE_ID_BROADCOM_43341:
297
+ case SDIO_DEVICE_ID_BROADCOM_43430:
298
+ case SDIO_DEVICE_ID_BROADCOM_4356:
299
+ return -ENODEV;
300
+ }
301
+ }
303302
304303 data = devm_kzalloc(&func->dev, sizeof(*data), GFP_KERNEL);
305304 if (!data)
....@@ -356,6 +355,7 @@
356355 if (!data)
357356 return;
358357
358
+ cancel_work_sync(&data->work);
359359 hdev = data->hdev;
360360
361361 sdio_set_drvdata(func, NULL);
....@@ -372,20 +372,7 @@
372372 .id_table = btsdio_table,
373373 };
374374
375
-static int __init btsdio_init(void)
376
-{
377
- BT_INFO("Generic Bluetooth SDIO driver ver %s", VERSION);
378
-
379
- return sdio_register_driver(&btsdio_driver);
380
-}
381
-
382
-static void __exit btsdio_exit(void)
383
-{
384
- sdio_unregister_driver(&btsdio_driver);
385
-}
386
-
387
-module_init(btsdio_init);
388
-module_exit(btsdio_exit);
375
+module_sdio_driver(btsdio_driver);
389376
390377 MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
391378 MODULE_DESCRIPTION("Generic Bluetooth SDIO driver ver " VERSION);