Skip to content

Commit

Permalink
net: netcp: Fixes efuse mac addr swap on k2e and k2l
Browse files Browse the repository at this point in the history
On some of the K2E and K2L platforms, the two DWORDs in
efuse occupied by the pre-programmed mac address for
slave port 1 are swapped.  To workaround this issue,
this patch adds a new define NETCP_EFUSE_ADDR_SWAP (2)
which signifies the occurrence of such swapping so that
the driver can take proper action.  The flag can be
enabled in the corresponding netcp interface dts binding
as efuse-mac = <2>  under the corresponding netcp
interface node.

Signed-off-by: WingMan Kwok <w-kwok2@ti.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
WingMan Kwok authored and David S. Miller committed Jul 30, 2015
1 parent 5a4c355 commit 71382bc
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 3 deletions.
6 changes: 5 additions & 1 deletion Documentation/devicetree/bindings/net/keystone-netcp.txt
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,11 @@ Required properties:

Optional properties:
- efuse-mac: If this is 1, then the MAC address for the interface is
obtained from the device efuse mac address register
obtained from the device efuse mac address register.
If this is 2, the two DWORDs occupied by the MAC address
are swapped. The netcp driver will swap the two DWORDs
back to the proper order when this property is set to 2
when it obtains the mac address from efuse.
- local-mac-address: the driver is designed to use the of_get_mac_address api
only if efuse-mac is 0. When efuse-mac is 0, the MAC
address is obtained from local-mac-address. If this
Expand Down
15 changes: 13 additions & 2 deletions drivers/net/ethernet/ti/netcp_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@
NETIF_MSG_PKTDATA | NETIF_MSG_TX_QUEUED | \
NETIF_MSG_RX_STATUS)

#define NETCP_EFUSE_ADDR_SWAP 2

#define knav_queue_get_id(q) knav_queue_device_control(q, \
KNAV_QUEUE_GET_ID, (unsigned long)NULL)

Expand Down Expand Up @@ -172,13 +174,22 @@ static void set_words(u32 *words, int num_words, u32 *desc)
}

/* Read the e-fuse value as 32 bit values to be endian independent */
static int emac_arch_get_mac_addr(char *x, void __iomem *efuse_mac)
static int emac_arch_get_mac_addr(char *x, void __iomem *efuse_mac, u32 swap)
{
unsigned int addr0, addr1;

addr1 = readl(efuse_mac + 4);
addr0 = readl(efuse_mac);

switch (swap) {
case NETCP_EFUSE_ADDR_SWAP:
addr0 = addr1;
addr1 = readl(efuse_mac);
break;
default:
break;
}

x[0] = (addr1 & 0x0000ff00) >> 8;
x[1] = addr1 & 0x000000ff;
x[2] = (addr0 & 0xff000000) >> 24;
Expand Down Expand Up @@ -1902,7 +1913,7 @@ static int netcp_create_interface(struct netcp_device *netcp_device,
goto quit;
}

emac_arch_get_mac_addr(efuse_mac_addr, efuse);
emac_arch_get_mac_addr(efuse_mac_addr, efuse, efuse_mac);
if (is_valid_ether_addr(efuse_mac_addr))
ether_addr_copy(ndev->dev_addr, efuse_mac_addr);
else
Expand Down

0 comments on commit 71382bc

Please sign in to comment.