aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c')
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c62
1 files changed, 57 insertions, 5 deletions
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
index 8cf6be93f491..c26c3f8e2795 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
@@ -818,12 +818,17 @@ static void name_msix_vecs(struct adapter *adap)
818 for_each_rdmarxq(&adap->sge, i) 818 for_each_rdmarxq(&adap->sge, i)
819 snprintf(adap->msix_info[msi_idx++].desc, n, "%s-rdma%d", 819 snprintf(adap->msix_info[msi_idx++].desc, n, "%s-rdma%d",
820 adap->port[0]->name, i); 820 adap->port[0]->name, i);
821
822 for_each_rdmaciq(&adap->sge, i)
823 snprintf(adap->msix_info[msi_idx++].desc, n, "%s-rdma-ciq%d",
824 adap->port[0]->name, i);
821} 825}
822 826
823static int request_msix_queue_irqs(struct adapter *adap) 827static int request_msix_queue_irqs(struct adapter *adap)
824{ 828{
825 struct sge *s = &adap->sge; 829 struct sge *s = &adap->sge;
826 int err, ethqidx, ofldqidx = 0, rdmaqidx = 0, msi_index = 2; 830 int err, ethqidx, ofldqidx = 0, rdmaqidx = 0, rdmaciqqidx = 0;
831 int msi_index = 2;
827 832
828 err = request_irq(adap->msix_info[1].vec, t4_sge_intr_msix, 0, 833 err = request_irq(adap->msix_info[1].vec, t4_sge_intr_msix, 0,
829 adap->msix_info[1].desc, &s->fw_evtq); 834 adap->msix_info[1].desc, &s->fw_evtq);
@@ -857,9 +862,21 @@ static int request_msix_queue_irqs(struct adapter *adap)
857 goto unwind; 862 goto unwind;
858 msi_index++; 863 msi_index++;
859 } 864 }
865 for_each_rdmaciq(s, rdmaciqqidx) {
866 err = request_irq(adap->msix_info[msi_index].vec,
867 t4_sge_intr_msix, 0,
868 adap->msix_info[msi_index].desc,
869 &s->rdmaciq[rdmaciqqidx].rspq);
870 if (err)
871 goto unwind;
872 msi_index++;
873 }
860 return 0; 874 return 0;
861 875
862unwind: 876unwind:
877 while (--rdmaciqqidx >= 0)
878 free_irq(adap->msix_info[--msi_index].vec,
879 &s->rdmaciq[rdmaciqqidx].rspq);
863 while (--rdmaqidx >= 0) 880 while (--rdmaqidx >= 0)
864 free_irq(adap->msix_info[--msi_index].vec, 881 free_irq(adap->msix_info[--msi_index].vec,
865 &s->rdmarxq[rdmaqidx].rspq); 882 &s->rdmarxq[rdmaqidx].rspq);
@@ -885,6 +902,8 @@ static void free_msix_queue_irqs(struct adapter *adap)
885 free_irq(adap->msix_info[msi_index++].vec, &s->ofldrxq[i].rspq); 902 free_irq(adap->msix_info[msi_index++].vec, &s->ofldrxq[i].rspq);
886 for_each_rdmarxq(s, i) 903 for_each_rdmarxq(s, i)
887 free_irq(adap->msix_info[msi_index++].vec, &s->rdmarxq[i].rspq); 904 free_irq(adap->msix_info[msi_index++].vec, &s->rdmarxq[i].rspq);
905 for_each_rdmaciq(s, i)
906 free_irq(adap->msix_info[msi_index++].vec, &s->rdmaciq[i].rspq);
888} 907}
889 908
890/** 909/**
@@ -1047,7 +1066,8 @@ freeout: t4_free_sge_resources(adap);
1047 if (msi_idx > 0) 1066 if (msi_idx > 0)
1048 msi_idx++; 1067 msi_idx++;
1049 err = t4_sge_alloc_rxq(adap, &q->rspq, false, dev, msi_idx, 1068 err = t4_sge_alloc_rxq(adap, &q->rspq, false, dev, msi_idx,
1050 &q->fl, uldrx_handler); 1069 q->fl.size ? &q->fl : NULL,
1070 uldrx_handler);
1051 if (err) 1071 if (err)
1052 goto freeout; 1072 goto freeout;
1053 memset(&q->stats, 0, sizeof(q->stats)); 1073 memset(&q->stats, 0, sizeof(q->stats));
@@ -1064,13 +1084,28 @@ freeout: t4_free_sge_resources(adap);
1064 if (msi_idx > 0) 1084 if (msi_idx > 0)
1065 msi_idx++; 1085 msi_idx++;
1066 err = t4_sge_alloc_rxq(adap, &q->rspq, false, adap->port[i], 1086 err = t4_sge_alloc_rxq(adap, &q->rspq, false, adap->port[i],
1067 msi_idx, &q->fl, uldrx_handler); 1087 msi_idx, q->fl.size ? &q->fl : NULL,
1088 uldrx_handler);
1068 if (err) 1089 if (err)
1069 goto freeout; 1090 goto freeout;
1070 memset(&q->stats, 0, sizeof(q->stats)); 1091 memset(&q->stats, 0, sizeof(q->stats));
1071 s->rdma_rxq[i] = q->rspq.abs_id; 1092 s->rdma_rxq[i] = q->rspq.abs_id;
1072 } 1093 }
1073 1094
1095 for_each_rdmaciq(s, i) {
1096 struct sge_ofld_rxq *q = &s->rdmaciq[i];
1097
1098 if (msi_idx > 0)
1099 msi_idx++;
1100 err = t4_sge_alloc_rxq(adap, &q->rspq, false, adap->port[i],
1101 msi_idx, q->fl.size ? &q->fl : NULL,
1102 uldrx_handler);
1103 if (err)
1104 goto freeout;
1105 memset(&q->stats, 0, sizeof(q->stats));
1106 s->rdma_ciq[i] = q->rspq.abs_id;
1107 }
1108
1074 for_each_port(adap, i) { 1109 for_each_port(adap, i) {
1075 /* 1110 /*
1076 * Note that ->rdmarxq[i].rspq.cntxt_id below is 0 if we don't 1111 * Note that ->rdmarxq[i].rspq.cntxt_id below is 0 if we don't
@@ -3789,7 +3824,9 @@ static void uld_attach(struct adapter *adap, unsigned int uld)
3789 lli.mtus = adap->params.mtus; 3824 lli.mtus = adap->params.mtus;
3790 if (uld == CXGB4_ULD_RDMA) { 3825 if (uld == CXGB4_ULD_RDMA) {
3791 lli.rxq_ids = adap->sge.rdma_rxq; 3826 lli.rxq_ids = adap->sge.rdma_rxq;
3827 lli.ciq_ids = adap->sge.rdma_ciq;
3792 lli.nrxq = adap->sge.rdmaqs; 3828 lli.nrxq = adap->sge.rdmaqs;
3829 lli.nciq = adap->sge.rdmaciqs;
3793 } else if (uld == CXGB4_ULD_ISCSI) { 3830 } else if (uld == CXGB4_ULD_ISCSI) {
3794 lli.rxq_ids = adap->sge.ofld_rxq; 3831 lli.rxq_ids = adap->sge.ofld_rxq;
3795 lli.nrxq = adap->sge.ofldqsets; 3832 lli.nrxq = adap->sge.ofldqsets;
@@ -5695,6 +5732,7 @@ static void cfg_queues(struct adapter *adap)
5695{ 5732{
5696 struct sge *s = &adap->sge; 5733 struct sge *s = &adap->sge;
5697 int i, q10g = 0, n10g = 0, qidx = 0; 5734 int i, q10g = 0, n10g = 0, qidx = 0;
5735 int ciq_size;
5698 5736
5699 for_each_port(adap, i) 5737 for_each_port(adap, i)
5700 n10g += is_x_10g_port(&adap2pinfo(adap, i)->link_cfg); 5738 n10g += is_x_10g_port(&adap2pinfo(adap, i)->link_cfg);
@@ -5733,6 +5771,7 @@ static void cfg_queues(struct adapter *adap)
5733 s->ofldqsets = adap->params.nports; 5771 s->ofldqsets = adap->params.nports;
5734 /* For RDMA one Rx queue per channel suffices */ 5772 /* For RDMA one Rx queue per channel suffices */
5735 s->rdmaqs = adap->params.nports; 5773 s->rdmaqs = adap->params.nports;
5774 s->rdmaciqs = adap->params.nports;
5736 } 5775 }
5737 5776
5738 for (i = 0; i < ARRAY_SIZE(s->ethrxq); i++) { 5777 for (i = 0; i < ARRAY_SIZE(s->ethrxq); i++) {
@@ -5767,6 +5806,19 @@ static void cfg_queues(struct adapter *adap)
5767 r->fl.size = 72; 5806 r->fl.size = 72;
5768 } 5807 }
5769 5808
5809 ciq_size = 64 + adap->vres.cq.size + adap->tids.nftids;
5810 if (ciq_size > SGE_MAX_IQ_SIZE) {
5811 CH_WARN(adap, "CIQ size too small for available IQs\n");
5812 ciq_size = SGE_MAX_IQ_SIZE;
5813 }
5814
5815 for (i = 0; i < ARRAY_SIZE(s->rdmaciq); i++) {
5816 struct sge_ofld_rxq *r = &s->rdmaciq[i];
5817
5818 init_rspq(&r->rspq, 0, 0, ciq_size, 64);
5819 r->rspq.uld = CXGB4_ULD_RDMA;
5820 }
5821
5770 init_rspq(&s->fw_evtq, 6, 0, 512, 64); 5822 init_rspq(&s->fw_evtq, 6, 0, 512, 64);
5771 init_rspq(&s->intrq, 6, 0, 2 * MAX_INGQ, 64); 5823 init_rspq(&s->intrq, 6, 0, 2 * MAX_INGQ, 64);
5772} 5824}
@@ -5815,9 +5867,9 @@ static int enable_msix(struct adapter *adap)
5815 5867
5816 want = s->max_ethqsets + EXTRA_VECS; 5868 want = s->max_ethqsets + EXTRA_VECS;
5817 if (is_offload(adap)) { 5869 if (is_offload(adap)) {
5818 want += s->rdmaqs + s->ofldqsets; 5870 want += s->rdmaqs + s->rdmaciqs + s->ofldqsets;
5819 /* need nchan for each possible ULD */ 5871 /* need nchan for each possible ULD */
5820 ofld_need = 2 * nchan; 5872 ofld_need = 3 * nchan;
5821 } 5873 }
5822 need = adap->params.nports + EXTRA_VECS + ofld_need; 5874 need = adap->params.nports + EXTRA_VECS + ofld_need;
5823 5875