]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
ixgbe: restore offloaded SAs after a reset
authorShannon Nelson <shannon.nelson@oracle.com>
Tue, 19 Dec 2017 23:59:58 +0000 (15:59 -0800)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Tue, 23 Jan 2018 17:37:09 +0000 (09:37 -0800)
On a chip reset most of the table contents are lost, so must be
restored.  This scans the driver's ipsec tables and restores both
the filled and empty table slots to their pre-reset values.

Signed-off-by: Shannon Nelson <shannon.nelson@oracle.com>
Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbe/ixgbe.h
drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

index 435b9ef31937231ebc7414ac28d71b1073ff672d..c43ed681f596436ad72eb3c5df6f9abc34b613dc 100644 (file)
@@ -1020,8 +1020,10 @@ s32 ixgbe_negotiate_fc(struct ixgbe_hw *hw, u32 adv_reg, u32 lp_reg,
 #ifdef CONFIG_XFRM_OFFLOAD
 void ixgbe_init_ipsec_offload(struct ixgbe_adapter *adapter);
 void ixgbe_stop_ipsec_offload(struct ixgbe_adapter *adapter);
+void ixgbe_ipsec_restore(struct ixgbe_adapter *adapter);
 #else
 static inline void ixgbe_init_ipsec_offload(struct ixgbe_adapter *adapter) { };
 static inline void ixgbe_stop_ipsec_offload(struct ixgbe_adapter *adapter) { };
+static inline void ixgbe_ipsec_restore(struct ixgbe_adapter *adapter) { };
 #endif /* CONFIG_XFRM_OFFLOAD */
 #endif /* _IXGBE_H_ */
index 4fda18e326040bb3044a11ed224a48933325e77c..d468dd332c69ac213a1294a8fed387227454dbe6 100644 (file)
@@ -298,6 +298,47 @@ static void ixgbe_ipsec_start_engine(struct ixgbe_adapter *adapter)
        IXGBE_WRITE_FLUSH(hw);
 }
 
+/**
+ * ixgbe_ipsec_restore - restore the ipsec HW settings after a reset
+ * @adapter: board private structure
+ **/
+void ixgbe_ipsec_restore(struct ixgbe_adapter *adapter)
+{
+       struct ixgbe_ipsec *ipsec = adapter->ipsec;
+       struct ixgbe_hw *hw = &adapter->hw;
+       int i;
+
+       if (!(adapter->flags2 & IXGBE_FLAG2_IPSEC_ENABLED))
+               return;
+
+       /* clean up and restart the engine */
+       ixgbe_ipsec_stop_engine(adapter);
+       ixgbe_ipsec_clear_hw_tables(adapter);
+       ixgbe_ipsec_start_engine(adapter);
+
+       /* reload the IP addrs */
+       for (i = 0; i < IXGBE_IPSEC_MAX_RX_IP_COUNT; i++) {
+               struct rx_ip_sa *ipsa = &ipsec->ip_tbl[i];
+
+               if (ipsa->used)
+                       ixgbe_ipsec_set_rx_ip(hw, i, ipsa->ipaddr);
+       }
+
+       /* reload the Rx and Tx keys */
+       for (i = 0; i < IXGBE_IPSEC_MAX_SA_COUNT; i++) {
+               struct rx_sa *rsa = &ipsec->rx_tbl[i];
+               struct tx_sa *tsa = &ipsec->tx_tbl[i];
+
+               if (rsa->used)
+                       ixgbe_ipsec_set_rx_sa(hw, i, rsa->xs->id.spi,
+                                             rsa->key, rsa->salt,
+                                             rsa->mode, rsa->iptbl_ind);
+
+               if (tsa->used)
+                       ixgbe_ipsec_set_tx_sa(hw, i, tsa->key, tsa->salt);
+       }
+}
+
 /**
  * ixgbe_ipsec_find_empty_idx - find the first unused security parameter index
  * @ipsec: pointer to ipsec struct
index f584fd18a62e3e4c3b3008ee09310b31350e2df3..80635d12860ab67aa6ffbc5b0b17f70c0d8535b6 100644 (file)
@@ -5425,6 +5425,7 @@ static void ixgbe_configure(struct ixgbe_adapter *adapter)
 
        ixgbe_set_rx_mode(adapter->netdev);
        ixgbe_restore_vlan(adapter);
+       ixgbe_ipsec_restore(adapter);
 
        switch (hw->mac.type) {
        case ixgbe_mac_82599EB: