net/nfp: support MAC address change
authorAlejandro Lucero <alejandro.lucero@netronome.com>
Tue, 17 Apr 2018 09:16:53 +0000 (10:16 +0100)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 27 Apr 2018 14:54:55 +0000 (15:54 +0100)
This patch allows to use another MAC address than the one coming
with the NIC by default.

The change requires to tell the vNIC after writing into the port
BAR space. The change will fail if the port is enabled and the
vNIC does not support a live address change.

Signed-off-by: Alejandro Lucero <alejandro.lucero@netronome.com>
drivers/net/nfp/nfp_net.c
drivers/net/nfp/nfp_net_ctrl.h

index bedd4b6..2a4b006 100644 (file)
@@ -109,6 +109,8 @@ static int nfp_net_rss_reta_write(struct rte_eth_dev *dev,
                    uint16_t reta_size);
 static int nfp_net_rss_hash_write(struct rte_eth_dev *dev,
                        struct rte_eth_rss_conf *rss_conf);
+static int nfp_set_mac_addr(struct rte_eth_dev *dev,
+                            struct ether_addr *mac_addr);
 
 /* The offset of the queue controller queues in the PCIe Target */
 #define NFP_PCIE_QUEUE(_q) (0x80000 + (NFP_QCP_QUEUE_ADDR_SZ * ((_q) & 0xff)))
@@ -684,6 +686,37 @@ nfp_net_write_mac(struct nfp_net_hw *hw, uint8_t *mac)
                  hw->ctrl_bar + NFP_NET_CFG_MACADDR + 6);
 }
 
+int
+nfp_set_mac_addr(struct rte_eth_dev *dev, struct ether_addr *mac_addr)
+{
+       struct nfp_net_hw *hw;
+       uint32_t update, ctrl;
+
+       hw = NFP_NET_DEV_PRIVATE_TO_HW(dev->data->dev_private);
+       if ((hw->ctrl & NFP_NET_CFG_CTRL_ENABLE) &&
+           !(hw->cap & NFP_NET_CFG_CTRL_LIVE_ADDR)) {
+               PMD_INIT_LOG(INFO, "MAC address unable to change when"
+                                 " port enabled");
+               return -EBUSY;
+       }
+
+       if ((hw->ctrl & NFP_NET_CFG_CTRL_ENABLE) &&
+           !(hw->cap & NFP_NET_CFG_CTRL_LIVE_ADDR))
+               return -EBUSY;
+
+       /* Writing new MAC to the specific port BAR address */
+       nfp_net_write_mac(hw, (uint8_t *)mac_addr);
+
+       /* Signal the NIC about the change */
+       update = NFP_NET_CFG_UPDATE_MACADDR;
+       ctrl = hw->ctrl | NFP_NET_CFG_CTRL_LIVE_ADDR;
+       if (nfp_net_reconfig(hw, ctrl, update) < 0) {
+               PMD_INIT_LOG(INFO, "MAC address update failed");
+               return -EIO;
+       }
+       return 0;
+}
+
 static int
 nfp_configure_rx_interrupt(struct rte_eth_dev *dev,
                           struct rte_intr_handle *intr_handle)
@@ -2750,6 +2783,7 @@ static const struct eth_dev_ops nfp_net_eth_dev_ops = {
        .dev_infos_get          = nfp_net_infos_get,
        .dev_supported_ptypes_get = nfp_net_supported_ptypes_get,
        .mtu_set                = nfp_net_dev_mtu_set,
+       .mac_addr_set           = nfp_set_mac_addr,
        .vlan_offload_set       = nfp_net_vlan_offload_set,
        .reta_update            = nfp_net_reta_update,
        .reta_query             = nfp_net_reta_query,
@@ -2956,7 +2990,7 @@ nfp_net_init(struct rte_eth_dev *eth_dev)
                           NFD_CFG_MAJOR_VERSION_of(hw->ver),
                           NFD_CFG_MINOR_VERSION_of(hw->ver), hw->max_mtu);
 
-       PMD_INIT_LOG(INFO, "CAP: %#x, %s%s%s%s%s%s%s%s%s%s%s%s%s", hw->cap,
+       PMD_INIT_LOG(INFO, "CAP: %#x, %s%s%s%s%s%s%s%s%s%s%s%s%s%s", hw->cap,
                     hw->cap & NFP_NET_CFG_CTRL_PROMISC ? "PROMISC " : "",
                     hw->cap & NFP_NET_CFG_CTRL_L2BC    ? "L2BCFILT " : "",
                     hw->cap & NFP_NET_CFG_CTRL_L2MC    ? "L2MCFILT " : "",
@@ -2966,6 +3000,7 @@ nfp_net_init(struct rte_eth_dev *eth_dev)
                     hw->cap & NFP_NET_CFG_CTRL_TXVLAN  ? "TXVLAN "  : "",
                     hw->cap & NFP_NET_CFG_CTRL_SCATTER ? "SCATTER " : "",
                     hw->cap & NFP_NET_CFG_CTRL_GATHER  ? "GATHER "  : "",
+                    hw->cap & NFP_NET_CFG_CTRL_LIVE_ADDR ? "LIVE_ADDR "  : "",
                     hw->cap & NFP_NET_CFG_CTRL_LSO     ? "TSO "     : "",
                     hw->cap & NFP_NET_CFG_CTRL_LSO2     ? "TSOv2 "     : "",
                     hw->cap & NFP_NET_CFG_CTRL_RSS     ? "RSS "     : "",
index 14eb176..21e17da 100644 (file)
 #define   NFP_NET_CFG_CTRL_MSIX_TX_OFF    (0x1 << 26) /* Disable MSIX for TX */
 #define   NFP_NET_CFG_CTRL_LSO2           (0x1 << 28) /* LSO/TSO (version 2) */
 #define   NFP_NET_CFG_CTRL_RSS2           (0x1 << 29) /* RSS (version 2) */
+#define   NFP_NET_CFG_CTRL_LIVE_ADDR      (0x1 << 31) /* live MAC addr change */
 #define NFP_NET_CFG_UPDATE              0x0004
 #define   NFP_NET_CFG_UPDATE_GEN          (0x1 <<  0) /* General update */
 #define   NFP_NET_CFG_UPDATE_RING         (0x1 <<  1) /* Ring config change */
 #define   NFP_NET_CFG_UPDATE_RESET        (0x1 <<  7) /* Update due to FLR */
 #define   NFP_NET_CFG_UPDATE_IRQMOD       (0x1 <<  8) /* IRQ mod change */
 #define   NFP_NET_CFG_UPDATE_VXLAN        (0x1 <<  9) /* VXLAN port change */
+#define   NFP_NET_CFG_UPDATE_MACADDR      (0x1 << 11) /* MAC address change */
 #define   NFP_NET_CFG_UPDATE_ERR          (0x1 << 31) /* A error occurred */
 #define NFP_NET_CFG_TXRS_ENABLE         0x0008
 #define NFP_NET_CFG_RXRS_ENABLE         0x0010