aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/bcm63xx/patches-5.15/366-MIPS-BCM63XX-fallback-sprom-override-devid.patch
blob: 31641aeff2646afed7f50617b2b7acc590d288f7 (plain)
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
--- a/arch/mips/bcm63xx/sprom.c
+++ b/arch/mips/bcm63xx/sprom.c
@@ -384,6 +384,7 @@ static __initconst u16 bcm4331_sprom[] =
 struct fallback_sprom_match {
 	u8 pci_bus;
 	u8 pci_dev;
+	int override_devid;
 	struct ssb_sprom sprom;
 };
 
@@ -399,6 +400,8 @@ int bcm63xx_get_fallback_ssb_sprom(struc
 				fallback_sprom.pci_bus, fallback_sprom.pci_dev,
 				bus->host_pci->bus->number,
 				PCI_SLOT(bus->host_pci->devfn));
+		if (fallback_sprom.override_devid)
+			bus->host_pci->device = fallback_sprom.sprom.dev_id;
 		memcpy(out, &fallback_sprom.sprom, sizeof(struct ssb_sprom));
 		return 0;
 	} else {
@@ -418,6 +421,8 @@ int bcm63xx_get_fallback_bcma_sprom(stru
 				fallback_sprom.pci_bus, fallback_sprom.pci_dev,
 				bus->host_pci->bus->number,
 				PCI_SLOT(bus->host_pci->devfn));
+		if (fallback_sprom.override_devid)
+			bus->host_pci->device = fallback_sprom.sprom.dev_id;
 		memcpy(out, &fallback_sprom.sprom, sizeof(struct ssb_sprom));
 		return 0;
 	} else {
@@ -965,6 +970,37 @@ static int sprom_extract(struct ssb_spro
 	return 0;
 }
 
+int sprom_override_devid(struct fallback_sprom_data *data,
+			 struct ssb_sprom *out, const u16 *in)
+{
+	switch (data->type) {
+#if defined(CONFIG_SSB_PCIHOST)
+		case SPROM_BCM4306:
+		case SPROM_BCM4318:
+		case SPROM_BCM4321:
+		case SPROM_BCM4322:
+		case SPROM_BCM43222:
+			SPEX(dev_id, SSB_SPROM1_PID, 0xFFFF, 0);
+			return !!out->dev_id;
+#endif /* CONFIG_SSB_PCIHOST */
+#if defined(CONFIG_BCMA_HOST_PCI)
+		case SPROM_BCM4313:
+		case SPROM_BCM43131:
+		case SPROM_BCM43217:
+		case SPROM_BCM43225:
+		case SPROM_BCM43227:
+		case SPROM_BCM43228:
+		case SPROM_BCM4331:
+			SPEX(dev_id, 0x0060, 0xFFFF, 0);
+			return !!out->dev_id;
+#endif /* CONFIG_BCMA_HOST_PCI */
+		case SPROM_DEFAULT:
+			return 0;
+	}
+
+	return 0;
+}
+
 void sprom_apply_fixups(u16 *sprom, struct sprom_fixup *fixups, int n)
 {
 	unsigned int i;
@@ -1056,6 +1092,11 @@ int __init bcm63xx_register_fallback_spr
 				   data->num_board_fixups);
 
 		sprom_extract(&fallback_sprom.sprom, template_sprom, size);
+
+		fallback_sprom.override_devid = 
+			sprom_override_devid(data, &fallback_sprom.sprom, template_sprom);
+	} else {
+		fallback_sprom.override_devid = 0;
 	}
 
 	memcpy(fallback_sprom.sprom.il0mac, data->mac_addr, ETH_ALEN);