mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-09 19:26:40 +07:00
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/jkirsher/net-next-2.6
This commit is contained in:
commit
89c64d755f
@ -144,7 +144,7 @@ void e1000_write_vfta_generic(struct e1000_hw *hw, u32 offset, u32 value)
|
||||
* @hw: pointer to the HW structure
|
||||
* @rar_count: receive address registers
|
||||
*
|
||||
* Setups the receive address registers by setting the base receive address
|
||||
* Setup the receive address registers by setting the base receive address
|
||||
* register to the devices MAC address and clearing all the other receive
|
||||
* address registers to 0.
|
||||
**/
|
||||
@ -1181,7 +1181,7 @@ s32 e1000e_config_fc_after_link_up(struct e1000_hw *hw)
|
||||
* of pause frames. In this case, we had to advertise
|
||||
* FULL flow control because we could not advertise Rx
|
||||
* ONLY. Hence, we must now check to see if we need to
|
||||
* turn OFF the TRANSMISSION of PAUSE frames.
|
||||
* turn OFF the TRANSMISSION of PAUSE frames.
|
||||
*/
|
||||
if (hw->fc.requested_mode == e1000_fc_full) {
|
||||
hw->fc.current_mode = e1000_fc_full;
|
||||
|
@ -106,6 +106,7 @@
|
||||
#define IXGBE_MAX_VF_FUNCTIONS 64
|
||||
#define IXGBE_MAX_VFTA_ENTRIES 128
|
||||
#define MAX_EMULATION_MAC_ADDRS 16
|
||||
#define IXGBE_MAX_PF_MACVLANS 15
|
||||
#define VMDQ_P(p) ((p) + adapter->num_vfs)
|
||||
|
||||
struct vf_data_storage {
|
||||
@ -121,6 +122,15 @@ struct vf_data_storage {
|
||||
u16 tx_rate;
|
||||
};
|
||||
|
||||
struct vf_macvlans {
|
||||
struct list_head l;
|
||||
int vf;
|
||||
int rar_entry;
|
||||
bool free;
|
||||
bool is_macvlan;
|
||||
u8 vf_macvlan[ETH_ALEN];
|
||||
};
|
||||
|
||||
/* wrapper around a pointer to a socket buffer,
|
||||
* so a DMA handle can be stored along with the buffer */
|
||||
struct ixgbe_tx_buffer {
|
||||
@ -331,10 +341,52 @@ struct ixgbe_q_vector {
|
||||
|
||||
/* board specific private data structure */
|
||||
struct ixgbe_adapter {
|
||||
struct timer_list watchdog_timer;
|
||||
unsigned long state;
|
||||
|
||||
/* Some features need tri-state capability,
|
||||
* thus the additional *_CAPABLE flags.
|
||||
*/
|
||||
u32 flags;
|
||||
#define IXGBE_FLAG_RX_CSUM_ENABLED (u32)(1)
|
||||
#define IXGBE_FLAG_MSI_CAPABLE (u32)(1 << 1)
|
||||
#define IXGBE_FLAG_MSI_ENABLED (u32)(1 << 2)
|
||||
#define IXGBE_FLAG_MSIX_CAPABLE (u32)(1 << 3)
|
||||
#define IXGBE_FLAG_MSIX_ENABLED (u32)(1 << 4)
|
||||
#define IXGBE_FLAG_RX_1BUF_CAPABLE (u32)(1 << 6)
|
||||
#define IXGBE_FLAG_RX_PS_CAPABLE (u32)(1 << 7)
|
||||
#define IXGBE_FLAG_RX_PS_ENABLED (u32)(1 << 8)
|
||||
#define IXGBE_FLAG_IN_NETPOLL (u32)(1 << 9)
|
||||
#define IXGBE_FLAG_DCA_ENABLED (u32)(1 << 10)
|
||||
#define IXGBE_FLAG_DCA_CAPABLE (u32)(1 << 11)
|
||||
#define IXGBE_FLAG_IMIR_ENABLED (u32)(1 << 12)
|
||||
#define IXGBE_FLAG_MQ_CAPABLE (u32)(1 << 13)
|
||||
#define IXGBE_FLAG_DCB_ENABLED (u32)(1 << 14)
|
||||
#define IXGBE_FLAG_RSS_ENABLED (u32)(1 << 16)
|
||||
#define IXGBE_FLAG_RSS_CAPABLE (u32)(1 << 17)
|
||||
#define IXGBE_FLAG_VMDQ_CAPABLE (u32)(1 << 18)
|
||||
#define IXGBE_FLAG_VMDQ_ENABLED (u32)(1 << 19)
|
||||
#define IXGBE_FLAG_FAN_FAIL_CAPABLE (u32)(1 << 20)
|
||||
#define IXGBE_FLAG_NEED_LINK_UPDATE (u32)(1 << 22)
|
||||
#define IXGBE_FLAG_NEED_LINK_CONFIG (u32)(1 << 23)
|
||||
#define IXGBE_FLAG_FDIR_HASH_CAPABLE (u32)(1 << 24)
|
||||
#define IXGBE_FLAG_FDIR_PERFECT_CAPABLE (u32)(1 << 25)
|
||||
#define IXGBE_FLAG_FCOE_CAPABLE (u32)(1 << 26)
|
||||
#define IXGBE_FLAG_FCOE_ENABLED (u32)(1 << 27)
|
||||
#define IXGBE_FLAG_SRIOV_CAPABLE (u32)(1 << 28)
|
||||
#define IXGBE_FLAG_SRIOV_ENABLED (u32)(1 << 29)
|
||||
|
||||
u32 flags2;
|
||||
#define IXGBE_FLAG2_RSC_CAPABLE (u32)(1)
|
||||
#define IXGBE_FLAG2_RSC_ENABLED (u32)(1 << 1)
|
||||
#define IXGBE_FLAG2_TEMP_SENSOR_CAPABLE (u32)(1 << 2)
|
||||
#define IXGBE_FLAG2_TEMP_SENSOR_EVENT (u32)(1 << 3)
|
||||
#define IXGBE_FLAG2_SEARCH_FOR_SFP (u32)(1 << 4)
|
||||
#define IXGBE_FLAG2_SFP_NEEDS_RESET (u32)(1 << 5)
|
||||
#define IXGBE_FLAG2_RESET_REQUESTED (u32)(1 << 6)
|
||||
#define IXGBE_FLAG2_FDIR_REQUIRES_REINIT (u32)(1 << 7)
|
||||
|
||||
unsigned long active_vlans[BITS_TO_LONGS(VLAN_N_VID)];
|
||||
u16 bd_number;
|
||||
struct work_struct reset_task;
|
||||
struct ixgbe_q_vector *q_vector[MAX_MSIX_Q_VECTORS];
|
||||
|
||||
/* DCB parameters */
|
||||
@ -377,43 +429,6 @@ struct ixgbe_adapter {
|
||||
u32 alloc_rx_page_failed;
|
||||
u32 alloc_rx_buff_failed;
|
||||
|
||||
/* Some features need tri-state capability,
|
||||
* thus the additional *_CAPABLE flags.
|
||||
*/
|
||||
u32 flags;
|
||||
#define IXGBE_FLAG_RX_CSUM_ENABLED (u32)(1)
|
||||
#define IXGBE_FLAG_MSI_CAPABLE (u32)(1 << 1)
|
||||
#define IXGBE_FLAG_MSI_ENABLED (u32)(1 << 2)
|
||||
#define IXGBE_FLAG_MSIX_CAPABLE (u32)(1 << 3)
|
||||
#define IXGBE_FLAG_MSIX_ENABLED (u32)(1 << 4)
|
||||
#define IXGBE_FLAG_RX_1BUF_CAPABLE (u32)(1 << 6)
|
||||
#define IXGBE_FLAG_RX_PS_CAPABLE (u32)(1 << 7)
|
||||
#define IXGBE_FLAG_RX_PS_ENABLED (u32)(1 << 8)
|
||||
#define IXGBE_FLAG_IN_NETPOLL (u32)(1 << 9)
|
||||
#define IXGBE_FLAG_DCA_ENABLED (u32)(1 << 10)
|
||||
#define IXGBE_FLAG_DCA_CAPABLE (u32)(1 << 11)
|
||||
#define IXGBE_FLAG_IMIR_ENABLED (u32)(1 << 12)
|
||||
#define IXGBE_FLAG_MQ_CAPABLE (u32)(1 << 13)
|
||||
#define IXGBE_FLAG_DCB_ENABLED (u32)(1 << 14)
|
||||
#define IXGBE_FLAG_RSS_ENABLED (u32)(1 << 16)
|
||||
#define IXGBE_FLAG_RSS_CAPABLE (u32)(1 << 17)
|
||||
#define IXGBE_FLAG_VMDQ_CAPABLE (u32)(1 << 18)
|
||||
#define IXGBE_FLAG_VMDQ_ENABLED (u32)(1 << 19)
|
||||
#define IXGBE_FLAG_FAN_FAIL_CAPABLE (u32)(1 << 20)
|
||||
#define IXGBE_FLAG_NEED_LINK_UPDATE (u32)(1 << 22)
|
||||
#define IXGBE_FLAG_IN_SFP_LINK_TASK (u32)(1 << 23)
|
||||
#define IXGBE_FLAG_IN_SFP_MOD_TASK (u32)(1 << 24)
|
||||
#define IXGBE_FLAG_FDIR_HASH_CAPABLE (u32)(1 << 25)
|
||||
#define IXGBE_FLAG_FDIR_PERFECT_CAPABLE (u32)(1 << 26)
|
||||
#define IXGBE_FLAG_FCOE_CAPABLE (u32)(1 << 27)
|
||||
#define IXGBE_FLAG_FCOE_ENABLED (u32)(1 << 28)
|
||||
#define IXGBE_FLAG_SRIOV_CAPABLE (u32)(1 << 29)
|
||||
#define IXGBE_FLAG_SRIOV_ENABLED (u32)(1 << 30)
|
||||
|
||||
u32 flags2;
|
||||
#define IXGBE_FLAG2_RSC_CAPABLE (u32)(1)
|
||||
#define IXGBE_FLAG2_RSC_ENABLED (u32)(1 << 1)
|
||||
#define IXGBE_FLAG2_TEMP_SENSOR_CAPABLE (u32)(1 << 2)
|
||||
/* default to trying for four seconds */
|
||||
#define IXGBE_TRY_LINK_TIMEOUT (4 * HZ)
|
||||
|
||||
@ -434,7 +449,6 @@ struct ixgbe_adapter {
|
||||
u32 rx_eitr_param;
|
||||
u32 tx_eitr_param;
|
||||
|
||||
unsigned long state;
|
||||
u64 tx_busy;
|
||||
unsigned int tx_ring_count;
|
||||
unsigned int rx_ring_count;
|
||||
@ -443,15 +457,12 @@ struct ixgbe_adapter {
|
||||
bool link_up;
|
||||
unsigned long link_check_timeout;
|
||||
|
||||
struct work_struct watchdog_task;
|
||||
struct work_struct sfp_task;
|
||||
struct timer_list sfp_timer;
|
||||
struct work_struct multispeed_fiber_task;
|
||||
struct work_struct sfp_config_module_task;
|
||||
struct work_struct service_task;
|
||||
struct timer_list service_timer;
|
||||
u32 fdir_pballoc;
|
||||
u32 atr_sample_rate;
|
||||
unsigned long fdir_overflow; /* number of times ATR was backed off */
|
||||
spinlock_t fdir_perfect_lock;
|
||||
struct work_struct fdir_reinit_task;
|
||||
#ifdef IXGBE_FCOE
|
||||
struct ixgbe_fcoe fcoe;
|
||||
#endif /* IXGBE_FCOE */
|
||||
@ -462,7 +473,6 @@ struct ixgbe_adapter {
|
||||
|
||||
int node;
|
||||
u32 led_reg;
|
||||
struct work_struct check_overtemp_task;
|
||||
u32 interrupt_event;
|
||||
char lsc_int_name[IFNAMSIZ + 9];
|
||||
|
||||
@ -471,13 +481,17 @@ struct ixgbe_adapter {
|
||||
unsigned int num_vfs;
|
||||
struct vf_data_storage *vfinfo;
|
||||
int vf_rate_link_speed;
|
||||
struct vf_macvlans vf_mvs;
|
||||
struct vf_macvlans *mv_list;
|
||||
bool antispoofing_enabled;
|
||||
};
|
||||
|
||||
enum ixbge_state_t {
|
||||
__IXGBE_TESTING,
|
||||
__IXGBE_RESETTING,
|
||||
__IXGBE_DOWN,
|
||||
__IXGBE_SFP_MODULE_NOT_FOUND
|
||||
__IXGBE_SERVICE_SCHED,
|
||||
__IXGBE_IN_SFP_INIT,
|
||||
};
|
||||
|
||||
struct ixgbe_rsc_cb {
|
||||
|
@ -368,6 +368,9 @@ static enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw)
|
||||
case IXGBE_DEV_ID_82599_T3_LOM:
|
||||
media_type = ixgbe_media_type_copper;
|
||||
break;
|
||||
case IXGBE_DEV_ID_82599_LS:
|
||||
media_type = ixgbe_media_type_fiber_lco;
|
||||
break;
|
||||
default:
|
||||
media_type = ixgbe_media_type_unknown;
|
||||
break;
|
||||
|
@ -1189,6 +1189,28 @@ static s32 ixgbe_get_eeprom_semaphore(struct ixgbe_hw *hw)
|
||||
udelay(50);
|
||||
}
|
||||
|
||||
if (i == timeout) {
|
||||
hw_dbg(hw, "Driver can't access the Eeprom - SMBI Semaphore "
|
||||
"not granted.\n");
|
||||
/*
|
||||
* this release is particularly important because our attempts
|
||||
* above to get the semaphore may have succeeded, and if there
|
||||
* was a timeout, we should unconditionally clear the semaphore
|
||||
* bits to free the driver to make progress
|
||||
*/
|
||||
ixgbe_release_eeprom_semaphore(hw);
|
||||
|
||||
udelay(50);
|
||||
/*
|
||||
* one last try
|
||||
* If the SMBI bit is 0 when we read it, then the bit will be
|
||||
* set and we have the semaphore
|
||||
*/
|
||||
swsm = IXGBE_READ_REG(hw, IXGBE_SWSM);
|
||||
if (!(swsm & IXGBE_SWSM_SMBI))
|
||||
status = 0;
|
||||
}
|
||||
|
||||
/* Now get the semaphore between SW/FW through the SWESMBI bit */
|
||||
if (status == 0) {
|
||||
for (i = 0; i < timeout; i++) {
|
||||
|
@ -84,6 +84,7 @@ static struct ixgbe_stats ixgbe_gstrings_stats[] = {
|
||||
{"hw_rsc_flushed", IXGBE_STAT(rsc_total_flush)},
|
||||
{"fdir_match", IXGBE_STAT(stats.fdirmatch)},
|
||||
{"fdir_miss", IXGBE_STAT(stats.fdirmiss)},
|
||||
{"fdir_overflow", IXGBE_STAT(fdir_overflow)},
|
||||
{"rx_fifo_errors", IXGBE_NETDEV_STAT(rx_fifo_errors)},
|
||||
{"rx_missed_errors", IXGBE_NETDEV_STAT(rx_missed_errors)},
|
||||
{"tx_aborted_errors", IXGBE_NETDEV_STAT(tx_aborted_errors)},
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -67,6 +67,7 @@
|
||||
#define IXGBE_VF_SET_MULTICAST 0x03 /* VF requests PF to set MC addr */
|
||||
#define IXGBE_VF_SET_VLAN 0x04 /* VF requests PF to set VLAN */
|
||||
#define IXGBE_VF_SET_LPE 0x05 /* VF requests PF to set VMOLR.LPE */
|
||||
#define IXGBE_VF_SET_MACVLAN 0x06 /* VF requests PF for unicast filter */
|
||||
|
||||
/* length of permanent address message returned from PF */
|
||||
#define IXGBE_VF_PERMADDR_MSG_LEN 4
|
||||
|
@ -82,6 +82,21 @@ static int ixgbe_set_vf_multicasts(struct ixgbe_adapter *adapter,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ixgbe_restore_vf_macvlans(struct ixgbe_adapter *adapter)
|
||||
{
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
struct list_head *pos;
|
||||
struct vf_macvlans *entry;
|
||||
|
||||
list_for_each(pos, &adapter->vf_mvs.l) {
|
||||
entry = list_entry(pos, struct vf_macvlans, l);
|
||||
if (entry->free == false)
|
||||
hw->mac.ops.set_rar(hw, entry->rar_entry,
|
||||
entry->vf_macvlan,
|
||||
entry->vf, IXGBE_RAH_AV);
|
||||
}
|
||||
}
|
||||
|
||||
void ixgbe_restore_vf_multicasts(struct ixgbe_adapter *adapter)
|
||||
{
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
@ -102,6 +117,9 @@ void ixgbe_restore_vf_multicasts(struct ixgbe_adapter *adapter)
|
||||
IXGBE_WRITE_REG(hw, IXGBE_MTA(vector_reg), mta_reg);
|
||||
}
|
||||
}
|
||||
|
||||
/* Restore any VF macvlans */
|
||||
ixgbe_restore_vf_macvlans(adapter);
|
||||
}
|
||||
|
||||
static int ixgbe_set_vf_vlan(struct ixgbe_adapter *adapter, int add, int vid,
|
||||
@ -200,6 +218,61 @@ static int ixgbe_set_vf_mac(struct ixgbe_adapter *adapter,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ixgbe_set_vf_macvlan(struct ixgbe_adapter *adapter,
|
||||
int vf, int index, unsigned char *mac_addr)
|
||||
{
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
struct list_head *pos;
|
||||
struct vf_macvlans *entry;
|
||||
|
||||
if (index <= 1) {
|
||||
list_for_each(pos, &adapter->vf_mvs.l) {
|
||||
entry = list_entry(pos, struct vf_macvlans, l);
|
||||
if (entry->vf == vf) {
|
||||
entry->vf = -1;
|
||||
entry->free = true;
|
||||
entry->is_macvlan = false;
|
||||
hw->mac.ops.clear_rar(hw, entry->rar_entry);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If index was zero then we were asked to clear the uc list
|
||||
* for the VF. We're done.
|
||||
*/
|
||||
if (!index)
|
||||
return 0;
|
||||
|
||||
entry = NULL;
|
||||
|
||||
list_for_each(pos, &adapter->vf_mvs.l) {
|
||||
entry = list_entry(pos, struct vf_macvlans, l);
|
||||
if (entry->free)
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* If we traversed the entire list and didn't find a free entry
|
||||
* then we're out of space on the RAR table. Also entry may
|
||||
* be NULL because the original memory allocation for the list
|
||||
* failed, which is not fatal but does mean we can't support
|
||||
* VF requests for MACVLAN because we couldn't allocate
|
||||
* memory for the list management required.
|
||||
*/
|
||||
if (!entry || !entry->free)
|
||||
return -ENOSPC;
|
||||
|
||||
entry->free = false;
|
||||
entry->is_macvlan = true;
|
||||
entry->vf = vf;
|
||||
memcpy(entry->vf_macvlan, mac_addr, ETH_ALEN);
|
||||
|
||||
hw->mac.ops.set_rar(hw, entry->rar_entry, mac_addr, vf, IXGBE_RAH_AV);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ixgbe_vf_configuration(struct pci_dev *pdev, unsigned int event_mask)
|
||||
{
|
||||
unsigned char vf_mac_addr[6];
|
||||
@ -251,12 +324,12 @@ static inline void ixgbe_vf_reset_msg(struct ixgbe_adapter *adapter, u32 vf)
|
||||
static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
|
||||
{
|
||||
u32 mbx_size = IXGBE_VFMAILBOX_SIZE;
|
||||
u32 msgbuf[mbx_size];
|
||||
u32 msgbuf[IXGBE_VFMAILBOX_SIZE];
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
s32 retval;
|
||||
int entries;
|
||||
u16 *hash_list;
|
||||
int add, vid;
|
||||
int add, vid, index;
|
||||
u8 *new_mac;
|
||||
|
||||
retval = ixgbe_read_mbx(hw, msgbuf, mbx_size, vf);
|
||||
@ -345,6 +418,24 @@ static int ixgbe_rcv_msg_from_vf(struct ixgbe_adapter *adapter, u32 vf)
|
||||
retval = ixgbe_set_vf_vlan(adapter, add, vid, vf);
|
||||
}
|
||||
break;
|
||||
case IXGBE_VF_SET_MACVLAN:
|
||||
index = (msgbuf[0] & IXGBE_VT_MSGINFO_MASK) >>
|
||||
IXGBE_VT_MSGINFO_SHIFT;
|
||||
/*
|
||||
* If the VF is allowed to set MAC filters then turn off
|
||||
* anti-spoofing to avoid false positives. An index
|
||||
* greater than 0 will indicate the VF is setting a
|
||||
* macvlan MAC filter.
|
||||
*/
|
||||
if (index > 0 && adapter->antispoofing_enabled) {
|
||||
hw->mac.ops.set_mac_anti_spoofing(hw, false,
|
||||
adapter->num_vfs);
|
||||
hw->mac.ops.set_vlan_anti_spoofing(hw, false, vf);
|
||||
adapter->antispoofing_enabled = false;
|
||||
}
|
||||
retval = ixgbe_set_vf_macvlan(adapter, vf, index,
|
||||
(unsigned char *)(&msgbuf[1]));
|
||||
break;
|
||||
default:
|
||||
e_err(drv, "Unhandled Msg %8.8x\n", msgbuf[0]);
|
||||
retval = IXGBE_ERR_MBX;
|
||||
@ -452,7 +543,8 @@ int ixgbe_ndo_set_vf_vlan(struct net_device *netdev, int vf, u16 vlan, u8 qos)
|
||||
goto out;
|
||||
ixgbe_set_vmvir(adapter, vlan | (qos << VLAN_PRIO_SHIFT), vf);
|
||||
ixgbe_set_vmolr(hw, vf, false);
|
||||
hw->mac.ops.set_vlan_anti_spoofing(hw, true, vf);
|
||||
if (adapter->antispoofing_enabled)
|
||||
hw->mac.ops.set_vlan_anti_spoofing(hw, true, vf);
|
||||
adapter->vfinfo[vf].pf_vlan = vlan;
|
||||
adapter->vfinfo[vf].pf_qos = qos;
|
||||
dev_info(&adapter->pdev->dev,
|
||||
|
@ -62,6 +62,7 @@
|
||||
#define IXGBE_DEV_ID_82599_XAUI_LOM 0x10FC
|
||||
#define IXGBE_DEV_ID_82599_COMBO_BACKPLANE 0x10F8
|
||||
#define IXGBE_SUBDEV_ID_82599_KX4_KR_MEZZ 0x000C
|
||||
#define IXGBE_DEV_ID_82599_LS 0x154F
|
||||
#define IXGBE_DEV_ID_X540T 0x1528
|
||||
|
||||
/* General Registers */
|
||||
@ -2395,6 +2396,7 @@ enum ixgbe_sfp_type {
|
||||
enum ixgbe_media_type {
|
||||
ixgbe_media_type_unknown = 0,
|
||||
ixgbe_media_type_fiber,
|
||||
ixgbe_media_type_fiber_lco,
|
||||
ixgbe_media_type_copper,
|
||||
ixgbe_media_type_backplane,
|
||||
ixgbe_media_type_cx4,
|
||||
|
@ -1460,6 +1460,34 @@ static void ixgbevf_restore_vlan(struct ixgbevf_adapter *adapter)
|
||||
}
|
||||
}
|
||||
|
||||
static int ixgbevf_write_uc_addr_list(struct net_device *netdev)
|
||||
{
|
||||
struct ixgbevf_adapter *adapter = netdev_priv(netdev);
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
int count = 0;
|
||||
|
||||
if ((netdev_uc_count(netdev)) > 10) {
|
||||
printk(KERN_ERR "Too many unicast filters - No Space\n");
|
||||
return -ENOSPC;
|
||||
}
|
||||
|
||||
if (!netdev_uc_empty(netdev)) {
|
||||
struct netdev_hw_addr *ha;
|
||||
netdev_for_each_uc_addr(ha, netdev) {
|
||||
hw->mac.ops.set_uc_addr(hw, ++count, ha->addr);
|
||||
udelay(200);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* If the list is empty then send message to PF driver to
|
||||
* clear all macvlans on this VF.
|
||||
*/
|
||||
hw->mac.ops.set_uc_addr(hw, 0, NULL);
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbevf_set_rx_mode - Multicast set
|
||||
* @netdev: network interface device structure
|
||||
@ -1476,6 +1504,8 @@ static void ixgbevf_set_rx_mode(struct net_device *netdev)
|
||||
/* reprogram multicast list */
|
||||
if (hw->mac.ops.update_mc_addr_list)
|
||||
hw->mac.ops.update_mc_addr_list(hw, netdev);
|
||||
|
||||
ixgbevf_write_uc_addr_list(netdev);
|
||||
}
|
||||
|
||||
static void ixgbevf_napi_enable_all(struct ixgbevf_adapter *adapter)
|
||||
|
@ -81,6 +81,7 @@
|
||||
#define IXGBE_VF_SET_MULTICAST 0x03 /* VF requests PF to set MC addr */
|
||||
#define IXGBE_VF_SET_VLAN 0x04 /* VF requests PF to set VLAN */
|
||||
#define IXGBE_VF_SET_LPE 0x05 /* VF requests PF to set VMOLR.LPE */
|
||||
#define IXGBE_VF_SET_MACVLAN 0x06 /* VF requests PF for unicast filter */
|
||||
|
||||
/* length of permanent address message returned from PF */
|
||||
#define IXGBE_VF_PERMADDR_MSG_LEN 4
|
||||
|
@ -216,6 +216,39 @@ static s32 ixgbevf_get_mac_addr_vf(struct ixgbe_hw *hw, u8 *mac_addr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static s32 ixgbevf_set_uc_addr_vf(struct ixgbe_hw *hw, u32 index, u8 *addr)
|
||||
{
|
||||
struct ixgbe_mbx_info *mbx = &hw->mbx;
|
||||
u32 msgbuf[3];
|
||||
u8 *msg_addr = (u8 *)(&msgbuf[1]);
|
||||
s32 ret_val;
|
||||
|
||||
memset(msgbuf, 0, sizeof(msgbuf));
|
||||
/*
|
||||
* If index is one then this is the start of a new list and needs
|
||||
* indication to the PF so it can do it's own list management.
|
||||
* If it is zero then that tells the PF to just clear all of
|
||||
* this VF's macvlans and there is no new list.
|
||||
*/
|
||||
msgbuf[0] |= index << IXGBE_VT_MSGINFO_SHIFT;
|
||||
msgbuf[0] |= IXGBE_VF_SET_MACVLAN;
|
||||
if (addr)
|
||||
memcpy(msg_addr, addr, 6);
|
||||
ret_val = mbx->ops.write_posted(hw, msgbuf, 3);
|
||||
|
||||
if (!ret_val)
|
||||
ret_val = mbx->ops.read_posted(hw, msgbuf, 3);
|
||||
|
||||
msgbuf[0] &= ~IXGBE_VT_MSGTYPE_CTS;
|
||||
|
||||
if (!ret_val)
|
||||
if (msgbuf[0] ==
|
||||
(IXGBE_VF_SET_MACVLAN | IXGBE_VT_MSGTYPE_NACK))
|
||||
ret_val = -ENOMEM;
|
||||
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbevf_set_rar_vf - set device MAC address
|
||||
* @hw: pointer to hardware structure
|
||||
@ -378,6 +411,7 @@ static struct ixgbe_mac_operations ixgbevf_mac_ops = {
|
||||
.check_link = ixgbevf_check_mac_link_vf,
|
||||
.set_rar = ixgbevf_set_rar_vf,
|
||||
.update_mc_addr_list = ixgbevf_update_mc_addr_list_vf,
|
||||
.set_uc_addr = ixgbevf_set_uc_addr_vf,
|
||||
.set_vfta = ixgbevf_set_vfta_vf,
|
||||
};
|
||||
|
||||
|
@ -62,6 +62,7 @@ struct ixgbe_mac_operations {
|
||||
|
||||
/* RAR, Multicast, VLAN */
|
||||
s32 (*set_rar)(struct ixgbe_hw *, u32, u8 *, u32);
|
||||
s32 (*set_uc_addr)(struct ixgbe_hw *, u32, u8 *);
|
||||
s32 (*init_rx_addrs)(struct ixgbe_hw *);
|
||||
s32 (*update_mc_addr_list)(struct ixgbe_hw *, struct net_device *);
|
||||
s32 (*enable_mc)(struct ixgbe_hw *);
|
||||
|
Loading…
Reference in New Issue
Block a user