net/enic: add primary MAC address handler
authorDavid Marchand <david.marchand@6wind.com>
Mon, 16 Apr 2018 09:40:17 +0000 (11:40 +0200)
committerFerruh Yigit <ferruh.yigit@intel.com>
Fri, 27 Apr 2018 14:54:55 +0000 (15:54 +0100)
Modified enic_del_mac_address() to get a return value from the vnic layer.
Reused the .mac_addr_add and .mac_addr_del callbacks code to implement
primary mac address handler.

Signed-off-by: David Marchand <david.marchand@6wind.com>
Acked-by: Hyong Youb Kim <hyonkim@cisco.com>
drivers/net/enic/enic.h
drivers/net/enic/enic_ethdev.c
drivers/net/enic/enic_main.c

index 751ddc7..5f15e44 100644 (file)
@@ -284,7 +284,7 @@ int enic_dev_stats_get(struct enic *enic,
 void enic_dev_stats_clear(struct enic *enic);
 void enic_add_packet_filter(struct enic *enic);
 int enic_set_mac_address(struct enic *enic, uint8_t *mac_addr);
-void enic_del_mac_address(struct enic *enic, int mac_index);
+int enic_del_mac_address(struct enic *enic, int mac_index);
 unsigned int enic_cleanup_wq(struct enic *enic, struct vnic_wq *wq);
 void enic_send_pkt(struct enic *enic, struct vnic_wq *wq,
                   struct rte_mbuf *tx_pkt, unsigned short len,
index 801f470..f503398 100644 (file)
@@ -583,7 +583,24 @@ static void enicpmd_remove_mac_addr(struct rte_eth_dev *eth_dev, uint32_t index)
                return;
 
        ENICPMD_FUNC_TRACE();
-       enic_del_mac_address(enic, index);
+       if (enic_del_mac_address(enic, index))
+               dev_err(enic, "del mac addr failed\n");
+}
+
+static int enicpmd_set_mac_addr(struct rte_eth_dev *eth_dev,
+                               struct ether_addr *addr)
+{
+       struct enic *enic = pmd_priv(eth_dev);
+       int ret;
+
+       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+               return -E_RTE_SECONDARY;
+
+       ENICPMD_FUNC_TRACE();
+       ret = enic_del_mac_address(enic, 0);
+       if (ret)
+               return ret;
+       return enic_set_mac_address(enic, addr->addr_bytes);
 }
 
 static int enicpmd_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu)
@@ -799,6 +816,7 @@ static const struct eth_dev_ops enicpmd_eth_dev_ops = {
        .priority_flow_ctrl_set = NULL,
        .mac_addr_add         = enicpmd_add_mac_addr,
        .mac_addr_remove      = enicpmd_remove_mac_addr,
+       .mac_addr_set         = enicpmd_set_mac_addr,
        .filter_ctrl          = enicpmd_dev_filter_ctrl,
        .reta_query           = enicpmd_dev_rss_reta_query,
        .reta_update          = enicpmd_dev_rss_reta_update,
index 98d4775..d9bc7fd 100644 (file)
@@ -162,13 +162,12 @@ int enic_dev_stats_get(struct enic *enic, struct rte_eth_stats *r_stats)
        return 0;
 }
 
-void enic_del_mac_address(struct enic *enic, int mac_index)
+int enic_del_mac_address(struct enic *enic, int mac_index)
 {
        struct rte_eth_dev *eth_dev = enic->rte_dev;
        uint8_t *mac_addr = eth_dev->data->mac_addrs[mac_index].addr_bytes;
 
-       if (vnic_dev_del_addr(enic->vdev, mac_addr))
-               dev_err(enic, "del mac addr failed\n");
+       return vnic_dev_del_addr(enic->vdev, mac_addr);
 }
 
 int enic_set_mac_address(struct enic *enic, uint8_t *mac_addr)