| b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame^] | 1 | --- a/arch/mips/bcm63xx/sprom.c | 
 | 2 | +++ b/arch/mips/bcm63xx/sprom.c | 
 | 3 | @@ -384,6 +384,7 @@ static __initconst u16 bcm4331_sprom[] = | 
 | 4 |  struct fallback_sprom_match { | 
 | 5 |  	u8 pci_bus; | 
 | 6 |  	u8 pci_dev; | 
 | 7 | +	int override_devid; | 
 | 8 |  	struct ssb_sprom sprom; | 
 | 9 |  }; | 
 | 10 |   | 
 | 11 | @@ -399,6 +400,8 @@ int bcm63xx_get_fallback_ssb_sprom(struc | 
 | 12 |  				fallback_sprom.pci_bus, fallback_sprom.pci_dev, | 
 | 13 |  				bus->host_pci->bus->number, | 
 | 14 |  				PCI_SLOT(bus->host_pci->devfn)); | 
 | 15 | +		if (fallback_sprom.override_devid) | 
 | 16 | +			bus->host_pci->device = fallback_sprom.sprom.dev_id; | 
 | 17 |  		memcpy(out, &fallback_sprom.sprom, sizeof(struct ssb_sprom)); | 
 | 18 |  		return 0; | 
 | 19 |  	} else { | 
 | 20 | @@ -418,6 +421,8 @@ int bcm63xx_get_fallback_bcma_sprom(stru | 
 | 21 |  				fallback_sprom.pci_bus, fallback_sprom.pci_dev, | 
 | 22 |  				bus->host_pci->bus->number, | 
 | 23 |  				PCI_SLOT(bus->host_pci->devfn)); | 
 | 24 | +		if (fallback_sprom.override_devid) | 
 | 25 | +			bus->host_pci->device = fallback_sprom.sprom.dev_id; | 
 | 26 |  		memcpy(out, &fallback_sprom.sprom, sizeof(struct ssb_sprom)); | 
 | 27 |  		return 0; | 
 | 28 |  	} else { | 
 | 29 | @@ -965,6 +970,37 @@ static int sprom_extract(struct ssb_spro | 
 | 30 |  	return 0; | 
 | 31 |  } | 
 | 32 |   | 
 | 33 | +int sprom_override_devid(struct fallback_sprom_data *data, | 
 | 34 | +			 struct ssb_sprom *out, const u16 *in) | 
 | 35 | +{ | 
 | 36 | +	switch (data->type) { | 
 | 37 | +#if defined(CONFIG_SSB_PCIHOST) | 
 | 38 | +		case SPROM_BCM4306: | 
 | 39 | +		case SPROM_BCM4318: | 
 | 40 | +		case SPROM_BCM4321: | 
 | 41 | +		case SPROM_BCM4322: | 
 | 42 | +		case SPROM_BCM43222: | 
 | 43 | +			SPEX(dev_id, SSB_SPROM1_PID, 0xFFFF, 0); | 
 | 44 | +			return !!out->dev_id; | 
 | 45 | +#endif /* CONFIG_SSB_PCIHOST */ | 
 | 46 | +#if defined(CONFIG_BCMA_HOST_PCI) | 
 | 47 | +		case SPROM_BCM4313: | 
 | 48 | +		case SPROM_BCM43131: | 
 | 49 | +		case SPROM_BCM43217: | 
 | 50 | +		case SPROM_BCM43225: | 
 | 51 | +		case SPROM_BCM43227: | 
 | 52 | +		case SPROM_BCM43228: | 
 | 53 | +		case SPROM_BCM4331: | 
 | 54 | +			SPEX(dev_id, 0x0060, 0xFFFF, 0); | 
 | 55 | +			return !!out->dev_id; | 
 | 56 | +#endif /* CONFIG_BCMA_HOST_PCI */ | 
 | 57 | +		case SPROM_DEFAULT: | 
 | 58 | +			return 0; | 
 | 59 | +	} | 
 | 60 | + | 
 | 61 | +	return 0; | 
 | 62 | +} | 
 | 63 | + | 
 | 64 |  void sprom_apply_fixups(u16 *sprom, struct sprom_fixup *fixups, int n) | 
 | 65 |  { | 
 | 66 |  	unsigned int i; | 
 | 67 | @@ -1056,6 +1092,11 @@ int __init bcm63xx_register_fallback_spr | 
 | 68 |  				   data->num_board_fixups); | 
 | 69 |   | 
 | 70 |  		sprom_extract(&fallback_sprom.sprom, template_sprom, size); | 
 | 71 | + | 
 | 72 | +		fallback_sprom.override_devid =  | 
 | 73 | +			sprom_override_devid(data, &fallback_sprom.sprom, template_sprom); | 
 | 74 | +	} else { | 
 | 75 | +		fallback_sprom.override_devid = 0; | 
 | 76 |  	} | 
 | 77 |   | 
 | 78 |  	memcpy(fallback_sprom.sprom.il0mac, data->mac_addr, ETH_ALEN); |