forked from Minki/linux
Merge branch '10GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue
Tony Nguyen says: ==================== 10GbE Intel Wired LAN Driver Updates 2022-06-09 Maximilian Heyne adds reporting of VF statistics on ixgbe via iproute2 interface. Kai-Heng Feng removes duplicate defines from igb. Jiaqing Zhao fixes typos in e1000, ixgb, and ixgbe drivers. Julia Lawall fixes typos for fm10k, ixgbe, and ice drivers. * '10GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/next-queue: drivers/net/ethernet/intel: fix typos in comments ixgbe: Fix typos in comments ixgb: Fix typos in comments e1000: Fix typos in comments igb: Remove duplicate defines drivers, ixgbe: export vf statistics ==================== Link: https://lore.kernel.org/r/20220609171257.2727150-1-anthony.l.nguyen@intel.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
68c51dd992
@ -4376,7 +4376,7 @@ void e1000_rar_set(struct e1000_hw *hw, u8 *addr, u32 index)
|
||||
/**
|
||||
* e1000_write_vfta - Writes a value to the specified offset in the VLAN filter table.
|
||||
* @hw: Struct containing variables accessed by shared code
|
||||
* @offset: Offset in VLAN filer table to write
|
||||
* @offset: Offset in VLAN filter table to write
|
||||
* @value: Value to write into VLAN filter table
|
||||
*/
|
||||
void e1000_write_vfta(struct e1000_hw *hw, u32 offset, u32 value)
|
||||
@ -4396,7 +4396,7 @@ void e1000_write_vfta(struct e1000_hw *hw, u32 offset, u32 value)
|
||||
}
|
||||
|
||||
/**
|
||||
* e1000_clear_vfta - Clears the VLAN filer table
|
||||
* e1000_clear_vfta - Clears the VLAN filter table
|
||||
* @hw: Struct containing variables accessed by shared code
|
||||
*/
|
||||
static void e1000_clear_vfta(struct e1000_hw *hw)
|
||||
|
@ -1825,7 +1825,7 @@ static void fm10k_sm_mbx_process_error(struct fm10k_mbx_info *mbx)
|
||||
fm10k_sm_mbx_connect_reset(mbx);
|
||||
break;
|
||||
case FM10K_STATE_CONNECT:
|
||||
/* try connnecting at lower version */
|
||||
/* try connecting at lower version */
|
||||
if (mbx->remote) {
|
||||
while (mbx->local > 1)
|
||||
mbx->local--;
|
||||
|
@ -2406,7 +2406,7 @@ static void ice_set_agg_vsi(struct ice_vsi *vsi)
|
||||
agg_id);
|
||||
return;
|
||||
}
|
||||
/* aggregator node is created, store the neeeded info */
|
||||
/* aggregator node is created, store the needed info */
|
||||
agg_node->valid = true;
|
||||
agg_node->agg_id = agg_id;
|
||||
}
|
||||
|
@ -1033,9 +1033,6 @@
|
||||
#define E1000_VFTA_ENTRY_MASK 0x7F
|
||||
#define E1000_VFTA_ENTRY_BIT_SHIFT_MASK 0x1F
|
||||
|
||||
/* DMA Coalescing register fields */
|
||||
#define E1000_PCIEMISC_LX_DECISION 0x00000080 /* Lx power on DMA coal */
|
||||
|
||||
/* Tx Rate-Scheduler Config fields */
|
||||
#define E1000_RTTBCNRC_RS_ENA 0x80000000
|
||||
#define E1000_RTTBCNRC_RF_DEC_MASK 0x00003FFF
|
||||
|
@ -116,7 +116,6 @@
|
||||
#define E1000_DMCRTRH 0x05DD0 /* Receive Packet Rate Threshold */
|
||||
#define E1000_DMCCNT 0x05DD4 /* Current Rx Count */
|
||||
#define E1000_FCRTC 0x02170 /* Flow Control Rx high watermark */
|
||||
#define E1000_PCIEMISC 0x05BB8 /* PCIE misc config register */
|
||||
|
||||
/* TX Rate Limit Registers */
|
||||
#define E1000_RTTDQSEL 0x3604 /* Tx Desc Plane Queue Select - WO */
|
||||
|
@ -576,7 +576,7 @@ ixgb_rar_set(struct ixgb_hw *hw,
|
||||
* Writes a value to the specified offset in the VLAN filter table.
|
||||
*
|
||||
* hw - Struct containing variables accessed by shared code
|
||||
* offset - Offset in VLAN filer table to write
|
||||
* offset - Offset in VLAN filter table to write
|
||||
* value - Value to write into VLAN filter table
|
||||
*****************************************************************************/
|
||||
void
|
||||
@ -588,7 +588,7 @@ ixgb_write_vfta(struct ixgb_hw *hw,
|
||||
}
|
||||
|
||||
/******************************************************************************
|
||||
* Clears the VLAN filer table
|
||||
* Clears the VLAN filter table
|
||||
*
|
||||
* hw - Struct containing variables accessed by shared code
|
||||
*****************************************************************************/
|
||||
|
@ -167,12 +167,46 @@ enum ixgbe_tx_flags {
|
||||
#define IXGBE_82599_VF_DEVICE_ID 0x10ED
|
||||
#define IXGBE_X540_VF_DEVICE_ID 0x1515
|
||||
|
||||
#define UPDATE_VF_COUNTER_32bit(reg, last_counter, counter) \
|
||||
{ \
|
||||
u32 current_counter = IXGBE_READ_REG(hw, reg); \
|
||||
if (current_counter < last_counter) \
|
||||
counter += 0x100000000LL; \
|
||||
last_counter = current_counter; \
|
||||
counter &= 0xFFFFFFFF00000000LL; \
|
||||
counter |= current_counter; \
|
||||
}
|
||||
|
||||
#define UPDATE_VF_COUNTER_36bit(reg_lsb, reg_msb, last_counter, counter) \
|
||||
{ \
|
||||
u64 current_counter_lsb = IXGBE_READ_REG(hw, reg_lsb); \
|
||||
u64 current_counter_msb = IXGBE_READ_REG(hw, reg_msb); \
|
||||
u64 current_counter = (current_counter_msb << 32) | \
|
||||
current_counter_lsb; \
|
||||
if (current_counter < last_counter) \
|
||||
counter += 0x1000000000LL; \
|
||||
last_counter = current_counter; \
|
||||
counter &= 0xFFFFFFF000000000LL; \
|
||||
counter |= current_counter; \
|
||||
}
|
||||
|
||||
struct vf_stats {
|
||||
u64 gprc;
|
||||
u64 gorc;
|
||||
u64 gptc;
|
||||
u64 gotc;
|
||||
u64 mprc;
|
||||
};
|
||||
|
||||
struct vf_data_storage {
|
||||
struct pci_dev *vfdev;
|
||||
unsigned char vf_mac_addresses[ETH_ALEN];
|
||||
u16 vf_mc_hashes[IXGBE_MAX_VF_MC_ENTRIES];
|
||||
u16 num_vf_mc_hashes;
|
||||
bool clear_to_send;
|
||||
struct vf_stats vfstats;
|
||||
struct vf_stats last_vfstats;
|
||||
struct vf_stats saved_rst_vfstats;
|
||||
bool pf_set_mac;
|
||||
u16 pf_vlan; /* When set, guest VLAN config not allowed. */
|
||||
u16 pf_qos;
|
||||
|
@ -879,7 +879,7 @@ static s32 ixgbe_set_vfta_82598(struct ixgbe_hw *hw, u32 vlan, u32 vind,
|
||||
* ixgbe_clear_vfta_82598 - Clear VLAN filter table
|
||||
* @hw: pointer to hardware structure
|
||||
*
|
||||
* Clears the VLAN filer table, and the VMDq index associated with the filter
|
||||
* Clears the VLAN filter table, and the VMDq index associated with the filter
|
||||
**/
|
||||
static s32 ixgbe_clear_vfta_82598(struct ixgbe_hw *hw)
|
||||
{
|
||||
|
@ -3237,7 +3237,7 @@ vfta_update:
|
||||
* ixgbe_clear_vfta_generic - Clear VLAN filter table
|
||||
* @hw: pointer to hardware structure
|
||||
*
|
||||
* Clears the VLAN filer table, and the VMDq index associated with the filter
|
||||
* Clears the VLAN filter table, and the VMDq index associated with the filter
|
||||
**/
|
||||
s32 ixgbe_clear_vfta_generic(struct ixgbe_hw *hw)
|
||||
{
|
||||
|
@ -5549,6 +5549,47 @@ static int ixgbe_non_sfp_link_config(struct ixgbe_hw *hw)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* ixgbe_clear_vf_stats_counters - Clear out VF stats after reset
|
||||
* @adapter: board private structure
|
||||
*
|
||||
* On a reset we need to clear out the VF stats or accounting gets
|
||||
* messed up because they're not clear on read.
|
||||
**/
|
||||
static void ixgbe_clear_vf_stats_counters(struct ixgbe_adapter *adapter)
|
||||
{
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < adapter->num_vfs; i++) {
|
||||
adapter->vfinfo[i].last_vfstats.gprc =
|
||||
IXGBE_READ_REG(hw, IXGBE_PVFGPRC(i));
|
||||
adapter->vfinfo[i].saved_rst_vfstats.gprc +=
|
||||
adapter->vfinfo[i].vfstats.gprc;
|
||||
adapter->vfinfo[i].vfstats.gprc = 0;
|
||||
adapter->vfinfo[i].last_vfstats.gptc =
|
||||
IXGBE_READ_REG(hw, IXGBE_PVFGPTC(i));
|
||||
adapter->vfinfo[i].saved_rst_vfstats.gptc +=
|
||||
adapter->vfinfo[i].vfstats.gptc;
|
||||
adapter->vfinfo[i].vfstats.gptc = 0;
|
||||
adapter->vfinfo[i].last_vfstats.gorc =
|
||||
IXGBE_READ_REG(hw, IXGBE_PVFGORC_LSB(i));
|
||||
adapter->vfinfo[i].saved_rst_vfstats.gorc +=
|
||||
adapter->vfinfo[i].vfstats.gorc;
|
||||
adapter->vfinfo[i].vfstats.gorc = 0;
|
||||
adapter->vfinfo[i].last_vfstats.gotc =
|
||||
IXGBE_READ_REG(hw, IXGBE_PVFGOTC_LSB(i));
|
||||
adapter->vfinfo[i].saved_rst_vfstats.gotc +=
|
||||
adapter->vfinfo[i].vfstats.gotc;
|
||||
adapter->vfinfo[i].vfstats.gotc = 0;
|
||||
adapter->vfinfo[i].last_vfstats.mprc =
|
||||
IXGBE_READ_REG(hw, IXGBE_PVFMPRC(i));
|
||||
adapter->vfinfo[i].saved_rst_vfstats.mprc +=
|
||||
adapter->vfinfo[i].vfstats.mprc;
|
||||
adapter->vfinfo[i].vfstats.mprc = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void ixgbe_setup_gpie(struct ixgbe_adapter *adapter)
|
||||
{
|
||||
struct ixgbe_hw *hw = &adapter->hw;
|
||||
@ -5684,6 +5725,7 @@ static void ixgbe_up_complete(struct ixgbe_adapter *adapter)
|
||||
adapter->link_check_timeout = jiffies;
|
||||
mod_timer(&adapter->service_timer, jiffies);
|
||||
|
||||
ixgbe_clear_vf_stats_counters(adapter);
|
||||
/* Set PF Reset Done bit so PF/VF Mail Ops can work */
|
||||
ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT);
|
||||
ctrl_ext |= IXGBE_CTRL_EXT_PFRSTD;
|
||||
@ -7271,6 +7313,32 @@ void ixgbe_update_stats(struct ixgbe_adapter *adapter)
|
||||
netdev->stats.rx_length_errors = hwstats->rlec;
|
||||
netdev->stats.rx_crc_errors = hwstats->crcerrs;
|
||||
netdev->stats.rx_missed_errors = total_mpc;
|
||||
|
||||
/* VF Stats Collection - skip while resetting because these
|
||||
* are not clear on read and otherwise you'll sometimes get
|
||||
* crazy values.
|
||||
*/
|
||||
if (!test_bit(__IXGBE_RESETTING, &adapter->state)) {
|
||||
for (i = 0; i < adapter->num_vfs; i++) {
|
||||
UPDATE_VF_COUNTER_32bit(IXGBE_PVFGPRC(i),
|
||||
adapter->vfinfo[i].last_vfstats.gprc,
|
||||
adapter->vfinfo[i].vfstats.gprc);
|
||||
UPDATE_VF_COUNTER_32bit(IXGBE_PVFGPTC(i),
|
||||
adapter->vfinfo[i].last_vfstats.gptc,
|
||||
adapter->vfinfo[i].vfstats.gptc);
|
||||
UPDATE_VF_COUNTER_36bit(IXGBE_PVFGORC_LSB(i),
|
||||
IXGBE_PVFGORC_MSB(i),
|
||||
adapter->vfinfo[i].last_vfstats.gorc,
|
||||
adapter->vfinfo[i].vfstats.gorc);
|
||||
UPDATE_VF_COUNTER_36bit(IXGBE_PVFGOTC_LSB(i),
|
||||
IXGBE_PVFGOTC_MSB(i),
|
||||
adapter->vfinfo[i].last_vfstats.gotc,
|
||||
adapter->vfinfo[i].vfstats.gotc);
|
||||
UPDATE_VF_COUNTER_32bit(IXGBE_PVFMPRC(i),
|
||||
adapter->vfinfo[i].last_vfstats.mprc,
|
||||
adapter->vfinfo[i].vfstats.mprc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -9022,6 +9090,23 @@ static void ixgbe_get_stats64(struct net_device *netdev,
|
||||
stats->rx_missed_errors = netdev->stats.rx_missed_errors;
|
||||
}
|
||||
|
||||
static int ixgbe_ndo_get_vf_stats(struct net_device *netdev, int vf,
|
||||
struct ifla_vf_stats *vf_stats)
|
||||
{
|
||||
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
||||
|
||||
if (vf < 0 || vf >= adapter->num_vfs)
|
||||
return -EINVAL;
|
||||
|
||||
vf_stats->rx_packets = adapter->vfinfo[vf].vfstats.gprc;
|
||||
vf_stats->rx_bytes = adapter->vfinfo[vf].vfstats.gorc;
|
||||
vf_stats->tx_packets = adapter->vfinfo[vf].vfstats.gptc;
|
||||
vf_stats->tx_bytes = adapter->vfinfo[vf].vfstats.gotc;
|
||||
vf_stats->multicast = adapter->vfinfo[vf].vfstats.mprc;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_IXGBE_DCB
|
||||
/**
|
||||
* ixgbe_validate_rtr - verify 802.1Qp to Rx packet buffer mapping is valid.
|
||||
@ -10338,6 +10423,7 @@ static const struct net_device_ops ixgbe_netdev_ops = {
|
||||
.ndo_set_vf_rss_query_en = ixgbe_ndo_set_vf_rss_query_en,
|
||||
.ndo_set_vf_trust = ixgbe_ndo_set_vf_trust,
|
||||
.ndo_get_vf_config = ixgbe_ndo_get_vf_config,
|
||||
.ndo_get_vf_stats = ixgbe_ndo_get_vf_stats,
|
||||
.ndo_get_stats64 = ixgbe_get_stats64,
|
||||
.ndo_setup_tc = __ixgbe_setup_tc,
|
||||
#ifdef IXGBE_FCOE
|
||||
|
@ -77,7 +77,7 @@ static int __ixgbe_enable_sriov(struct ixgbe_adapter *adapter,
|
||||
IXGBE_WRITE_REG(hw, IXGBE_PFDTXGSWC, IXGBE_PFDTXGSWC_VT_LBEN);
|
||||
adapter->bridge_mode = BRIDGE_MODE_VEB;
|
||||
|
||||
/* limit trafffic classes based on VFs enabled */
|
||||
/* limit traffic classes based on VFs enabled */
|
||||
if ((adapter->hw.mac.type == ixgbe_mac_82599EB) && (num_vfs < 16)) {
|
||||
adapter->dcb_cfg.num_tcs.pg_tcs = MAX_TRAFFIC_CLASS;
|
||||
adapter->dcb_cfg.num_tcs.pfc_tcs = MAX_TRAFFIC_CLASS;
|
||||
|
@ -2533,6 +2533,13 @@ enum {
|
||||
#define IXGBE_PVFTXDCTL(P) (0x06028 + (0x40 * (P)))
|
||||
#define IXGBE_PVFTDWBAL(P) (0x06038 + (0x40 * (P)))
|
||||
#define IXGBE_PVFTDWBAH(P) (0x0603C + (0x40 * (P)))
|
||||
#define IXGBE_PVFGPRC(x) (0x0101C + (0x40 * (x)))
|
||||
#define IXGBE_PVFGPTC(x) (0x08300 + (0x04 * (x)))
|
||||
#define IXGBE_PVFGORC_LSB(x) (0x01020 + (0x40 * (x)))
|
||||
#define IXGBE_PVFGORC_MSB(x) (0x0D020 + (0x40 * (x)))
|
||||
#define IXGBE_PVFGOTC_LSB(x) (0x08400 + (0x08 * (x)))
|
||||
#define IXGBE_PVFGOTC_MSB(x) (0x08404 + (0x08 * (x)))
|
||||
#define IXGBE_PVFMPRC(x) (0x0D01C + (0x40 * (x)))
|
||||
|
||||
#define IXGBE_PVFTDWBALn(q_per_pool, vf_number, vf_q_index) \
|
||||
(IXGBE_PVFTDWBAL((q_per_pool)*(vf_number) + (vf_q_index)))
|
||||
|
Loading…
Reference in New Issue
Block a user