i40e: refactor stats collection
authorShannon Nelson <shannon.nelson@intel.com>
Wed, 23 Apr 2014 04:50:18 +0000 (04:50 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Thu, 5 Jun 2014 09:42:55 +0000 (02:42 -0700)
Pull the PF stat collection out of the VSI collection routine, and
add a unifying stats update routine to call the various stat collection
routines.

Change-ID: I224192455bb3a6e5dc0a426935e67dffc123e306
Signed-off-by: Shannon Nelson <shannon.nelson@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40e/i40e_main.c

index 1954e19..e340e3b 100644 (file)
@@ -720,19 +720,18 @@ static void i40e_update_prio_xoff_rx(struct i40e_pf *pf)
 }
 
 /**
- * i40e_update_stats - Update the board statistics counters.
+ * i40e_update_vsi_stats - Update the vsi statistics counters.
  * @vsi: the VSI to be updated
  *
  * There are a few instances where we store the same stat in a
  * couple of different structs.  This is partly because we have
  * the netdev stats that need to be filled out, which is slightly
  * different from the "eth_stats" defined by the chip and used in
- * VF communications.  We sort it all out here in a central place.
+ * VF communications.  We sort it out here.
  **/
-void i40e_update_stats(struct i40e_vsi *vsi)
+static void i40e_update_vsi_stats(struct i40e_vsi *vsi)
 {
        struct i40e_pf *pf = vsi->back;
-       struct i40e_hw *hw = &pf->hw;
        struct rtnl_link_stats64 *ons;
        struct rtnl_link_stats64 *ns;   /* netdev stats */
        struct i40e_eth_stats *oes;
@@ -741,8 +740,6 @@ void i40e_update_stats(struct i40e_vsi *vsi)
        u32 rx_page, rx_buf;
        u64 rx_p, rx_b;
        u64 tx_p, tx_b;
-       u32 val;
-       int i;
        u16 q;
 
        if (test_bit(__I40E_DOWN, &vsi->state) ||
@@ -804,8 +801,8 @@ void i40e_update_stats(struct i40e_vsi *vsi)
        ns->tx_packets = tx_p;
        ns->tx_bytes = tx_b;
 
-       i40e_update_eth_stats(vsi);
        /* update netdev stats from eth stats */
+       i40e_update_eth_stats(vsi);
        ons->rx_errors = oes->rx_errors;
        ns->rx_errors = es->rx_errors;
        ons->tx_errors = oes->tx_errors;
@@ -815,184 +812,210 @@ void i40e_update_stats(struct i40e_vsi *vsi)
        ons->tx_dropped = oes->tx_discards;
        ns->tx_dropped = es->tx_discards;
 
-       /* Get the port data only if this is the main PF VSI */
+       /* pull in a couple PF stats if this is the main vsi */
        if (vsi == pf->vsi[pf->lan_vsi]) {
-               struct i40e_hw_port_stats *nsd = &pf->stats;
-               struct i40e_hw_port_stats *osd = &pf->stats_offsets;
-
-               i40e_stat_update48(hw, I40E_GLPRT_GORCH(hw->port),
-                                  I40E_GLPRT_GORCL(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->eth.rx_bytes, &nsd->eth.rx_bytes);
-               i40e_stat_update48(hw, I40E_GLPRT_GOTCH(hw->port),
-                                  I40E_GLPRT_GOTCL(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->eth.tx_bytes, &nsd->eth.tx_bytes);
-               i40e_stat_update32(hw, I40E_GLPRT_RDPC(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->eth.rx_discards,
-                                  &nsd->eth.rx_discards);
-               i40e_stat_update32(hw, I40E_GLPRT_TDPC(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->eth.tx_discards,
-                                  &nsd->eth.tx_discards);
-               i40e_stat_update48(hw, I40E_GLPRT_MPRCH(hw->port),
-                                  I40E_GLPRT_MPRCL(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->eth.rx_multicast,
-                                  &nsd->eth.rx_multicast);
+               ns->rx_crc_errors = pf->stats.crc_errors;
+               ns->rx_errors = pf->stats.crc_errors + pf->stats.illegal_bytes;
+               ns->rx_length_errors = pf->stats.rx_length_errors;
+       }
+}
 
-               i40e_stat_update32(hw, I40E_GLPRT_TDOLD(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->tx_dropped_link_down,
-                                  &nsd->tx_dropped_link_down);
+/**
+ * i40e_update_pf_stats - Update the pf statistics counters.
+ * @pf: the PF to be updated
+ **/
+static void i40e_update_pf_stats(struct i40e_pf *pf)
+{
+       struct i40e_hw_port_stats *osd = &pf->stats_offsets;
+       struct i40e_hw_port_stats *nsd = &pf->stats;
+       struct i40e_hw *hw = &pf->hw;
+       u32 val;
+       int i;
 
-               i40e_stat_update32(hw, I40E_GLPRT_CRCERRS(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->crc_errors, &nsd->crc_errors);
-               ns->rx_crc_errors = nsd->crc_errors;
+       i40e_stat_update48(hw, I40E_GLPRT_GORCH(hw->port),
+                          I40E_GLPRT_GORCL(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->eth.rx_bytes, &nsd->eth.rx_bytes);
+       i40e_stat_update48(hw, I40E_GLPRT_GOTCH(hw->port),
+                          I40E_GLPRT_GOTCL(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->eth.tx_bytes, &nsd->eth.tx_bytes);
+       i40e_stat_update32(hw, I40E_GLPRT_RDPC(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->eth.rx_discards,
+                          &nsd->eth.rx_discards);
+       i40e_stat_update32(hw, I40E_GLPRT_TDPC(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->eth.tx_discards,
+                          &nsd->eth.tx_discards);
+       i40e_stat_update48(hw, I40E_GLPRT_MPRCH(hw->port),
+                          I40E_GLPRT_MPRCL(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->eth.rx_multicast,
+                          &nsd->eth.rx_multicast);
 
-               i40e_stat_update32(hw, I40E_GLPRT_ILLERRC(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->illegal_bytes, &nsd->illegal_bytes);
-               ns->rx_errors = nsd->crc_errors
-                               + nsd->illegal_bytes;
+       i40e_stat_update32(hw, I40E_GLPRT_TDOLD(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->tx_dropped_link_down,
+                          &nsd->tx_dropped_link_down);
 
-               i40e_stat_update32(hw, I40E_GLPRT_MLFC(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->mac_local_faults,
-                                  &nsd->mac_local_faults);
-               i40e_stat_update32(hw, I40E_GLPRT_MRFC(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->mac_remote_faults,
-                                  &nsd->mac_remote_faults);
+       i40e_stat_update32(hw, I40E_GLPRT_CRCERRS(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->crc_errors, &nsd->crc_errors);
 
-               i40e_stat_update32(hw, I40E_GLPRT_RLEC(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->rx_length_errors,
-                                  &nsd->rx_length_errors);
-               ns->rx_length_errors = nsd->rx_length_errors;
+       i40e_stat_update32(hw, I40E_GLPRT_ILLERRC(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->illegal_bytes, &nsd->illegal_bytes);
 
-               i40e_stat_update32(hw, I40E_GLPRT_LXONRXC(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->link_xon_rx, &nsd->link_xon_rx);
-               i40e_stat_update32(hw, I40E_GLPRT_LXONTXC(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->link_xon_tx, &nsd->link_xon_tx);
-               i40e_update_prio_xoff_rx(pf);  /* handles I40E_GLPRT_LXOFFRXC */
-               i40e_stat_update32(hw, I40E_GLPRT_LXOFFTXC(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->link_xoff_tx, &nsd->link_xoff_tx);
-
-               for (i = 0; i < 8; i++) {
-                       i40e_stat_update32(hw, I40E_GLPRT_PXONRXC(hw->port, i),
-                                          pf->stat_offsets_loaded,
-                                          &osd->priority_xon_rx[i],
-                                          &nsd->priority_xon_rx[i]);
-                       i40e_stat_update32(hw, I40E_GLPRT_PXONTXC(hw->port, i),
-                                          pf->stat_offsets_loaded,
-                                          &osd->priority_xon_tx[i],
-                                          &nsd->priority_xon_tx[i]);
-                       i40e_stat_update32(hw, I40E_GLPRT_PXOFFTXC(hw->port, i),
-                                          pf->stat_offsets_loaded,
-                                          &osd->priority_xoff_tx[i],
-                                          &nsd->priority_xoff_tx[i]);
-                       i40e_stat_update32(hw,
-                                          I40E_GLPRT_RXON2OFFCNT(hw->port, i),
-                                          pf->stat_offsets_loaded,
-                                          &osd->priority_xon_2_xoff[i],
-                                          &nsd->priority_xon_2_xoff[i]);
-               }
+       i40e_stat_update32(hw, I40E_GLPRT_MLFC(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->mac_local_faults,
+                          &nsd->mac_local_faults);
+       i40e_stat_update32(hw, I40E_GLPRT_MRFC(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->mac_remote_faults,
+                          &nsd->mac_remote_faults);
 
-               i40e_stat_update48(hw, I40E_GLPRT_PRC64H(hw->port),
-                                  I40E_GLPRT_PRC64L(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->rx_size_64, &nsd->rx_size_64);
-               i40e_stat_update48(hw, I40E_GLPRT_PRC127H(hw->port),
-                                  I40E_GLPRT_PRC127L(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->rx_size_127, &nsd->rx_size_127);
-               i40e_stat_update48(hw, I40E_GLPRT_PRC255H(hw->port),
-                                  I40E_GLPRT_PRC255L(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->rx_size_255, &nsd->rx_size_255);
-               i40e_stat_update48(hw, I40E_GLPRT_PRC511H(hw->port),
-                                  I40E_GLPRT_PRC511L(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->rx_size_511, &nsd->rx_size_511);
-               i40e_stat_update48(hw, I40E_GLPRT_PRC1023H(hw->port),
-                                  I40E_GLPRT_PRC1023L(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->rx_size_1023, &nsd->rx_size_1023);
-               i40e_stat_update48(hw, I40E_GLPRT_PRC1522H(hw->port),
-                                  I40E_GLPRT_PRC1522L(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->rx_size_1522, &nsd->rx_size_1522);
-               i40e_stat_update48(hw, I40E_GLPRT_PRC9522H(hw->port),
-                                  I40E_GLPRT_PRC9522L(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->rx_size_big, &nsd->rx_size_big);
+       i40e_stat_update32(hw, I40E_GLPRT_RLEC(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->rx_length_errors,
+                          &nsd->rx_length_errors);
 
-               i40e_stat_update48(hw, I40E_GLPRT_PTC64H(hw->port),
-                                  I40E_GLPRT_PTC64L(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->tx_size_64, &nsd->tx_size_64);
-               i40e_stat_update48(hw, I40E_GLPRT_PTC127H(hw->port),
-                                  I40E_GLPRT_PTC127L(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->tx_size_127, &nsd->tx_size_127);
-               i40e_stat_update48(hw, I40E_GLPRT_PTC255H(hw->port),
-                                  I40E_GLPRT_PTC255L(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->tx_size_255, &nsd->tx_size_255);
-               i40e_stat_update48(hw, I40E_GLPRT_PTC511H(hw->port),
-                                  I40E_GLPRT_PTC511L(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->tx_size_511, &nsd->tx_size_511);
-               i40e_stat_update48(hw, I40E_GLPRT_PTC1023H(hw->port),
-                                  I40E_GLPRT_PTC1023L(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->tx_size_1023, &nsd->tx_size_1023);
-               i40e_stat_update48(hw, I40E_GLPRT_PTC1522H(hw->port),
-                                  I40E_GLPRT_PTC1522L(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->tx_size_1522, &nsd->tx_size_1522);
-               i40e_stat_update48(hw, I40E_GLPRT_PTC9522H(hw->port),
-                                  I40E_GLPRT_PTC9522L(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->tx_size_big, &nsd->tx_size_big);
+       i40e_stat_update32(hw, I40E_GLPRT_LXONRXC(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->link_xon_rx, &nsd->link_xon_rx);
+       i40e_stat_update32(hw, I40E_GLPRT_LXONTXC(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->link_xon_tx, &nsd->link_xon_tx);
+       i40e_update_prio_xoff_rx(pf);  /* handles I40E_GLPRT_LXOFFRXC */
+       i40e_stat_update32(hw, I40E_GLPRT_LXOFFTXC(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->link_xoff_tx, &nsd->link_xoff_tx);
 
-               i40e_stat_update32(hw, I40E_GLPRT_RUC(hw->port),
-                                  pf->stat_offsets_loaded,
-                                  &osd->rx_undersize, &nsd->rx_undersize);
-               i40e_stat_update32(hw, I40E_GLPRT_RFC(hw->port),
+       for (i = 0; i < 8; i++) {
+               i40e_stat_update32(hw, I40E_GLPRT_PXONRXC(hw->port, i),
                                   pf->stat_offsets_loaded,
-                                  &osd->rx_fragments, &nsd->rx_fragments);
-               i40e_stat_update32(hw, I40E_GLPRT_ROC(hw->port),
+                                  &osd->priority_xon_rx[i],
+                                  &nsd->priority_xon_rx[i]);
+               i40e_stat_update32(hw, I40E_GLPRT_PXONTXC(hw->port, i),
                                   pf->stat_offsets_loaded,
-                                  &osd->rx_oversize, &nsd->rx_oversize);
-               i40e_stat_update32(hw, I40E_GLPRT_RJC(hw->port),
+                                  &osd->priority_xon_tx[i],
+                                  &nsd->priority_xon_tx[i]);
+               i40e_stat_update32(hw, I40E_GLPRT_PXOFFTXC(hw->port, i),
                                   pf->stat_offsets_loaded,
-                                  &osd->rx_jabber, &nsd->rx_jabber);
-
-               val = rd32(hw, I40E_PRTPM_EEE_STAT);
-               nsd->tx_lpi_status =
-                              (val & I40E_PRTPM_EEE_STAT_TX_LPI_STATUS_MASK) >>
-                               I40E_PRTPM_EEE_STAT_TX_LPI_STATUS_SHIFT;
-               nsd->rx_lpi_status =
-                              (val & I40E_PRTPM_EEE_STAT_RX_LPI_STATUS_MASK) >>
-                               I40E_PRTPM_EEE_STAT_RX_LPI_STATUS_SHIFT;
-               i40e_stat_update32(hw, I40E_PRTPM_TLPIC,
+                                  &osd->priority_xoff_tx[i],
+                                  &nsd->priority_xoff_tx[i]);
+               i40e_stat_update32(hw,
+                                  I40E_GLPRT_RXON2OFFCNT(hw->port, i),
                                   pf->stat_offsets_loaded,
-                                  &osd->tx_lpi_count, &nsd->tx_lpi_count);
-               i40e_stat_update32(hw, I40E_PRTPM_RLPIC,
-                                  pf->stat_offsets_loaded,
-                                  &osd->rx_lpi_count, &nsd->rx_lpi_count);
+                                  &osd->priority_xon_2_xoff[i],
+                                  &nsd->priority_xon_2_xoff[i]);
        }
 
+       i40e_stat_update48(hw, I40E_GLPRT_PRC64H(hw->port),
+                          I40E_GLPRT_PRC64L(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->rx_size_64, &nsd->rx_size_64);
+       i40e_stat_update48(hw, I40E_GLPRT_PRC127H(hw->port),
+                          I40E_GLPRT_PRC127L(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->rx_size_127, &nsd->rx_size_127);
+       i40e_stat_update48(hw, I40E_GLPRT_PRC255H(hw->port),
+                          I40E_GLPRT_PRC255L(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->rx_size_255, &nsd->rx_size_255);
+       i40e_stat_update48(hw, I40E_GLPRT_PRC511H(hw->port),
+                          I40E_GLPRT_PRC511L(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->rx_size_511, &nsd->rx_size_511);
+       i40e_stat_update48(hw, I40E_GLPRT_PRC1023H(hw->port),
+                          I40E_GLPRT_PRC1023L(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->rx_size_1023, &nsd->rx_size_1023);
+       i40e_stat_update48(hw, I40E_GLPRT_PRC1522H(hw->port),
+                          I40E_GLPRT_PRC1522L(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->rx_size_1522, &nsd->rx_size_1522);
+       i40e_stat_update48(hw, I40E_GLPRT_PRC9522H(hw->port),
+                          I40E_GLPRT_PRC9522L(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->rx_size_big, &nsd->rx_size_big);
+
+       i40e_stat_update48(hw, I40E_GLPRT_PTC64H(hw->port),
+                          I40E_GLPRT_PTC64L(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->tx_size_64, &nsd->tx_size_64);
+       i40e_stat_update48(hw, I40E_GLPRT_PTC127H(hw->port),
+                          I40E_GLPRT_PTC127L(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->tx_size_127, &nsd->tx_size_127);
+       i40e_stat_update48(hw, I40E_GLPRT_PTC255H(hw->port),
+                          I40E_GLPRT_PTC255L(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->tx_size_255, &nsd->tx_size_255);
+       i40e_stat_update48(hw, I40E_GLPRT_PTC511H(hw->port),
+                          I40E_GLPRT_PTC511L(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->tx_size_511, &nsd->tx_size_511);
+       i40e_stat_update48(hw, I40E_GLPRT_PTC1023H(hw->port),
+                          I40E_GLPRT_PTC1023L(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->tx_size_1023, &nsd->tx_size_1023);
+       i40e_stat_update48(hw, I40E_GLPRT_PTC1522H(hw->port),
+                          I40E_GLPRT_PTC1522L(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->tx_size_1522, &nsd->tx_size_1522);
+       i40e_stat_update48(hw, I40E_GLPRT_PTC9522H(hw->port),
+                          I40E_GLPRT_PTC9522L(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->tx_size_big, &nsd->tx_size_big);
+
+       i40e_stat_update32(hw, I40E_GLPRT_RUC(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->rx_undersize, &nsd->rx_undersize);
+       i40e_stat_update32(hw, I40E_GLPRT_RFC(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->rx_fragments, &nsd->rx_fragments);
+       i40e_stat_update32(hw, I40E_GLPRT_ROC(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->rx_oversize, &nsd->rx_oversize);
+       i40e_stat_update32(hw, I40E_GLPRT_RJC(hw->port),
+                          pf->stat_offsets_loaded,
+                          &osd->rx_jabber, &nsd->rx_jabber);
+
+       val = rd32(hw, I40E_PRTPM_EEE_STAT);
+       nsd->tx_lpi_status =
+                      (val & I40E_PRTPM_EEE_STAT_TX_LPI_STATUS_MASK) >>
+                       I40E_PRTPM_EEE_STAT_TX_LPI_STATUS_SHIFT;
+       nsd->rx_lpi_status =
+                      (val & I40E_PRTPM_EEE_STAT_RX_LPI_STATUS_MASK) >>
+                       I40E_PRTPM_EEE_STAT_RX_LPI_STATUS_SHIFT;
+       i40e_stat_update32(hw, I40E_PRTPM_TLPIC,
+                          pf->stat_offsets_loaded,
+                          &osd->tx_lpi_count, &nsd->tx_lpi_count);
+       i40e_stat_update32(hw, I40E_PRTPM_RLPIC,
+                          pf->stat_offsets_loaded,
+                          &osd->rx_lpi_count, &nsd->rx_lpi_count);
+
        pf->stat_offsets_loaded = true;
 }
 
+/**
+ * i40e_update_stats - Update the various statistics counters.
+ * @vsi: the VSI to be updated
+ *
+ * Update the various stats for this VSI and its related entities.
+ **/
+void i40e_update_stats(struct i40e_vsi *vsi)
+{
+       struct i40e_pf *pf = vsi->back;
+
+       if (vsi == pf->vsi[pf->lan_vsi])
+               i40e_update_pf_stats(pf);
+
+       i40e_update_vsi_stats(vsi);
+}
+
 /**
  * i40e_find_filter - Search VSI filter list for specific mac/vlan filter
  * @vsi: the VSI to be searched