diff options
Diffstat (limited to 'drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c')
-rw-r--r-- | drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 62 |
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 | ||
823 | static int request_msix_queue_irqs(struct adapter *adap) | 827 | static 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 | ||
862 | unwind: | 876 | unwind: |
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 | ||