The driver reverses a MAC address from the OTP when it finds the
Sunplus OUI fc:4b:bc at the wrong end. Newer SP7021 chips have
a different Sunplus OUI (1c:50:1e), possibly stored in the same
reversed order, which the driver does not recognise. If the reversed
address has the multicast bit set, the driver rejects it and uses a
random address; otherwise it uses the reversed address as it is.
Handle both these OUIs. An address that already starts with either OUI
is left as is. On chips that used the reversed address, the interface
now gets the correct address, so configuration tied to the old address
(DHCP reservations, udev or networkd rules) will need updating.
Tested on chips that needed each of these OUIs to be reversed.
Signed-off-by: Andrew Gaylard <redacted>
---
drivers/net/ethernet/sunplus/spl2sw_driver.c | 36 +++++++++++++++-----
1 file changed, 28 insertions(+), 8 deletions(-)
diff --git a/drivers/net/ethernet/sunplus/spl2sw_driver.c b/drivers/net/ethernet/sunplus/spl2sw_driver.c
index 5e0e4c9ecbb0..ab0318bc6f6c 100644
--- a/drivers/net/ethernet/sunplus/spl2sw_driver.c
+++ b/drivers/net/ethernet/sunplus/spl2sw_driver.c
@@ -203,18 +203,38 @@ static const struct net_device_ops netdev_ops = {
.ndo_tx_timeout = spl2sw_ethernet_tx_timeout,
};
+static const u8 spl2sw_sunplus_ouis[][3] = {
+ { 0xfc, 0x4b, 0xbc },
+ { 0x1c, 0x50, 0x1e },
+};
+
static void spl2sw_check_mac_vendor_id_and_convert(u8 *mac_addr)
{
- /* Byte order of MAC address of some samples are reversed.
- * Check vendor id and convert byte order if it is wrong.
- * OUI of Sunplus: fc:4b:bc
+ unsigned int i;
+
+ /* Some chips have the byte order of the MAC address reversed.
+ * Check for Sunplus OUIs and fix the byte order if it is.
*/
- if (mac_addr[5] == 0xfc && mac_addr[4] == 0x4b && mac_addr[3] == 0xbc &&
- (mac_addr[0] != 0xfc || mac_addr[1] != 0x4b || mac_addr[2] != 0xbc)) {
+ for (i = 0; i < ARRAY_SIZE(spl2sw_sunplus_ouis); i++) {
+ const u8 *oui = spl2sw_sunplus_ouis[i];
- swap(mac_addr[0], mac_addr[5]);
- swap(mac_addr[1], mac_addr[4]);
- swap(mac_addr[2], mac_addr[3]);
+ if (mac_addr[0] == oui[0] &&
+ mac_addr[1] == oui[1] &&
+ mac_addr[2] == oui[2])
+ return;
+ }
+
+ for (i = 0; i < ARRAY_SIZE(spl2sw_sunplus_ouis); i++) {
+ const u8 *oui = spl2sw_sunplus_ouis[i];
+
+ if (mac_addr[5] == oui[0] &&
+ mac_addr[4] == oui[1] &&
+ mac_addr[3] == oui[2]) {
+ swap(mac_addr[0], mac_addr[5]);
+ swap(mac_addr[1], mac_addr[4]);
+ swap(mac_addr[2], mac_addr[3]);
+ return;
+ }
}
}
base-commit: 676f3aace662fbbc180b3898b190a372fa2a516b
--
2.53.0