X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fmlx5%2Fmlx5_mac.c;h=a1cb987cb17215e0a274b7e1b8d5c4453023e7eb;hb=3669a1af893088064778f14fba0c2ca88819e095;hp=f7e1cf6888a494ce4470ae0959cd92d2c47cf2b8;hpb=771fa900b73aae1ac8ec0ae6ac086e9e164da7b2;p=dpdk.git diff --git a/drivers/net/mlx5/mlx5_mac.c b/drivers/net/mlx5/mlx5_mac.c index f7e1cf6888..a1cb987cb1 100644 --- a/drivers/net/mlx5/mlx5_mac.c +++ b/drivers/net/mlx5/mlx5_mac.c @@ -38,33 +38,27 @@ #include #include #include -#include #include #include /* Verbs header. */ /* ISO C doesn't support unnamed structs/unions, disabling -pedantic. */ #ifdef PEDANTIC -#pragma GCC diagnostic ignored "-pedantic" +#pragma GCC diagnostic ignored "-Wpedantic" #endif #include #ifdef PEDANTIC -#pragma GCC diagnostic error "-pedantic" +#pragma GCC diagnostic error "-Wpedantic" #endif -/* DPDK headers don't like -pedantic. */ -#ifdef PEDANTIC -#pragma GCC diagnostic ignored "-pedantic" -#endif #include -#include +#include #include -#ifdef PEDANTIC -#pragma GCC diagnostic error "-pedantic" -#endif #include "mlx5.h" #include "mlx5_utils.h" +#include "mlx5_rxtx.h" +#include "mlx5_defs.h" /** * Get MAC address by querying netdevice. @@ -89,62 +83,73 @@ priv_get_mac(struct priv *priv, uint8_t (*mac)[ETHER_ADDR_LEN]) } /** - * Unregister a MAC address. + * DPDK callback to remove a MAC address. * - * @param priv - * Pointer to private structure. - * @param mac_index + * @param dev + * Pointer to Ethernet device structure. + * @param index * MAC address index. */ -static void -priv_mac_addr_del(struct priv *priv, unsigned int mac_index) +void +mlx5_mac_addr_remove(struct rte_eth_dev *dev, uint32_t index) { - assert(mac_index < RTE_DIM(priv->mac)); - if (!BITFIELD_ISSET(priv->mac_configured, mac_index)) - return; - BITFIELD_RESET(priv->mac_configured, mac_index); + assert(index < MLX5_MAX_MAC_ADDRESSES); + memset(&dev->data->mac_addrs[index], 0, sizeof(struct ether_addr)); + if (!dev->data->promiscuous) + mlx5_traffic_restart(dev); } /** - * Register a MAC address. + * DPDK callback to add a MAC address. * - * @param priv - * Pointer to private structure. - * @param mac_index - * MAC address index to use. - * @param mac + * @param dev + * Pointer to Ethernet device structure. + * @param mac_addr * MAC address to register. + * @param index + * MAC address index. + * @param vmdq + * VMDq pool index to associate address with (ignored). * * @return - * 0 on success, errno value on failure. + * 0 on success. */ int -priv_mac_addr_add(struct priv *priv, unsigned int mac_index, - const uint8_t (*mac)[ETHER_ADDR_LEN]) +mlx5_mac_addr_add(struct rte_eth_dev *dev, struct ether_addr *mac, + uint32_t index, uint32_t vmdq) { unsigned int i; + int ret = 0; - assert(mac_index < RTE_DIM(priv->mac)); + (void)vmdq; + assert(index < MLX5_MAX_MAC_ADDRESSES); /* First, make sure this address isn't already configured. */ - for (i = 0; (i != RTE_DIM(priv->mac)); ++i) { + for (i = 0; (i != MLX5_MAX_MAC_ADDRESSES); ++i) { /* Skip this index, it's going to be reconfigured. */ - if (i == mac_index) - continue; - if (!BITFIELD_ISSET(priv->mac_configured, i)) + if (i == index) continue; - if (memcmp(priv->mac[i].addr_bytes, *mac, sizeof(*mac))) + if (memcmp(&dev->data->mac_addrs[i], mac, sizeof(*mac))) continue; /* Address already configured elsewhere, return with error. */ return EADDRINUSE; } - if (BITFIELD_ISSET(priv->mac_configured, mac_index)) - priv_mac_addr_del(priv, mac_index); - priv->mac[mac_index] = (struct ether_addr){ - { - (*mac)[0], (*mac)[1], (*mac)[2], - (*mac)[3], (*mac)[4], (*mac)[5] - } - }; - BITFIELD_SET(priv->mac_configured, mac_index); - return 0; + dev->data->mac_addrs[index] = *mac; + if (!dev->data->promiscuous) + mlx5_traffic_restart(dev); + return ret; +} + +/** + * DPDK callback to set primary MAC address. + * + * @param dev + * Pointer to Ethernet device structure. + * @param mac_addr + * MAC address to register. + */ +void +mlx5_mac_addr_set(struct rte_eth_dev *dev, struct ether_addr *mac_addr) +{ + DEBUG("%p: setting primary MAC address", (void *)dev); + mlx5_mac_addr_add(dev, mac_addr, 0, 0); }