mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 16:44:58 +02:00
Merge branch '1GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue
Tony Nguyen says: ==================== Intel Wired LAN Driver Updates 2024-03-06 (igc, igb, ice) This series contains updates to igc, igb, and ice drivers. Vinicius removes double clearing of interrupt register which could cause timestamp events to be missed on igc and igb. Przemek corrects calculation of statistics which caused incorrect spikes in reporting for ice driver. * '1GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue: ice: fix stats being updated by way too large values igb: Fix missing time sync events igc: Fix missing time sync events ==================== Link: https://lore.kernel.org/r/20240306182617.625932-1-anthony.l.nguyen@intel.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
9831e35efb
|
|
@ -6737,6 +6737,7 @@ static void ice_update_vsi_ring_stats(struct ice_vsi *vsi)
|
|||
{
|
||||
struct rtnl_link_stats64 *net_stats, *stats_prev;
|
||||
struct rtnl_link_stats64 *vsi_stats;
|
||||
struct ice_pf *pf = vsi->back;
|
||||
u64 pkts, bytes;
|
||||
int i;
|
||||
|
||||
|
|
@ -6782,21 +6783,18 @@ static void ice_update_vsi_ring_stats(struct ice_vsi *vsi)
|
|||
net_stats = &vsi->net_stats;
|
||||
stats_prev = &vsi->net_stats_prev;
|
||||
|
||||
/* clear prev counters after reset */
|
||||
if (vsi_stats->tx_packets < stats_prev->tx_packets ||
|
||||
vsi_stats->rx_packets < stats_prev->rx_packets) {
|
||||
stats_prev->tx_packets = 0;
|
||||
stats_prev->tx_bytes = 0;
|
||||
stats_prev->rx_packets = 0;
|
||||
stats_prev->rx_bytes = 0;
|
||||
/* Update netdev counters, but keep in mind that values could start at
|
||||
* random value after PF reset. And as we increase the reported stat by
|
||||
* diff of Prev-Cur, we need to be sure that Prev is valid. If it's not,
|
||||
* let's skip this round.
|
||||
*/
|
||||
if (likely(pf->stat_prev_loaded)) {
|
||||
net_stats->tx_packets += vsi_stats->tx_packets - stats_prev->tx_packets;
|
||||
net_stats->tx_bytes += vsi_stats->tx_bytes - stats_prev->tx_bytes;
|
||||
net_stats->rx_packets += vsi_stats->rx_packets - stats_prev->rx_packets;
|
||||
net_stats->rx_bytes += vsi_stats->rx_bytes - stats_prev->rx_bytes;
|
||||
}
|
||||
|
||||
/* update netdev counters */
|
||||
net_stats->tx_packets += vsi_stats->tx_packets - stats_prev->tx_packets;
|
||||
net_stats->tx_bytes += vsi_stats->tx_bytes - stats_prev->tx_bytes;
|
||||
net_stats->rx_packets += vsi_stats->rx_packets - stats_prev->rx_packets;
|
||||
net_stats->rx_bytes += vsi_stats->rx_bytes - stats_prev->rx_bytes;
|
||||
|
||||
stats_prev->tx_packets = vsi_stats->tx_packets;
|
||||
stats_prev->tx_bytes = vsi_stats->tx_bytes;
|
||||
stats_prev->rx_packets = vsi_stats->rx_packets;
|
||||
|
|
|
|||
|
|
@ -6985,44 +6985,31 @@ static void igb_extts(struct igb_adapter *adapter, int tsintr_tt)
|
|||
static void igb_tsync_interrupt(struct igb_adapter *adapter)
|
||||
{
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
u32 ack = 0, tsicr = rd32(E1000_TSICR);
|
||||
u32 tsicr = rd32(E1000_TSICR);
|
||||
struct ptp_clock_event event;
|
||||
|
||||
if (tsicr & TSINTR_SYS_WRAP) {
|
||||
event.type = PTP_CLOCK_PPS;
|
||||
if (adapter->ptp_caps.pps)
|
||||
ptp_clock_event(adapter->ptp_clock, &event);
|
||||
ack |= TSINTR_SYS_WRAP;
|
||||
}
|
||||
|
||||
if (tsicr & E1000_TSICR_TXTS) {
|
||||
/* retrieve hardware timestamp */
|
||||
schedule_work(&adapter->ptp_tx_work);
|
||||
ack |= E1000_TSICR_TXTS;
|
||||
}
|
||||
|
||||
if (tsicr & TSINTR_TT0) {
|
||||
if (tsicr & TSINTR_TT0)
|
||||
igb_perout(adapter, 0);
|
||||
ack |= TSINTR_TT0;
|
||||
}
|
||||
|
||||
if (tsicr & TSINTR_TT1) {
|
||||
if (tsicr & TSINTR_TT1)
|
||||
igb_perout(adapter, 1);
|
||||
ack |= TSINTR_TT1;
|
||||
}
|
||||
|
||||
if (tsicr & TSINTR_AUTT0) {
|
||||
if (tsicr & TSINTR_AUTT0)
|
||||
igb_extts(adapter, 0);
|
||||
ack |= TSINTR_AUTT0;
|
||||
}
|
||||
|
||||
if (tsicr & TSINTR_AUTT1) {
|
||||
if (tsicr & TSINTR_AUTT1)
|
||||
igb_extts(adapter, 1);
|
||||
ack |= TSINTR_AUTT1;
|
||||
}
|
||||
|
||||
/* acknowledge the interrupts */
|
||||
wr32(E1000_TSICR, ack);
|
||||
}
|
||||
|
||||
static irqreturn_t igb_msix_other(int irq, void *data)
|
||||
|
|
|
|||
|
|
@ -5302,25 +5302,22 @@ igc_features_check(struct sk_buff *skb, struct net_device *dev,
|
|||
|
||||
static void igc_tsync_interrupt(struct igc_adapter *adapter)
|
||||
{
|
||||
u32 ack, tsauxc, sec, nsec, tsicr;
|
||||
struct igc_hw *hw = &adapter->hw;
|
||||
u32 tsauxc, sec, nsec, tsicr;
|
||||
struct ptp_clock_event event;
|
||||
struct timespec64 ts;
|
||||
|
||||
tsicr = rd32(IGC_TSICR);
|
||||
ack = 0;
|
||||
|
||||
if (tsicr & IGC_TSICR_SYS_WRAP) {
|
||||
event.type = PTP_CLOCK_PPS;
|
||||
if (adapter->ptp_caps.pps)
|
||||
ptp_clock_event(adapter->ptp_clock, &event);
|
||||
ack |= IGC_TSICR_SYS_WRAP;
|
||||
}
|
||||
|
||||
if (tsicr & IGC_TSICR_TXTS) {
|
||||
/* retrieve hardware timestamp */
|
||||
igc_ptp_tx_tstamp_event(adapter);
|
||||
ack |= IGC_TSICR_TXTS;
|
||||
}
|
||||
|
||||
if (tsicr & IGC_TSICR_TT0) {
|
||||
|
|
@ -5334,7 +5331,6 @@ static void igc_tsync_interrupt(struct igc_adapter *adapter)
|
|||
wr32(IGC_TSAUXC, tsauxc);
|
||||
adapter->perout[0].start = ts;
|
||||
spin_unlock(&adapter->tmreg_lock);
|
||||
ack |= IGC_TSICR_TT0;
|
||||
}
|
||||
|
||||
if (tsicr & IGC_TSICR_TT1) {
|
||||
|
|
@ -5348,7 +5344,6 @@ static void igc_tsync_interrupt(struct igc_adapter *adapter)
|
|||
wr32(IGC_TSAUXC, tsauxc);
|
||||
adapter->perout[1].start = ts;
|
||||
spin_unlock(&adapter->tmreg_lock);
|
||||
ack |= IGC_TSICR_TT1;
|
||||
}
|
||||
|
||||
if (tsicr & IGC_TSICR_AUTT0) {
|
||||
|
|
@ -5358,7 +5353,6 @@ static void igc_tsync_interrupt(struct igc_adapter *adapter)
|
|||
event.index = 0;
|
||||
event.timestamp = sec * NSEC_PER_SEC + nsec;
|
||||
ptp_clock_event(adapter->ptp_clock, &event);
|
||||
ack |= IGC_TSICR_AUTT0;
|
||||
}
|
||||
|
||||
if (tsicr & IGC_TSICR_AUTT1) {
|
||||
|
|
@ -5368,11 +5362,7 @@ static void igc_tsync_interrupt(struct igc_adapter *adapter)
|
|||
event.index = 1;
|
||||
event.timestamp = sec * NSEC_PER_SEC + nsec;
|
||||
ptp_clock_event(adapter->ptp_clock, &event);
|
||||
ack |= IGC_TSICR_AUTT1;
|
||||
}
|
||||
|
||||
/* acknowledge the interrupts */
|
||||
wr32(IGC_TSICR, ack);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user