Commit 6ae8ec27868bfdbb815287bee8146acbefaee867

Authored by Rafał Miłecki
Committed by John W. Linville
1 parent 35cbcbc6f3

ssb: fix init regression of hostmode PCI core

Our workarounds seem to be clientmode PCI specific. Using SPROM
workaround on SoC resulted in Oops:

Data bus error, epc == 8017ed58, ra == 80225838
 Oops[#1]:
 Cpu 0
 $ 0   : 00000000 10008000 b8000000 00000001
 $ 4   : 80293b5c 00000caa ffffffff 00000000
 $ 8   : 0000000a 00000003 00000001 696d6d20
 $12   : ffffffff 00000000 00000000 ffffffff
 $16   : 802d0140 b8004800 802c0000 00000000
 $20   : 00000000 802c0000 00000000 802d04d4
 $24   : 00000018 80151a00
 $28   : 81816000 81817df8 8029bda0 80225838
 Hi    : 00000000
 Lo    : 00000000
 epc   : 8017ed58 ssb_ssb_read16+0x48/0x60
   Not tainted
 ra    : 80225838 ssb_pcicore_init+0x54/0x3b4

Reported-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Tested-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

Showing 1 changed file with 9 additions and 9 deletions Side-by-side Diff

drivers/ssb/driver_pcicore.c
... ... @@ -516,8 +516,17 @@
516 516  
517 517 static void ssb_pcicore_init_clientmode(struct ssb_pcicore *pc)
518 518 {
  519 + ssb_pcicore_fix_sprom_core_index(pc);
  520 +
519 521 /* Disable PCI interrupts. */
520 522 ssb_write32(pc->dev, SSB_INTVEC, 0);
  523 +
  524 + /* Additional PCIe always once-executed workarounds */
  525 + if (pc->dev->id.coreid == SSB_DEV_PCIE) {
  526 + ssb_pcicore_serdes_workaround(pc);
  527 + /* TODO: ASPM */
  528 + /* TODO: Clock Request Update */
  529 + }
521 530 }
522 531  
523 532 void ssb_pcicore_init(struct ssb_pcicore *pc)
... ... @@ -529,8 +538,6 @@
529 538 if (!ssb_device_is_enabled(dev))
530 539 ssb_device_enable(dev, 0);
531 540  
532   - ssb_pcicore_fix_sprom_core_index(pc);
533   -
534 541 #ifdef CONFIG_SSB_PCICORE_HOSTMODE
535 542 pc->hostmode = pcicore_is_in_hostmode(pc);
536 543 if (pc->hostmode)
... ... @@ -538,13 +545,6 @@
538 545 #endif /* CONFIG_SSB_PCICORE_HOSTMODE */
539 546 if (!pc->hostmode)
540 547 ssb_pcicore_init_clientmode(pc);
541   -
542   - /* Additional PCIe always once-executed workarounds */
543   - if (dev->id.coreid == SSB_DEV_PCIE) {
544   - ssb_pcicore_serdes_workaround(pc);
545   - /* TODO: ASPM */
546   - /* TODO: Clock Request Update */
547   - }
548 548 }
549 549  
550 550 static u32 ssb_pcie_read(struct ssb_pcicore *pc, u32 address)