[Intel-wired-lan] [net-queue PATCH] ixgbe: check that ipsec is available on the chip

Shannon Nelson shannon.nelson at oracle.com
Mon Jun 4 18:58:30 UTC 2018


Check the writability of the IPsec configuration registers
before setting up the offload.

Fixes: 49a94d74d948 ("ixgbe: add ipsec engine start and stop routines")
Reported-by: Andre Tomt <andre at tomt.net>
Cc: Alexander Duyck <alexander.h.duyck at intel.com>
Signed-off-by: Shannon Nelson <shannon.nelson at oracle.com>
---
 drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c
index 344a1f2..003b53f 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_ipsec.c
@@ -210,7 +210,10 @@ static void ixgbe_ipsec_stop_engine(struct ixgbe_adapter *adapter)
 	struct ixgbe_hw *hw = &adapter->hw;
 	u32 reg;
 
-	ixgbe_ipsec_stop_data(adapter);
+	/* stop data if it has been running */
+	reg = IXGBE_READ_REG(hw, IXGBE_SECTXCTRL);
+	if (!(reg & IXGBE_SECTXCTRL_SECTX_DIS))
+		ixgbe_ipsec_stop_data(adapter);
 
 	/* disable Rx and Tx SA lookup */
 	IXGBE_WRITE_REG(hw, IXGBE_IPSTXIDX, 0);
@@ -966,12 +969,27 @@ void ixgbe_ipsec_rx(struct ixgbe_ring *rx_ring,
  **/
 void ixgbe_init_ipsec_offload(struct ixgbe_adapter *adapter)
 {
+	struct ixgbe_hw *hw = &adapter->hw;
 	struct ixgbe_ipsec *ipsec;
 	size_t size;
+	u32 reg1, reg2;
 
 	if (adapter->hw.mac.type == ixgbe_mac_82598EB)
 		return;
 
+	/* verify that the ipsec offload is available by checking
+	 * the writability of the engine DISable bit - can we clear
+	 * the bit?  If not, don't set up ipsec.  If yes, the put
+	 * it back and continue the setup.
+	 */
+	reg1 = IXGBE_READ_REG(hw, IXGBE_SECTXCTRL);
+	reg2 = reg1 & ~IXGBE_SECTXCTRL_SECTX_DIS;
+	IXGBE_WRITE_REG(hw, IXGBE_SECTXCTRL, reg2);
+	reg2 = IXGBE_READ_REG(hw, IXGBE_SECTXCTRL);
+	if (reg2 & IXGBE_SECTXCTRL_SECTX_DIS)
+		return;
+	IXGBE_WRITE_REG(hw, IXGBE_SECTXCTRL, reg1);
+
 	ipsec = kzalloc(sizeof(*ipsec), GFP_KERNEL);
 	if (!ipsec)
 		goto err1;
-- 
2.7.4



More information about the Intel-wired-lan mailing list