.. | .. |
---|
187 | 187 | static int nix_interface_init(struct rvu *rvu, u16 pcifunc, int type, int nixlf) |
---|
188 | 188 | { |
---|
189 | 189 | struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, pcifunc); |
---|
| 190 | + int pkind, pf, vf, lbkid; |
---|
190 | 191 | u8 cgx_id, lmac_id; |
---|
191 | | - int pkind, pf, vf; |
---|
192 | 192 | int err; |
---|
193 | 193 | |
---|
194 | 194 | pf = rvu_get_pf(pcifunc); |
---|
.. | .. |
---|
221 | 221 | case NIX_INTF_TYPE_LBK: |
---|
222 | 222 | vf = (pcifunc & RVU_PFVF_FUNC_MASK) - 1; |
---|
223 | 223 | |
---|
| 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 | + |
---|
224 | 234 | /* Note that AF's VFs work in pairs and talk over consecutive |
---|
225 | 235 | * loopback channels.Therefore if odd number of AF VFs are |
---|
226 | 236 | * enabled then the last VF remains with no pair. |
---|
227 | 237 | */ |
---|
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); |
---|
231 | 242 | pfvf->rx_chan_cnt = 1; |
---|
232 | 243 | pfvf->tx_chan_cnt = 1; |
---|
233 | 244 | rvu_npc_install_promisc_entry(rvu, pcifunc, nixlf, |
---|
.. | .. |
---|
1374 | 1385 | free_cnt = rvu_rsrc_free_count(&txsch->schq); |
---|
1375 | 1386 | } |
---|
1376 | 1387 | |
---|
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) |
---|
1378 | 1390 | return NIX_AF_ERR_TLX_ALLOC_FAIL; |
---|
1379 | 1391 | |
---|
1380 | 1392 | /* If contiguous queues are needed, check for availability */ |
---|
.. | .. |
---|
2864 | 2876 | if (link < 0) |
---|
2865 | 2877 | return NIX_AF_ERR_RX_LINK_INVALID; |
---|
2866 | 2878 | |
---|
2867 | | - nix_find_link_frs(rvu, req, pcifunc); |
---|
2868 | 2879 | |
---|
2869 | 2880 | linkcfg: |
---|
| 2881 | + nix_find_link_frs(rvu, req, pcifunc); |
---|
| 2882 | + |
---|
2870 | 2883 | cfg = rvu_read64(rvu, blkaddr, NIX_AF_RX_LINKX_CFG(link)); |
---|
2871 | 2884 | cfg = (cfg & ~(0xFFFFULL << 16)) | ((u64)req->maxlen << 16); |
---|
2872 | 2885 | if (req->update_minlen) |
---|
.. | .. |
---|
3157 | 3170 | hw->cgx = (cfg >> 12) & 0xF; |
---|
3158 | 3171 | hw->lmac_per_cgx = (cfg >> 8) & 0xF; |
---|
3159 | 3172 | hw->cgx_links = hw->cgx * hw->lmac_per_cgx; |
---|
3160 | | - hw->lbk_links = 1; |
---|
| 3173 | + hw->lbk_links = (cfg >> 24) & 0xF; |
---|
3161 | 3174 | hw->sdp_links = 1; |
---|
3162 | 3175 | |
---|
3163 | 3176 | /* Initialize admin queue */ |
---|