]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
i40iw: Reinitialize IEQ on MTU change
authorShiraz Saleem <shiraz.saleem@intel.com>
Mon, 16 Oct 2017 20:46:01 +0000 (15:46 -0500)
committerDoug Ledford <dledford@redhat.com>
Wed, 18 Oct 2017 17:28:46 +0000 (13:28 -0400)
On a netdev MTU change event, the iWARP
Exception Queue (IEQ) buffers may not be
sized properly to handle the new MTU.

Reinitialize the IEQ with new MTU size on MTU
change event.

Also, add define for the max ethernet frame size
field in IEQ QP context instead of the snd_mss
define which is for iWARP QPs' MSS field.

Signed-off-by: Shiraz Saleem <shiraz.saleem@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/i40iw/i40iw_ctrl.c
drivers/infiniband/hw/i40iw/i40iw_d.h
drivers/infiniband/hw/i40iw/i40iw_main.c
drivers/infiniband/hw/i40iw/i40iw_p.h
drivers/infiniband/hw/i40iw/i40iw_puda.c

index fbc0f95b0ebd70b04802325e6801fdbcbc040e5f..3b6d12176413e866943f39ed8287743eac2eaaf0 100644 (file)
@@ -348,7 +348,10 @@ void i40iw_change_l2params(struct i40iw_sc_vsi *vsi, struct i40iw_l2params *l2pa
        u16 qs_handle;
        int i;
 
-       vsi->mtu = l2params->mtu;
+       if (vsi->mtu != l2params->mtu) {
+               vsi->mtu = l2params->mtu;
+               i40iw_reinitialize_ieq(dev);
+       }
 
        i40iw_fill_qos_list(l2params->qs_handle_list);
        for (i = 0; i < I40IW_MAX_USER_PRIORITY; i++) {
index 17ed45b42df4bde0f46cd79d20b4721e0c82dbef..f1a6ce6c927c58fedd8f420f9a8040765d246e84 100644 (file)
 #define I40IWQPC_SNDMSS_SHIFT 16
 #define I40IWQPC_SNDMSS_MASK (0x3fffUL << I40IWQPC_SNDMSS_SHIFT)
 
+#define I40IW_UDA_QPC_MAXFRAMESIZE_SHIFT 16
+#define I40IW_UDA_QPC_MAXFRAMESIZE_MASK (0x3fffUL << I40IW_UDA_QPC_MAXFRAMESIZE_SHIFT)
+
 #define I40IWQPC_VLANTAG_SHIFT 32
 #define I40IWQPC_VLANTAG_MASK (0xffffULL << I40IWQPC_VLANTAG_SHIFT)
 
index dc6b338772e9272e37863a595258e1bfbef92cc8..e824296713e2620941348e7340af6b9a3580afbe 100644 (file)
@@ -964,14 +964,29 @@ static enum i40iw_status_code i40iw_initialize_ieq(struct i40iw_device *iwdev)
        info.pd_id = 2;
        info.sq_size = 8192;
        info.rq_size = 8192;
-       info.buf_size = 2048;
-       info.tx_buf_cnt = 16384;
+       info.buf_size = iwdev->vsi.mtu + VLAN_ETH_HLEN;
+       info.tx_buf_cnt = 4096;
        status = i40iw_puda_create_rsrc(&iwdev->vsi, &info);
        if (status)
                i40iw_pr_err("ieq create fail\n");
        return status;
 }
 
+/**
+ * i40iw_reinitialize_ieq - destroy and re-create ieq
+ * @dev: iwarp device
+ */
+void i40iw_reinitialize_ieq(struct i40iw_sc_dev *dev)
+{
+       struct i40iw_device *iwdev = (struct i40iw_device *)dev->back_dev;
+
+       i40iw_puda_dele_resources(&iwdev->vsi, I40IW_PUDA_RSRC_TYPE_IEQ, false);
+       if (i40iw_initialize_ieq(iwdev)) {
+               iwdev->reset = true;
+               i40iw_request_reset(iwdev);
+       }
+}
+
 /**
  * i40iw_hmc_setup - create hmc objects for the device
  * @iwdev: iwarp device
index 5498ad01c280fde7f476778afba3669c72fcff8c..2ad5a8ebee7e2118f07301dc6e051b7ac0068e7a 100644 (file)
@@ -123,5 +123,6 @@ enum i40iw_status_code i40iw_allocate_virt_mem(struct i40iw_hw *hw,
 enum i40iw_status_code i40iw_free_virt_mem(struct i40iw_hw *hw,
                                           struct i40iw_virt_mem *mem);
 u8 i40iw_get_encoded_wqe_size(u32 wqsize, bool cqpsq);
+void i40iw_reinitialize_ieq(struct i40iw_sc_dev *dev);
 
 #endif
index fee6643d6626eba37b08e98f6f2e1486a26e8c7e..19ced8bd64c0f336160a6b86a8463555ffe15005 100644 (file)
@@ -488,7 +488,7 @@ static void i40iw_puda_qp_setctx(struct i40iw_puda_rsrc *rsrc)
                      LS_64(qp->hw_rq_size, I40IWQPC_RQSIZE) |
                      LS_64(qp->hw_sq_size, I40IWQPC_SQSIZE));
 
-       set_64bit_val(qp_ctx, 48, LS_64(1514, I40IWQPC_SNDMSS));
+       set_64bit_val(qp_ctx, 48, LS_64(rsrc->buf_size, I40IW_UDA_QPC_MAXFRAMESIZE));
        set_64bit_val(qp_ctx, 56, 0);
        set_64bit_val(qp_ctx, 64, 1);