| 1594 | } |
| 1595 | |
| 1596 | int bnxt_dev_start_op(struct rte_eth_dev *eth_dev) |
| 1597 | { |
| 1598 | struct bnxt *bp = eth_dev->data->dev_private; |
| 1599 | uint64_t rx_offloads = eth_dev->data->dev_conf.rxmode.offloads; |
| 1600 | int vlan_mask = 0; |
| 1601 | int rc, retry_cnt = BNXT_IF_CHANGE_RETRY_COUNT; |
| 1602 | |
| 1603 | if (bp->rx_cp_nr_rings > RTE_ETHDEV_QUEUE_STAT_CNTRS) |
| 1604 | PMD_DRV_LOG(ERR, |
| 1605 | "RxQ cnt %d > RTE_ETHDEV_QUEUE_STAT_CNTRS %d\n", |
| 1606 | bp->rx_cp_nr_rings, RTE_ETHDEV_QUEUE_STAT_CNTRS); |
| 1607 | |
| 1608 | do { |
| 1609 | rc = bnxt_hwrm_if_change(bp, true); |
| 1610 | if (rc == 0 || rc != -EAGAIN) |
| 1611 | break; |
| 1612 | |
| 1613 | rte_delay_ms(BNXT_IF_CHANGE_RETRY_INTERVAL); |
| 1614 | } while (retry_cnt--); |
| 1615 | |
| 1616 | if (rc) |
| 1617 | return rc; |
| 1618 | |
| 1619 | if (bp->flags & BNXT_FLAG_IF_CHANGE_HOT_FW_RESET_DONE) { |
| 1620 | rc = bnxt_handle_if_change_status(bp); |
| 1621 | if (rc) |
| 1622 | return rc; |
| 1623 | } |
| 1624 | |
| 1625 | bnxt_enable_int(bp); |
| 1626 | |
| 1627 | eth_dev->data->scattered_rx = bnxt_scattered_rx(eth_dev); |
| 1628 | |
| 1629 | rc = bnxt_start_nic(bp); |
| 1630 | if (rc) |
| 1631 | goto error; |
| 1632 | |
| 1633 | rc = bnxt_alloc_prev_ring_stats(bp); |
| 1634 | if (rc) |
| 1635 | goto error; |
| 1636 | |
| 1637 | eth_dev->data->dev_started = 1; |
| 1638 | |
| 1639 | bnxt_link_update_op(eth_dev, 0); |
| 1640 | |
| 1641 | if (rx_offloads & RTE_ETH_RX_OFFLOAD_VLAN_FILTER) |
| 1642 | vlan_mask |= RTE_ETH_VLAN_FILTER_MASK; |
| 1643 | if (rx_offloads & RTE_ETH_RX_OFFLOAD_VLAN_STRIP) |
| 1644 | vlan_mask |= RTE_ETH_VLAN_STRIP_MASK; |
| 1645 | rc = bnxt_vlan_offload_set_op(eth_dev, vlan_mask); |
| 1646 | if (rc) |
| 1647 | goto error; |
| 1648 | |
| 1649 | /* Initialize bnxt ULP port details */ |
| 1650 | rc = bnxt_ulp_port_init(bp); |
| 1651 | if (rc) |
| 1652 | goto error; |
| 1653 |
no test coverage detected