Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright(C) 2021 Marvell. 3 : : */ 4 : : 5 : : #include "roc_api.h" 6 : : #include "roc_priv.h" 7 : : 8 : : bool 9 : 0 : roc_nix_is_lbk(struct roc_nix *roc_nix) 10 : : { 11 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 12 : : 13 : 0 : return nix->lbk_link; 14 : : } 15 : : 16 : : bool 17 : 0 : roc_nix_is_esw(struct roc_nix *roc_nix) 18 : : { 19 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 20 : : 21 : 0 : return nix->esw_link; 22 : : } 23 : : 24 : : int 25 : 0 : roc_nix_get_base_chan(struct roc_nix *roc_nix) 26 : : { 27 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 28 : : 29 : 0 : return nix->rx_chan_base; 30 : : } 31 : : 32 : : uint8_t 33 : 0 : roc_nix_get_rx_chan_cnt(struct roc_nix *roc_nix) 34 : : { 35 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 36 : : 37 : 0 : return nix->rx_chan_cnt; 38 : : } 39 : : 40 : : uint16_t 41 : 0 : roc_nix_get_vwqe_interval(struct roc_nix *roc_nix) 42 : : { 43 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 44 : : 45 : 0 : return nix->vwqe_interval; 46 : : } 47 : : 48 : : bool 49 : 0 : roc_nix_is_sdp(struct roc_nix *roc_nix) 50 : : { 51 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 52 : : 53 : 0 : return nix->sdp_link; 54 : : } 55 : : 56 : : bool 57 : 0 : roc_nix_is_pf(struct roc_nix *roc_nix) 58 : : { 59 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 60 : : 61 : 0 : return !dev_is_vf(&nix->dev); 62 : : } 63 : : 64 : : int 65 : 0 : roc_nix_get_pf(struct roc_nix *roc_nix) 66 : : { 67 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 68 : : struct dev *dev = &nix->dev; 69 : : 70 [ # # ]: 0 : return dev_get_pf(dev->pf_func); 71 : : } 72 : : 73 : : int 74 : 0 : roc_nix_get_vf(struct roc_nix *roc_nix) 75 : : { 76 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 77 : : struct dev *dev = &nix->dev; 78 : : 79 [ # # ]: 0 : return dev_get_vf(dev->pf_func); 80 : : } 81 : : 82 : : bool 83 : 0 : roc_nix_is_vf_or_sdp(struct roc_nix *roc_nix) 84 : : { 85 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 86 : : 87 [ # # # # ]: 0 : return (dev_is_vf(&nix->dev) != 0) || roc_nix_is_sdp(roc_nix); 88 : : } 89 : : 90 : : uint16_t 91 : 0 : roc_nix_get_pf_func(struct roc_nix *roc_nix) 92 : : { 93 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 94 : : struct dev *dev = &nix->dev; 95 : : 96 : 0 : return dev->pf_func; 97 : : } 98 : : 99 : : int 100 : 0 : roc_nix_lf_inl_ipsec_cfg(struct roc_nix *roc_nix, struct roc_nix_ipsec_cfg *cfg, 101 : : bool enb) 102 : : { 103 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 104 : : struct nix_inline_ipsec_lf_cfg *lf_cfg; 105 : 0 : struct mbox *mbox = mbox_get((&nix->dev)->mbox); 106 : : int rc; 107 : : 108 : 0 : lf_cfg = mbox_alloc_msg_nix_inline_ipsec_lf_cfg(mbox); 109 [ # # ]: 0 : if (lf_cfg == NULL) { 110 : : rc = -ENOSPC; 111 : 0 : goto exit; 112 : : } 113 : : 114 [ # # ]: 0 : if (enb) { 115 : 0 : lf_cfg->enable = 1; 116 : 0 : lf_cfg->sa_base_addr = cfg->iova; 117 [ # # ]: 0 : lf_cfg->ipsec_cfg1.sa_idx_w = plt_log2_u32(cfg->max_sa); 118 : 0 : lf_cfg->ipsec_cfg0.lenm1_max = roc_nix_max_pkt_len(roc_nix) - 1; 119 : 0 : lf_cfg->ipsec_cfg1.sa_idx_max = cfg->max_sa - 1; 120 [ # # ]: 0 : lf_cfg->ipsec_cfg0.sa_pow2_size = plt_log2_u32(cfg->sa_size); 121 : 0 : lf_cfg->ipsec_cfg0.tag_const = cfg->tag_const; 122 : 0 : lf_cfg->ipsec_cfg0.tt = cfg->tt; 123 [ # # ]: 0 : if (cfg->res_addr_offset) { 124 : 0 : lf_cfg->ipsec_cfg0_ext.res_addr_offset_valid = 1; 125 : 0 : lf_cfg->ipsec_cfg0_ext.res_addr_offset = 126 : 0 : (cfg->res_addr_offset & 0x80) | abs(cfg->res_addr_offset); 127 : : } 128 : : } else { 129 : 0 : lf_cfg->enable = 0; 130 : : } 131 : : 132 : 0 : rc = mbox_process(mbox); 133 : 0 : exit: 134 : : mbox_put(mbox); 135 : 0 : return rc; 136 : : } 137 : : 138 : : int 139 : 0 : roc_nix_cpt_ctx_cache_sync(struct roc_nix *roc_nix) 140 : : { 141 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 142 : 0 : struct mbox *mbox = mbox_get((&nix->dev)->mbox); 143 : : struct msg_req *req; 144 : : int rc; 145 : : 146 : 0 : req = mbox_alloc_msg_cpt_ctx_cache_sync(mbox); 147 [ # # ]: 0 : if (req == NULL) { 148 : : rc = -ENOSPC; 149 : 0 : goto exit; 150 : : } 151 : : 152 : 0 : rc = mbox_process(mbox); 153 : 0 : exit: 154 : : mbox_put(mbox); 155 : 0 : return rc; 156 : : } 157 : : 158 : : int 159 : 0 : roc_nix_max_pkt_len(struct roc_nix *roc_nix) 160 : : { 161 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 162 : : 163 [ # # ]: 0 : if (roc_nix_is_sdp(roc_nix)) { 164 [ # # ]: 0 : if (roc_errata_nix_sdp_send_has_mtu_size_16k()) 165 : : return NIX_SDP_16K_HW_FRS; 166 : 0 : return NIX_SDP_MAX_HW_FRS; 167 : : } 168 : : 169 [ # # ]: 0 : if (roc_model_is_cn9k()) 170 : : return NIX_CN9K_MAX_HW_FRS; 171 : : 172 [ # # ]: 0 : if (nix->lbk_link || nix->esw_link) 173 : 0 : return NIX_LBK_MAX_HW_FRS; 174 : : 175 : : return NIX_RPM_MAX_HW_FRS; 176 : : } 177 : : 178 : : int 179 : 0 : roc_nix_lf_alloc(struct roc_nix *roc_nix, uint32_t nb_rxq, uint32_t nb_txq, 180 : : uint64_t rx_cfg) 181 : : { 182 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 183 : 0 : struct mbox *mbox = mbox_get((&nix->dev)->mbox); 184 : : struct nix_lf_alloc_req *req; 185 : : struct nix_lf_alloc_rsp *rsp; 186 : : int rc = -ENOSPC; 187 : : 188 : 0 : req = mbox_alloc_msg_nix_lf_alloc(mbox); 189 [ # # ]: 0 : if (req == NULL) 190 : 0 : goto fail; 191 : 0 : req->rq_cnt = nb_rxq; 192 : 0 : req->sq_cnt = nb_txq; 193 [ # # ]: 0 : if (roc_nix->tx_compl_ena) 194 : 0 : req->cq_cnt = nb_rxq + nb_txq; 195 : : else 196 : 0 : req->cq_cnt = nb_rxq; 197 : : /* XQESZ can be W64 or W16 */ 198 : 0 : req->xqe_sz = NIX_XQESZ_W16; 199 : 0 : req->rss_sz = nix->reta_sz; 200 : 0 : req->rss_grps = ROC_NIX_RSS_GRPS; 201 : 0 : req->npa_func = idev_npa_pffunc_get(); 202 : 0 : req->sso_func = idev_sso_pffunc_get(); 203 : 0 : req->rx_cfg = rx_cfg; 204 [ # # # # : 0 : if (roc_nix_is_lbk(roc_nix) && roc_nix->enable_loop && # # ] 205 : : roc_model_is_cn98xx()) 206 : 0 : req->flags = NIX_LF_LBK_BLK_SEL; 207 : : 208 [ # # ]: 0 : if (!roc_nix->rss_tag_as_xor) 209 : 0 : req->flags |= NIX_LF_RSS_TAG_LSB_AS_ADDER; 210 : : 211 : : rc = mbox_process_msg(mbox, (void *)&rsp); 212 [ # # ]: 0 : if (rc) 213 : 0 : goto fail; 214 : : 215 : 0 : nix->rx_cfg = rx_cfg; 216 : 0 : nix->sqb_size = rsp->sqb_size; 217 : 0 : nix->tx_chan_base = rsp->tx_chan_base; 218 : 0 : nix->rx_chan_base = rsp->rx_chan_base; 219 [ # # # # ]: 0 : if (roc_nix_is_lbk(roc_nix) && roc_nix->enable_loop) 220 : 0 : nix->tx_chan_base = rsp->rx_chan_base; 221 : 0 : nix->rx_chan_cnt = rsp->rx_chan_cnt; 222 : 0 : nix->tx_chan_cnt = rsp->tx_chan_cnt; 223 : 0 : nix->lso_tsov4_idx = rsp->lso_tsov4_idx; 224 : 0 : nix->lso_tsov6_idx = rsp->lso_tsov6_idx; 225 : 0 : nix->lf_tx_stats = rsp->lf_tx_stats; 226 : 0 : nix->lf_rx_stats = rsp->lf_rx_stats; 227 : 0 : nix->cints = rsp->cints; 228 : 0 : roc_nix->cints = rsp->cints; 229 : 0 : nix->qints = rsp->qints; 230 : 0 : nix->ptp_en = rsp->hw_rx_tstamp_en; 231 : 0 : roc_nix->rx_ptp_ena = rsp->hw_rx_tstamp_en; 232 : 0 : nix->cgx_links = rsp->cgx_links; 233 : 0 : nix->lbk_links = rsp->lbk_links; 234 : 0 : nix->sdp_links = rsp->sdp_links; 235 : 0 : nix->tx_link = rsp->tx_link; 236 : 0 : nix->nb_rx_queues = nb_rxq; 237 : 0 : nix->nb_tx_queues = nb_txq; 238 : : 239 : 0 : roc_idev_nix_rx_chan_set(roc_nix->port_id, rsp->rx_chan_base); 240 : : 241 : 0 : nix->rqs = plt_zmalloc(sizeof(struct roc_nix_rq *) * nb_rxq, 0); 242 [ # # ]: 0 : if (!nix->rqs) { 243 : : rc = -ENOMEM; 244 : 0 : goto fail; 245 : : } 246 : : 247 : 0 : nix->sqs = plt_zmalloc(sizeof(struct roc_nix_sq *) * nb_txq, 0); 248 [ # # ]: 0 : if (!nix->sqs) { 249 : : rc = -ENOMEM; 250 : 0 : goto fail; 251 : : } 252 : : 253 : 0 : nix_tel_node_add(roc_nix); 254 : 0 : fail: 255 : : mbox_put(mbox); 256 : 0 : return rc; 257 : : } 258 : : 259 : : int 260 : 0 : roc_nix_lf_free(struct roc_nix *roc_nix) 261 : : { 262 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 263 : 0 : struct mbox *mbox = mbox_get((&nix->dev)->mbox); 264 : : struct nix_lf_free_req *req; 265 : : struct ndc_sync_op *ndc_req; 266 : : int rc = -ENOSPC; 267 : : 268 : 0 : plt_free(nix->rqs); 269 : 0 : plt_free(nix->sqs); 270 : 0 : nix->rqs = NULL; 271 : 0 : nix->sqs = NULL; 272 : : 273 : : /* Sync NDC-NIX for LF */ 274 : 0 : ndc_req = mbox_alloc_msg_ndc_sync_op(mbox); 275 [ # # ]: 0 : if (ndc_req == NULL) 276 : 0 : goto exit; 277 : 0 : ndc_req->nix_lf_tx_sync = 1; 278 : 0 : ndc_req->nix_lf_rx_sync = 1; 279 : 0 : rc = mbox_process(mbox); 280 [ # # ]: 0 : if (rc) 281 : 0 : plt_err("Error on NDC-NIX-[TX, RX] LF sync, rc %d", rc); 282 : : 283 : 0 : req = mbox_alloc_msg_nix_lf_free(mbox); 284 [ # # ]: 0 : if (req == NULL) { 285 : : rc = -ENOSPC; 286 : 0 : goto exit; 287 : : } 288 : : /* Let AF driver free all this nix lf's 289 : : * NPC entries allocated using NPC MBOX. 290 : : */ 291 : 0 : req->flags = 0; 292 : : 293 : 0 : rc = mbox_process(mbox); 294 : 0 : exit: 295 : : mbox_put(mbox); 296 : 0 : return rc; 297 : : } 298 : : 299 : : static inline int 300 : 0 : nix_lf_attach(struct dev *dev) 301 : : { 302 : 0 : struct mbox *mbox = mbox_get(dev->mbox); 303 : : struct rsrc_attach_req *req; 304 : : int rc = -ENOSPC; 305 : : 306 : : /* Attach NIX(lf) */ 307 : 0 : req = mbox_alloc_msg_attach_resources(mbox); 308 [ # # ]: 0 : if (req == NULL) 309 : 0 : goto exit; 310 : 0 : req->modify = true; 311 : 0 : req->nixlf = true; 312 : : 313 : 0 : rc = mbox_process(mbox); 314 : 0 : exit: 315 : : mbox_put(mbox); 316 : 0 : return rc; 317 : : } 318 : : 319 : : static inline int 320 : 0 : nix_lf_get_msix_offset(struct dev *dev, struct nix *nix) 321 : : { 322 : : struct msix_offset_rsp *msix_rsp; 323 : 0 : struct mbox *mbox = mbox_get(dev->mbox); 324 : : int rc; 325 : : 326 : : /* Get MSIX vector offsets */ 327 : 0 : mbox_alloc_msg_msix_offset(mbox); 328 : : rc = mbox_process_msg(mbox, (void *)&msix_rsp); 329 [ # # ]: 0 : if (rc == 0) 330 : 0 : nix->msixoff = msix_rsp->nix_msixoff; 331 : : 332 : : mbox_put(mbox); 333 : 0 : return rc; 334 : : } 335 : : 336 : : static inline int 337 : 0 : nix_lf_detach(struct nix *nix) 338 : : { 339 : 0 : struct mbox *mbox = mbox_get((&nix->dev)->mbox); 340 : : struct rsrc_detach_req *req; 341 : : int rc = -ENOSPC; 342 : : 343 : 0 : req = mbox_alloc_msg_detach_resources(mbox); 344 [ # # ]: 0 : if (req == NULL) 345 : 0 : goto exit; 346 : 0 : req->partial = true; 347 : 0 : req->nixlf = true; 348 : : 349 : 0 : rc = mbox_process(mbox); 350 : 0 : exit: 351 : : mbox_put(mbox); 352 : 0 : return rc; 353 : : } 354 : : 355 : : static int 356 : 0 : roc_nix_get_hw_info(struct roc_nix *roc_nix) 357 : : { 358 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 359 : 0 : struct mbox *mbox = mbox_get((&nix->dev)->mbox); 360 : : struct nix_hw_info *hw_info; 361 : : int rc; 362 : : 363 : 0 : mbox_alloc_msg_nix_get_hw_info(mbox); 364 : : rc = mbox_process_msg(mbox, (void *)&hw_info); 365 [ # # ]: 0 : if (rc == 0) { 366 : 0 : nix->vwqe_interval = hw_info->vwqe_delay; 367 [ # # ]: 0 : if (nix->lbk_link || nix->esw_link) 368 : 0 : roc_nix->dwrr_mtu = hw_info->lbk_dwrr_mtu; 369 [ # # ]: 0 : else if (nix->sdp_link) 370 : 0 : roc_nix->dwrr_mtu = hw_info->sdp_dwrr_mtu; 371 : : else 372 : 0 : roc_nix->dwrr_mtu = hw_info->rpm_dwrr_mtu; 373 : : } 374 : : 375 : : mbox_put(mbox); 376 : 0 : return rc; 377 : : } 378 : : 379 : : static void 380 : : sdp_lbk_id_update(struct plt_pci_device *pci_dev, struct nix *nix) 381 : : { 382 : 0 : nix->sdp_link = false; 383 : 0 : nix->lbk_link = false; 384 : 0 : nix->esw_link = false; 385 : : 386 : : /* Update SDP/LBK link based on PCI device id */ 387 [ # # # # ]: 0 : switch (pci_dev->id.device_id) { 388 : 0 : case PCI_DEVID_CNXK_RVU_SDP_PF: 389 : : case PCI_DEVID_CNXK_RVU_SDP_VF: 390 : 0 : nix->sdp_link = true; 391 : 0 : break; 392 : 0 : case PCI_DEVID_CNXK_RVU_AF_VF: 393 : 0 : nix->lbk_link = true; 394 : 0 : break; 395 : 0 : case PCI_DEVID_CNXK_RVU_ESWITCH_VF: 396 : 0 : nix->esw_link = true; 397 : 0 : break; 398 : : default: 399 : : break; 400 : : } 401 : : } 402 : : 403 : : uint64_t 404 [ # # ]: 0 : nix_get_blkaddr(struct dev *dev) 405 : : { 406 : : uint64_t blkaddr; 407 : : uint64_t reg; 408 : : 409 : : /* Reading the discovery register to know which NIX is the LF 410 : : * attached to. 411 : : */ 412 [ # # # # ]: 0 : if (roc_model_is_cn9k() || roc_model_is_cn10k()) { 413 [ # # ]: 0 : reg = plt_read64(dev->bar2 + RVU_PF_BLOCK_ADDRX_DISC(RVU_BLOCK_ADDR_NIX0)); 414 [ # # ]: 0 : blkaddr = reg & 0x1FFULL ? RVU_BLOCK_ADDR_NIX0 : RVU_BLOCK_ADDR_NIX1; 415 : : } else { 416 : 0 : reg = plt_read64(dev->bar2 + RVU_PF_DISC); 417 : 0 : blkaddr = reg & BIT_ULL(RVU_BLOCK_ADDR_NIX0) ? RVU_BLOCK_ADDR_NIX0 : 418 : : RVU_BLOCK_ADDR_NIX1; 419 : : blkaddr = RVU_BLOCK_ADDR_NIX0; 420 : : } 421 : 0 : return blkaddr; 422 : : } 423 : : 424 : : int 425 : 0 : roc_nix_dev_init(struct roc_nix *roc_nix) 426 : : { 427 : : enum roc_nix_rss_reta_sz reta_sz; 428 : : struct plt_pci_device *pci_dev; 429 : : struct roc_nix_list *nix_list; 430 : : uint16_t max_sqb_count; 431 : : uint64_t blkaddr; 432 : : struct dev *dev; 433 : : struct nix *nix; 434 : : int rc; 435 : : 436 [ # # # # ]: 0 : if (roc_nix == NULL || roc_nix->pci_dev == NULL) 437 : : return NIX_ERR_PARAM; 438 : : 439 : 0 : reta_sz = roc_nix->reta_sz; 440 [ # # # # ]: 0 : if (reta_sz != 0 && reta_sz != 64 && reta_sz != 128 && reta_sz != 256) 441 : : return NIX_ERR_PARAM; 442 : : 443 [ # # ]: 0 : if (reta_sz == 0) 444 : : reta_sz = ROC_NIX_RSS_RETA_SZ_64; 445 : : 446 : 0 : max_sqb_count = roc_nix->max_sqb_count; 447 : 0 : max_sqb_count = PLT_MIN(max_sqb_count, NIX_MAX_SQB); 448 : 0 : max_sqb_count = PLT_MAX(max_sqb_count, NIX_MIN_SQB); 449 : 0 : roc_nix->max_sqb_count = max_sqb_count; 450 : : 451 : : PLT_STATIC_ASSERT(sizeof(struct nix) <= ROC_NIX_MEM_SZ); 452 : : nix = roc_nix_to_nix_priv(roc_nix); 453 : : pci_dev = roc_nix->pci_dev; 454 : 0 : dev = &nix->dev; 455 : : 456 : 0 : nix_list = roc_idev_nix_list_get(); 457 [ # # ]: 0 : if (nix_list == NULL) 458 : : return -EINVAL; 459 : : 460 : 0 : TAILQ_INSERT_TAIL(nix_list, roc_nix, next); 461 : : 462 [ # # ]: 0 : if (nix->dev.drv_inited) 463 : : return 0; 464 : : 465 [ # # ]: 0 : if (dev->mbox_active) 466 : 0 : goto skip_dev_init; 467 : : 468 : : memset(nix, 0, sizeof(*nix)); 469 : : 470 : : /* Since 0 is a valid BPID, use -1 to represent invalid value. */ 471 : 0 : memset(nix->bpid, -1, sizeof(nix->bpid)); 472 : : 473 : : /* Initialize device */ 474 : 0 : rc = dev_init(dev, pci_dev); 475 [ # # ]: 0 : if (rc) { 476 : 0 : plt_err("Failed to init roc device"); 477 : 0 : goto fail; 478 : : } 479 : : 480 : 0 : skip_dev_init: 481 : 0 : dev->roc_nix = roc_nix; 482 : : 483 : 0 : nix->lmt_base = dev->lmt_base; 484 : : /* Expose base LMT line address for 485 : : * "Per Core LMT line" mode. 486 : : */ 487 : 0 : roc_nix->lmt_base = dev->lmt_base; 488 : : 489 : : /* Attach NIX LF */ 490 : 0 : rc = nix_lf_attach(dev); 491 [ # # ]: 0 : if (rc) 492 : 0 : goto dev_fini; 493 : : 494 : 0 : blkaddr = nix_get_blkaddr(dev); 495 : 0 : nix->is_nix1 = (blkaddr == RVU_BLOCK_ADDR_NIX1); 496 : : 497 : : /* Calculating base address based on which NIX block LF 498 : : * is attached to. 499 : : */ 500 : 0 : nix->base = dev->bar2 + (blkaddr << 20); 501 : : 502 : : /* Get NIX MSIX offset */ 503 : 0 : rc = nix_lf_get_msix_offset(dev, nix); 504 [ # # ]: 0 : if (rc) 505 : 0 : goto lf_detach; 506 : : 507 : : /* Update nix context */ 508 : : sdp_lbk_id_update(pci_dev, nix); 509 : 0 : nix->pci_dev = pci_dev; 510 : 0 : nix->reta_sz = reta_sz; 511 : 0 : nix->mtu = roc_nix_max_pkt_len(roc_nix); 512 : 0 : nix->dmac_flt_idx = -1; 513 : : 514 : : /* Register error and ras interrupts */ 515 : 0 : rc = nix_register_irqs(nix); 516 [ # # ]: 0 : if (rc) 517 : 0 : goto lf_detach; 518 : : 519 : 0 : rc = nix_tm_conf_init(roc_nix); 520 [ # # ]: 0 : if (rc) 521 : 0 : goto unregister_irqs; 522 : : 523 : : /* Get NIX HW info */ 524 : 0 : roc_nix_get_hw_info(roc_nix); 525 : 0 : nix->dev.drv_inited = true; 526 : : 527 : 0 : return 0; 528 : : unregister_irqs: 529 : 0 : nix_unregister_irqs(nix); 530 : 0 : lf_detach: 531 : 0 : nix_lf_detach(nix); 532 : 0 : dev_fini: 533 : 0 : rc |= dev_fini(dev, pci_dev); 534 : 0 : fail: 535 : 0 : nix_tel_node_del(roc_nix); 536 : 0 : return rc; 537 : : } 538 : : 539 : : int 540 [ # # ]: 0 : roc_nix_dev_fini(struct roc_nix *roc_nix) 541 : : { 542 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 543 : : int rc = 0; 544 : : 545 : : if (nix == NULL) 546 : : return NIX_ERR_PARAM; 547 : : 548 [ # # ]: 0 : if (!nix->dev.drv_inited) 549 : 0 : goto fini; 550 : : 551 : 0 : nix_tm_conf_fini(roc_nix); 552 : 0 : nix_unregister_irqs(nix); 553 : : 554 : 0 : rc = nix_lf_detach(nix); 555 : 0 : nix->dev.drv_inited = false; 556 : 0 : fini: 557 : 0 : rc |= dev_fini(&nix->dev, nix->pci_dev); 558 : : return rc; 559 : : } 560 : : 561 : : int 562 : 0 : roc_nix_max_rep_count(struct roc_nix *roc_nix) 563 : : { 564 : : struct nix *nix = roc_nix_to_nix_priv(roc_nix); 565 : : struct dev *dev = &nix->dev; 566 : 0 : struct mbox *mbox = mbox_get(dev->mbox); 567 : : struct get_rep_cnt_rsp *rsp; 568 : : struct msg_req *req; 569 : : int rc, i; 570 : : 571 : 0 : req = mbox_alloc_msg_get_rep_cnt(mbox); 572 [ # # ]: 0 : if (!req) { 573 : : rc = -ENOSPC; 574 : 0 : goto exit; 575 : : } 576 : : 577 : 0 : req->hdr.pcifunc = roc_nix_get_pf_func(roc_nix); 578 : : 579 : : rc = mbox_process_msg(mbox, (void *)&rsp); 580 [ # # ]: 0 : if (rc) 581 : 0 : goto exit; 582 : : 583 : 0 : roc_nix->rep_cnt = rsp->rep_cnt; 584 [ # # ]: 0 : for (i = 0; i < rsp->rep_cnt; i++) 585 : 0 : roc_nix->rep_pfvf_map[i] = rsp->rep_pfvf_map[i]; 586 : : 587 : 0 : exit: 588 : : mbox_put(mbox); 589 : 0 : return rc; 590 : : }