Re: [PATCH V2 08/14] net: ks8851: Use 16-bit writes to program MAC address
From: Michal Kubecek <hidden>
Date: 2020-03-25 16:56:46
On Wed, Mar 25, 2020 at 04:05:37PM +0100, Marek Vasut wrote:
On the SPI variant of KS8851, the MAC address can be programmed with either 8/16/32-bit writes. To make it easier to support the 16-bit parallel option of KS8851 too, switch both the MAC address programming and readout to 16-bit operations. Remove ks8851_wrreg8() as it is not used anywhere anymore. There should be no functional change. Signed-off-by: Marek Vasut <marex@denx.de> Cc: David S. Miller <davem@davemloft.net> Cc: Lukas Wunner <lukas@wunner.de> Cc: Petr Stetiar <redacted> Cc: YueHaibing <redacted> --- V2: Get rid of the KS_MAR(i + 1) by adjusting KS_MAR(x) macro ---
[...]
quoted hunk ↗ jump to hunk
@@ -358,8 +329,12 @@ static int ks8851_write_mac_addr(struct net_device *dev) * the first write to the MAC address does not take effect. */ ks8851_set_powermode(ks, PMECR_PM_NORMAL); - for (i = 0; i < ETH_ALEN; i++) - ks8851_wrreg8(ks, KS_MAR(i), dev->dev_addr[i]); + + for (i = 0; i < ETH_ALEN; i += 2) { + val = (dev->dev_addr[i] << 8) | dev->dev_addr[i + 1]; + ks8851_wrreg16(ks, KS_MAR(i), val); + } + if (!netif_running(dev)) ks8851_set_powermode(ks, PMECR_PM_SOFTDOWN);@@ -377,12 +352,16 @@ static int ks8851_write_mac_addr(struct net_device *dev) static void ks8851_read_mac_addr(struct net_device *dev) { struct ks8851_net *ks = netdev_priv(dev); + u16 reg; int i; mutex_lock(&ks->lock); - for (i = 0; i < ETH_ALEN; i++) - dev->dev_addr[i] = ks8851_rdreg8(ks, KS_MAR(i)); + for (i = 0; i < ETH_ALEN; i += 2) { + reg = ks8851_rdreg16(ks, KS_MAR(i)); + dev->dev_addr[i] = reg & 0xff; + dev->dev_addr[i + 1] = reg >> 8; + } mutex_unlock(&ks->lock); }
It seems my question from v1 went unnoticed and the inconsistency still seems to be there so let me ask again: when writing, you put addr[i] into upper part of the 16-bit value and addr[i+1] into lower but when reading, you do the opposite. Is it correct? Michal Kubecek