Skip to content

Commit 9d37275

Browse files
pcasconnetronomedavem330
authored andcommitted
nfp: add set_mac_address support while the interface is up
Expose FW app ability to change MAC address at runtime. Make sure we only depend on it if FW app advertised the right capability. Signed-off-by: Pablo Cascón <[email protected]> Reviewed-by: Jakub Kicinski <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent d935bc8 commit 9d37275

File tree

2 files changed

+36
-10
lines changed

2 files changed

+36
-10
lines changed

drivers/net/ethernet/netronome/nfp/nfp_net_common.c

Lines changed: 34 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2123,17 +2123,16 @@ void nfp_net_coalesce_write_cfg(struct nfp_net *nn)
21232123
/**
21242124
* nfp_net_write_mac_addr() - Write mac address to the device control BAR
21252125
* @nn: NFP Net device to reconfigure
2126+
* @addr: MAC address to write
21262127
*
21272128
* Writes the MAC address from the netdev to the device control BAR. Does not
21282129
* perform the required reconfig. We do a bit of byte swapping dance because
21292130
* firmware is LE.
21302131
*/
2131-
static void nfp_net_write_mac_addr(struct nfp_net *nn)
2132+
static void nfp_net_write_mac_addr(struct nfp_net *nn, const u8 *addr)
21322133
{
2133-
nn_writel(nn, NFP_NET_CFG_MACADDR + 0,
2134-
get_unaligned_be32(nn->dp.netdev->dev_addr));
2135-
nn_writew(nn, NFP_NET_CFG_MACADDR + 6,
2136-
get_unaligned_be16(nn->dp.netdev->dev_addr + 4));
2134+
nn_writel(nn, NFP_NET_CFG_MACADDR + 0, get_unaligned_be32(addr));
2135+
nn_writew(nn, NFP_NET_CFG_MACADDR + 6, get_unaligned_be16(addr + 4));
21372136
}
21382137

21392138
static void nfp_net_vec_clear_ring_data(struct nfp_net *nn, unsigned int idx)
@@ -2238,7 +2237,7 @@ static int nfp_net_set_config_and_enable(struct nfp_net *nn)
22382237
nn_writeq(nn, NFP_NET_CFG_RXRS_ENABLE, nn->dp.num_rx_rings == 64 ?
22392238
0xffffffffffffffffULL : ((u64)1 << nn->dp.num_rx_rings) - 1);
22402239

2241-
nfp_net_write_mac_addr(nn);
2240+
nfp_net_write_mac_addr(nn, nn->dp.netdev->dev_addr);
22422241

22432242
nn_writel(nn, NFP_NET_CFG_MTU, nn->dp.netdev->mtu);
22442243

@@ -2997,6 +2996,27 @@ static int nfp_net_xdp(struct net_device *netdev, struct netdev_xdp *xdp)
29972996
}
29982997
}
29992998

2999+
static int nfp_net_set_mac_address(struct net_device *netdev, void *addr)
3000+
{
3001+
struct nfp_net *nn = netdev_priv(netdev);
3002+
struct sockaddr *saddr = addr;
3003+
int err;
3004+
3005+
err = eth_prepare_mac_addr_change(netdev, addr);
3006+
if (err)
3007+
return err;
3008+
3009+
nfp_net_write_mac_addr(nn, saddr->sa_data);
3010+
3011+
err = nfp_net_reconfig(nn, NFP_NET_CFG_UPDATE_MACADDR);
3012+
if (err)
3013+
return err;
3014+
3015+
eth_commit_mac_addr_change(netdev, addr);
3016+
3017+
return 0;
3018+
}
3019+
30003020
const struct net_device_ops nfp_net_netdev_ops = {
30013021
.ndo_open = nfp_net_netdev_open,
30023022
.ndo_stop = nfp_net_netdev_close,
@@ -3006,7 +3026,7 @@ const struct net_device_ops nfp_net_netdev_ops = {
30063026
.ndo_tx_timeout = nfp_net_tx_timeout,
30073027
.ndo_set_rx_mode = nfp_net_set_rx_mode,
30083028
.ndo_change_mtu = nfp_net_change_mtu,
3009-
.ndo_set_mac_address = eth_mac_addr,
3029+
.ndo_set_mac_address = nfp_net_set_mac_address,
30103030
.ndo_set_features = nfp_net_set_features,
30113031
.ndo_features_check = nfp_net_features_check,
30123032
.ndo_get_phys_port_name = nfp_port_get_phys_port_name,
@@ -3029,7 +3049,7 @@ void nfp_net_info(struct nfp_net *nn)
30293049
nn->fw_ver.resv, nn->fw_ver.class,
30303050
nn->fw_ver.major, nn->fw_ver.minor,
30313051
nn->max_mtu);
3032-
nn_info(nn, "CAP: %#x %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
3052+
nn_info(nn, "CAP: %#x %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s\n",
30333053
nn->cap,
30343054
nn->cap & NFP_NET_CFG_CTRL_PROMISC ? "PROMISC " : "",
30353055
nn->cap & NFP_NET_CFG_CTRL_L2BC ? "L2BCFILT " : "",
@@ -3051,7 +3071,8 @@ void nfp_net_info(struct nfp_net *nn)
30513071
nn->cap & NFP_NET_CFG_CTRL_NVGRE ? "NVGRE " : "",
30523072
nfp_net_ebpf_capable(nn) ? "BPF " : "",
30533073
nn->cap & NFP_NET_CFG_CTRL_CSUM_COMPLETE ?
3054-
"RXCSUM_COMPLETE " : "");
3074+
"RXCSUM_COMPLETE " : "",
3075+
nn->cap & NFP_NET_CFG_CTRL_LIVE_ADDR ? "LIVE_ADDR " : "");
30553076
}
30563077

30573078
/**
@@ -3211,7 +3232,7 @@ int nfp_net_init(struct nfp_net *nn)
32113232
if (nn->dp.chained_metadata_format && nn->fw_ver.major != 4)
32123233
nn->cap &= ~NFP_NET_CFG_CTRL_RSS;
32133234

3214-
nfp_net_write_mac_addr(nn);
3235+
nfp_net_write_mac_addr(nn, nn->dp.netdev->dev_addr);
32153236

32163237
/* Determine RX packet/metadata boundary offset */
32173238
if (nn->fw_ver.major >= 2) {
@@ -3241,6 +3262,9 @@ int nfp_net_init(struct nfp_net *nn)
32413262
* and netdev->hw_features advertises which features are
32423263
* supported. By default we enable most features.
32433264
*/
3265+
if (nn->cap & NFP_NET_CFG_CTRL_LIVE_ADDR)
3266+
netdev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
3267+
32443268
netdev->hw_features = NETIF_F_HIGHDMA;
32453269
if (nn->cap & NFP_NET_CFG_CTRL_RXCSUM_ANY) {
32463270
netdev->hw_features |= NETIF_F_RXCSUM;

drivers/net/ethernet/netronome/nfp/nfp_net_ctrl.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@
135135
#define NFP_NET_CFG_CTRL_LSO2 (0x1 << 28) /* LSO/TSO (version 2) */
136136
#define NFP_NET_CFG_CTRL_RSS2 (0x1 << 29) /* RSS (version 2) */
137137
#define NFP_NET_CFG_CTRL_CSUM_COMPLETE (0x1 << 30) /* Checksum complete */
138+
#define NFP_NET_CFG_CTRL_LIVE_ADDR (0x1 << 31) /* live MAC addr change */
138139

139140
#define NFP_NET_CFG_CTRL_LSO_ANY (NFP_NET_CFG_CTRL_LSO | \
140141
NFP_NET_CFG_CTRL_LSO2)
@@ -157,6 +158,7 @@
157158
#define NFP_NET_CFG_UPDATE_IRQMOD (0x1 << 8) /* IRQ mod change */
158159
#define NFP_NET_CFG_UPDATE_VXLAN (0x1 << 9) /* VXLAN port change */
159160
#define NFP_NET_CFG_UPDATE_BPF (0x1 << 10) /* BPF program load */
161+
#define NFP_NET_CFG_UPDATE_MACADDR (0x1 << 11) /* MAC address change */
160162
#define NFP_NET_CFG_UPDATE_ERR (0x1 << 31) /* A error occurred */
161163
#define NFP_NET_CFG_TXRS_ENABLE 0x0008
162164
#define NFP_NET_CFG_RXRS_ENABLE 0x0010

0 commit comments

Comments
 (0)