aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
diff options
context:
space:
mode:
authorHariprasad Shenai <hariprasad@chelsio.com>2014-07-14 12:04:52 -0400
committerDavid S. Miller <davem@davemloft.net>2014-07-15 19:25:16 -0400
commit4c2c5763227a14ce111d6f35df708459d2443cc3 (patch)
treeb261cf8eab4279d5a4162b7417e10162eeb2d755 /drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
parent04e10e2164fcfa05e14eff3c2757a5097f11d258 (diff)
cxgb4/iw_cxgb4: use firmware ord/ird resource limits
Advertise a larger max read queue depth for qps, and gather the resource limits from fw and use them to avoid exhaustinq all the resources. Design: cxgb4: Obtain the max_ordird_qp and max_ird_adapter device params from FW at init time and pass them up to the ULDs when they attach. If these parameters are not available, due to older firmware, then hard-code the values based on the known values for older firmware. iw_cxgb4: Fix the c4iw_query_device() to report these correct values based on adapter parameters. ibv_query_device() will always return: max_qp_rd_atom = max_qp_init_rd_atom = min(module_max, max_ordird_qp) max_res_rd_atom = max_ird_adapter Bump up the per qp max module option to 32, allowing it to be increased by the user up to the device max of max_ordird_qp. 32 seems to be sufficient to maximize throughput for streaming read benchmarks. Fail connection setup if the negotiated IRD exhausts the available adapter ird resources. So the driver will track the amount of ird resource in use and not send an RI_WR/INIT to FW that would reduce the available ird resources below zero. Signed-off-by: Steve Wise <swise@opengridcomputing.com> Signed-off-by: Hariprasad Shenai <hariprasad@chelsio.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c')
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
index a7ce996630ed..767cbbaa3d1e 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
@@ -4113,6 +4113,8 @@ static void uld_attach(struct adapter *adap, unsigned int uld)
4113 lli.sge_egrstatuspagesize = adap->sge.stat_len; 4113 lli.sge_egrstatuspagesize = adap->sge.stat_len;
4114 lli.sge_pktshift = adap->sge.pktshift; 4114 lli.sge_pktshift = adap->sge.pktshift;
4115 lli.enable_fw_ofld_conn = adap->flags & FW_OFLD_CONN; 4115 lli.enable_fw_ofld_conn = adap->flags & FW_OFLD_CONN;
4116 lli.max_ordird_qp = adap->params.max_ordird_qp;
4117 lli.max_ird_adapter = adap->params.max_ird_adapter;
4116 lli.ulptx_memwrite_dsgl = adap->params.ulptx_memwrite_dsgl; 4118 lli.ulptx_memwrite_dsgl = adap->params.ulptx_memwrite_dsgl;
4117 4119
4118 handle = ulds[uld].add(&lli); 4120 handle = ulds[uld].add(&lli);
@@ -5877,6 +5879,22 @@ static int adap_init0(struct adapter *adap)
5877 adap->vres.cq.size = val[3] - val[2] + 1; 5879 adap->vres.cq.size = val[3] - val[2] + 1;
5878 adap->vres.ocq.start = val[4]; 5880 adap->vres.ocq.start = val[4];
5879 adap->vres.ocq.size = val[5] - val[4] + 1; 5881 adap->vres.ocq.size = val[5] - val[4] + 1;
5882
5883 params[0] = FW_PARAM_DEV(MAXORDIRD_QP);
5884 params[1] = FW_PARAM_DEV(MAXIRD_ADAPTER);
5885 ret = t4_query_params(adap, 0, 0, 0, 2, params, val);
5886 if (ret < 0) {
5887 adap->params.max_ordird_qp = 8;
5888 adap->params.max_ird_adapter = 32 * adap->tids.ntids;
5889 ret = 0;
5890 } else {
5891 adap->params.max_ordird_qp = val[0];
5892 adap->params.max_ird_adapter = val[1];
5893 }
5894 dev_info(adap->pdev_dev,
5895 "max_ordird_qp %d max_ird_adapter %d\n",
5896 adap->params.max_ordird_qp,
5897 adap->params.max_ird_adapter);
5880 } 5898 }
5881 if (caps_cmd.iscsicaps) { 5899 if (caps_cmd.iscsicaps) {
5882 params[0] = FW_PARAM_PFVF(ISCSI_START); 5900 params[0] = FW_PARAM_PFVF(ISCSI_START);