Lines Matching refs:edev
111 static void qede_recovery_handler(struct qede_dev *edev);
114 static void qede_get_eth_tlv_data(void *edev, void *data);
115 static void qede_get_generic_tlv_data(void *edev,
117 static void qede_generic_hw_err_handler(struct qede_dev *edev);
122 struct qede_dev *edev = netdev_priv(ndev); in qede_set_vf_vlan() local
125 DP_NOTICE(edev, "Illegal vlan value %d\n", vlan); in qede_set_vf_vlan()
132 DP_VERBOSE(edev, QED_MSG_IOV, "Setting Vlan 0x%04x to VF [%d]\n", in qede_set_vf_vlan()
135 return edev->ops->iov->set_vlan(edev->cdev, vlan, vf); in qede_set_vf_vlan()
140 struct qede_dev *edev = netdev_priv(ndev); in qede_set_vf_mac() local
142 DP_VERBOSE(edev, QED_MSG_IOV, "Setting MAC %pM to VF [%d]\n", mac, vfidx); in qede_set_vf_mac()
145 DP_VERBOSE(edev, QED_MSG_IOV, "MAC address isn't valid\n"); in qede_set_vf_mac()
149 return edev->ops->iov->set_mac(edev->cdev, mac, vfidx); in qede_set_vf_mac()
154 struct qede_dev *edev = netdev_priv(pci_get_drvdata(pdev)); in qede_sriov_configure() local
155 struct qed_dev_info *qed_info = &edev->dev_info.common; in qede_sriov_configure()
162 DP_VERBOSE(edev, QED_MSG_IOV, "Requested %d VFs\n", num_vfs_param); in qede_sriov_configure()
164 rc = edev->ops->iov->configure(edev->cdev, num_vfs_param); in qede_sriov_configure()
167 if ((rc == num_vfs_param) && netif_running(edev->ndev) && in qede_sriov_configure()
172 edev->ops->vport_update(edev->cdev, vport_params); in qede_sriov_configure()
216 struct qede_dev *edev; in qede_netdev_event() local
229 edev = netdev_priv(ndev); in qede_netdev_event()
234 if (!edev->ops || !edev->ops->common) in qede_netdev_event()
236 edev->ops->common->set_name(edev->cdev, edev->ndev->name); in qede_netdev_event()
239 edev = netdev_priv(ndev); in qede_netdev_event()
240 qede_rdma_event_changeaddr(edev); in qede_netdev_event()
304 void qede_fill_by_demand_stats(struct qede_dev *edev) in qede_fill_by_demand_stats() argument
306 struct qede_stats_common *p_common = &edev->stats.common; in qede_fill_by_demand_stats()
309 edev->ops->get_vport_stats(edev->cdev, &stats); in qede_fill_by_demand_stats()
375 p_common->ptp_skip_txts = edev->ptp_skip_txts; in qede_fill_by_demand_stats()
377 if (QEDE_IS_BB(edev)) { in qede_fill_by_demand_stats()
378 struct qede_stats_bb *p_bb = &edev->stats.bb; in qede_fill_by_demand_stats()
401 struct qede_stats_ah *p_ah = &edev->stats.ah; in qede_fill_by_demand_stats()
413 struct qede_dev *edev = netdev_priv(dev); in qede_get_stats64() local
416 qede_fill_by_demand_stats(edev); in qede_get_stats64()
417 p_common = &edev->stats.common; in qede_get_stats64()
434 if (QEDE_IS_BB(edev)) in qede_get_stats64()
435 stats->collisions = edev->stats.bb.tx_total_collisions; in qede_get_stats64()
444 struct qede_dev *edev = netdev_priv(dev); in qede_get_vf_config() local
446 if (!edev->ops) in qede_get_vf_config()
449 return edev->ops->iov->get_config(edev->cdev, vfidx, ivi); in qede_get_vf_config()
455 struct qede_dev *edev = netdev_priv(dev); in qede_set_vf_rate() local
457 return edev->ops->iov->set_rate(edev->cdev, vfidx, min_tx_rate, in qede_set_vf_rate()
463 struct qede_dev *edev = netdev_priv(dev); in qede_set_vf_spoofchk() local
465 if (!edev->ops) in qede_set_vf_spoofchk()
468 return edev->ops->iov->set_spoof(edev->cdev, vfidx, val); in qede_set_vf_spoofchk()
474 struct qede_dev *edev = netdev_priv(dev); in qede_set_vf_link_state() local
476 if (!edev->ops) in qede_set_vf_link_state()
479 return edev->ops->iov->set_link_state(edev->cdev, vfidx, link_state); in qede_set_vf_link_state()
484 struct qede_dev *edev = netdev_priv(dev); in qede_set_vf_trust() local
486 if (!edev->ops) in qede_set_vf_trust()
489 return edev->ops->iov->set_trust(edev->cdev, vfidx, setting); in qede_set_vf_trust()
495 struct qede_dev *edev = netdev_priv(dev); in qede_ioctl() local
502 return qede_ptp_hw_ts(edev, ifr); in qede_ioctl()
504 DP_VERBOSE(edev, QED_MSG_DEBUG, in qede_ioctl()
512 static void qede_tx_log_print(struct qede_dev *edev, struct qede_tx_queue *txq) in qede_tx_log_print() argument
514 DP_NOTICE(edev, in qede_tx_log_print()
524 struct qede_dev *edev = netdev_priv(dev); in qede_tx_timeout() local
529 DP_NOTICE(edev, "TX timeout on queue %u!\n", txqueue); in qede_tx_timeout()
531 if (!(edev->fp_array[txqueue].type & QEDE_FASTPATH_TX)) in qede_tx_timeout()
534 for_each_cos_in_txq(edev, cos) { in qede_tx_timeout()
535 txq = &edev->fp_array[txqueue].txq[cos]; in qede_tx_timeout()
539 qede_tx_log_print(edev, txq); in qede_tx_timeout()
542 if (IS_VF(edev)) in qede_tx_timeout()
545 if (test_and_set_bit(QEDE_ERR_IS_HANDLED, &edev->err_flags) || in qede_tx_timeout()
546 edev->state == QEDE_STATE_RECOVERY) { in qede_tx_timeout()
547 DP_INFO(edev, in qede_tx_timeout()
552 set_bit(QEDE_ERR_GET_DBG_INFO, &edev->err_flags); in qede_tx_timeout()
553 set_bit(QEDE_SP_HW_ERR, &edev->sp_flags); in qede_tx_timeout()
554 schedule_delayed_work(&edev->sp_task, 0); in qede_tx_timeout()
559 struct qede_dev *edev = netdev_priv(ndev); in qede_setup_tc() local
562 if (num_tc > edev->dev_info.num_tc) in qede_setup_tc()
568 for_each_cos_in_txq(edev, cos) { in qede_setup_tc()
569 count = QEDE_TSS_COUNT(edev); in qede_setup_tc()
570 offset = cos * QEDE_TSS_COUNT(edev); in qede_setup_tc()
578 qede_set_flower(struct qede_dev *edev, struct flow_cls_offload *f, in qede_set_flower() argument
583 return qede_add_tc_flower_fltr(edev, proto, f); in qede_set_flower()
585 return qede_delete_flow_filter(edev, f->cookie); in qede_set_flower()
595 struct qede_dev *edev = cb_priv; in qede_setup_tc_block_cb() local
597 if (!tc_cls_can_offload_and_chain0(edev->ndev, type_data)) in qede_setup_tc_block_cb()
603 return qede_set_flower(edev, f, f->common.protocol); in qede_setup_tc_block_cb()
615 struct qede_dev *edev = netdev_priv(dev); in qede_setup_tc_offload() local
623 edev, edev, true); in qede_setup_tc_offload()
717 struct qede_dev *edev; in qede_alloc_etherdev() local
719 ndev = alloc_etherdev_mqs(sizeof(*edev), in qede_alloc_etherdev()
727 edev = netdev_priv(ndev); in qede_alloc_etherdev()
728 edev->ndev = ndev; in qede_alloc_etherdev()
729 edev->cdev = cdev; in qede_alloc_etherdev()
730 edev->pdev = pdev; in qede_alloc_etherdev()
731 edev->dp_module = dp_module; in qede_alloc_etherdev()
732 edev->dp_level = dp_level; in qede_alloc_etherdev()
733 edev->ops = qed_ops; in qede_alloc_etherdev()
736 edev->q_num_rx_buffers = NUM_RX_BDS_KDUMP_MIN; in qede_alloc_etherdev()
737 edev->q_num_tx_buffers = NUM_TX_BDS_KDUMP_MIN; in qede_alloc_etherdev()
739 edev->q_num_rx_buffers = NUM_RX_BDS_DEF; in qede_alloc_etherdev()
740 edev->q_num_tx_buffers = NUM_TX_BDS_DEF; in qede_alloc_etherdev()
743 DP_INFO(edev, "Allocated netdev with %d tx queues and %d rx queues\n", in qede_alloc_etherdev()
748 memset(&edev->stats, 0, sizeof(edev->stats)); in qede_alloc_etherdev()
749 memcpy(&edev->dev_info, info, sizeof(*info)); in qede_alloc_etherdev()
754 if (edev->dev_info.common.wol_support) in qede_alloc_etherdev()
755 edev->wol_enabled = true; in qede_alloc_etherdev()
757 INIT_LIST_HEAD(&edev->vlan_list); in qede_alloc_etherdev()
759 return edev; in qede_alloc_etherdev()
762 static void qede_init_ndev(struct qede_dev *edev) in qede_init_ndev() argument
764 struct net_device *ndev = edev->ndev; in qede_init_ndev()
765 struct pci_dev *pdev = edev->pdev; in qede_init_ndev()
771 ndev->mem_start = edev->dev_info.common.pci_mem_start; in qede_init_ndev()
773 ndev->mem_end = edev->dev_info.common.pci_mem_end; in qede_init_ndev()
774 ndev->irq = edev->dev_info.common.pci_irq; in qede_init_ndev()
778 if (IS_VF(edev)) { in qede_init_ndev()
779 if (edev->dev_info.xdp_supported) in qede_init_ndev()
796 if (edev->dev_info.common.b_arfs_capable) in qede_init_ndev()
799 if (edev->dev_info.common.vxlan_enable || in qede_init_ndev()
800 edev->dev_info.common.geneve_enable) in qede_init_ndev()
803 if (udp_tunnel_enable || edev->dev_info.common.gre_enable) { in qede_init_ndev()
817 qede_set_udp_tunnels(edev); in qede_init_ndev()
820 if (edev->dev_info.common.gre_enable) { in qede_init_ndev()
839 eth_hw_addr_set(edev->ndev, edev->dev_info.common.hw_mac); in qede_init_ndev()
841 ndev->mtu = edev->dev_info.common.mtu; in qede_init_ndev()
870 static void qede_free_fp_array(struct qede_dev *edev) in qede_free_fp_array() argument
872 if (edev->fp_array) { in qede_free_fp_array()
877 fp = &edev->fp_array[i]; in qede_free_fp_array()
890 kfree(edev->fp_array); in qede_free_fp_array()
893 edev->num_queues = 0; in qede_free_fp_array()
894 edev->fp_num_tx = 0; in qede_free_fp_array()
895 edev->fp_num_rx = 0; in qede_free_fp_array()
898 static int qede_alloc_fp_array(struct qede_dev *edev) in qede_alloc_fp_array() argument
900 u8 fp_combined, fp_rx = edev->fp_num_rx; in qede_alloc_fp_array()
905 edev->fp_array = kcalloc(QEDE_QUEUE_CNT(edev), in qede_alloc_fp_array()
906 sizeof(*edev->fp_array), GFP_KERNEL); in qede_alloc_fp_array()
907 if (!edev->fp_array) { in qede_alloc_fp_array()
908 DP_NOTICE(edev, "fp array allocation failed\n"); in qede_alloc_fp_array()
912 mem = krealloc(edev->coal_entry, QEDE_QUEUE_CNT(edev) * in qede_alloc_fp_array()
913 sizeof(*edev->coal_entry), GFP_KERNEL); in qede_alloc_fp_array()
915 DP_ERR(edev, "coalesce entry allocation failed\n"); in qede_alloc_fp_array()
916 kfree(edev->coal_entry); in qede_alloc_fp_array()
919 edev->coal_entry = mem; in qede_alloc_fp_array()
921 fp_combined = QEDE_QUEUE_CNT(edev) - fp_rx - edev->fp_num_tx; in qede_alloc_fp_array()
929 fp = &edev->fp_array[i]; in qede_alloc_fp_array()
933 DP_NOTICE(edev, "sb info struct allocation failed\n"); in qede_alloc_fp_array()
948 fp->txq = kcalloc(edev->dev_info.num_tc, in qede_alloc_fp_array()
959 if (edev->xdp_prog) { in qede_alloc_fp_array()
971 qede_free_fp_array(edev); in qede_alloc_fp_array()
978 void __qede_lock(struct qede_dev *edev) in __qede_lock() argument
980 mutex_lock(&edev->qede_lock); in __qede_lock()
983 void __qede_unlock(struct qede_dev *edev) in __qede_unlock() argument
985 mutex_unlock(&edev->qede_lock); in __qede_unlock()
991 static void qede_lock(struct qede_dev *edev) in qede_lock() argument
994 __qede_lock(edev); in qede_lock()
997 static void qede_unlock(struct qede_dev *edev) in qede_unlock() argument
999 __qede_unlock(edev); in qede_unlock()
1005 struct qede_dev *edev = container_of(work, struct qede_dev, in qede_sp_task() local
1012 if (test_bit(QEDE_SP_DISABLE, &edev->sp_flags)) in qede_sp_task()
1021 if (test_and_clear_bit(QEDE_SP_RECOVERY, &edev->sp_flags)) { in qede_sp_task()
1026 if (pci_num_vf(edev->pdev)) in qede_sp_task()
1027 qede_sriov_configure(edev->pdev, 0); in qede_sp_task()
1029 qede_lock(edev); in qede_sp_task()
1030 qede_recovery_handler(edev); in qede_sp_task()
1031 qede_unlock(edev); in qede_sp_task()
1034 __qede_lock(edev); in qede_sp_task()
1036 if (test_and_clear_bit(QEDE_SP_RX_MODE, &edev->sp_flags)) in qede_sp_task()
1037 if (edev->state == QEDE_STATE_OPEN) in qede_sp_task()
1038 qede_config_rx_mode(edev->ndev); in qede_sp_task()
1041 if (test_and_clear_bit(QEDE_SP_ARFS_CONFIG, &edev->sp_flags)) { in qede_sp_task()
1042 if (edev->state == QEDE_STATE_OPEN) in qede_sp_task()
1043 qede_process_arfs_filters(edev, false); in qede_sp_task()
1046 if (test_and_clear_bit(QEDE_SP_HW_ERR, &edev->sp_flags)) in qede_sp_task()
1047 qede_generic_hw_err_handler(edev); in qede_sp_task()
1048 __qede_unlock(edev); in qede_sp_task()
1050 if (test_and_clear_bit(QEDE_SP_AER, &edev->sp_flags)) { in qede_sp_task()
1055 if (pci_num_vf(edev->pdev)) in qede_sp_task()
1056 qede_sriov_configure(edev->pdev, 0); in qede_sp_task()
1058 edev->ops->common->recovery_process(edev->cdev); in qede_sp_task()
1086 static void qede_log_probe(struct qede_dev *edev) in qede_log_probe() argument
1088 struct qed_dev_info *p_dev_info = &edev->dev_info.common; in qede_log_probe()
1116 pr_info("qede %02x:%02x.%02x: %s [%s]\n", edev->pdev->bus->number, in qede_log_probe()
1117 PCI_SLOT(edev->pdev->devfn), PCI_FUNC(edev->pdev->devfn), in qede_log_probe()
1118 buf, edev->ndev->name); in qede_log_probe()
1132 struct qede_dev *edev; in __qede_probe() local
1169 edev = qede_alloc_etherdev(cdev, pdev, &dev_info, dp_module, in __qede_probe()
1171 if (!edev) { in __qede_probe()
1176 edev->devlink = qed_ops->common->devlink_register(cdev); in __qede_probe()
1177 if (IS_ERR(edev->devlink)) { in __qede_probe()
1178 DP_NOTICE(edev, "Cannot register devlink\n"); in __qede_probe()
1179 rc = PTR_ERR(edev->devlink); in __qede_probe()
1180 edev->devlink = NULL; in __qede_probe()
1187 edev = netdev_priv(ndev); in __qede_probe()
1188 qdl = devlink_priv(edev->devlink); in __qede_probe()
1190 edev->cdev = cdev; in __qede_probe()
1191 memset(&edev->stats, 0, sizeof(edev->stats)); in __qede_probe()
1192 memcpy(&edev->dev_info, &dev_info, sizeof(dev_info)); in __qede_probe()
1196 set_bit(QEDE_FLAGS_IS_VF, &edev->flags); in __qede_probe()
1198 qede_init_ndev(edev); in __qede_probe()
1200 rc = qede_rdma_dev_add(edev, (mode == QEDE_PROBE_RECOVERY)); in __qede_probe()
1210 INIT_DELAYED_WORK(&edev->sp_task, qede_sp_task); in __qede_probe()
1211 mutex_init(&edev->qede_lock); in __qede_probe()
1213 rc = register_netdev(edev->ndev); in __qede_probe()
1215 DP_NOTICE(edev, "Cannot register net-device\n"); in __qede_probe()
1220 edev->ops->common->set_name(cdev, edev->ndev->name); in __qede_probe()
1224 qede_ptp_enable(edev); in __qede_probe()
1226 edev->ops->register_ops(cdev, &qede_ll_ops, edev); in __qede_probe()
1229 if (!IS_VF(edev)) in __qede_probe()
1230 qede_set_dcbnl_ops(edev->ndev); in __qede_probe()
1233 edev->rx_copybreak = QEDE_RX_HDR_SIZE; in __qede_probe()
1235 qede_log_probe(edev); in __qede_probe()
1239 qede_rdma_dev_remove(edev, (mode == QEDE_PROBE_RECOVERY)); in __qede_probe()
1242 free_netdev(edev->ndev); in __qede_probe()
1244 edev->cdev = NULL; in __qede_probe()
1284 struct qede_dev *edev; in __qede_remove() local
1292 edev = netdev_priv(ndev); in __qede_remove()
1293 cdev = edev->cdev; in __qede_remove()
1295 DP_INFO(edev, "Starting qede_remove\n"); in __qede_remove()
1297 qede_rdma_dev_remove(edev, (mode == QEDE_REMOVE_RECOVERY)); in __qede_remove()
1300 set_bit(QEDE_SP_DISABLE, &edev->sp_flags); in __qede_remove()
1303 cancel_delayed_work_sync(&edev->sp_task); in __qede_remove()
1305 edev->ops->common->set_power_state(cdev, PCI_D0); in __qede_remove()
1310 qede_ptp_disable(edev); in __qede_remove()
1317 if (mode != QEDE_REMOVE_RECOVERY && edev->devlink) { in __qede_remove()
1318 qed_ops->common->devlink_unregister(edev->devlink); in __qede_remove()
1319 edev->devlink = NULL; in __qede_remove()
1322 edev->cdev = NULL; in __qede_remove()
1331 kfree(edev->coal_entry); in __qede_remove()
1353 static int qede_set_num_queues(struct qede_dev *edev) in qede_set_num_queues() argument
1359 if (edev->req_queues) in qede_set_num_queues()
1360 rss_num = edev->req_queues; in qede_set_num_queues()
1363 edev->dev_info.common.num_hwfns; in qede_set_num_queues()
1365 rss_num = min_t(u16, QEDE_MAX_RSS_CNT(edev), rss_num); in qede_set_num_queues()
1367 rc = edev->ops->common->set_fp_int(edev->cdev, rss_num); in qede_set_num_queues()
1370 edev->num_queues = rc; in qede_set_num_queues()
1371 DP_INFO(edev, "Managed %d [of %d] RSS queues\n", in qede_set_num_queues()
1372 QEDE_QUEUE_CNT(edev), rss_num); in qede_set_num_queues()
1376 edev->fp_num_tx = edev->req_num_tx; in qede_set_num_queues()
1377 edev->fp_num_rx = edev->req_num_rx; in qede_set_num_queues()
1382 static void qede_free_mem_sb(struct qede_dev *edev, struct qed_sb_info *sb_info, in qede_free_mem_sb() argument
1386 edev->ops->common->sb_release(edev->cdev, sb_info, sb_id, in qede_free_mem_sb()
1388 dma_free_coherent(&edev->pdev->dev, sizeof(*sb_info->sb_virt), in qede_free_mem_sb()
1395 static int qede_alloc_mem_sb(struct qede_dev *edev, in qede_alloc_mem_sb() argument
1402 sb_virt = dma_alloc_coherent(&edev->pdev->dev, in qede_alloc_mem_sb()
1405 DP_ERR(edev, "Status block allocation failed\n"); in qede_alloc_mem_sb()
1409 rc = edev->ops->common->sb_init(edev->cdev, sb_info, in qede_alloc_mem_sb()
1413 DP_ERR(edev, "Status block initialization failed\n"); in qede_alloc_mem_sb()
1414 dma_free_coherent(&edev->pdev->dev, sizeof(*sb_virt), in qede_alloc_mem_sb()
1422 static void qede_free_rx_buffers(struct qede_dev *edev, in qede_free_rx_buffers() argument
1434 dma_unmap_page(&edev->pdev->dev, in qede_free_rx_buffers()
1442 static void qede_free_mem_rxq(struct qede_dev *edev, struct qede_rx_queue *rxq) in qede_free_mem_rxq() argument
1445 qede_free_rx_buffers(edev, rxq); in qede_free_mem_rxq()
1451 edev->ops->common->chain_free(edev->cdev, &rxq->rx_bd_ring); in qede_free_mem_rxq()
1452 edev->ops->common->chain_free(edev->cdev, &rxq->rx_comp_ring); in qede_free_mem_rxq()
1467 static int qede_alloc_mem_rxq(struct qede_dev *edev, struct qede_rx_queue *rxq) in qede_alloc_mem_rxq() argument
1473 struct qed_dev *cdev = edev->cdev; in qede_alloc_mem_rxq()
1476 rxq->num_rx_buffers = edev->q_num_rx_buffers; in qede_alloc_mem_rxq()
1478 rxq->rx_buf_size = NET_IP_ALIGN + ETH_OVERHEAD + edev->ndev->mtu; in qede_alloc_mem_rxq()
1480 rxq->rx_headroom = edev->xdp_prog ? XDP_PACKET_HEADROOM : NET_SKB_PAD; in qede_alloc_mem_rxq()
1491 if (!edev->xdp_prog) { in qede_alloc_mem_rxq()
1496 edev->ndev->features &= ~NETIF_F_GRO_HW; in qede_alloc_mem_rxq()
1503 DP_ERR(edev, "Rx buffers ring allocation failed\n"); in qede_alloc_mem_rxq()
1513 rc = edev->ops->common->chain_alloc(cdev, &rxq->rx_bd_ring, ¶ms); in qede_alloc_mem_rxq()
1522 rc = edev->ops->common->chain_alloc(cdev, &rxq->rx_comp_ring, ¶ms); in qede_alloc_mem_rxq()
1531 DP_ERR(edev, in qede_alloc_mem_rxq()
1537 edev->gro_disable = !(edev->ndev->features & NETIF_F_GRO_HW); in qede_alloc_mem_rxq()
1538 if (!edev->gro_disable) in qede_alloc_mem_rxq()
1544 static void qede_free_mem_txq(struct qede_dev *edev, struct qede_tx_queue *txq) in qede_free_mem_txq() argument
1553 edev->ops->common->chain_free(edev->cdev, &txq->tx_pbl); in qede_free_mem_txq()
1557 static int qede_alloc_mem_txq(struct qede_dev *edev, struct qede_tx_queue *txq) in qede_alloc_mem_txq() argument
1563 .num_elems = edev->q_num_tx_buffers, in qede_alloc_mem_txq()
1568 txq->num_tx_buffers = edev->q_num_tx_buffers; in qede_alloc_mem_txq()
1583 rc = edev->ops->common->chain_alloc(edev->cdev, &txq->tx_pbl, ¶ms); in qede_alloc_mem_txq()
1590 qede_free_mem_txq(edev, txq); in qede_alloc_mem_txq()
1595 static void qede_free_mem_fp(struct qede_dev *edev, struct qede_fastpath *fp) in qede_free_mem_fp() argument
1597 qede_free_mem_sb(edev, fp->sb_info, fp->id); in qede_free_mem_fp()
1600 qede_free_mem_rxq(edev, fp->rxq); in qede_free_mem_fp()
1603 qede_free_mem_txq(edev, fp->xdp_tx); in qede_free_mem_fp()
1608 for_each_cos_in_txq(edev, cos) in qede_free_mem_fp()
1609 qede_free_mem_txq(edev, &fp->txq[cos]); in qede_free_mem_fp()
1616 static int qede_alloc_mem_fp(struct qede_dev *edev, struct qede_fastpath *fp) in qede_alloc_mem_fp() argument
1620 rc = qede_alloc_mem_sb(edev, fp->sb_info, fp->id); in qede_alloc_mem_fp()
1625 rc = qede_alloc_mem_rxq(edev, fp->rxq); in qede_alloc_mem_fp()
1631 rc = qede_alloc_mem_txq(edev, fp->xdp_tx); in qede_alloc_mem_fp()
1639 for_each_cos_in_txq(edev, cos) { in qede_alloc_mem_fp()
1640 rc = qede_alloc_mem_txq(edev, &fp->txq[cos]); in qede_alloc_mem_fp()
1650 static void qede_free_mem_load(struct qede_dev *edev) in qede_free_mem_load() argument
1655 struct qede_fastpath *fp = &edev->fp_array[i]; in qede_free_mem_load()
1657 qede_free_mem_fp(edev, fp); in qede_free_mem_load()
1662 static int qede_alloc_mem_load(struct qede_dev *edev) in qede_alloc_mem_load() argument
1666 for (queue_id = 0; queue_id < QEDE_QUEUE_CNT(edev); queue_id++) { in qede_alloc_mem_load()
1667 struct qede_fastpath *fp = &edev->fp_array[queue_id]; in qede_alloc_mem_load()
1669 rc = qede_alloc_mem_fp(edev, fp); in qede_alloc_mem_load()
1671 DP_ERR(edev, in qede_alloc_mem_load()
1674 qede_free_mem_load(edev); in qede_alloc_mem_load()
1682 static void qede_empty_tx_queue(struct qede_dev *edev, in qede_empty_tx_queue() argument
1689 netdev_txq = netdev_get_tx_queue(edev->ndev, txq->ndev_txq_id); in qede_empty_tx_queue()
1693 DP_VERBOSE(edev, NETIF_MSG_IFDOWN, in qede_empty_tx_queue()
1698 rc = qede_free_tx_pkt(edev, txq, &len); in qede_empty_tx_queue()
1700 DP_NOTICE(edev, in qede_empty_tx_queue()
1716 static void qede_empty_tx_queues(struct qede_dev *edev) in qede_empty_tx_queues() argument
1721 if (edev->fp_array[i].type & QEDE_FASTPATH_TX) { in qede_empty_tx_queues()
1724 for_each_cos_in_txq(edev, cos) { in qede_empty_tx_queues()
1727 fp = &edev->fp_array[i]; in qede_empty_tx_queues()
1728 qede_empty_tx_queue(edev, in qede_empty_tx_queues()
1735 static void qede_init_fp(struct qede_dev *edev) in qede_init_fp() argument
1742 fp = &edev->fp_array[queue_id]; in qede_init_fp()
1744 fp->edev = edev; in qede_init_fp()
1748 fp->xdp_tx->index = QEDE_TXQ_IDX_TO_XDP(edev, in qede_init_fp()
1764 fp->rxq->dev = &edev->pdev->dev; in qede_init_fp()
1767 WARN_ON(xdp_rxq_info_reg(&fp->rxq->xdp_rxq, edev->ndev, in qede_init_fp()
1773 DP_NOTICE(edev, in qede_init_fp()
1781 for_each_cos_in_txq(edev, cos) { in qede_init_fp()
1787 ndev_tx_id = QEDE_TXQ_TO_NDEV_TXQ_ID(edev, txq); in qede_init_fp()
1790 if (edev->dev_info.is_legacy) in qede_init_fp()
1792 txq->dev = &edev->pdev->dev; in qede_init_fp()
1799 edev->ndev->name, queue_id); in qede_init_fp()
1803 edev->total_xdp_queues = QEDE_RSS_COUNT(edev); in qede_init_fp()
1804 DP_INFO(edev, "Total XDP queues: %u\n", edev->total_xdp_queues); in qede_init_fp()
1808 static int qede_set_real_num_queues(struct qede_dev *edev) in qede_set_real_num_queues() argument
1812 rc = netif_set_real_num_tx_queues(edev->ndev, in qede_set_real_num_queues()
1813 QEDE_TSS_COUNT(edev) * in qede_set_real_num_queues()
1814 edev->dev_info.num_tc); in qede_set_real_num_queues()
1816 DP_NOTICE(edev, "Failed to set real number of Tx queues\n"); in qede_set_real_num_queues()
1820 rc = netif_set_real_num_rx_queues(edev->ndev, QEDE_RSS_COUNT(edev)); in qede_set_real_num_queues()
1822 DP_NOTICE(edev, "Failed to set real number of Rx queues\n"); in qede_set_real_num_queues()
1829 static void qede_napi_disable_remove(struct qede_dev *edev) in qede_napi_disable_remove() argument
1834 napi_disable(&edev->fp_array[i].napi); in qede_napi_disable_remove()
1836 netif_napi_del(&edev->fp_array[i].napi); in qede_napi_disable_remove()
1840 static void qede_napi_add_enable(struct qede_dev *edev) in qede_napi_add_enable() argument
1846 netif_napi_add(edev->ndev, &edev->fp_array[i].napi, in qede_napi_add_enable()
1848 napi_enable(&edev->fp_array[i].napi); in qede_napi_add_enable()
1852 static void qede_sync_free_irqs(struct qede_dev *edev) in qede_sync_free_irqs() argument
1856 for (i = 0; i < edev->int_info.used_cnt; i++) { in qede_sync_free_irqs()
1857 if (edev->int_info.msix_cnt) { in qede_sync_free_irqs()
1858 synchronize_irq(edev->int_info.msix[i].vector); in qede_sync_free_irqs()
1859 free_irq(edev->int_info.msix[i].vector, in qede_sync_free_irqs()
1860 &edev->fp_array[i]); in qede_sync_free_irqs()
1862 edev->ops->common->simd_handler_clean(edev->cdev, i); in qede_sync_free_irqs()
1866 edev->int_info.used_cnt = 0; in qede_sync_free_irqs()
1867 edev->int_info.msix_cnt = 0; in qede_sync_free_irqs()
1870 static int qede_req_msix_irqs(struct qede_dev *edev) in qede_req_msix_irqs() argument
1875 if (QEDE_QUEUE_CNT(edev) > edev->int_info.msix_cnt) { in qede_req_msix_irqs()
1876 DP_ERR(edev, in qede_req_msix_irqs()
1878 QEDE_QUEUE_CNT(edev), edev->int_info.msix_cnt); in qede_req_msix_irqs()
1882 for (i = 0; i < QEDE_QUEUE_CNT(edev); i++) { in qede_req_msix_irqs()
1884 struct qede_fastpath *fp = &edev->fp_array[i]; in qede_req_msix_irqs()
1886 if (edev->ndev->rx_cpu_rmap && (fp->type & QEDE_FASTPATH_RX)) { in qede_req_msix_irqs()
1887 rc = irq_cpu_rmap_add(edev->ndev->rx_cpu_rmap, in qede_req_msix_irqs()
1888 edev->int_info.msix[i].vector); in qede_req_msix_irqs()
1890 DP_ERR(edev, "Failed to add CPU rmap\n"); in qede_req_msix_irqs()
1891 qede_free_arfs(edev); in qede_req_msix_irqs()
1895 rc = request_irq(edev->int_info.msix[i].vector, in qede_req_msix_irqs()
1896 qede_msix_fp_int, 0, edev->fp_array[i].name, in qede_req_msix_irqs()
1897 &edev->fp_array[i]); in qede_req_msix_irqs()
1899 DP_ERR(edev, "Request fp %d irq failed\n", i); in qede_req_msix_irqs()
1901 if (edev->ndev->rx_cpu_rmap) in qede_req_msix_irqs()
1902 free_irq_cpu_rmap(edev->ndev->rx_cpu_rmap); in qede_req_msix_irqs()
1904 edev->ndev->rx_cpu_rmap = NULL; in qede_req_msix_irqs()
1906 qede_sync_free_irqs(edev); in qede_req_msix_irqs()
1909 DP_VERBOSE(edev, NETIF_MSG_INTR, in qede_req_msix_irqs()
1911 edev->fp_array[i].name, i, in qede_req_msix_irqs()
1912 &edev->fp_array[i]); in qede_req_msix_irqs()
1913 edev->int_info.used_cnt++; in qede_req_msix_irqs()
1926 static int qede_setup_irqs(struct qede_dev *edev) in qede_setup_irqs() argument
1931 rc = edev->ops->common->get_fp_int(edev->cdev, &edev->int_info); in qede_setup_irqs()
1935 if (edev->int_info.msix_cnt) { in qede_setup_irqs()
1936 rc = qede_req_msix_irqs(edev); in qede_setup_irqs()
1939 edev->ndev->irq = edev->int_info.msix[0].vector; in qede_setup_irqs()
1944 ops = edev->ops->common; in qede_setup_irqs()
1945 for (i = 0; i < QEDE_QUEUE_CNT(edev); i++) in qede_setup_irqs()
1946 ops->simd_handler_config(edev->cdev, in qede_setup_irqs()
1947 &edev->fp_array[i], i, in qede_setup_irqs()
1949 edev->int_info.used_cnt = QEDE_QUEUE_CNT(edev); in qede_setup_irqs()
1954 static int qede_drain_txq(struct qede_dev *edev, in qede_drain_txq() argument
1962 DP_NOTICE(edev, in qede_drain_txq()
1965 rc = edev->ops->common->drain(edev->cdev); in qede_drain_txq()
1968 return qede_drain_txq(edev, txq, false); in qede_drain_txq()
1970 DP_NOTICE(edev, in qede_drain_txq()
1987 static int qede_stop_txq(struct qede_dev *edev, in qede_stop_txq() argument
1991 edev->ops->common->db_recovery_del(edev->cdev, txq->doorbell_addr, in qede_stop_txq()
1994 return edev->ops->q_tx_stop(edev->cdev, rss_id, txq->handle); in qede_stop_txq()
1997 static int qede_stop_queues(struct qede_dev *edev) in qede_stop_queues() argument
2000 struct qed_dev *cdev = edev->cdev; in qede_stop_queues()
2014 rc = edev->ops->vport_update(cdev, vport_update_params); in qede_stop_queues()
2018 DP_ERR(edev, "Failed to update vport\n"); in qede_stop_queues()
2024 fp = &edev->fp_array[i]; in qede_stop_queues()
2029 for_each_cos_in_txq(edev, cos) { in qede_stop_queues()
2030 rc = qede_drain_txq(edev, &fp->txq[cos], true); in qede_stop_queues()
2037 rc = qede_drain_txq(edev, fp->xdp_tx, true); in qede_stop_queues()
2044 for (i = QEDE_QUEUE_CNT(edev) - 1; i >= 0; i--) { in qede_stop_queues()
2045 fp = &edev->fp_array[i]; in qede_stop_queues()
2051 for_each_cos_in_txq(edev, cos) { in qede_stop_queues()
2052 rc = qede_stop_txq(edev, &fp->txq[cos], i); in qede_stop_queues()
2060 rc = edev->ops->q_rx_stop(cdev, i, fp->rxq->handle); in qede_stop_queues()
2062 DP_ERR(edev, "Failed to stop RXQ #%d\n", i); in qede_stop_queues()
2069 rc = qede_stop_txq(edev, fp->xdp_tx, i); in qede_stop_queues()
2078 rc = edev->ops->vport_stop(cdev, 0); in qede_stop_queues()
2080 DP_ERR(edev, "Failed to stop VPORT\n"); in qede_stop_queues()
2085 static int qede_start_txq(struct qede_dev *edev, in qede_start_txq() argument
2102 params.queue_id = QEDE_TXQ_XDP_TO_IDX(edev, txq); in qede_start_txq()
2110 rc = edev->ops->q_tx_start(edev->cdev, rss_id, ¶ms, phys_table, in qede_start_txq()
2113 DP_ERR(edev, "Start TXQ #%d failed %d\n", txq->index, rc); in qede_start_txq()
2131 rc = edev->ops->common->db_recovery_add(edev->cdev, txq->doorbell_addr, in qede_start_txq()
2138 static int qede_start_queues(struct qede_dev *edev, bool clear_stats) in qede_start_queues() argument
2141 struct qed_dev *cdev = edev->cdev; in qede_start_queues()
2142 struct qed_dev_info *qed_info = &edev->dev_info.common; in qede_start_queues()
2148 if (!edev->num_queues) { in qede_start_queues()
2149 DP_ERR(edev, in qede_start_queues()
2158 start.handle_ptp_pkts = !!(edev->ptp); in qede_start_queues()
2159 start.gro_enable = !edev->gro_disable; in qede_start_queues()
2160 start.mtu = edev->ndev->mtu; in qede_start_queues()
2166 rc = edev->ops->vport_start(cdev, &start); in qede_start_queues()
2169 DP_ERR(edev, "Start V-PORT failed %d\n", rc); in qede_start_queues()
2173 DP_VERBOSE(edev, NETIF_MSG_IFUP, in qede_start_queues()
2175 start.vport_id, edev->ndev->mtu + 0xe, vlan_removal_en); in qede_start_queues()
2178 struct qede_fastpath *fp = &edev->fp_array[i]; in qede_start_queues()
2198 rc = edev->ops->q_rx_start(cdev, i, &q_params, in qede_start_queues()
2204 DP_ERR(edev, "Start RXQ #%d failed %d\n", i, in qede_start_queues()
2216 qede_update_rx_prod(edev, rxq); in qede_start_queues()
2220 rc = qede_start_txq(edev, fp, fp->xdp_tx, i, XDP_PI); in qede_start_queues()
2224 bpf_prog_add(edev->xdp_prog, 1); in qede_start_queues()
2225 fp->rxq->xdp_prog = edev->xdp_prog; in qede_start_queues()
2231 for_each_cos_in_txq(edev, cos) { in qede_start_queues()
2232 rc = qede_start_txq(edev, fp, &fp->txq[cos], i, in qede_start_queues()
2245 if ((qed_info->b_inter_pf_switch || pci_num_vf(edev->pdev)) && in qede_start_queues()
2251 qede_fill_rss_params(edev, &vport_update_params->rss_params, in qede_start_queues()
2254 rc = edev->ops->vport_update(cdev, vport_update_params); in qede_start_queues()
2256 DP_ERR(edev, "Update V-PORT failed %d\n", rc); in qede_start_queues()
2268 static void qede_unload(struct qede_dev *edev, enum qede_unload_mode mode, in qede_unload() argument
2274 DP_INFO(edev, "Starting qede unload\n"); in qede_unload()
2277 __qede_lock(edev); in qede_unload()
2279 clear_bit(QEDE_FLAGS_LINK_REQUESTED, &edev->flags); in qede_unload()
2282 edev->state = QEDE_STATE_CLOSED; in qede_unload()
2284 qede_rdma_dev_event_close(edev); in qede_unload()
2287 netif_tx_disable(edev->ndev); in qede_unload()
2288 netif_carrier_off(edev->ndev); in qede_unload()
2294 edev->ops->common->set_link(edev->cdev, &link_params); in qede_unload()
2296 rc = qede_stop_queues(edev); in qede_unload()
2299 if (edev->dev_info.common.b_arfs_capable) { in qede_unload()
2300 qede_poll_for_freeing_arfs_filters(edev); in qede_unload()
2301 if (edev->ndev->rx_cpu_rmap) in qede_unload()
2302 free_irq_cpu_rmap(edev->ndev->rx_cpu_rmap); in qede_unload()
2304 edev->ndev->rx_cpu_rmap = NULL; in qede_unload()
2307 qede_sync_free_irqs(edev); in qede_unload()
2311 DP_INFO(edev, "Stopped Queues\n"); in qede_unload()
2314 qede_vlan_mark_nonconfigured(edev); in qede_unload()
2315 edev->ops->fastpath_stop(edev->cdev); in qede_unload()
2317 if (edev->dev_info.common.b_arfs_capable) { in qede_unload()
2318 qede_poll_for_freeing_arfs_filters(edev); in qede_unload()
2319 qede_free_arfs(edev); in qede_unload()
2323 qede_sync_free_irqs(edev); in qede_unload()
2324 edev->ops->common->set_fp_int(edev->cdev, 0); in qede_unload()
2326 qede_napi_disable_remove(edev); in qede_unload()
2329 qede_empty_tx_queues(edev); in qede_unload()
2331 qede_free_mem_load(edev); in qede_unload()
2332 qede_free_fp_array(edev); in qede_unload()
2336 __qede_unlock(edev); in qede_unload()
2339 DP_NOTICE(edev, "Link is down\n"); in qede_unload()
2341 edev->ptp_skip_txts = 0; in qede_unload()
2343 DP_INFO(edev, "Ending qede unload\n"); in qede_unload()
2352 static int qede_load(struct qede_dev *edev, enum qede_load_mode mode, in qede_load() argument
2360 DP_INFO(edev, "Starting qede load\n"); in qede_load()
2363 __qede_lock(edev); in qede_load()
2365 rc = qede_set_num_queues(edev); in qede_load()
2369 rc = qede_alloc_fp_array(edev); in qede_load()
2373 qede_init_fp(edev); in qede_load()
2375 rc = qede_alloc_mem_load(edev); in qede_load()
2378 DP_INFO(edev, "Allocated %d Rx, %d Tx queues\n", in qede_load()
2379 QEDE_RSS_COUNT(edev), QEDE_TSS_COUNT(edev)); in qede_load()
2381 rc = qede_set_real_num_queues(edev); in qede_load()
2385 if (qede_alloc_arfs(edev)) { in qede_load()
2386 edev->ndev->features &= ~NETIF_F_NTUPLE; in qede_load()
2387 edev->dev_info.common.b_arfs_capable = false; in qede_load()
2390 qede_napi_add_enable(edev); in qede_load()
2391 DP_INFO(edev, "Napi added and enabled\n"); in qede_load()
2393 rc = qede_setup_irqs(edev); in qede_load()
2396 DP_INFO(edev, "Setup IRQs succeeded\n"); in qede_load()
2398 rc = qede_start_queues(edev, mode != QEDE_LOAD_RELOAD); in qede_load()
2401 DP_INFO(edev, "Start VPORT, RXQ and TXQ succeeded\n"); in qede_load()
2403 num_tc = netdev_get_num_tc(edev->ndev); in qede_load()
2404 num_tc = num_tc ? num_tc : edev->dev_info.num_tc; in qede_load()
2405 qede_setup_tc(edev->ndev, num_tc); in qede_load()
2408 qede_configure_vlan_filters(edev); in qede_load()
2410 set_bit(QEDE_FLAGS_LINK_REQUESTED, &edev->flags); in qede_load()
2415 edev->ops->common->set_link(edev->cdev, &link_params); in qede_load()
2417 edev->state = QEDE_STATE_OPEN; in qede_load()
2423 if (edev->coal_entry[i].isvalid) { in qede_load()
2424 coal.rx_coalesce_usecs = edev->coal_entry[i].rxc; in qede_load()
2425 coal.tx_coalesce_usecs = edev->coal_entry[i].txc; in qede_load()
2427 __qede_unlock(edev); in qede_load()
2428 qede_set_per_coalesce(edev->ndev, i, &coal); in qede_load()
2429 __qede_lock(edev); in qede_load()
2431 DP_INFO(edev, "Ending successfully qede load\n"); in qede_load()
2435 qede_sync_free_irqs(edev); in qede_load()
2437 qede_napi_disable_remove(edev); in qede_load()
2439 qede_free_mem_load(edev); in qede_load()
2441 edev->ops->common->set_fp_int(edev->cdev, 0); in qede_load()
2442 qede_free_fp_array(edev); in qede_load()
2443 edev->num_queues = 0; in qede_load()
2444 edev->fp_num_tx = 0; in qede_load()
2445 edev->fp_num_rx = 0; in qede_load()
2448 __qede_unlock(edev); in qede_load()
2456 void qede_reload(struct qede_dev *edev, in qede_reload() argument
2460 __qede_lock(edev); in qede_reload()
2466 if (edev->state == QEDE_STATE_OPEN) { in qede_reload()
2467 qede_unload(edev, QEDE_UNLOAD_NORMAL, true); in qede_reload()
2469 args->func(edev, args); in qede_reload()
2470 qede_load(edev, QEDE_LOAD_RELOAD, true); in qede_reload()
2473 qede_config_rx_mode(edev->ndev); in qede_reload()
2475 args->func(edev, args); in qede_reload()
2479 __qede_unlock(edev); in qede_reload()
2485 struct qede_dev *edev = netdev_priv(ndev); in qede_open() local
2490 edev->ops->common->set_power_state(edev->cdev, PCI_D0); in qede_open()
2492 rc = qede_load(edev, QEDE_LOAD_NORMAL, false); in qede_open()
2498 edev->ops->common->update_drv_state(edev->cdev, true); in qede_open()
2505 struct qede_dev *edev = netdev_priv(ndev); in qede_close() local
2507 qede_unload(edev, QEDE_UNLOAD_NORMAL, false); in qede_close()
2509 if (edev->cdev) in qede_close()
2510 edev->ops->common->update_drv_state(edev->cdev, false); in qede_close()
2517 struct qede_dev *edev = dev; in qede_link_update() local
2519 if (!test_bit(QEDE_FLAGS_LINK_REQUESTED, &edev->flags)) { in qede_link_update()
2520 DP_VERBOSE(edev, NETIF_MSG_LINK, "Interface is not ready\n"); in qede_link_update()
2525 if (!netif_carrier_ok(edev->ndev)) { in qede_link_update()
2526 DP_NOTICE(edev, "Link is up\n"); in qede_link_update()
2527 netif_tx_start_all_queues(edev->ndev); in qede_link_update()
2528 netif_carrier_on(edev->ndev); in qede_link_update()
2529 qede_rdma_dev_event_open(edev); in qede_link_update()
2532 if (netif_carrier_ok(edev->ndev)) { in qede_link_update()
2533 DP_NOTICE(edev, "Link is down\n"); in qede_link_update()
2534 netif_tx_disable(edev->ndev); in qede_link_update()
2535 netif_carrier_off(edev->ndev); in qede_link_update()
2536 qede_rdma_dev_event_close(edev); in qede_link_update()
2543 struct qede_dev *edev = dev; in qede_schedule_recovery_handler() local
2545 if (edev->state == QEDE_STATE_RECOVERY) { in qede_schedule_recovery_handler()
2546 DP_NOTICE(edev, in qede_schedule_recovery_handler()
2551 set_bit(QEDE_SP_RECOVERY, &edev->sp_flags); in qede_schedule_recovery_handler()
2552 schedule_delayed_work(&edev->sp_task, 0); in qede_schedule_recovery_handler()
2554 DP_INFO(edev, "Scheduled a recovery handler\n"); in qede_schedule_recovery_handler()
2557 static void qede_recovery_failed(struct qede_dev *edev) in qede_recovery_failed() argument
2559 netdev_err(edev->ndev, "Recovery handling has failed. Power cycle is needed.\n"); in qede_recovery_failed()
2561 netif_device_detach(edev->ndev); in qede_recovery_failed()
2563 if (edev->cdev) in qede_recovery_failed()
2564 edev->ops->common->set_power_state(edev->cdev, PCI_D3hot); in qede_recovery_failed()
2567 static void qede_recovery_handler(struct qede_dev *edev) in qede_recovery_handler() argument
2569 u32 curr_state = edev->state; in qede_recovery_handler()
2572 DP_NOTICE(edev, "Starting a recovery process\n"); in qede_recovery_handler()
2577 edev->state = QEDE_STATE_RECOVERY; in qede_recovery_handler()
2579 edev->ops->common->recovery_prolog(edev->cdev); in qede_recovery_handler()
2582 qede_unload(edev, QEDE_UNLOAD_RECOVERY, true); in qede_recovery_handler()
2584 __qede_remove(edev->pdev, QEDE_REMOVE_RECOVERY); in qede_recovery_handler()
2586 rc = __qede_probe(edev->pdev, edev->dp_module, edev->dp_level, in qede_recovery_handler()
2587 IS_VF(edev), QEDE_PROBE_RECOVERY); in qede_recovery_handler()
2589 edev->cdev = NULL; in qede_recovery_handler()
2594 rc = qede_load(edev, QEDE_LOAD_RECOVERY, true); in qede_recovery_handler()
2598 qede_config_rx_mode(edev->ndev); in qede_recovery_handler()
2599 udp_tunnel_nic_reset_ntf(edev->ndev); in qede_recovery_handler()
2602 edev->state = curr_state; in qede_recovery_handler()
2604 DP_NOTICE(edev, "Recovery handling is done\n"); in qede_recovery_handler()
2609 qede_recovery_failed(edev); in qede_recovery_handler()
2612 static void qede_atomic_hw_err_handler(struct qede_dev *edev) in qede_atomic_hw_err_handler() argument
2614 struct qed_dev *cdev = edev->cdev; in qede_atomic_hw_err_handler()
2616 DP_NOTICE(edev, in qede_atomic_hw_err_handler()
2618 edev->err_flags); in qede_atomic_hw_err_handler()
2621 WARN_ON(test_bit(QEDE_ERR_WARN, &edev->err_flags)); in qede_atomic_hw_err_handler()
2624 if (test_bit(QEDE_ERR_ATTN_CLR_EN, &edev->err_flags)) in qede_atomic_hw_err_handler()
2625 edev->ops->common->attn_clr_enable(cdev, true); in qede_atomic_hw_err_handler()
2627 DP_NOTICE(edev, "Generic non-sleepable HW error handling is done\n"); in qede_atomic_hw_err_handler()
2630 static void qede_generic_hw_err_handler(struct qede_dev *edev) in qede_generic_hw_err_handler() argument
2632 DP_NOTICE(edev, in qede_generic_hw_err_handler()
2634 edev->err_flags); in qede_generic_hw_err_handler()
2636 if (edev->devlink) { in qede_generic_hw_err_handler()
2637 DP_NOTICE(edev, "Reporting fatal error to devlink\n"); in qede_generic_hw_err_handler()
2638 edev->ops->common->report_fatal_error(edev->devlink, edev->last_err_type); in qede_generic_hw_err_handler()
2641 clear_bit(QEDE_ERR_IS_HANDLED, &edev->err_flags); in qede_generic_hw_err_handler()
2643 DP_NOTICE(edev, "Generic sleepable HW error handling is done\n"); in qede_generic_hw_err_handler()
2646 static void qede_set_hw_err_flags(struct qede_dev *edev, in qede_set_hw_err_flags() argument
2666 DP_NOTICE(edev, "Unexpected HW error [%d]\n", err_type); in qede_set_hw_err_flags()
2670 edev->err_flags |= err_flags; in qede_set_hw_err_flags()
2676 struct qede_dev *edev = dev; in qede_schedule_hw_err_handler() local
2681 if ((test_and_set_bit(QEDE_ERR_IS_HANDLED, &edev->err_flags) || in qede_schedule_hw_err_handler()
2682 edev->state == QEDE_STATE_RECOVERY) && in qede_schedule_hw_err_handler()
2684 DP_INFO(edev, in qede_schedule_hw_err_handler()
2690 DP_NOTICE(edev, "Unknown HW error [%d]\n", err_type); in qede_schedule_hw_err_handler()
2691 clear_bit(QEDE_ERR_IS_HANDLED, &edev->err_flags); in qede_schedule_hw_err_handler()
2695 edev->last_err_type = err_type; in qede_schedule_hw_err_handler()
2696 qede_set_hw_err_flags(edev, err_type); in qede_schedule_hw_err_handler()
2697 qede_atomic_hw_err_handler(edev); in qede_schedule_hw_err_handler()
2698 set_bit(QEDE_SP_HW_ERR, &edev->sp_flags); in qede_schedule_hw_err_handler()
2699 schedule_delayed_work(&edev->sp_task, 0); in qede_schedule_hw_err_handler()
2701 DP_INFO(edev, "Scheduled a error handler [err_type %d]\n", err_type); in qede_schedule_hw_err_handler()
2704 static bool qede_is_txq_full(struct qede_dev *edev, struct qede_tx_queue *txq) in qede_is_txq_full() argument
2708 netdev_txq = netdev_get_tx_queue(edev->ndev, txq->ndev_txq_id); in qede_is_txq_full()
2717 struct qede_dev *edev = dev; in qede_get_generic_tlv_data() local
2721 if (edev->ndev->features & NETIF_F_IP_CSUM) in qede_get_generic_tlv_data()
2723 if (edev->ndev->features & NETIF_F_TSO) in qede_get_generic_tlv_data()
2726 ether_addr_copy(data->mac[0], edev->ndev->dev_addr); in qede_get_generic_tlv_data()
2730 netif_addr_lock_bh(edev->ndev); in qede_get_generic_tlv_data()
2732 netdev_for_each_uc_addr(ha, edev->ndev) { in qede_get_generic_tlv_data()
2738 netif_addr_unlock_bh(edev->ndev); in qede_get_generic_tlv_data()
2744 struct qede_dev *edev = dev; in qede_get_eth_tlv_data() local
2752 etlv->prom_mode = !!(edev->ndev->flags & IFF_PROMISC); in qede_get_eth_tlv_data()
2754 etlv->tx_descr_size = QEDE_TSS_COUNT(edev); in qede_get_eth_tlv_data()
2756 etlv->rx_descr_size = QEDE_RSS_COUNT(edev); in qede_get_eth_tlv_data()
2769 __qede_lock(edev); in qede_get_eth_tlv_data()
2771 fp = &edev->fp_array[i]; in qede_get_eth_tlv_data()
2777 if (qede_is_txq_full(edev, txq)) in qede_get_eth_tlv_data()
2794 __qede_unlock(edev); in qede_get_eth_tlv_data()
2817 struct qede_dev *edev = netdev_priv(dev); in qede_io_error_detected() local
2819 if (!edev) in qede_io_error_detected()
2822 DP_NOTICE(edev, "IO error detected [%d]\n", state); in qede_io_error_detected()
2824 __qede_lock(edev); in qede_io_error_detected()
2825 if (edev->state == QEDE_STATE_RECOVERY) { in qede_io_error_detected()
2826 DP_NOTICE(edev, "Device already in the recovery state\n"); in qede_io_error_detected()
2827 __qede_unlock(edev); in qede_io_error_detected()
2832 if (IS_VF(edev)) { in qede_io_error_detected()
2833 DP_VERBOSE(edev, QED_MSG_IOV, in qede_io_error_detected()
2835 __qede_unlock(edev); in qede_io_error_detected()
2840 netif_tx_disable(edev->ndev); in qede_io_error_detected()
2841 netif_carrier_off(edev->ndev); in qede_io_error_detected()
2843 set_bit(QEDE_SP_AER, &edev->sp_flags); in qede_io_error_detected()
2844 schedule_delayed_work(&edev->sp_task, 0); in qede_io_error_detected()
2846 __qede_unlock(edev); in qede_io_error_detected()