igb/igbvf: Add VF MAC filter request capabilities
Add functionality for the VF to request up to 3 additional MAC filters. This is done using existing E1000_VF_SET_MAC_ADDR message, but with additional message info - E1000_VF_MAC_FILTER_CLR to clear all unicast MAC filters previously set for this VF and E1000_VF_MAC_FILTER_ADD to add MAC filter. Additional filters can be added only in case if administrator did not set VF MAC explicitly and allowed to change default MAC to the VF. Due to the limited number of RAR entries reserve at least 3 MAC filters for the PF. If SRIOV is supported by the NIC after this change RAR entries starting from 1 to (RAR MAX ENTRIES - NUM SRIOV VFS) will be used for PF and VF MAC filters. Signed-off-by: Yury Kylulin <yury.kylulin@intel.com> Tested-by: Aaron Brown <aaron.f.brown@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:

zatwierdzone przez
Jeff Kirsher

rodzic
83c21335c8
commit
4827cc3779
@@ -1432,13 +1432,53 @@ static void igbvf_set_multi(struct net_device *netdev)
|
||||
kfree(mta_list);
|
||||
}
|
||||
|
||||
/**
|
||||
* igbvf_set_uni - Configure unicast MAC filters
|
||||
* @netdev: network interface device structure
|
||||
*
|
||||
* This routine is responsible for configuring the hardware for proper
|
||||
* unicast filters.
|
||||
**/
|
||||
static int igbvf_set_uni(struct net_device *netdev)
|
||||
{
|
||||
struct igbvf_adapter *adapter = netdev_priv(netdev);
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
|
||||
if (netdev_uc_count(netdev) > IGBVF_MAX_MAC_FILTERS) {
|
||||
pr_err("Too many unicast filters - No Space\n");
|
||||
return -ENOSPC;
|
||||
}
|
||||
|
||||
/* Clear all unicast MAC filters */
|
||||
hw->mac.ops.set_uc_addr(hw, E1000_VF_MAC_FILTER_CLR, NULL);
|
||||
|
||||
if (!netdev_uc_empty(netdev)) {
|
||||
struct netdev_hw_addr *ha;
|
||||
|
||||
/* Add MAC filters one by one */
|
||||
netdev_for_each_uc_addr(ha, netdev) {
|
||||
hw->mac.ops.set_uc_addr(hw, E1000_VF_MAC_FILTER_ADD,
|
||||
ha->addr);
|
||||
udelay(200);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void igbvf_set_rx_mode(struct net_device *netdev)
|
||||
{
|
||||
igbvf_set_multi(netdev);
|
||||
igbvf_set_uni(netdev);
|
||||
}
|
||||
|
||||
/**
|
||||
* igbvf_configure - configure the hardware for Rx and Tx
|
||||
* @adapter: private board structure
|
||||
**/
|
||||
static void igbvf_configure(struct igbvf_adapter *adapter)
|
||||
{
|
||||
igbvf_set_multi(adapter->netdev);
|
||||
igbvf_set_rx_mode(adapter->netdev);
|
||||
|
||||
igbvf_restore_vlan(adapter);
|
||||
|
||||
@@ -2636,7 +2676,7 @@ static const struct net_device_ops igbvf_netdev_ops = {
|
||||
.ndo_stop = igbvf_close,
|
||||
.ndo_start_xmit = igbvf_xmit_frame,
|
||||
.ndo_get_stats = igbvf_get_stats,
|
||||
.ndo_set_rx_mode = igbvf_set_multi,
|
||||
.ndo_set_rx_mode = igbvf_set_rx_mode,
|
||||
.ndo_set_mac_address = igbvf_set_mac,
|
||||
.ndo_change_mtu = igbvf_change_mtu,
|
||||
.ndo_do_ioctl = igbvf_ioctl,
|
||||
|
Reference in New Issue
Block a user