net/sfc: support main MAC address change
[dpdk.git] / drivers / net / sfc / sfc_port.c
index d8ff097..dc6ecdf 100644 (file)
@@ -79,6 +79,18 @@ sfc_port_start(struct sfc_adapter *sa)
        if (rc != 0)
                goto fail_port_init;
 
+       sfc_log_init(sa, "set flow control to %#x autoneg=%u",
+                    port->flow_ctrl, port->flow_ctrl_autoneg);
+       rc = efx_mac_fcntl_set(sa->nic, port->flow_ctrl,
+                              port->flow_ctrl_autoneg);
+       if (rc != 0)
+               goto fail_mac_fcntl_set;
+
+       sfc_log_init(sa, "set phy adv caps to %#x", port->phy_adv_cap);
+       rc = efx_phy_adv_cap_set(sa->nic, port->phy_adv_cap);
+       if (rc != 0)
+               goto fail_phy_adv_cap_set;
+
        sfc_log_init(sa, "set MAC PDU %u", (unsigned int)port->pdu);
        rc = efx_mac_pdu_set(sa->nic, port->pdu);
        if (rc != 0)
@@ -91,7 +103,11 @@ sfc_port_start(struct sfc_adapter *sa)
                goto fail_mac_addr_set;
 
        sfc_log_init(sa, "set MAC filters");
-       rc = efx_mac_filter_set(sa->nic, B_TRUE, B_TRUE, B_TRUE, B_TRUE);
+       port->promisc = (sa->eth_dev->data->promiscuous != 0) ?
+                       B_TRUE : B_FALSE;
+       port->allmulti = (sa->eth_dev->data->all_multicast != 0) ?
+                        B_TRUE : B_FALSE;
+       rc = sfc_set_rx_mode(sa);
        if (rc != 0)
                goto fail_mac_filter_set;
 
@@ -124,6 +140,8 @@ fail_mac_stats_periodic:
 fail_mac_filter_set:
 fail_mac_addr_set:
 fail_mac_pdu_set:
+fail_phy_adv_cap_set:
+fail_mac_fcntl_set:
        efx_port_fini(sa->nic);
 
 fail_port_init:
@@ -205,6 +223,18 @@ sfc_port_fini(struct sfc_adapter *sa)
        sfc_log_init(sa, "done");
 }
 
+int
+sfc_set_rx_mode(struct sfc_adapter *sa)
+{
+       struct sfc_port *port = &sa->port;
+       int rc;
+
+       rc = efx_mac_filter_set(sa->nic, port->promisc, B_TRUE,
+                               port->promisc || port->allmulti, B_TRUE);
+
+       return rc;
+}
+
 void
 sfc_port_link_mode_to_info(efx_link_mode_t link_mode,
                           struct rte_eth_link *link_info)