net/txgbe: support VF promiscuous and allmulticast
Support to enable and disable promiscuous and allmulticast mode on VF device. Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
This commit is contained in:
parent
64b5d946d1
commit
29072d593f
@ -11,6 +11,8 @@ Jumbo frame = Y
|
||||
Scattered Rx = Y
|
||||
LRO = Y
|
||||
TSO = Y
|
||||
Promiscuous mode = Y
|
||||
Allmulticast mode = Y
|
||||
RSS hash = Y
|
||||
RSS key update = Y
|
||||
RSS reta update = Y
|
||||
|
@ -33,6 +33,7 @@ s32 txgbe_init_ops_vf(struct txgbe_hw *hw)
|
||||
/* RAR, Multicast, VLAN */
|
||||
mac->set_rar = txgbe_set_rar_vf;
|
||||
mac->set_uc_addr = txgbevf_set_uc_addr_vf;
|
||||
mac->update_xcast_mode = txgbevf_update_xcast_mode;
|
||||
mac->set_vfta = txgbe_set_vfta_vf;
|
||||
mac->set_rlpml = txgbevf_rlpml_set_vf;
|
||||
|
||||
@ -257,6 +258,43 @@ s32 txgbe_set_rar_vf(struct txgbe_hw *hw, u32 index, u8 *addr, u32 vmdq,
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/**
|
||||
* txgbevf_update_xcast_mode - Update Multicast mode
|
||||
* @hw: pointer to the HW structure
|
||||
* @xcast_mode: new multicast mode
|
||||
*
|
||||
* Updates the Multicast Mode of VF.
|
||||
**/
|
||||
s32 txgbevf_update_xcast_mode(struct txgbe_hw *hw, int xcast_mode)
|
||||
{
|
||||
u32 msgbuf[2];
|
||||
s32 err;
|
||||
|
||||
switch (hw->api_version) {
|
||||
case txgbe_mbox_api_12:
|
||||
/* New modes were introduced in 1.3 version */
|
||||
if (xcast_mode > TXGBEVF_XCAST_MODE_ALLMULTI)
|
||||
return TXGBE_ERR_FEATURE_NOT_SUPPORTED;
|
||||
/* Fall through */
|
||||
case txgbe_mbox_api_13:
|
||||
break;
|
||||
default:
|
||||
return TXGBE_ERR_FEATURE_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
msgbuf[0] = TXGBE_VF_UPDATE_XCAST_MODE;
|
||||
msgbuf[1] = xcast_mode;
|
||||
|
||||
err = txgbevf_write_msg_read_ack(hw, msgbuf, msgbuf, 2);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
msgbuf[0] &= ~TXGBE_VT_MSGTYPE_CTS;
|
||||
if (msgbuf[0] == (TXGBE_VF_UPDATE_XCAST_MODE | TXGBE_VT_MSGTYPE_NACK))
|
||||
return TXGBE_ERR_FEATURE_NOT_SUPPORTED;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* txgbe_set_vfta_vf - Set/Unset vlan filter table address
|
||||
* @hw: pointer to the HW structure
|
||||
|
@ -47,6 +47,7 @@ s32 txgbe_check_mac_link_vf(struct txgbe_hw *hw, u32 *speed,
|
||||
s32 txgbe_set_rar_vf(struct txgbe_hw *hw, u32 index, u8 *addr, u32 vmdq,
|
||||
u32 enable_addr);
|
||||
s32 txgbevf_set_uc_addr_vf(struct txgbe_hw *hw, u32 index, u8 *addr);
|
||||
s32 txgbevf_update_xcast_mode(struct txgbe_hw *hw, int xcast_mode);
|
||||
s32 txgbe_set_vfta_vf(struct txgbe_hw *hw, u32 vlan, u32 vind,
|
||||
bool vlan_on, bool vlvf_bypass);
|
||||
s32 txgbevf_rlpml_set_vf(struct txgbe_hw *hw, u16 max_size);
|
||||
|
@ -29,6 +29,8 @@ static int txgbevf_dev_stats_reset(struct rte_eth_dev *dev);
|
||||
static int txgbevf_vlan_offload_config(struct rte_eth_dev *dev, int mask);
|
||||
static void txgbevf_set_vfta_all(struct rte_eth_dev *dev, bool on);
|
||||
static void txgbevf_configure_msix(struct rte_eth_dev *dev);
|
||||
static int txgbevf_dev_promiscuous_enable(struct rte_eth_dev *dev);
|
||||
static int txgbevf_dev_promiscuous_disable(struct rte_eth_dev *dev);
|
||||
static void txgbevf_remove_mac_addr(struct rte_eth_dev *dev, uint32_t index);
|
||||
static void txgbevf_dev_interrupt_handler(void *param);
|
||||
|
||||
@ -265,6 +267,9 @@ eth_txgbevf_dev_init(struct rte_eth_dev *eth_dev)
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* enter promiscuous mode */
|
||||
txgbevf_dev_promiscuous_enable(eth_dev);
|
||||
|
||||
rte_intr_callback_register(intr_handle,
|
||||
txgbevf_dev_interrupt_handler, eth_dev);
|
||||
rte_intr_enable(intr_handle);
|
||||
@ -905,6 +910,90 @@ txgbevf_set_default_mac_addr(struct rte_eth_dev *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
txgbevf_dev_promiscuous_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
|
||||
int ret;
|
||||
|
||||
switch (hw->mac.update_xcast_mode(hw, TXGBEVF_XCAST_MODE_PROMISC)) {
|
||||
case 0:
|
||||
ret = 0;
|
||||
break;
|
||||
case TXGBE_ERR_FEATURE_NOT_SUPPORTED:
|
||||
ret = -ENOTSUP;
|
||||
break;
|
||||
default:
|
||||
ret = -EAGAIN;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
txgbevf_dev_promiscuous_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
|
||||
int ret;
|
||||
|
||||
switch (hw->mac.update_xcast_mode(hw, TXGBEVF_XCAST_MODE_NONE)) {
|
||||
case 0:
|
||||
ret = 0;
|
||||
break;
|
||||
case TXGBE_ERR_FEATURE_NOT_SUPPORTED:
|
||||
ret = -ENOTSUP;
|
||||
break;
|
||||
default:
|
||||
ret = -EAGAIN;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
txgbevf_dev_allmulticast_enable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
|
||||
int ret;
|
||||
|
||||
switch (hw->mac.update_xcast_mode(hw, TXGBEVF_XCAST_MODE_ALLMULTI)) {
|
||||
case 0:
|
||||
ret = 0;
|
||||
break;
|
||||
case TXGBE_ERR_FEATURE_NOT_SUPPORTED:
|
||||
ret = -ENOTSUP;
|
||||
break;
|
||||
default:
|
||||
ret = -EAGAIN;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
txgbevf_dev_allmulticast_disable(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
|
||||
int ret;
|
||||
|
||||
switch (hw->mac.update_xcast_mode(hw, TXGBEVF_XCAST_MODE_MULTI)) {
|
||||
case 0:
|
||||
ret = 0;
|
||||
break;
|
||||
case TXGBE_ERR_FEATURE_NOT_SUPPORTED:
|
||||
ret = -ENOTSUP;
|
||||
break;
|
||||
default:
|
||||
ret = -EAGAIN;
|
||||
break;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void txgbevf_mbx_process(struct rte_eth_dev *dev)
|
||||
{
|
||||
struct txgbe_hw *hw = TXGBE_DEV_HW(dev);
|
||||
@ -979,6 +1068,10 @@ static const struct eth_dev_ops txgbevf_eth_dev_ops = {
|
||||
.stats_reset = txgbevf_dev_stats_reset,
|
||||
.xstats_reset = txgbevf_dev_stats_reset,
|
||||
.xstats_get_names = txgbevf_dev_xstats_get_names,
|
||||
.promiscuous_enable = txgbevf_dev_promiscuous_enable,
|
||||
.promiscuous_disable = txgbevf_dev_promiscuous_disable,
|
||||
.allmulticast_enable = txgbevf_dev_allmulticast_enable,
|
||||
.allmulticast_disable = txgbevf_dev_allmulticast_disable,
|
||||
.dev_infos_get = txgbevf_dev_info_get,
|
||||
.vlan_filter_set = txgbevf_vlan_filter_set,
|
||||
.vlan_strip_queue_set = txgbevf_vlan_strip_queue_set,
|
||||
|
Loading…
x
Reference in New Issue
Block a user