igc: Add flow control support
authorSasha Neftin <sasha.neftin@intel.com>
Thu, 18 Apr 2019 07:11:08 +0000 (10:11 +0300)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Tue, 28 May 2019 23:13:57 +0000 (16:13 -0700)
This change adds flow control settings. This is required to
enable the legacy flow control support.

Signed-off-by: Sasha Neftin <sasha.neftin@intel.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/igc/igc_defines.h
drivers/net/ethernet/intel/igc/igc_main.c

index 5f6bc67cb33bafbc75c879184691392c5fac1aaf..fc0ccfe38a2003d1d0c839797745cf21dca05d0a 100644 (file)
@@ -66,6 +66,9 @@
 
 #define IGC_CONNSW_AUTOSENSE_EN        0x1
 
+/* As per the EAS the maximum supported size is 9.5KB (9728 bytes) */
+#define MAX_JUMBO_FRAME_SIZE   0x2600
+
 /* PBA constants */
 #define IGC_PBA_34K            0x0022
 
index 28072b9aa932f2efcf06c954b0f84c38b4b064ae..93f3b4e6185b7e87626dfb6f1e4f86b6811f1789 100644 (file)
@@ -72,6 +72,27 @@ void igc_reset(struct igc_adapter *adapter)
 {
        struct pci_dev *pdev = adapter->pdev;
        struct igc_hw *hw = &adapter->hw;
+       struct igc_fc_info *fc = &hw->fc;
+       u32 pba, hwm;
+
+       /* Repartition PBA for greater than 9k MTU if required */
+       pba = IGC_PBA_34K;
+
+       /* flow control settings
+        * The high water mark must be low enough to fit one full frame
+        * after transmitting the pause frame.  As such we must have enough
+        * space to allow for us to complete our current transmit and then
+        * receive the frame that is in progress from the link partner.
+        * Set it to:
+        * - the full Rx FIFO size minus one full Tx plus one full Rx frame
+        */
+       hwm = (pba << 10) - (adapter->max_frame_size + MAX_JUMBO_FRAME_SIZE);
+
+       fc->high_water = hwm & 0xFFFFFFF0;      /* 16-byte granularity */
+       fc->low_water = fc->high_water - 16;
+       fc->pause_time = 0xFFFF;
+       fc->send_xon = 1;
+       fc->current_mode = fc->requested_mode;
 
        hw->mac.ops.reset_hw(hw);