Lines Matching +full:un +full:- +full:masked
1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
3 * Copyright (c) 2015-2017 QLogic Corporation
4 * Copyright (c) 2019-2020 Marvell International Ltd.
17 #include <linux/dma-mapping.h>
125 return -EINVAL; in qede_set_vf_vlan()
129 return -EPROTONOSUPPORT; in qede_set_vf_vlan()
134 return edev->ops->iov->set_vlan(edev->cdev, vlan, vf); in qede_set_vf_vlan()
145 return -EINVAL; in qede_set_vf_mac()
148 return edev->ops->iov->set_mac(edev->cdev, mac, vfidx); in qede_set_vf_mac()
154 struct qed_dev_info *qed_info = &edev->dev_info.common; in qede_sriov_configure()
160 return -ENOMEM; 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()
167 !qed_info->b_inter_pf_switch && qed_info->tx_switching) { in qede_sriov_configure()
168 vport_params->vport_id = 0; in qede_sriov_configure()
169 vport_params->update_tx_switching_flg = 1; in qede_sriov_configure()
170 vport_params->tx_switching_flg = num_vfs_param ? 1 : 0; in qede_sriov_configure()
171 edev->ops->vport_update(edev->cdev, vport_params); in qede_sriov_configure()
183 return -EOPNOTSUPP; in qede_suspend()
231 if (!ndev || !ndev->ethtool_ops || !ndev->ethtool_ops->get_drvinfo) in qede_netdev_event()
235 ndev->ethtool_ops->get_drvinfo(ndev, &drvinfo); 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()
273 return -EINVAL; in qede_init()
283 return -EINVAL; in qede_init()
291 return -EINVAL; in qede_init()
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()
322 p_common->no_buff_discards = stats.common.no_buff_discards; in qede_fill_by_demand_stats()
323 p_common->packet_too_big_discard = stats.common.packet_too_big_discard; in qede_fill_by_demand_stats()
324 p_common->ttl0_discard = stats.common.ttl0_discard; in qede_fill_by_demand_stats()
325 p_common->rx_ucast_bytes = stats.common.rx_ucast_bytes; in qede_fill_by_demand_stats()
326 p_common->rx_mcast_bytes = stats.common.rx_mcast_bytes; in qede_fill_by_demand_stats()
327 p_common->rx_bcast_bytes = stats.common.rx_bcast_bytes; in qede_fill_by_demand_stats()
328 p_common->rx_ucast_pkts = stats.common.rx_ucast_pkts; in qede_fill_by_demand_stats()
329 p_common->rx_mcast_pkts = stats.common.rx_mcast_pkts; in qede_fill_by_demand_stats()
330 p_common->rx_bcast_pkts = stats.common.rx_bcast_pkts; in qede_fill_by_demand_stats()
331 p_common->mftag_filter_discards = stats.common.mftag_filter_discards; in qede_fill_by_demand_stats()
332 p_common->mac_filter_discards = stats.common.mac_filter_discards; in qede_fill_by_demand_stats()
333 p_common->gft_filter_drop = stats.common.gft_filter_drop; in qede_fill_by_demand_stats()
335 p_common->tx_ucast_bytes = stats.common.tx_ucast_bytes; in qede_fill_by_demand_stats()
336 p_common->tx_mcast_bytes = stats.common.tx_mcast_bytes; in qede_fill_by_demand_stats()
337 p_common->tx_bcast_bytes = stats.common.tx_bcast_bytes; in qede_fill_by_demand_stats()
338 p_common->tx_ucast_pkts = stats.common.tx_ucast_pkts; in qede_fill_by_demand_stats()
339 p_common->tx_mcast_pkts = stats.common.tx_mcast_pkts; in qede_fill_by_demand_stats()
340 p_common->tx_bcast_pkts = stats.common.tx_bcast_pkts; in qede_fill_by_demand_stats()
341 p_common->tx_err_drop_pkts = stats.common.tx_err_drop_pkts; in qede_fill_by_demand_stats()
342 p_common->coalesced_pkts = stats.common.tpa_coalesced_pkts; in qede_fill_by_demand_stats()
343 p_common->coalesced_events = stats.common.tpa_coalesced_events; in qede_fill_by_demand_stats()
344 p_common->coalesced_aborts_num = stats.common.tpa_aborts_num; in qede_fill_by_demand_stats()
345 p_common->non_coalesced_pkts = stats.common.tpa_not_coalesced_pkts; in qede_fill_by_demand_stats()
346 p_common->coalesced_bytes = stats.common.tpa_coalesced_bytes; in qede_fill_by_demand_stats()
348 p_common->rx_64_byte_packets = stats.common.rx_64_byte_packets; in qede_fill_by_demand_stats()
349 p_common->rx_65_to_127_byte_packets = in qede_fill_by_demand_stats()
351 p_common->rx_128_to_255_byte_packets = in qede_fill_by_demand_stats()
353 p_common->rx_256_to_511_byte_packets = in qede_fill_by_demand_stats()
355 p_common->rx_512_to_1023_byte_packets = in qede_fill_by_demand_stats()
357 p_common->rx_1024_to_1518_byte_packets = in qede_fill_by_demand_stats()
359 p_common->rx_crc_errors = stats.common.rx_crc_errors; in qede_fill_by_demand_stats()
360 p_common->rx_mac_crtl_frames = stats.common.rx_mac_crtl_frames; in qede_fill_by_demand_stats()
361 p_common->rx_pause_frames = stats.common.rx_pause_frames; in qede_fill_by_demand_stats()
362 p_common->rx_pfc_frames = stats.common.rx_pfc_frames; in qede_fill_by_demand_stats()
363 p_common->rx_align_errors = stats.common.rx_align_errors; in qede_fill_by_demand_stats()
364 p_common->rx_carrier_errors = stats.common.rx_carrier_errors; in qede_fill_by_demand_stats()
365 p_common->rx_oversize_packets = stats.common.rx_oversize_packets; in qede_fill_by_demand_stats()
366 p_common->rx_jabbers = stats.common.rx_jabbers; in qede_fill_by_demand_stats()
367 p_common->rx_undersize_packets = stats.common.rx_undersize_packets; in qede_fill_by_demand_stats()
368 p_common->rx_fragments = stats.common.rx_fragments; in qede_fill_by_demand_stats()
369 p_common->tx_64_byte_packets = stats.common.tx_64_byte_packets; in qede_fill_by_demand_stats()
370 p_common->tx_65_to_127_byte_packets = in qede_fill_by_demand_stats()
372 p_common->tx_128_to_255_byte_packets = in qede_fill_by_demand_stats()
374 p_common->tx_256_to_511_byte_packets = in qede_fill_by_demand_stats()
376 p_common->tx_512_to_1023_byte_packets = in qede_fill_by_demand_stats()
378 p_common->tx_1024_to_1518_byte_packets = in qede_fill_by_demand_stats()
380 p_common->tx_pause_frames = stats.common.tx_pause_frames; in qede_fill_by_demand_stats()
381 p_common->tx_pfc_frames = stats.common.tx_pfc_frames; in qede_fill_by_demand_stats()
382 p_common->brb_truncates = stats.common.brb_truncates; in qede_fill_by_demand_stats()
383 p_common->brb_discards = stats.common.brb_discards; in qede_fill_by_demand_stats()
384 p_common->tx_mac_ctrl_frames = stats.common.tx_mac_ctrl_frames; in qede_fill_by_demand_stats()
385 p_common->link_change_count = stats.common.link_change_count; in qede_fill_by_demand_stats()
386 p_common->ptp_skip_txts = edev->ptp_skip_txts; in qede_fill_by_demand_stats()
389 struct qede_stats_bb *p_bb = &edev->stats.bb; in qede_fill_by_demand_stats()
391 p_bb->rx_1519_to_1522_byte_packets = in qede_fill_by_demand_stats()
393 p_bb->rx_1519_to_2047_byte_packets = in qede_fill_by_demand_stats()
395 p_bb->rx_2048_to_4095_byte_packets = in qede_fill_by_demand_stats()
397 p_bb->rx_4096_to_9216_byte_packets = in qede_fill_by_demand_stats()
399 p_bb->rx_9217_to_16383_byte_packets = in qede_fill_by_demand_stats()
401 p_bb->tx_1519_to_2047_byte_packets = in qede_fill_by_demand_stats()
403 p_bb->tx_2048_to_4095_byte_packets = in qede_fill_by_demand_stats()
405 p_bb->tx_4096_to_9216_byte_packets = in qede_fill_by_demand_stats()
407 p_bb->tx_9217_to_16383_byte_packets = in qede_fill_by_demand_stats()
409 p_bb->tx_lpi_entry_count = stats.bb.tx_lpi_entry_count; in qede_fill_by_demand_stats()
410 p_bb->tx_total_collisions = stats.bb.tx_total_collisions; in qede_fill_by_demand_stats()
412 struct qede_stats_ah *p_ah = &edev->stats.ah; in qede_fill_by_demand_stats()
414 p_ah->rx_1519_to_max_byte_packets = in qede_fill_by_demand_stats()
416 p_ah->tx_1519_to_max_byte_packets = in qede_fill_by_demand_stats()
420 spin_unlock(&edev->stats_lock); in qede_fill_by_demand_stats()
429 p_common = &edev->stats.common; in qede_get_stats64()
431 spin_lock(&edev->stats_lock); in qede_get_stats64()
433 stats->rx_packets = p_common->rx_ucast_pkts + p_common->rx_mcast_pkts + in qede_get_stats64()
434 p_common->rx_bcast_pkts; in qede_get_stats64()
435 stats->tx_packets = p_common->tx_ucast_pkts + p_common->tx_mcast_pkts + in qede_get_stats64()
436 p_common->tx_bcast_pkts; in qede_get_stats64()
438 stats->rx_bytes = p_common->rx_ucast_bytes + p_common->rx_mcast_bytes + in qede_get_stats64()
439 p_common->rx_bcast_bytes; in qede_get_stats64()
440 stats->tx_bytes = p_common->tx_ucast_bytes + p_common->tx_mcast_bytes + in qede_get_stats64()
441 p_common->tx_bcast_bytes; in qede_get_stats64()
443 stats->tx_errors = p_common->tx_err_drop_pkts; in qede_get_stats64()
444 stats->multicast = p_common->rx_mcast_pkts + p_common->rx_bcast_pkts; in qede_get_stats64()
446 stats->rx_fifo_errors = p_common->no_buff_discards; in qede_get_stats64()
449 stats->collisions = edev->stats.bb.tx_total_collisions; in qede_get_stats64()
450 stats->rx_crc_errors = p_common->rx_crc_errors; in qede_get_stats64()
451 stats->rx_frame_errors = p_common->rx_align_errors; in qede_get_stats64()
453 spin_unlock(&edev->stats_lock); in qede_get_stats64()
462 if (!edev->ops) in qede_get_vf_config()
463 return -EINVAL; in qede_get_vf_config()
465 return edev->ops->iov->get_config(edev->cdev, vfidx, ivi); in qede_get_vf_config()
473 return edev->ops->iov->set_rate(edev->cdev, vfidx, min_tx_rate, in qede_set_vf_rate()
481 if (!edev->ops) in qede_set_vf_spoofchk()
482 return -EINVAL; in qede_set_vf_spoofchk()
484 return edev->ops->iov->set_spoof(edev->cdev, vfidx, val); in qede_set_vf_spoofchk()
492 if (!edev->ops) in qede_set_vf_link_state()
493 return -EINVAL; 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()
502 if (!edev->ops) in qede_set_vf_trust()
503 return -EINVAL; in qede_set_vf_trust()
505 return edev->ops->iov->set_trust(edev->cdev, vfidx, setting); in qede_set_vf_trust()
514 return -EAGAIN; in qede_ioctl()
522 return -EOPNOTSUPP; in qede_ioctl()
530 char *p_sb = (char *)fp->sb_info->sb_virt; in qede_fp_sb_dump()
546 struct qed_chain *p_chain = &txq->tx_pbl; in qede_txq_fp_log_metadata()
551 fp->id, fp->sb_info->igu_sb_id, txq->index, txq->ndev_txq_id, txq->cos, in qede_txq_fp_log_metadata()
552 p_chain, p_chain->capacity, p_chain->size, jiffies, HZ); in qede_txq_fp_log_metadata()
557 le16_to_cpu(*txq->hw_cons_ptr), txq->sw_tx_prod, txq->sw_tx_cons, in qede_txq_fp_log_metadata()
571 rc = edev->ops->common->get_sb_info(edev->cdev, fp->sb_info, (u16)fp->id, &sb_dbg); in qede_tx_log_print()
574 sb_dbg.igu_prod, sb_dbg.igu_cons, sb_dbg.pi[TX_PI(txq->cos)]); in qede_tx_log_print()
577 edev->ops->common->mfw_report(edev->cdev, in qede_tx_log_print()
579 txq->index, le16_to_cpu(*txq->hw_cons_ptr), in qede_tx_log_print()
580 qed_chain_get_cons_idx(&txq->tx_pbl), in qede_tx_log_print()
581 qed_chain_get_prod_idx(&txq->tx_pbl), jiffies); in qede_tx_log_print()
583 edev->ops->common->mfw_report(edev->cdev, in qede_tx_log_print()
584 "Txq[%d]: SB[0x%04x] - IGU: prod %08x cons %08x CAU Tx %04x\n", in qede_tx_log_print()
585 txq->index, fp->sb_info->igu_sb_id, in qede_tx_log_print()
587 sb_dbg.pi[TX_PI(txq->cos)]); in qede_tx_log_print()
603 fp = &edev->fp_array[i]; in qede_tx_timeout()
604 if (!(fp->type & QEDE_FASTPATH_TX)) in qede_tx_timeout()
608 txq = &fp->txq[cos]; in qede_tx_timeout()
613 if (qed_chain_get_cons_idx(&txq->tx_pbl) != in qede_tx_timeout()
614 qed_chain_get_prod_idx(&txq->tx_pbl)) 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()
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()
639 if (num_tc > edev->dev_info.num_tc) in qede_setup_tc()
640 return -EINVAL; in qede_setup_tc()
658 switch (f->command) { in qede_set_flower()
662 return qede_delete_flow_filter(edev, f->cookie); in qede_set_flower()
664 return -EOPNOTSUPP; in qede_set_flower()
674 if (!tc_cls_can_offload_and_chain0(edev->ndev, type_data)) in qede_setup_tc_block_cb()
675 return -EOPNOTSUPP; in qede_setup_tc_block_cb()
680 return qede_set_flower(edev, f, f->common.protocol); in qede_setup_tc_block_cb()
682 return -EOPNOTSUPP; in qede_setup_tc_block_cb()
704 mqprio->hw = TC_MQPRIO_HW_OFFLOAD_TCS; in qede_setup_tc_offload()
705 return qede_setup_tc(dev, mqprio->num_tc); in qede_setup_tc_offload()
707 return -EOPNOTSUPP; in qede_setup_tc_offload()
783 /* -------------------------------------------------------------------------
785 * -------------------------------------------------------------------------
797 info->num_queues * info->num_tc, in qede_alloc_etherdev()
798 info->num_queues); 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()
821 info->num_queues, info->num_queues); in qede_alloc_etherdev()
823 SET_NETDEV_DEV(ndev, &pdev->dev); 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()
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()
849 ndev->base_addr = ndev->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()
853 ndev->watchdog_timeo = TX_TIMEOUT; in qede_init_ndev()
856 if (edev->dev_info.xdp_supported) in qede_init_ndev()
857 ndev->netdev_ops = &qede_netdev_vf_xdp_ops; in qede_init_ndev()
859 ndev->netdev_ops = &qede_netdev_vf_ops; in qede_init_ndev()
861 ndev->netdev_ops = &qede_netdev_ops; in qede_init_ndev()
866 ndev->priv_flags |= IFF_UNICAST_FLT; in qede_init_ndev()
868 /* user-changeble features */ 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()
882 ndev->hw_enc_features = NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | in qede_init_ndev()
891 ndev->hw_enc_features |= (NETIF_F_GSO_UDP_TUNNEL | in qede_init_ndev()
897 if (edev->dev_info.common.gre_enable) { in qede_init_ndev()
899 ndev->hw_enc_features |= (NETIF_F_GSO_GRE | in qede_init_ndev()
903 ndev->vlan_features = hw_features | NETIF_F_RXHASH | NETIF_F_RXCSUM | in qede_init_ndev()
905 ndev->features = hw_features | NETIF_F_RXHASH | NETIF_F_RXCSUM | in qede_init_ndev()
909 ndev->hw_features = hw_features; in qede_init_ndev()
911 ndev->xdp_features = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT | in qede_init_ndev()
914 /* MTU range: 46 - 9600 */ in qede_init_ndev()
915 ndev->min_mtu = ETH_ZLEN - ETH_HLEN; in qede_init_ndev()
916 ndev->max_mtu = QEDE_MAX_JUMBO_PACKET_SIZE; 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()
926 * b31 - enable all NOTICE prints. NOTICE prints are for deviation from the
928 * b30 - enable all INFO prints. INFO prints are for major steps in the flow
930 * b29-b0 - per-module bitmap, where each bit enables VERBOSE prints of that
952 if (edev->fp_array) { in qede_free_fp_array()
957 fp = &edev->fp_array[i]; in qede_free_fp_array()
959 kfree(fp->sb_info); in qede_free_fp_array()
962 * Implicit only (fp->type & QEDE_FASTPATH_RX) in qede_free_fp_array()
964 if (fp->rxq && xdp_rxq_info_is_reg(&fp->rxq->xdp_rxq)) in qede_free_fp_array()
965 xdp_rxq_info_unreg(&fp->rxq->xdp_rxq); in qede_free_fp_array()
966 kfree(fp->rxq); in qede_free_fp_array()
967 kfree(fp->xdp_tx); in qede_free_fp_array()
968 kfree(fp->txq); 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()
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()
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()
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()
1011 fp->sb_info = kzalloc(sizeof(*fp->sb_info), GFP_KERNEL); in qede_alloc_fp_array()
1012 if (!fp->sb_info) { in qede_alloc_fp_array()
1018 fp->type = QEDE_FASTPATH_RX; in qede_alloc_fp_array()
1019 fp_rx--; in qede_alloc_fp_array()
1021 fp->type = QEDE_FASTPATH_COMBINED; in qede_alloc_fp_array()
1022 fp_combined--; in qede_alloc_fp_array()
1024 fp->type = QEDE_FASTPATH_TX; in qede_alloc_fp_array()
1027 if (fp->type & QEDE_FASTPATH_TX) { in qede_alloc_fp_array()
1028 fp->txq = kcalloc(edev->dev_info.num_tc, in qede_alloc_fp_array()
1029 sizeof(*fp->txq), GFP_KERNEL); in qede_alloc_fp_array()
1030 if (!fp->txq) in qede_alloc_fp_array()
1034 if (fp->type & QEDE_FASTPATH_RX) { in qede_alloc_fp_array()
1035 fp->rxq = kzalloc(sizeof(*fp->rxq), GFP_KERNEL); in qede_alloc_fp_array()
1036 if (!fp->rxq) in qede_alloc_fp_array()
1039 if (edev->xdp_prog) { in qede_alloc_fp_array()
1040 fp->xdp_tx = kzalloc(sizeof(*fp->xdp_tx), in qede_alloc_fp_array()
1042 if (!fp->xdp_tx) in qede_alloc_fp_array()
1044 fp->type |= QEDE_FASTPATH_XDP; in qede_alloc_fp_array()
1052 return -ENOMEM; in qede_alloc_fp_array()
1060 mutex_lock(&edev->qede_lock); in __qede_lock()
1065 mutex_unlock(&edev->qede_lock); in __qede_unlock()
1089 schedule_delayed_work(&edev->periodic_task, edev->stats_coal_ticks); in qede_periodic_task()
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()
1109 if (test_bit(QEDE_SP_DISABLE, &edev->sp_flags)) in qede_sp_task()
1115 * In other cases - only the internal qede lock should be acquired. 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()
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()
1144 if (test_and_clear_bit(QEDE_SP_HW_ERR, &edev->sp_flags)) 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()
1171 pf_params.eth_pf_params.num_cons = (MAX_SB_PER_PF_MIMD - 1) * num_cons; in qede_update_pf_params()
1173 /* Same for VFs - make sure they'll have sufficient connections in qede_update_pf_params()
1179 qed_ops->common->update_pf_params(cdev, &pf_params); in qede_update_pf_params()
1186 struct qed_dev_info *p_dev_info = &edev->dev_info.common; in qede_log_probe()
1192 p_dev_info->fw_major, p_dev_info->fw_minor, p_dev_info->fw_rev, in qede_log_probe()
1193 p_dev_info->fw_eng, in qede_log_probe()
1194 (p_dev_info->mfw_rev & QED_MFW_VERSION_3_MASK) >> in qede_log_probe()
1196 (p_dev_info->mfw_rev & QED_MFW_VERSION_2_MASK) >> in qede_log_probe()
1198 (p_dev_info->mfw_rev & QED_MFW_VERSION_1_MASK) >> in qede_log_probe()
1200 (p_dev_info->mfw_rev & QED_MFW_VERSION_0_MASK) >> in qede_log_probe()
1203 left_size = QEDE_FW_VER_STR_SIZE - strlen(buf); in qede_log_probe()
1204 if (p_dev_info->mbi_version && left_size) in qede_log_probe()
1207 (p_dev_info->mbi_version & QED_MBI_VERSION_2_MASK) >> in qede_log_probe()
1209 (p_dev_info->mbi_version & QED_MBI_VERSION_1_MASK) >> in qede_log_probe()
1211 (p_dev_info->mbi_version & QED_MBI_VERSION_0_MASK) >> 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()
1243 cdev = qed_ops->common->probe(pdev, &probe_params); in __qede_probe()
1245 rc = -ENODEV; in __qede_probe()
1251 /* Start the Slowpath-process */ in __qede_probe()
1255 rc = qed_ops->common->slowpath_start(cdev, &sp_params); in __qede_probe()
1262 rc = qed_ops->fill_dev_info(cdev, &dev_info); in __qede_probe()
1270 rc = -ENOMEM; in __qede_probe()
1274 edev->devlink = qed_ops->common->devlink_register(cdev); in __qede_probe()
1275 if (IS_ERR(edev->devlink)) { in __qede_probe()
1277 rc = PTR_ERR(edev->devlink); in __qede_probe()
1278 edev->devlink = NULL; in __qede_probe()
1286 qdl = devlink_priv(edev->devlink); in __qede_probe()
1287 qdl->cdev = cdev; 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()
1308 INIT_DELAYED_WORK(&edev->sp_task, qede_sp_task); in __qede_probe()
1309 mutex_init(&edev->qede_lock); 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()
1325 edev->ops->register_ops(cdev, &qede_ll_ops, 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()
1336 /* retain user config (for example - after recovery) */ in __qede_probe()
1337 if (edev->stats_coal_usecs) in __qede_probe()
1338 schedule_delayed_work(&edev->periodic_task, 0); in __qede_probe()
1346 free_netdev(edev->ndev); in __qede_probe()
1348 edev->cdev = NULL; in __qede_probe()
1350 qed_ops->common->slowpath_stop(cdev); in __qede_probe()
1352 qed_ops->common->remove(cdev); in __qede_probe()
1363 switch ((enum qede_pci_private)id->driver_data) { in qede_probe()
1366 dev_err(&pdev->dev, "Probing a VF\n"); in qede_probe()
1371 dev_err(&pdev->dev, "Probing a PF\n"); in qede_probe()
1392 dev_info(&pdev->dev, "Device has already been removed\n"); in __qede_remove()
1397 cdev = edev->cdev; 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()
1418 qed_ops->common->slowpath_stop(cdev); 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()
1426 qed_ops->common->remove(cdev); in __qede_remove()
1427 edev->cdev = NULL; in __qede_remove()
1429 /* Since this can happen out-of-sync with other flows, in __qede_remove()
1436 kfree(edev->coal_entry); in __qede_remove()
1440 dev_info(&pdev->dev, "Ending qede_remove successfully\n"); in __qede_remove()
1453 /* -------------------------------------------------------------------------
1455 * -------------------------------------------------------------------------
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()
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()
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()
1490 if (sb_info->sb_virt) { in qede_free_mem_sb()
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()
1494 (void *)sb_info->sb_virt, sb_info->sb_phys); in qede_free_mem_sb()
1499 /* This function allocates fast-path status block memory */
1507 sb_virt = dma_alloc_coherent(&edev->pdev->dev, in qede_alloc_mem_sb()
1511 return -ENOMEM; in qede_alloc_mem_sb()
1514 rc = edev->ops->common->sb_init(edev->cdev, sb_info, in qede_alloc_mem_sb()
1519 dma_free_coherent(&edev->pdev->dev, sizeof(*sb_virt), in qede_alloc_mem_sb()
1532 for (i = rxq->sw_rx_cons; i != rxq->sw_rx_prod; i++) { in qede_free_rx_buffers()
1536 rx_buf = &rxq->sw_rx_ring[i & NUM_RX_BDS_MAX]; in qede_free_rx_buffers()
1537 data = rx_buf->data; in qede_free_rx_buffers()
1539 dma_unmap_page(&edev->pdev->dev, in qede_free_rx_buffers()
1540 rx_buf->mapping, PAGE_SIZE, rxq->data_direction); in qede_free_rx_buffers()
1542 rx_buf->data = NULL; in qede_free_rx_buffers()
1553 kfree(rxq->sw_rx_ring); 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()
1565 struct qede_agg_info *tpa_info = &rxq->tpa_info[i]; in qede_set_tpa_param()
1567 tpa_info->state = QEDE_AGG_STATE_NONE; in qede_set_tpa_param()
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()
1586 size = rxq->rx_headroom + in qede_alloc_mem_rxq()
1590 if (rxq->rx_buf_size + size > PAGE_SIZE) in qede_alloc_mem_rxq()
1591 rxq->rx_buf_size = PAGE_SIZE - size; in qede_alloc_mem_rxq()
1596 if (!edev->xdp_prog) { in qede_alloc_mem_rxq()
1597 size = size + rxq->rx_buf_size; in qede_alloc_mem_rxq()
1598 rxq->rx_buf_seg_size = roundup_pow_of_two(size); in qede_alloc_mem_rxq()
1600 rxq->rx_buf_seg_size = PAGE_SIZE; in qede_alloc_mem_rxq()
1601 edev->ndev->features &= ~NETIF_F_GRO_HW; in qede_alloc_mem_rxq()
1605 size = sizeof(*rxq->sw_rx_ring) * RX_RING_SIZE; in qede_alloc_mem_rxq()
1606 rxq->sw_rx_ring = kzalloc(size, GFP_KERNEL); in qede_alloc_mem_rxq()
1607 if (!rxq->sw_rx_ring) { in qede_alloc_mem_rxq()
1609 rc = -ENOMEM; in qede_alloc_mem_rxq()
1618 rc = edev->ops->common->chain_alloc(cdev, &rxq->rx_bd_ring, ¶ms); in qede_alloc_mem_rxq()
1627 rc = edev->ops->common->chain_alloc(cdev, &rxq->rx_comp_ring, ¶ms); in qede_alloc_mem_rxq()
1632 rxq->filled_buffers = 0; in qede_alloc_mem_rxq()
1633 for (i = 0; i < rxq->num_rx_buffers; i++) { 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()
1652 if (txq->is_xdp) in qede_free_mem_txq()
1653 kfree(txq->sw_tx_ring.xdp); in qede_free_mem_txq()
1655 kfree(txq->sw_tx_ring.skbs); in qede_free_mem_txq()
1658 edev->ops->common->chain_free(edev->cdev, &txq->tx_pbl); in qede_free_mem_txq()
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()
1676 if (txq->is_xdp) { in qede_alloc_mem_txq()
1677 size = sizeof(*txq->sw_tx_ring.xdp) * txq->num_tx_buffers; in qede_alloc_mem_txq()
1678 txq->sw_tx_ring.xdp = kzalloc(size, GFP_KERNEL); in qede_alloc_mem_txq()
1679 if (!txq->sw_tx_ring.xdp) in qede_alloc_mem_txq()
1682 size = sizeof(*txq->sw_tx_ring.skbs) * txq->num_tx_buffers; in qede_alloc_mem_txq()
1683 txq->sw_tx_ring.skbs = kzalloc(size, GFP_KERNEL); in qede_alloc_mem_txq()
1684 if (!txq->sw_tx_ring.skbs) in qede_alloc_mem_txq()
1688 rc = edev->ops->common->chain_alloc(edev->cdev, &txq->tx_pbl, ¶ms); in qede_alloc_mem_txq()
1696 return -ENOMEM; in qede_alloc_mem_txq()
1702 qede_free_mem_sb(edev, fp->sb_info, fp->id); in qede_free_mem_fp()
1704 if (fp->type & QEDE_FASTPATH_RX) in qede_free_mem_fp()
1705 qede_free_mem_rxq(edev, fp->rxq); in qede_free_mem_fp()
1707 if (fp->type & QEDE_FASTPATH_XDP) in qede_free_mem_fp()
1708 qede_free_mem_txq(edev, fp->xdp_tx); in qede_free_mem_fp()
1710 if (fp->type & QEDE_FASTPATH_TX) { in qede_free_mem_fp()
1714 qede_free_mem_txq(edev, &fp->txq[cos]); in qede_free_mem_fp()
1719 * which contains status block, one rx queue and/or multiple per-TC tx queues.
1725 rc = qede_alloc_mem_sb(edev, fp->sb_info, fp->id); in qede_alloc_mem_fp()
1729 if (fp->type & QEDE_FASTPATH_RX) { in qede_alloc_mem_fp()
1730 rc = qede_alloc_mem_rxq(edev, fp->rxq); in qede_alloc_mem_fp()
1735 if (fp->type & QEDE_FASTPATH_XDP) { in qede_alloc_mem_fp()
1736 rc = qede_alloc_mem_txq(edev, fp->xdp_tx); in qede_alloc_mem_fp()
1741 if (fp->type & QEDE_FASTPATH_TX) { in qede_alloc_mem_fp()
1745 rc = qede_alloc_mem_txq(edev, &fp->txq[cos]); in qede_alloc_mem_fp()
1760 struct qede_fastpath *fp = &edev->fp_array[i]; in qede_free_mem_load()
1772 struct qede_fastpath *fp = &edev->fp_array[queue_id]; in qede_alloc_mem_load()
1777 "Failed to allocate memory for fastpath - rss id = %d\n", in qede_alloc_mem_load()
1794 netdev_txq = netdev_get_tx_queue(edev->ndev, txq->ndev_txq_id); in qede_empty_tx_queue()
1796 while (qed_chain_get_cons_idx(&txq->tx_pbl) != in qede_empty_tx_queue()
1797 qed_chain_get_prod_idx(&txq->tx_pbl)) { in qede_empty_tx_queue()
1800 txq->index, qed_chain_get_cons_idx(&txq->tx_pbl), in qede_empty_tx_queue()
1801 qed_chain_get_prod_idx(&txq->tx_pbl)); in qede_empty_tx_queue()
1807 txq->index, in qede_empty_tx_queue()
1808 qed_chain_get_cons_idx(&txq->tx_pbl), in qede_empty_tx_queue()
1809 qed_chain_get_prod_idx(&txq->tx_pbl)); in qede_empty_tx_queue()
1815 txq->sw_tx_cons++; in qede_empty_tx_queue()
1826 if (edev->fp_array[i].type & QEDE_FASTPATH_TX) { in qede_empty_tx_queues()
1832 fp = &edev->fp_array[i]; in qede_empty_tx_queues()
1834 &fp->txq[cos]); in qede_empty_tx_queues()
1847 fp = &edev->fp_array[queue_id]; in qede_init_fp()
1849 fp->edev = edev; in qede_init_fp()
1850 fp->id = queue_id; in qede_init_fp()
1852 if (fp->type & QEDE_FASTPATH_XDP) { in qede_init_fp()
1853 fp->xdp_tx->index = QEDE_TXQ_IDX_TO_XDP(edev, in qede_init_fp()
1855 fp->xdp_tx->is_xdp = 1; in qede_init_fp()
1857 spin_lock_init(&fp->xdp_tx->xdp_tx_lock); in qede_init_fp()
1861 if (fp->type & QEDE_FASTPATH_RX) { in qede_init_fp()
1862 fp->rxq->rxq_id = rxq_index++; in qede_init_fp()
1865 if (fp->type & QEDE_FASTPATH_XDP) in qede_init_fp()
1866 fp->rxq->data_direction = DMA_BIDIRECTIONAL; in qede_init_fp()
1868 fp->rxq->data_direction = DMA_FROM_DEVICE; 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()
1873 fp->rxq->rxq_id, 0) < 0); in qede_init_fp()
1875 if (xdp_rxq_info_reg_mem_model(&fp->rxq->xdp_rxq, in qede_init_fp()
1883 if (fp->type & QEDE_FASTPATH_TX) { in qede_init_fp()
1887 struct qede_tx_queue *txq = &fp->txq[cos]; in qede_init_fp()
1890 txq->cos = cos; in qede_init_fp()
1891 txq->index = txq_index; in qede_init_fp()
1893 txq->ndev_txq_id = ndev_tx_id; in qede_init_fp()
1895 if (edev->dev_info.is_legacy) in qede_init_fp()
1896 txq->is_legacy = true; in qede_init_fp()
1897 txq->dev = &edev->pdev->dev; in qede_init_fp()
1903 snprintf(fp->name, sizeof(fp->name), "%s-fp-%d", 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()
1917 rc = netif_set_real_num_tx_queues(edev->ndev, in qede_set_real_num_queues()
1919 edev->dev_info.num_tc); 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()
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()
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()
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()
1978 if (QEDE_QUEUE_CNT(edev) > edev->int_info.msix_cnt) { in qede_req_msix_irqs()
1980 "Interrupt mismatch: %d RSS queues > %d MSI-x vectors\n", in qede_req_msix_irqs()
1981 QEDE_QUEUE_CNT(edev), edev->int_info.msix_cnt); in qede_req_msix_irqs()
1982 return -EINVAL; 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()
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()
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()
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()
2026 napi_schedule_irqoff(&fp->napi); in qede_simd_fp_handler()
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()
2042 edev->ndev->irq = edev->int_info.msix[0].vector; in qede_setup_irqs()
2047 ops = edev->ops->common; 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()
2062 while (txq->sw_tx_cons != txq->sw_tx_prod) { in qede_drain_txq()
2067 txq->index); in qede_drain_txq()
2068 rc = edev->ops->common->drain(edev->cdev); in qede_drain_txq()
2075 txq->index, txq->sw_tx_prod, in qede_drain_txq()
2076 txq->sw_tx_cons); in qede_drain_txq()
2077 return -ENODEV; in qede_drain_txq()
2079 cnt--; in qede_drain_txq()
2094 edev->ops->common->db_recovery_del(edev->cdev, txq->doorbell_addr, in qede_stop_txq()
2095 &txq->tx_db); in qede_stop_txq()
2097 return edev->ops->q_tx_stop(edev->cdev, rss_id, txq->handle); in qede_stop_txq()
2103 struct qed_dev *cdev = edev->cdev; in qede_stop_queues()
2110 return -ENOMEM; in qede_stop_queues()
2112 vport_update_params->vport_id = 0; in qede_stop_queues()
2113 vport_update_params->update_vport_active_flg = 1; in qede_stop_queues()
2114 vport_update_params->vport_active_flg = 0; in qede_stop_queues()
2115 vport_update_params->update_rss_flg = 0; in qede_stop_queues()
2117 rc = edev->ops->vport_update(cdev, vport_update_params); in qede_stop_queues()
2127 fp = &edev->fp_array[i]; in qede_stop_queues()
2129 if (fp->type & QEDE_FASTPATH_TX) { in qede_stop_queues()
2133 rc = qede_drain_txq(edev, &fp->txq[cos], true); in qede_stop_queues()
2139 if (fp->type & QEDE_FASTPATH_XDP) { 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()
2151 if (fp->type & QEDE_FASTPATH_TX) { in qede_stop_queues()
2155 rc = qede_stop_txq(edev, &fp->txq[cos], i); in qede_stop_queues()
2162 if (fp->type & QEDE_FASTPATH_RX) { in qede_stop_queues()
2163 rc = edev->ops->q_rx_stop(cdev, i, fp->rxq->handle); in qede_stop_queues()
2171 if (fp->type & QEDE_FASTPATH_XDP) { in qede_stop_queues()
2172 rc = qede_stop_txq(edev, fp->xdp_tx, i); in qede_stop_queues()
2176 bpf_prog_put(fp->rxq->xdp_prog); in qede_stop_queues()
2181 rc = edev->ops->vport_stop(cdev, 0); in qede_stop_queues()
2192 dma_addr_t phys_table = qed_chain_get_pbl_phys(&txq->tx_pbl); in qede_start_txq()
2193 u32 page_cnt = qed_chain_get_page_cnt(&txq->tx_pbl); in qede_start_txq()
2201 /* Let the XDP queue share the queue-zone with one of the regular txq. in qede_start_txq()
2204 if (txq->is_xdp) in qede_start_txq()
2207 params.queue_id = txq->index; in qede_start_txq()
2209 params.p_sb = fp->sb_info; in qede_start_txq()
2211 params.tc = txq->cos; in qede_start_txq()
2213 rc = edev->ops->q_tx_start(edev->cdev, rss_id, ¶ms, phys_table, in qede_start_txq()
2216 DP_ERR(edev, "Start TXQ #%d failed %d\n", txq->index, rc); in qede_start_txq()
2220 txq->doorbell_addr = ret_params.p_doorbell; in qede_start_txq()
2221 txq->handle = ret_params.p_handle; in qede_start_txq()
2224 txq->hw_cons_ptr = &fp->sb_info->sb_virt->pi_array[sb_idx]; in qede_start_txq()
2227 SET_FIELD(txq->tx_db.data.params, ETH_DB_DATA_DEST, DB_DEST_XCM); in qede_start_txq()
2228 SET_FIELD(txq->tx_db.data.params, ETH_DB_DATA_AGG_CMD, DB_AGG_CMD_SET); in qede_start_txq()
2229 SET_FIELD(txq->tx_db.data.params, ETH_DB_DATA_AGG_VAL_SEL, in qede_start_txq()
2231 txq->tx_db.data.agg_flags = DQ_XCM_ETH_DQ_CF_CMD; in qede_start_txq()
2234 rc = edev->ops->common->db_recovery_add(edev->cdev, txq->doorbell_addr, in qede_start_txq()
2235 &txq->tx_db, DB_REC_WIDTH_32B, in qede_start_txq()
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()
2253 "Cannot update V-VPORT as active as there are no Rx queues\n"); in qede_start_queues()
2254 return -EINVAL; in qede_start_queues()
2259 return -ENOMEM; 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()
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()
2285 if (fp->type & QEDE_FASTPATH_RX) { in qede_start_queues()
2287 struct qede_rx_queue *rxq = fp->rxq; in qede_start_queues()
2292 q_params.queue_id = rxq->rxq_id; in qede_start_queues()
2294 q_params.p_sb = fp->sb_info; in qede_start_queues()
2298 qed_chain_get_pbl_phys(&rxq->rx_comp_ring); in qede_start_queues()
2299 page_cnt = qed_chain_get_page_cnt(&rxq->rx_comp_ring); in qede_start_queues()
2301 rc = edev->ops->q_rx_start(cdev, i, &q_params, in qede_start_queues()
2302 rxq->rx_buf_size, in qede_start_queues()
2303 rxq->rx_bd_ring.p_phys_addr, in qede_start_queues()
2313 rxq->hw_rxq_prod_addr = ret_params.p_prod; in qede_start_queues()
2314 rxq->handle = ret_params.p_handle; in qede_start_queues()
2316 val = &fp->sb_info->sb_virt->pi_array[RX_PI]; in qede_start_queues()
2317 rxq->hw_cons_ptr = val; in qede_start_queues()
2322 if (fp->type & QEDE_FASTPATH_XDP) { 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()
2331 if (fp->type & QEDE_FASTPATH_TX) { in qede_start_queues()
2335 rc = qede_start_txq(edev, fp, &fp->txq[cos], i, in qede_start_queues()
2344 vport_update_params->vport_id = start.vport_id; in qede_start_queues()
2345 vport_update_params->update_vport_active_flg = 1; in qede_start_queues()
2346 vport_update_params->vport_active_flg = 1; in qede_start_queues()
2348 if ((qed_info->b_inter_pf_switch || pci_num_vf(edev->pdev)) && in qede_start_queues()
2349 qed_info->tx_switching) { in qede_start_queues()
2350 vport_update_params->update_tx_switching_flg = 1; in qede_start_queues()
2351 vport_update_params->tx_switching_flg = 1; in qede_start_queues()
2354 qede_fill_rss_params(edev, &vport_update_params->rss_params, in qede_start_queues()
2355 &vport_update_params->update_rss_flg); 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()
2382 clear_bit(QEDE_FLAGS_LINK_REQUESTED, &edev->flags); in qede_unload()
2385 edev->state = QEDE_STATE_CLOSED; 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()
2402 if (edev->dev_info.common.b_arfs_capable) { 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()
2418 edev->ops->fastpath_stop(edev->cdev); in qede_unload()
2420 if (edev->dev_info.common.b_arfs_capable) { in qede_unload()
2427 edev->ops->common->set_fp_int(edev->cdev, 0); in qede_unload()
2444 edev->ptp_skip_txts = 0; in qede_unload()
2489 edev->ndev->features &= ~NETIF_F_NTUPLE; in qede_load()
2490 edev->dev_info.common.b_arfs_capable = false; 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()
2510 /* Program un-configured VLANs */ in qede_load()
2513 set_bit(QEDE_FLAGS_LINK_REQUESTED, &edev->flags); in qede_load()
2515 /* Ask for link-up using current configuration */ 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()
2531 qede_set_per_coalesce(edev->ndev, i, &coal); in qede_load()
2544 edev->ops->common->set_fp_int(edev->cdev, 0); 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()
2569 if (edev->state == QEDE_STATE_OPEN) { in qede_reload()
2572 args->func(edev, args); in qede_reload()
2575 /* Since no one is going to do it for us, re-configure */ in qede_reload()
2576 qede_config_rx_mode(edev->ndev); in qede_reload()
2578 args->func(edev, args); in qede_reload()
2593 edev->ops->common->set_power_state(edev->cdev, PCI_D0); in qede_open()
2601 edev->ops->common->update_drv_state(edev->cdev, true); in qede_open()
2612 if (edev->cdev) in qede_close()
2613 edev->ops->common->update_drv_state(edev->cdev, false); in qede_close()
2622 if (!test_bit(QEDE_FLAGS_LINK_REQUESTED, &edev->flags)) { in qede_link_update()
2627 if (link->link_up) { in qede_link_update()
2628 if (!netif_carrier_ok(edev->ndev)) { 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()
2635 if (netif_carrier_ok(edev->ndev)) { in qede_link_update()
2637 netif_tx_disable(edev->ndev); in qede_link_update()
2638 netif_carrier_off(edev->ndev); in qede_link_update()
2648 if (edev->state == QEDE_STATE_RECOVERY) { 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()
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()
2672 u32 curr_state = edev->state; 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()
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()
2692 edev->cdev = NULL; 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()
2717 struct qed_dev *cdev = edev->cdev; in qede_atomic_hw_err_handler()
2720 "Generic non-sleepable HW error handling started - err_flags 0x%lx\n", 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()
2736 "Generic sleepable HW error handling started - err_flags 0x%lx\n", 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()
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()
2773 edev->err_flags |= err_flags; in qede_set_hw_err_flags()
2781 /* Fan failure cannot be masked by handling of another HW error or by a in qede_schedule_hw_err_handler()
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()
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()
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()
2811 netdev_txq = netdev_get_tx_queue(edev->ndev, txq->ndev_txq_id); in qede_is_txq_full()
2824 if (edev->ndev->features & NETIF_F_IP_CSUM) in qede_get_generic_tlv_data()
2825 data->feat_flags |= QED_TLV_IP_CSUM; in qede_get_generic_tlv_data()
2826 if (edev->ndev->features & NETIF_F_TSO) in qede_get_generic_tlv_data()
2827 data->feat_flags |= QED_TLV_LSO; in qede_get_generic_tlv_data()
2829 ether_addr_copy(data->mac[0], edev->ndev->dev_addr); in qede_get_generic_tlv_data()
2830 eth_zero_addr(data->mac[1]); in qede_get_generic_tlv_data()
2831 eth_zero_addr(data->mac[2]); 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()
2836 ether_addr_copy(data->mac[i++], ha->addr); in qede_get_generic_tlv_data()
2841 netif_addr_unlock_bh(edev->ndev); in qede_get_generic_tlv_data()
2851 etlv->lso_maxoff_size = 0XFFFF; in qede_get_eth_tlv_data()
2852 etlv->lso_maxoff_size_set = true; in qede_get_eth_tlv_data()
2853 etlv->lso_minseg_size = (u16)ETH_TX_LSO_WINDOW_MIN_LEN; in qede_get_eth_tlv_data()
2854 etlv->lso_minseg_size_set = true; in qede_get_eth_tlv_data()
2855 etlv->prom_mode = !!(edev->ndev->flags & IFF_PROMISC); in qede_get_eth_tlv_data()
2856 etlv->prom_mode_set = true; in qede_get_eth_tlv_data()
2857 etlv->tx_descr_size = QEDE_TSS_COUNT(edev); in qede_get_eth_tlv_data()
2858 etlv->tx_descr_size_set = true; in qede_get_eth_tlv_data()
2859 etlv->rx_descr_size = QEDE_RSS_COUNT(edev); in qede_get_eth_tlv_data()
2860 etlv->rx_descr_size_set = true; in qede_get_eth_tlv_data()
2861 etlv->iov_offload = QED_MFW_TLV_IOV_OFFLOAD_VEB; in qede_get_eth_tlv_data()
2862 etlv->iov_offload_set = true; in qede_get_eth_tlv_data()
2867 etlv->txqs_empty = true; in qede_get_eth_tlv_data()
2868 etlv->rxqs_empty = true; in qede_get_eth_tlv_data()
2869 etlv->num_txqs_full = 0; in qede_get_eth_tlv_data()
2870 etlv->num_rxqs_full = 0; in qede_get_eth_tlv_data()
2874 fp = &edev->fp_array[i]; in qede_get_eth_tlv_data()
2875 if (fp->type & QEDE_FASTPATH_TX) { in qede_get_eth_tlv_data()
2878 if (txq->sw_tx_cons != txq->sw_tx_prod) in qede_get_eth_tlv_data()
2879 etlv->txqs_empty = false; in qede_get_eth_tlv_data()
2881 etlv->num_txqs_full++; in qede_get_eth_tlv_data()
2883 if (fp->type & QEDE_FASTPATH_RX) { in qede_get_eth_tlv_data()
2884 if (qede_has_rx_work(fp->rxq)) in qede_get_eth_tlv_data()
2885 etlv->rxqs_empty = false; in qede_get_eth_tlv_data()
2891 if (le16_to_cpu(*fp->rxq->hw_cons_ptr) - in qede_get_eth_tlv_data()
2892 qed_chain_get_cons_idx(&fp->rxq->rx_comp_ring) > in qede_get_eth_tlv_data()
2893 RX_RING_SIZE - 100) in qede_get_eth_tlv_data()
2894 etlv->num_rxqs_full++; in qede_get_eth_tlv_data()
2899 etlv->txqs_empty_set = true; in qede_get_eth_tlv_data()
2900 etlv->rxqs_empty_set = true; in qede_get_eth_tlv_data()
2901 etlv->num_txqs_full_set = true; in qede_get_eth_tlv_data()
2902 etlv->num_rxqs_full_set = true; in qede_get_eth_tlv_data()
2928 if (edev->state == QEDE_STATE_RECOVERY) { 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()