| .. | .. |
|---|
| 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 */ |
|---|