hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/net/ethernet/marvell/octeontx2/af/rvu_nix.c
....@@ -187,8 +187,8 @@
187187 static int nix_interface_init(struct rvu *rvu, u16 pcifunc, int type, int nixlf)
188188 {
189189 struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, pcifunc);
190
+ int pkind, pf, vf, lbkid;
190191 u8 cgx_id, lmac_id;
191
- int pkind, pf, vf;
192192 int err;
193193
194194 pf = rvu_get_pf(pcifunc);
....@@ -221,13 +221,24 @@
221221 case NIX_INTF_TYPE_LBK:
222222 vf = (pcifunc & RVU_PFVF_FUNC_MASK) - 1;
223223
224
+ /* If NIX1 block is present on the silicon then NIXes are
225
+ * assigned alternatively for lbk interfaces. NIX0 should
226
+ * send packets on lbk link 1 channels and NIX1 should send
227
+ * on lbk link 0 channels for the communication between
228
+ * NIX0 and NIX1.
229
+ */
230
+ lbkid = 0;
231
+ if (rvu->hw->lbk_links > 1)
232
+ lbkid = vf & 0x1 ? 0 : 1;
233
+
224234 /* Note that AF's VFs work in pairs and talk over consecutive
225235 * loopback channels.Therefore if odd number of AF VFs are
226236 * enabled then the last VF remains with no pair.
227237 */
228
- pfvf->rx_chan_base = NIX_CHAN_LBK_CHX(0, vf);
229
- pfvf->tx_chan_base = vf & 0x1 ? NIX_CHAN_LBK_CHX(0, vf - 1) :
230
- NIX_CHAN_LBK_CHX(0, vf + 1);
238
+ pfvf->rx_chan_base = NIX_CHAN_LBK_CHX(lbkid, vf);
239
+ pfvf->tx_chan_base = vf & 0x1 ?
240
+ NIX_CHAN_LBK_CHX(lbkid, vf - 1) :
241
+ NIX_CHAN_LBK_CHX(lbkid, vf + 1);
231242 pfvf->rx_chan_cnt = 1;
232243 pfvf->tx_chan_cnt = 1;
233244 rvu_npc_install_promisc_entry(rvu, pcifunc, nixlf,
....@@ -1374,7 +1385,8 @@
13741385 free_cnt = rvu_rsrc_free_count(&txsch->schq);
13751386 }
13761387
1377
- if (free_cnt < req_schq || req_schq > MAX_TXSCHQ_PER_FUNC)
1388
+ if (free_cnt < req_schq || req->schq[lvl] > MAX_TXSCHQ_PER_FUNC ||
1389
+ req->schq_contig[lvl] > MAX_TXSCHQ_PER_FUNC)
13781390 return NIX_AF_ERR_TLX_ALLOC_FAIL;
13791391
13801392 /* If contiguous queues are needed, check for availability */
....@@ -2864,9 +2876,10 @@
28642876 if (link < 0)
28652877 return NIX_AF_ERR_RX_LINK_INVALID;
28662878
2867
- nix_find_link_frs(rvu, req, pcifunc);
28682879
28692880 linkcfg:
2881
+ nix_find_link_frs(rvu, req, pcifunc);
2882
+
28702883 cfg = rvu_read64(rvu, blkaddr, NIX_AF_RX_LINKX_CFG(link));
28712884 cfg = (cfg & ~(0xFFFFULL << 16)) | ((u64)req->maxlen << 16);
28722885 if (req->update_minlen)
....@@ -3157,7 +3170,7 @@
31573170 hw->cgx = (cfg >> 12) & 0xF;
31583171 hw->lmac_per_cgx = (cfg >> 8) & 0xF;
31593172 hw->cgx_links = hw->cgx * hw->lmac_per_cgx;
3160
- hw->lbk_links = 1;
3173
+ hw->lbk_links = (cfg >> 24) & 0xF;
31613174 hw->sdp_links = 1;
31623175
31633176 /* Initialize admin queue */