hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
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
....@@ -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;
....@@ -1254,7 +1233,7 @@
12541233 return 0;
12551234
12561235 fail:
1257
- brcmf_err("Allocating ring buffers failed\n");
1236
+ brcmf_err(bus, "Allocating ring buffers failed\n");
12581237 brcmf_pcie_release_ringbuffers(devinfo);
12591238 return -ENOMEM;
12601239 }
....@@ -1277,14 +1256,15 @@
12771256
12781257 static int brcmf_pcie_init_scratchbuffers(struct brcmf_pciedev_info *devinfo)
12791258 {
1259
+ struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
12801260 u64 address;
12811261 u32 addr;
12821262
12831263 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);
1264
+ dma_alloc_coherent(&devinfo->pdev->dev,
1265
+ BRCMF_DMA_D2H_SCRATCH_BUF_LEN,
1266
+ &devinfo->shared.scratch_dmahandle,
1267
+ GFP_KERNEL);
12881268 if (!devinfo->shared.scratch)
12891269 goto fail;
12901270
....@@ -1298,10 +1278,10 @@
12981278 brcmf_pcie_write_tcm32(devinfo, addr, BRCMF_DMA_D2H_SCRATCH_BUF_LEN);
12991279
13001280 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);
1281
+ dma_alloc_coherent(&devinfo->pdev->dev,
1282
+ BRCMF_DMA_D2H_RINGUPD_BUF_LEN,
1283
+ &devinfo->shared.ringupd_dmahandle,
1284
+ GFP_KERNEL);
13051285 if (!devinfo->shared.ringupd)
13061286 goto fail;
13071287
....@@ -1316,7 +1296,7 @@
13161296 return 0;
13171297
13181298 fail:
1319
- brcmf_err("Allocating scratch buffers failed\n");
1299
+ brcmf_err(bus, "Allocating scratch buffers failed\n");
13201300 brcmf_pcie_release_scratchbuffers(devinfo);
13211301 return -ENOMEM;
13221302 }
....@@ -1326,6 +1306,18 @@
13261306 {
13271307 }
13281308
1309
+static int brcmf_pcie_preinit(struct device *dev)
1310
+{
1311
+ struct brcmf_bus *bus_if = dev_get_drvdata(dev);
1312
+ struct brcmf_pciedev *buspub = bus_if->bus_priv.pcie;
1313
+
1314
+ brcmf_dbg(PCIE, "Enter\n");
1315
+
1316
+ brcmf_pcie_intr_enable(buspub->devinfo);
1317
+ brcmf_pcie_hostready(buspub->devinfo);
1318
+
1319
+ return 0;
1320
+}
13291321
13301322 static int brcmf_pcie_tx(struct device *dev, struct sk_buff *skb)
13311323 {
....@@ -1399,7 +1391,42 @@
13991391 return 0;
14001392 }
14011393
1394
+static int brcmf_pcie_reset(struct device *dev)
1395
+{
1396
+ struct brcmf_bus *bus_if = dev_get_drvdata(dev);
1397
+ struct brcmf_pciedev *buspub = bus_if->bus_priv.pcie;
1398
+ struct brcmf_pciedev_info *devinfo = buspub->devinfo;
1399
+ struct brcmf_fw_request *fwreq;
1400
+ int err;
1401
+
1402
+ brcmf_pcie_intr_disable(devinfo);
1403
+
1404
+ brcmf_pcie_bus_console_read(devinfo, true);
1405
+
1406
+ brcmf_detach(dev);
1407
+
1408
+ brcmf_pcie_release_irq(devinfo);
1409
+ brcmf_pcie_release_scratchbuffers(devinfo);
1410
+ brcmf_pcie_release_ringbuffers(devinfo);
1411
+ brcmf_pcie_reset_device(devinfo);
1412
+
1413
+ fwreq = brcmf_pcie_prepare_fw_request(devinfo);
1414
+ if (!fwreq) {
1415
+ dev_err(dev, "Failed to prepare FW request\n");
1416
+ return -ENOMEM;
1417
+ }
1418
+
1419
+ err = brcmf_fw_get_firmwares(dev, fwreq, brcmf_pcie_setup);
1420
+ if (err) {
1421
+ dev_err(dev, "Failed to prepare FW request\n");
1422
+ kfree(fwreq);
1423
+ }
1424
+
1425
+ return err;
1426
+}
1427
+
14021428 static const struct brcmf_bus_ops brcmf_pcie_bus_ops = {
1429
+ .preinit = brcmf_pcie_preinit,
14031430 .txdata = brcmf_pcie_tx,
14041431 .stop = brcmf_pcie_down,
14051432 .txctl = brcmf_pcie_tx_ctlpkt,
....@@ -1408,6 +1435,7 @@
14081435 .get_ramsize = brcmf_pcie_get_ramsize,
14091436 .get_memdump = brcmf_pcie_get_memdump,
14101437 .get_fwname = brcmf_pcie_get_fwname,
1438
+ .reset = brcmf_pcie_reset,
14111439 };
14121440
14131441
....@@ -1437,6 +1465,7 @@
14371465 brcmf_pcie_init_share_ram_info(struct brcmf_pciedev_info *devinfo,
14381466 u32 sharedram_addr)
14391467 {
1468
+ struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
14401469 struct brcmf_pcie_shared_info *shared;
14411470 u32 addr;
14421471
....@@ -1448,7 +1477,8 @@
14481477 brcmf_dbg(PCIE, "PCIe protocol version %d\n", shared->version);
14491478 if ((shared->version > BRCMF_PCIE_MAX_SHARED_VERSION) ||
14501479 (shared->version < BRCMF_PCIE_MIN_SHARED_VERSION)) {
1451
- brcmf_err("Unsupported PCIE version %d\n", shared->version);
1480
+ brcmf_err(bus, "Unsupported PCIE version %d\n",
1481
+ shared->version);
14521482 return -EINVAL;
14531483 }
14541484
....@@ -1490,6 +1520,7 @@
14901520 const struct firmware *fw, void *nvram,
14911521 u32 nvram_len)
14921522 {
1523
+ struct brcmf_bus *bus = dev_get_drvdata(&devinfo->pdev->dev);
14931524 u32 sharedram_addr;
14941525 u32 sharedram_addr_written;
14951526 u32 loop_counter;
....@@ -1503,8 +1534,8 @@
15031534 return err;
15041535
15051536 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);
1537
+ memcpy_toio(devinfo->tcm + devinfo->ci->rambase,
1538
+ (void *)fw->data, fw->size);
15081539
15091540 resetintr = get_unaligned_le32(fw->data);
15101541 release_firmware(fw);
....@@ -1518,7 +1549,7 @@
15181549 brcmf_dbg(PCIE, "Download NVRAM %s\n", devinfo->nvram_name);
15191550 address = devinfo->ci->rambase + devinfo->ci->ramsize -
15201551 nvram_len;
1521
- brcmf_pcie_copy_mem_todev(devinfo, address, nvram, nvram_len);
1552
+ memcpy_toio(devinfo->tcm + address, nvram, nvram_len);
15221553 brcmf_fw_nvram_free(nvram);
15231554 } else {
15241555 brcmf_dbg(PCIE, "No matching NVRAM file found %s\n",
....@@ -1544,7 +1575,13 @@
15441575 loop_counter--;
15451576 }
15461577 if (sharedram_addr == sharedram_addr_written) {
1547
- brcmf_err("FW failed to initialize\n");
1578
+ brcmf_err(bus, "FW failed to initialize\n");
1579
+ return -ENODEV;
1580
+ }
1581
+ if (sharedram_addr < devinfo->ci->rambase ||
1582
+ sharedram_addr >= devinfo->ci->rambase + devinfo->ci->ramsize) {
1583
+ brcmf_err(bus, "Invalid shared RAM address 0x%08x\n",
1584
+ sharedram_addr);
15481585 return -ENODEV;
15491586 }
15501587 brcmf_dbg(PCIE, "Shared RAM addr: 0x%08x\n", sharedram_addr);
....@@ -1555,16 +1592,15 @@
15551592
15561593 static int brcmf_pcie_get_resource(struct brcmf_pciedev_info *devinfo)
15571594 {
1558
- struct pci_dev *pdev;
1595
+ struct pci_dev *pdev = devinfo->pdev;
1596
+ struct brcmf_bus *bus = dev_get_drvdata(&pdev->dev);
15591597 int err;
15601598 phys_addr_t bar0_addr, bar1_addr;
15611599 ulong bar1_size;
15621600
1563
- pdev = devinfo->pdev;
1564
-
15651601 err = pci_enable_device(pdev);
15661602 if (err) {
1567
- brcmf_err("pci_enable_device failed err=%d\n", err);
1603
+ brcmf_err(bus, "pci_enable_device failed err=%d\n", err);
15681604 return err;
15691605 }
15701606
....@@ -1577,16 +1613,16 @@
15771613 /* read Bar-1 mapped memory range */
15781614 bar1_size = pci_resource_len(pdev, 2);
15791615 if ((bar1_size == 0) || (bar1_addr == 0)) {
1580
- brcmf_err("BAR1 Not enabled, device size=%ld, addr=%#016llx\n",
1616
+ brcmf_err(bus, "BAR1 Not enabled, device size=%ld, addr=%#016llx\n",
15811617 bar1_size, (unsigned long long)bar1_addr);
15821618 return -EINVAL;
15831619 }
15841620
1585
- devinfo->regs = ioremap_nocache(bar0_addr, BRCMF_PCIE_REG_MAP_SIZE);
1586
- devinfo->tcm = ioremap_nocache(bar1_addr, bar1_size);
1621
+ devinfo->regs = ioremap(bar0_addr, BRCMF_PCIE_REG_MAP_SIZE);
1622
+ devinfo->tcm = ioremap(bar1_addr, bar1_size);
15871623
15881624 if (!devinfo->regs || !devinfo->tcm) {
1589
- brcmf_err("ioremap() failed (%p,%p)\n", devinfo->regs,
1625
+ brcmf_err(bus, "ioremap() failed (%p,%p)\n", devinfo->regs,
15901626 devinfo->tcm);
15911627 return -EINVAL;
15921628 }
....@@ -1709,6 +1745,14 @@
17091745 nvram_len = fwreq->items[BRCMF_PCIE_FW_NVRAM].nv_data.len;
17101746 kfree(fwreq);
17111747
1748
+ ret = brcmf_chip_get_raminfo(devinfo->ci);
1749
+ if (ret) {
1750
+ brcmf_err(bus, "Failed to get RAM info\n");
1751
+ release_firmware(fw);
1752
+ brcmf_fw_nvram_free(nvram);
1753
+ goto fail;
1754
+ }
1755
+
17121756 /* Some of the firmwares have the size of the memory of the device
17131757 * defined inside the firmware. This is because part of the memory in
17141758 * the device is shared and the devision is determined by FW. Parse
....@@ -1755,12 +1799,13 @@
17551799
17561800 init_waitqueue_head(&devinfo->mbdata_resp_wait);
17571801
1758
- brcmf_pcie_intr_enable(devinfo);
1759
- brcmf_pcie_hostready(devinfo);
1760
- if (brcmf_attach(&devinfo->pdev->dev, devinfo->settings) == 0)
1761
- return;
1802
+ ret = brcmf_attach(&devinfo->pdev->dev);
1803
+ if (ret)
1804
+ goto fail;
17621805
1763
- brcmf_pcie_bus_console_read(devinfo);
1806
+ brcmf_pcie_bus_console_read(devinfo, false);
1807
+
1808
+ return;
17641809
17651810 fail:
17661811 device_release_driver(dev);
....@@ -1785,6 +1830,7 @@
17851830 fwreq->items[BRCMF_PCIE_FW_CODE].type = BRCMF_FW_TYPE_BINARY;
17861831 fwreq->items[BRCMF_PCIE_FW_NVRAM].type = BRCMF_FW_TYPE_NVRAM;
17871832 fwreq->items[BRCMF_PCIE_FW_NVRAM].flags = BRCMF_FW_REQF_OPTIONAL;
1833
+ fwreq->board_type = devinfo->settings->board_type;
17881834 /* NVRAM reserves PCI domain 0 for Broadcom's SDK faked bus */
17891835 fwreq->domain_nr = pci_domain_nr(devinfo->pdev->bus) + 1;
17901836 fwreq->bus_nr = devinfo->pdev->bus->number;
....@@ -1855,24 +1901,30 @@
18551901 bus->wowl_supported = pci_pme_capable(pdev, PCI_D3hot);
18561902 dev_set_drvdata(&pdev->dev, bus);
18571903
1904
+ ret = brcmf_alloc(&devinfo->pdev->dev, devinfo->settings);
1905
+ if (ret)
1906
+ goto fail_bus;
1907
+
18581908 fwreq = brcmf_pcie_prepare_fw_request(devinfo);
18591909 if (!fwreq) {
18601910 ret = -ENOMEM;
1861
- goto fail_bus;
1911
+ goto fail_brcmf;
18621912 }
18631913
18641914 ret = brcmf_fw_get_firmwares(bus->dev, fwreq, brcmf_pcie_setup);
18651915 if (ret < 0) {
18661916 kfree(fwreq);
1867
- goto fail_bus;
1917
+ goto fail_brcmf;
18681918 }
18691919 return 0;
18701920
1921
+fail_brcmf:
1922
+ brcmf_free(&devinfo->pdev->dev);
18711923 fail_bus:
18721924 kfree(bus->msgbuf);
18731925 kfree(bus);
18741926 fail:
1875
- brcmf_err("failed %x:%x\n", pdev->vendor, pdev->device);
1927
+ brcmf_err(NULL, "failed %x:%x\n", pdev->vendor, pdev->device);
18761928 brcmf_pcie_release_resource(devinfo);
18771929 if (devinfo->ci)
18781930 brcmf_chip_detach(devinfo->ci);
....@@ -1903,6 +1955,7 @@
19031955 brcmf_pcie_intr_disable(devinfo);
19041956
19051957 brcmf_detach(&pdev->dev);
1958
+ brcmf_free(&pdev->dev);
19061959
19071960 kfree(bus->bus_priv.pcie);
19081961 kfree(bus->msgbuf->flowrings);
....@@ -1946,7 +1999,7 @@
19461999 wait_event_timeout(devinfo->mbdata_resp_wait, devinfo->mbdata_completed,
19472000 BRCMF_PCIE_MBDATA_TIMEOUT);
19482001 if (!devinfo->mbdata_completed) {
1949
- brcmf_err("Timeout on response for entering D3 substate\n");
2002
+ brcmf_err(bus, "Timeout on response for entering D3 substate\n");
19502003 brcmf_bus_change_state(bus, BRCMF_BUS_UP);
19512004 return -EIO;
19522005 }
....@@ -1992,7 +2045,7 @@
19922045
19932046 err = brcmf_pcie_probe(pdev, NULL);
19942047 if (err)
1995
- brcmf_err("probe after resume failed, err=%d\n", err);
2048
+ __brcmf_err(NULL, __func__, "probe after resume failed, err=%d\n", err);
19962049
19972050 return err;
19982051 }
....@@ -2017,6 +2070,8 @@
20172070
20182071 static const struct pci_device_id brcmf_pcie_devid_table[] = {
20192072 BRCMF_PCIE_DEVICE(BRCM_PCIE_4350_DEVICE_ID),
2073
+ BRCMF_PCIE_DEVICE_SUB(0x4355, BRCM_PCIE_VENDOR_ID_BROADCOM, 0x4355),
2074
+ BRCMF_PCIE_DEVICE(BRCM_PCIE_4354_RAW_DEVICE_ID),
20202075 BRCMF_PCIE_DEVICE(BRCM_PCIE_4356_DEVICE_ID),
20212076 BRCMF_PCIE_DEVICE(BRCM_PCIE_43567_DEVICE_ID),
20222077 BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_DEVICE_ID),
....@@ -2026,6 +2081,7 @@
20262081 BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_2G_DEVICE_ID),
20272082 BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_5G_DEVICE_ID),
20282083 BRCMF_PCIE_DEVICE(BRCM_PCIE_43602_RAW_DEVICE_ID),
2084
+ BRCMF_PCIE_DEVICE(BRCM_PCIE_4364_DEVICE_ID),
20292085 BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_DEVICE_ID),
20302086 BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_2G_DEVICE_ID),
20312087 BRCMF_PCIE_DEVICE(BRCM_PCIE_4365_5G_DEVICE_ID),
....@@ -2054,14 +2110,10 @@
20542110 };
20552111
20562112
2057
-void brcmf_pcie_register(void)
2113
+int brcmf_pcie_register(void)
20582114 {
2059
- int err;
2060
-
20612115 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);
2116
+ return pci_register_driver(&brcmf_pciedrvr);
20652117 }
20662118
20672119