hc
2024-05-16 8d2a02b24d66aa359e83eebc1ed3c0f85367a1cb
kernel/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c
....@@ -1,16 +1,6 @@
1
-/* Copyright (c) 2014 Broadcom Corporation
2
- *
3
- * Permission to use, copy, modify, and/or distribute this software for any
4
- * purpose with or without fee is hereby granted, provided that the above
5
- * copyright notice and this permission notice appear in all copies.
6
- *
7
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
10
- * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
12
- * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
13
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1
+// SPDX-License-Identifier: ISC
2
+/*
3
+ * Copyright (c) 2014 Broadcom Corporation
144 */
155
166 #include <linux/kernel.h>
....@@ -22,6 +12,7 @@
2212 #include <linux/interrupt.h>
2313 #include <linux/bcma/bcma.h>
2414 #include <linux/sched.h>
15
+#include <linux/io.h>
2516 #include <asm/unaligned.h>
2617
2718 #include <soc.h>
....@@ -29,6 +20,15 @@
2920 #include <brcmu_utils.h>
3021 #include <brcmu_wifi.h>
3122 #include <brcm_hw_ids.h>
23
+
24
+/* Custom brcmf_err() that takes bus arg and passes it further */
25
+#define brcmf_err(bus, fmt, ...) \
26
+ do { \
27
+ if (IS_ENABLED(CONFIG_BRCMDBG) || \
28
+ IS_ENABLED(CONFIG_BRCM_TRACING) || \
29
+ net_ratelimit()) \
30
+ __brcmf_err(bus, __func__, fmt, ##__VA_ARGS__); \
31
+ } while (0)
3232
3333 #include "debug.h"
3434 #include "bus.h"
....@@ -53,6 +53,7 @@
5353 BRCMF_FW_DEF(43570, "brcmfmac43570-pcie");
5454 BRCMF_FW_DEF(4358, "brcmfmac4358-pcie");
5555 BRCMF_FW_DEF(4359, "brcmfmac4359-pcie");
56
+BRCMF_FW_DEF(4364, "brcmfmac4364-pcie");
5657 BRCMF_FW_DEF(4365B, "brcmfmac4365b-pcie");
5758 BRCMF_FW_DEF(4365C, "brcmfmac4365c-pcie");
5859 BRCMF_FW_DEF(4366B, "brcmfmac4366b-pcie");
....@@ -71,6 +72,7 @@
7172 BRCMF_FW_ENTRY(BRCM_CC_43570_CHIP_ID, 0xFFFFFFFF, 43570),
7273 BRCMF_FW_ENTRY(BRCM_CC_4358_CHIP_ID, 0xFFFFFFFF, 4358),
7374 BRCMF_FW_ENTRY(BRCM_CC_4359_CHIP_ID, 0xFFFFFFFF, 4359),
75
+ BRCMF_FW_ENTRY(BRCM_CC_4364_CHIP_ID, 0xFFFFFFFF, 4364),
7476 BRCMF_FW_ENTRY(BRCM_CC_4365_CHIP_ID, 0x0000000F, 4365B),
7577 BRCMF_FW_ENTRY(BRCM_CC_4365_CHIP_ID, 0xFFFFFFF0, 4365C),
7678 BRCMF_FW_ENTRY(BRCM_CC_4366_CHIP_ID, 0x0000000F, 4366B),
....@@ -79,7 +81,7 @@
7981 BRCMF_FW_ENTRY(BRCM_CC_4371_CHIP_ID, 0xFFFFFFFF, 4371),
8082 };
8183
82
-#define BRCMF_PCIE_FW_UP_TIMEOUT 2000 /* msec */
84
+#define BRCMF_PCIE_FW_UP_TIMEOUT 5000 /* msec */
8385
8486 #define BRCMF_PCIE_REG_MAP_SIZE (32 * 1024)
8587
....@@ -336,6 +338,10 @@
336338 BRCMF_D2H_MSGRING_RX_COMPLETE_ITEMSIZE
337339 };
338340
341
+static void brcmf_pcie_setup(struct device *dev, int ret,
342
+ struct brcmf_fw_request *fwreq);
343
+static struct brcmf_fw_request *
344
+brcmf_pcie_prepare_fw_request(struct brcmf_pciedev_info *devinfo);
339345
340346 static u32
341347 brcmf_pcie_read_reg32(struct brcmf_pciedev_info *devinfo, u32 reg_offset)
....@@ -442,47 +448,6 @@
442448
443449
444450 static void
445
-brcmf_pcie_copy_mem_todev(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
446
- void *srcaddr, u32 len)
447
-{
448
- void __iomem *address = devinfo->tcm + mem_offset;
449
- __le32 *src32;
450
- __le16 *src16;
451
- u8 *src8;
452
-
453
- if (((ulong)address & 4) || ((ulong)srcaddr & 4) || (len & 4)) {
454
- if (((ulong)address & 2) || ((ulong)srcaddr & 2) || (len & 2)) {
455
- src8 = (u8 *)srcaddr;
456
- while (len) {
457
- iowrite8(*src8, address);
458
- address++;
459
- src8++;
460
- len--;
461
- }
462
- } else {
463
- len = len / 2;
464
- src16 = (__le16 *)srcaddr;
465
- while (len) {
466
- iowrite16(le16_to_cpu(*src16), address);
467
- address += 2;
468
- src16++;
469
- len--;
470
- }
471
- }
472
- } else {
473
- len = len / 4;
474
- src32 = (__le32 *)srcaddr;
475
- while (len) {
476
- iowrite32(le32_to_cpu(*src32), address);
477
- address += 4;
478
- src32++;
479
- len--;
480
- }
481
- }
482
-}
483
-
484
-
485
-static void
486451 brcmf_pcie_copy_dev_tomem(struct brcmf_pciedev_info *devinfo, u32 mem_offset,
487452 void *dstaddr, u32 len)
488453 {
....@@ -531,6 +496,7 @@
531496 brcmf_pcie_select_core(struct brcmf_pciedev_info *devinfo, u16 coreid)
532497 {
533498 const struct pci_dev *pdev = devinfo->pdev;
499
+ struct brcmf_bus *bus = dev_get_drvdata(&pdev->dev);
534500 struct brcmf_core *core;
535501 u32 bar0_win;
536502
....@@ -548,7 +514,7 @@
548514 }
549515 }
550516 } else {
551
- brcmf_err("Unsupported core selected %x\n", coreid);
517
+ brcmf_err(bus, "Unsupported core selected %x\n", coreid);
552518 }
553519 }
554520
....@@ -652,7 +618,7 @@
652618 }
653619
654620 if (!brcmf_chip_set_active(devinfo->ci, resetintr))
655
- return -EINVAL;
621
+ return -EIO;
656622 return 0;
657623 }
658624
....@@ -661,6 +627,7 @@
661627 brcmf_pcie_send_mb_data(struct brcmf_pciedev_info *devinfo, u32 htod_mb_data)
662628 {
663629 struct brcmf_pcie_shared_info *shared;
630
+ struct brcmf_core *core;
664631 u32 addr;
665632 u32 cur_htod_mb_data;
666633 u32 i;
....@@ -684,7 +651,11 @@
684651
685652 brcmf_pcie_write_tcm32(devinfo, addr, htod_mb_data);
686653 pci_write_config_dword(devinfo->pdev, BRCMF_PCIE_REG_SBMBX, 1);
687
- pci_write_config_dword(devinfo->pdev, BRCMF_PCIE_REG_SBMBX, 1);
654
+
655
+ /* Send mailbox interrupt twice as a hardware workaround */
656
+ core = brcmf_chip_get_core(devinfo->ci, BCMA_CORE_PCIE2);
657
+ if (core->rev <= 13)
658
+ pci_write_config_dword(devinfo->pdev, BRCMF_PCIE_REG_SBMBX, 1);
688659
689660 return 0;
690661 }
....@@ -720,7 +691,7 @@
720691 }
721692 if (dtoh_mb_data & BRCMF_D2H_DEV_FWHALT) {
722693 brcmf_dbg(PCIE, "D2H_MB_DATA: FW HALT\n");
723
- brcmf_dev_coredump(&devinfo->pdev->dev);
694
+ brcmf_fw_crashed(&devinfo->pdev->dev);
724695 }
725696 }
726697
....@@ -745,15 +716,22 @@
745716 console->base_addr, console->buf_addr, console->bufsize);
746717 }
747718
748
-
749
-static void brcmf_pcie_bus_console_read(struct brcmf_pciedev_info *devinfo)
719
+/**
720
+ * brcmf_pcie_bus_console_read - reads firmware messages
721
+ *
722
+ * @error: specifies if error has occurred (prints messages unconditionally)
723
+ */
724
+static void brcmf_pcie_bus_console_read(struct brcmf_pciedev_info *devinfo,
725
+ bool error)
750726 {
727
+ struct pci_dev *pdev = devinfo->pdev;
728
+ struct brcmf_bus *bus = dev_get_drvdata(&pdev->dev);
751729 struct brcmf_pcie_console *console;
752730 u32 addr;
753731 u8 ch;
754732 u32 newidx;
755733
756
- if (!BRCMF_FWCON_ON())
734
+ if (!error && !BRCMF_FWCON_ON())
757735 return;
758736
759737 console = &devinfo->shared.console;
....@@ -777,7 +755,11 @@
777755 }
778756 if (ch == '\n') {
779757 console->log_str[console->log_idx] = 0;
780
- pr_debug("CONSOLE: %s", console->log_str);
758
+ if (error)
759
+ __brcmf_err(bus, __func__, "CONSOLE: %s",
760
+ console->log_str);
761
+ else
762
+ pr_debug("CONSOLE: %s", console->log_str);
781763 console->log_idx = 0;
782764 }
783765 }
....@@ -838,7 +820,7 @@
838820 &devinfo->pdev->dev);
839821 }
840822 }
841
- brcmf_pcie_bus_console_read(devinfo);
823
+ brcmf_pcie_bus_console_read(devinfo, false);
842824 if (devinfo->state == BRCMFMAC_PCIE_STATE_UP)
843825 brcmf_pcie_intr_enable(devinfo);
844826 devinfo->in_irq = false;
....@@ -848,9 +830,8 @@
848830
849831 static int brcmf_pcie_request_irq(struct brcmf_pciedev_info *devinfo)
850832 {
851
- struct pci_dev *pdev;
852
-
853
- pdev = devinfo->pdev;
833
+ struct pci_dev *pdev = devinfo->pdev;
834
+ struct brcmf_bus *bus = dev_get_drvdata(&pdev->dev);
854835
855836 brcmf_pcie_intr_disable(devinfo);
856837
....@@ -861,7 +842,7 @@
861842 brcmf_pcie_isr_thread, IRQF_SHARED,
862843 "brcmf_pcie_intr", devinfo)) {
863844 pci_disable_msi(pdev);
864
- brcmf_err("Failed to request IRQ %d\n", pdev->irq);
845
+ brcmf_err(bus, "Failed to request IRQ %d\n", pdev->irq);
865846 return -EIO;
866847 }
867848 devinfo->irq_allocated = true;
....@@ -871,14 +852,13 @@
871852
872853 static void brcmf_pcie_release_irq(struct brcmf_pciedev_info *devinfo)
873854 {
874
- struct pci_dev *pdev;
855
+ struct pci_dev *pdev = devinfo->pdev;
856
+ struct brcmf_bus *bus = dev_get_drvdata(&pdev->dev);
875857 u32 status;
876858 u32 count;
877859
878860 if (!devinfo->irq_allocated)
879861 return;
880
-
881
- pdev = devinfo->pdev;
882862
883863 brcmf_pcie_intr_disable(devinfo);
884864 free_irq(pdev->irq, devinfo);
....@@ -891,7 +871,7 @@
891871 count++;
892872 }
893873 if (devinfo->in_irq)
894
- brcmf_err("Still in IRQ (processing) !!!\n");
874
+ brcmf_err(bus, "Still in IRQ (processing) !!!\n");
895875
896876 status = brcmf_pcie_read_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT);
897877 brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_PCIE2REG_MAILBOXINT, status);
....@@ -1006,8 +986,6 @@
1006986 address & 0xffffffff);
1007987 brcmf_pcie_write_tcm32(devinfo, tcm_dma_phys_addr + 4, address >> 32);
1008988
1009
- memset(ring, 0, size);
1010
-
1011989 return (ring);
1012990 }
1013991
....@@ -1102,6 +1080,7 @@
11021080
11031081 static int brcmf_pcie_init_ringbuffers(struct brcmf_pciedev_info *devinfo)
11041082 {
1083
+ struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
11051084 struct brcmf_pcie_ringbuf *ring;
11061085 struct brcmf_pcie_ringbuf *rings;
11071086 u32 d2h_w_idx_ptr;
....@@ -1129,6 +1108,10 @@
11291108 max_flowrings = max_submissionrings -
11301109 BRCMF_NROF_H2D_COMMON_MSGRINGS;
11311110 max_completionrings = BRCMF_NROF_D2H_COMMON_MSGRINGS;
1111
+ }
1112
+ if (max_flowrings > 512) {
1113
+ brcmf_err(bus, "invalid max_flowrings(%d)\n", max_flowrings);
1114
+ return -EIO;
11321115 }
11331116
11341117 if (devinfo->dma_idx_sz != 0) {
....@@ -1254,7 +1237,7 @@
12541237 return 0;
12551238
12561239 fail:
1257
- brcmf_err("Allocating ring buffers failed\n");
1240
+ brcmf_err(bus, "Allocating ring buffers failed\n");
12581241 brcmf_pcie_release_ringbuffers(devinfo);
12591242 return -ENOMEM;
12601243 }
....@@ -1277,14 +1260,15 @@
12771260
12781261 static int brcmf_pcie_init_scratchbuffers(struct brcmf_pciedev_info *devinfo)
12791262 {
1263
+ struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
12801264 u64 address;
12811265 u32 addr;
12821266
12831267 devinfo->shared.scratch =
1284
- dma_zalloc_coherent(&devinfo->pdev->dev,
1285
- BRCMF_DMA_D2H_SCRATCH_BUF_LEN,
1286
- &devinfo->shared.scratch_dmahandle,
1287
- GFP_KERNEL);
1268
+ dma_alloc_coherent(&devinfo->pdev->dev,
1269
+ BRCMF_DMA_D2H_SCRATCH_BUF_LEN,
1270
+ &devinfo->shared.scratch_dmahandle,
1271
+ GFP_KERNEL);
12881272 if (!devinfo->shared.scratch)
12891273 goto fail;
12901274
....@@ -1298,10 +1282,10 @@
12981282 brcmf_pcie_write_tcm32(devinfo, addr, BRCMF_DMA_D2H_SCRATCH_BUF_LEN);
12991283
13001284 devinfo->shared.ringupd =
1301
- dma_zalloc_coherent(&devinfo->pdev->dev,
1302
- BRCMF_DMA_D2H_RINGUPD_BUF_LEN,
1303
- &devinfo->shared.ringupd_dmahandle,
1304
- GFP_KERNEL);
1285
+ dma_alloc_coherent(&devinfo->pdev->dev,
1286
+ BRCMF_DMA_D2H_RINGUPD_BUF_LEN,
1287
+ &devinfo->shared.ringupd_dmahandle,
1288
+ GFP_KERNEL);
13051289 if (!devinfo->shared.ringupd)
13061290 goto fail;
13071291
....@@ -1316,7 +1300,7 @@
13161300 return 0;
13171301
13181302 fail:
1319
- brcmf_err("Allocating scratch buffers failed\n");
1303
+ brcmf_err(bus, "Allocating scratch buffers failed\n");
13201304 brcmf_pcie_release_scratchbuffers(devinfo);
13211305 return -ENOMEM;
13221306 }
....@@ -1326,6 +1310,18 @@
13261310 {
13271311 }
13281312
1313
+static int brcmf_pcie_preinit(struct device *dev)
1314
+{
1315
+ struct brcmf_bus *bus_if = dev_get_drvdata(dev);
1316
+ struct brcmf_pciedev *buspub = bus_if->bus_priv.pcie;
1317
+
1318
+ brcmf_dbg(PCIE, "Enter\n");
1319
+
1320
+ brcmf_pcie_intr_enable(buspub->devinfo);
1321
+ brcmf_pcie_hostready(buspub->devinfo);
1322
+
1323
+ return 0;
1324
+}
13291325
13301326 static int brcmf_pcie_tx(struct device *dev, struct sk_buff *skb)
13311327 {
....@@ -1399,7 +1395,42 @@
13991395 return 0;
14001396 }
14011397
1398
+static int brcmf_pcie_reset(struct device *dev)
1399
+{
1400
+ struct brcmf_bus *bus_if = dev_get_drvdata(dev);
1401
+ struct brcmf_pciedev *buspub = bus_if->bus_priv.pcie;
1402
+ struct brcmf_pciedev_info *devinfo = buspub->devinfo;
1403
+ struct brcmf_fw_request *fwreq;
1404
+ int err;
1405
+
1406
+ brcmf_pcie_intr_disable(devinfo);
1407
+
1408
+ brcmf_pcie_bus_console_read(devinfo, true);
1409
+
1410
+ brcmf_detach(dev);
1411
+
1412
+ brcmf_pcie_release_irq(devinfo);
1413
+ brcmf_pcie_release_scratchbuffers(devinfo);
1414
+ brcmf_pcie_release_ringbuffers(devinfo);
1415
+ brcmf_pcie_reset_device(devinfo);
1416
+
1417
+ fwreq = brcmf_pcie_prepare_fw_request(devinfo);
1418
+ if (!fwreq) {
1419
+ dev_err(dev, "Failed to prepare FW request\n");
1420
+ return -ENOMEM;
1421
+ }
1422
+
1423
+ err = brcmf_fw_get_firmwares(dev, fwreq, brcmf_pcie_setup);
1424
+ if (err) {
1425
+ dev_err(dev, "Failed to prepare FW request\n");
1426
+ kfree(fwreq);
1427
+ }
1428
+
1429
+ return err;
1430
+}
1431
+
14021432 static const struct brcmf_bus_ops brcmf_pcie_bus_ops = {
1433
+ .preinit = brcmf_pcie_preinit,
14031434 .txdata = brcmf_pcie_tx,
14041435 .stop = brcmf_pcie_down,
14051436 .txctl = brcmf_pcie_tx_ctlpkt,
....@@ -1408,6 +1439,7 @@
14081439 .get_ramsize = brcmf_pcie_get_ramsize,
14091440 .get_memdump = brcmf_pcie_get_memdump,
14101441 .get_fwname = brcmf_pcie_get_fwname,
1442
+ .reset = brcmf_pcie_reset,
14111443 };
14121444
14131445
....@@ -1437,6 +1469,7 @@
14371469 brcmf_pcie_init_share_ram_info(struct brcmf_pciedev_info *devinfo,
14381470 u32 sharedram_addr)
14391471 {
1472
+ struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
14401473 struct brcmf_pcie_shared_info *shared;
14411474 u32 addr;
14421475
....@@ -1448,7 +1481,8 @@
14481481 brcmf_dbg(PCIE, "PCIe protocol version %d\n", shared->version);
14491482 if ((shared->version > BRCMF_PCIE_MAX_SHARED_VERSION) ||
14501483 (shared->version < BRCMF_PCIE_MIN_SHARED_VERSION)) {
1451
- brcmf_err("Unsupported PCIE version %d\n", shared->version);
1484
+ brcmf_err(bus, "Unsupported PCIE version %d\n",
1485
+ shared->version);
14521486 return -EINVAL;
14531487 }
14541488
....@@ -1490,6 +1524,7 @@
14901524 const struct firmware *fw, void *nvram,
14911525 u32 nvram_len)
14921526 {
1527
+ struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
14931528 u32 sharedram_addr;
14941529 u32 sharedram_addr_written;
14951530 u32 loop_counter;
....@@ -1503,8 +1538,8 @@
15031538 return err;
15041539
15051540 brcmf_dbg(PCIE, "Download FW %s\n", devinfo->fw_name);
1506
- brcmf_pcie_copy_mem_todev(devinfo, devinfo->ci->rambase,
1507
- (void *)fw->data, fw->size);
1541
+ memcpy_toio(devinfo->tcm + devinfo->ci->rambase,
1542
+ (void *)fw->data, fw->size);
15081543
15091544 resetintr = get_unaligned_le32(fw->data);
15101545 release_firmware(fw);
....@@ -1518,7 +1553,7 @@
15181553 brcmf_dbg(PCIE, "Download NVRAM %s\n", devinfo->nvram_name);
15191554 address = devinfo->ci->rambase + devinfo->ci->ramsize -
15201555 nvram_len;
1521
- brcmf_pcie_copy_mem_todev(devinfo, address, nvram, nvram_len);
1556
+ memcpy_toio(devinfo->tcm + address, nvram, nvram_len);
15221557 brcmf_fw_nvram_free(nvram);
15231558 } else {
15241559 brcmf_dbg(PCIE, "No matching NVRAM file found %s\n",
....@@ -1544,7 +1579,13 @@
15441579 loop_counter--;
15451580 }
15461581 if (sharedram_addr == sharedram_addr_written) {
1547
- brcmf_err("FW failed to initialize\n");
1582
+ brcmf_err(bus, "FW failed to initialize\n");
1583
+ return -ENODEV;
1584
+ }
1585
+ if (sharedram_addr < devinfo->ci->rambase ||
1586
+ sharedram_addr >= devinfo->ci->rambase + devinfo->ci->ramsize) {
1587
+ brcmf_err(bus, "Invalid shared RAM address 0x%08x\n",
1588
+ sharedram_addr);
15481589 return -ENODEV;
15491590 }
15501591 brcmf_dbg(PCIE, "Shared RAM addr: 0x%08x\n", sharedram_addr);
....@@ -1555,16 +1596,15 @@
15551596
15561597 static int brcmf_pcie_get_resource(struct brcmf_pciedev_info *devinfo)
15571598 {
1558
- struct pci_dev *pdev;
1599
+ struct pci_dev *pdev = devinfo->pdev;
1600
+ struct brcmf_bus *bus = dev_get_drvdata(&pdev->dev);
15591601 int err;
15601602 phys_addr_t bar0_addr, bar1_addr;
15611603 ulong bar1_size;
15621604
1563
- pdev = devinfo->pdev;
1564
-
15651605 err = pci_enable_device(pdev);
15661606 if (err) {
1567
- brcmf_err("pci_enable_device failed err=%d\n", err);
1607
+ brcmf_err(bus, "pci_enable_device failed err=%d\n", err);
15681608 return err;
15691609 }
15701610
....@@ -1577,16 +1617,16 @@
15771617 /* read Bar-1 mapped memory range */
15781618 bar1_size = pci_resource_len(pdev, 2);
15791619 if ((bar1_size == 0) || (bar1_addr == 0)) {
1580
- brcmf_err("BAR1 Not enabled, device size=%ld, addr=%#016llx\n",
1620
+ brcmf_err(bus, "BAR1 Not enabled, device size=%ld, addr=%#016llx\n",
15811621 bar1_size, (unsigned long long)bar1_addr);
15821622 return -EINVAL;
15831623 }
15841624
1585
- devinfo->regs = ioremap_nocache(bar0_addr, BRCMF_PCIE_REG_MAP_SIZE);
1586
- devinfo->tcm = ioremap_nocache(bar1_addr, bar1_size);
1625
+ devinfo->regs = ioremap(bar0_addr, BRCMF_PCIE_REG_MAP_SIZE);
1626
+ devinfo->tcm = ioremap(bar1_addr, bar1_size);
15871627
15881628 if (!devinfo->regs || !devinfo->tcm) {
1589
- brcmf_err("ioremap() failed (%p,%p)\n", devinfo->regs,
1629
+ brcmf_err(bus, "ioremap() failed (%p,%p)\n", devinfo->regs,
15901630 devinfo->tcm);
15911631 return -EINVAL;
15921632 }
....@@ -1709,6 +1749,14 @@
17091749 nvram_len = fwreq->items[BRCMF_PCIE_FW_NVRAM].nv_data.len;
17101750 kfree(fwreq);
17111751
1752
+ ret = brcmf_chip_get_raminfo(devinfo->ci);
1753
+ if (ret) {
1754
+ brcmf_err(bus, "Failed to get RAM info\n");
1755
+ release_firmware(fw);
1756
+ brcmf_fw_nvram_free(nvram);
1757
+ goto fail;
1758
+ }
1759
+
17121760 /* Some of the firmwares have the size of the memory of the device
17131761 * defined inside the firmware. This is because part of the memory in
17141762 * the device is shared and the devision is determined by FW. Parse
....@@ -1755,12 +1803,13 @@
17551803
17561804 init_waitqueue_head(&devinfo->mbdata_resp_wait);
17571805
1758
- brcmf_pcie_intr_enable(devinfo);
1759
- brcmf_pcie_hostready(devinfo);
1760
- if (brcmf_attach(&devinfo->pdev->dev, devinfo->settings) == 0)
1761
- return;
1806
+ ret = brcmf_attach(&devinfo->pdev->dev);
1807
+ if (ret)
1808
+ goto fail;
17621809
1763
- brcmf_pcie_bus_console_read(devinfo);
1810
+ brcmf_pcie_bus_console_read(devinfo, false);
1811
+
1812
+ return;
17641813
17651814 fail:
17661815 device_release_driver(dev);
....@@ -1785,6 +1834,7 @@
17851834 fwreq->items[BRCMF_PCIE_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
17861835 fwreq->items[BRCMF_PCIE_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
17871836 fwreq->items[BRCMF_PCIE_FW_NVRAM].flags = BRCMF_FW_REQF_OPTIONAL;
1837
+ fwreq->board_type = devinfo->settings->board_type;
17881838 /* NVRAM reserves PCI domain 0 for Broadcom's SDK faked bus */
17891839 fwreq->domain_nr = pci_domain_nr(devinfo->pdev->bus) + 1;
17901840 fwreq->bus_nr = devinfo->pdev->bus->number;
....@@ -1855,24 +1905,30 @@
18551905 bus->wowl_supported = pci_pme_capable(pdev, PCI_D3hot);
18561906 dev_set_drvdata(&pdev->dev, bus);
18571907
1908
+ ret = brcmf_alloc(&devinfo->pdev->dev, devinfo->settings);
1909
+ if (ret)
1910
+ goto fail_bus;
1911
+
18581912 fwreq = brcmf_pcie_prepare_fw_request(devinfo);
18591913 if (!fwreq) {
18601914 ret = -ENOMEM;
1861
- goto fail_bus;
1915
+ goto fail_brcmf;
18621916 }
18631917
18641918 ret = brcmf_fw_get_firmwares(bus->dev, fwreq, brcmf_pcie_setup);
18651919 if (ret < 0) {
18661920 kfree(fwreq);
1867
- goto fail_bus;
1921
+ goto fail_brcmf;
18681922 }
18691923 return 0;
18701924
1925
+fail_brcmf:
1926
+ brcmf_free(&devinfo->pdev->dev);
18711927 fail_bus:
18721928 kfree(bus->msgbuf);
18731929 kfree(bus);
18741930 fail:
1875
- brcmf_err("failed %x:%x\n", pdev->vendor, pdev->device);
1931
+ brcmf_err(NULL, "failed %x:%x\n", pdev->vendor, pdev->device);
18761932 brcmf_pcie_release_resource(devinfo);
18771933 if (devinfo->ci)
18781934 brcmf_chip_detach(devinfo->ci);
....@@ -1903,6 +1959,7 @@
19031959 brcmf_pcie_intr_disable(devinfo);
19041960
19051961 brcmf_detach(&pdev->dev);
1962
+ brcmf_free(&pdev->dev);
19061963
19071964 kfree(bus->bus_priv.pcie);
19081965 kfree(bus->msgbuf->flowrings);
....@@ -1946,7 +2003,7 @@
19462003 wait_event_timeout(devinfo->mbdata_resp_wait, devinfo->mbdata_completed,
19472004 BRCMF_PCIE_MBDATA_TIMEOUT);
19482005 if (!devinfo->mbdata_completed) {
1949
- brcmf_err("Timeout on response for entering D3 substate\n");
2006
+ brcmf_err(bus, "Timeout on response for entering D3 substate\n");
19502007 brcmf_bus_change_state(bus, BRCMF_BUS_UP);
19512008 return -EIO;
19522009 }
....@@ -1992,7 +2049,7 @@
19922049
19932050 err = brcmf_pcie_probe(pdev, NULL);
19942051 if (err)
1995
- brcmf_err("probe after resume failed, err=%d\n", err);
2052
+ __brcmf_err(NULL, __func__, "probe after resume failed, err=%d\n", err);
19962053
19972054 return err;
19982055 }
....@@ -2017,6 +2074,8 @@
20172074
20182075 static const struct pci_device_id brcmf_pcie_devid_table[] = {
20192076 BRCMF_PCIE_DEVICE(BRCM_PCIE_4350_DEVICE_ID),
2077
+ BRCMF_PCIE_DEVICE_SUB(0x4355, BRCM_PCIE_VENDOR_ID_BROADCOM, 0x4355),
2078
+ BRCMF_PCIE_DEVICE(BRCM_PCIE_4354_RAW_DEVICE_ID),
20202079 BRCMF_PCIE_DEVICE(BRCM_PCIE_4356_DEVICE_ID),
20212080 BRCMF_PCIE_DEVICE(BRCM_PCIE_43567_DEVICE_ID),
20222081 BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_DEVICE_ID),
....@@ -2026,6 +2085,7 @@
20262085 BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_2G_DEVICE_ID),
20272086 BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_5G_DEVICE_ID),
20282087 BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_RAW_DEVICE_ID),
2088
+ BRCMF_PCIE_DEVICE(BRCM_PCIE_4364_DEVICE_ID),
20292089 BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_DEVICE_ID),
20302090 BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_2G_DEVICE_ID),
20312091 BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_5G_DEVICE_ID),
....@@ -2054,14 +2114,10 @@
20542114 };
20552115
20562116
2057
-void brcmf_pcie_register(void)
2117
+int brcmf_pcie_register(void)
20582118 {
2059
- int err;
2060
-
20612119 brcmf_dbg(PCIE, "Enter\n");
2062
- err = pci_register_driver(&brcmf_pciedrvr);
2063
- if (err)
2064
- brcmf_err("PCIE driver registration failed, err=%d\n", err);
2120
+ return pci_register_driver(&brcmf_pciedrvr);
20652121 }
20662122
20672123