Lines Matching refs:edev

110 static void qede_recovery_handler(struct qede_dev *edev);
113 static void qede_get_eth_tlv_data(void *edev, void *data);
114 static void qede_get_generic_tlv_data(void *edev,
116 static void qede_generic_hw_err_handler(struct qede_dev *edev);
121 struct qede_dev *edev = netdev_priv(ndev); in qede_set_vf_vlan() local
124 DP_NOTICE(edev, "Illegal vlan value %d\n", vlan); in qede_set_vf_vlan()
131 DP_VERBOSE(edev, QED_MSG_IOV, "Setting Vlan 0x%04x to VF [%d]\n", in qede_set_vf_vlan()
134 return edev->ops->iov->set_vlan(edev->cdev, vlan, vf); in qede_set_vf_vlan()
139 struct qede_dev *edev = netdev_priv(ndev); in qede_set_vf_mac() local
141 DP_VERBOSE(edev, QED_MSG_IOV, "Setting MAC %pM to VF [%d]\n", mac, vfidx); in qede_set_vf_mac()
144 DP_VERBOSE(edev, QED_MSG_IOV, "MAC address isn't valid\n"); in qede_set_vf_mac()
148 return edev->ops->iov->set_mac(edev->cdev, mac, vfidx); in qede_set_vf_mac()
153 struct qede_dev *edev = netdev_priv(pci_get_drvdata(pdev)); in qede_sriov_configure() local
154 struct qed_dev_info *qed_info = &edev->dev_info.common; in qede_sriov_configure()
161 DP_VERBOSE(edev, QED_MSG_IOV, "Requested %d VFs\n", num_vfs_param); in qede_sriov_configure()
163 rc = edev->ops->iov->configure(edev->cdev, num_vfs_param); in qede_sriov_configure()
166 if ((rc == num_vfs_param) && netif_running(edev->ndev) && in qede_sriov_configure()
171 edev->ops->vport_update(edev->cdev, vport_params); in qede_sriov_configure()
225 struct qede_dev *edev; in qede_netdev_event() local
238 edev = netdev_priv(ndev); in qede_netdev_event()
243 if (!edev->ops || !edev->ops->common) in qede_netdev_event()
245 edev->ops->common->set_name(edev->cdev, edev->ndev->name); in qede_netdev_event()
248 edev = netdev_priv(ndev); in qede_netdev_event()
249 qede_rdma_event_changeaddr(edev); in qede_netdev_event()
313 void qede_fill_by_demand_stats(struct qede_dev *edev) in qede_fill_by_demand_stats() argument
315 struct qede_stats_common *p_common = &edev->stats.common; in qede_fill_by_demand_stats()
318 edev->ops->get_vport_stats(edev->cdev, &stats); in qede_fill_by_demand_stats()
320 spin_lock(&edev->stats_lock); in qede_fill_by_demand_stats()
386 p_common->ptp_skip_txts = edev->ptp_skip_txts; in qede_fill_by_demand_stats()
388 if (QEDE_IS_BB(edev)) { in qede_fill_by_demand_stats()
389 struct qede_stats_bb *p_bb = &edev->stats.bb; in qede_fill_by_demand_stats()
412 struct qede_stats_ah *p_ah = &edev->stats.ah; in qede_fill_by_demand_stats()
420 spin_unlock(&edev->stats_lock); in qede_fill_by_demand_stats()
426 struct qede_dev *edev = netdev_priv(dev); in qede_get_stats64() local
429 p_common = &edev->stats.common; in qede_get_stats64()
431 spin_lock(&edev->stats_lock); in qede_get_stats64()
448 if (QEDE_IS_BB(edev)) in qede_get_stats64()
449 stats->collisions = edev->stats.bb.tx_total_collisions; in qede_get_stats64()
453 spin_unlock(&edev->stats_lock); in qede_get_stats64()
460 struct qede_dev *edev = netdev_priv(dev); in qede_get_vf_config() local
462 if (!edev->ops) in qede_get_vf_config()
465 return edev->ops->iov->get_config(edev->cdev, vfidx, ivi); in qede_get_vf_config()
471 struct qede_dev *edev = netdev_priv(dev); in qede_set_vf_rate() local
473 return edev->ops->iov->set_rate(edev->cdev, vfidx, min_tx_rate, in qede_set_vf_rate()
479 struct qede_dev *edev = netdev_priv(dev); in qede_set_vf_spoofchk() local
481 if (!edev->ops) in qede_set_vf_spoofchk()
484 return edev->ops->iov->set_spoof(edev->cdev, vfidx, val); in qede_set_vf_spoofchk()
490 struct qede_dev *edev = netdev_priv(dev); in qede_set_vf_link_state() local
492 if (!edev->ops) in qede_set_vf_link_state()
495 return edev->ops->iov->set_link_state(edev->cdev, vfidx, link_state); in qede_set_vf_link_state()
500 struct qede_dev *edev = netdev_priv(dev); in qede_set_vf_trust() local
502 if (!edev->ops) in qede_set_vf_trust()
505 return edev->ops->iov->set_trust(edev->cdev, vfidx, setting); in qede_set_vf_trust()
511 struct qede_dev *edev = netdev_priv(dev); in qede_ioctl() local
518 return qede_ptp_hw_ts(edev, ifr); in qede_ioctl()
520 DP_VERBOSE(edev, QED_MSG_DEBUG, in qede_ioctl()
528 static void qede_fp_sb_dump(struct qede_dev *edev, struct qede_fastpath *fp) in qede_fp_sb_dump() argument
536 DP_NOTICE(edev, in qede_fp_sb_dump()
543 qede_txq_fp_log_metadata(struct qede_dev *edev, in qede_txq_fp_log_metadata() argument
549 DP_NOTICE(edev, in qede_txq_fp_log_metadata()
555 DP_NOTICE(edev, in qede_txq_fp_log_metadata()
562 qede_tx_log_print(struct qede_dev *edev, struct qede_fastpath *fp, struct qede_tx_queue *txq) in qede_tx_log_print() argument
568 qede_fp_sb_dump(edev, fp); in qede_tx_log_print()
571 rc = edev->ops->common->get_sb_info(edev->cdev, fp->sb_info, (u16)fp->id, &sb_dbg); in qede_tx_log_print()
573 DP_NOTICE(edev, "IGU: prod %08x cons %08x CAU Tx %04x\n", in qede_tx_log_print()
577 edev->ops->common->mfw_report(edev->cdev, in qede_tx_log_print()
583 edev->ops->common->mfw_report(edev->cdev, in qede_tx_log_print()
592 struct qede_dev *edev = netdev_priv(dev); in qede_tx_timeout() local
596 DP_NOTICE(edev, "TX timeout on queue %u!\n", txqueue); in qede_tx_timeout()
603 fp = &edev->fp_array[i]; in qede_tx_timeout()
607 for_each_cos_in_txq(edev, cos) { in qede_tx_timeout()
611 qede_txq_fp_log_metadata(edev, fp, txq); in qede_tx_timeout()
615 qede_tx_log_print(edev, fp, txq); in qede_tx_timeout()
619 if (IS_VF(edev)) in qede_tx_timeout()
622 if (test_and_set_bit(QEDE_ERR_IS_HANDLED, &edev->err_flags) || in qede_tx_timeout()
623 edev->state == QEDE_STATE_RECOVERY) { in qede_tx_timeout()
624 DP_INFO(edev, in qede_tx_timeout()
629 set_bit(QEDE_ERR_GET_DBG_INFO, &edev->err_flags); in qede_tx_timeout()
630 set_bit(QEDE_SP_HW_ERR, &edev->sp_flags); in qede_tx_timeout()
631 schedule_delayed_work(&edev->sp_task, 0); in qede_tx_timeout()
636 struct qede_dev *edev = netdev_priv(ndev); in qede_setup_tc() local
639 if (num_tc > edev->dev_info.num_tc) in qede_setup_tc()
645 for_each_cos_in_txq(edev, cos) { in qede_setup_tc()
646 count = QEDE_TSS_COUNT(edev); in qede_setup_tc()
647 offset = cos * QEDE_TSS_COUNT(edev); in qede_setup_tc()
655 qede_set_flower(struct qede_dev *edev, struct flow_cls_offload *f, in qede_set_flower() argument
660 return qede_add_tc_flower_fltr(edev, proto, f); in qede_set_flower()
662 return qede_delete_flow_filter(edev, f->cookie); in qede_set_flower()
672 struct qede_dev *edev = cb_priv; in qede_setup_tc_block_cb() local
674 if (!tc_cls_can_offload_and_chain0(edev->ndev, type_data)) in qede_setup_tc_block_cb()
680 return qede_set_flower(edev, f, f->common.protocol); in qede_setup_tc_block_cb()
692 struct qede_dev *edev = netdev_priv(dev); in qede_setup_tc_offload() local
700 edev, edev, true); in qede_setup_tc_offload()
794 struct qede_dev *edev; in qede_alloc_etherdev() local
796 ndev = alloc_etherdev_mqs(sizeof(*edev), in qede_alloc_etherdev()
804 edev = netdev_priv(ndev); in qede_alloc_etherdev()
805 edev->ndev = ndev; in qede_alloc_etherdev()
806 edev->cdev = cdev; in qede_alloc_etherdev()
807 edev->pdev = pdev; in qede_alloc_etherdev()
808 edev->dp_module = dp_module; in qede_alloc_etherdev()
809 edev->dp_level = dp_level; in qede_alloc_etherdev()
810 edev->ops = qed_ops; in qede_alloc_etherdev()
813 edev->q_num_rx_buffers = NUM_RX_BDS_KDUMP_MIN; in qede_alloc_etherdev()
814 edev->q_num_tx_buffers = NUM_TX_BDS_KDUMP_MIN; in qede_alloc_etherdev()
816 edev->q_num_rx_buffers = NUM_RX_BDS_DEF; in qede_alloc_etherdev()
817 edev->q_num_tx_buffers = NUM_TX_BDS_DEF; in qede_alloc_etherdev()
820 DP_INFO(edev, "Allocated netdev with %d tx queues and %d rx queues\n", in qede_alloc_etherdev()
825 memset(&edev->stats, 0, sizeof(edev->stats)); in qede_alloc_etherdev()
826 memcpy(&edev->dev_info, info, sizeof(*info)); in qede_alloc_etherdev()
831 if (edev->dev_info.common.wol_support) in qede_alloc_etherdev()
832 edev->wol_enabled = true; in qede_alloc_etherdev()
834 INIT_LIST_HEAD(&edev->vlan_list); in qede_alloc_etherdev()
836 return edev; in qede_alloc_etherdev()
839 static void qede_init_ndev(struct qede_dev *edev) in qede_init_ndev() argument
841 struct net_device *ndev = edev->ndev; in qede_init_ndev()
842 struct pci_dev *pdev = edev->pdev; in qede_init_ndev()
848 ndev->mem_start = edev->dev_info.common.pci_mem_start; in qede_init_ndev()
850 ndev->mem_end = edev->dev_info.common.pci_mem_end; in qede_init_ndev()
851 ndev->irq = edev->dev_info.common.pci_irq; in qede_init_ndev()
855 if (IS_VF(edev)) { in qede_init_ndev()
856 if (edev->dev_info.xdp_supported) in qede_init_ndev()
873 if (edev->dev_info.common.b_arfs_capable) in qede_init_ndev()
876 if (edev->dev_info.common.vxlan_enable || in qede_init_ndev()
877 edev->dev_info.common.geneve_enable) in qede_init_ndev()
880 if (udp_tunnel_enable || edev->dev_info.common.gre_enable) { in qede_init_ndev()
894 qede_set_udp_tunnels(edev); in qede_init_ndev()
897 if (edev->dev_info.common.gre_enable) { in qede_init_ndev()
919 eth_hw_addr_set(edev->ndev, edev->dev_info.common.hw_mac); in qede_init_ndev()
921 ndev->mtu = edev->dev_info.common.mtu; in qede_init_ndev()
950 static void qede_free_fp_array(struct qede_dev *edev) in qede_free_fp_array() argument
952 if (edev->fp_array) { in qede_free_fp_array()
957 fp = &edev->fp_array[i]; in qede_free_fp_array()
970 kfree(edev->fp_array); in qede_free_fp_array()
973 edev->num_queues = 0; in qede_free_fp_array()
974 edev->fp_num_tx = 0; in qede_free_fp_array()
975 edev->fp_num_rx = 0; in qede_free_fp_array()
978 static int qede_alloc_fp_array(struct qede_dev *edev) in qede_alloc_fp_array() argument
980 u8 fp_combined, fp_rx = edev->fp_num_rx; in qede_alloc_fp_array()
984 edev->fp_array = kcalloc(QEDE_QUEUE_CNT(edev), in qede_alloc_fp_array()
985 sizeof(*edev->fp_array), GFP_KERNEL); in qede_alloc_fp_array()
986 if (!edev->fp_array) { in qede_alloc_fp_array()
987 DP_NOTICE(edev, "fp array allocation failed\n"); in qede_alloc_fp_array()
991 if (!edev->coal_entry) { in qede_alloc_fp_array()
992 edev->coal_entry = kcalloc(QEDE_MAX_RSS_CNT(edev), in qede_alloc_fp_array()
993 sizeof(*edev->coal_entry), in qede_alloc_fp_array()
995 if (!edev->coal_entry) { in qede_alloc_fp_array()
996 DP_ERR(edev, "coalesce entry allocation failed\n"); in qede_alloc_fp_array()
1001 fp_combined = QEDE_QUEUE_CNT(edev) - fp_rx - edev->fp_num_tx; in qede_alloc_fp_array()
1009 fp = &edev->fp_array[i]; in qede_alloc_fp_array()
1013 DP_NOTICE(edev, "sb info struct allocation failed\n"); in qede_alloc_fp_array()
1028 fp->txq = kcalloc(edev->dev_info.num_tc, in qede_alloc_fp_array()
1039 if (edev->xdp_prog) { in qede_alloc_fp_array()
1051 qede_free_fp_array(edev); in qede_alloc_fp_array()
1058 void __qede_lock(struct qede_dev *edev) in __qede_lock() argument
1060 mutex_lock(&edev->qede_lock); in __qede_lock()
1063 void __qede_unlock(struct qede_dev *edev) in __qede_unlock() argument
1065 mutex_unlock(&edev->qede_lock); in __qede_unlock()
1071 static void qede_lock(struct qede_dev *edev) in qede_lock() argument
1074 __qede_lock(edev); in qede_lock()
1077 static void qede_unlock(struct qede_dev *edev) in qede_unlock() argument
1079 __qede_unlock(edev); in qede_unlock()
1085 struct qede_dev *edev = container_of(work, struct qede_dev, in qede_periodic_task() local
1088 qede_fill_by_demand_stats(edev); in qede_periodic_task()
1089 schedule_delayed_work(&edev->periodic_task, edev->stats_coal_ticks); in qede_periodic_task()
1092 static void qede_init_periodic_task(struct qede_dev *edev) in qede_init_periodic_task() argument
1094 INIT_DELAYED_WORK(&edev->periodic_task, qede_periodic_task); in qede_init_periodic_task()
1095 spin_lock_init(&edev->stats_lock); in qede_init_periodic_task()
1096 edev->stats_coal_usecs = USEC_PER_SEC; in qede_init_periodic_task()
1097 edev->stats_coal_ticks = usecs_to_jiffies(USEC_PER_SEC); in qede_init_periodic_task()
1102 struct qede_dev *edev = container_of(work, struct qede_dev, in qede_sp_task() local
1109 if (test_bit(QEDE_SP_DISABLE, &edev->sp_flags)) in qede_sp_task()
1118 if (test_and_clear_bit(QEDE_SP_RECOVERY, &edev->sp_flags)) { in qede_sp_task()
1119 cancel_delayed_work_sync(&edev->periodic_task); in qede_sp_task()
1124 if (pci_num_vf(edev->pdev)) in qede_sp_task()
1125 qede_sriov_configure(edev->pdev, 0); in qede_sp_task()
1127 qede_lock(edev); in qede_sp_task()
1128 qede_recovery_handler(edev); in qede_sp_task()
1129 qede_unlock(edev); in qede_sp_task()
1132 __qede_lock(edev); in qede_sp_task()
1134 if (test_and_clear_bit(QEDE_SP_RX_MODE, &edev->sp_flags)) in qede_sp_task()
1135 if (edev->state == QEDE_STATE_OPEN) in qede_sp_task()
1136 qede_config_rx_mode(edev->ndev); in qede_sp_task()
1139 if (test_and_clear_bit(QEDE_SP_ARFS_CONFIG, &edev->sp_flags)) { in qede_sp_task()
1140 if (edev->state == QEDE_STATE_OPEN) in qede_sp_task()
1141 qede_process_arfs_filters(edev, false); in qede_sp_task()
1144 if (test_and_clear_bit(QEDE_SP_HW_ERR, &edev->sp_flags)) in qede_sp_task()
1145 qede_generic_hw_err_handler(edev); in qede_sp_task()
1146 __qede_unlock(edev); in qede_sp_task()
1148 if (test_and_clear_bit(QEDE_SP_AER, &edev->sp_flags)) { in qede_sp_task()
1153 if (pci_num_vf(edev->pdev)) in qede_sp_task()
1154 qede_sriov_configure(edev->pdev, 0); in qede_sp_task()
1156 edev->ops->common->recovery_process(edev->cdev); in qede_sp_task()
1184 static void qede_log_probe(struct qede_dev *edev) in qede_log_probe() argument
1186 struct qed_dev_info *p_dev_info = &edev->dev_info.common; in qede_log_probe()
1214 pr_info("qede %02x:%02x.%02x: %s [%s]\n", edev->pdev->bus->number, in qede_log_probe()
1215 PCI_SLOT(edev->pdev->devfn), PCI_FUNC(edev->pdev->devfn), in qede_log_probe()
1216 buf, edev->ndev->name); in qede_log_probe()
1230 struct qede_dev *edev; in __qede_probe() local
1267 edev = qede_alloc_etherdev(cdev, pdev, &dev_info, dp_module, in __qede_probe()
1269 if (!edev) { in __qede_probe()
1274 edev->devlink = qed_ops->common->devlink_register(cdev); in __qede_probe()
1275 if (IS_ERR(edev->devlink)) { in __qede_probe()
1276 DP_NOTICE(edev, "Cannot register devlink\n"); in __qede_probe()
1277 rc = PTR_ERR(edev->devlink); in __qede_probe()
1278 edev->devlink = NULL; in __qede_probe()
1285 edev = netdev_priv(ndev); in __qede_probe()
1286 qdl = devlink_priv(edev->devlink); in __qede_probe()
1288 edev->cdev = cdev; in __qede_probe()
1289 memset(&edev->stats, 0, sizeof(edev->stats)); in __qede_probe()
1290 memcpy(&edev->dev_info, &dev_info, sizeof(dev_info)); in __qede_probe()
1294 set_bit(QEDE_FLAGS_IS_VF, &edev->flags); in __qede_probe()
1296 qede_init_ndev(edev); in __qede_probe()
1298 rc = qede_rdma_dev_add(edev, (mode == QEDE_PROBE_RECOVERY)); in __qede_probe()
1308 INIT_DELAYED_WORK(&edev->sp_task, qede_sp_task); in __qede_probe()
1309 mutex_init(&edev->qede_lock); in __qede_probe()
1310 qede_init_periodic_task(edev); in __qede_probe()
1312 rc = register_netdev(edev->ndev); in __qede_probe()
1314 DP_NOTICE(edev, "Cannot register net-device\n"); in __qede_probe()
1319 edev->ops->common->set_name(cdev, edev->ndev->name); in __qede_probe()
1323 qede_ptp_enable(edev); in __qede_probe()
1325 edev->ops->register_ops(cdev, &qede_ll_ops, edev); in __qede_probe()
1328 if (!IS_VF(edev)) in __qede_probe()
1329 qede_set_dcbnl_ops(edev->ndev); in __qede_probe()
1332 edev->rx_copybreak = QEDE_RX_HDR_SIZE; in __qede_probe()
1334 qede_log_probe(edev); in __qede_probe()
1337 if (edev->stats_coal_usecs) in __qede_probe()
1338 schedule_delayed_work(&edev->periodic_task, 0); in __qede_probe()
1343 qede_rdma_dev_remove(edev, (mode == QEDE_PROBE_RECOVERY)); in __qede_probe()
1346 free_netdev(edev->ndev); in __qede_probe()
1348 edev->cdev = NULL; in __qede_probe()
1388 struct qede_dev *edev; in __qede_remove() local
1396 edev = netdev_priv(ndev); in __qede_remove()
1397 cdev = edev->cdev; in __qede_remove()
1399 DP_INFO(edev, "Starting qede_remove\n"); in __qede_remove()
1401 qede_rdma_dev_remove(edev, (mode == QEDE_REMOVE_RECOVERY)); in __qede_remove()
1404 set_bit(QEDE_SP_DISABLE, &edev->sp_flags); in __qede_remove()
1407 cancel_delayed_work_sync(&edev->sp_task); in __qede_remove()
1408 cancel_delayed_work_sync(&edev->periodic_task); in __qede_remove()
1410 edev->ops->common->set_power_state(cdev, PCI_D0); in __qede_remove()
1415 qede_ptp_disable(edev); in __qede_remove()
1422 if (mode != QEDE_REMOVE_RECOVERY && edev->devlink) { in __qede_remove()
1423 qed_ops->common->devlink_unregister(edev->devlink); in __qede_remove()
1424 edev->devlink = NULL; in __qede_remove()
1427 edev->cdev = NULL; in __qede_remove()
1436 kfree(edev->coal_entry); in __qede_remove()
1458 static int qede_set_num_queues(struct qede_dev *edev) in qede_set_num_queues() argument
1464 if (edev->req_queues) in qede_set_num_queues()
1465 rss_num = edev->req_queues; in qede_set_num_queues()
1468 edev->dev_info.common.num_hwfns; in qede_set_num_queues()
1470 rss_num = min_t(u16, QEDE_MAX_RSS_CNT(edev), rss_num); in qede_set_num_queues()
1472 rc = edev->ops->common->set_fp_int(edev->cdev, rss_num); in qede_set_num_queues()
1475 edev->num_queues = rc; in qede_set_num_queues()
1476 DP_INFO(edev, "Managed %d [of %d] RSS queues\n", in qede_set_num_queues()
1477 QEDE_QUEUE_CNT(edev), rss_num); in qede_set_num_queues()
1481 edev->fp_num_tx = edev->req_num_tx; in qede_set_num_queues()
1482 edev->fp_num_rx = edev->req_num_rx; in qede_set_num_queues()
1487 static void qede_free_mem_sb(struct qede_dev *edev, struct qed_sb_info *sb_info, in qede_free_mem_sb() argument
1491 edev->ops->common->sb_release(edev->cdev, sb_info, sb_id, in qede_free_mem_sb()
1493 dma_free_coherent(&edev->pdev->dev, sizeof(*sb_info->sb_virt), in qede_free_mem_sb()
1500 static int qede_alloc_mem_sb(struct qede_dev *edev, in qede_alloc_mem_sb() argument
1507 sb_virt = dma_alloc_coherent(&edev->pdev->dev, in qede_alloc_mem_sb()
1510 DP_ERR(edev, "Status block allocation failed\n"); in qede_alloc_mem_sb()
1514 rc = edev->ops->common->sb_init(edev->cdev, sb_info, in qede_alloc_mem_sb()
1518 DP_ERR(edev, "Status block initialization failed\n"); in qede_alloc_mem_sb()
1519 dma_free_coherent(&edev->pdev->dev, sizeof(*sb_virt), in qede_alloc_mem_sb()
1527 static void qede_free_rx_buffers(struct qede_dev *edev, in qede_free_rx_buffers() argument
1539 dma_unmap_page(&edev->pdev->dev, in qede_free_rx_buffers()
1547 static void qede_free_mem_rxq(struct qede_dev *edev, struct qede_rx_queue *rxq) in qede_free_mem_rxq() argument
1550 qede_free_rx_buffers(edev, rxq); in qede_free_mem_rxq()
1556 edev->ops->common->chain_free(edev->cdev, &rxq->rx_bd_ring); in qede_free_mem_rxq()
1557 edev->ops->common->chain_free(edev->cdev, &rxq->rx_comp_ring); in qede_free_mem_rxq()
1572 static int qede_alloc_mem_rxq(struct qede_dev *edev, struct qede_rx_queue *rxq) in qede_alloc_mem_rxq() argument
1578 struct qed_dev *cdev = edev->cdev; in qede_alloc_mem_rxq()
1581 rxq->num_rx_buffers = edev->q_num_rx_buffers; in qede_alloc_mem_rxq()
1583 rxq->rx_buf_size = NET_IP_ALIGN + ETH_OVERHEAD + edev->ndev->mtu; in qede_alloc_mem_rxq()
1585 rxq->rx_headroom = edev->xdp_prog ? XDP_PACKET_HEADROOM : NET_SKB_PAD; in qede_alloc_mem_rxq()
1596 if (!edev->xdp_prog) { in qede_alloc_mem_rxq()
1601 edev->ndev->features &= ~NETIF_F_GRO_HW; in qede_alloc_mem_rxq()
1608 DP_ERR(edev, "Rx buffers ring allocation failed\n"); in qede_alloc_mem_rxq()
1618 rc = edev->ops->common->chain_alloc(cdev, &rxq->rx_bd_ring, &params); in qede_alloc_mem_rxq()
1627 rc = edev->ops->common->chain_alloc(cdev, &rxq->rx_comp_ring, &params); in qede_alloc_mem_rxq()
1636 DP_ERR(edev, in qede_alloc_mem_rxq()
1642 edev->gro_disable = !(edev->ndev->features & NETIF_F_GRO_HW); in qede_alloc_mem_rxq()
1643 if (!edev->gro_disable) in qede_alloc_mem_rxq()
1649 static void qede_free_mem_txq(struct qede_dev *edev, struct qede_tx_queue *txq) in qede_free_mem_txq() argument
1658 edev->ops->common->chain_free(edev->cdev, &txq->tx_pbl); in qede_free_mem_txq()
1662 static int qede_alloc_mem_txq(struct qede_dev *edev, struct qede_tx_queue *txq) in qede_alloc_mem_txq() argument
1668 .num_elems = edev->q_num_tx_buffers, in qede_alloc_mem_txq()
1673 txq->num_tx_buffers = edev->q_num_tx_buffers; in qede_alloc_mem_txq()
1688 rc = edev->ops->common->chain_alloc(edev->cdev, &txq->tx_pbl, &params); in qede_alloc_mem_txq()
1695 qede_free_mem_txq(edev, txq); in qede_alloc_mem_txq()
1700 static void qede_free_mem_fp(struct qede_dev *edev, struct qede_fastpath *fp) in qede_free_mem_fp() argument
1702 qede_free_mem_sb(edev, fp->sb_info, fp->id); in qede_free_mem_fp()
1705 qede_free_mem_rxq(edev, fp->rxq); in qede_free_mem_fp()
1708 qede_free_mem_txq(edev, fp->xdp_tx); in qede_free_mem_fp()
1713 for_each_cos_in_txq(edev, cos) in qede_free_mem_fp()
1714 qede_free_mem_txq(edev, &fp->txq[cos]); in qede_free_mem_fp()
1721 static int qede_alloc_mem_fp(struct qede_dev *edev, struct qede_fastpath *fp) in qede_alloc_mem_fp() argument
1725 rc = qede_alloc_mem_sb(edev, fp->sb_info, fp->id); in qede_alloc_mem_fp()
1730 rc = qede_alloc_mem_rxq(edev, fp->rxq); in qede_alloc_mem_fp()
1736 rc = qede_alloc_mem_txq(edev, fp->xdp_tx); in qede_alloc_mem_fp()
1744 for_each_cos_in_txq(edev, cos) { in qede_alloc_mem_fp()
1745 rc = qede_alloc_mem_txq(edev, &fp->txq[cos]); in qede_alloc_mem_fp()
1755 static void qede_free_mem_load(struct qede_dev *edev) in qede_free_mem_load() argument
1760 struct qede_fastpath *fp = &edev->fp_array[i]; in qede_free_mem_load()
1762 qede_free_mem_fp(edev, fp); in qede_free_mem_load()
1767 static int qede_alloc_mem_load(struct qede_dev *edev) in qede_alloc_mem_load() argument
1771 for (queue_id = 0; queue_id < QEDE_QUEUE_CNT(edev); queue_id++) { in qede_alloc_mem_load()
1772 struct qede_fastpath *fp = &edev->fp_array[queue_id]; in qede_alloc_mem_load()
1774 rc = qede_alloc_mem_fp(edev, fp); in qede_alloc_mem_load()
1776 DP_ERR(edev, in qede_alloc_mem_load()
1779 qede_free_mem_load(edev); in qede_alloc_mem_load()
1787 static void qede_empty_tx_queue(struct qede_dev *edev, in qede_empty_tx_queue() argument
1794 netdev_txq = netdev_get_tx_queue(edev->ndev, txq->ndev_txq_id); in qede_empty_tx_queue()
1798 DP_VERBOSE(edev, NETIF_MSG_IFDOWN, in qede_empty_tx_queue()
1803 rc = qede_free_tx_pkt(edev, txq, &len); in qede_empty_tx_queue()
1805 DP_NOTICE(edev, in qede_empty_tx_queue()
1821 static void qede_empty_tx_queues(struct qede_dev *edev) in qede_empty_tx_queues() argument
1826 if (edev->fp_array[i].type & QEDE_FASTPATH_TX) { in qede_empty_tx_queues()
1829 for_each_cos_in_txq(edev, cos) { in qede_empty_tx_queues()
1832 fp = &edev->fp_array[i]; in qede_empty_tx_queues()
1833 qede_empty_tx_queue(edev, in qede_empty_tx_queues()
1840 static void qede_init_fp(struct qede_dev *edev) in qede_init_fp() argument
1847 fp = &edev->fp_array[queue_id]; in qede_init_fp()
1849 fp->edev = edev; in qede_init_fp()
1853 fp->xdp_tx->index = QEDE_TXQ_IDX_TO_XDP(edev, in qede_init_fp()
1869 fp->rxq->dev = &edev->pdev->dev; in qede_init_fp()
1872 WARN_ON(xdp_rxq_info_reg(&fp->rxq->xdp_rxq, edev->ndev, in qede_init_fp()
1878 DP_NOTICE(edev, in qede_init_fp()
1886 for_each_cos_in_txq(edev, cos) { in qede_init_fp()
1892 ndev_tx_id = QEDE_TXQ_TO_NDEV_TXQ_ID(edev, txq); in qede_init_fp()
1895 if (edev->dev_info.is_legacy) in qede_init_fp()
1897 txq->dev = &edev->pdev->dev; in qede_init_fp()
1904 edev->ndev->name, queue_id); in qede_init_fp()
1908 edev->total_xdp_queues = QEDE_RSS_COUNT(edev); in qede_init_fp()
1909 DP_INFO(edev, "Total XDP queues: %u\n", edev->total_xdp_queues); in qede_init_fp()
1913 static int qede_set_real_num_queues(struct qede_dev *edev) in qede_set_real_num_queues() argument
1917 rc = netif_set_real_num_tx_queues(edev->ndev, in qede_set_real_num_queues()
1918 QEDE_TSS_COUNT(edev) * in qede_set_real_num_queues()
1919 edev->dev_info.num_tc); in qede_set_real_num_queues()
1921 DP_NOTICE(edev, "Failed to set real number of Tx queues\n"); in qede_set_real_num_queues()
1925 rc = netif_set_real_num_rx_queues(edev->ndev, QEDE_RSS_COUNT(edev)); in qede_set_real_num_queues()
1927 DP_NOTICE(edev, "Failed to set real number of Rx queues\n"); in qede_set_real_num_queues()
1934 static void qede_napi_disable_remove(struct qede_dev *edev) in qede_napi_disable_remove() argument
1939 napi_disable(&edev->fp_array[i].napi); in qede_napi_disable_remove()
1941 netif_napi_del(&edev->fp_array[i].napi); in qede_napi_disable_remove()
1945 static void qede_napi_add_enable(struct qede_dev *edev) in qede_napi_add_enable() argument
1951 netif_napi_add(edev->ndev, &edev->fp_array[i].napi, qede_poll); in qede_napi_add_enable()
1952 napi_enable(&edev->fp_array[i].napi); in qede_napi_add_enable()
1956 static void qede_sync_free_irqs(struct qede_dev *edev) in qede_sync_free_irqs() argument
1960 for (i = 0; i < edev->int_info.used_cnt; i++) { in qede_sync_free_irqs()
1961 if (edev->int_info.msix_cnt) { in qede_sync_free_irqs()
1962 free_irq(edev->int_info.msix[i].vector, in qede_sync_free_irqs()
1963 &edev->fp_array[i]); in qede_sync_free_irqs()
1965 edev->ops->common->simd_handler_clean(edev->cdev, i); in qede_sync_free_irqs()
1969 edev->int_info.used_cnt = 0; in qede_sync_free_irqs()
1970 edev->int_info.msix_cnt = 0; in qede_sync_free_irqs()
1973 static int qede_req_msix_irqs(struct qede_dev *edev) in qede_req_msix_irqs() argument
1978 if (QEDE_QUEUE_CNT(edev) > edev->int_info.msix_cnt) { in qede_req_msix_irqs()
1979 DP_ERR(edev, in qede_req_msix_irqs()
1981 QEDE_QUEUE_CNT(edev), edev->int_info.msix_cnt); in qede_req_msix_irqs()
1985 for (i = 0; i < QEDE_QUEUE_CNT(edev); i++) { in qede_req_msix_irqs()
1987 struct qede_fastpath *fp = &edev->fp_array[i]; in qede_req_msix_irqs()
1989 if (edev->ndev->rx_cpu_rmap && (fp->type & QEDE_FASTPATH_RX)) { in qede_req_msix_irqs()
1990 rc = irq_cpu_rmap_add(edev->ndev->rx_cpu_rmap, in qede_req_msix_irqs()
1991 edev->int_info.msix[i].vector); in qede_req_msix_irqs()
1993 DP_ERR(edev, "Failed to add CPU rmap\n"); in qede_req_msix_irqs()
1994 qede_free_arfs(edev); in qede_req_msix_irqs()
1998 rc = request_irq(edev->int_info.msix[i].vector, in qede_req_msix_irqs()
1999 qede_msix_fp_int, 0, edev->fp_array[i].name, in qede_req_msix_irqs()
2000 &edev->fp_array[i]); in qede_req_msix_irqs()
2002 DP_ERR(edev, "Request fp %d irq failed\n", i); in qede_req_msix_irqs()
2004 if (edev->ndev->rx_cpu_rmap) in qede_req_msix_irqs()
2005 free_irq_cpu_rmap(edev->ndev->rx_cpu_rmap); in qede_req_msix_irqs()
2007 edev->ndev->rx_cpu_rmap = NULL; in qede_req_msix_irqs()
2009 qede_sync_free_irqs(edev); in qede_req_msix_irqs()
2012 DP_VERBOSE(edev, NETIF_MSG_INTR, in qede_req_msix_irqs()
2014 edev->fp_array[i].name, i, in qede_req_msix_irqs()
2015 &edev->fp_array[i]); in qede_req_msix_irqs()
2016 edev->int_info.used_cnt++; in qede_req_msix_irqs()
2029 static int qede_setup_irqs(struct qede_dev *edev) in qede_setup_irqs() argument
2034 rc = edev->ops->common->get_fp_int(edev->cdev, &edev->int_info); in qede_setup_irqs()
2038 if (edev->int_info.msix_cnt) { in qede_setup_irqs()
2039 rc = qede_req_msix_irqs(edev); in qede_setup_irqs()
2042 edev->ndev->irq = edev->int_info.msix[0].vector; in qede_setup_irqs()
2047 ops = edev->ops->common; in qede_setup_irqs()
2048 for (i = 0; i < QEDE_QUEUE_CNT(edev); i++) in qede_setup_irqs()
2049 ops->simd_handler_config(edev->cdev, in qede_setup_irqs()
2050 &edev->fp_array[i], i, in qede_setup_irqs()
2052 edev->int_info.used_cnt = QEDE_QUEUE_CNT(edev); in qede_setup_irqs()
2057 static int qede_drain_txq(struct qede_dev *edev, in qede_drain_txq() argument
2065 DP_NOTICE(edev, in qede_drain_txq()
2068 rc = edev->ops->common->drain(edev->cdev); in qede_drain_txq()
2071 return qede_drain_txq(edev, txq, false); in qede_drain_txq()
2073 DP_NOTICE(edev, in qede_drain_txq()
2090 static int qede_stop_txq(struct qede_dev *edev, in qede_stop_txq() argument
2094 edev->ops->common->db_recovery_del(edev->cdev, txq->doorbell_addr, in qede_stop_txq()
2097 return edev->ops->q_tx_stop(edev->cdev, rss_id, txq->handle); in qede_stop_txq()
2100 static int qede_stop_queues(struct qede_dev *edev) in qede_stop_queues() argument
2103 struct qed_dev *cdev = edev->cdev; in qede_stop_queues()
2117 rc = edev->ops->vport_update(cdev, vport_update_params); in qede_stop_queues()
2121 DP_ERR(edev, "Failed to update vport\n"); in qede_stop_queues()
2127 fp = &edev->fp_array[i]; in qede_stop_queues()
2132 for_each_cos_in_txq(edev, cos) { in qede_stop_queues()
2133 rc = qede_drain_txq(edev, &fp->txq[cos], true); in qede_stop_queues()
2140 rc = qede_drain_txq(edev, fp->xdp_tx, true); in qede_stop_queues()
2147 for (i = QEDE_QUEUE_CNT(edev) - 1; i >= 0; i--) { in qede_stop_queues()
2148 fp = &edev->fp_array[i]; in qede_stop_queues()
2154 for_each_cos_in_txq(edev, cos) { in qede_stop_queues()
2155 rc = qede_stop_txq(edev, &fp->txq[cos], i); in qede_stop_queues()
2163 rc = edev->ops->q_rx_stop(cdev, i, fp->rxq->handle); in qede_stop_queues()
2165 DP_ERR(edev, "Failed to stop RXQ #%d\n", i); in qede_stop_queues()
2172 rc = qede_stop_txq(edev, fp->xdp_tx, i); in qede_stop_queues()
2181 rc = edev->ops->vport_stop(cdev, 0); in qede_stop_queues()
2183 DP_ERR(edev, "Failed to stop VPORT\n"); in qede_stop_queues()
2188 static int qede_start_txq(struct qede_dev *edev, in qede_start_txq() argument
2205 params.queue_id = QEDE_TXQ_XDP_TO_IDX(edev, txq); in qede_start_txq()
2213 rc = edev->ops->q_tx_start(edev->cdev, rss_id, &params, phys_table, in qede_start_txq()
2216 DP_ERR(edev, "Start TXQ #%d failed %d\n", txq->index, rc); in qede_start_txq()
2234 rc = edev->ops->common->db_recovery_add(edev->cdev, txq->doorbell_addr, in qede_start_txq()
2241 static int qede_start_queues(struct qede_dev *edev, bool clear_stats) in qede_start_queues() argument
2244 struct qed_dev *cdev = edev->cdev; in qede_start_queues()
2245 struct qed_dev_info *qed_info = &edev->dev_info.common; in qede_start_queues()
2251 if (!edev->num_queues) { in qede_start_queues()
2252 DP_ERR(edev, in qede_start_queues()
2261 start.handle_ptp_pkts = !!(edev->ptp); in qede_start_queues()
2262 start.gro_enable = !edev->gro_disable; in qede_start_queues()
2263 start.mtu = edev->ndev->mtu; in qede_start_queues()
2269 rc = edev->ops->vport_start(cdev, &start); in qede_start_queues()
2272 DP_ERR(edev, "Start V-PORT failed %d\n", rc); in qede_start_queues()
2276 DP_VERBOSE(edev, NETIF_MSG_IFUP, in qede_start_queues()
2278 start.vport_id, edev->ndev->mtu + 0xe, vlan_removal_en); in qede_start_queues()
2281 struct qede_fastpath *fp = &edev->fp_array[i]; in qede_start_queues()
2301 rc = edev->ops->q_rx_start(cdev, i, &q_params, in qede_start_queues()
2307 DP_ERR(edev, "Start RXQ #%d failed %d\n", i, in qede_start_queues()
2319 qede_update_rx_prod(edev, rxq); in qede_start_queues()
2323 rc = qede_start_txq(edev, fp, fp->xdp_tx, i, XDP_PI); in qede_start_queues()
2327 bpf_prog_add(edev->xdp_prog, 1); in qede_start_queues()
2328 fp->rxq->xdp_prog = edev->xdp_prog; in qede_start_queues()
2334 for_each_cos_in_txq(edev, cos) { in qede_start_queues()
2335 rc = qede_start_txq(edev, fp, &fp->txq[cos], i, in qede_start_queues()
2348 if ((qed_info->b_inter_pf_switch || pci_num_vf(edev->pdev)) && in qede_start_queues()
2354 qede_fill_rss_params(edev, &vport_update_params->rss_params, in qede_start_queues()
2357 rc = edev->ops->vport_update(cdev, vport_update_params); in qede_start_queues()
2359 DP_ERR(edev, "Update V-PORT failed %d\n", rc); in qede_start_queues()
2371 static void qede_unload(struct qede_dev *edev, enum qede_unload_mode mode, in qede_unload() argument
2377 DP_INFO(edev, "Starting qede unload\n"); in qede_unload()
2380 __qede_lock(edev); in qede_unload()
2382 clear_bit(QEDE_FLAGS_LINK_REQUESTED, &edev->flags); in qede_unload()
2385 edev->state = QEDE_STATE_CLOSED; in qede_unload()
2387 qede_rdma_dev_event_close(edev); in qede_unload()
2390 netif_tx_disable(edev->ndev); in qede_unload()
2391 netif_carrier_off(edev->ndev); in qede_unload()
2397 edev->ops->common->set_link(edev->cdev, &link_params); in qede_unload()
2399 rc = qede_stop_queues(edev); in qede_unload()
2402 if (edev->dev_info.common.b_arfs_capable) { in qede_unload()
2403 qede_poll_for_freeing_arfs_filters(edev); in qede_unload()
2404 if (edev->ndev->rx_cpu_rmap) in qede_unload()
2405 free_irq_cpu_rmap(edev->ndev->rx_cpu_rmap); in qede_unload()
2407 edev->ndev->rx_cpu_rmap = NULL; in qede_unload()
2410 qede_sync_free_irqs(edev); in qede_unload()
2414 DP_INFO(edev, "Stopped Queues\n"); in qede_unload()
2417 qede_vlan_mark_nonconfigured(edev); in qede_unload()
2418 edev->ops->fastpath_stop(edev->cdev); in qede_unload()
2420 if (edev->dev_info.common.b_arfs_capable) { in qede_unload()
2421 qede_poll_for_freeing_arfs_filters(edev); in qede_unload()
2422 qede_free_arfs(edev); in qede_unload()
2426 qede_sync_free_irqs(edev); in qede_unload()
2427 edev->ops->common->set_fp_int(edev->cdev, 0); in qede_unload()
2429 qede_napi_disable_remove(edev); in qede_unload()
2432 qede_empty_tx_queues(edev); in qede_unload()
2434 qede_free_mem_load(edev); in qede_unload()
2435 qede_free_fp_array(edev); in qede_unload()
2439 __qede_unlock(edev); in qede_unload()
2442 DP_NOTICE(edev, "Link is down\n"); in qede_unload()
2444 edev->ptp_skip_txts = 0; in qede_unload()
2446 DP_INFO(edev, "Ending qede unload\n"); in qede_unload()
2455 static int qede_load(struct qede_dev *edev, enum qede_load_mode mode, in qede_load() argument
2463 DP_INFO(edev, "Starting qede load\n"); in qede_load()
2466 __qede_lock(edev); in qede_load()
2468 rc = qede_set_num_queues(edev); in qede_load()
2472 rc = qede_alloc_fp_array(edev); in qede_load()
2476 qede_init_fp(edev); in qede_load()
2478 rc = qede_alloc_mem_load(edev); in qede_load()
2481 DP_INFO(edev, "Allocated %d Rx, %d Tx queues\n", in qede_load()
2482 QEDE_RSS_COUNT(edev), QEDE_TSS_COUNT(edev)); in qede_load()
2484 rc = qede_set_real_num_queues(edev); in qede_load()
2488 if (qede_alloc_arfs(edev)) { in qede_load()
2489 edev->ndev->features &= ~NETIF_F_NTUPLE; in qede_load()
2490 edev->dev_info.common.b_arfs_capable = false; in qede_load()
2493 qede_napi_add_enable(edev); in qede_load()
2494 DP_INFO(edev, "Napi added and enabled\n"); in qede_load()
2496 rc = qede_setup_irqs(edev); in qede_load()
2499 DP_INFO(edev, "Setup IRQs succeeded\n"); in qede_load()
2501 rc = qede_start_queues(edev, mode != QEDE_LOAD_RELOAD); in qede_load()
2504 DP_INFO(edev, "Start VPORT, RXQ and TXQ succeeded\n"); in qede_load()
2506 num_tc = netdev_get_num_tc(edev->ndev); in qede_load()
2507 num_tc = num_tc ? num_tc : edev->dev_info.num_tc; in qede_load()
2508 qede_setup_tc(edev->ndev, num_tc); in qede_load()
2511 qede_configure_vlan_filters(edev); in qede_load()
2513 set_bit(QEDE_FLAGS_LINK_REQUESTED, &edev->flags); in qede_load()
2518 edev->ops->common->set_link(edev->cdev, &link_params); in qede_load()
2520 edev->state = QEDE_STATE_OPEN; in qede_load()
2526 if (edev->coal_entry[i].isvalid) { in qede_load()
2527 coal.rx_coalesce_usecs = edev->coal_entry[i].rxc; in qede_load()
2528 coal.tx_coalesce_usecs = edev->coal_entry[i].txc; in qede_load()
2530 __qede_unlock(edev); in qede_load()
2531 qede_set_per_coalesce(edev->ndev, i, &coal); in qede_load()
2532 __qede_lock(edev); in qede_load()
2534 DP_INFO(edev, "Ending successfully qede load\n"); in qede_load()
2538 qede_sync_free_irqs(edev); in qede_load()
2540 qede_napi_disable_remove(edev); in qede_load()
2542 qede_free_mem_load(edev); in qede_load()
2544 edev->ops->common->set_fp_int(edev->cdev, 0); in qede_load()
2545 qede_free_fp_array(edev); in qede_load()
2546 edev->num_queues = 0; in qede_load()
2547 edev->fp_num_tx = 0; in qede_load()
2548 edev->fp_num_rx = 0; in qede_load()
2551 __qede_unlock(edev); in qede_load()
2559 void qede_reload(struct qede_dev *edev, in qede_reload() argument
2563 __qede_lock(edev); in qede_reload()
2569 if (edev->state == QEDE_STATE_OPEN) { in qede_reload()
2570 qede_unload(edev, QEDE_UNLOAD_NORMAL, true); in qede_reload()
2572 args->func(edev, args); in qede_reload()
2573 qede_load(edev, QEDE_LOAD_RELOAD, true); in qede_reload()
2576 qede_config_rx_mode(edev->ndev); in qede_reload()
2578 args->func(edev, args); in qede_reload()
2582 __qede_unlock(edev); in qede_reload()
2588 struct qede_dev *edev = netdev_priv(ndev); in qede_open() local
2593 edev->ops->common->set_power_state(edev->cdev, PCI_D0); in qede_open()
2595 rc = qede_load(edev, QEDE_LOAD_NORMAL, false); in qede_open()
2601 edev->ops->common->update_drv_state(edev->cdev, true); in qede_open()
2608 struct qede_dev *edev = netdev_priv(ndev); in qede_close() local
2610 qede_unload(edev, QEDE_UNLOAD_NORMAL, false); in qede_close()
2612 if (edev->cdev) in qede_close()
2613 edev->ops->common->update_drv_state(edev->cdev, false); in qede_close()
2620 struct qede_dev *edev = dev; in qede_link_update() local
2622 if (!test_bit(QEDE_FLAGS_LINK_REQUESTED, &edev->flags)) { in qede_link_update()
2623 DP_VERBOSE(edev, NETIF_MSG_LINK, "Interface is not ready\n"); in qede_link_update()
2628 if (!netif_carrier_ok(edev->ndev)) { in qede_link_update()
2629 DP_NOTICE(edev, "Link is up\n"); in qede_link_update()
2630 netif_tx_start_all_queues(edev->ndev); in qede_link_update()
2631 netif_carrier_on(edev->ndev); in qede_link_update()
2632 qede_rdma_dev_event_open(edev); in qede_link_update()
2635 if (netif_carrier_ok(edev->ndev)) { in qede_link_update()
2636 DP_NOTICE(edev, "Link is down\n"); in qede_link_update()
2637 netif_tx_disable(edev->ndev); in qede_link_update()
2638 netif_carrier_off(edev->ndev); in qede_link_update()
2639 qede_rdma_dev_event_close(edev); in qede_link_update()
2646 struct qede_dev *edev = dev; in qede_schedule_recovery_handler() local
2648 if (edev->state == QEDE_STATE_RECOVERY) { in qede_schedule_recovery_handler()
2649 DP_NOTICE(edev, in qede_schedule_recovery_handler()
2654 set_bit(QEDE_SP_RECOVERY, &edev->sp_flags); in qede_schedule_recovery_handler()
2655 schedule_delayed_work(&edev->sp_task, 0); in qede_schedule_recovery_handler()
2657 DP_INFO(edev, "Scheduled a recovery handler\n"); in qede_schedule_recovery_handler()
2660 static void qede_recovery_failed(struct qede_dev *edev) in qede_recovery_failed() argument
2662 netdev_err(edev->ndev, "Recovery handling has failed. Power cycle is needed.\n"); in qede_recovery_failed()
2664 netif_device_detach(edev->ndev); in qede_recovery_failed()
2666 if (edev->cdev) in qede_recovery_failed()
2667 edev->ops->common->set_power_state(edev->cdev, PCI_D3hot); in qede_recovery_failed()
2670 static void qede_recovery_handler(struct qede_dev *edev) in qede_recovery_handler() argument
2672 u32 curr_state = edev->state; in qede_recovery_handler()
2675 DP_NOTICE(edev, "Starting a recovery process\n"); in qede_recovery_handler()
2680 edev->state = QEDE_STATE_RECOVERY; in qede_recovery_handler()
2682 edev->ops->common->recovery_prolog(edev->cdev); in qede_recovery_handler()
2685 qede_unload(edev, QEDE_UNLOAD_RECOVERY, true); in qede_recovery_handler()
2687 __qede_remove(edev->pdev, QEDE_REMOVE_RECOVERY); in qede_recovery_handler()
2689 rc = __qede_probe(edev->pdev, edev->dp_module, edev->dp_level, in qede_recovery_handler()
2690 IS_VF(edev), QEDE_PROBE_RECOVERY); in qede_recovery_handler()
2692 edev->cdev = NULL; in qede_recovery_handler()
2697 rc = qede_load(edev, QEDE_LOAD_RECOVERY, true); in qede_recovery_handler()
2701 qede_config_rx_mode(edev->ndev); in qede_recovery_handler()
2702 udp_tunnel_nic_reset_ntf(edev->ndev); in qede_recovery_handler()
2705 edev->state = curr_state; in qede_recovery_handler()
2707 DP_NOTICE(edev, "Recovery handling is done\n"); in qede_recovery_handler()
2712 qede_recovery_failed(edev); in qede_recovery_handler()
2715 static void qede_atomic_hw_err_handler(struct qede_dev *edev) in qede_atomic_hw_err_handler() argument
2717 struct qed_dev *cdev = edev->cdev; in qede_atomic_hw_err_handler()
2719 DP_NOTICE(edev, in qede_atomic_hw_err_handler()
2721 edev->err_flags); in qede_atomic_hw_err_handler()
2724 WARN_ON(test_bit(QEDE_ERR_WARN, &edev->err_flags)); in qede_atomic_hw_err_handler()
2727 if (test_bit(QEDE_ERR_ATTN_CLR_EN, &edev->err_flags)) in qede_atomic_hw_err_handler()
2728 edev->ops->common->attn_clr_enable(cdev, true); in qede_atomic_hw_err_handler()
2730 DP_NOTICE(edev, "Generic non-sleepable HW error handling is done\n"); in qede_atomic_hw_err_handler()
2733 static void qede_generic_hw_err_handler(struct qede_dev *edev) in qede_generic_hw_err_handler() argument
2735 DP_NOTICE(edev, in qede_generic_hw_err_handler()
2737 edev->err_flags); in qede_generic_hw_err_handler()
2739 if (edev->devlink) { in qede_generic_hw_err_handler()
2740 DP_NOTICE(edev, "Reporting fatal error to devlink\n"); in qede_generic_hw_err_handler()
2741 edev->ops->common->report_fatal_error(edev->devlink, edev->last_err_type); in qede_generic_hw_err_handler()
2744 clear_bit(QEDE_ERR_IS_HANDLED, &edev->err_flags); in qede_generic_hw_err_handler()
2746 DP_NOTICE(edev, "Generic sleepable HW error handling is done\n"); in qede_generic_hw_err_handler()
2749 static void qede_set_hw_err_flags(struct qede_dev *edev, in qede_set_hw_err_flags() argument
2769 DP_NOTICE(edev, "Unexpected HW error [%d]\n", err_type); in qede_set_hw_err_flags()
2773 edev->err_flags |= err_flags; in qede_set_hw_err_flags()
2779 struct qede_dev *edev = dev; in qede_schedule_hw_err_handler() local
2784 if ((test_and_set_bit(QEDE_ERR_IS_HANDLED, &edev->err_flags) || in qede_schedule_hw_err_handler()
2785 edev->state == QEDE_STATE_RECOVERY) && in qede_schedule_hw_err_handler()
2787 DP_INFO(edev, in qede_schedule_hw_err_handler()
2793 DP_NOTICE(edev, "Unknown HW error [%d]\n", err_type); in qede_schedule_hw_err_handler()
2794 clear_bit(QEDE_ERR_IS_HANDLED, &edev->err_flags); in qede_schedule_hw_err_handler()
2798 edev->last_err_type = err_type; in qede_schedule_hw_err_handler()
2799 qede_set_hw_err_flags(edev, err_type); in qede_schedule_hw_err_handler()
2800 qede_atomic_hw_err_handler(edev); in qede_schedule_hw_err_handler()
2801 set_bit(QEDE_SP_HW_ERR, &edev->sp_flags); in qede_schedule_hw_err_handler()
2802 schedule_delayed_work(&edev->sp_task, 0); in qede_schedule_hw_err_handler()
2804 DP_INFO(edev, "Scheduled a error handler [err_type %d]\n", err_type); in qede_schedule_hw_err_handler()
2807 static bool qede_is_txq_full(struct qede_dev *edev, struct qede_tx_queue *txq) in qede_is_txq_full() argument
2811 netdev_txq = netdev_get_tx_queue(edev->ndev, txq->ndev_txq_id); in qede_is_txq_full()
2820 struct qede_dev *edev = dev; in qede_get_generic_tlv_data() local
2824 if (edev->ndev->features & NETIF_F_IP_CSUM) in qede_get_generic_tlv_data()
2826 if (edev->ndev->features & NETIF_F_TSO) in qede_get_generic_tlv_data()
2829 ether_addr_copy(data->mac[0], edev->ndev->dev_addr); in qede_get_generic_tlv_data()
2833 netif_addr_lock_bh(edev->ndev); in qede_get_generic_tlv_data()
2835 netdev_for_each_uc_addr(ha, edev->ndev) { in qede_get_generic_tlv_data()
2841 netif_addr_unlock_bh(edev->ndev); in qede_get_generic_tlv_data()
2847 struct qede_dev *edev = dev; in qede_get_eth_tlv_data() local
2855 etlv->prom_mode = !!(edev->ndev->flags & IFF_PROMISC); in qede_get_eth_tlv_data()
2857 etlv->tx_descr_size = QEDE_TSS_COUNT(edev); in qede_get_eth_tlv_data()
2859 etlv->rx_descr_size = QEDE_RSS_COUNT(edev); in qede_get_eth_tlv_data()
2872 __qede_lock(edev); in qede_get_eth_tlv_data()
2874 fp = &edev->fp_array[i]; in qede_get_eth_tlv_data()
2880 if (qede_is_txq_full(edev, txq)) in qede_get_eth_tlv_data()
2897 __qede_unlock(edev); in qede_get_eth_tlv_data()
2920 struct qede_dev *edev = netdev_priv(dev); in qede_io_error_detected() local
2922 if (!edev) in qede_io_error_detected()
2925 DP_NOTICE(edev, "IO error detected [%d]\n", state); in qede_io_error_detected()
2927 __qede_lock(edev); in qede_io_error_detected()
2928 if (edev->state == QEDE_STATE_RECOVERY) { in qede_io_error_detected()
2929 DP_NOTICE(edev, "Device already in the recovery state\n"); in qede_io_error_detected()
2930 __qede_unlock(edev); in qede_io_error_detected()
2935 if (IS_VF(edev)) { in qede_io_error_detected()
2936 DP_VERBOSE(edev, QED_MSG_IOV, in qede_io_error_detected()
2938 __qede_unlock(edev); in qede_io_error_detected()
2943 netif_tx_disable(edev->ndev); in qede_io_error_detected()
2944 netif_carrier_off(edev->ndev); in qede_io_error_detected()
2946 set_bit(QEDE_SP_AER, &edev->sp_flags); in qede_io_error_detected()
2947 schedule_delayed_work(&edev->sp_task, 0); in qede_io_error_detected()
2949 __qede_unlock(edev); in qede_io_error_detected()