@@ -2123,17 +2123,16 @@ void nfp_net_coalesce_write_cfg(struct nfp_net *nn)
2123
2123
/**
2124
2124
* nfp_net_write_mac_addr() - Write mac address to the device control BAR
2125
2125
* @nn: NFP Net device to reconfigure
2126
+ * @addr: MAC address to write
2126
2127
*
2127
2128
* Writes the MAC address from the netdev to the device control BAR. Does not
2128
2129
* perform the required reconfig. We do a bit of byte swapping dance because
2129
2130
* firmware is LE.
2130
2131
*/
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 )
2132
2133
{
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 ));
2137
2136
}
2138
2137
2139
2138
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)
2238
2237
nn_writeq (nn , NFP_NET_CFG_RXRS_ENABLE , nn -> dp .num_rx_rings == 64 ?
2239
2238
0xffffffffffffffffULL : ((u64 )1 << nn -> dp .num_rx_rings ) - 1 );
2240
2239
2241
- nfp_net_write_mac_addr (nn );
2240
+ nfp_net_write_mac_addr (nn , nn -> dp . netdev -> dev_addr );
2242
2241
2243
2242
nn_writel (nn , NFP_NET_CFG_MTU , nn -> dp .netdev -> mtu );
2244
2243
@@ -2997,6 +2996,27 @@ static int nfp_net_xdp(struct net_device *netdev, struct netdev_xdp *xdp)
2997
2996
}
2998
2997
}
2999
2998
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
+
3000
3020
const struct net_device_ops nfp_net_netdev_ops = {
3001
3021
.ndo_open = nfp_net_netdev_open ,
3002
3022
.ndo_stop = nfp_net_netdev_close ,
@@ -3006,7 +3026,7 @@ const struct net_device_ops nfp_net_netdev_ops = {
3006
3026
.ndo_tx_timeout = nfp_net_tx_timeout ,
3007
3027
.ndo_set_rx_mode = nfp_net_set_rx_mode ,
3008
3028
.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 ,
3010
3030
.ndo_set_features = nfp_net_set_features ,
3011
3031
.ndo_features_check = nfp_net_features_check ,
3012
3032
.ndo_get_phys_port_name = nfp_port_get_phys_port_name ,
@@ -3029,7 +3049,7 @@ void nfp_net_info(struct nfp_net *nn)
3029
3049
nn -> fw_ver .resv , nn -> fw_ver .class ,
3030
3050
nn -> fw_ver .major , nn -> fw_ver .minor ,
3031
3051
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" ,
3033
3053
nn -> cap ,
3034
3054
nn -> cap & NFP_NET_CFG_CTRL_PROMISC ? "PROMISC " : "" ,
3035
3055
nn -> cap & NFP_NET_CFG_CTRL_L2BC ? "L2BCFILT " : "" ,
@@ -3051,7 +3071,8 @@ void nfp_net_info(struct nfp_net *nn)
3051
3071
nn -> cap & NFP_NET_CFG_CTRL_NVGRE ? "NVGRE " : "" ,
3052
3072
nfp_net_ebpf_capable (nn ) ? "BPF " : "" ,
3053
3073
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 " : "" );
3055
3076
}
3056
3077
3057
3078
/**
@@ -3211,7 +3232,7 @@ int nfp_net_init(struct nfp_net *nn)
3211
3232
if (nn -> dp .chained_metadata_format && nn -> fw_ver .major != 4 )
3212
3233
nn -> cap &= ~NFP_NET_CFG_CTRL_RSS ;
3213
3234
3214
- nfp_net_write_mac_addr (nn );
3235
+ nfp_net_write_mac_addr (nn , nn -> dp . netdev -> dev_addr );
3215
3236
3216
3237
/* Determine RX packet/metadata boundary offset */
3217
3238
if (nn -> fw_ver .major >= 2 ) {
@@ -3241,6 +3262,9 @@ int nfp_net_init(struct nfp_net *nn)
3241
3262
* and netdev->hw_features advertises which features are
3242
3263
* supported. By default we enable most features.
3243
3264
*/
3265
+ if (nn -> cap & NFP_NET_CFG_CTRL_LIVE_ADDR )
3266
+ netdev -> priv_flags |= IFF_LIVE_ADDR_CHANGE ;
3267
+
3244
3268
netdev -> hw_features = NETIF_F_HIGHDMA ;
3245
3269
if (nn -> cap & NFP_NET_CFG_CTRL_RXCSUM_ANY ) {
3246
3270
netdev -> hw_features |= NETIF_F_RXCSUM ;
0 commit comments