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()
311 spin_lock(&edev->stats_lock); in qede_fill_by_demand_stats()
377 p_common->ptp_skip_txts = edev->ptp_skip_txts; in qede_fill_by_demand_stats()
379 if (QEDE_IS_BB(edev)) { in qede_fill_by_demand_stats()
380 struct qede_stats_bb *p_bb = &edev->stats.bb; in qede_fill_by_demand_stats()
403 struct qede_stats_ah *p_ah = &edev->stats.ah; in qede_fill_by_demand_stats()
411 spin_unlock(&edev->stats_lock); in qede_fill_by_demand_stats()
417 struct qede_dev *edev = netdev_priv(dev); in qede_get_stats64() local
420 p_common = &edev->stats.common; in qede_get_stats64()
422 spin_lock(&edev->stats_lock); in qede_get_stats64()
439 if (QEDE_IS_BB(edev)) in qede_get_stats64()
440 stats->collisions = edev->stats.bb.tx_total_collisions; in qede_get_stats64()
444 spin_unlock(&edev->stats_lock); in qede_get_stats64()
451 struct qede_dev *edev = netdev_priv(dev); in qede_get_vf_config() local
453 if (!edev->ops) in qede_get_vf_config()
456 return edev->ops->iov->get_config(edev->cdev, vfidx, ivi); in qede_get_vf_config()
462 struct qede_dev *edev = netdev_priv(dev); in qede_set_vf_rate() local
464 return edev->ops->iov->set_rate(edev->cdev, vfidx, min_tx_rate, in qede_set_vf_rate()
470 struct qede_dev *edev = netdev_priv(dev); in qede_set_vf_spoofchk() local
472 if (!edev->ops) in qede_set_vf_spoofchk()
475 return edev->ops->iov->set_spoof(edev->cdev, vfidx, val); in qede_set_vf_spoofchk()
481 struct qede_dev *edev = netdev_priv(dev); in qede_set_vf_link_state() local
483 if (!edev->ops) in qede_set_vf_link_state()
486 return edev->ops->iov->set_link_state(edev->cdev, vfidx, link_state); in qede_set_vf_link_state()
491 struct qede_dev *edev = netdev_priv(dev); in qede_set_vf_trust() local
493 if (!edev->ops) in qede_set_vf_trust()
496 return edev->ops->iov->set_trust(edev->cdev, vfidx, setting); in qede_set_vf_trust()
502 struct qede_dev *edev = netdev_priv(dev); in qede_ioctl() local
509 return qede_ptp_hw_ts(edev, ifr); in qede_ioctl()
511 DP_VERBOSE(edev, QED_MSG_DEBUG, in qede_ioctl()
519 static void qede_tx_log_print(struct qede_dev *edev, struct qede_tx_queue *txq) in qede_tx_log_print() argument
521 DP_NOTICE(edev, in qede_tx_log_print()
531 struct qede_dev *edev = netdev_priv(dev); in qede_tx_timeout() local
536 DP_NOTICE(edev, "TX timeout on queue %u!\n", txqueue); in qede_tx_timeout()
538 if (!(edev->fp_array[txqueue].type & QEDE_FASTPATH_TX)) in qede_tx_timeout()
541 for_each_cos_in_txq(edev, cos) { in qede_tx_timeout()
542 txq = &edev->fp_array[txqueue].txq[cos]; in qede_tx_timeout()
546 qede_tx_log_print(edev, txq); in qede_tx_timeout()
549 if (IS_VF(edev)) in qede_tx_timeout()
552 if (test_and_set_bit(QEDE_ERR_IS_HANDLED, &edev->err_flags) || in qede_tx_timeout()
553 edev->state == QEDE_STATE_RECOVERY) { in qede_tx_timeout()
554 DP_INFO(edev, in qede_tx_timeout()
559 set_bit(QEDE_ERR_GET_DBG_INFO, &edev->err_flags); in qede_tx_timeout()
560 set_bit(QEDE_SP_HW_ERR, &edev->sp_flags); in qede_tx_timeout()
561 schedule_delayed_work(&edev->sp_task, 0); in qede_tx_timeout()
566 struct qede_dev *edev = netdev_priv(ndev); in qede_setup_tc() local
569 if (num_tc > edev->dev_info.num_tc) in qede_setup_tc()
575 for_each_cos_in_txq(edev, cos) { in qede_setup_tc()
576 count = QEDE_TSS_COUNT(edev); in qede_setup_tc()
577 offset = cos * QEDE_TSS_COUNT(edev); in qede_setup_tc()
585 qede_set_flower(struct qede_dev *edev, struct flow_cls_offload *f, in qede_set_flower() argument
590 return qede_add_tc_flower_fltr(edev, proto, f); in qede_set_flower()
592 return qede_delete_flow_filter(edev, f->cookie); in qede_set_flower()
602 struct qede_dev *edev = cb_priv; in qede_setup_tc_block_cb() local
604 if (!tc_cls_can_offload_and_chain0(edev->ndev, type_data)) in qede_setup_tc_block_cb()
610 return qede_set_flower(edev, f, f->common.protocol); in qede_setup_tc_block_cb()
622 struct qede_dev *edev = netdev_priv(dev); in qede_setup_tc_offload() local
630 edev, edev, true); in qede_setup_tc_offload()
724 struct qede_dev *edev; in qede_alloc_etherdev() local
726 ndev = alloc_etherdev_mqs(sizeof(*edev), in qede_alloc_etherdev()
734 edev = netdev_priv(ndev); in qede_alloc_etherdev()
735 edev->ndev = ndev; in qede_alloc_etherdev()
736 edev->cdev = cdev; in qede_alloc_etherdev()
737 edev->pdev = pdev; in qede_alloc_etherdev()
738 edev->dp_module = dp_module; in qede_alloc_etherdev()
739 edev->dp_level = dp_level; in qede_alloc_etherdev()
740 edev->ops = qed_ops; in qede_alloc_etherdev()
743 edev->q_num_rx_buffers = NUM_RX_BDS_KDUMP_MIN; in qede_alloc_etherdev()
744 edev->q_num_tx_buffers = NUM_TX_BDS_KDUMP_MIN; in qede_alloc_etherdev()
746 edev->q_num_rx_buffers = NUM_RX_BDS_DEF; in qede_alloc_etherdev()
747 edev->q_num_tx_buffers = NUM_TX_BDS_DEF; in qede_alloc_etherdev()
750 DP_INFO(edev, "Allocated netdev with %d tx queues and %d rx queues\n", in qede_alloc_etherdev()
755 memset(&edev->stats, 0, sizeof(edev->stats)); in qede_alloc_etherdev()
756 memcpy(&edev->dev_info, info, sizeof(*info)); in qede_alloc_etherdev()
761 if (edev->dev_info.common.wol_support) in qede_alloc_etherdev()
762 edev->wol_enabled = true; in qede_alloc_etherdev()
764 INIT_LIST_HEAD(&edev->vlan_list); in qede_alloc_etherdev()
766 return edev; in qede_alloc_etherdev()
769 static void qede_init_ndev(struct qede_dev *edev) in qede_init_ndev() argument
771 struct net_device *ndev = edev->ndev; in qede_init_ndev()
772 struct pci_dev *pdev = edev->pdev; in qede_init_ndev()
778 ndev->mem_start = edev->dev_info.common.pci_mem_start; in qede_init_ndev()
780 ndev->mem_end = edev->dev_info.common.pci_mem_end; in qede_init_ndev()
781 ndev->irq = edev->dev_info.common.pci_irq; in qede_init_ndev()
785 if (IS_VF(edev)) { in qede_init_ndev()
786 if (edev->dev_info.xdp_supported) in qede_init_ndev()
803 if (edev->dev_info.common.b_arfs_capable) in qede_init_ndev()
806 if (edev->dev_info.common.vxlan_enable || in qede_init_ndev()
807 edev->dev_info.common.geneve_enable) in qede_init_ndev()
810 if (udp_tunnel_enable || edev->dev_info.common.gre_enable) { in qede_init_ndev()
824 qede_set_udp_tunnels(edev); in qede_init_ndev()
827 if (edev->dev_info.common.gre_enable) { in qede_init_ndev()
846 eth_hw_addr_set(edev->ndev, edev->dev_info.common.hw_mac); in qede_init_ndev()
848 ndev->mtu = edev->dev_info.common.mtu; in qede_init_ndev()
877 static void qede_free_fp_array(struct qede_dev *edev) in qede_free_fp_array() argument
879 if (edev->fp_array) { in qede_free_fp_array()
884 fp = &edev->fp_array[i]; in qede_free_fp_array()
897 kfree(edev->fp_array); in qede_free_fp_array()
900 edev->num_queues = 0; in qede_free_fp_array()
901 edev->fp_num_tx = 0; in qede_free_fp_array()
902 edev->fp_num_rx = 0; in qede_free_fp_array()
905 static int qede_alloc_fp_array(struct qede_dev *edev) in qede_alloc_fp_array() argument
907 u8 fp_combined, fp_rx = edev->fp_num_rx; in qede_alloc_fp_array()
911 edev->fp_array = kcalloc(QEDE_QUEUE_CNT(edev), in qede_alloc_fp_array()
912 sizeof(*edev->fp_array), GFP_KERNEL); in qede_alloc_fp_array()
913 if (!edev->fp_array) { in qede_alloc_fp_array()
914 DP_NOTICE(edev, "fp array allocation failed\n"); in qede_alloc_fp_array()
918 if (!edev->coal_entry) { in qede_alloc_fp_array()
919 edev->coal_entry = kcalloc(QEDE_MAX_RSS_CNT(edev), in qede_alloc_fp_array()
920 sizeof(*edev->coal_entry), in qede_alloc_fp_array()
922 if (!edev->coal_entry) { in qede_alloc_fp_array()
923 DP_ERR(edev, "coalesce entry allocation failed\n"); in qede_alloc_fp_array()
928 fp_combined = QEDE_QUEUE_CNT(edev) - fp_rx - edev->fp_num_tx; in qede_alloc_fp_array()
936 fp = &edev->fp_array[i]; in qede_alloc_fp_array()
940 DP_NOTICE(edev, "sb info struct allocation failed\n"); in qede_alloc_fp_array()
955 fp->txq = kcalloc(edev->dev_info.num_tc, in qede_alloc_fp_array()
966 if (edev->xdp_prog) { in qede_alloc_fp_array()
978 qede_free_fp_array(edev); in qede_alloc_fp_array()
985 void __qede_lock(struct qede_dev *edev) in __qede_lock() argument
987 mutex_lock(&edev->qede_lock); in __qede_lock()
990 void __qede_unlock(struct qede_dev *edev) in __qede_unlock() argument
992 mutex_unlock(&edev->qede_lock); in __qede_unlock()
998 static void qede_lock(struct qede_dev *edev) in qede_lock() argument
1001 __qede_lock(edev); in qede_lock()
1004 static void qede_unlock(struct qede_dev *edev) in qede_unlock() argument
1006 __qede_unlock(edev); in qede_unlock()
1012 struct qede_dev *edev = container_of(work, struct qede_dev, in qede_periodic_task() local
1015 qede_fill_by_demand_stats(edev); in qede_periodic_task()
1016 schedule_delayed_work(&edev->periodic_task, edev->stats_coal_ticks); in qede_periodic_task()
1019 static void qede_init_periodic_task(struct qede_dev *edev) in qede_init_periodic_task() argument
1021 INIT_DELAYED_WORK(&edev->periodic_task, qede_periodic_task); in qede_init_periodic_task()
1022 spin_lock_init(&edev->stats_lock); in qede_init_periodic_task()
1023 edev->stats_coal_usecs = USEC_PER_SEC; in qede_init_periodic_task()
1024 edev->stats_coal_ticks = usecs_to_jiffies(USEC_PER_SEC); in qede_init_periodic_task()
1029 struct qede_dev *edev = container_of(work, struct qede_dev, in qede_sp_task() local
1036 if (test_bit(QEDE_SP_DISABLE, &edev->sp_flags)) in qede_sp_task()
1045 if (test_and_clear_bit(QEDE_SP_RECOVERY, &edev->sp_flags)) { in qede_sp_task()
1046 cancel_delayed_work_sync(&edev->periodic_task); in qede_sp_task()
1051 if (pci_num_vf(edev->pdev)) in qede_sp_task()
1052 qede_sriov_configure(edev->pdev, 0); in qede_sp_task()
1054 qede_lock(edev); in qede_sp_task()
1055 qede_recovery_handler(edev); in qede_sp_task()
1056 qede_unlock(edev); in qede_sp_task()
1059 __qede_lock(edev); in qede_sp_task()
1061 if (test_and_clear_bit(QEDE_SP_RX_MODE, &edev->sp_flags)) in qede_sp_task()
1062 if (edev->state == QEDE_STATE_OPEN) in qede_sp_task()
1063 qede_config_rx_mode(edev->ndev); in qede_sp_task()
1066 if (test_and_clear_bit(QEDE_SP_ARFS_CONFIG, &edev->sp_flags)) { in qede_sp_task()
1067 if (edev->state == QEDE_STATE_OPEN) in qede_sp_task()
1068 qede_process_arfs_filters(edev, false); in qede_sp_task()
1071 if (test_and_clear_bit(QEDE_SP_HW_ERR, &edev->sp_flags)) in qede_sp_task()
1072 qede_generic_hw_err_handler(edev); in qede_sp_task()
1073 __qede_unlock(edev); in qede_sp_task()
1075 if (test_and_clear_bit(QEDE_SP_AER, &edev->sp_flags)) { in qede_sp_task()
1080 if (pci_num_vf(edev->pdev)) in qede_sp_task()
1081 qede_sriov_configure(edev->pdev, 0); in qede_sp_task()
1083 edev->ops->common->recovery_process(edev->cdev); in qede_sp_task()
1111 static void qede_log_probe(struct qede_dev *edev) in qede_log_probe() argument
1113 struct qed_dev_info *p_dev_info = &edev->dev_info.common; in qede_log_probe()
1141 pr_info("qede %02x:%02x.%02x: %s [%s]\n", edev->pdev->bus->number, in qede_log_probe()
1142 PCI_SLOT(edev->pdev->devfn), PCI_FUNC(edev->pdev->devfn), in qede_log_probe()
1143 buf, edev->ndev->name); in qede_log_probe()
1157 struct qede_dev *edev; in __qede_probe() local
1194 edev = qede_alloc_etherdev(cdev, pdev, &dev_info, dp_module, in __qede_probe()
1196 if (!edev) { in __qede_probe()
1201 edev->devlink = qed_ops->common->devlink_register(cdev); in __qede_probe()
1202 if (IS_ERR(edev->devlink)) { in __qede_probe()
1203 DP_NOTICE(edev, "Cannot register devlink\n"); in __qede_probe()
1204 rc = PTR_ERR(edev->devlink); in __qede_probe()
1205 edev->devlink = NULL; in __qede_probe()
1212 edev = netdev_priv(ndev); in __qede_probe()
1213 qdl = devlink_priv(edev->devlink); in __qede_probe()
1215 edev->cdev = cdev; in __qede_probe()
1216 memset(&edev->stats, 0, sizeof(edev->stats)); in __qede_probe()
1217 memcpy(&edev->dev_info, &dev_info, sizeof(dev_info)); in __qede_probe()
1221 set_bit(QEDE_FLAGS_IS_VF, &edev->flags); in __qede_probe()
1223 qede_init_ndev(edev); in __qede_probe()
1225 rc = qede_rdma_dev_add(edev, (mode == QEDE_PROBE_RECOVERY)); in __qede_probe()
1235 INIT_DELAYED_WORK(&edev->sp_task, qede_sp_task); in __qede_probe()
1236 mutex_init(&edev->qede_lock); in __qede_probe()
1237 qede_init_periodic_task(edev); in __qede_probe()
1239 rc = register_netdev(edev->ndev); in __qede_probe()
1241 DP_NOTICE(edev, "Cannot register net-device\n"); in __qede_probe()
1246 edev->ops->common->set_name(cdev, edev->ndev->name); in __qede_probe()
1250 qede_ptp_enable(edev); in __qede_probe()
1252 edev->ops->register_ops(cdev, &qede_ll_ops, edev); in __qede_probe()
1255 if (!IS_VF(edev)) in __qede_probe()
1256 qede_set_dcbnl_ops(edev->ndev); in __qede_probe()
1259 edev->rx_copybreak = QEDE_RX_HDR_SIZE; in __qede_probe()
1261 qede_log_probe(edev); in __qede_probe()
1264 if (edev->stats_coal_usecs) in __qede_probe()
1265 schedule_delayed_work(&edev->periodic_task, 0); in __qede_probe()
1270 qede_rdma_dev_remove(edev, (mode == QEDE_PROBE_RECOVERY)); in __qede_probe()
1273 free_netdev(edev->ndev); in __qede_probe()
1275 edev->cdev = NULL; in __qede_probe()
1315 struct qede_dev *edev; in __qede_remove() local
1323 edev = netdev_priv(ndev); in __qede_remove()
1324 cdev = edev->cdev; in __qede_remove()
1326 DP_INFO(edev, "Starting qede_remove\n"); in __qede_remove()
1328 qede_rdma_dev_remove(edev, (mode == QEDE_REMOVE_RECOVERY)); in __qede_remove()
1331 set_bit(QEDE_SP_DISABLE, &edev->sp_flags); in __qede_remove()
1334 cancel_delayed_work_sync(&edev->sp_task); in __qede_remove()
1335 cancel_delayed_work_sync(&edev->periodic_task); in __qede_remove()
1337 edev->ops->common->set_power_state(cdev, PCI_D0); in __qede_remove()
1342 qede_ptp_disable(edev); in __qede_remove()
1349 if (mode != QEDE_REMOVE_RECOVERY && edev->devlink) { in __qede_remove()
1350 qed_ops->common->devlink_unregister(edev->devlink); in __qede_remove()
1351 edev->devlink = NULL; in __qede_remove()
1354 edev->cdev = NULL; in __qede_remove()
1363 kfree(edev->coal_entry); in __qede_remove()
1385 static int qede_set_num_queues(struct qede_dev *edev) in qede_set_num_queues() argument
1391 if (edev->req_queues) in qede_set_num_queues()
1392 rss_num = edev->req_queues; in qede_set_num_queues()
1395 edev->dev_info.common.num_hwfns; in qede_set_num_queues()
1397 rss_num = min_t(u16, QEDE_MAX_RSS_CNT(edev), rss_num); in qede_set_num_queues()
1399 rc = edev->ops->common->set_fp_int(edev->cdev, rss_num); in qede_set_num_queues()
1402 edev->num_queues = rc; in qede_set_num_queues()
1403 DP_INFO(edev, "Managed %d [of %d] RSS queues\n", in qede_set_num_queues()
1404 QEDE_QUEUE_CNT(edev), rss_num); in qede_set_num_queues()
1408 edev->fp_num_tx = edev->req_num_tx; in qede_set_num_queues()
1409 edev->fp_num_rx = edev->req_num_rx; in qede_set_num_queues()
1414 static void qede_free_mem_sb(struct qede_dev *edev, struct qed_sb_info *sb_info, in qede_free_mem_sb() argument
1418 edev->ops->common->sb_release(edev->cdev, sb_info, sb_id, in qede_free_mem_sb()
1420 dma_free_coherent(&edev->pdev->dev, sizeof(*sb_info->sb_virt), in qede_free_mem_sb()
1427 static int qede_alloc_mem_sb(struct qede_dev *edev, in qede_alloc_mem_sb() argument
1434 sb_virt = dma_alloc_coherent(&edev->pdev->dev, in qede_alloc_mem_sb()
1437 DP_ERR(edev, "Status block allocation failed\n"); in qede_alloc_mem_sb()
1441 rc = edev->ops->common->sb_init(edev->cdev, sb_info, in qede_alloc_mem_sb()
1445 DP_ERR(edev, "Status block initialization failed\n"); in qede_alloc_mem_sb()
1446 dma_free_coherent(&edev->pdev->dev, sizeof(*sb_virt), in qede_alloc_mem_sb()
1454 static void qede_free_rx_buffers(struct qede_dev *edev, in qede_free_rx_buffers() argument
1466 dma_unmap_page(&edev->pdev->dev, in qede_free_rx_buffers()
1474 static void qede_free_mem_rxq(struct qede_dev *edev, struct qede_rx_queue *rxq) in qede_free_mem_rxq() argument
1477 qede_free_rx_buffers(edev, rxq); in qede_free_mem_rxq()
1483 edev->ops->common->chain_free(edev->cdev, &rxq->rx_bd_ring); in qede_free_mem_rxq()
1484 edev->ops->common->chain_free(edev->cdev, &rxq->rx_comp_ring); in qede_free_mem_rxq()
1499 static int qede_alloc_mem_rxq(struct qede_dev *edev, struct qede_rx_queue *rxq) in qede_alloc_mem_rxq() argument
1505 struct qed_dev *cdev = edev->cdev; in qede_alloc_mem_rxq()
1508 rxq->num_rx_buffers = edev->q_num_rx_buffers; in qede_alloc_mem_rxq()
1510 rxq->rx_buf_size = NET_IP_ALIGN + ETH_OVERHEAD + edev->ndev->mtu; in qede_alloc_mem_rxq()
1512 rxq->rx_headroom = edev->xdp_prog ? XDP_PACKET_HEADROOM : NET_SKB_PAD; in qede_alloc_mem_rxq()
1523 if (!edev->xdp_prog) { in qede_alloc_mem_rxq()
1528 edev->ndev->features &= ~NETIF_F_GRO_HW; in qede_alloc_mem_rxq()
1535 DP_ERR(edev, "Rx buffers ring allocation failed\n"); in qede_alloc_mem_rxq()
1545 rc = edev->ops->common->chain_alloc(cdev, &rxq->rx_bd_ring, ¶ms); in qede_alloc_mem_rxq()
1554 rc = edev->ops->common->chain_alloc(cdev, &rxq->rx_comp_ring, ¶ms); in qede_alloc_mem_rxq()
1563 DP_ERR(edev, in qede_alloc_mem_rxq()
1569 edev->gro_disable = !(edev->ndev->features & NETIF_F_GRO_HW); in qede_alloc_mem_rxq()
1570 if (!edev->gro_disable) in qede_alloc_mem_rxq()
1576 static void qede_free_mem_txq(struct qede_dev *edev, struct qede_tx_queue *txq) in qede_free_mem_txq() argument
1585 edev->ops->common->chain_free(edev->cdev, &txq->tx_pbl); in qede_free_mem_txq()
1589 static int qede_alloc_mem_txq(struct qede_dev *edev, struct qede_tx_queue *txq) in qede_alloc_mem_txq() argument
1595 .num_elems = edev->q_num_tx_buffers, in qede_alloc_mem_txq()
1600 txq->num_tx_buffers = edev->q_num_tx_buffers; in qede_alloc_mem_txq()
1615 rc = edev->ops->common->chain_alloc(edev->cdev, &txq->tx_pbl, ¶ms); in qede_alloc_mem_txq()
1622 qede_free_mem_txq(edev, txq); in qede_alloc_mem_txq()
1627 static void qede_free_mem_fp(struct qede_dev *edev, struct qede_fastpath *fp) in qede_free_mem_fp() argument
1629 qede_free_mem_sb(edev, fp->sb_info, fp->id); in qede_free_mem_fp()
1632 qede_free_mem_rxq(edev, fp->rxq); in qede_free_mem_fp()
1635 qede_free_mem_txq(edev, fp->xdp_tx); in qede_free_mem_fp()
1640 for_each_cos_in_txq(edev, cos) in qede_free_mem_fp()
1641 qede_free_mem_txq(edev, &fp->txq[cos]); in qede_free_mem_fp()
1648 static int qede_alloc_mem_fp(struct qede_dev *edev, struct qede_fastpath *fp) in qede_alloc_mem_fp() argument
1652 rc = qede_alloc_mem_sb(edev, fp->sb_info, fp->id); in qede_alloc_mem_fp()
1657 rc = qede_alloc_mem_rxq(edev, fp->rxq); in qede_alloc_mem_fp()
1663 rc = qede_alloc_mem_txq(edev, fp->xdp_tx); in qede_alloc_mem_fp()
1671 for_each_cos_in_txq(edev, cos) { in qede_alloc_mem_fp()
1672 rc = qede_alloc_mem_txq(edev, &fp->txq[cos]); in qede_alloc_mem_fp()
1682 static void qede_free_mem_load(struct qede_dev *edev) in qede_free_mem_load() argument
1687 struct qede_fastpath *fp = &edev->fp_array[i]; in qede_free_mem_load()
1689 qede_free_mem_fp(edev, fp); in qede_free_mem_load()
1694 static int qede_alloc_mem_load(struct qede_dev *edev) in qede_alloc_mem_load() argument
1698 for (queue_id = 0; queue_id < QEDE_QUEUE_CNT(edev); queue_id++) { in qede_alloc_mem_load()
1699 struct qede_fastpath *fp = &edev->fp_array[queue_id]; in qede_alloc_mem_load()
1701 rc = qede_alloc_mem_fp(edev, fp); in qede_alloc_mem_load()
1703 DP_ERR(edev, in qede_alloc_mem_load()
1706 qede_free_mem_load(edev); in qede_alloc_mem_load()
1714 static void qede_empty_tx_queue(struct qede_dev *edev, in qede_empty_tx_queue() argument
1721 netdev_txq = netdev_get_tx_queue(edev->ndev, txq->ndev_txq_id); in qede_empty_tx_queue()
1725 DP_VERBOSE(edev, NETIF_MSG_IFDOWN, in qede_empty_tx_queue()
1730 rc = qede_free_tx_pkt(edev, txq, &len); in qede_empty_tx_queue()
1732 DP_NOTICE(edev, in qede_empty_tx_queue()
1748 static void qede_empty_tx_queues(struct qede_dev *edev) in qede_empty_tx_queues() argument
1753 if (edev->fp_array[i].type & QEDE_FASTPATH_TX) { in qede_empty_tx_queues()
1756 for_each_cos_in_txq(edev, cos) { in qede_empty_tx_queues()
1759 fp = &edev->fp_array[i]; in qede_empty_tx_queues()
1760 qede_empty_tx_queue(edev, in qede_empty_tx_queues()
1767 static void qede_init_fp(struct qede_dev *edev) in qede_init_fp() argument
1774 fp = &edev->fp_array[queue_id]; in qede_init_fp()
1776 fp->edev = edev; in qede_init_fp()
1780 fp->xdp_tx->index = QEDE_TXQ_IDX_TO_XDP(edev, in qede_init_fp()
1796 fp->rxq->dev = &edev->pdev->dev; in qede_init_fp()
1799 WARN_ON(xdp_rxq_info_reg(&fp->rxq->xdp_rxq, edev->ndev, in qede_init_fp()
1805 DP_NOTICE(edev, in qede_init_fp()
1813 for_each_cos_in_txq(edev, cos) { in qede_init_fp()
1819 ndev_tx_id = QEDE_TXQ_TO_NDEV_TXQ_ID(edev, txq); in qede_init_fp()
1822 if (edev->dev_info.is_legacy) in qede_init_fp()
1824 txq->dev = &edev->pdev->dev; in qede_init_fp()
1831 edev->ndev->name, queue_id); in qede_init_fp()
1835 edev->total_xdp_queues = QEDE_RSS_COUNT(edev); in qede_init_fp()
1836 DP_INFO(edev, "Total XDP queues: %u\n", edev->total_xdp_queues); in qede_init_fp()
1840 static int qede_set_real_num_queues(struct qede_dev *edev) in qede_set_real_num_queues() argument
1844 rc = netif_set_real_num_tx_queues(edev->ndev, in qede_set_real_num_queues()
1845 QEDE_TSS_COUNT(edev) * in qede_set_real_num_queues()
1846 edev->dev_info.num_tc); in qede_set_real_num_queues()
1848 DP_NOTICE(edev, "Failed to set real number of Tx queues\n"); in qede_set_real_num_queues()
1852 rc = netif_set_real_num_rx_queues(edev->ndev, QEDE_RSS_COUNT(edev)); in qede_set_real_num_queues()
1854 DP_NOTICE(edev, "Failed to set real number of Rx queues\n"); in qede_set_real_num_queues()
1861 static void qede_napi_disable_remove(struct qede_dev *edev) in qede_napi_disable_remove() argument
1866 napi_disable(&edev->fp_array[i].napi); in qede_napi_disable_remove()
1868 netif_napi_del(&edev->fp_array[i].napi); in qede_napi_disable_remove()
1872 static void qede_napi_add_enable(struct qede_dev *edev) in qede_napi_add_enable() argument
1878 netif_napi_add(edev->ndev, &edev->fp_array[i].napi, in qede_napi_add_enable()
1880 napi_enable(&edev->fp_array[i].napi); in qede_napi_add_enable()
1884 static void qede_sync_free_irqs(struct qede_dev *edev) in qede_sync_free_irqs() argument
1888 for (i = 0; i < edev->int_info.used_cnt; i++) { in qede_sync_free_irqs()
1889 if (edev->int_info.msix_cnt) { in qede_sync_free_irqs()
1890 synchronize_irq(edev->int_info.msix[i].vector); in qede_sync_free_irqs()
1891 free_irq(edev->int_info.msix[i].vector, in qede_sync_free_irqs()
1892 &edev->fp_array[i]); in qede_sync_free_irqs()
1894 edev->ops->common->simd_handler_clean(edev->cdev, i); in qede_sync_free_irqs()
1898 edev->int_info.used_cnt = 0; in qede_sync_free_irqs()
1899 edev->int_info.msix_cnt = 0; in qede_sync_free_irqs()
1902 static int qede_req_msix_irqs(struct qede_dev *edev) in qede_req_msix_irqs() argument
1907 if (QEDE_QUEUE_CNT(edev) > edev->int_info.msix_cnt) { in qede_req_msix_irqs()
1908 DP_ERR(edev, in qede_req_msix_irqs()
1910 QEDE_QUEUE_CNT(edev), edev->int_info.msix_cnt); in qede_req_msix_irqs()
1914 for (i = 0; i < QEDE_QUEUE_CNT(edev); i++) { in qede_req_msix_irqs()
1916 struct qede_fastpath *fp = &edev->fp_array[i]; in qede_req_msix_irqs()
1918 if (edev->ndev->rx_cpu_rmap && (fp->type & QEDE_FASTPATH_RX)) { in qede_req_msix_irqs()
1919 rc = irq_cpu_rmap_add(edev->ndev->rx_cpu_rmap, in qede_req_msix_irqs()
1920 edev->int_info.msix[i].vector); in qede_req_msix_irqs()
1922 DP_ERR(edev, "Failed to add CPU rmap\n"); in qede_req_msix_irqs()
1923 qede_free_arfs(edev); in qede_req_msix_irqs()
1927 rc = request_irq(edev->int_info.msix[i].vector, in qede_req_msix_irqs()
1928 qede_msix_fp_int, 0, edev->fp_array[i].name, in qede_req_msix_irqs()
1929 &edev->fp_array[i]); in qede_req_msix_irqs()
1931 DP_ERR(edev, "Request fp %d irq failed\n", i); in qede_req_msix_irqs()
1933 if (edev->ndev->rx_cpu_rmap) in qede_req_msix_irqs()
1934 free_irq_cpu_rmap(edev->ndev->rx_cpu_rmap); in qede_req_msix_irqs()
1936 edev->ndev->rx_cpu_rmap = NULL; in qede_req_msix_irqs()
1938 qede_sync_free_irqs(edev); in qede_req_msix_irqs()
1941 DP_VERBOSE(edev, NETIF_MSG_INTR, in qede_req_msix_irqs()
1943 edev->fp_array[i].name, i, in qede_req_msix_irqs()
1944 &edev->fp_array[i]); in qede_req_msix_irqs()
1945 edev->int_info.used_cnt++; in qede_req_msix_irqs()
1958 static int qede_setup_irqs(struct qede_dev *edev) in qede_setup_irqs() argument
1963 rc = edev->ops->common->get_fp_int(edev->cdev, &edev->int_info); in qede_setup_irqs()
1967 if (edev->int_info.msix_cnt) { in qede_setup_irqs()
1968 rc = qede_req_msix_irqs(edev); in qede_setup_irqs()
1971 edev->ndev->irq = edev->int_info.msix[0].vector; in qede_setup_irqs()
1976 ops = edev->ops->common; in qede_setup_irqs()
1977 for (i = 0; i < QEDE_QUEUE_CNT(edev); i++) in qede_setup_irqs()
1978 ops->simd_handler_config(edev->cdev, in qede_setup_irqs()
1979 &edev->fp_array[i], i, in qede_setup_irqs()
1981 edev->int_info.used_cnt = QEDE_QUEUE_CNT(edev); in qede_setup_irqs()
1986 static int qede_drain_txq(struct qede_dev *edev, in qede_drain_txq() argument
1994 DP_NOTICE(edev, in qede_drain_txq()
1997 rc = edev->ops->common->drain(edev->cdev); in qede_drain_txq()
2000 return qede_drain_txq(edev, txq, false); in qede_drain_txq()
2002 DP_NOTICE(edev, in qede_drain_txq()
2019 static int qede_stop_txq(struct qede_dev *edev, in qede_stop_txq() argument
2023 edev->ops->common->db_recovery_del(edev->cdev, txq->doorbell_addr, in qede_stop_txq()
2026 return edev->ops->q_tx_stop(edev->cdev, rss_id, txq->handle); in qede_stop_txq()
2029 static int qede_stop_queues(struct qede_dev *edev) in qede_stop_queues() argument
2032 struct qed_dev *cdev = edev->cdev; in qede_stop_queues()
2046 rc = edev->ops->vport_update(cdev, vport_update_params); in qede_stop_queues()
2050 DP_ERR(edev, "Failed to update vport\n"); in qede_stop_queues()
2056 fp = &edev->fp_array[i]; in qede_stop_queues()
2061 for_each_cos_in_txq(edev, cos) { in qede_stop_queues()
2062 rc = qede_drain_txq(edev, &fp->txq[cos], true); in qede_stop_queues()
2069 rc = qede_drain_txq(edev, fp->xdp_tx, true); in qede_stop_queues()
2076 for (i = QEDE_QUEUE_CNT(edev) - 1; i >= 0; i--) { in qede_stop_queues()
2077 fp = &edev->fp_array[i]; in qede_stop_queues()
2083 for_each_cos_in_txq(edev, cos) { in qede_stop_queues()
2084 rc = qede_stop_txq(edev, &fp->txq[cos], i); in qede_stop_queues()
2092 rc = edev->ops->q_rx_stop(cdev, i, fp->rxq->handle); in qede_stop_queues()
2094 DP_ERR(edev, "Failed to stop RXQ #%d\n", i); in qede_stop_queues()
2101 rc = qede_stop_txq(edev, fp->xdp_tx, i); in qede_stop_queues()
2110 rc = edev->ops->vport_stop(cdev, 0); in qede_stop_queues()
2112 DP_ERR(edev, "Failed to stop VPORT\n"); in qede_stop_queues()
2117 static int qede_start_txq(struct qede_dev *edev, in qede_start_txq() argument
2134 params.queue_id = QEDE_TXQ_XDP_TO_IDX(edev, txq); in qede_start_txq()
2142 rc = edev->ops->q_tx_start(edev->cdev, rss_id, ¶ms, phys_table, in qede_start_txq()
2145 DP_ERR(edev, "Start TXQ #%d failed %d\n", txq->index, rc); in qede_start_txq()
2163 rc = edev->ops->common->db_recovery_add(edev->cdev, txq->doorbell_addr, in qede_start_txq()
2170 static int qede_start_queues(struct qede_dev *edev, bool clear_stats) in qede_start_queues() argument
2173 struct qed_dev *cdev = edev->cdev; in qede_start_queues()
2174 struct qed_dev_info *qed_info = &edev->dev_info.common; in qede_start_queues()
2180 if (!edev->num_queues) { in qede_start_queues()
2181 DP_ERR(edev, in qede_start_queues()
2190 start.handle_ptp_pkts = !!(edev->ptp); in qede_start_queues()
2191 start.gro_enable = !edev->gro_disable; in qede_start_queues()
2192 start.mtu = edev->ndev->mtu; in qede_start_queues()
2198 rc = edev->ops->vport_start(cdev, &start); in qede_start_queues()
2201 DP_ERR(edev, "Start V-PORT failed %d\n", rc); in qede_start_queues()
2205 DP_VERBOSE(edev, NETIF_MSG_IFUP, in qede_start_queues()
2207 start.vport_id, edev->ndev->mtu + 0xe, vlan_removal_en); in qede_start_queues()
2210 struct qede_fastpath *fp = &edev->fp_array[i]; in qede_start_queues()
2230 rc = edev->ops->q_rx_start(cdev, i, &q_params, in qede_start_queues()
2236 DP_ERR(edev, "Start RXQ #%d failed %d\n", i, in qede_start_queues()
2248 qede_update_rx_prod(edev, rxq); in qede_start_queues()
2252 rc = qede_start_txq(edev, fp, fp->xdp_tx, i, XDP_PI); in qede_start_queues()
2256 bpf_prog_add(edev->xdp_prog, 1); in qede_start_queues()
2257 fp->rxq->xdp_prog = edev->xdp_prog; in qede_start_queues()
2263 for_each_cos_in_txq(edev, cos) { in qede_start_queues()
2264 rc = qede_start_txq(edev, fp, &fp->txq[cos], i, in qede_start_queues()
2277 if ((qed_info->b_inter_pf_switch || pci_num_vf(edev->pdev)) && in qede_start_queues()
2283 qede_fill_rss_params(edev, &vport_update_params->rss_params, in qede_start_queues()
2286 rc = edev->ops->vport_update(cdev, vport_update_params); in qede_start_queues()
2288 DP_ERR(edev, "Update V-PORT failed %d\n", rc); in qede_start_queues()
2300 static void qede_unload(struct qede_dev *edev, enum qede_unload_mode mode, in qede_unload() argument
2306 DP_INFO(edev, "Starting qede unload\n"); in qede_unload()
2309 __qede_lock(edev); in qede_unload()
2311 clear_bit(QEDE_FLAGS_LINK_REQUESTED, &edev->flags); in qede_unload()
2314 edev->state = QEDE_STATE_CLOSED; in qede_unload()
2316 qede_rdma_dev_event_close(edev); in qede_unload()
2319 netif_tx_disable(edev->ndev); in qede_unload()
2320 netif_carrier_off(edev->ndev); in qede_unload()
2326 edev->ops->common->set_link(edev->cdev, &link_params); in qede_unload()
2328 rc = qede_stop_queues(edev); in qede_unload()
2331 if (edev->dev_info.common.b_arfs_capable) { in qede_unload()
2332 qede_poll_for_freeing_arfs_filters(edev); in qede_unload()
2333 if (edev->ndev->rx_cpu_rmap) in qede_unload()
2334 free_irq_cpu_rmap(edev->ndev->rx_cpu_rmap); in qede_unload()
2336 edev->ndev->rx_cpu_rmap = NULL; in qede_unload()
2339 qede_sync_free_irqs(edev); in qede_unload()
2343 DP_INFO(edev, "Stopped Queues\n"); in qede_unload()
2346 qede_vlan_mark_nonconfigured(edev); in qede_unload()
2347 edev->ops->fastpath_stop(edev->cdev); in qede_unload()
2349 if (edev->dev_info.common.b_arfs_capable) { in qede_unload()
2350 qede_poll_for_freeing_arfs_filters(edev); in qede_unload()
2351 qede_free_arfs(edev); in qede_unload()
2355 qede_sync_free_irqs(edev); in qede_unload()
2356 edev->ops->common->set_fp_int(edev->cdev, 0); in qede_unload()
2358 qede_napi_disable_remove(edev); in qede_unload()
2361 qede_empty_tx_queues(edev); in qede_unload()
2363 qede_free_mem_load(edev); in qede_unload()
2364 qede_free_fp_array(edev); in qede_unload()
2368 __qede_unlock(edev); in qede_unload()
2371 DP_NOTICE(edev, "Link is down\n"); in qede_unload()
2373 edev->ptp_skip_txts = 0; in qede_unload()
2375 DP_INFO(edev, "Ending qede unload\n"); in qede_unload()
2384 static int qede_load(struct qede_dev *edev, enum qede_load_mode mode, in qede_load() argument
2392 DP_INFO(edev, "Starting qede load\n"); in qede_load()
2395 __qede_lock(edev); in qede_load()
2397 rc = qede_set_num_queues(edev); in qede_load()
2401 rc = qede_alloc_fp_array(edev); in qede_load()
2405 qede_init_fp(edev); in qede_load()
2407 rc = qede_alloc_mem_load(edev); in qede_load()
2410 DP_INFO(edev, "Allocated %d Rx, %d Tx queues\n", in qede_load()
2411 QEDE_RSS_COUNT(edev), QEDE_TSS_COUNT(edev)); in qede_load()
2413 rc = qede_set_real_num_queues(edev); in qede_load()
2417 if (qede_alloc_arfs(edev)) { in qede_load()
2418 edev->ndev->features &= ~NETIF_F_NTUPLE; in qede_load()
2419 edev->dev_info.common.b_arfs_capable = false; in qede_load()
2422 qede_napi_add_enable(edev); in qede_load()
2423 DP_INFO(edev, "Napi added and enabled\n"); in qede_load()
2425 rc = qede_setup_irqs(edev); in qede_load()
2428 DP_INFO(edev, "Setup IRQs succeeded\n"); in qede_load()
2430 rc = qede_start_queues(edev, mode != QEDE_LOAD_RELOAD); in qede_load()
2433 DP_INFO(edev, "Start VPORT, RXQ and TXQ succeeded\n"); in qede_load()
2435 num_tc = netdev_get_num_tc(edev->ndev); in qede_load()
2436 num_tc = num_tc ? num_tc : edev->dev_info.num_tc; in qede_load()
2437 qede_setup_tc(edev->ndev, num_tc); in qede_load()
2440 qede_configure_vlan_filters(edev); in qede_load()
2442 set_bit(QEDE_FLAGS_LINK_REQUESTED, &edev->flags); in qede_load()
2447 edev->ops->common->set_link(edev->cdev, &link_params); in qede_load()
2449 edev->state = QEDE_STATE_OPEN; in qede_load()
2455 if (edev->coal_entry[i].isvalid) { in qede_load()
2456 coal.rx_coalesce_usecs = edev->coal_entry[i].rxc; in qede_load()
2457 coal.tx_coalesce_usecs = edev->coal_entry[i].txc; in qede_load()
2459 __qede_unlock(edev); in qede_load()
2460 qede_set_per_coalesce(edev->ndev, i, &coal); in qede_load()
2461 __qede_lock(edev); in qede_load()
2463 DP_INFO(edev, "Ending successfully qede load\n"); in qede_load()
2467 qede_sync_free_irqs(edev); in qede_load()
2469 qede_napi_disable_remove(edev); in qede_load()
2471 qede_free_mem_load(edev); in qede_load()
2473 edev->ops->common->set_fp_int(edev->cdev, 0); in qede_load()
2474 qede_free_fp_array(edev); in qede_load()
2475 edev->num_queues = 0; in qede_load()
2476 edev->fp_num_tx = 0; in qede_load()
2477 edev->fp_num_rx = 0; in qede_load()
2480 __qede_unlock(edev); in qede_load()
2488 void qede_reload(struct qede_dev *edev, in qede_reload() argument
2492 __qede_lock(edev); in qede_reload()
2498 if (edev->state == QEDE_STATE_OPEN) { in qede_reload()
2499 qede_unload(edev, QEDE_UNLOAD_NORMAL, true); in qede_reload()
2501 args->func(edev, args); in qede_reload()
2502 qede_load(edev, QEDE_LOAD_RELOAD, true); in qede_reload()
2505 qede_config_rx_mode(edev->ndev); in qede_reload()
2507 args->func(edev, args); in qede_reload()
2511 __qede_unlock(edev); in qede_reload()
2517 struct qede_dev *edev = netdev_priv(ndev); in qede_open() local
2522 edev->ops->common->set_power_state(edev->cdev, PCI_D0); in qede_open()
2524 rc = qede_load(edev, QEDE_LOAD_NORMAL, false); in qede_open()
2530 edev->ops->common->update_drv_state(edev->cdev, true); in qede_open()
2537 struct qede_dev *edev = netdev_priv(ndev); in qede_close() local
2539 qede_unload(edev, QEDE_UNLOAD_NORMAL, false); in qede_close()
2541 if (edev->cdev) in qede_close()
2542 edev->ops->common->update_drv_state(edev->cdev, false); in qede_close()
2549 struct qede_dev *edev = dev; in qede_link_update() local
2551 if (!test_bit(QEDE_FLAGS_LINK_REQUESTED, &edev->flags)) { in qede_link_update()
2552 DP_VERBOSE(edev, NETIF_MSG_LINK, "Interface is not ready\n"); in qede_link_update()
2557 if (!netif_carrier_ok(edev->ndev)) { in qede_link_update()
2558 DP_NOTICE(edev, "Link is up\n"); in qede_link_update()
2559 netif_tx_start_all_queues(edev->ndev); in qede_link_update()
2560 netif_carrier_on(edev->ndev); in qede_link_update()
2561 qede_rdma_dev_event_open(edev); in qede_link_update()
2564 if (netif_carrier_ok(edev->ndev)) { in qede_link_update()
2565 DP_NOTICE(edev, "Link is down\n"); in qede_link_update()
2566 netif_tx_disable(edev->ndev); in qede_link_update()
2567 netif_carrier_off(edev->ndev); in qede_link_update()
2568 qede_rdma_dev_event_close(edev); in qede_link_update()
2575 struct qede_dev *edev = dev; in qede_schedule_recovery_handler() local
2577 if (edev->state == QEDE_STATE_RECOVERY) { in qede_schedule_recovery_handler()
2578 DP_NOTICE(edev, in qede_schedule_recovery_handler()
2583 set_bit(QEDE_SP_RECOVERY, &edev->sp_flags); in qede_schedule_recovery_handler()
2584 schedule_delayed_work(&edev->sp_task, 0); in qede_schedule_recovery_handler()
2586 DP_INFO(edev, "Scheduled a recovery handler\n"); in qede_schedule_recovery_handler()
2589 static void qede_recovery_failed(struct qede_dev *edev) in qede_recovery_failed() argument
2591 netdev_err(edev->ndev, "Recovery handling has failed. Power cycle is needed.\n"); in qede_recovery_failed()
2593 netif_device_detach(edev->ndev); in qede_recovery_failed()
2595 if (edev->cdev) in qede_recovery_failed()
2596 edev->ops->common->set_power_state(edev->cdev, PCI_D3hot); in qede_recovery_failed()
2599 static void qede_recovery_handler(struct qede_dev *edev) in qede_recovery_handler() argument
2601 u32 curr_state = edev->state; in qede_recovery_handler()
2604 DP_NOTICE(edev, "Starting a recovery process\n"); in qede_recovery_handler()
2609 edev->state = QEDE_STATE_RECOVERY; in qede_recovery_handler()
2611 edev->ops->common->recovery_prolog(edev->cdev); in qede_recovery_handler()
2614 qede_unload(edev, QEDE_UNLOAD_RECOVERY, true); in qede_recovery_handler()
2616 __qede_remove(edev->pdev, QEDE_REMOVE_RECOVERY); in qede_recovery_handler()
2618 rc = __qede_probe(edev->pdev, edev->dp_module, edev->dp_level, in qede_recovery_handler()
2619 IS_VF(edev), QEDE_PROBE_RECOVERY); in qede_recovery_handler()
2621 edev->cdev = NULL; in qede_recovery_handler()
2626 rc = qede_load(edev, QEDE_LOAD_RECOVERY, true); in qede_recovery_handler()
2630 qede_config_rx_mode(edev->ndev); in qede_recovery_handler()
2631 udp_tunnel_nic_reset_ntf(edev->ndev); in qede_recovery_handler()
2634 edev->state = curr_state; in qede_recovery_handler()
2636 DP_NOTICE(edev, "Recovery handling is done\n"); in qede_recovery_handler()
2641 qede_recovery_failed(edev); in qede_recovery_handler()
2644 static void qede_atomic_hw_err_handler(struct qede_dev *edev) in qede_atomic_hw_err_handler() argument
2646 struct qed_dev *cdev = edev->cdev; in qede_atomic_hw_err_handler()
2648 DP_NOTICE(edev, in qede_atomic_hw_err_handler()
2650 edev->err_flags); in qede_atomic_hw_err_handler()
2653 WARN_ON(test_bit(QEDE_ERR_WARN, &edev->err_flags)); in qede_atomic_hw_err_handler()
2656 if (test_bit(QEDE_ERR_ATTN_CLR_EN, &edev->err_flags)) in qede_atomic_hw_err_handler()
2657 edev->ops->common->attn_clr_enable(cdev, true); in qede_atomic_hw_err_handler()
2659 DP_NOTICE(edev, "Generic non-sleepable HW error handling is done\n"); in qede_atomic_hw_err_handler()
2662 static void qede_generic_hw_err_handler(struct qede_dev *edev) in qede_generic_hw_err_handler() argument
2664 DP_NOTICE(edev, in qede_generic_hw_err_handler()
2666 edev->err_flags); in qede_generic_hw_err_handler()
2668 if (edev->devlink) { in qede_generic_hw_err_handler()
2669 DP_NOTICE(edev, "Reporting fatal error to devlink\n"); in qede_generic_hw_err_handler()
2670 edev->ops->common->report_fatal_error(edev->devlink, edev->last_err_type); in qede_generic_hw_err_handler()
2673 clear_bit(QEDE_ERR_IS_HANDLED, &edev->err_flags); in qede_generic_hw_err_handler()
2675 DP_NOTICE(edev, "Generic sleepable HW error handling is done\n"); in qede_generic_hw_err_handler()
2678 static void qede_set_hw_err_flags(struct qede_dev *edev, in qede_set_hw_err_flags() argument
2698 DP_NOTICE(edev, "Unexpected HW error [%d]\n", err_type); in qede_set_hw_err_flags()
2702 edev->err_flags |= err_flags; in qede_set_hw_err_flags()
2708 struct qede_dev *edev = dev; in qede_schedule_hw_err_handler() local
2713 if ((test_and_set_bit(QEDE_ERR_IS_HANDLED, &edev->err_flags) || in qede_schedule_hw_err_handler()
2714 edev->state == QEDE_STATE_RECOVERY) && in qede_schedule_hw_err_handler()
2716 DP_INFO(edev, in qede_schedule_hw_err_handler()
2722 DP_NOTICE(edev, "Unknown HW error [%d]\n", err_type); in qede_schedule_hw_err_handler()
2723 clear_bit(QEDE_ERR_IS_HANDLED, &edev->err_flags); in qede_schedule_hw_err_handler()
2727 edev->last_err_type = err_type; in qede_schedule_hw_err_handler()
2728 qede_set_hw_err_flags(edev, err_type); in qede_schedule_hw_err_handler()
2729 qede_atomic_hw_err_handler(edev); in qede_schedule_hw_err_handler()
2730 set_bit(QEDE_SP_HW_ERR, &edev->sp_flags); in qede_schedule_hw_err_handler()
2731 schedule_delayed_work(&edev->sp_task, 0); in qede_schedule_hw_err_handler()
2733 DP_INFO(edev, "Scheduled a error handler [err_type %d]\n", err_type); in qede_schedule_hw_err_handler()
2736 static bool qede_is_txq_full(struct qede_dev *edev, struct qede_tx_queue *txq) in qede_is_txq_full() argument
2740 netdev_txq = netdev_get_tx_queue(edev->ndev, txq->ndev_txq_id); in qede_is_txq_full()
2749 struct qede_dev *edev = dev; in qede_get_generic_tlv_data() local
2753 if (edev->ndev->features & NETIF_F_IP_CSUM) in qede_get_generic_tlv_data()
2755 if (edev->ndev->features & NETIF_F_TSO) in qede_get_generic_tlv_data()
2758 ether_addr_copy(data->mac[0], edev->ndev->dev_addr); in qede_get_generic_tlv_data()
2762 netif_addr_lock_bh(edev->ndev); in qede_get_generic_tlv_data()
2764 netdev_for_each_uc_addr(ha, edev->ndev) { in qede_get_generic_tlv_data()
2770 netif_addr_unlock_bh(edev->ndev); in qede_get_generic_tlv_data()
2776 struct qede_dev *edev = dev; in qede_get_eth_tlv_data() local
2784 etlv->prom_mode = !!(edev->ndev->flags & IFF_PROMISC); in qede_get_eth_tlv_data()
2786 etlv->tx_descr_size = QEDE_TSS_COUNT(edev); in qede_get_eth_tlv_data()
2788 etlv->rx_descr_size = QEDE_RSS_COUNT(edev); in qede_get_eth_tlv_data()
2801 __qede_lock(edev); in qede_get_eth_tlv_data()
2803 fp = &edev->fp_array[i]; in qede_get_eth_tlv_data()
2809 if (qede_is_txq_full(edev, txq)) in qede_get_eth_tlv_data()
2826 __qede_unlock(edev); in qede_get_eth_tlv_data()
2849 struct qede_dev *edev = netdev_priv(dev); in qede_io_error_detected() local
2851 if (!edev) in qede_io_error_detected()
2854 DP_NOTICE(edev, "IO error detected [%d]\n", state); in qede_io_error_detected()
2856 __qede_lock(edev); in qede_io_error_detected()
2857 if (edev->state == QEDE_STATE_RECOVERY) { in qede_io_error_detected()
2858 DP_NOTICE(edev, "Device already in the recovery state\n"); in qede_io_error_detected()
2859 __qede_unlock(edev); in qede_io_error_detected()
2864 if (IS_VF(edev)) { in qede_io_error_detected()
2865 DP_VERBOSE(edev, QED_MSG_IOV, in qede_io_error_detected()
2867 __qede_unlock(edev); in qede_io_error_detected()
2872 netif_tx_disable(edev->ndev); in qede_io_error_detected()
2873 netif_carrier_off(edev->ndev); in qede_io_error_detected()
2875 set_bit(QEDE_SP_AER, &edev->sp_flags); in qede_io_error_detected()
2876 schedule_delayed_work(&edev->sp_task, 0); in qede_io_error_detected()
2878 __qede_unlock(edev); in qede_io_error_detected()