12ea6f76aSRasesh Mody /* 22ea6f76aSRasesh Mody * Copyright (c) 2016 QLogic Corporation. 32ea6f76aSRasesh Mody * All rights reserved. 42ea6f76aSRasesh Mody * www.qlogic.com 52ea6f76aSRasesh Mody * 62ea6f76aSRasesh Mody * See LICENSE.qede_pmd for copyright and licensing details. 72ea6f76aSRasesh Mody */ 82ea6f76aSRasesh Mody 92ea6f76aSRasesh Mody #include "qede_ethdev.h" 102af14ca7SHarish Patil #include <rte_alarm.h> 117eca78ceSHarish Patil #include <rte_version.h> 122ea6f76aSRasesh Mody 132ea6f76aSRasesh Mody /* Globals */ 142ea6f76aSRasesh Mody static const struct qed_eth_ops *qed_ops; 152af14ca7SHarish Patil static int64_t timer_period = 1; 162ea6f76aSRasesh Mody 1752d94b57SHarish Patil /* VXLAN tunnel classification mapping */ 1852d94b57SHarish Patil const struct _qede_vxlan_tunn_types { 1952d94b57SHarish Patil uint16_t rte_filter_type; 2052d94b57SHarish Patil enum ecore_filter_ucast_type qede_type; 2152d94b57SHarish Patil enum ecore_tunn_clss qede_tunn_clss; 2252d94b57SHarish Patil const char *string; 2352d94b57SHarish Patil } qede_tunn_types[] = { 2452d94b57SHarish Patil { 2552d94b57SHarish Patil ETH_TUNNEL_FILTER_OMAC, 2652d94b57SHarish Patil ECORE_FILTER_MAC, 2752d94b57SHarish Patil ECORE_TUNN_CLSS_MAC_VLAN, 2852d94b57SHarish Patil "outer-mac" 2952d94b57SHarish Patil }, 3052d94b57SHarish Patil { 3152d94b57SHarish Patil ETH_TUNNEL_FILTER_TENID, 3252d94b57SHarish Patil ECORE_FILTER_VNI, 3352d94b57SHarish Patil ECORE_TUNN_CLSS_MAC_VNI, 3452d94b57SHarish Patil "vni" 3552d94b57SHarish Patil }, 3652d94b57SHarish Patil { 3752d94b57SHarish Patil ETH_TUNNEL_FILTER_IMAC, 3852d94b57SHarish Patil ECORE_FILTER_INNER_MAC, 3952d94b57SHarish Patil ECORE_TUNN_CLSS_INNER_MAC_VLAN, 4052d94b57SHarish Patil "inner-mac" 4152d94b57SHarish Patil }, 4252d94b57SHarish Patil { 4352d94b57SHarish Patil ETH_TUNNEL_FILTER_IVLAN, 4452d94b57SHarish Patil ECORE_FILTER_INNER_VLAN, 4552d94b57SHarish Patil ECORE_TUNN_CLSS_INNER_MAC_VLAN, 4652d94b57SHarish Patil "inner-vlan" 4752d94b57SHarish Patil }, 4852d94b57SHarish Patil { 4952d94b57SHarish Patil ETH_TUNNEL_FILTER_OMAC | ETH_TUNNEL_FILTER_TENID, 5052d94b57SHarish Patil ECORE_FILTER_MAC_VNI_PAIR, 5152d94b57SHarish Patil ECORE_TUNN_CLSS_MAC_VNI, 5252d94b57SHarish Patil "outer-mac and vni" 5352d94b57SHarish Patil }, 5452d94b57SHarish Patil { 5552d94b57SHarish Patil ETH_TUNNEL_FILTER_OMAC | ETH_TUNNEL_FILTER_IMAC, 5652d94b57SHarish Patil ECORE_FILTER_UNUSED, 5752d94b57SHarish Patil MAX_ECORE_TUNN_CLSS, 5852d94b57SHarish Patil "outer-mac and inner-mac" 5952d94b57SHarish Patil }, 6052d94b57SHarish Patil { 6152d94b57SHarish Patil ETH_TUNNEL_FILTER_OMAC | ETH_TUNNEL_FILTER_IVLAN, 6252d94b57SHarish Patil ECORE_FILTER_UNUSED, 6352d94b57SHarish Patil MAX_ECORE_TUNN_CLSS, 6452d94b57SHarish Patil "outer-mac and inner-vlan" 6552d94b57SHarish Patil }, 6652d94b57SHarish Patil { 6752d94b57SHarish Patil ETH_TUNNEL_FILTER_TENID | ETH_TUNNEL_FILTER_IMAC, 6852d94b57SHarish Patil ECORE_FILTER_INNER_MAC_VNI_PAIR, 6952d94b57SHarish Patil ECORE_TUNN_CLSS_INNER_MAC_VNI, 7052d94b57SHarish Patil "vni and inner-mac", 7152d94b57SHarish Patil }, 7252d94b57SHarish Patil { 7352d94b57SHarish Patil ETH_TUNNEL_FILTER_TENID | ETH_TUNNEL_FILTER_IVLAN, 7452d94b57SHarish Patil ECORE_FILTER_UNUSED, 7552d94b57SHarish Patil MAX_ECORE_TUNN_CLSS, 7652d94b57SHarish Patil "vni and inner-vlan", 7752d94b57SHarish Patil }, 7852d94b57SHarish Patil { 7952d94b57SHarish Patil ETH_TUNNEL_FILTER_IMAC | ETH_TUNNEL_FILTER_IVLAN, 8052d94b57SHarish Patil ECORE_FILTER_INNER_PAIR, 8152d94b57SHarish Patil ECORE_TUNN_CLSS_INNER_MAC_VLAN, 8252d94b57SHarish Patil "inner-mac and inner-vlan", 8352d94b57SHarish Patil }, 8452d94b57SHarish Patil { 8552d94b57SHarish Patil ETH_TUNNEL_FILTER_OIP, 8652d94b57SHarish Patil ECORE_FILTER_UNUSED, 8752d94b57SHarish Patil MAX_ECORE_TUNN_CLSS, 8852d94b57SHarish Patil "outer-IP" 8952d94b57SHarish Patil }, 9052d94b57SHarish Patil { 9152d94b57SHarish Patil ETH_TUNNEL_FILTER_IIP, 9252d94b57SHarish Patil ECORE_FILTER_UNUSED, 9352d94b57SHarish Patil MAX_ECORE_TUNN_CLSS, 9452d94b57SHarish Patil "inner-IP" 9552d94b57SHarish Patil }, 9652d94b57SHarish Patil { 9752d94b57SHarish Patil RTE_TUNNEL_FILTER_IMAC_IVLAN, 9852d94b57SHarish Patil ECORE_FILTER_UNUSED, 9952d94b57SHarish Patil MAX_ECORE_TUNN_CLSS, 10052d94b57SHarish Patil "IMAC_IVLAN" 10152d94b57SHarish Patil }, 10252d94b57SHarish Patil { 10352d94b57SHarish Patil RTE_TUNNEL_FILTER_IMAC_IVLAN_TENID, 10452d94b57SHarish Patil ECORE_FILTER_UNUSED, 10552d94b57SHarish Patil MAX_ECORE_TUNN_CLSS, 10652d94b57SHarish Patil "IMAC_IVLAN_TENID" 10752d94b57SHarish Patil }, 10852d94b57SHarish Patil { 10952d94b57SHarish Patil RTE_TUNNEL_FILTER_IMAC_TENID, 11052d94b57SHarish Patil ECORE_FILTER_UNUSED, 11152d94b57SHarish Patil MAX_ECORE_TUNN_CLSS, 11252d94b57SHarish Patil "IMAC_TENID" 11352d94b57SHarish Patil }, 11452d94b57SHarish Patil { 11552d94b57SHarish Patil RTE_TUNNEL_FILTER_OMAC_TENID_IMAC, 11652d94b57SHarish Patil ECORE_FILTER_UNUSED, 11752d94b57SHarish Patil MAX_ECORE_TUNN_CLSS, 11852d94b57SHarish Patil "OMAC_TENID_IMAC" 11952d94b57SHarish Patil }, 12052d94b57SHarish Patil }; 12152d94b57SHarish Patil 122d1216e22SRasesh Mody struct rte_qede_xstats_name_off { 123d1216e22SRasesh Mody char name[RTE_ETH_XSTATS_NAME_SIZE]; 124d1216e22SRasesh Mody uint64_t offset; 125d1216e22SRasesh Mody }; 126d1216e22SRasesh Mody 127d1216e22SRasesh Mody static const struct rte_qede_xstats_name_off qede_xstats_strings[] = { 1289c1aa3e1SRasesh Mody {"rx_unicast_bytes", 1299c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, rx_ucast_bytes)}, 130d1216e22SRasesh Mody {"rx_multicast_bytes", 1319c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, rx_mcast_bytes)}, 132d1216e22SRasesh Mody {"rx_broadcast_bytes", 1339c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, rx_bcast_bytes)}, 1349c1aa3e1SRasesh Mody {"rx_unicast_packets", 1359c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, rx_ucast_pkts)}, 136d1216e22SRasesh Mody {"rx_multicast_packets", 1379c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, rx_mcast_pkts)}, 138d1216e22SRasesh Mody {"rx_broadcast_packets", 1399c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, rx_bcast_pkts)}, 140d1216e22SRasesh Mody 1419c1aa3e1SRasesh Mody {"tx_unicast_bytes", 1429c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, tx_ucast_bytes)}, 143d1216e22SRasesh Mody {"tx_multicast_bytes", 1449c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, tx_mcast_bytes)}, 145d1216e22SRasesh Mody {"tx_broadcast_bytes", 1469c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, tx_bcast_bytes)}, 1479c1aa3e1SRasesh Mody {"tx_unicast_packets", 1489c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, tx_ucast_pkts)}, 149d1216e22SRasesh Mody {"tx_multicast_packets", 1509c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, tx_mcast_pkts)}, 151d1216e22SRasesh Mody {"tx_broadcast_packets", 1529c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, tx_bcast_pkts)}, 153d1216e22SRasesh Mody 154d1216e22SRasesh Mody {"rx_64_byte_packets", 1559c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, rx_64_byte_packets)}, 156d1216e22SRasesh Mody {"rx_65_to_127_byte_packets", 1579c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, 1589c1aa3e1SRasesh Mody rx_65_to_127_byte_packets)}, 159d1216e22SRasesh Mody {"rx_128_to_255_byte_packets", 1609c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, 1619c1aa3e1SRasesh Mody rx_128_to_255_byte_packets)}, 162d1216e22SRasesh Mody {"rx_256_to_511_byte_packets", 1639c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, 1649c1aa3e1SRasesh Mody rx_256_to_511_byte_packets)}, 165d1216e22SRasesh Mody {"rx_512_to_1023_byte_packets", 1669c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, 1679c1aa3e1SRasesh Mody rx_512_to_1023_byte_packets)}, 168d1216e22SRasesh Mody {"rx_1024_to_1518_byte_packets", 1699c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, 1709c1aa3e1SRasesh Mody rx_1024_to_1518_byte_packets)}, 171d1216e22SRasesh Mody {"tx_64_byte_packets", 1729c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, tx_64_byte_packets)}, 173d1216e22SRasesh Mody {"tx_65_to_127_byte_packets", 1749c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, 1759c1aa3e1SRasesh Mody tx_65_to_127_byte_packets)}, 176d1216e22SRasesh Mody {"tx_128_to_255_byte_packets", 1779c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, 1789c1aa3e1SRasesh Mody tx_128_to_255_byte_packets)}, 179d1216e22SRasesh Mody {"tx_256_to_511_byte_packets", 1809c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, 1819c1aa3e1SRasesh Mody tx_256_to_511_byte_packets)}, 182d1216e22SRasesh Mody {"tx_512_to_1023_byte_packets", 1839c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, 1849c1aa3e1SRasesh Mody tx_512_to_1023_byte_packets)}, 185d1216e22SRasesh Mody {"tx_1024_to_1518_byte_packets", 1869c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, 1879c1aa3e1SRasesh Mody tx_1024_to_1518_byte_packets)}, 188d1216e22SRasesh Mody 189d1216e22SRasesh Mody {"rx_mac_crtl_frames", 1909c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, rx_mac_crtl_frames)}, 191d1216e22SRasesh Mody {"tx_mac_control_frames", 1929c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, tx_mac_ctrl_frames)}, 1939c1aa3e1SRasesh Mody {"rx_pause_frames", 1949c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, rx_pause_frames)}, 1959c1aa3e1SRasesh Mody {"tx_pause_frames", 1969c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, tx_pause_frames)}, 197d1216e22SRasesh Mody {"rx_priority_flow_control_frames", 1989c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, rx_pfc_frames)}, 199d1216e22SRasesh Mody {"tx_priority_flow_control_frames", 2009c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, tx_pfc_frames)}, 201d1216e22SRasesh Mody 2029c1aa3e1SRasesh Mody {"rx_crc_errors", 2039c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, rx_crc_errors)}, 2049c1aa3e1SRasesh Mody {"rx_align_errors", 2059c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, rx_align_errors)}, 206d1216e22SRasesh Mody {"rx_carrier_errors", 2079c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, rx_carrier_errors)}, 208d1216e22SRasesh Mody {"rx_oversize_packet_errors", 2099c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, rx_oversize_packets)}, 2109c1aa3e1SRasesh Mody {"rx_jabber_errors", 2119c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, rx_jabbers)}, 212d1216e22SRasesh Mody {"rx_undersize_packet_errors", 2139c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, rx_undersize_packets)}, 2149c1aa3e1SRasesh Mody {"rx_fragments", offsetof(struct ecore_eth_stats_common, rx_fragments)}, 215d1216e22SRasesh Mody {"rx_host_buffer_not_available", 2169c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, no_buff_discards)}, 217d1216e22SRasesh Mody /* Number of packets discarded because they are bigger than MTU */ 218d1216e22SRasesh Mody {"rx_packet_too_big_discards", 2199c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, 2209c1aa3e1SRasesh Mody packet_too_big_discard)}, 221d1216e22SRasesh Mody {"rx_ttl_zero_discards", 2229c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, ttl0_discard)}, 223d1216e22SRasesh Mody {"rx_multi_function_tag_filter_discards", 2249c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, mftag_filter_discards)}, 225d1216e22SRasesh Mody {"rx_mac_filter_discards", 2269c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, mac_filter_discards)}, 227d1216e22SRasesh Mody {"rx_hw_buffer_truncates", 2289c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, brb_truncates)}, 229d1216e22SRasesh Mody {"rx_hw_buffer_discards", 2309c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, brb_discards)}, 231d1216e22SRasesh Mody {"tx_error_drop_packets", 2329c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, tx_err_drop_pkts)}, 233d1216e22SRasesh Mody 2349c1aa3e1SRasesh Mody {"rx_mac_bytes", offsetof(struct ecore_eth_stats_common, rx_mac_bytes)}, 235d1216e22SRasesh Mody {"rx_mac_unicast_packets", 2369c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, rx_mac_uc_packets)}, 237d1216e22SRasesh Mody {"rx_mac_multicast_packets", 2389c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, rx_mac_mc_packets)}, 239d1216e22SRasesh Mody {"rx_mac_broadcast_packets", 2409c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, rx_mac_bc_packets)}, 241d1216e22SRasesh Mody {"rx_mac_frames_ok", 2429c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, rx_mac_frames_ok)}, 2439c1aa3e1SRasesh Mody {"tx_mac_bytes", offsetof(struct ecore_eth_stats_common, tx_mac_bytes)}, 244d1216e22SRasesh Mody {"tx_mac_unicast_packets", 2459c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, tx_mac_uc_packets)}, 246d1216e22SRasesh Mody {"tx_mac_multicast_packets", 2479c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, tx_mac_mc_packets)}, 248d1216e22SRasesh Mody {"tx_mac_broadcast_packets", 2499c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, tx_mac_bc_packets)}, 250d1216e22SRasesh Mody 251d1216e22SRasesh Mody {"lro_coalesced_packets", 2529c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, tpa_coalesced_pkts)}, 253d1216e22SRasesh Mody {"lro_coalesced_events", 2549c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, tpa_coalesced_events)}, 255d1216e22SRasesh Mody {"lro_aborts_num", 2569c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, tpa_aborts_num)}, 257d1216e22SRasesh Mody {"lro_not_coalesced_packets", 2589c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, 2599c1aa3e1SRasesh Mody tpa_not_coalesced_pkts)}, 260d1216e22SRasesh Mody {"lro_coalesced_bytes", 2619c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_common, 2629c1aa3e1SRasesh Mody tpa_coalesced_bytes)}, 2639c1aa3e1SRasesh Mody }; 2649c1aa3e1SRasesh Mody 2659c1aa3e1SRasesh Mody static const struct rte_qede_xstats_name_off qede_bb_xstats_strings[] = { 2669c1aa3e1SRasesh Mody {"rx_1519_to_1522_byte_packets", 2679c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats, bb) + 2689c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_bb, 2699c1aa3e1SRasesh Mody rx_1519_to_1522_byte_packets)}, 2709c1aa3e1SRasesh Mody {"rx_1519_to_2047_byte_packets", 2719c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats, bb) + 2729c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_bb, 2739c1aa3e1SRasesh Mody rx_1519_to_2047_byte_packets)}, 2749c1aa3e1SRasesh Mody {"rx_2048_to_4095_byte_packets", 2759c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats, bb) + 2769c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_bb, 2779c1aa3e1SRasesh Mody rx_2048_to_4095_byte_packets)}, 2789c1aa3e1SRasesh Mody {"rx_4096_to_9216_byte_packets", 2799c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats, bb) + 2809c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_bb, 2819c1aa3e1SRasesh Mody rx_4096_to_9216_byte_packets)}, 2829c1aa3e1SRasesh Mody {"rx_9217_to_16383_byte_packets", 2839c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats, bb) + 2849c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_bb, 2859c1aa3e1SRasesh Mody rx_9217_to_16383_byte_packets)}, 2869c1aa3e1SRasesh Mody 2879c1aa3e1SRasesh Mody {"tx_1519_to_2047_byte_packets", 2889c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats, bb) + 2899c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_bb, 2909c1aa3e1SRasesh Mody tx_1519_to_2047_byte_packets)}, 2919c1aa3e1SRasesh Mody {"tx_2048_to_4095_byte_packets", 2929c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats, bb) + 2939c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_bb, 2949c1aa3e1SRasesh Mody tx_2048_to_4095_byte_packets)}, 2959c1aa3e1SRasesh Mody {"tx_4096_to_9216_byte_packets", 2969c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats, bb) + 2979c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_bb, 2989c1aa3e1SRasesh Mody tx_4096_to_9216_byte_packets)}, 2999c1aa3e1SRasesh Mody {"tx_9217_to_16383_byte_packets", 3009c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats, bb) + 3019c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_bb, 3029c1aa3e1SRasesh Mody tx_9217_to_16383_byte_packets)}, 3039c1aa3e1SRasesh Mody 3049c1aa3e1SRasesh Mody {"tx_lpi_entry_count", 3059c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats, bb) + 3069c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_bb, tx_lpi_entry_count)}, 3079c1aa3e1SRasesh Mody {"tx_total_collisions", 3089c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats, bb) + 3099c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_bb, tx_total_collisions)}, 3109c1aa3e1SRasesh Mody }; 3119c1aa3e1SRasesh Mody 3129c1aa3e1SRasesh Mody static const struct rte_qede_xstats_name_off qede_ah_xstats_strings[] = { 3139c1aa3e1SRasesh Mody {"rx_1519_to_max_byte_packets", 3149c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats, ah) + 3159c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_ah, 3169c1aa3e1SRasesh Mody rx_1519_to_max_byte_packets)}, 3179c1aa3e1SRasesh Mody {"tx_1519_to_max_byte_packets", 3189c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats, ah) + 3199c1aa3e1SRasesh Mody offsetof(struct ecore_eth_stats_ah, 3209c1aa3e1SRasesh Mody tx_1519_to_max_byte_packets)}, 321d1216e22SRasesh Mody }; 322d1216e22SRasesh Mody 3237634c5f9SRasesh Mody static const struct rte_qede_xstats_name_off qede_rxq_xstats_strings[] = { 3247634c5f9SRasesh Mody {"rx_q_segments", 3257634c5f9SRasesh Mody offsetof(struct qede_rx_queue, rx_segs)}, 3267634c5f9SRasesh Mody {"rx_q_hw_errors", 3277634c5f9SRasesh Mody offsetof(struct qede_rx_queue, rx_hw_errors)}, 3287634c5f9SRasesh Mody {"rx_q_allocation_errors", 3297634c5f9SRasesh Mody offsetof(struct qede_rx_queue, rx_alloc_errors)} 3307634c5f9SRasesh Mody }; 3317634c5f9SRasesh Mody 3322ea6f76aSRasesh Mody static void qede_interrupt_action(struct ecore_hwfn *p_hwfn) 3332ea6f76aSRasesh Mody { 3342ea6f76aSRasesh Mody ecore_int_sp_dpc((osal_int_ptr_t)(p_hwfn)); 3352ea6f76aSRasesh Mody } 3362ea6f76aSRasesh Mody 3372ea6f76aSRasesh Mody static void 338c23a1a30SQi Zhang qede_interrupt_handler(void *param) 3392ea6f76aSRasesh Mody { 3402ea6f76aSRasesh Mody struct rte_eth_dev *eth_dev = (struct rte_eth_dev *)param; 3412ea6f76aSRasesh Mody struct qede_dev *qdev = eth_dev->data->dev_private; 3422ea6f76aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 3432ea6f76aSRasesh Mody 3442ea6f76aSRasesh Mody qede_interrupt_action(ECORE_LEADING_HWFN(edev)); 345c23a1a30SQi Zhang if (rte_intr_enable(eth_dev->intr_handle)) 3462ea6f76aSRasesh Mody DP_ERR(edev, "rte_intr_enable failed\n"); 3472ea6f76aSRasesh Mody } 3482ea6f76aSRasesh Mody 3492ea6f76aSRasesh Mody static void 3502ea6f76aSRasesh Mody qede_alloc_etherdev(struct qede_dev *qdev, struct qed_dev_eth_info *info) 3512ea6f76aSRasesh Mody { 3522ea6f76aSRasesh Mody rte_memcpy(&qdev->dev_info, info, sizeof(*info)); 3532ea6f76aSRasesh Mody qdev->ops = qed_ops; 3542ea6f76aSRasesh Mody } 3552ea6f76aSRasesh Mody 356af785e47SRasesh Mody #ifdef RTE_LIBRTE_QEDE_DEBUG_INFO 3572ea6f76aSRasesh Mody static void qede_print_adapter_info(struct qede_dev *qdev) 3582ea6f76aSRasesh Mody { 3592ea6f76aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 3602ea6f76aSRasesh Mody struct qed_dev_info *info = &qdev->dev_info.common; 3617eca78ceSHarish Patil static char drv_ver[QEDE_PMD_DRV_VER_STR_SIZE]; 3627eca78ceSHarish Patil static char ver_str[QEDE_PMD_DRV_VER_STR_SIZE]; 3632ea6f76aSRasesh Mody 3642ea6f76aSRasesh Mody DP_INFO(edev, "*********************************\n"); 3657eca78ceSHarish Patil DP_INFO(edev, " DPDK version:%s\n", rte_version()); 3663818ac22SRasesh Mody DP_INFO(edev, " Chip details : %s %c%d\n", 3672ea6f76aSRasesh Mody ECORE_IS_BB(edev) ? "BB" : "AH", 3683818ac22SRasesh Mody 'A' + edev->chip_rev, 3693818ac22SRasesh Mody (int)edev->chip_metal); 3707eca78ceSHarish Patil snprintf(ver_str, QEDE_PMD_DRV_VER_STR_SIZE, "%d.%d.%d.%d", 3717eca78ceSHarish Patil info->fw_major, info->fw_minor, info->fw_rev, info->fw_eng); 3727eca78ceSHarish Patil snprintf(drv_ver, QEDE_PMD_DRV_VER_STR_SIZE, "%s_%s", 3737eca78ceSHarish Patil ver_str, QEDE_PMD_VERSION); 3747eca78ceSHarish Patil DP_INFO(edev, " Driver version : %s\n", drv_ver); 3752ea6f76aSRasesh Mody DP_INFO(edev, " Firmware version : %s\n", ver_str); 3762ea6f76aSRasesh Mody 3777eca78ceSHarish Patil snprintf(ver_str, MCP_DRV_VER_STR_SIZE, 3787eca78ceSHarish Patil "%d.%d.%d.%d", 3792ea6f76aSRasesh Mody (info->mfw_rev >> 24) & 0xff, 3802ea6f76aSRasesh Mody (info->mfw_rev >> 16) & 0xff, 3812ea6f76aSRasesh Mody (info->mfw_rev >> 8) & 0xff, (info->mfw_rev) & 0xff); 3827eca78ceSHarish Patil DP_INFO(edev, " Management Firmware version : %s\n", ver_str); 3832ea6f76aSRasesh Mody DP_INFO(edev, " Firmware file : %s\n", fw_file); 3842ea6f76aSRasesh Mody DP_INFO(edev, "*********************************\n"); 3852ea6f76aSRasesh Mody } 386af785e47SRasesh Mody #endif 3872ea6f76aSRasesh Mody 3889a6d30aeSHarish Patil static int 3899a6d30aeSHarish Patil qede_start_vport(struct qede_dev *qdev, uint16_t mtu) 3909a6d30aeSHarish Patil { 3919a6d30aeSHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 3929a6d30aeSHarish Patil struct ecore_sp_vport_start_params params; 3939a6d30aeSHarish Patil struct ecore_hwfn *p_hwfn; 3949a6d30aeSHarish Patil int rc; 3959a6d30aeSHarish Patil int i; 3969a6d30aeSHarish Patil 3979a6d30aeSHarish Patil memset(¶ms, 0, sizeof(params)); 3989a6d30aeSHarish Patil params.vport_id = 0; 3999a6d30aeSHarish Patil params.mtu = mtu; 4009a6d30aeSHarish Patil /* @DPDK - Disable FW placement */ 4019a6d30aeSHarish Patil params.zero_placement_offset = 1; 4029a6d30aeSHarish Patil for_each_hwfn(edev, i) { 4039a6d30aeSHarish Patil p_hwfn = &edev->hwfns[i]; 4049a6d30aeSHarish Patil params.concrete_fid = p_hwfn->hw_info.concrete_fid; 4059a6d30aeSHarish Patil params.opaque_fid = p_hwfn->hw_info.opaque_fid; 4069a6d30aeSHarish Patil rc = ecore_sp_vport_start(p_hwfn, ¶ms); 4079a6d30aeSHarish Patil if (rc != ECORE_SUCCESS) { 4089a6d30aeSHarish Patil DP_ERR(edev, "Start V-PORT failed %d\n", rc); 4099a6d30aeSHarish Patil return rc; 4109a6d30aeSHarish Patil } 4119a6d30aeSHarish Patil } 4129a6d30aeSHarish Patil ecore_reset_vport_stats(edev); 4139a6d30aeSHarish Patil DP_INFO(edev, "VPORT started with MTU = %u\n", mtu); 4149a6d30aeSHarish Patil 4159a6d30aeSHarish Patil return 0; 4169a6d30aeSHarish Patil } 4179a6d30aeSHarish Patil 4189a6d30aeSHarish Patil static int 4199a6d30aeSHarish Patil qede_stop_vport(struct ecore_dev *edev) 4209a6d30aeSHarish Patil { 4219a6d30aeSHarish Patil struct ecore_hwfn *p_hwfn; 4229a6d30aeSHarish Patil uint8_t vport_id; 4239a6d30aeSHarish Patil int rc; 4249a6d30aeSHarish Patil int i; 4259a6d30aeSHarish Patil 4269a6d30aeSHarish Patil vport_id = 0; 4279a6d30aeSHarish Patil for_each_hwfn(edev, i) { 4289a6d30aeSHarish Patil p_hwfn = &edev->hwfns[i]; 4299a6d30aeSHarish Patil rc = ecore_sp_vport_stop(p_hwfn, p_hwfn->hw_info.opaque_fid, 4309a6d30aeSHarish Patil vport_id); 4319a6d30aeSHarish Patil if (rc != ECORE_SUCCESS) { 4329a6d30aeSHarish Patil DP_ERR(edev, "Stop V-PORT failed rc = %d\n", rc); 4339a6d30aeSHarish Patil return rc; 4349a6d30aeSHarish Patil } 4359a6d30aeSHarish Patil } 4369a6d30aeSHarish Patil 4379a6d30aeSHarish Patil return 0; 4389a6d30aeSHarish Patil } 4399a6d30aeSHarish Patil 4409a6d30aeSHarish Patil /* Activate or deactivate vport via vport-update */ 4419a6d30aeSHarish Patil int qede_activate_vport(struct rte_eth_dev *eth_dev, bool flg) 4429a6d30aeSHarish Patil { 4439a6d30aeSHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 4449a6d30aeSHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 4459a6d30aeSHarish Patil struct ecore_sp_vport_update_params params; 4469a6d30aeSHarish Patil struct ecore_hwfn *p_hwfn; 4479a6d30aeSHarish Patil uint8_t i; 4489a6d30aeSHarish Patil int rc = -1; 4499a6d30aeSHarish Patil 4509a6d30aeSHarish Patil memset(¶ms, 0, sizeof(struct ecore_sp_vport_update_params)); 4519a6d30aeSHarish Patil params.vport_id = 0; 4529a6d30aeSHarish Patil params.update_vport_active_rx_flg = 1; 4539a6d30aeSHarish Patil params.update_vport_active_tx_flg = 1; 4549a6d30aeSHarish Patil params.vport_active_rx_flg = flg; 4559a6d30aeSHarish Patil params.vport_active_tx_flg = flg; 4569a6d30aeSHarish Patil for_each_hwfn(edev, i) { 4579a6d30aeSHarish Patil p_hwfn = &edev->hwfns[i]; 4589a6d30aeSHarish Patil params.opaque_fid = p_hwfn->hw_info.opaque_fid; 4599a6d30aeSHarish Patil rc = ecore_sp_vport_update(p_hwfn, ¶ms, 4609a6d30aeSHarish Patil ECORE_SPQ_MODE_EBLOCK, NULL); 4619a6d30aeSHarish Patil if (rc != ECORE_SUCCESS) { 4629a6d30aeSHarish Patil DP_ERR(edev, "Failed to update vport\n"); 4639a6d30aeSHarish Patil break; 4649a6d30aeSHarish Patil } 4659a6d30aeSHarish Patil } 4669a6d30aeSHarish Patil DP_INFO(edev, "vport %s\n", flg ? "activated" : "deactivated"); 4679a6d30aeSHarish Patil return rc; 4689a6d30aeSHarish Patil } 4699a6d30aeSHarish Patil 4709a6d30aeSHarish Patil static void 4719a6d30aeSHarish Patil qede_update_sge_tpa_params(struct ecore_sge_tpa_params *sge_tpa_params, 4729a6d30aeSHarish Patil uint16_t mtu, bool enable) 4739a6d30aeSHarish Patil { 4749a6d30aeSHarish Patil /* Enable LRO in split mode */ 4759a6d30aeSHarish Patil sge_tpa_params->tpa_ipv4_en_flg = enable; 4769a6d30aeSHarish Patil sge_tpa_params->tpa_ipv6_en_flg = enable; 4779a6d30aeSHarish Patil sge_tpa_params->tpa_ipv4_tunn_en_flg = false; 4789a6d30aeSHarish Patil sge_tpa_params->tpa_ipv6_tunn_en_flg = false; 4799a6d30aeSHarish Patil /* set if tpa enable changes */ 4809a6d30aeSHarish Patil sge_tpa_params->update_tpa_en_flg = 1; 4819a6d30aeSHarish Patil /* set if tpa parameters should be handled */ 4829a6d30aeSHarish Patil sge_tpa_params->update_tpa_param_flg = enable; 4839a6d30aeSHarish Patil 4849a6d30aeSHarish Patil sge_tpa_params->max_buffers_per_cqe = 20; 4859a6d30aeSHarish Patil /* Enable TPA in split mode. In this mode each TPA segment 4869a6d30aeSHarish Patil * starts on the new BD, so there is one BD per segment. 4879a6d30aeSHarish Patil */ 4889a6d30aeSHarish Patil sge_tpa_params->tpa_pkt_split_flg = 1; 4899a6d30aeSHarish Patil sge_tpa_params->tpa_hdr_data_split_flg = 0; 4909a6d30aeSHarish Patil sge_tpa_params->tpa_gro_consistent_flg = 0; 4919a6d30aeSHarish Patil sge_tpa_params->tpa_max_aggs_num = ETH_TPA_MAX_AGGS_NUM; 4929a6d30aeSHarish Patil sge_tpa_params->tpa_max_size = 0x7FFF; 4939a6d30aeSHarish Patil sge_tpa_params->tpa_min_size_to_start = mtu / 2; 4949a6d30aeSHarish Patil sge_tpa_params->tpa_min_size_to_cont = mtu / 2; 4959a6d30aeSHarish Patil } 4969a6d30aeSHarish Patil 4979a6d30aeSHarish Patil /* Enable/disable LRO via vport-update */ 4989a6d30aeSHarish Patil int qede_enable_tpa(struct rte_eth_dev *eth_dev, bool flg) 4999a6d30aeSHarish Patil { 5009a6d30aeSHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 5019a6d30aeSHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 5029a6d30aeSHarish Patil struct ecore_sp_vport_update_params params; 5039a6d30aeSHarish Patil struct ecore_sge_tpa_params tpa_params; 5049a6d30aeSHarish Patil struct ecore_hwfn *p_hwfn; 5059a6d30aeSHarish Patil int rc; 5069a6d30aeSHarish Patil int i; 5079a6d30aeSHarish Patil 5089a6d30aeSHarish Patil memset(¶ms, 0, sizeof(struct ecore_sp_vport_update_params)); 5099a6d30aeSHarish Patil memset(&tpa_params, 0, sizeof(struct ecore_sge_tpa_params)); 5109a6d30aeSHarish Patil qede_update_sge_tpa_params(&tpa_params, qdev->mtu, flg); 5119a6d30aeSHarish Patil params.vport_id = 0; 5129a6d30aeSHarish Patil params.sge_tpa_params = &tpa_params; 5139a6d30aeSHarish Patil for_each_hwfn(edev, i) { 5149a6d30aeSHarish Patil p_hwfn = &edev->hwfns[i]; 5159a6d30aeSHarish Patil params.opaque_fid = p_hwfn->hw_info.opaque_fid; 5169a6d30aeSHarish Patil rc = ecore_sp_vport_update(p_hwfn, ¶ms, 5179a6d30aeSHarish Patil ECORE_SPQ_MODE_EBLOCK, NULL); 5189a6d30aeSHarish Patil if (rc != ECORE_SUCCESS) { 5199a6d30aeSHarish Patil DP_ERR(edev, "Failed to update LRO\n"); 5209a6d30aeSHarish Patil return -1; 5219a6d30aeSHarish Patil } 5229a6d30aeSHarish Patil } 5239a6d30aeSHarish Patil 5249a6d30aeSHarish Patil DP_INFO(edev, "LRO is %s\n", flg ? "enabled" : "disabled"); 5259a6d30aeSHarish Patil 5269a6d30aeSHarish Patil return 0; 5279a6d30aeSHarish Patil } 5289a6d30aeSHarish Patil 5299a6d30aeSHarish Patil /* Update MTU via vport-update without doing port restart. 5309a6d30aeSHarish Patil * The vport must be deactivated before calling this API. 5319a6d30aeSHarish Patil */ 5329a6d30aeSHarish Patil int qede_update_mtu(struct rte_eth_dev *eth_dev, uint16_t mtu) 5339a6d30aeSHarish Patil { 5349a6d30aeSHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 5359a6d30aeSHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 5369a6d30aeSHarish Patil struct ecore_sp_vport_update_params params; 5379a6d30aeSHarish Patil struct ecore_hwfn *p_hwfn; 5389a6d30aeSHarish Patil int rc; 5399a6d30aeSHarish Patil int i; 5409a6d30aeSHarish Patil 5419a6d30aeSHarish Patil memset(¶ms, 0, sizeof(struct ecore_sp_vport_update_params)); 5429a6d30aeSHarish Patil params.vport_id = 0; 5439a6d30aeSHarish Patil params.mtu = mtu; 5449a6d30aeSHarish Patil params.vport_id = 0; 5459a6d30aeSHarish Patil for_each_hwfn(edev, i) { 5469a6d30aeSHarish Patil p_hwfn = &edev->hwfns[i]; 5479a6d30aeSHarish Patil params.opaque_fid = p_hwfn->hw_info.opaque_fid; 5489a6d30aeSHarish Patil rc = ecore_sp_vport_update(p_hwfn, ¶ms, 5499a6d30aeSHarish Patil ECORE_SPQ_MODE_EBLOCK, NULL); 5509a6d30aeSHarish Patil if (rc != ECORE_SUCCESS) { 5519a6d30aeSHarish Patil DP_ERR(edev, "Failed to update MTU\n"); 5529a6d30aeSHarish Patil return -1; 5539a6d30aeSHarish Patil } 5549a6d30aeSHarish Patil } 5559a6d30aeSHarish Patil DP_INFO(edev, "MTU updated to %u\n", mtu); 5569a6d30aeSHarish Patil 5579a6d30aeSHarish Patil return 0; 5589a6d30aeSHarish Patil } 5599a6d30aeSHarish Patil 56077fac1b5SHarish Patil static void qede_set_ucast_cmn_params(struct ecore_filter_ucast *ucast) 5612ea6f76aSRasesh Mody { 56277fac1b5SHarish Patil memset(ucast, 0, sizeof(struct ecore_filter_ucast)); 56377fac1b5SHarish Patil ucast->is_rx_filter = true; 56477fac1b5SHarish Patil ucast->is_tx_filter = true; 56577fac1b5SHarish Patil /* ucast->assert_on_error = true; - For debug */ 56677fac1b5SHarish Patil } 5672ea6f76aSRasesh Mody 5684c4bdadfSHarish Patil static int 5694c4bdadfSHarish Patil qed_configure_filter_rx_mode(struct rte_eth_dev *eth_dev, 5704c4bdadfSHarish Patil enum qed_filter_rx_mode_type type) 5714c4bdadfSHarish Patil { 5724c4bdadfSHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 5734c4bdadfSHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 5744c4bdadfSHarish Patil struct ecore_filter_accept_flags flags; 5754c4bdadfSHarish Patil 5764c4bdadfSHarish Patil memset(&flags, 0, sizeof(flags)); 5774c4bdadfSHarish Patil 5784c4bdadfSHarish Patil flags.update_rx_mode_config = 1; 5794c4bdadfSHarish Patil flags.update_tx_mode_config = 1; 5804c4bdadfSHarish Patil flags.rx_accept_filter = ECORE_ACCEPT_UCAST_MATCHED | 5814c4bdadfSHarish Patil ECORE_ACCEPT_MCAST_MATCHED | 5824c4bdadfSHarish Patil ECORE_ACCEPT_BCAST; 5834c4bdadfSHarish Patil 5844c4bdadfSHarish Patil flags.tx_accept_filter = ECORE_ACCEPT_UCAST_MATCHED | 5854c4bdadfSHarish Patil ECORE_ACCEPT_MCAST_MATCHED | 5864c4bdadfSHarish Patil ECORE_ACCEPT_BCAST; 5874c4bdadfSHarish Patil 5884c4bdadfSHarish Patil if (type == QED_FILTER_RX_MODE_TYPE_PROMISC) { 5894c4bdadfSHarish Patil flags.rx_accept_filter |= ECORE_ACCEPT_UCAST_UNMATCHED; 5904c4bdadfSHarish Patil if (IS_VF(edev)) { 5914c4bdadfSHarish Patil flags.tx_accept_filter |= ECORE_ACCEPT_UCAST_UNMATCHED; 5924c4bdadfSHarish Patil DP_INFO(edev, "Enabling Tx unmatched flag for VF\n"); 5934c4bdadfSHarish Patil } 5944c4bdadfSHarish Patil } else if (type == QED_FILTER_RX_MODE_TYPE_MULTI_PROMISC) { 5954c4bdadfSHarish Patil flags.rx_accept_filter |= ECORE_ACCEPT_MCAST_UNMATCHED; 5964c4bdadfSHarish Patil } else if (type == (QED_FILTER_RX_MODE_TYPE_MULTI_PROMISC | 5974c4bdadfSHarish Patil QED_FILTER_RX_MODE_TYPE_PROMISC)) { 5984c4bdadfSHarish Patil flags.rx_accept_filter |= ECORE_ACCEPT_UCAST_UNMATCHED | 5994c4bdadfSHarish Patil ECORE_ACCEPT_MCAST_UNMATCHED; 6004c4bdadfSHarish Patil } 6014c4bdadfSHarish Patil 6024c4bdadfSHarish Patil return ecore_filter_accept_cmd(edev, 0, flags, false, false, 6034c4bdadfSHarish Patil ECORE_SPQ_MODE_CB, NULL); 6044c4bdadfSHarish Patil } 6050b090fd3SRasesh Mody static void qede_set_cmn_tunn_param(struct ecore_tunnel_info *p_tunn, 6060b090fd3SRasesh Mody uint8_t clss, bool mode, bool mask) 60752d94b57SHarish Patil { 6080b090fd3SRasesh Mody memset(p_tunn, 0, sizeof(struct ecore_tunnel_info)); 6090b090fd3SRasesh Mody p_tunn->vxlan.b_update_mode = mode; 6100b090fd3SRasesh Mody p_tunn->vxlan.b_mode_enabled = mask; 6110b090fd3SRasesh Mody p_tunn->b_update_rx_cls = true; 6120b090fd3SRasesh Mody p_tunn->b_update_tx_cls = true; 6130b090fd3SRasesh Mody p_tunn->vxlan.tun_cls = clss; 61452d94b57SHarish Patil } 61552d94b57SHarish Patil 61677fac1b5SHarish Patil static int 61777fac1b5SHarish Patil qede_ucast_filter(struct rte_eth_dev *eth_dev, struct ecore_filter_ucast *ucast, 61877fac1b5SHarish Patil bool add) 61977fac1b5SHarish Patil { 62077fac1b5SHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 62177fac1b5SHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 62277fac1b5SHarish Patil struct qede_ucast_entry *tmp = NULL; 62377fac1b5SHarish Patil struct qede_ucast_entry *u; 62477fac1b5SHarish Patil struct ether_addr *mac_addr; 62577fac1b5SHarish Patil 62677fac1b5SHarish Patil mac_addr = (struct ether_addr *)ucast->mac; 62777fac1b5SHarish Patil if (add) { 62877fac1b5SHarish Patil SLIST_FOREACH(tmp, &qdev->uc_list_head, list) { 62977fac1b5SHarish Patil if ((memcmp(mac_addr, &tmp->mac, 63077fac1b5SHarish Patil ETHER_ADDR_LEN) == 0) && 631d2a2468eSRasesh Mody ucast->vni == tmp->vni && 63277fac1b5SHarish Patil ucast->vlan == tmp->vlan) { 63377fac1b5SHarish Patil DP_ERR(edev, "Unicast MAC is already added" 63477fac1b5SHarish Patil " with vlan = %u, vni = %u\n", 63577fac1b5SHarish Patil ucast->vlan, ucast->vni); 63677fac1b5SHarish Patil return -EEXIST; 63777fac1b5SHarish Patil } 63877fac1b5SHarish Patil } 63977fac1b5SHarish Patil u = rte_malloc(NULL, sizeof(struct qede_ucast_entry), 64077fac1b5SHarish Patil RTE_CACHE_LINE_SIZE); 64177fac1b5SHarish Patil if (!u) { 64277fac1b5SHarish Patil DP_ERR(edev, "Did not allocate memory for ucast\n"); 64377fac1b5SHarish Patil return -ENOMEM; 64477fac1b5SHarish Patil } 64577fac1b5SHarish Patil ether_addr_copy(mac_addr, &u->mac); 64677fac1b5SHarish Patil u->vlan = ucast->vlan; 64752d94b57SHarish Patil u->vni = ucast->vni; 64877fac1b5SHarish Patil SLIST_INSERT_HEAD(&qdev->uc_list_head, u, list); 64977fac1b5SHarish Patil qdev->num_uc_addr++; 65077fac1b5SHarish Patil } else { 65177fac1b5SHarish Patil SLIST_FOREACH(tmp, &qdev->uc_list_head, list) { 65277fac1b5SHarish Patil if ((memcmp(mac_addr, &tmp->mac, 65377fac1b5SHarish Patil ETHER_ADDR_LEN) == 0) && 65452d94b57SHarish Patil ucast->vlan == tmp->vlan && 65552d94b57SHarish Patil ucast->vni == tmp->vni) 65677fac1b5SHarish Patil break; 65777fac1b5SHarish Patil } 65877fac1b5SHarish Patil if (tmp == NULL) { 65977fac1b5SHarish Patil DP_INFO(edev, "Unicast MAC is not found\n"); 66077fac1b5SHarish Patil return -EINVAL; 66177fac1b5SHarish Patil } 66277fac1b5SHarish Patil SLIST_REMOVE(&qdev->uc_list_head, tmp, qede_ucast_entry, list); 66377fac1b5SHarish Patil qdev->num_uc_addr--; 66477fac1b5SHarish Patil } 66577fac1b5SHarish Patil 66677fac1b5SHarish Patil return 0; 66777fac1b5SHarish Patil } 66877fac1b5SHarish Patil 66977fac1b5SHarish Patil static int 67077fac1b5SHarish Patil qede_mcast_filter(struct rte_eth_dev *eth_dev, struct ecore_filter_ucast *mcast, 67177fac1b5SHarish Patil bool add) 67277fac1b5SHarish Patil { 67377fac1b5SHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 67477fac1b5SHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 67577fac1b5SHarish Patil struct ether_addr *mac_addr; 67677fac1b5SHarish Patil struct qede_mcast_entry *tmp = NULL; 67777fac1b5SHarish Patil struct qede_mcast_entry *m; 67877fac1b5SHarish Patil 67977fac1b5SHarish Patil mac_addr = (struct ether_addr *)mcast->mac; 68077fac1b5SHarish Patil if (add) { 68177fac1b5SHarish Patil SLIST_FOREACH(tmp, &qdev->mc_list_head, list) { 68277fac1b5SHarish Patil if (memcmp(mac_addr, &tmp->mac, ETHER_ADDR_LEN) == 0) { 68377fac1b5SHarish Patil DP_ERR(edev, 68477fac1b5SHarish Patil "Multicast MAC is already added\n"); 68577fac1b5SHarish Patil return -EEXIST; 68677fac1b5SHarish Patil } 68777fac1b5SHarish Patil } 68877fac1b5SHarish Patil m = rte_malloc(NULL, sizeof(struct qede_mcast_entry), 68977fac1b5SHarish Patil RTE_CACHE_LINE_SIZE); 69077fac1b5SHarish Patil if (!m) { 69177fac1b5SHarish Patil DP_ERR(edev, 69277fac1b5SHarish Patil "Did not allocate memory for mcast\n"); 69377fac1b5SHarish Patil return -ENOMEM; 69477fac1b5SHarish Patil } 69577fac1b5SHarish Patil ether_addr_copy(mac_addr, &m->mac); 69677fac1b5SHarish Patil SLIST_INSERT_HEAD(&qdev->mc_list_head, m, list); 69777fac1b5SHarish Patil qdev->num_mc_addr++; 69877fac1b5SHarish Patil } else { 69977fac1b5SHarish Patil SLIST_FOREACH(tmp, &qdev->mc_list_head, list) { 70077fac1b5SHarish Patil if (memcmp(mac_addr, &tmp->mac, ETHER_ADDR_LEN) == 0) 70177fac1b5SHarish Patil break; 70277fac1b5SHarish Patil } 70377fac1b5SHarish Patil if (tmp == NULL) { 70477fac1b5SHarish Patil DP_INFO(edev, "Multicast mac is not found\n"); 70577fac1b5SHarish Patil return -EINVAL; 70677fac1b5SHarish Patil } 70777fac1b5SHarish Patil SLIST_REMOVE(&qdev->mc_list_head, tmp, 70877fac1b5SHarish Patil qede_mcast_entry, list); 70977fac1b5SHarish Patil qdev->num_mc_addr--; 71077fac1b5SHarish Patil } 71177fac1b5SHarish Patil 71277fac1b5SHarish Patil return 0; 71377fac1b5SHarish Patil } 71477fac1b5SHarish Patil 71577fac1b5SHarish Patil static enum _ecore_status_t 71677fac1b5SHarish Patil qede_mac_int_ops(struct rte_eth_dev *eth_dev, struct ecore_filter_ucast *ucast, 71777fac1b5SHarish Patil bool add) 71877fac1b5SHarish Patil { 71977fac1b5SHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 72077fac1b5SHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 72177fac1b5SHarish Patil enum _ecore_status_t rc; 72277fac1b5SHarish Patil struct ecore_filter_mcast mcast; 72377fac1b5SHarish Patil struct qede_mcast_entry *tmp; 72477fac1b5SHarish Patil uint16_t j = 0; 72577fac1b5SHarish Patil 72677fac1b5SHarish Patil /* Multicast */ 72777fac1b5SHarish Patil if (is_multicast_ether_addr((struct ether_addr *)ucast->mac)) { 72877fac1b5SHarish Patil if (add) { 72977fac1b5SHarish Patil if (qdev->num_mc_addr >= ECORE_MAX_MC_ADDRS) { 73077fac1b5SHarish Patil DP_ERR(edev, 73177fac1b5SHarish Patil "Mcast filter table limit exceeded, " 73277fac1b5SHarish Patil "Please enable mcast promisc mode\n"); 73377fac1b5SHarish Patil return -ECORE_INVAL; 73477fac1b5SHarish Patil } 73577fac1b5SHarish Patil } 73677fac1b5SHarish Patil rc = qede_mcast_filter(eth_dev, ucast, add); 73777fac1b5SHarish Patil if (rc == 0) { 73877fac1b5SHarish Patil DP_INFO(edev, "num_mc_addrs = %u\n", qdev->num_mc_addr); 73977fac1b5SHarish Patil memset(&mcast, 0, sizeof(mcast)); 74077fac1b5SHarish Patil mcast.num_mc_addrs = qdev->num_mc_addr; 74177fac1b5SHarish Patil mcast.opcode = ECORE_FILTER_ADD; 74277fac1b5SHarish Patil SLIST_FOREACH(tmp, &qdev->mc_list_head, list) { 74377fac1b5SHarish Patil ether_addr_copy(&tmp->mac, 74477fac1b5SHarish Patil (struct ether_addr *)&mcast.mac[j]); 74577fac1b5SHarish Patil j++; 74677fac1b5SHarish Patil } 74777fac1b5SHarish Patil rc = ecore_filter_mcast_cmd(edev, &mcast, 74877fac1b5SHarish Patil ECORE_SPQ_MODE_CB, NULL); 74977fac1b5SHarish Patil } 75077fac1b5SHarish Patil if (rc != ECORE_SUCCESS) { 75177fac1b5SHarish Patil DP_ERR(edev, "Failed to add multicast filter" 75277fac1b5SHarish Patil " rc = %d, op = %d\n", rc, add); 75377fac1b5SHarish Patil } 75477fac1b5SHarish Patil } else { /* Unicast */ 75577fac1b5SHarish Patil if (add) { 7563320ca8cSRasesh Mody if (qdev->num_uc_addr >= 7573320ca8cSRasesh Mody qdev->dev_info.num_mac_filters) { 75877fac1b5SHarish Patil DP_ERR(edev, 75977fac1b5SHarish Patil "Ucast filter table limit exceeded," 76077fac1b5SHarish Patil " Please enable promisc mode\n"); 76177fac1b5SHarish Patil return -ECORE_INVAL; 76277fac1b5SHarish Patil } 76377fac1b5SHarish Patil } 76477fac1b5SHarish Patil rc = qede_ucast_filter(eth_dev, ucast, add); 76577fac1b5SHarish Patil if (rc == 0) 76677fac1b5SHarish Patil rc = ecore_filter_ucast_cmd(edev, ucast, 76777fac1b5SHarish Patil ECORE_SPQ_MODE_CB, NULL); 76877fac1b5SHarish Patil if (rc != ECORE_SUCCESS) { 76977fac1b5SHarish Patil DP_ERR(edev, "MAC filter failed, rc = %d, op = %d\n", 77077fac1b5SHarish Patil rc, add); 77177fac1b5SHarish Patil } 77277fac1b5SHarish Patil } 77377fac1b5SHarish Patil 77477fac1b5SHarish Patil return rc; 7752ea6f76aSRasesh Mody } 7762ea6f76aSRasesh Mody 7776d01e580SWei Dai static int 7782ea6f76aSRasesh Mody qede_mac_addr_add(struct rte_eth_dev *eth_dev, struct ether_addr *mac_addr, 779af785e47SRasesh Mody __rte_unused uint32_t index, __rte_unused uint32_t pool) 7802ea6f76aSRasesh Mody { 78177fac1b5SHarish Patil struct ecore_filter_ucast ucast; 7826d01e580SWei Dai int re; 7832ea6f76aSRasesh Mody 78477fac1b5SHarish Patil qede_set_ucast_cmn_params(&ucast); 78577fac1b5SHarish Patil ucast.type = ECORE_FILTER_MAC; 78677fac1b5SHarish Patil ether_addr_copy(mac_addr, (struct ether_addr *)&ucast.mac); 7876d01e580SWei Dai re = (int)qede_mac_int_ops(eth_dev, &ucast, 1); 7886d01e580SWei Dai return re; 7892ea6f76aSRasesh Mody } 7902ea6f76aSRasesh Mody 7912ea6f76aSRasesh Mody static void 7922ea6f76aSRasesh Mody qede_mac_addr_remove(struct rte_eth_dev *eth_dev, uint32_t index) 7932ea6f76aSRasesh Mody { 7942ea6f76aSRasesh Mody struct qede_dev *qdev = eth_dev->data->dev_private; 7952ea6f76aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 79677fac1b5SHarish Patil struct ecore_filter_ucast ucast; 7972ea6f76aSRasesh Mody 7982ea6f76aSRasesh Mody PMD_INIT_FUNC_TRACE(edev); 7992ea6f76aSRasesh Mody 8003320ca8cSRasesh Mody if (index >= qdev->dev_info.num_mac_filters) { 8012ea6f76aSRasesh Mody DP_ERR(edev, "Index %u is above MAC filter limit %u\n", 8023320ca8cSRasesh Mody index, qdev->dev_info.num_mac_filters); 8032ea6f76aSRasesh Mody return; 8042ea6f76aSRasesh Mody } 8052ea6f76aSRasesh Mody 80677fac1b5SHarish Patil qede_set_ucast_cmn_params(&ucast); 80777fac1b5SHarish Patil ucast.opcode = ECORE_FILTER_REMOVE; 80877fac1b5SHarish Patil ucast.type = ECORE_FILTER_MAC; 80977fac1b5SHarish Patil 8102ea6f76aSRasesh Mody /* Use the index maintained by rte */ 81177fac1b5SHarish Patil ether_addr_copy(ð_dev->data->mac_addrs[index], 81277fac1b5SHarish Patil (struct ether_addr *)&ucast.mac); 81377fac1b5SHarish Patil 81477fac1b5SHarish Patil ecore_filter_ucast_cmd(edev, &ucast, ECORE_SPQ_MODE_CB, NULL); 8152ea6f76aSRasesh Mody } 8162ea6f76aSRasesh Mody 8172ea6f76aSRasesh Mody static void 8182ea6f76aSRasesh Mody qede_mac_addr_set(struct rte_eth_dev *eth_dev, struct ether_addr *mac_addr) 8192ea6f76aSRasesh Mody { 8202ea6f76aSRasesh Mody struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 8212ea6f76aSRasesh Mody struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 8222ea6f76aSRasesh Mody 82386a2265eSRasesh Mody if (IS_VF(edev) && !ecore_vf_check_mac(ECORE_LEADING_HWFN(edev), 82486a2265eSRasesh Mody mac_addr->addr_bytes)) { 82586a2265eSRasesh Mody DP_ERR(edev, "Setting MAC address is not allowed\n"); 82686a2265eSRasesh Mody ether_addr_copy(&qdev->primary_mac, 82786a2265eSRasesh Mody ð_dev->data->mac_addrs[0]); 82886a2265eSRasesh Mody return; 82986a2265eSRasesh Mody } 83086a2265eSRasesh Mody 83149d8b54eSHarish Patil qede_mac_addr_add(eth_dev, mac_addr, 0, 0); 8322ea6f76aSRasesh Mody } 8332ea6f76aSRasesh Mody 8349a6d30aeSHarish Patil static void qede_config_accept_any_vlan(struct qede_dev *qdev, bool flg) 8352ea6f76aSRasesh Mody { 8369a6d30aeSHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 8379a6d30aeSHarish Patil struct ecore_sp_vport_update_params params; 8389a6d30aeSHarish Patil struct ecore_hwfn *p_hwfn; 8399a6d30aeSHarish Patil uint8_t i; 8402ea6f76aSRasesh Mody int rc; 8412ea6f76aSRasesh Mody 8429a6d30aeSHarish Patil memset(¶ms, 0, sizeof(struct ecore_sp_vport_update_params)); 8439a6d30aeSHarish Patil params.vport_id = 0; 8449a6d30aeSHarish Patil params.update_accept_any_vlan_flg = 1; 8459a6d30aeSHarish Patil params.accept_any_vlan = flg; 8469a6d30aeSHarish Patil for_each_hwfn(edev, i) { 8479a6d30aeSHarish Patil p_hwfn = &edev->hwfns[i]; 8489a6d30aeSHarish Patil params.opaque_fid = p_hwfn->hw_info.opaque_fid; 8499a6d30aeSHarish Patil rc = ecore_sp_vport_update(p_hwfn, ¶ms, 8509a6d30aeSHarish Patil ECORE_SPQ_MODE_EBLOCK, NULL); 8519a6d30aeSHarish Patil if (rc != ECORE_SUCCESS) { 8529a6d30aeSHarish Patil DP_ERR(edev, "Failed to configure accept-any-vlan\n"); 8532ea6f76aSRasesh Mody return; 8542ea6f76aSRasesh Mody } 8552ea6f76aSRasesh Mody } 8562ea6f76aSRasesh Mody 8579a6d30aeSHarish Patil DP_INFO(edev, "%s accept-any-vlan\n", flg ? "enabled" : "disabled"); 8589a6d30aeSHarish Patil } 8599a6d30aeSHarish Patil 8609a6d30aeSHarish Patil static int qede_vlan_stripping(struct rte_eth_dev *eth_dev, bool flg) 8612ea6f76aSRasesh Mody { 8622ea6f76aSRasesh Mody struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 8632ea6f76aSRasesh Mody struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 8649a6d30aeSHarish Patil struct ecore_sp_vport_update_params params; 8659a6d30aeSHarish Patil struct ecore_hwfn *p_hwfn; 8669a6d30aeSHarish Patil uint8_t i; 8672ea6f76aSRasesh Mody int rc; 8682ea6f76aSRasesh Mody 8699a6d30aeSHarish Patil memset(¶ms, 0, sizeof(struct ecore_sp_vport_update_params)); 8709a6d30aeSHarish Patil params.vport_id = 0; 8719a6d30aeSHarish Patil params.update_inner_vlan_removal_flg = 1; 8729a6d30aeSHarish Patil params.inner_vlan_removal_flg = flg; 8739a6d30aeSHarish Patil for_each_hwfn(edev, i) { 8749a6d30aeSHarish Patil p_hwfn = &edev->hwfns[i]; 8759a6d30aeSHarish Patil params.opaque_fid = p_hwfn->hw_info.opaque_fid; 8769a6d30aeSHarish Patil rc = ecore_sp_vport_update(p_hwfn, ¶ms, 8779a6d30aeSHarish Patil ECORE_SPQ_MODE_EBLOCK, NULL); 8789a6d30aeSHarish Patil if (rc != ECORE_SUCCESS) { 8799a6d30aeSHarish Patil DP_ERR(edev, "Failed to update vport\n"); 8809a6d30aeSHarish Patil return -1; 8812ea6f76aSRasesh Mody } 8829a6d30aeSHarish Patil } 8832ea6f76aSRasesh Mody 8849a6d30aeSHarish Patil DP_INFO(edev, "VLAN stripping %s\n", flg ? "enabled" : "disabled"); 8852ea6f76aSRasesh Mody return 0; 8862ea6f76aSRasesh Mody } 8872ea6f76aSRasesh Mody 8882ea6f76aSRasesh Mody static int qede_vlan_filter_set(struct rte_eth_dev *eth_dev, 8892ea6f76aSRasesh Mody uint16_t vlan_id, int on) 8902ea6f76aSRasesh Mody { 8912ea6f76aSRasesh Mody struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 8922ea6f76aSRasesh Mody struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 8932ea6f76aSRasesh Mody struct qed_dev_eth_info *dev_info = &qdev->dev_info; 894d6cb1753SHarish Patil struct qede_vlan_entry *tmp = NULL; 895d6cb1753SHarish Patil struct qede_vlan_entry *vlan; 89677fac1b5SHarish Patil struct ecore_filter_ucast ucast; 8972ea6f76aSRasesh Mody int rc; 8982ea6f76aSRasesh Mody 899bec02288SSony Chacko if (on) { 900d6cb1753SHarish Patil if (qdev->configured_vlans == dev_info->num_vlan_filters) { 90161a8429fSRasesh Mody DP_ERR(edev, "Reached max VLAN filter limit" 9022ea6f76aSRasesh Mody " enabling accept_any_vlan\n"); 9032ea6f76aSRasesh Mody qede_config_accept_any_vlan(qdev, true); 9042ea6f76aSRasesh Mody return 0; 9052ea6f76aSRasesh Mody } 9062ea6f76aSRasesh Mody 907d6cb1753SHarish Patil SLIST_FOREACH(tmp, &qdev->vlan_list_head, list) { 908d6cb1753SHarish Patil if (tmp->vid == vlan_id) { 909d6cb1753SHarish Patil DP_ERR(edev, "VLAN %u already configured\n", 9102ea6f76aSRasesh Mody vlan_id); 911d6cb1753SHarish Patil return -EEXIST; 912d6cb1753SHarish Patil } 9132ea6f76aSRasesh Mody } 9142ea6f76aSRasesh Mody 915d6cb1753SHarish Patil vlan = rte_malloc(NULL, sizeof(struct qede_vlan_entry), 916d6cb1753SHarish Patil RTE_CACHE_LINE_SIZE); 917d6cb1753SHarish Patil 918d6cb1753SHarish Patil if (!vlan) { 919d6cb1753SHarish Patil DP_ERR(edev, "Did not allocate memory for VLAN\n"); 920d6cb1753SHarish Patil return -ENOMEM; 921d6cb1753SHarish Patil } 922d6cb1753SHarish Patil 92377fac1b5SHarish Patil qede_set_ucast_cmn_params(&ucast); 92477fac1b5SHarish Patil ucast.opcode = ECORE_FILTER_ADD; 92577fac1b5SHarish Patil ucast.type = ECORE_FILTER_VLAN; 92677fac1b5SHarish Patil ucast.vlan = vlan_id; 92777fac1b5SHarish Patil rc = ecore_filter_ucast_cmd(edev, &ucast, ECORE_SPQ_MODE_CB, 92877fac1b5SHarish Patil NULL); 92977fac1b5SHarish Patil if (rc != 0) { 930d6cb1753SHarish Patil DP_ERR(edev, "Failed to add VLAN %u rc %d\n", vlan_id, 931d6cb1753SHarish Patil rc); 932d6cb1753SHarish Patil rte_free(vlan); 933d6cb1753SHarish Patil } else { 934d6cb1753SHarish Patil vlan->vid = vlan_id; 935d6cb1753SHarish Patil SLIST_INSERT_HEAD(&qdev->vlan_list_head, vlan, list); 936d6cb1753SHarish Patil qdev->configured_vlans++; 937d6cb1753SHarish Patil DP_INFO(edev, "VLAN %u added, configured_vlans %u\n", 938d6cb1753SHarish Patil vlan_id, qdev->configured_vlans); 939d6cb1753SHarish Patil } 940d6cb1753SHarish Patil } else { 941d6cb1753SHarish Patil SLIST_FOREACH(tmp, &qdev->vlan_list_head, list) { 942d6cb1753SHarish Patil if (tmp->vid == vlan_id) 943d6cb1753SHarish Patil break; 944d6cb1753SHarish Patil } 945d6cb1753SHarish Patil 946d6cb1753SHarish Patil if (!tmp) { 947d6cb1753SHarish Patil if (qdev->configured_vlans == 0) { 948d6cb1753SHarish Patil DP_INFO(edev, 949d6cb1753SHarish Patil "No VLAN filters configured yet\n"); 950d6cb1753SHarish Patil return 0; 951d6cb1753SHarish Patil } 952d6cb1753SHarish Patil 953d6cb1753SHarish Patil DP_ERR(edev, "VLAN %u not configured\n", vlan_id); 954d6cb1753SHarish Patil return -EINVAL; 955d6cb1753SHarish Patil } 956d6cb1753SHarish Patil 957d6cb1753SHarish Patil SLIST_REMOVE(&qdev->vlan_list_head, tmp, qede_vlan_entry, list); 958d6cb1753SHarish Patil 95977fac1b5SHarish Patil qede_set_ucast_cmn_params(&ucast); 96077fac1b5SHarish Patil ucast.opcode = ECORE_FILTER_REMOVE; 96177fac1b5SHarish Patil ucast.type = ECORE_FILTER_VLAN; 96277fac1b5SHarish Patil ucast.vlan = vlan_id; 96377fac1b5SHarish Patil rc = ecore_filter_ucast_cmd(edev, &ucast, ECORE_SPQ_MODE_CB, 96477fac1b5SHarish Patil NULL); 96577fac1b5SHarish Patil if (rc != 0) { 966d6cb1753SHarish Patil DP_ERR(edev, "Failed to delete VLAN %u rc %d\n", 967d6cb1753SHarish Patil vlan_id, rc); 968d6cb1753SHarish Patil } else { 969d6cb1753SHarish Patil qdev->configured_vlans--; 970d6cb1753SHarish Patil DP_INFO(edev, "VLAN %u removed configured_vlans %u\n", 971d6cb1753SHarish Patil vlan_id, qdev->configured_vlans); 972d6cb1753SHarish Patil } 973d6cb1753SHarish Patil } 9742ea6f76aSRasesh Mody 9752ea6f76aSRasesh Mody return rc; 9762ea6f76aSRasesh Mody } 9772ea6f76aSRasesh Mody 978af785e47SRasesh Mody static void qede_vlan_offload_set(struct rte_eth_dev *eth_dev, int mask) 979af785e47SRasesh Mody { 980af785e47SRasesh Mody struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 981af785e47SRasesh Mody struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 982af785e47SRasesh Mody struct rte_eth_rxmode *rxmode = ð_dev->data->dev_conf.rxmode; 983af785e47SRasesh Mody 984af785e47SRasesh Mody if (mask & ETH_VLAN_STRIP_MASK) { 985af785e47SRasesh Mody if (rxmode->hw_vlan_strip) 986af785e47SRasesh Mody (void)qede_vlan_stripping(eth_dev, 1); 987af785e47SRasesh Mody else 988af785e47SRasesh Mody (void)qede_vlan_stripping(eth_dev, 0); 989af785e47SRasesh Mody } 990af785e47SRasesh Mody 991af785e47SRasesh Mody if (mask & ETH_VLAN_FILTER_MASK) { 992af785e47SRasesh Mody /* VLAN filtering kicks in when a VLAN is added */ 993af785e47SRasesh Mody if (rxmode->hw_vlan_filter) { 994af785e47SRasesh Mody qede_vlan_filter_set(eth_dev, 0, 1); 995af785e47SRasesh Mody } else { 996af785e47SRasesh Mody if (qdev->configured_vlans > 1) { /* Excluding VLAN0 */ 997af785e47SRasesh Mody DP_ERR(edev, 998af785e47SRasesh Mody " Please remove existing VLAN filters" 999af785e47SRasesh Mody " before disabling VLAN filtering\n"); 1000af785e47SRasesh Mody /* Signal app that VLAN filtering is still 1001af785e47SRasesh Mody * enabled 1002af785e47SRasesh Mody */ 1003af785e47SRasesh Mody rxmode->hw_vlan_filter = true; 1004af785e47SRasesh Mody } else { 1005af785e47SRasesh Mody qede_vlan_filter_set(eth_dev, 0, 0); 1006af785e47SRasesh Mody } 1007af785e47SRasesh Mody } 1008af785e47SRasesh Mody } 1009af785e47SRasesh Mody 1010af785e47SRasesh Mody if (mask & ETH_VLAN_EXTEND_MASK) 1011af785e47SRasesh Mody DP_INFO(edev, "No offloads are supported with VLAN Q-in-Q" 1012af785e47SRasesh Mody " and classification is based on outer tag only\n"); 1013af785e47SRasesh Mody 1014af785e47SRasesh Mody DP_INFO(edev, "vlan offload mask %d vlan-strip %d vlan-filter %d\n", 1015af785e47SRasesh Mody mask, rxmode->hw_vlan_strip, rxmode->hw_vlan_filter); 1016af785e47SRasesh Mody } 1017af785e47SRasesh Mody 10187ab35bf6SHarish Patil static void qede_prandom_bytes(uint32_t *buff) 10197ab35bf6SHarish Patil { 10207ab35bf6SHarish Patil uint8_t i; 10217ab35bf6SHarish Patil 10227ab35bf6SHarish Patil srand((unsigned int)time(NULL)); 10237ab35bf6SHarish Patil for (i = 0; i < ECORE_RSS_KEY_SIZE; i++) 10247ab35bf6SHarish Patil buff[i] = rand(); 10257ab35bf6SHarish Patil } 10267ab35bf6SHarish Patil 10278130abb3SHarish Patil int qede_config_rss(struct rte_eth_dev *eth_dev) 10287ab35bf6SHarish Patil { 10297ab35bf6SHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 1030af785e47SRasesh Mody #ifdef RTE_LIBRTE_QEDE_DEBUG_INFO 10317ab35bf6SHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 1032af785e47SRasesh Mody #endif 10337ab35bf6SHarish Patil uint32_t def_rss_key[ECORE_RSS_KEY_SIZE]; 10347ab35bf6SHarish Patil struct rte_eth_rss_reta_entry64 reta_conf[2]; 10357ab35bf6SHarish Patil struct rte_eth_rss_conf rss_conf; 10367ab35bf6SHarish Patil uint32_t i, id, pos, q; 10377ab35bf6SHarish Patil 10387ab35bf6SHarish Patil rss_conf = eth_dev->data->dev_conf.rx_adv_conf.rss_conf; 10397ab35bf6SHarish Patil if (!rss_conf.rss_key) { 10407ab35bf6SHarish Patil DP_INFO(edev, "Applying driver default key\n"); 10417ab35bf6SHarish Patil rss_conf.rss_key_len = ECORE_RSS_KEY_SIZE * sizeof(uint32_t); 10427ab35bf6SHarish Patil qede_prandom_bytes(&def_rss_key[0]); 10437ab35bf6SHarish Patil rss_conf.rss_key = (uint8_t *)&def_rss_key[0]; 10447ab35bf6SHarish Patil } 10457ab35bf6SHarish Patil 10467ab35bf6SHarish Patil /* Configure RSS hash */ 10477ab35bf6SHarish Patil if (qede_rss_hash_update(eth_dev, &rss_conf)) 10487ab35bf6SHarish Patil return -EINVAL; 10497ab35bf6SHarish Patil 10507ab35bf6SHarish Patil /* Configure default RETA */ 10517ab35bf6SHarish Patil memset(reta_conf, 0, sizeof(reta_conf)); 10527ab35bf6SHarish Patil for (i = 0; i < ECORE_RSS_IND_TABLE_SIZE; i++) 10537ab35bf6SHarish Patil reta_conf[i / RTE_RETA_GROUP_SIZE].mask = UINT64_MAX; 10547ab35bf6SHarish Patil 10557ab35bf6SHarish Patil for (i = 0; i < ECORE_RSS_IND_TABLE_SIZE; i++) { 10567ab35bf6SHarish Patil id = i / RTE_RETA_GROUP_SIZE; 10577ab35bf6SHarish Patil pos = i % RTE_RETA_GROUP_SIZE; 10587ab35bf6SHarish Patil q = i % QEDE_RSS_COUNT(qdev); 10597ab35bf6SHarish Patil reta_conf[id].reta[pos] = q; 10607ab35bf6SHarish Patil } 10617ab35bf6SHarish Patil if (qede_rss_reta_update(eth_dev, &reta_conf[0], 10627ab35bf6SHarish Patil ECORE_RSS_IND_TABLE_SIZE)) 10637ab35bf6SHarish Patil return -EINVAL; 10647ab35bf6SHarish Patil 10657ab35bf6SHarish Patil return 0; 10667ab35bf6SHarish Patil } 10677ab35bf6SHarish Patil 10684c4bdadfSHarish Patil static void qede_fastpath_start(struct ecore_dev *edev) 10694c4bdadfSHarish Patil { 10704c4bdadfSHarish Patil struct ecore_hwfn *p_hwfn; 10714c4bdadfSHarish Patil int i; 10724c4bdadfSHarish Patil 10734c4bdadfSHarish Patil for_each_hwfn(edev, i) { 10744c4bdadfSHarish Patil p_hwfn = &edev->hwfns[i]; 10754c4bdadfSHarish Patil ecore_hw_start_fastpath(p_hwfn); 10764c4bdadfSHarish Patil } 10774c4bdadfSHarish Patil } 10784c4bdadfSHarish Patil 10794c4bdadfSHarish Patil static int qede_dev_start(struct rte_eth_dev *eth_dev) 10804c4bdadfSHarish Patil { 10814c4bdadfSHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 10824c4bdadfSHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 10834c4bdadfSHarish Patil 10844c4bdadfSHarish Patil PMD_INIT_FUNC_TRACE(edev); 10854c4bdadfSHarish Patil 10864c4bdadfSHarish Patil /* Update MTU only if it has changed */ 10874c4bdadfSHarish Patil if (qdev->mtu != qdev->new_mtu) { 10884c4bdadfSHarish Patil if (qede_update_mtu(eth_dev, qdev->new_mtu)) 10894c4bdadfSHarish Patil goto err; 10904c4bdadfSHarish Patil qdev->mtu = qdev->new_mtu; 10914c4bdadfSHarish Patil /* If MTU has changed then update TPA too */ 10924c4bdadfSHarish Patil if (qdev->enable_lro) 10934c4bdadfSHarish Patil if (qede_enable_tpa(eth_dev, true)) 10944c4bdadfSHarish Patil goto err; 10954c4bdadfSHarish Patil } 10964c4bdadfSHarish Patil 10974c4bdadfSHarish Patil /* Start queues */ 10984c4bdadfSHarish Patil if (qede_start_queues(eth_dev)) 10994c4bdadfSHarish Patil goto err; 11004c4bdadfSHarish Patil 11014c4bdadfSHarish Patil /* Newer SR-IOV PF driver expects RX/TX queues to be started before 11024c4bdadfSHarish Patil * enabling RSS. Hence RSS configuration is deferred upto this point. 11034c4bdadfSHarish Patil * Also, we would like to retain similar behavior in PF case, so we 11044c4bdadfSHarish Patil * don't do PF/VF specific check here. 11054c4bdadfSHarish Patil */ 11064c4bdadfSHarish Patil if (eth_dev->data->dev_conf.rxmode.mq_mode == ETH_MQ_RX_RSS) 11074c4bdadfSHarish Patil if (qede_config_rss(eth_dev)) 11084c4bdadfSHarish Patil goto err; 11094c4bdadfSHarish Patil 11104c4bdadfSHarish Patil /* Enable vport*/ 11114c4bdadfSHarish Patil if (qede_activate_vport(eth_dev, true)) 11124c4bdadfSHarish Patil goto err; 11134c4bdadfSHarish Patil 11144c4bdadfSHarish Patil /* Bring-up the link */ 11154c4bdadfSHarish Patil qede_dev_set_link_state(eth_dev, true); 11164c4bdadfSHarish Patil 11174c4bdadfSHarish Patil /* Start/resume traffic */ 11184c4bdadfSHarish Patil qede_fastpath_start(edev); 11194c4bdadfSHarish Patil 11204c4bdadfSHarish Patil DP_INFO(edev, "Device started\n"); 11214c4bdadfSHarish Patil 11224c4bdadfSHarish Patil return 0; 11234c4bdadfSHarish Patil err: 11244c4bdadfSHarish Patil DP_ERR(edev, "Device start fails\n"); 11254c4bdadfSHarish Patil return -1; /* common error code is < 0 */ 11264c4bdadfSHarish Patil } 11274c4bdadfSHarish Patil 11284c4bdadfSHarish Patil static void qede_dev_stop(struct rte_eth_dev *eth_dev) 11294c4bdadfSHarish Patil { 11304c4bdadfSHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 11314c4bdadfSHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 11324c4bdadfSHarish Patil 11334c4bdadfSHarish Patil PMD_INIT_FUNC_TRACE(edev); 11344c4bdadfSHarish Patil 11354c4bdadfSHarish Patil /* Disable vport */ 11364c4bdadfSHarish Patil if (qede_activate_vport(eth_dev, false)) 11374c4bdadfSHarish Patil return; 11384c4bdadfSHarish Patil 11394c4bdadfSHarish Patil if (qdev->enable_lro) 11404c4bdadfSHarish Patil qede_enable_tpa(eth_dev, false); 11414c4bdadfSHarish Patil 11424c4bdadfSHarish Patil /* TODO: Do we need disable LRO or RSS */ 11434c4bdadfSHarish Patil /* Stop queues */ 11444c4bdadfSHarish Patil qede_stop_queues(eth_dev); 11454c4bdadfSHarish Patil 11464c4bdadfSHarish Patil /* Disable traffic */ 11474c4bdadfSHarish Patil ecore_hw_stop_fastpath(edev); /* TBD - loop */ 11484c4bdadfSHarish Patil 11494c4bdadfSHarish Patil /* Bring the link down */ 11504c4bdadfSHarish Patil qede_dev_set_link_state(eth_dev, false); 11514c4bdadfSHarish Patil 11524c4bdadfSHarish Patil DP_INFO(edev, "Device is stopped\n"); 11534c4bdadfSHarish Patil } 11544c4bdadfSHarish Patil 11552ea6f76aSRasesh Mody static int qede_dev_configure(struct rte_eth_dev *eth_dev) 11562ea6f76aSRasesh Mody { 11574c4bdadfSHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 11584c4bdadfSHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 11592ea6f76aSRasesh Mody struct rte_eth_rxmode *rxmode = ð_dev->data->dev_conf.rxmode; 11602ea6f76aSRasesh Mody 11612ea6f76aSRasesh Mody PMD_INIT_FUNC_TRACE(edev); 11622ea6f76aSRasesh Mody 11632af14ca7SHarish Patil /* Check requirements for 100G mode */ 1164c0845c33SRasesh Mody if (ECORE_IS_CMT(edev)) { 1165cfe28a98SSony Chacko if (eth_dev->data->nb_rx_queues < 2 || 1166cfe28a98SSony Chacko eth_dev->data->nb_tx_queues < 2) { 116761a8429fSRasesh Mody DP_ERR(edev, "100G mode needs min. 2 RX/TX queues\n"); 11682af14ca7SHarish Patil return -EINVAL; 11692af14ca7SHarish Patil } 11702af14ca7SHarish Patil 1171cfe28a98SSony Chacko if ((eth_dev->data->nb_rx_queues % 2 != 0) || 1172cfe28a98SSony Chacko (eth_dev->data->nb_tx_queues % 2 != 0)) { 117361a8429fSRasesh Mody DP_ERR(edev, 1174cfe28a98SSony Chacko "100G mode needs even no. of RX/TX queues\n"); 11752af14ca7SHarish Patil return -EINVAL; 11762af14ca7SHarish Patil } 11772af14ca7SHarish Patil } 11782af14ca7SHarish Patil 11792ea6f76aSRasesh Mody /* Sanity checks and throw warnings */ 11804c4bdadfSHarish Patil if (rxmode->enable_scatter) 1181bec02288SSony Chacko eth_dev->data->scattered_rx = 1; 1182e8fb98d6SRasesh Mody 11832ea6f76aSRasesh Mody if (!rxmode->hw_strip_crc) 11842ea6f76aSRasesh Mody DP_INFO(edev, "L2 CRC stripping is always enabled in hw\n"); 1185e8fb98d6SRasesh Mody 11862ea6f76aSRasesh Mody if (!rxmode->hw_ip_checksum) 11872ea6f76aSRasesh Mody DP_INFO(edev, "IP/UDP/TCP checksum offload is always enabled " 11882ea6f76aSRasesh Mody "in hw\n"); 11894c4bdadfSHarish Patil if (rxmode->header_split) 11904c4bdadfSHarish Patil DP_INFO(edev, "Header split enable is not supported\n"); 11914c4bdadfSHarish Patil if (!(rxmode->mq_mode == ETH_MQ_RX_NONE || rxmode->mq_mode == 11924c4bdadfSHarish Patil ETH_MQ_RX_RSS)) { 11934c4bdadfSHarish Patil DP_ERR(edev, "Unsupported multi-queue mode\n"); 11944c4bdadfSHarish Patil return -ENOTSUP; 119529540be7SHarish Patil } 11964c4bdadfSHarish Patil /* Flow director mode check */ 11974c4bdadfSHarish Patil if (qede_check_fdir_support(eth_dev)) 11984c4bdadfSHarish Patil return -ENOTSUP; 119929540be7SHarish Patil 12004c4bdadfSHarish Patil /* Deallocate resources if held previously. It is needed only if the 12014c4bdadfSHarish Patil * queue count has been changed from previous configuration. If its 12024c4bdadfSHarish Patil * going to change then it means RX/TX queue setup will be called 12034c4bdadfSHarish Patil * again and the fastpath pointers will be reinitialized there. 1204dbac54c2SHarish Patil */ 12054c4bdadfSHarish Patil if (qdev->num_tx_queues != eth_dev->data->nb_tx_queues || 12064c4bdadfSHarish Patil qdev->num_rx_queues != eth_dev->data->nb_rx_queues) { 12074c4bdadfSHarish Patil qede_dealloc_fp_resc(eth_dev); 12084c4bdadfSHarish Patil /* Proceed with updated queue count */ 12094c4bdadfSHarish Patil qdev->num_tx_queues = eth_dev->data->nb_tx_queues; 12104c4bdadfSHarish Patil qdev->num_rx_queues = eth_dev->data->nb_rx_queues; 12114c4bdadfSHarish Patil if (qede_alloc_fp_resc(qdev)) 12124c4bdadfSHarish Patil return -ENOMEM; 12134c4bdadfSHarish Patil } 12142ea6f76aSRasesh Mody 12159a6d30aeSHarish Patil /* VF's MTU has to be set using vport-start where as 12169a6d30aeSHarish Patil * PF's MTU can be updated via vport-update. 1217dbac54c2SHarish Patil */ 12189a6d30aeSHarish Patil if (IS_VF(edev)) { 12199a6d30aeSHarish Patil if (qede_start_vport(qdev, rxmode->max_rx_pkt_len)) 12209a6d30aeSHarish Patil return -1; 12219a6d30aeSHarish Patil } else { 12229a6d30aeSHarish Patil if (qede_update_mtu(eth_dev, rxmode->max_rx_pkt_len)) 12239a6d30aeSHarish Patil return -1; 12249a6d30aeSHarish Patil } 12259a6d30aeSHarish Patil 12269a6d30aeSHarish Patil qdev->mtu = rxmode->max_rx_pkt_len; 12279a6d30aeSHarish Patil qdev->new_mtu = qdev->mtu; 1228dbac54c2SHarish Patil 12294c4bdadfSHarish Patil /* Configure TPA parameters */ 12304c4bdadfSHarish Patil if (rxmode->enable_lro) { 12314c4bdadfSHarish Patil if (qede_enable_tpa(eth_dev, true)) 12327ab35bf6SHarish Patil return -EINVAL; 12334c4bdadfSHarish Patil /* Enable scatter mode for LRO */ 12344c4bdadfSHarish Patil if (!rxmode->enable_scatter) 12354c4bdadfSHarish Patil eth_dev->data->scattered_rx = 1; 12367ab35bf6SHarish Patil } 12374c4bdadfSHarish Patil qdev->enable_lro = rxmode->enable_lro; 12389c5d0a66SHarish Patil 1239d87246a4SHarish Patil /* Enable VLAN offloads by default */ 1240d87246a4SHarish Patil qede_vlan_offload_set(eth_dev, ETH_VLAN_STRIP_MASK | 1241d87246a4SHarish Patil ETH_VLAN_FILTER_MASK | 1242d87246a4SHarish Patil ETH_VLAN_EXTEND_MASK); 1243d87246a4SHarish Patil 12444c4bdadfSHarish Patil DP_INFO(edev, "Device configured with RSS=%d TSS=%d\n", 12454c4bdadfSHarish Patil QEDE_RSS_COUNT(qdev), QEDE_TSS_COUNT(qdev)); 12469c5d0a66SHarish Patil 12472ea6f76aSRasesh Mody return 0; 12482ea6f76aSRasesh Mody } 12492ea6f76aSRasesh Mody 12502ea6f76aSRasesh Mody /* Info about HW descriptor ring limitations */ 12512ea6f76aSRasesh Mody static const struct rte_eth_desc_lim qede_rx_desc_lim = { 1252c008e17bSHarish Patil .nb_max = 0x8000, /* 32K */ 12532ea6f76aSRasesh Mody .nb_min = 128, 12542ea6f76aSRasesh Mody .nb_align = 128 /* lowest common multiple */ 12552ea6f76aSRasesh Mody }; 12562ea6f76aSRasesh Mody 12572ea6f76aSRasesh Mody static const struct rte_eth_desc_lim qede_tx_desc_lim = { 1258c008e17bSHarish Patil .nb_max = 0x8000, /* 32K */ 12592ea6f76aSRasesh Mody .nb_min = 256, 126029540be7SHarish Patil .nb_align = 256, 126129540be7SHarish Patil .nb_seg_max = ETH_TX_MAX_BDS_PER_LSO_PACKET, 126229540be7SHarish Patil .nb_mtu_seg_max = ETH_TX_MAX_BDS_PER_NON_LSO_PACKET 12632ea6f76aSRasesh Mody }; 12642ea6f76aSRasesh Mody 12652ea6f76aSRasesh Mody static void 12662ea6f76aSRasesh Mody qede_dev_info_get(struct rte_eth_dev *eth_dev, 12672ea6f76aSRasesh Mody struct rte_eth_dev_info *dev_info) 12682ea6f76aSRasesh Mody { 12692ea6f76aSRasesh Mody struct qede_dev *qdev = eth_dev->data->dev_private; 12702ea6f76aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 127164c239b7SHarish Patil struct qed_link_output link; 12721ea56b80SHarish Patil uint32_t speed_cap = 0; 12732ea6f76aSRasesh Mody 12742ea6f76aSRasesh Mody PMD_INIT_FUNC_TRACE(edev); 12752ea6f76aSRasesh Mody 1276c0802544SFerruh Yigit dev_info->pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); 1277f6033f24SHarish Patil dev_info->min_rx_bufsize = (uint32_t)QEDE_MIN_RX_BUFF_SIZE; 12782ea6f76aSRasesh Mody dev_info->max_rx_pktlen = (uint32_t)ETH_TX_MAX_NON_LSO_PKT_LEN; 12792ea6f76aSRasesh Mody dev_info->rx_desc_lim = qede_rx_desc_lim; 12802ea6f76aSRasesh Mody dev_info->tx_desc_lim = qede_tx_desc_lim; 1281528fcfabSHarish Patil 1282528fcfabSHarish Patil if (IS_PF(edev)) 1283528fcfabSHarish Patil dev_info->max_rx_queues = (uint16_t)RTE_MIN( 1284528fcfabSHarish Patil QEDE_MAX_RSS_CNT(qdev), QEDE_PF_NUM_CONNS / 2); 1285528fcfabSHarish Patil else 1286528fcfabSHarish Patil dev_info->max_rx_queues = (uint16_t)RTE_MIN( 1287528fcfabSHarish Patil QEDE_MAX_RSS_CNT(qdev), ECORE_MAX_VF_CHAINS_PER_PF); 12882ea6f76aSRasesh Mody dev_info->max_tx_queues = dev_info->max_rx_queues; 1289528fcfabSHarish Patil 12903320ca8cSRasesh Mody dev_info->max_mac_addrs = qdev->dev_info.num_mac_filters; 129186a2265eSRasesh Mody dev_info->max_vfs = 0; 12925cdd769aSRasesh Mody dev_info->reta_size = ECORE_RSS_IND_TABLE_SIZE; 12937ab35bf6SHarish Patil dev_info->hash_key_size = ECORE_RSS_KEY_SIZE * sizeof(uint32_t); 12942ea6f76aSRasesh Mody dev_info->flow_type_rss_offloads = (uint64_t)QEDE_RSS_OFFLOAD_ALL; 12952ea6f76aSRasesh Mody 12962ea6f76aSRasesh Mody dev_info->default_txconf = (struct rte_eth_txconf) { 12972ea6f76aSRasesh Mody .txq_flags = QEDE_TXQ_FLAGS, 12982ea6f76aSRasesh Mody }; 12992ea6f76aSRasesh Mody 13002ea6f76aSRasesh Mody dev_info->rx_offload_capa = (DEV_RX_OFFLOAD_VLAN_STRIP | 13012ea6f76aSRasesh Mody DEV_RX_OFFLOAD_IPV4_CKSUM | 13022ea6f76aSRasesh Mody DEV_RX_OFFLOAD_UDP_CKSUM | 13033d4bb441SHarish Patil DEV_RX_OFFLOAD_TCP_CKSUM | 130429540be7SHarish Patil DEV_RX_OFFLOAD_OUTER_IPV4_CKSUM | 130529540be7SHarish Patil DEV_RX_OFFLOAD_TCP_LRO); 130629540be7SHarish Patil 13072ea6f76aSRasesh Mody dev_info->tx_offload_capa = (DEV_TX_OFFLOAD_VLAN_INSERT | 13082ea6f76aSRasesh Mody DEV_TX_OFFLOAD_IPV4_CKSUM | 13092ea6f76aSRasesh Mody DEV_TX_OFFLOAD_UDP_CKSUM | 13103d4bb441SHarish Patil DEV_TX_OFFLOAD_TCP_CKSUM | 131129540be7SHarish Patil DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM | 131229540be7SHarish Patil DEV_TX_OFFLOAD_TCP_TSO | 131329540be7SHarish Patil DEV_TX_OFFLOAD_VXLAN_TNL_TSO); 13142ea6f76aSRasesh Mody 131564c239b7SHarish Patil memset(&link, 0, sizeof(struct qed_link_output)); 131664c239b7SHarish Patil qdev->ops->common->get_link(edev, &link); 13171ea56b80SHarish Patil if (link.adv_speed & NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_1G) 13181ea56b80SHarish Patil speed_cap |= ETH_LINK_SPEED_1G; 13191ea56b80SHarish Patil if (link.adv_speed & NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_10G) 13201ea56b80SHarish Patil speed_cap |= ETH_LINK_SPEED_10G; 13211ea56b80SHarish Patil if (link.adv_speed & NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_25G) 13221ea56b80SHarish Patil speed_cap |= ETH_LINK_SPEED_25G; 13231ea56b80SHarish Patil if (link.adv_speed & NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_40G) 13241ea56b80SHarish Patil speed_cap |= ETH_LINK_SPEED_40G; 13251ea56b80SHarish Patil if (link.adv_speed & NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_50G) 13261ea56b80SHarish Patil speed_cap |= ETH_LINK_SPEED_50G; 13271ea56b80SHarish Patil if (link.adv_speed & NVM_CFG1_PORT_DRV_SPEED_CAPABILITY_MASK_BB_100G) 13281ea56b80SHarish Patil speed_cap |= ETH_LINK_SPEED_100G; 13291ea56b80SHarish Patil dev_info->speed_capa = speed_cap; 13302ea6f76aSRasesh Mody } 13312ea6f76aSRasesh Mody 13322ea6f76aSRasesh Mody /* return 0 means link status changed, -1 means not changed */ 13332ea6f76aSRasesh Mody static int 13342ea6f76aSRasesh Mody qede_link_update(struct rte_eth_dev *eth_dev, __rte_unused int wait_to_complete) 13352ea6f76aSRasesh Mody { 13362ea6f76aSRasesh Mody struct qede_dev *qdev = eth_dev->data->dev_private; 13372ea6f76aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 13382ea6f76aSRasesh Mody uint16_t link_duplex; 13392ea6f76aSRasesh Mody struct qed_link_output link; 13402ea6f76aSRasesh Mody struct rte_eth_link *curr = ð_dev->data->dev_link; 13412ea6f76aSRasesh Mody 13422ea6f76aSRasesh Mody memset(&link, 0, sizeof(struct qed_link_output)); 13432ea6f76aSRasesh Mody qdev->ops->common->get_link(edev, &link); 13442ea6f76aSRasesh Mody 13452ea6f76aSRasesh Mody /* Link Speed */ 13462ea6f76aSRasesh Mody curr->link_speed = link.speed; 13472ea6f76aSRasesh Mody 13482ea6f76aSRasesh Mody /* Link Mode */ 13492ea6f76aSRasesh Mody switch (link.duplex) { 13502ea6f76aSRasesh Mody case QEDE_DUPLEX_HALF: 13512ea6f76aSRasesh Mody link_duplex = ETH_LINK_HALF_DUPLEX; 13522ea6f76aSRasesh Mody break; 13532ea6f76aSRasesh Mody case QEDE_DUPLEX_FULL: 13542ea6f76aSRasesh Mody link_duplex = ETH_LINK_FULL_DUPLEX; 13552ea6f76aSRasesh Mody break; 13562ea6f76aSRasesh Mody case QEDE_DUPLEX_UNKNOWN: 13572ea6f76aSRasesh Mody default: 13582ea6f76aSRasesh Mody link_duplex = -1; 13592ea6f76aSRasesh Mody } 13602ea6f76aSRasesh Mody curr->link_duplex = link_duplex; 13612ea6f76aSRasesh Mody 13622ea6f76aSRasesh Mody /* Link Status */ 13632ea6f76aSRasesh Mody curr->link_status = (link.link_up) ? ETH_LINK_UP : ETH_LINK_DOWN; 13642ea6f76aSRasesh Mody 13652ea6f76aSRasesh Mody /* AN */ 13662ea6f76aSRasesh Mody curr->link_autoneg = (link.supported_caps & QEDE_SUPPORTED_AUTONEG) ? 13672ea6f76aSRasesh Mody ETH_LINK_AUTONEG : ETH_LINK_FIXED; 13682ea6f76aSRasesh Mody 13692ea6f76aSRasesh Mody DP_INFO(edev, "Link - Speed %u Mode %u AN %u Status %u\n", 13702ea6f76aSRasesh Mody curr->link_speed, curr->link_duplex, 13712ea6f76aSRasesh Mody curr->link_autoneg, curr->link_status); 13722ea6f76aSRasesh Mody 13732ea6f76aSRasesh Mody /* return 0 means link status changed, -1 means not changed */ 13742ea6f76aSRasesh Mody return ((curr->link_status == link.link_up) ? -1 : 0); 13752ea6f76aSRasesh Mody } 13762ea6f76aSRasesh Mody 13772ea6f76aSRasesh Mody static void qede_promiscuous_enable(struct rte_eth_dev *eth_dev) 13782ea6f76aSRasesh Mody { 1379af785e47SRasesh Mody #ifdef RTE_LIBRTE_QEDE_DEBUG_INIT 13802ea6f76aSRasesh Mody struct qede_dev *qdev = eth_dev->data->dev_private; 13812ea6f76aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 13822ea6f76aSRasesh Mody 13832ea6f76aSRasesh Mody PMD_INIT_FUNC_TRACE(edev); 1384af785e47SRasesh Mody #endif 13852ea6f76aSRasesh Mody 13862ea6f76aSRasesh Mody enum qed_filter_rx_mode_type type = QED_FILTER_RX_MODE_TYPE_PROMISC; 13872ea6f76aSRasesh Mody 13882ea6f76aSRasesh Mody if (rte_eth_allmulticast_get(eth_dev->data->port_id) == 1) 13892ea6f76aSRasesh Mody type |= QED_FILTER_RX_MODE_TYPE_MULTI_PROMISC; 13902ea6f76aSRasesh Mody 139177fac1b5SHarish Patil qed_configure_filter_rx_mode(eth_dev, type); 13922ea6f76aSRasesh Mody } 13932ea6f76aSRasesh Mody 13942ea6f76aSRasesh Mody static void qede_promiscuous_disable(struct rte_eth_dev *eth_dev) 13952ea6f76aSRasesh Mody { 1396af785e47SRasesh Mody #ifdef RTE_LIBRTE_QEDE_DEBUG_INIT 13972ea6f76aSRasesh Mody struct qede_dev *qdev = eth_dev->data->dev_private; 13982ea6f76aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 13992ea6f76aSRasesh Mody 14002ea6f76aSRasesh Mody PMD_INIT_FUNC_TRACE(edev); 1401af785e47SRasesh Mody #endif 14022ea6f76aSRasesh Mody 14032ea6f76aSRasesh Mody if (rte_eth_allmulticast_get(eth_dev->data->port_id) == 1) 140477fac1b5SHarish Patil qed_configure_filter_rx_mode(eth_dev, 14052ea6f76aSRasesh Mody QED_FILTER_RX_MODE_TYPE_MULTI_PROMISC); 14062ea6f76aSRasesh Mody else 140777fac1b5SHarish Patil qed_configure_filter_rx_mode(eth_dev, 140877fac1b5SHarish Patil QED_FILTER_RX_MODE_TYPE_REGULAR); 14092ea6f76aSRasesh Mody } 14102ea6f76aSRasesh Mody 14112af14ca7SHarish Patil static void qede_poll_sp_sb_cb(void *param) 14122af14ca7SHarish Patil { 14132af14ca7SHarish Patil struct rte_eth_dev *eth_dev = (struct rte_eth_dev *)param; 14142af14ca7SHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 14152af14ca7SHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 14162af14ca7SHarish Patil int rc; 14172af14ca7SHarish Patil 14182af14ca7SHarish Patil qede_interrupt_action(ECORE_LEADING_HWFN(edev)); 14192af14ca7SHarish Patil qede_interrupt_action(&edev->hwfns[1]); 14202af14ca7SHarish Patil 14212af14ca7SHarish Patil rc = rte_eal_alarm_set(timer_period * US_PER_S, 14222af14ca7SHarish Patil qede_poll_sp_sb_cb, 14232af14ca7SHarish Patil (void *)eth_dev); 14242af14ca7SHarish Patil if (rc != 0) { 14252af14ca7SHarish Patil DP_ERR(edev, "Unable to start periodic" 14262af14ca7SHarish Patil " timer rc %d\n", rc); 14272af14ca7SHarish Patil assert(false && "Unable to start periodic timer"); 14282af14ca7SHarish Patil } 14292af14ca7SHarish Patil } 14302af14ca7SHarish Patil 14312ea6f76aSRasesh Mody static void qede_dev_close(struct rte_eth_dev *eth_dev) 14322ea6f76aSRasesh Mody { 1433c0802544SFerruh Yigit struct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); 1434dbac54c2SHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 1435dbac54c2SHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 14362ea6f76aSRasesh Mody 14372ea6f76aSRasesh Mody PMD_INIT_FUNC_TRACE(edev); 14382ea6f76aSRasesh Mody 14392ea6f76aSRasesh Mody /* dev_stop() shall cleanup fp resources in hw but without releasing 14402ea6f76aSRasesh Mody * dma memories and sw structures so that dev_start() can be called 14412ea6f76aSRasesh Mody * by the app without reconfiguration. However, in dev_close() we 14422ea6f76aSRasesh Mody * can release all the resources and device can be brought up newly 14432ea6f76aSRasesh Mody */ 14444c4bdadfSHarish Patil if (eth_dev->data->dev_started) 14452ea6f76aSRasesh Mody qede_dev_stop(eth_dev); 14462ea6f76aSRasesh Mody 14479a6d30aeSHarish Patil qede_stop_vport(edev); 14484c4bdadfSHarish Patil qede_fdir_dealloc_resc(eth_dev); 1449dbac54c2SHarish Patil qede_dealloc_fp_resc(eth_dev); 14502ea6f76aSRasesh Mody 14514c4bdadfSHarish Patil eth_dev->data->nb_rx_queues = 0; 14524c4bdadfSHarish Patil eth_dev->data->nb_tx_queues = 0; 14534c4bdadfSHarish Patil 14542ea6f76aSRasesh Mody qdev->ops->common->slowpath_stop(edev); 14552ea6f76aSRasesh Mody qdev->ops->common->remove(edev); 1456d4b7f673SJan Blunck rte_intr_disable(&pci_dev->intr_handle); 1457d4b7f673SJan Blunck rte_intr_callback_unregister(&pci_dev->intr_handle, 14582ea6f76aSRasesh Mody qede_interrupt_handler, (void *)eth_dev); 1459c0845c33SRasesh Mody if (ECORE_IS_CMT(edev)) 14602af14ca7SHarish Patil rte_eal_alarm_cancel(qede_poll_sp_sb_cb, (void *)eth_dev); 14612ea6f76aSRasesh Mody } 14622ea6f76aSRasesh Mody 1463*d5b0924bSMatan Azrad static int 14642ea6f76aSRasesh Mody qede_get_stats(struct rte_eth_dev *eth_dev, struct rte_eth_stats *eth_stats) 14652ea6f76aSRasesh Mody { 14662ea6f76aSRasesh Mody struct qede_dev *qdev = eth_dev->data->dev_private; 14672ea6f76aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 14682ea6f76aSRasesh Mody struct ecore_eth_stats stats; 14697634c5f9SRasesh Mody unsigned int i = 0, j = 0, qid; 147006e83c4eSRasesh Mody unsigned int rxq_stat_cntrs, txq_stat_cntrs; 14717634c5f9SRasesh Mody struct qede_tx_queue *txq; 14722ea6f76aSRasesh Mody 14734c4bdadfSHarish Patil ecore_get_vport_stats(edev, &stats); 14742ea6f76aSRasesh Mody 14752ea6f76aSRasesh Mody /* RX Stats */ 14769c1aa3e1SRasesh Mody eth_stats->ipackets = stats.common.rx_ucast_pkts + 14779c1aa3e1SRasesh Mody stats.common.rx_mcast_pkts + stats.common.rx_bcast_pkts; 14782ea6f76aSRasesh Mody 14799c1aa3e1SRasesh Mody eth_stats->ibytes = stats.common.rx_ucast_bytes + 14809c1aa3e1SRasesh Mody stats.common.rx_mcast_bytes + stats.common.rx_bcast_bytes; 14812ea6f76aSRasesh Mody 14829c1aa3e1SRasesh Mody eth_stats->ierrors = stats.common.rx_crc_errors + 14839c1aa3e1SRasesh Mody stats.common.rx_align_errors + 14849c1aa3e1SRasesh Mody stats.common.rx_carrier_errors + 14859c1aa3e1SRasesh Mody stats.common.rx_oversize_packets + 14869c1aa3e1SRasesh Mody stats.common.rx_jabbers + stats.common.rx_undersize_packets; 14872ea6f76aSRasesh Mody 14889c1aa3e1SRasesh Mody eth_stats->rx_nombuf = stats.common.no_buff_discards; 14892ea6f76aSRasesh Mody 14909c1aa3e1SRasesh Mody eth_stats->imissed = stats.common.mftag_filter_discards + 14919c1aa3e1SRasesh Mody stats.common.mac_filter_discards + 14929c1aa3e1SRasesh Mody stats.common.no_buff_discards + 14939c1aa3e1SRasesh Mody stats.common.brb_truncates + stats.common.brb_discards; 14942ea6f76aSRasesh Mody 14952ea6f76aSRasesh Mody /* TX stats */ 14969c1aa3e1SRasesh Mody eth_stats->opackets = stats.common.tx_ucast_pkts + 14979c1aa3e1SRasesh Mody stats.common.tx_mcast_pkts + stats.common.tx_bcast_pkts; 14982ea6f76aSRasesh Mody 14999c1aa3e1SRasesh Mody eth_stats->obytes = stats.common.tx_ucast_bytes + 15009c1aa3e1SRasesh Mody stats.common.tx_mcast_bytes + stats.common.tx_bcast_bytes; 15012ea6f76aSRasesh Mody 15029c1aa3e1SRasesh Mody eth_stats->oerrors = stats.common.tx_err_drop_pkts; 15037634c5f9SRasesh Mody 15047634c5f9SRasesh Mody /* Queue stats */ 150506e83c4eSRasesh Mody rxq_stat_cntrs = RTE_MIN(QEDE_RSS_COUNT(qdev), 150606e83c4eSRasesh Mody RTE_ETHDEV_QUEUE_STAT_CNTRS); 150706e83c4eSRasesh Mody txq_stat_cntrs = RTE_MIN(QEDE_TSS_COUNT(qdev), 150806e83c4eSRasesh Mody RTE_ETHDEV_QUEUE_STAT_CNTRS); 1509af785e47SRasesh Mody if ((rxq_stat_cntrs != (unsigned int)QEDE_RSS_COUNT(qdev)) || 1510af785e47SRasesh Mody (txq_stat_cntrs != (unsigned int)QEDE_TSS_COUNT(qdev))) 151106e83c4eSRasesh Mody DP_VERBOSE(edev, ECORE_MSG_DEBUG, 151206e83c4eSRasesh Mody "Not all the queue stats will be displayed. Set" 151306e83c4eSRasesh Mody " RTE_ETHDEV_QUEUE_STAT_CNTRS config param" 151406e83c4eSRasesh Mody " appropriately and retry.\n"); 151506e83c4eSRasesh Mody 15164c4bdadfSHarish Patil for_each_rss(qid) { 15177634c5f9SRasesh Mody eth_stats->q_ipackets[i] = 15187634c5f9SRasesh Mody *(uint64_t *)( 15194c4bdadfSHarish Patil ((char *)(qdev->fp_array[qid].rxq)) + 15207634c5f9SRasesh Mody offsetof(struct qede_rx_queue, 15217634c5f9SRasesh Mody rcv_pkts)); 15227634c5f9SRasesh Mody eth_stats->q_errors[i] = 15237634c5f9SRasesh Mody *(uint64_t *)( 15244c4bdadfSHarish Patil ((char *)(qdev->fp_array[qid].rxq)) + 15257634c5f9SRasesh Mody offsetof(struct qede_rx_queue, 15267634c5f9SRasesh Mody rx_hw_errors)) + 15277634c5f9SRasesh Mody *(uint64_t *)( 15284c4bdadfSHarish Patil ((char *)(qdev->fp_array[qid].rxq)) + 15297634c5f9SRasesh Mody offsetof(struct qede_rx_queue, 15307634c5f9SRasesh Mody rx_alloc_errors)); 15317634c5f9SRasesh Mody i++; 153206e83c4eSRasesh Mody if (i == rxq_stat_cntrs) 153306e83c4eSRasesh Mody break; 153406e83c4eSRasesh Mody } 15357634c5f9SRasesh Mody 15364c4bdadfSHarish Patil for_each_tss(qid) { 15374c4bdadfSHarish Patil txq = qdev->fp_array[qid].txq; 15387634c5f9SRasesh Mody eth_stats->q_opackets[j] = 15397634c5f9SRasesh Mody *((uint64_t *)(uintptr_t) 15407634c5f9SRasesh Mody (((uint64_t)(uintptr_t)(txq)) + 15417634c5f9SRasesh Mody offsetof(struct qede_tx_queue, 15427634c5f9SRasesh Mody xmit_pkts))); 15437634c5f9SRasesh Mody j++; 154406e83c4eSRasesh Mody if (j == txq_stat_cntrs) 154506e83c4eSRasesh Mody break; 15467634c5f9SRasesh Mody } 1547*d5b0924bSMatan Azrad 1548*d5b0924bSMatan Azrad return 0; 15497634c5f9SRasesh Mody } 15507634c5f9SRasesh Mody 15517634c5f9SRasesh Mody static unsigned 15527634c5f9SRasesh Mody qede_get_xstats_count(struct qede_dev *qdev) { 15539c1aa3e1SRasesh Mody if (ECORE_IS_BB(&qdev->edev)) 15547634c5f9SRasesh Mody return RTE_DIM(qede_xstats_strings) + 15559c1aa3e1SRasesh Mody RTE_DIM(qede_bb_xstats_strings) + 15569c1aa3e1SRasesh Mody (RTE_DIM(qede_rxq_xstats_strings) * 15579c1aa3e1SRasesh Mody RTE_MIN(QEDE_RSS_COUNT(qdev), 15589c1aa3e1SRasesh Mody RTE_ETHDEV_QUEUE_STAT_CNTRS)); 15599c1aa3e1SRasesh Mody else 15609c1aa3e1SRasesh Mody return RTE_DIM(qede_xstats_strings) + 15619c1aa3e1SRasesh Mody RTE_DIM(qede_ah_xstats_strings) + 156206e83c4eSRasesh Mody (RTE_DIM(qede_rxq_xstats_strings) * 156306e83c4eSRasesh Mody RTE_MIN(QEDE_RSS_COUNT(qdev), 156406e83c4eSRasesh Mody RTE_ETHDEV_QUEUE_STAT_CNTRS)); 1565d1216e22SRasesh Mody } 15662ea6f76aSRasesh Mody 1567d1216e22SRasesh Mody static int 1568dd2c630aSFerruh Yigit qede_get_xstats_names(struct rte_eth_dev *dev, 1569af785e47SRasesh Mody struct rte_eth_xstat_name *xstats_names, 1570af785e47SRasesh Mody __rte_unused unsigned int limit) 1571d1216e22SRasesh Mody { 15727634c5f9SRasesh Mody struct qede_dev *qdev = dev->data->dev_private; 15739c1aa3e1SRasesh Mody struct ecore_dev *edev = &qdev->edev; 15747634c5f9SRasesh Mody const unsigned int stat_cnt = qede_get_xstats_count(qdev); 15757634c5f9SRasesh Mody unsigned int i, qid, stat_idx = 0; 157606e83c4eSRasesh Mody unsigned int rxq_stat_cntrs; 1577d1216e22SRasesh Mody 15787634c5f9SRasesh Mody if (xstats_names != NULL) { 15797634c5f9SRasesh Mody for (i = 0; i < RTE_DIM(qede_xstats_strings); i++) { 15807634c5f9SRasesh Mody snprintf(xstats_names[stat_idx].name, 15817634c5f9SRasesh Mody sizeof(xstats_names[stat_idx].name), 1582d1216e22SRasesh Mody "%s", 1583d1216e22SRasesh Mody qede_xstats_strings[i].name); 15847634c5f9SRasesh Mody stat_idx++; 15857634c5f9SRasesh Mody } 15867634c5f9SRasesh Mody 15879c1aa3e1SRasesh Mody if (ECORE_IS_BB(edev)) { 15889c1aa3e1SRasesh Mody for (i = 0; i < RTE_DIM(qede_bb_xstats_strings); i++) { 15899c1aa3e1SRasesh Mody snprintf(xstats_names[stat_idx].name, 15909c1aa3e1SRasesh Mody sizeof(xstats_names[stat_idx].name), 15919c1aa3e1SRasesh Mody "%s", 15929c1aa3e1SRasesh Mody qede_bb_xstats_strings[i].name); 15939c1aa3e1SRasesh Mody stat_idx++; 15949c1aa3e1SRasesh Mody } 15959c1aa3e1SRasesh Mody } else { 15969c1aa3e1SRasesh Mody for (i = 0; i < RTE_DIM(qede_ah_xstats_strings); i++) { 15979c1aa3e1SRasesh Mody snprintf(xstats_names[stat_idx].name, 15989c1aa3e1SRasesh Mody sizeof(xstats_names[stat_idx].name), 15999c1aa3e1SRasesh Mody "%s", 16009c1aa3e1SRasesh Mody qede_ah_xstats_strings[i].name); 16019c1aa3e1SRasesh Mody stat_idx++; 16029c1aa3e1SRasesh Mody } 16039c1aa3e1SRasesh Mody } 16049c1aa3e1SRasesh Mody 160506e83c4eSRasesh Mody rxq_stat_cntrs = RTE_MIN(QEDE_RSS_COUNT(qdev), 160606e83c4eSRasesh Mody RTE_ETHDEV_QUEUE_STAT_CNTRS); 160706e83c4eSRasesh Mody for (qid = 0; qid < rxq_stat_cntrs; qid++) { 16087634c5f9SRasesh Mody for (i = 0; i < RTE_DIM(qede_rxq_xstats_strings); i++) { 16097634c5f9SRasesh Mody snprintf(xstats_names[stat_idx].name, 16107634c5f9SRasesh Mody sizeof(xstats_names[stat_idx].name), 16117634c5f9SRasesh Mody "%.4s%d%s", 16127634c5f9SRasesh Mody qede_rxq_xstats_strings[i].name, qid, 16137634c5f9SRasesh Mody qede_rxq_xstats_strings[i].name + 4); 16147634c5f9SRasesh Mody stat_idx++; 16157634c5f9SRasesh Mody } 16167634c5f9SRasesh Mody } 16177634c5f9SRasesh Mody } 1618d1216e22SRasesh Mody 1619d1216e22SRasesh Mody return stat_cnt; 1620d1216e22SRasesh Mody } 1621d1216e22SRasesh Mody 1622d1216e22SRasesh Mody static int 1623d1216e22SRasesh Mody qede_get_xstats(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats, 1624d1216e22SRasesh Mody unsigned int n) 1625d1216e22SRasesh Mody { 1626d1216e22SRasesh Mody struct qede_dev *qdev = dev->data->dev_private; 1627d1216e22SRasesh Mody struct ecore_dev *edev = &qdev->edev; 1628d1216e22SRasesh Mody struct ecore_eth_stats stats; 16297634c5f9SRasesh Mody const unsigned int num = qede_get_xstats_count(qdev); 16307634c5f9SRasesh Mody unsigned int i, qid, stat_idx = 0; 163106e83c4eSRasesh Mody unsigned int rxq_stat_cntrs; 1632d1216e22SRasesh Mody 1633d1216e22SRasesh Mody if (n < num) 1634d1216e22SRasesh Mody return num; 1635d1216e22SRasesh Mody 16364c4bdadfSHarish Patil ecore_get_vport_stats(edev, &stats); 1637d1216e22SRasesh Mody 16387634c5f9SRasesh Mody for (i = 0; i < RTE_DIM(qede_xstats_strings); i++) { 16397634c5f9SRasesh Mody xstats[stat_idx].value = *(uint64_t *)(((char *)&stats) + 16407634c5f9SRasesh Mody qede_xstats_strings[i].offset); 1641513c78aeSOlivier Matz xstats[stat_idx].id = stat_idx; 16427634c5f9SRasesh Mody stat_idx++; 16437634c5f9SRasesh Mody } 1644d1216e22SRasesh Mody 16459c1aa3e1SRasesh Mody if (ECORE_IS_BB(edev)) { 16469c1aa3e1SRasesh Mody for (i = 0; i < RTE_DIM(qede_bb_xstats_strings); i++) { 16479c1aa3e1SRasesh Mody xstats[stat_idx].value = 16489c1aa3e1SRasesh Mody *(uint64_t *)(((char *)&stats) + 16499c1aa3e1SRasesh Mody qede_bb_xstats_strings[i].offset); 16509c1aa3e1SRasesh Mody xstats[stat_idx].id = stat_idx; 16519c1aa3e1SRasesh Mody stat_idx++; 16529c1aa3e1SRasesh Mody } 16539c1aa3e1SRasesh Mody } else { 16549c1aa3e1SRasesh Mody for (i = 0; i < RTE_DIM(qede_ah_xstats_strings); i++) { 16559c1aa3e1SRasesh Mody xstats[stat_idx].value = 16569c1aa3e1SRasesh Mody *(uint64_t *)(((char *)&stats) + 16579c1aa3e1SRasesh Mody qede_ah_xstats_strings[i].offset); 16589c1aa3e1SRasesh Mody xstats[stat_idx].id = stat_idx; 16599c1aa3e1SRasesh Mody stat_idx++; 16609c1aa3e1SRasesh Mody } 16619c1aa3e1SRasesh Mody } 16629c1aa3e1SRasesh Mody 166306e83c4eSRasesh Mody rxq_stat_cntrs = RTE_MIN(QEDE_RSS_COUNT(qdev), 166406e83c4eSRasesh Mody RTE_ETHDEV_QUEUE_STAT_CNTRS); 166506e83c4eSRasesh Mody for (qid = 0; qid < rxq_stat_cntrs; qid++) { 16664c4bdadfSHarish Patil for_each_rss(qid) { 16677634c5f9SRasesh Mody for (i = 0; i < RTE_DIM(qede_rxq_xstats_strings); i++) { 16687634c5f9SRasesh Mody xstats[stat_idx].value = *(uint64_t *)( 16694c4bdadfSHarish Patil ((char *)(qdev->fp_array[qid].rxq)) + 16707634c5f9SRasesh Mody qede_rxq_xstats_strings[i].offset); 1671513c78aeSOlivier Matz xstats[stat_idx].id = stat_idx; 16727634c5f9SRasesh Mody stat_idx++; 16737634c5f9SRasesh Mody } 16747634c5f9SRasesh Mody } 16757634c5f9SRasesh Mody } 16767634c5f9SRasesh Mody 16777634c5f9SRasesh Mody return stat_idx; 1678d1216e22SRasesh Mody } 1679d1216e22SRasesh Mody 1680d1216e22SRasesh Mody static void 1681d1216e22SRasesh Mody qede_reset_xstats(struct rte_eth_dev *dev) 1682d1216e22SRasesh Mody { 1683d1216e22SRasesh Mody struct qede_dev *qdev = dev->data->dev_private; 1684d1216e22SRasesh Mody struct ecore_dev *edev = &qdev->edev; 1685d1216e22SRasesh Mody 1686d1216e22SRasesh Mody ecore_reset_vport_stats(edev); 16872ea6f76aSRasesh Mody } 16882ea6f76aSRasesh Mody 16892ea6f76aSRasesh Mody int qede_dev_set_link_state(struct rte_eth_dev *eth_dev, bool link_up) 16902ea6f76aSRasesh Mody { 16912ea6f76aSRasesh Mody struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 16922ea6f76aSRasesh Mody struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 16932ea6f76aSRasesh Mody struct qed_link_params link_params; 16942ea6f76aSRasesh Mody int rc; 16952ea6f76aSRasesh Mody 16962ea6f76aSRasesh Mody DP_INFO(edev, "setting link state %d\n", link_up); 16972ea6f76aSRasesh Mody memset(&link_params, 0, sizeof(link_params)); 16982ea6f76aSRasesh Mody link_params.link_up = link_up; 16992ea6f76aSRasesh Mody rc = qdev->ops->common->set_link(edev, &link_params); 17002ea6f76aSRasesh Mody if (rc != ECORE_SUCCESS) 17012ea6f76aSRasesh Mody DP_ERR(edev, "Unable to set link state %d\n", link_up); 17022ea6f76aSRasesh Mody 17032ea6f76aSRasesh Mody return rc; 17042ea6f76aSRasesh Mody } 17052ea6f76aSRasesh Mody 17062ea6f76aSRasesh Mody static int qede_dev_set_link_up(struct rte_eth_dev *eth_dev) 17072ea6f76aSRasesh Mody { 17082ea6f76aSRasesh Mody return qede_dev_set_link_state(eth_dev, true); 17092ea6f76aSRasesh Mody } 17102ea6f76aSRasesh Mody 17112ea6f76aSRasesh Mody static int qede_dev_set_link_down(struct rte_eth_dev *eth_dev) 17122ea6f76aSRasesh Mody { 17132ea6f76aSRasesh Mody return qede_dev_set_link_state(eth_dev, false); 17142ea6f76aSRasesh Mody } 17152ea6f76aSRasesh Mody 17165cdd769aSRasesh Mody static void qede_reset_stats(struct rte_eth_dev *eth_dev) 17175cdd769aSRasesh Mody { 17185cdd769aSRasesh Mody struct qede_dev *qdev = eth_dev->data->dev_private; 17195cdd769aSRasesh Mody struct ecore_dev *edev = &qdev->edev; 17205cdd769aSRasesh Mody 17215cdd769aSRasesh Mody ecore_reset_vport_stats(edev); 17225cdd769aSRasesh Mody } 17235cdd769aSRasesh Mody 17242ea6f76aSRasesh Mody static void qede_allmulticast_enable(struct rte_eth_dev *eth_dev) 17252ea6f76aSRasesh Mody { 17262ea6f76aSRasesh Mody enum qed_filter_rx_mode_type type = 17272ea6f76aSRasesh Mody QED_FILTER_RX_MODE_TYPE_MULTI_PROMISC; 17282ea6f76aSRasesh Mody 17292ea6f76aSRasesh Mody if (rte_eth_promiscuous_get(eth_dev->data->port_id) == 1) 17302ea6f76aSRasesh Mody type |= QED_FILTER_RX_MODE_TYPE_PROMISC; 17312ea6f76aSRasesh Mody 173277fac1b5SHarish Patil qed_configure_filter_rx_mode(eth_dev, type); 17332ea6f76aSRasesh Mody } 17342ea6f76aSRasesh Mody 17352ea6f76aSRasesh Mody static void qede_allmulticast_disable(struct rte_eth_dev *eth_dev) 17362ea6f76aSRasesh Mody { 17372ea6f76aSRasesh Mody if (rte_eth_promiscuous_get(eth_dev->data->port_id) == 1) 173877fac1b5SHarish Patil qed_configure_filter_rx_mode(eth_dev, 173977fac1b5SHarish Patil QED_FILTER_RX_MODE_TYPE_PROMISC); 17402ea6f76aSRasesh Mody else 174177fac1b5SHarish Patil qed_configure_filter_rx_mode(eth_dev, 174277fac1b5SHarish Patil QED_FILTER_RX_MODE_TYPE_REGULAR); 17432ea6f76aSRasesh Mody } 17442ea6f76aSRasesh Mody 17452ea6f76aSRasesh Mody static int qede_flow_ctrl_set(struct rte_eth_dev *eth_dev, 17462ea6f76aSRasesh Mody struct rte_eth_fc_conf *fc_conf) 17472ea6f76aSRasesh Mody { 17482ea6f76aSRasesh Mody struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 17492ea6f76aSRasesh Mody struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 17502ea6f76aSRasesh Mody struct qed_link_output current_link; 17512ea6f76aSRasesh Mody struct qed_link_params params; 17522ea6f76aSRasesh Mody 17532ea6f76aSRasesh Mody memset(¤t_link, 0, sizeof(current_link)); 17542ea6f76aSRasesh Mody qdev->ops->common->get_link(edev, ¤t_link); 17552ea6f76aSRasesh Mody 17562ea6f76aSRasesh Mody memset(¶ms, 0, sizeof(params)); 17572ea6f76aSRasesh Mody params.override_flags |= QED_LINK_OVERRIDE_PAUSE_CONFIG; 17582ea6f76aSRasesh Mody if (fc_conf->autoneg) { 17592ea6f76aSRasesh Mody if (!(current_link.supported_caps & QEDE_SUPPORTED_AUTONEG)) { 17602ea6f76aSRasesh Mody DP_ERR(edev, "Autoneg not supported\n"); 17612ea6f76aSRasesh Mody return -EINVAL; 17622ea6f76aSRasesh Mody } 17632ea6f76aSRasesh Mody params.pause_config |= QED_LINK_PAUSE_AUTONEG_ENABLE; 17642ea6f76aSRasesh Mody } 17652ea6f76aSRasesh Mody 17662ea6f76aSRasesh Mody /* Pause is assumed to be supported (SUPPORTED_Pause) */ 17672ea6f76aSRasesh Mody if (fc_conf->mode == RTE_FC_FULL) 17682ea6f76aSRasesh Mody params.pause_config |= (QED_LINK_PAUSE_TX_ENABLE | 17692ea6f76aSRasesh Mody QED_LINK_PAUSE_RX_ENABLE); 17702ea6f76aSRasesh Mody if (fc_conf->mode == RTE_FC_TX_PAUSE) 17712ea6f76aSRasesh Mody params.pause_config |= QED_LINK_PAUSE_TX_ENABLE; 17722ea6f76aSRasesh Mody if (fc_conf->mode == RTE_FC_RX_PAUSE) 17732ea6f76aSRasesh Mody params.pause_config |= QED_LINK_PAUSE_RX_ENABLE; 17742ea6f76aSRasesh Mody 17752ea6f76aSRasesh Mody params.link_up = true; 17762ea6f76aSRasesh Mody (void)qdev->ops->common->set_link(edev, ¶ms); 17772ea6f76aSRasesh Mody 17782ea6f76aSRasesh Mody return 0; 17792ea6f76aSRasesh Mody } 17802ea6f76aSRasesh Mody 17812ea6f76aSRasesh Mody static int qede_flow_ctrl_get(struct rte_eth_dev *eth_dev, 17822ea6f76aSRasesh Mody struct rte_eth_fc_conf *fc_conf) 17832ea6f76aSRasesh Mody { 17842ea6f76aSRasesh Mody struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 17852ea6f76aSRasesh Mody struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 17862ea6f76aSRasesh Mody struct qed_link_output current_link; 17872ea6f76aSRasesh Mody 17882ea6f76aSRasesh Mody memset(¤t_link, 0, sizeof(current_link)); 17892ea6f76aSRasesh Mody qdev->ops->common->get_link(edev, ¤t_link); 17902ea6f76aSRasesh Mody 17912ea6f76aSRasesh Mody if (current_link.pause_config & QED_LINK_PAUSE_AUTONEG_ENABLE) 17922ea6f76aSRasesh Mody fc_conf->autoneg = true; 17932ea6f76aSRasesh Mody 17942ea6f76aSRasesh Mody if (current_link.pause_config & (QED_LINK_PAUSE_RX_ENABLE | 17952ea6f76aSRasesh Mody QED_LINK_PAUSE_TX_ENABLE)) 17962ea6f76aSRasesh Mody fc_conf->mode = RTE_FC_FULL; 17972ea6f76aSRasesh Mody else if (current_link.pause_config & QED_LINK_PAUSE_RX_ENABLE) 17982ea6f76aSRasesh Mody fc_conf->mode = RTE_FC_RX_PAUSE; 17992ea6f76aSRasesh Mody else if (current_link.pause_config & QED_LINK_PAUSE_TX_ENABLE) 18002ea6f76aSRasesh Mody fc_conf->mode = RTE_FC_TX_PAUSE; 18012ea6f76aSRasesh Mody else 18022ea6f76aSRasesh Mody fc_conf->mode = RTE_FC_NONE; 18032ea6f76aSRasesh Mody 18042ea6f76aSRasesh Mody return 0; 18052ea6f76aSRasesh Mody } 18062ea6f76aSRasesh Mody 18072ea6f76aSRasesh Mody static const uint32_t * 18082ea6f76aSRasesh Mody qede_dev_supported_ptypes_get(struct rte_eth_dev *eth_dev) 18092ea6f76aSRasesh Mody { 18102ea6f76aSRasesh Mody static const uint32_t ptypes[] = { 18112ea6f76aSRasesh Mody RTE_PTYPE_L3_IPV4, 18122ea6f76aSRasesh Mody RTE_PTYPE_L3_IPV6, 18132ea6f76aSRasesh Mody RTE_PTYPE_UNKNOWN 18142ea6f76aSRasesh Mody }; 18152ea6f76aSRasesh Mody 18162ea6f76aSRasesh Mody if (eth_dev->rx_pkt_burst == qede_recv_pkts) 18172ea6f76aSRasesh Mody return ptypes; 18182ea6f76aSRasesh Mody 18192ea6f76aSRasesh Mody return NULL; 18202ea6f76aSRasesh Mody } 18212ea6f76aSRasesh Mody 18227ab35bf6SHarish Patil static void qede_init_rss_caps(uint8_t *rss_caps, uint64_t hf) 18239c5d0a66SHarish Patil { 18249c5d0a66SHarish Patil *rss_caps = 0; 18259c5d0a66SHarish Patil *rss_caps |= (hf & ETH_RSS_IPV4) ? ECORE_RSS_IPV4 : 0; 18269c5d0a66SHarish Patil *rss_caps |= (hf & ETH_RSS_IPV6) ? ECORE_RSS_IPV6 : 0; 18279c5d0a66SHarish Patil *rss_caps |= (hf & ETH_RSS_IPV6_EX) ? ECORE_RSS_IPV6 : 0; 18289c5d0a66SHarish Patil *rss_caps |= (hf & ETH_RSS_NONFRAG_IPV4_TCP) ? ECORE_RSS_IPV4_TCP : 0; 18299c5d0a66SHarish Patil *rss_caps |= (hf & ETH_RSS_NONFRAG_IPV6_TCP) ? ECORE_RSS_IPV6_TCP : 0; 18309c5d0a66SHarish Patil *rss_caps |= (hf & ETH_RSS_IPV6_TCP_EX) ? ECORE_RSS_IPV6_TCP : 0; 183182bd0987SHarish Patil *rss_caps |= (hf & ETH_RSS_NONFRAG_IPV4_UDP) ? ECORE_RSS_IPV4_UDP : 0; 183282bd0987SHarish Patil *rss_caps |= (hf & ETH_RSS_NONFRAG_IPV6_UDP) ? ECORE_RSS_IPV6_UDP : 0; 18339c5d0a66SHarish Patil } 18349c5d0a66SHarish Patil 1835af785e47SRasesh Mody int qede_rss_hash_update(struct rte_eth_dev *eth_dev, 18364c98f276SSony Chacko struct rte_eth_rss_conf *rss_conf) 18374c98f276SSony Chacko { 18387ab35bf6SHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 18397ab35bf6SHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 18407ab35bf6SHarish Patil struct ecore_sp_vport_update_params vport_update_params; 18417ab35bf6SHarish Patil struct ecore_rss_params rss_params; 18427ab35bf6SHarish Patil struct ecore_hwfn *p_hwfn; 18434c98f276SSony Chacko uint32_t *key = (uint32_t *)rss_conf->rss_key; 18444c98f276SSony Chacko uint64_t hf = rss_conf->rss_hf; 18457ab35bf6SHarish Patil uint8_t len = rss_conf->rss_key_len; 184669d7ba88SRasesh Mody uint8_t idx; 18477ab35bf6SHarish Patil uint8_t i; 18487ab35bf6SHarish Patil int rc; 18494c98f276SSony Chacko 18504c98f276SSony Chacko memset(&vport_update_params, 0, sizeof(vport_update_params)); 18517ab35bf6SHarish Patil memset(&rss_params, 0, sizeof(rss_params)); 18527ab35bf6SHarish Patil 18537ab35bf6SHarish Patil DP_INFO(edev, "RSS hf = 0x%lx len = %u key = %p\n", 18547ab35bf6SHarish Patil (unsigned long)hf, len, key); 18554c98f276SSony Chacko 18569c5d0a66SHarish Patil if (hf != 0) { 18577ab35bf6SHarish Patil /* Enabling RSS */ 18587ab35bf6SHarish Patil DP_INFO(edev, "Enabling rss\n"); 18599c5d0a66SHarish Patil 18607ab35bf6SHarish Patil /* RSS caps */ 18617ab35bf6SHarish Patil qede_init_rss_caps(&rss_params.rss_caps, hf); 18627ab35bf6SHarish Patil rss_params.update_rss_capabilities = 1; 18637ab35bf6SHarish Patil 18647ab35bf6SHarish Patil /* RSS hash key */ 18657ab35bf6SHarish Patil if (key) { 18667ab35bf6SHarish Patil if (len > (ECORE_RSS_KEY_SIZE * sizeof(uint32_t))) { 18677ab35bf6SHarish Patil DP_ERR(edev, "RSS key length exceeds limit\n"); 18689c5d0a66SHarish Patil return -EINVAL; 18697ab35bf6SHarish Patil } 18707ab35bf6SHarish Patil DP_INFO(edev, "Applying user supplied hash key\n"); 18717ab35bf6SHarish Patil rss_params.update_rss_key = 1; 18727ab35bf6SHarish Patil memcpy(&rss_params.rss_key, key, len); 18737ab35bf6SHarish Patil } 18747ab35bf6SHarish Patil rss_params.rss_enable = 1; 18754c98f276SSony Chacko } 18764c98f276SSony Chacko 18777ab35bf6SHarish Patil rss_params.update_rss_config = 1; 18787ab35bf6SHarish Patil /* tbl_size has to be set with capabilities */ 18797ab35bf6SHarish Patil rss_params.rss_table_size_log = 7; 18807ab35bf6SHarish Patil vport_update_params.vport_id = 0; 188169d7ba88SRasesh Mody /* pass the L2 handles instead of qids */ 188269d7ba88SRasesh Mody for (i = 0 ; i < ECORE_RSS_IND_TABLE_SIZE ; i++) { 188369d7ba88SRasesh Mody idx = qdev->rss_ind_table[i]; 188469d7ba88SRasesh Mody rss_params.rss_ind_table[i] = qdev->fp_array[idx].rxq->handle; 188569d7ba88SRasesh Mody } 18867ab35bf6SHarish Patil vport_update_params.rss_params = &rss_params; 18877ab35bf6SHarish Patil 18887ab35bf6SHarish Patil for_each_hwfn(edev, i) { 18897ab35bf6SHarish Patil p_hwfn = &edev->hwfns[i]; 18907ab35bf6SHarish Patil vport_update_params.opaque_fid = p_hwfn->hw_info.opaque_fid; 18917ab35bf6SHarish Patil rc = ecore_sp_vport_update(p_hwfn, &vport_update_params, 18927ab35bf6SHarish Patil ECORE_SPQ_MODE_EBLOCK, NULL); 18937ab35bf6SHarish Patil if (rc) { 18947ab35bf6SHarish Patil DP_ERR(edev, "vport-update for RSS failed\n"); 18957ab35bf6SHarish Patil return rc; 18967ab35bf6SHarish Patil } 18977ab35bf6SHarish Patil } 18987ab35bf6SHarish Patil qdev->rss_enable = rss_params.rss_enable; 18997ab35bf6SHarish Patil 19007ab35bf6SHarish Patil /* Update local structure for hash query */ 19017ab35bf6SHarish Patil qdev->rss_conf.rss_hf = hf; 19027ab35bf6SHarish Patil qdev->rss_conf.rss_key_len = len; 19037ab35bf6SHarish Patil if (qdev->rss_enable) { 19047ab35bf6SHarish Patil if (qdev->rss_conf.rss_key == NULL) { 19057ab35bf6SHarish Patil qdev->rss_conf.rss_key = (uint8_t *)malloc(len); 19067ab35bf6SHarish Patil if (qdev->rss_conf.rss_key == NULL) { 19077ab35bf6SHarish Patil DP_ERR(edev, "No memory to store RSS key\n"); 19087ab35bf6SHarish Patil return -ENOMEM; 19097ab35bf6SHarish Patil } 19107ab35bf6SHarish Patil } 19117ab35bf6SHarish Patil if (key && len) { 19127ab35bf6SHarish Patil DP_INFO(edev, "Storing RSS key\n"); 19137ab35bf6SHarish Patil memcpy(qdev->rss_conf.rss_key, key, len); 19147ab35bf6SHarish Patil } 19157ab35bf6SHarish Patil } else if (!qdev->rss_enable && len == 0) { 19167ab35bf6SHarish Patil if (qdev->rss_conf.rss_key) { 19177ab35bf6SHarish Patil free(qdev->rss_conf.rss_key); 19187ab35bf6SHarish Patil qdev->rss_conf.rss_key = NULL; 19197ab35bf6SHarish Patil DP_INFO(edev, "Free RSS key\n"); 19207ab35bf6SHarish Patil } 19217ab35bf6SHarish Patil } 19227ab35bf6SHarish Patil 19237ab35bf6SHarish Patil return 0; 19247ab35bf6SHarish Patil } 19257ab35bf6SHarish Patil 19267ab35bf6SHarish Patil static int qede_rss_hash_conf_get(struct rte_eth_dev *eth_dev, 19276d9e26c4SSony Chacko struct rte_eth_rss_conf *rss_conf) 19286d9e26c4SSony Chacko { 19297ab35bf6SHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 19306d9e26c4SSony Chacko 19317ab35bf6SHarish Patil rss_conf->rss_hf = qdev->rss_conf.rss_hf; 19327ab35bf6SHarish Patil rss_conf->rss_key_len = qdev->rss_conf.rss_key_len; 19336d9e26c4SSony Chacko 19347ab35bf6SHarish Patil if (rss_conf->rss_key && qdev->rss_conf.rss_key) 19357ab35bf6SHarish Patil memcpy(rss_conf->rss_key, qdev->rss_conf.rss_key, 19367ab35bf6SHarish Patil rss_conf->rss_key_len); 19376d9e26c4SSony Chacko return 0; 19386d9e26c4SSony Chacko } 19396d9e26c4SSony Chacko 19408b3ee85eSRasesh Mody static bool qede_update_rss_parm_cmt(struct ecore_dev *edev, 19418b3ee85eSRasesh Mody struct ecore_rss_params *rss) 19428b3ee85eSRasesh Mody { 19438b3ee85eSRasesh Mody int i, fn; 19448b3ee85eSRasesh Mody bool rss_mode = 1; /* enable */ 19458b3ee85eSRasesh Mody struct ecore_queue_cid *cid; 19468b3ee85eSRasesh Mody struct ecore_rss_params *t_rss; 19478b3ee85eSRasesh Mody 19488b3ee85eSRasesh Mody /* In regular scenario, we'd simply need to take input handlers. 19498b3ee85eSRasesh Mody * But in CMT, we'd have to split the handlers according to the 19508b3ee85eSRasesh Mody * engine they were configured on. We'd then have to understand 19518b3ee85eSRasesh Mody * whether RSS is really required, since 2-queues on CMT doesn't 19528b3ee85eSRasesh Mody * require RSS. 19538b3ee85eSRasesh Mody */ 19548b3ee85eSRasesh Mody 19558b3ee85eSRasesh Mody /* CMT should be round-robin */ 19568b3ee85eSRasesh Mody for (i = 0; i < ECORE_RSS_IND_TABLE_SIZE; i++) { 19578b3ee85eSRasesh Mody cid = rss->rss_ind_table[i]; 19588b3ee85eSRasesh Mody 19598b3ee85eSRasesh Mody if (cid->p_owner == ECORE_LEADING_HWFN(edev)) 19608b3ee85eSRasesh Mody t_rss = &rss[0]; 19618b3ee85eSRasesh Mody else 19628b3ee85eSRasesh Mody t_rss = &rss[1]; 19638b3ee85eSRasesh Mody 19648b3ee85eSRasesh Mody t_rss->rss_ind_table[i / edev->num_hwfns] = cid; 19658b3ee85eSRasesh Mody } 19668b3ee85eSRasesh Mody 19678b3ee85eSRasesh Mody t_rss = &rss[1]; 19688b3ee85eSRasesh Mody t_rss->update_rss_ind_table = 1; 19698b3ee85eSRasesh Mody t_rss->rss_table_size_log = 7; 19708b3ee85eSRasesh Mody t_rss->update_rss_config = 1; 19718b3ee85eSRasesh Mody 19728b3ee85eSRasesh Mody /* Make sure RSS is actually required */ 19738b3ee85eSRasesh Mody for_each_hwfn(edev, fn) { 19748b3ee85eSRasesh Mody for (i = 1; i < ECORE_RSS_IND_TABLE_SIZE / edev->num_hwfns; 19758b3ee85eSRasesh Mody i++) { 19768b3ee85eSRasesh Mody if (rss[fn].rss_ind_table[i] != 19778b3ee85eSRasesh Mody rss[fn].rss_ind_table[0]) 19788b3ee85eSRasesh Mody break; 19798b3ee85eSRasesh Mody } 19808b3ee85eSRasesh Mody 19818b3ee85eSRasesh Mody if (i == ECORE_RSS_IND_TABLE_SIZE / edev->num_hwfns) { 19828b3ee85eSRasesh Mody DP_INFO(edev, 19838b3ee85eSRasesh Mody "CMT - 1 queue per-hwfn; Disabling RSS\n"); 19848b3ee85eSRasesh Mody rss_mode = 0; 19858b3ee85eSRasesh Mody goto out; 19868b3ee85eSRasesh Mody } 19878b3ee85eSRasesh Mody } 19888b3ee85eSRasesh Mody 19898b3ee85eSRasesh Mody out: 19908b3ee85eSRasesh Mody t_rss->rss_enable = rss_mode; 19918b3ee85eSRasesh Mody 19928b3ee85eSRasesh Mody return rss_mode; 19938b3ee85eSRasesh Mody } 19948b3ee85eSRasesh Mody 1995af785e47SRasesh Mody int qede_rss_reta_update(struct rte_eth_dev *eth_dev, 1996e8876556SSony Chacko struct rte_eth_rss_reta_entry64 *reta_conf, 1997e8876556SSony Chacko uint16_t reta_size) 1998e8876556SSony Chacko { 19997ab35bf6SHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 20007ab35bf6SHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 20017ab35bf6SHarish Patil struct ecore_sp_vport_update_params vport_update_params; 20028b3ee85eSRasesh Mody struct ecore_rss_params *params; 20037ab35bf6SHarish Patil struct ecore_hwfn *p_hwfn; 2004e8876556SSony Chacko uint16_t i, idx, shift; 20057ab35bf6SHarish Patil uint8_t entry; 20068b3ee85eSRasesh Mody int rc = 0; 2007e8876556SSony Chacko 2008e8876556SSony Chacko if (reta_size > ETH_RSS_RETA_SIZE_128) { 2009e8876556SSony Chacko DP_ERR(edev, "reta_size %d is not supported by hardware\n", 2010e8876556SSony Chacko reta_size); 2011e8876556SSony Chacko return -EINVAL; 2012e8876556SSony Chacko } 2013e8876556SSony Chacko 2014e8876556SSony Chacko memset(&vport_update_params, 0, sizeof(vport_update_params)); 20158b3ee85eSRasesh Mody params = rte_zmalloc("qede_rss", sizeof(*params) * edev->num_hwfns, 20168b3ee85eSRasesh Mody RTE_CACHE_LINE_SIZE); 2017ef86e67aSRongQiang Xie if (params == NULL) { 2018ef86e67aSRongQiang Xie DP_ERR(edev, "failed to allocate memory\n"); 2019ef86e67aSRongQiang Xie return -ENOMEM; 2020ef86e67aSRongQiang Xie } 2021e8876556SSony Chacko 2022e8876556SSony Chacko for (i = 0; i < reta_size; i++) { 2023e8876556SSony Chacko idx = i / RTE_RETA_GROUP_SIZE; 2024e8876556SSony Chacko shift = i % RTE_RETA_GROUP_SIZE; 2025e8876556SSony Chacko if (reta_conf[idx].mask & (1ULL << shift)) { 20267ab35bf6SHarish Patil entry = reta_conf[idx].reta[shift]; 202769d7ba88SRasesh Mody /* Pass rxq handles to ecore */ 20288b3ee85eSRasesh Mody params->rss_ind_table[i] = 202969d7ba88SRasesh Mody qdev->fp_array[entry].rxq->handle; 203069d7ba88SRasesh Mody /* Update the local copy for RETA query command */ 203169d7ba88SRasesh Mody qdev->rss_ind_table[i] = entry; 2032e8876556SSony Chacko } 2033e8876556SSony Chacko } 2034e8876556SSony Chacko 20358b3ee85eSRasesh Mody params->update_rss_ind_table = 1; 20368b3ee85eSRasesh Mody params->rss_table_size_log = 7; 20378b3ee85eSRasesh Mody params->update_rss_config = 1; 20388b3ee85eSRasesh Mody 20397ab35bf6SHarish Patil /* Fix up RETA for CMT mode device */ 2040c0845c33SRasesh Mody if (ECORE_IS_CMT(edev)) 20418b3ee85eSRasesh Mody qdev->rss_enable = qede_update_rss_parm_cmt(edev, 20428b3ee85eSRasesh Mody params); 2043e8876556SSony Chacko vport_update_params.vport_id = 0; 20447ab35bf6SHarish Patil /* Use the current value of rss_enable */ 20458b3ee85eSRasesh Mody params->rss_enable = qdev->rss_enable; 20468b3ee85eSRasesh Mody vport_update_params.rss_params = params; 2047e8876556SSony Chacko 20487ab35bf6SHarish Patil for_each_hwfn(edev, i) { 20497ab35bf6SHarish Patil p_hwfn = &edev->hwfns[i]; 20507ab35bf6SHarish Patil vport_update_params.opaque_fid = p_hwfn->hw_info.opaque_fid; 20517ab35bf6SHarish Patil rc = ecore_sp_vport_update(p_hwfn, &vport_update_params, 20527ab35bf6SHarish Patil ECORE_SPQ_MODE_EBLOCK, NULL); 20537ab35bf6SHarish Patil if (rc) { 20547ab35bf6SHarish Patil DP_ERR(edev, "vport-update for RSS failed\n"); 20558b3ee85eSRasesh Mody goto out; 20567ab35bf6SHarish Patil } 2057e8876556SSony Chacko } 2058e8876556SSony Chacko 20598b3ee85eSRasesh Mody out: 20608b3ee85eSRasesh Mody rte_free(params); 20618b3ee85eSRasesh Mody return rc; 20627ab35bf6SHarish Patil } 20637ab35bf6SHarish Patil 20647ab35bf6SHarish Patil static int qede_rss_reta_query(struct rte_eth_dev *eth_dev, 20653dadf73eSSony Chacko struct rte_eth_rss_reta_entry64 *reta_conf, 20663dadf73eSSony Chacko uint16_t reta_size) 20673dadf73eSSony Chacko { 20683dadf73eSSony Chacko struct qede_dev *qdev = eth_dev->data->dev_private; 20697ab35bf6SHarish Patil struct ecore_dev *edev = &qdev->edev; 20703dadf73eSSony Chacko uint16_t i, idx, shift; 20717ab35bf6SHarish Patil uint8_t entry; 20723dadf73eSSony Chacko 20733dadf73eSSony Chacko if (reta_size > ETH_RSS_RETA_SIZE_128) { 20743dadf73eSSony Chacko DP_ERR(edev, "reta_size %d is not supported\n", 20753dadf73eSSony Chacko reta_size); 20767ab35bf6SHarish Patil return -EINVAL; 20773dadf73eSSony Chacko } 20783dadf73eSSony Chacko 20793dadf73eSSony Chacko for (i = 0; i < reta_size; i++) { 20803dadf73eSSony Chacko idx = i / RTE_RETA_GROUP_SIZE; 20813dadf73eSSony Chacko shift = i % RTE_RETA_GROUP_SIZE; 20823dadf73eSSony Chacko if (reta_conf[idx].mask & (1ULL << shift)) { 20837ab35bf6SHarish Patil entry = qdev->rss_ind_table[i]; 20843dadf73eSSony Chacko reta_conf[idx].reta[shift] = entry; 20853dadf73eSSony Chacko } 20863dadf73eSSony Chacko } 20873dadf73eSSony Chacko 20883dadf73eSSony Chacko return 0; 20893dadf73eSSony Chacko } 20903dadf73eSSony Chacko 20914c4bdadfSHarish Patil 20924c4bdadfSHarish Patil 2093af785e47SRasesh Mody static int qede_set_mtu(struct rte_eth_dev *dev, uint16_t mtu) 2094200645acSSony Chacko { 20951ef4c3a5SHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(dev); 20961ef4c3a5SHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 2097200645acSSony Chacko struct rte_eth_dev_info dev_info = {0}; 20981ef4c3a5SHarish Patil struct qede_fastpath *fp; 20991ef4c3a5SHarish Patil uint32_t frame_size; 21001ef4c3a5SHarish Patil uint16_t rx_buf_size; 21011ef4c3a5SHarish Patil uint16_t bufsz; 21021ef4c3a5SHarish Patil int i; 2103200645acSSony Chacko 21041ef4c3a5SHarish Patil PMD_INIT_FUNC_TRACE(edev); 2105200645acSSony Chacko qede_dev_info_get(dev, &dev_info); 21061ef4c3a5SHarish Patil frame_size = mtu + QEDE_ETH_OVERHEAD; 21071ef4c3a5SHarish Patil if ((mtu < ETHER_MIN_MTU) || (frame_size > dev_info.max_rx_pktlen)) { 21081ef4c3a5SHarish Patil DP_ERR(edev, "MTU %u out of range\n", mtu); 2109200645acSSony Chacko return -EINVAL; 21101ef4c3a5SHarish Patil } 2111200645acSSony Chacko if (!dev->data->scattered_rx && 21121ef4c3a5SHarish Patil frame_size > dev->data->min_rx_buf_size - RTE_PKTMBUF_HEADROOM) { 21131ef4c3a5SHarish Patil DP_INFO(edev, "MTU greater than minimum RX buffer size of %u\n", 21141ef4c3a5SHarish Patil dev->data->min_rx_buf_size); 2115200645acSSony Chacko return -EINVAL; 21161ef4c3a5SHarish Patil } 21171ef4c3a5SHarish Patil /* Temporarily replace I/O functions with dummy ones. It cannot 21181ef4c3a5SHarish Patil * be set to NULL because rte_eth_rx_burst() doesn't check for NULL. 21191ef4c3a5SHarish Patil */ 21201ef4c3a5SHarish Patil dev->rx_pkt_burst = qede_rxtx_pkts_dummy; 21211ef4c3a5SHarish Patil dev->tx_pkt_burst = qede_rxtx_pkts_dummy; 21221ef4c3a5SHarish Patil qede_dev_stop(dev); 21231ef4c3a5SHarish Patil rte_delay_ms(1000); 21241ef4c3a5SHarish Patil qdev->mtu = mtu; 21251ef4c3a5SHarish Patil /* Fix up RX buf size for all queues of the port */ 21264c4bdadfSHarish Patil for_each_rss(i) { 21271ef4c3a5SHarish Patil fp = &qdev->fp_array[i]; 21281ef4c3a5SHarish Patil bufsz = (uint16_t)rte_pktmbuf_data_room_size( 21291ef4c3a5SHarish Patil fp->rxq->mb_pool) - RTE_PKTMBUF_HEADROOM; 21301ef4c3a5SHarish Patil if (dev->data->scattered_rx) 21311ef4c3a5SHarish Patil rx_buf_size = bufsz + QEDE_ETH_OVERHEAD; 21321ef4c3a5SHarish Patil else 21331ef4c3a5SHarish Patil rx_buf_size = mtu + QEDE_ETH_OVERHEAD; 21341ef4c3a5SHarish Patil rx_buf_size = QEDE_CEIL_TO_CACHE_LINE_SIZE(rx_buf_size); 21351ef4c3a5SHarish Patil fp->rxq->rx_buf_size = rx_buf_size; 21361ef4c3a5SHarish Patil DP_INFO(edev, "buf_size adjusted to %u\n", rx_buf_size); 21371ef4c3a5SHarish Patil } 21381ef4c3a5SHarish Patil qede_dev_start(dev); 2139200645acSSony Chacko if (frame_size > ETHER_MAX_LEN) 2140200645acSSony Chacko dev->data->dev_conf.rxmode.jumbo_frame = 1; 2141200645acSSony Chacko else 2142200645acSSony Chacko dev->data->dev_conf.rxmode.jumbo_frame = 0; 2143200645acSSony Chacko /* update max frame size */ 2144200645acSSony Chacko dev->data->dev_conf.rxmode.max_rx_pkt_len = frame_size; 21451ef4c3a5SHarish Patil /* Reassign back */ 21461ef4c3a5SHarish Patil dev->rx_pkt_burst = qede_recv_pkts; 21471ef4c3a5SHarish Patil dev->tx_pkt_burst = qede_xmit_pkts; 2148200645acSSony Chacko 2149200645acSSony Chacko return 0; 2150200645acSSony Chacko } 2151200645acSSony Chacko 215252d94b57SHarish Patil static int 215352d94b57SHarish Patil qede_conf_udp_dst_port(struct rte_eth_dev *eth_dev, 215452d94b57SHarish Patil struct rte_eth_udp_tunnel *tunnel_udp, 215552d94b57SHarish Patil bool add) 215652d94b57SHarish Patil { 215752d94b57SHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 215852d94b57SHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 2159adce1f86SRasesh Mody struct ecore_tunnel_info tunn; /* @DPDK */ 216052d94b57SHarish Patil struct ecore_hwfn *p_hwfn; 216152d94b57SHarish Patil int rc, i; 216252d94b57SHarish Patil 216352d94b57SHarish Patil PMD_INIT_FUNC_TRACE(edev); 216452d94b57SHarish Patil 2165adce1f86SRasesh Mody memset(&tunn, 0, sizeof(tunn)); 216652d94b57SHarish Patil if (tunnel_udp->prot_type == RTE_TUNNEL_TYPE_VXLAN) { 21670b090fd3SRasesh Mody tunn.vxlan_port.b_update_port = true; 21680b090fd3SRasesh Mody tunn.vxlan_port.port = (add) ? tunnel_udp->udp_port : 216952d94b57SHarish Patil QEDE_VXLAN_DEF_PORT; 217052d94b57SHarish Patil for_each_hwfn(edev, i) { 217152d94b57SHarish Patil p_hwfn = &edev->hwfns[i]; 2172739a5b2fSRasesh Mody struct ecore_ptt *p_ptt = IS_PF(edev) ? 2173739a5b2fSRasesh Mody ecore_ptt_acquire(p_hwfn) : NULL; 2174739a5b2fSRasesh Mody rc = ecore_sp_pf_update_tunn_cfg(p_hwfn, p_ptt, &tunn, 217552d94b57SHarish Patil ECORE_SPQ_MODE_CB, NULL); 217652d94b57SHarish Patil if (rc != ECORE_SUCCESS) { 217752d94b57SHarish Patil DP_ERR(edev, "Unable to config UDP port %u\n", 21780b090fd3SRasesh Mody tunn.vxlan_port.port); 2179739a5b2fSRasesh Mody if (IS_PF(edev)) 2180739a5b2fSRasesh Mody ecore_ptt_release(p_hwfn, p_ptt); 218152d94b57SHarish Patil return rc; 218252d94b57SHarish Patil } 218352d94b57SHarish Patil } 218452d94b57SHarish Patil } 218552d94b57SHarish Patil 218652d94b57SHarish Patil return 0; 218752d94b57SHarish Patil } 218852d94b57SHarish Patil 2189af785e47SRasesh Mody static int 219052d94b57SHarish Patil qede_udp_dst_port_del(struct rte_eth_dev *eth_dev, 219152d94b57SHarish Patil struct rte_eth_udp_tunnel *tunnel_udp) 219252d94b57SHarish Patil { 219352d94b57SHarish Patil return qede_conf_udp_dst_port(eth_dev, tunnel_udp, false); 219452d94b57SHarish Patil } 219552d94b57SHarish Patil 2196af785e47SRasesh Mody static int 219752d94b57SHarish Patil qede_udp_dst_port_add(struct rte_eth_dev *eth_dev, 219852d94b57SHarish Patil struct rte_eth_udp_tunnel *tunnel_udp) 219952d94b57SHarish Patil { 220052d94b57SHarish Patil return qede_conf_udp_dst_port(eth_dev, tunnel_udp, true); 220152d94b57SHarish Patil } 220252d94b57SHarish Patil 220352d94b57SHarish Patil static void qede_get_ecore_tunn_params(uint32_t filter, uint32_t *type, 220452d94b57SHarish Patil uint32_t *clss, char *str) 220552d94b57SHarish Patil { 220652d94b57SHarish Patil uint16_t j; 220752d94b57SHarish Patil *clss = MAX_ECORE_TUNN_CLSS; 220852d94b57SHarish Patil 220952d94b57SHarish Patil for (j = 0; j < RTE_DIM(qede_tunn_types); j++) { 221052d94b57SHarish Patil if (filter == qede_tunn_types[j].rte_filter_type) { 221152d94b57SHarish Patil *type = qede_tunn_types[j].qede_type; 221252d94b57SHarish Patil *clss = qede_tunn_types[j].qede_tunn_clss; 221352d94b57SHarish Patil strcpy(str, qede_tunn_types[j].string); 221452d94b57SHarish Patil return; 221552d94b57SHarish Patil } 221652d94b57SHarish Patil } 221752d94b57SHarish Patil } 221852d94b57SHarish Patil 221952d94b57SHarish Patil static int 222052d94b57SHarish Patil qede_set_ucast_tunn_cmn_param(struct ecore_filter_ucast *ucast, 222152d94b57SHarish Patil const struct rte_eth_tunnel_filter_conf *conf, 222252d94b57SHarish Patil uint32_t type) 222352d94b57SHarish Patil { 222452d94b57SHarish Patil /* Init commmon ucast params first */ 222552d94b57SHarish Patil qede_set_ucast_cmn_params(ucast); 222652d94b57SHarish Patil 222752d94b57SHarish Patil /* Copy out the required fields based on classification type */ 222852d94b57SHarish Patil ucast->type = type; 222952d94b57SHarish Patil 223052d94b57SHarish Patil switch (type) { 223152d94b57SHarish Patil case ECORE_FILTER_VNI: 223252d94b57SHarish Patil ucast->vni = conf->tenant_id; 223352d94b57SHarish Patil break; 223452d94b57SHarish Patil case ECORE_FILTER_INNER_VLAN: 223552d94b57SHarish Patil ucast->vlan = conf->inner_vlan; 223652d94b57SHarish Patil break; 223752d94b57SHarish Patil case ECORE_FILTER_MAC: 223852d94b57SHarish Patil memcpy(ucast->mac, conf->outer_mac.addr_bytes, 223952d94b57SHarish Patil ETHER_ADDR_LEN); 224052d94b57SHarish Patil break; 224152d94b57SHarish Patil case ECORE_FILTER_INNER_MAC: 224252d94b57SHarish Patil memcpy(ucast->mac, conf->inner_mac.addr_bytes, 224352d94b57SHarish Patil ETHER_ADDR_LEN); 224452d94b57SHarish Patil break; 224552d94b57SHarish Patil case ECORE_FILTER_MAC_VNI_PAIR: 224652d94b57SHarish Patil memcpy(ucast->mac, conf->outer_mac.addr_bytes, 224752d94b57SHarish Patil ETHER_ADDR_LEN); 224852d94b57SHarish Patil ucast->vni = conf->tenant_id; 224952d94b57SHarish Patil break; 225052d94b57SHarish Patil case ECORE_FILTER_INNER_MAC_VNI_PAIR: 225152d94b57SHarish Patil memcpy(ucast->mac, conf->inner_mac.addr_bytes, 225252d94b57SHarish Patil ETHER_ADDR_LEN); 225352d94b57SHarish Patil ucast->vni = conf->tenant_id; 225452d94b57SHarish Patil break; 225552d94b57SHarish Patil case ECORE_FILTER_INNER_PAIR: 225652d94b57SHarish Patil memcpy(ucast->mac, conf->inner_mac.addr_bytes, 225752d94b57SHarish Patil ETHER_ADDR_LEN); 225852d94b57SHarish Patil ucast->vlan = conf->inner_vlan; 225952d94b57SHarish Patil break; 226052d94b57SHarish Patil default: 226152d94b57SHarish Patil return -EINVAL; 226252d94b57SHarish Patil } 226352d94b57SHarish Patil 226452d94b57SHarish Patil return ECORE_SUCCESS; 226552d94b57SHarish Patil } 226652d94b57SHarish Patil 226752d94b57SHarish Patil static int qede_vxlan_tunn_config(struct rte_eth_dev *eth_dev, 226852d94b57SHarish Patil enum rte_filter_op filter_op, 226952d94b57SHarish Patil const struct rte_eth_tunnel_filter_conf *conf) 227052d94b57SHarish Patil { 227152d94b57SHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 227252d94b57SHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 2273adce1f86SRasesh Mody struct ecore_tunnel_info tunn; 227452d94b57SHarish Patil struct ecore_hwfn *p_hwfn; 227552d94b57SHarish Patil enum ecore_filter_ucast_type type; 227652d94b57SHarish Patil enum ecore_tunn_clss clss; 227752d94b57SHarish Patil struct ecore_filter_ucast ucast; 227852d94b57SHarish Patil char str[80]; 227952d94b57SHarish Patil uint16_t filter_type; 228052d94b57SHarish Patil int rc, i; 228152d94b57SHarish Patil 2282e8fb98d6SRasesh Mody PMD_INIT_FUNC_TRACE(edev); 2283e8fb98d6SRasesh Mody 228452d94b57SHarish Patil filter_type = conf->filter_type | qdev->vxlan_filter_type; 228552d94b57SHarish Patil /* First determine if the given filter classification is supported */ 228652d94b57SHarish Patil qede_get_ecore_tunn_params(filter_type, &type, &clss, str); 228752d94b57SHarish Patil if (clss == MAX_ECORE_TUNN_CLSS) { 228852d94b57SHarish Patil DP_ERR(edev, "Wrong filter type\n"); 228952d94b57SHarish Patil return -EINVAL; 229052d94b57SHarish Patil } 229152d94b57SHarish Patil /* Init tunnel ucast params */ 229252d94b57SHarish Patil rc = qede_set_ucast_tunn_cmn_param(&ucast, conf, type); 229352d94b57SHarish Patil if (rc != ECORE_SUCCESS) { 229452d94b57SHarish Patil DP_ERR(edev, "Unsupported VxLAN filter type 0x%x\n", 229552d94b57SHarish Patil conf->filter_type); 229652d94b57SHarish Patil return rc; 229752d94b57SHarish Patil } 229852d94b57SHarish Patil DP_INFO(edev, "Rule: \"%s\", op %d, type 0x%x\n", 229952d94b57SHarish Patil str, filter_op, ucast.type); 230052d94b57SHarish Patil switch (filter_op) { 230152d94b57SHarish Patil case RTE_ETH_FILTER_ADD: 230252d94b57SHarish Patil ucast.opcode = ECORE_FILTER_ADD; 230352d94b57SHarish Patil 230452d94b57SHarish Patil /* Skip MAC/VLAN if filter is based on VNI */ 230552d94b57SHarish Patil if (!(filter_type & ETH_TUNNEL_FILTER_TENID)) { 230652d94b57SHarish Patil rc = qede_mac_int_ops(eth_dev, &ucast, 1); 230752d94b57SHarish Patil if (rc == 0) { 230852d94b57SHarish Patil /* Enable accept anyvlan */ 230952d94b57SHarish Patil qede_config_accept_any_vlan(qdev, true); 231052d94b57SHarish Patil } 231152d94b57SHarish Patil } else { 231252d94b57SHarish Patil rc = qede_ucast_filter(eth_dev, &ucast, 1); 231352d94b57SHarish Patil if (rc == 0) 231452d94b57SHarish Patil rc = ecore_filter_ucast_cmd(edev, &ucast, 231552d94b57SHarish Patil ECORE_SPQ_MODE_CB, NULL); 231652d94b57SHarish Patil } 231752d94b57SHarish Patil 231852d94b57SHarish Patil if (rc != ECORE_SUCCESS) 231952d94b57SHarish Patil return rc; 232052d94b57SHarish Patil 232152d94b57SHarish Patil qdev->vxlan_filter_type = filter_type; 232252d94b57SHarish Patil 232352d94b57SHarish Patil DP_INFO(edev, "Enabling VXLAN tunneling\n"); 23240b090fd3SRasesh Mody qede_set_cmn_tunn_param(&tunn, clss, true, true); 232552d94b57SHarish Patil for_each_hwfn(edev, i) { 232652d94b57SHarish Patil p_hwfn = &edev->hwfns[i]; 2327739a5b2fSRasesh Mody struct ecore_ptt *p_ptt = IS_PF(edev) ? 2328739a5b2fSRasesh Mody ecore_ptt_acquire(p_hwfn) : NULL; 2329739a5b2fSRasesh Mody rc = ecore_sp_pf_update_tunn_cfg(p_hwfn, p_ptt, 2330adce1f86SRasesh Mody &tunn, ECORE_SPQ_MODE_CB, NULL); 233152d94b57SHarish Patil if (rc != ECORE_SUCCESS) { 233252d94b57SHarish Patil DP_ERR(edev, "Failed to update tunn_clss %u\n", 23330b090fd3SRasesh Mody tunn.vxlan.tun_cls); 2334739a5b2fSRasesh Mody if (IS_PF(edev)) 2335739a5b2fSRasesh Mody ecore_ptt_release(p_hwfn, p_ptt); 233652d94b57SHarish Patil } 233752d94b57SHarish Patil } 233852d94b57SHarish Patil qdev->num_tunn_filters++; /* Filter added successfully */ 233952d94b57SHarish Patil break; 234052d94b57SHarish Patil case RTE_ETH_FILTER_DELETE: 234152d94b57SHarish Patil ucast.opcode = ECORE_FILTER_REMOVE; 234252d94b57SHarish Patil 234352d94b57SHarish Patil if (!(filter_type & ETH_TUNNEL_FILTER_TENID)) { 234452d94b57SHarish Patil rc = qede_mac_int_ops(eth_dev, &ucast, 0); 234552d94b57SHarish Patil } else { 234652d94b57SHarish Patil rc = qede_ucast_filter(eth_dev, &ucast, 0); 234752d94b57SHarish Patil if (rc == 0) 234852d94b57SHarish Patil rc = ecore_filter_ucast_cmd(edev, &ucast, 234952d94b57SHarish Patil ECORE_SPQ_MODE_CB, NULL); 235052d94b57SHarish Patil } 235152d94b57SHarish Patil if (rc != ECORE_SUCCESS) 235252d94b57SHarish Patil return rc; 235352d94b57SHarish Patil 235452d94b57SHarish Patil qdev->vxlan_filter_type = filter_type; 235552d94b57SHarish Patil qdev->num_tunn_filters--; 235652d94b57SHarish Patil 235752d94b57SHarish Patil /* Disable VXLAN if VXLAN filters become 0 */ 235852d94b57SHarish Patil if (qdev->num_tunn_filters == 0) { 235952d94b57SHarish Patil DP_INFO(edev, "Disabling VXLAN tunneling\n"); 236052d94b57SHarish Patil 236152d94b57SHarish Patil /* Use 0 as tunnel mode */ 23620b090fd3SRasesh Mody qede_set_cmn_tunn_param(&tunn, clss, false, true); 236352d94b57SHarish Patil for_each_hwfn(edev, i) { 236452d94b57SHarish Patil p_hwfn = &edev->hwfns[i]; 2365739a5b2fSRasesh Mody struct ecore_ptt *p_ptt = IS_PF(edev) ? 2366739a5b2fSRasesh Mody ecore_ptt_acquire(p_hwfn) : NULL; 2367739a5b2fSRasesh Mody rc = ecore_sp_pf_update_tunn_cfg(p_hwfn, p_ptt, 2368739a5b2fSRasesh Mody &tunn, ECORE_SPQ_MODE_CB, NULL); 236952d94b57SHarish Patil if (rc != ECORE_SUCCESS) { 237052d94b57SHarish Patil DP_ERR(edev, 237152d94b57SHarish Patil "Failed to update tunn_clss %u\n", 23720b090fd3SRasesh Mody tunn.vxlan.tun_cls); 2373739a5b2fSRasesh Mody if (IS_PF(edev)) 2374739a5b2fSRasesh Mody ecore_ptt_release(p_hwfn, 2375739a5b2fSRasesh Mody p_ptt); 237652d94b57SHarish Patil break; 237752d94b57SHarish Patil } 237852d94b57SHarish Patil } 237952d94b57SHarish Patil } 238052d94b57SHarish Patil break; 238152d94b57SHarish Patil default: 238252d94b57SHarish Patil DP_ERR(edev, "Unsupported operation %d\n", filter_op); 238352d94b57SHarish Patil return -EINVAL; 238452d94b57SHarish Patil } 238552d94b57SHarish Patil DP_INFO(edev, "Current VXLAN filters %d\n", qdev->num_tunn_filters); 238652d94b57SHarish Patil 238752d94b57SHarish Patil return 0; 238852d94b57SHarish Patil } 238952d94b57SHarish Patil 239052d94b57SHarish Patil int qede_dev_filter_ctrl(struct rte_eth_dev *eth_dev, 239152d94b57SHarish Patil enum rte_filter_type filter_type, 239252d94b57SHarish Patil enum rte_filter_op filter_op, 239352d94b57SHarish Patil void *arg) 239452d94b57SHarish Patil { 239552d94b57SHarish Patil struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev); 239652d94b57SHarish Patil struct ecore_dev *edev = QEDE_INIT_EDEV(qdev); 239752d94b57SHarish Patil struct rte_eth_tunnel_filter_conf *filter_conf = 239852d94b57SHarish Patil (struct rte_eth_tunnel_filter_conf *)arg; 239952d94b57SHarish Patil 240052d94b57SHarish Patil switch (filter_type) { 240152d94b57SHarish Patil case RTE_ETH_FILTER_TUNNEL: 240252d94b57SHarish Patil switch (filter_conf->tunnel_type) { 240352d94b57SHarish Patil case RTE_TUNNEL_TYPE_VXLAN: 240452d94b57SHarish Patil DP_INFO(edev, 240552d94b57SHarish Patil "Packet steering to the specified Rx queue" 240652d94b57SHarish Patil " is not supported with VXLAN tunneling"); 240752d94b57SHarish Patil return(qede_vxlan_tunn_config(eth_dev, filter_op, 240852d94b57SHarish Patil filter_conf)); 240952d94b57SHarish Patil /* Place holders for future tunneling support */ 241052d94b57SHarish Patil case RTE_TUNNEL_TYPE_GENEVE: 241152d94b57SHarish Patil case RTE_TUNNEL_TYPE_TEREDO: 241252d94b57SHarish Patil case RTE_TUNNEL_TYPE_NVGRE: 241352d94b57SHarish Patil case RTE_TUNNEL_TYPE_IP_IN_GRE: 241452d94b57SHarish Patil case RTE_L2_TUNNEL_TYPE_E_TAG: 241552d94b57SHarish Patil DP_ERR(edev, "Unsupported tunnel type %d\n", 241652d94b57SHarish Patil filter_conf->tunnel_type); 241752d94b57SHarish Patil return -EINVAL; 241852d94b57SHarish Patil case RTE_TUNNEL_TYPE_NONE: 241952d94b57SHarish Patil default: 242052d94b57SHarish Patil return 0; 242152d94b57SHarish Patil } 242252d94b57SHarish Patil break; 242352d94b57SHarish Patil case RTE_ETH_FILTER_FDIR: 242462207535SHarish Patil return qede_fdir_filter_conf(eth_dev, filter_op, arg); 242562207535SHarish Patil case RTE_ETH_FILTER_NTUPLE: 242662207535SHarish Patil return qede_ntuple_filter_conf(eth_dev, filter_op, arg); 242752d94b57SHarish Patil case RTE_ETH_FILTER_MACVLAN: 242852d94b57SHarish Patil case RTE_ETH_FILTER_ETHERTYPE: 242952d94b57SHarish Patil case RTE_ETH_FILTER_FLEXIBLE: 243052d94b57SHarish Patil case RTE_ETH_FILTER_SYN: 243152d94b57SHarish Patil case RTE_ETH_FILTER_HASH: 243252d94b57SHarish Patil case RTE_ETH_FILTER_L2_TUNNEL: 243352d94b57SHarish Patil case RTE_ETH_FILTER_MAX: 243452d94b57SHarish Patil default: 243552d94b57SHarish Patil DP_ERR(edev, "Unsupported filter type %d\n", 243652d94b57SHarish Patil filter_type); 243752d94b57SHarish Patil return -EINVAL; 243852d94b57SHarish Patil } 243952d94b57SHarish Patil 244052d94b57SHarish Patil return 0; 244152d94b57SHarish Patil } 244252d94b57SHarish Patil 24432ea6f76aSRasesh Mody static const struct eth_dev_ops qede_eth_dev_ops = { 24442ea6f76aSRasesh Mody .dev_configure = qede_dev_configure, 24452ea6f76aSRasesh Mody .dev_infos_get = qede_dev_info_get, 24462ea6f76aSRasesh Mody .rx_queue_setup = qede_rx_queue_setup, 24472ea6f76aSRasesh Mody .rx_queue_release = qede_rx_queue_release, 24482ea6f76aSRasesh Mody .tx_queue_setup = qede_tx_queue_setup, 24492ea6f76aSRasesh Mody .tx_queue_release = qede_tx_queue_release, 24502ea6f76aSRasesh Mody .dev_start = qede_dev_start, 24512ea6f76aSRasesh Mody .dev_set_link_up = qede_dev_set_link_up, 24522ea6f76aSRasesh Mody .dev_set_link_down = qede_dev_set_link_down, 24532ea6f76aSRasesh Mody .link_update = qede_link_update, 24542ea6f76aSRasesh Mody .promiscuous_enable = qede_promiscuous_enable, 24552ea6f76aSRasesh Mody .promiscuous_disable = qede_promiscuous_disable, 24562ea6f76aSRasesh Mody .allmulticast_enable = qede_allmulticast_enable, 24572ea6f76aSRasesh Mody .allmulticast_disable = qede_allmulticast_disable, 24582ea6f76aSRasesh Mody .dev_stop = qede_dev_stop, 24592ea6f76aSRasesh Mody .dev_close = qede_dev_close, 24602ea6f76aSRasesh Mody .stats_get = qede_get_stats, 24615cdd769aSRasesh Mody .stats_reset = qede_reset_stats, 2462d1216e22SRasesh Mody .xstats_get = qede_get_xstats, 2463d1216e22SRasesh Mody .xstats_reset = qede_reset_xstats, 2464d1216e22SRasesh Mody .xstats_get_names = qede_get_xstats_names, 24652ea6f76aSRasesh Mody .mac_addr_add = qede_mac_addr_add, 24662ea6f76aSRasesh Mody .mac_addr_remove = qede_mac_addr_remove, 24672ea6f76aSRasesh Mody .mac_addr_set = qede_mac_addr_set, 24682ea6f76aSRasesh Mody .vlan_offload_set = qede_vlan_offload_set, 24692ea6f76aSRasesh Mody .vlan_filter_set = qede_vlan_filter_set, 24702ea6f76aSRasesh Mody .flow_ctrl_set = qede_flow_ctrl_set, 24712ea6f76aSRasesh Mody .flow_ctrl_get = qede_flow_ctrl_get, 24722ea6f76aSRasesh Mody .dev_supported_ptypes_get = qede_dev_supported_ptypes_get, 24734c98f276SSony Chacko .rss_hash_update = qede_rss_hash_update, 24746d9e26c4SSony Chacko .rss_hash_conf_get = qede_rss_hash_conf_get, 2475e8876556SSony Chacko .reta_update = qede_rss_reta_update, 24763dadf73eSSony Chacko .reta_query = qede_rss_reta_query, 2477200645acSSony Chacko .mtu_set = qede_set_mtu, 247852d94b57SHarish Patil .filter_ctrl = qede_dev_filter_ctrl, 247952d94b57SHarish Patil .udp_tunnel_port_add = qede_udp_dst_port_add, 248052d94b57SHarish Patil .udp_tunnel_port_del = qede_udp_dst_port_del, 24812ea6f76aSRasesh Mody }; 24822ea6f76aSRasesh Mody 248386a2265eSRasesh Mody static const struct eth_dev_ops qede_eth_vf_dev_ops = { 248486a2265eSRasesh Mody .dev_configure = qede_dev_configure, 248586a2265eSRasesh Mody .dev_infos_get = qede_dev_info_get, 248686a2265eSRasesh Mody .rx_queue_setup = qede_rx_queue_setup, 248786a2265eSRasesh Mody .rx_queue_release = qede_rx_queue_release, 248886a2265eSRasesh Mody .tx_queue_setup = qede_tx_queue_setup, 248986a2265eSRasesh Mody .tx_queue_release = qede_tx_queue_release, 249086a2265eSRasesh Mody .dev_start = qede_dev_start, 249186a2265eSRasesh Mody .dev_set_link_up = qede_dev_set_link_up, 249286a2265eSRasesh Mody .dev_set_link_down = qede_dev_set_link_down, 249386a2265eSRasesh Mody .link_update = qede_link_update, 249486a2265eSRasesh Mody .promiscuous_enable = qede_promiscuous_enable, 249586a2265eSRasesh Mody .promiscuous_disable = qede_promiscuous_disable, 249686a2265eSRasesh Mody .allmulticast_enable = qede_allmulticast_enable, 249786a2265eSRasesh Mody .allmulticast_disable = qede_allmulticast_disable, 249886a2265eSRasesh Mody .dev_stop = qede_dev_stop, 249986a2265eSRasesh Mody .dev_close = qede_dev_close, 250086a2265eSRasesh Mody .stats_get = qede_get_stats, 250186a2265eSRasesh Mody .stats_reset = qede_reset_stats, 2502d1216e22SRasesh Mody .xstats_get = qede_get_xstats, 2503d1216e22SRasesh Mody .xstats_reset = qede_reset_xstats, 2504d1216e22SRasesh Mody .xstats_get_names = qede_get_xstats_names, 250586a2265eSRasesh Mody .vlan_offload_set = qede_vlan_offload_set, 250686a2265eSRasesh Mody .vlan_filter_set = qede_vlan_filter_set, 250786a2265eSRasesh Mody .dev_supported_ptypes_get = qede_dev_supported_ptypes_get, 25084c98f276SSony Chacko .rss_hash_update = qede_rss_hash_update, 25096d9e26c4SSony Chacko .rss_hash_conf_get = qede_rss_hash_conf_get, 2510e8876556SSony Chacko .reta_update = qede_rss_reta_update, 25113dadf73eSSony Chacko .reta_query = qede_rss_reta_query, 2512200645acSSony Chacko .mtu_set = qede_set_mtu, 251386a2265eSRasesh Mody }; 251486a2265eSRasesh Mody 25152ea6f76aSRasesh Mody static void qede_update_pf_params(struct ecore_dev *edev) 25162ea6f76aSRasesh Mody { 25172ea6f76aSRasesh Mody struct ecore_pf_params pf_params; 2518528fcfabSHarish Patil 25192ea6f76aSRasesh Mody memset(&pf_params, 0, sizeof(struct ecore_pf_params)); 2520528fcfabSHarish Patil pf_params.eth_pf_params.num_cons = QEDE_PF_NUM_CONNS; 252162207535SHarish Patil pf_params.eth_pf_params.num_arfs_filters = QEDE_RFS_MAX_FLTR; 25222ea6f76aSRasesh Mody qed_ops->common->update_pf_params(edev, &pf_params); 25232ea6f76aSRasesh Mody } 25242ea6f76aSRasesh Mody 25252ea6f76aSRasesh Mody static int qede_common_dev_init(struct rte_eth_dev *eth_dev, bool is_vf) 25262ea6f76aSRasesh Mody { 25272ea6f76aSRasesh Mody struct rte_pci_device *pci_dev; 25282ea6f76aSRasesh Mody struct rte_pci_addr pci_addr; 25292ea6f76aSRasesh Mody struct qede_dev *adapter; 25302ea6f76aSRasesh Mody struct ecore_dev *edev; 25312ea6f76aSRasesh Mody struct qed_dev_eth_info dev_info; 25322ea6f76aSRasesh Mody struct qed_slowpath_params params; 25332ea6f76aSRasesh Mody static bool do_once = true; 25342ea6f76aSRasesh Mody uint8_t bulletin_change; 25352ea6f76aSRasesh Mody uint8_t vf_mac[ETHER_ADDR_LEN]; 25362ea6f76aSRasesh Mody uint8_t is_mac_forced; 25372ea6f76aSRasesh Mody bool is_mac_exist; 25382ea6f76aSRasesh Mody /* Fix up ecore debug level */ 25392ea6f76aSRasesh Mody uint32_t dp_module = ~0 & ~ECORE_MSG_HW; 25402ea6f76aSRasesh Mody uint8_t dp_level = ECORE_LEVEL_VERBOSE; 25412ea6f76aSRasesh Mody int rc; 25422ea6f76aSRasesh Mody 25432ea6f76aSRasesh Mody /* Extract key data structures */ 25442ea6f76aSRasesh Mody adapter = eth_dev->data->dev_private; 25452ea6f76aSRasesh Mody edev = &adapter->edev; 2546c0802544SFerruh Yigit pci_dev = RTE_ETH_DEV_TO_PCI(eth_dev); 2547d4b7f673SJan Blunck pci_addr = pci_dev->addr; 25482ea6f76aSRasesh Mody 25492ea6f76aSRasesh Mody PMD_INIT_FUNC_TRACE(edev); 25502ea6f76aSRasesh Mody 25512ea6f76aSRasesh Mody snprintf(edev->name, NAME_SIZE, PCI_SHORT_PRI_FMT ":dpdk-port-%u", 25522ea6f76aSRasesh Mody pci_addr.bus, pci_addr.devid, pci_addr.function, 25532ea6f76aSRasesh Mody eth_dev->data->port_id); 25542ea6f76aSRasesh Mody 25552ea6f76aSRasesh Mody eth_dev->rx_pkt_burst = qede_recv_pkts; 25562ea6f76aSRasesh Mody eth_dev->tx_pkt_burst = qede_xmit_pkts; 255729540be7SHarish Patil eth_dev->tx_pkt_prepare = qede_xmit_prep_pkts; 25582ea6f76aSRasesh Mody 25592ea6f76aSRasesh Mody if (rte_eal_process_type() != RTE_PROC_PRIMARY) { 25604ffa2af9SRasesh Mody DP_ERR(edev, "Skipping device init from secondary process\n"); 25612ea6f76aSRasesh Mody return 0; 25622ea6f76aSRasesh Mody } 25632ea6f76aSRasesh Mody 25642ea6f76aSRasesh Mody rte_eth_copy_pci_info(eth_dev, pci_dev); 25652ea6f76aSRasesh Mody 2566fb58ad9eSRasesh Mody /* @DPDK */ 2567fb58ad9eSRasesh Mody edev->vendor_id = pci_dev->id.vendor_id; 2568fb58ad9eSRasesh Mody edev->device_id = pci_dev->id.device_id; 2569fb58ad9eSRasesh Mody 25705cdd769aSRasesh Mody qed_ops = qed_get_eth_ops(); 25715cdd769aSRasesh Mody if (!qed_ops) { 25725cdd769aSRasesh Mody DP_ERR(edev, "Failed to get qed_eth_ops_pass\n"); 25735cdd769aSRasesh Mody return -EINVAL; 25745cdd769aSRasesh Mody } 25755cdd769aSRasesh Mody 25762ea6f76aSRasesh Mody DP_INFO(edev, "Starting qede probe\n"); 25774c4bdadfSHarish Patil rc = qed_ops->common->probe(edev, pci_dev, dp_module, 25784c4bdadfSHarish Patil dp_level, is_vf); 25792ea6f76aSRasesh Mody if (rc != 0) { 25802ea6f76aSRasesh Mody DP_ERR(edev, "qede probe failed rc %d\n", rc); 25812ea6f76aSRasesh Mody return -ENODEV; 25822ea6f76aSRasesh Mody } 25832ea6f76aSRasesh Mody qede_update_pf_params(edev); 2584d4b7f673SJan Blunck rte_intr_callback_register(&pci_dev->intr_handle, 25852ea6f76aSRasesh Mody qede_interrupt_handler, (void *)eth_dev); 2586d4b7f673SJan Blunck if (rte_intr_enable(&pci_dev->intr_handle)) { 25872ea6f76aSRasesh Mody DP_ERR(edev, "rte_intr_enable() failed\n"); 25882ea6f76aSRasesh Mody return -ENODEV; 25892ea6f76aSRasesh Mody } 25902ea6f76aSRasesh Mody 25912ea6f76aSRasesh Mody /* Start the Slowpath-process */ 25922ea6f76aSRasesh Mody memset(¶ms, 0, sizeof(struct qed_slowpath_params)); 25932ea6f76aSRasesh Mody params.int_mode = ECORE_INT_MODE_MSIX; 25947eca78ceSHarish Patil params.drv_major = QEDE_PMD_VERSION_MAJOR; 25957eca78ceSHarish Patil params.drv_minor = QEDE_PMD_VERSION_MINOR; 25967eca78ceSHarish Patil params.drv_rev = QEDE_PMD_VERSION_REVISION; 25977eca78ceSHarish Patil params.drv_eng = QEDE_PMD_VERSION_PATCH; 25987eca78ceSHarish Patil strncpy((char *)params.name, QEDE_PMD_VER_PREFIX, 25997eca78ceSHarish Patil QEDE_PMD_DRV_VER_STR_SIZE); 26002ea6f76aSRasesh Mody 26012af14ca7SHarish Patil /* For CMT mode device do periodic polling for slowpath events. 26022af14ca7SHarish Patil * This is required since uio device uses only one MSI-x 26032af14ca7SHarish Patil * interrupt vector but we need one for each engine. 26042af14ca7SHarish Patil */ 2605c0845c33SRasesh Mody if (ECORE_IS_CMT(edev) && IS_PF(edev)) { 26062af14ca7SHarish Patil rc = rte_eal_alarm_set(timer_period * US_PER_S, 26072af14ca7SHarish Patil qede_poll_sp_sb_cb, 26082af14ca7SHarish Patil (void *)eth_dev); 26092af14ca7SHarish Patil if (rc != 0) { 26102af14ca7SHarish Patil DP_ERR(edev, "Unable to start periodic" 26112af14ca7SHarish Patil " timer rc %d\n", rc); 26122af14ca7SHarish Patil return -EINVAL; 26132af14ca7SHarish Patil } 26142af14ca7SHarish Patil } 26152af14ca7SHarish Patil 26162ea6f76aSRasesh Mody rc = qed_ops->common->slowpath_start(edev, ¶ms); 26172ea6f76aSRasesh Mody if (rc) { 26182ea6f76aSRasesh Mody DP_ERR(edev, "Cannot start slowpath rc = %d\n", rc); 26192af14ca7SHarish Patil rte_eal_alarm_cancel(qede_poll_sp_sb_cb, 26202af14ca7SHarish Patil (void *)eth_dev); 26212ea6f76aSRasesh Mody return -ENODEV; 26222ea6f76aSRasesh Mody } 26232ea6f76aSRasesh Mody 26242ea6f76aSRasesh Mody rc = qed_ops->fill_dev_info(edev, &dev_info); 26252ea6f76aSRasesh Mody if (rc) { 26262ea6f76aSRasesh Mody DP_ERR(edev, "Cannot get device_info rc %d\n", rc); 26272ea6f76aSRasesh Mody qed_ops->common->slowpath_stop(edev); 26282ea6f76aSRasesh Mody qed_ops->common->remove(edev); 26292af14ca7SHarish Patil rte_eal_alarm_cancel(qede_poll_sp_sb_cb, 26302af14ca7SHarish Patil (void *)eth_dev); 26312ea6f76aSRasesh Mody return -ENODEV; 26322ea6f76aSRasesh Mody } 26332ea6f76aSRasesh Mody 26342ea6f76aSRasesh Mody qede_alloc_etherdev(adapter, &dev_info); 26352ea6f76aSRasesh Mody 2636de5588afSRasesh Mody adapter->ops->common->set_name(edev, edev->name); 26372ea6f76aSRasesh Mody 26382ea6f76aSRasesh Mody if (!is_vf) 26393320ca8cSRasesh Mody adapter->dev_info.num_mac_filters = 26402ea6f76aSRasesh Mody (uint32_t)RESC_NUM(ECORE_LEADING_HWFN(edev), 26412ea6f76aSRasesh Mody ECORE_MAC); 26422ea6f76aSRasesh Mody else 264386a2265eSRasesh Mody ecore_vf_get_num_mac_filters(ECORE_LEADING_HWFN(edev), 26443320ca8cSRasesh Mody (uint32_t *)&adapter->dev_info.num_mac_filters); 26452ea6f76aSRasesh Mody 26462ea6f76aSRasesh Mody /* Allocate memory for storing MAC addr */ 26472ea6f76aSRasesh Mody eth_dev->data->mac_addrs = rte_zmalloc(edev->name, 26482ea6f76aSRasesh Mody (ETHER_ADDR_LEN * 26493320ca8cSRasesh Mody adapter->dev_info.num_mac_filters), 26502ea6f76aSRasesh Mody RTE_CACHE_LINE_SIZE); 26512ea6f76aSRasesh Mody 26522ea6f76aSRasesh Mody if (eth_dev->data->mac_addrs == NULL) { 26532ea6f76aSRasesh Mody DP_ERR(edev, "Failed to allocate MAC address\n"); 26542ea6f76aSRasesh Mody qed_ops->common->slowpath_stop(edev); 26552ea6f76aSRasesh Mody qed_ops->common->remove(edev); 26562af14ca7SHarish Patil rte_eal_alarm_cancel(qede_poll_sp_sb_cb, 26572af14ca7SHarish Patil (void *)eth_dev); 26582ea6f76aSRasesh Mody return -ENOMEM; 26592ea6f76aSRasesh Mody } 26602ea6f76aSRasesh Mody 266186a2265eSRasesh Mody if (!is_vf) { 26622ea6f76aSRasesh Mody ether_addr_copy((struct ether_addr *)edev->hwfns[0]. 26632ea6f76aSRasesh Mody hw_info.hw_mac_addr, 26642ea6f76aSRasesh Mody ð_dev->data->mac_addrs[0]); 266586a2265eSRasesh Mody ether_addr_copy(ð_dev->data->mac_addrs[0], 266686a2265eSRasesh Mody &adapter->primary_mac); 266786a2265eSRasesh Mody } else { 266886a2265eSRasesh Mody ecore_vf_read_bulletin(ECORE_LEADING_HWFN(edev), 266986a2265eSRasesh Mody &bulletin_change); 267086a2265eSRasesh Mody if (bulletin_change) { 267186a2265eSRasesh Mody is_mac_exist = 267286a2265eSRasesh Mody ecore_vf_bulletin_get_forced_mac( 267386a2265eSRasesh Mody ECORE_LEADING_HWFN(edev), 267486a2265eSRasesh Mody vf_mac, 267586a2265eSRasesh Mody &is_mac_forced); 267686a2265eSRasesh Mody if (is_mac_exist && is_mac_forced) { 267786a2265eSRasesh Mody DP_INFO(edev, "VF macaddr received from PF\n"); 267886a2265eSRasesh Mody ether_addr_copy((struct ether_addr *)&vf_mac, 267986a2265eSRasesh Mody ð_dev->data->mac_addrs[0]); 268086a2265eSRasesh Mody ether_addr_copy(ð_dev->data->mac_addrs[0], 268186a2265eSRasesh Mody &adapter->primary_mac); 268286a2265eSRasesh Mody } else { 26834ffa2af9SRasesh Mody DP_ERR(edev, "No VF macaddr assigned\n"); 268486a2265eSRasesh Mody } 268586a2265eSRasesh Mody } 268686a2265eSRasesh Mody } 26872ea6f76aSRasesh Mody 268886a2265eSRasesh Mody eth_dev->dev_ops = (is_vf) ? &qede_eth_vf_dev_ops : &qede_eth_dev_ops; 26892ea6f76aSRasesh Mody 26902ea6f76aSRasesh Mody if (do_once) { 2691af785e47SRasesh Mody #ifdef RTE_LIBRTE_QEDE_DEBUG_INFO 26922ea6f76aSRasesh Mody qede_print_adapter_info(adapter); 2693af785e47SRasesh Mody #endif 26942ea6f76aSRasesh Mody do_once = false; 26952ea6f76aSRasesh Mody } 26962ea6f76aSRasesh Mody 26974c4bdadfSHarish Patil adapter->num_tx_queues = 0; 26984c4bdadfSHarish Patil adapter->num_rx_queues = 0; 26994c4bdadfSHarish Patil SLIST_INIT(&adapter->fdir_info.fdir_list_head); 27004c4bdadfSHarish Patil SLIST_INIT(&adapter->vlan_list_head); 27014c4bdadfSHarish Patil SLIST_INIT(&adapter->uc_list_head); 27029a6d30aeSHarish Patil adapter->mtu = ETHER_MTU; 27039a6d30aeSHarish Patil adapter->new_mtu = ETHER_MTU; 27049a6d30aeSHarish Patil if (!is_vf) 27059a6d30aeSHarish Patil if (qede_start_vport(adapter, adapter->mtu)) 27069a6d30aeSHarish Patil return -1; 2707dbac54c2SHarish Patil 27084ffa2af9SRasesh Mody DP_INFO(edev, "MAC address : %02x:%02x:%02x:%02x:%02x:%02x\n", 27092ea6f76aSRasesh Mody adapter->primary_mac.addr_bytes[0], 27102ea6f76aSRasesh Mody adapter->primary_mac.addr_bytes[1], 27112ea6f76aSRasesh Mody adapter->primary_mac.addr_bytes[2], 27122ea6f76aSRasesh Mody adapter->primary_mac.addr_bytes[3], 27132ea6f76aSRasesh Mody adapter->primary_mac.addr_bytes[4], 27142ea6f76aSRasesh Mody adapter->primary_mac.addr_bytes[5]); 27152ea6f76aSRasesh Mody 27164c4bdadfSHarish Patil DP_INFO(edev, "Device initialized\n"); 27174c4bdadfSHarish Patil 27184c4bdadfSHarish Patil return 0; 27192ea6f76aSRasesh Mody } 27202ea6f76aSRasesh Mody 27212ea6f76aSRasesh Mody static int qedevf_eth_dev_init(struct rte_eth_dev *eth_dev) 27222ea6f76aSRasesh Mody { 27232ea6f76aSRasesh Mody return qede_common_dev_init(eth_dev, 1); 27242ea6f76aSRasesh Mody } 27252ea6f76aSRasesh Mody 27262ea6f76aSRasesh Mody static int qede_eth_dev_init(struct rte_eth_dev *eth_dev) 27272ea6f76aSRasesh Mody { 27282ea6f76aSRasesh Mody return qede_common_dev_init(eth_dev, 0); 27292ea6f76aSRasesh Mody } 27302ea6f76aSRasesh Mody 27312ea6f76aSRasesh Mody static int qede_dev_common_uninit(struct rte_eth_dev *eth_dev) 27322ea6f76aSRasesh Mody { 2733e8fb98d6SRasesh Mody #ifdef RTE_LIBRTE_QEDE_DEBUG_INIT 2734e8fb98d6SRasesh Mody struct qede_dev *qdev = eth_dev->data->dev_private; 2735e8fb98d6SRasesh Mody struct ecore_dev *edev = &qdev->edev; 2736e8fb98d6SRasesh Mody 2737e8fb98d6SRasesh Mody PMD_INIT_FUNC_TRACE(edev); 2738e8fb98d6SRasesh Mody #endif 2739e8fb98d6SRasesh Mody 27402ea6f76aSRasesh Mody /* only uninitialize in the primary process */ 27412ea6f76aSRasesh Mody if (rte_eal_process_type() != RTE_PROC_PRIMARY) 27422ea6f76aSRasesh Mody return 0; 27432ea6f76aSRasesh Mody 27442ea6f76aSRasesh Mody /* safe to close dev here */ 27452ea6f76aSRasesh Mody qede_dev_close(eth_dev); 27462ea6f76aSRasesh Mody 27472ea6f76aSRasesh Mody eth_dev->dev_ops = NULL; 27482ea6f76aSRasesh Mody eth_dev->rx_pkt_burst = NULL; 27492ea6f76aSRasesh Mody eth_dev->tx_pkt_burst = NULL; 27502ea6f76aSRasesh Mody 27512ea6f76aSRasesh Mody if (eth_dev->data->mac_addrs) 27522ea6f76aSRasesh Mody rte_free(eth_dev->data->mac_addrs); 27532ea6f76aSRasesh Mody 27542ea6f76aSRasesh Mody eth_dev->data->mac_addrs = NULL; 27552ea6f76aSRasesh Mody 27562ea6f76aSRasesh Mody return 0; 27572ea6f76aSRasesh Mody } 27582ea6f76aSRasesh Mody 27592ea6f76aSRasesh Mody static int qede_eth_dev_uninit(struct rte_eth_dev *eth_dev) 27602ea6f76aSRasesh Mody { 27612ea6f76aSRasesh Mody return qede_dev_common_uninit(eth_dev); 27622ea6f76aSRasesh Mody } 27632ea6f76aSRasesh Mody 27642ea6f76aSRasesh Mody static int qedevf_eth_dev_uninit(struct rte_eth_dev *eth_dev) 27652ea6f76aSRasesh Mody { 27662ea6f76aSRasesh Mody return qede_dev_common_uninit(eth_dev); 27672ea6f76aSRasesh Mody } 27682ea6f76aSRasesh Mody 276928a1fd4fSFerruh Yigit static const struct rte_pci_id pci_id_qedevf_map[] = { 27702ea6f76aSRasesh Mody #define QEDEVF_RTE_PCI_DEVICE(dev) RTE_PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, dev) 27712ea6f76aSRasesh Mody { 277277f72221SRasesh Mody QEDEVF_RTE_PCI_DEVICE(PCI_DEVICE_ID_QLOGIC_NX2_VF) 27732ea6f76aSRasesh Mody }, 27742ea6f76aSRasesh Mody { 277577f72221SRasesh Mody QEDEVF_RTE_PCI_DEVICE(PCI_DEVICE_ID_QLOGIC_57980S_IOV) 277677f72221SRasesh Mody }, 277777f72221SRasesh Mody { 277877f72221SRasesh Mody QEDEVF_RTE_PCI_DEVICE(PCI_DEVICE_ID_QLOGIC_AH_IOV) 27792ea6f76aSRasesh Mody }, 27802ea6f76aSRasesh Mody {.vendor_id = 0,} 27812ea6f76aSRasesh Mody }; 27822ea6f76aSRasesh Mody 278328a1fd4fSFerruh Yigit static const struct rte_pci_id pci_id_qede_map[] = { 27842ea6f76aSRasesh Mody #define QEDE_RTE_PCI_DEVICE(dev) RTE_PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, dev) 27852ea6f76aSRasesh Mody { 278677f72221SRasesh Mody QEDE_RTE_PCI_DEVICE(PCI_DEVICE_ID_QLOGIC_NX2_57980E) 27872ea6f76aSRasesh Mody }, 27882ea6f76aSRasesh Mody { 278977f72221SRasesh Mody QEDE_RTE_PCI_DEVICE(PCI_DEVICE_ID_QLOGIC_NX2_57980S) 27902ea6f76aSRasesh Mody }, 27912ea6f76aSRasesh Mody { 279277f72221SRasesh Mody QEDE_RTE_PCI_DEVICE(PCI_DEVICE_ID_QLOGIC_57980S_40) 27932ea6f76aSRasesh Mody }, 27942ea6f76aSRasesh Mody { 279577f72221SRasesh Mody QEDE_RTE_PCI_DEVICE(PCI_DEVICE_ID_QLOGIC_57980S_25) 27962ea6f76aSRasesh Mody }, 27972af14ca7SHarish Patil { 279877f72221SRasesh Mody QEDE_RTE_PCI_DEVICE(PCI_DEVICE_ID_QLOGIC_57980S_100) 279977f72221SRasesh Mody }, 280077f72221SRasesh Mody { 2801e6512107SRasesh Mody QEDE_RTE_PCI_DEVICE(PCI_DEVICE_ID_QLOGIC_57980S_50) 2802e6512107SRasesh Mody }, 2803e6512107SRasesh Mody { 280477f72221SRasesh Mody QEDE_RTE_PCI_DEVICE(PCI_DEVICE_ID_QLOGIC_AH_50G) 280577f72221SRasesh Mody }, 280677f72221SRasesh Mody { 280777f72221SRasesh Mody QEDE_RTE_PCI_DEVICE(PCI_DEVICE_ID_QLOGIC_AH_10G) 280877f72221SRasesh Mody }, 280977f72221SRasesh Mody { 281077f72221SRasesh Mody QEDE_RTE_PCI_DEVICE(PCI_DEVICE_ID_QLOGIC_AH_40G) 281177f72221SRasesh Mody }, 281277f72221SRasesh Mody { 281377f72221SRasesh Mody QEDE_RTE_PCI_DEVICE(PCI_DEVICE_ID_QLOGIC_AH_25G) 28142af14ca7SHarish Patil }, 28152ea6f76aSRasesh Mody {.vendor_id = 0,} 28162ea6f76aSRasesh Mody }; 28172ea6f76aSRasesh Mody 2818fdf91e0fSJan Blunck static int qedevf_eth_dev_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, 2819fdf91e0fSJan Blunck struct rte_pci_device *pci_dev) 2820fdf91e0fSJan Blunck { 2821fdf91e0fSJan Blunck return rte_eth_dev_pci_generic_probe(pci_dev, 2822fdf91e0fSJan Blunck sizeof(struct qede_dev), qedevf_eth_dev_init); 2823fdf91e0fSJan Blunck } 2824fdf91e0fSJan Blunck 2825fdf91e0fSJan Blunck static int qedevf_eth_dev_pci_remove(struct rte_pci_device *pci_dev) 2826fdf91e0fSJan Blunck { 2827fdf91e0fSJan Blunck return rte_eth_dev_pci_generic_remove(pci_dev, qedevf_eth_dev_uninit); 2828fdf91e0fSJan Blunck } 2829fdf91e0fSJan Blunck 2830fdf91e0fSJan Blunck static struct rte_pci_driver rte_qedevf_pmd = { 28312ea6f76aSRasesh Mody .id_table = pci_id_qedevf_map, 2832fdf91e0fSJan Blunck .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC, 2833fdf91e0fSJan Blunck .probe = qedevf_eth_dev_pci_probe, 2834fdf91e0fSJan Blunck .remove = qedevf_eth_dev_pci_remove, 28352ea6f76aSRasesh Mody }; 28362ea6f76aSRasesh Mody 2837fdf91e0fSJan Blunck static int qede_eth_dev_pci_probe(struct rte_pci_driver *pci_drv __rte_unused, 2838fdf91e0fSJan Blunck struct rte_pci_device *pci_dev) 2839fdf91e0fSJan Blunck { 2840fdf91e0fSJan Blunck return rte_eth_dev_pci_generic_probe(pci_dev, 2841fdf91e0fSJan Blunck sizeof(struct qede_dev), qede_eth_dev_init); 2842fdf91e0fSJan Blunck } 2843fdf91e0fSJan Blunck 2844fdf91e0fSJan Blunck static int qede_eth_dev_pci_remove(struct rte_pci_device *pci_dev) 2845fdf91e0fSJan Blunck { 2846fdf91e0fSJan Blunck return rte_eth_dev_pci_generic_remove(pci_dev, qede_eth_dev_uninit); 2847fdf91e0fSJan Blunck } 2848fdf91e0fSJan Blunck 2849fdf91e0fSJan Blunck static struct rte_pci_driver rte_qede_pmd = { 28502ea6f76aSRasesh Mody .id_table = pci_id_qede_map, 2851fdf91e0fSJan Blunck .drv_flags = RTE_PCI_DRV_NEED_MAPPING | RTE_PCI_DRV_INTR_LSC, 2852fdf91e0fSJan Blunck .probe = qede_eth_dev_pci_probe, 2853fdf91e0fSJan Blunck .remove = qede_eth_dev_pci_remove, 28542ea6f76aSRasesh Mody }; 28552ea6f76aSRasesh Mody 2856fdf91e0fSJan Blunck RTE_PMD_REGISTER_PCI(net_qede, rte_qede_pmd); 285701f19227SShreyansh Jain RTE_PMD_REGISTER_PCI_TABLE(net_qede, pci_id_qede_map); 285806e81dc9SDavid Marchand RTE_PMD_REGISTER_KMOD_DEP(net_qede, "* igb_uio | uio_pci_generic | vfio-pci"); 2859fdf91e0fSJan Blunck RTE_PMD_REGISTER_PCI(net_qede_vf, rte_qedevf_pmd); 286001f19227SShreyansh Jain RTE_PMD_REGISTER_PCI_TABLE(net_qede_vf, pci_id_qedevf_map); 286106e81dc9SDavid Marchand RTE_PMD_REGISTER_KMOD_DEP(net_qede_vf, "* igb_uio | vfio-pci"); 2862