18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
28c2ecf20Sopenharmony_ci/* QLogic qed NIC Driver
38c2ecf20Sopenharmony_ci * Copyright (c) 2015-2017  QLogic Corporation
48c2ecf20Sopenharmony_ci * Copyright (c) 2019-2020 Marvell International Ltd.
58c2ecf20Sopenharmony_ci */
68c2ecf20Sopenharmony_ci
78c2ecf20Sopenharmony_ci#ifndef _QED_L2_H
88c2ecf20Sopenharmony_ci#define _QED_L2_H
98c2ecf20Sopenharmony_ci#include <linux/types.h>
108c2ecf20Sopenharmony_ci#include <linux/io.h>
118c2ecf20Sopenharmony_ci#include <linux/kernel.h>
128c2ecf20Sopenharmony_ci#include <linux/slab.h>
138c2ecf20Sopenharmony_ci#include <linux/qed/qed_eth_if.h>
148c2ecf20Sopenharmony_ci#include "qed.h"
158c2ecf20Sopenharmony_ci#include "qed_hw.h"
168c2ecf20Sopenharmony_ci#include "qed_sp.h"
178c2ecf20Sopenharmony_cistruct qed_rss_params {
188c2ecf20Sopenharmony_ci	u8 update_rss_config;
198c2ecf20Sopenharmony_ci	u8 rss_enable;
208c2ecf20Sopenharmony_ci	u8 rss_eng_id;
218c2ecf20Sopenharmony_ci	u8 update_rss_capabilities;
228c2ecf20Sopenharmony_ci	u8 update_rss_ind_table;
238c2ecf20Sopenharmony_ci	u8 update_rss_key;
248c2ecf20Sopenharmony_ci	u8 rss_caps;
258c2ecf20Sopenharmony_ci	u8 rss_table_size_log;
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci	/* Indirection table consist of rx queue handles */
288c2ecf20Sopenharmony_ci	void *rss_ind_table[QED_RSS_IND_TABLE_SIZE];
298c2ecf20Sopenharmony_ci	u32 rss_key[QED_RSS_KEY_SIZE];
308c2ecf20Sopenharmony_ci};
318c2ecf20Sopenharmony_ci
328c2ecf20Sopenharmony_cistruct qed_sge_tpa_params {
338c2ecf20Sopenharmony_ci	u8 max_buffers_per_cqe;
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci	u8 update_tpa_en_flg;
368c2ecf20Sopenharmony_ci	u8 tpa_ipv4_en_flg;
378c2ecf20Sopenharmony_ci	u8 tpa_ipv6_en_flg;
388c2ecf20Sopenharmony_ci	u8 tpa_ipv4_tunn_en_flg;
398c2ecf20Sopenharmony_ci	u8 tpa_ipv6_tunn_en_flg;
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	u8 update_tpa_param_flg;
428c2ecf20Sopenharmony_ci	u8 tpa_pkt_split_flg;
438c2ecf20Sopenharmony_ci	u8 tpa_hdr_data_split_flg;
448c2ecf20Sopenharmony_ci	u8 tpa_gro_consistent_flg;
458c2ecf20Sopenharmony_ci	u8 tpa_max_aggs_num;
468c2ecf20Sopenharmony_ci	u16 tpa_max_size;
478c2ecf20Sopenharmony_ci	u16 tpa_min_size_to_start;
488c2ecf20Sopenharmony_ci	u16 tpa_min_size_to_cont;
498c2ecf20Sopenharmony_ci};
508c2ecf20Sopenharmony_ci
518c2ecf20Sopenharmony_cienum qed_filter_opcode {
528c2ecf20Sopenharmony_ci	QED_FILTER_ADD,
538c2ecf20Sopenharmony_ci	QED_FILTER_REMOVE,
548c2ecf20Sopenharmony_ci	QED_FILTER_MOVE,
558c2ecf20Sopenharmony_ci	QED_FILTER_REPLACE,	/* Delete all MACs and add new one instead */
568c2ecf20Sopenharmony_ci	QED_FILTER_FLUSH,	/* Removes all filters */
578c2ecf20Sopenharmony_ci};
588c2ecf20Sopenharmony_ci
598c2ecf20Sopenharmony_cienum qed_filter_ucast_type {
608c2ecf20Sopenharmony_ci	QED_FILTER_MAC,
618c2ecf20Sopenharmony_ci	QED_FILTER_VLAN,
628c2ecf20Sopenharmony_ci	QED_FILTER_MAC_VLAN,
638c2ecf20Sopenharmony_ci	QED_FILTER_INNER_MAC,
648c2ecf20Sopenharmony_ci	QED_FILTER_INNER_VLAN,
658c2ecf20Sopenharmony_ci	QED_FILTER_INNER_PAIR,
668c2ecf20Sopenharmony_ci	QED_FILTER_INNER_MAC_VNI_PAIR,
678c2ecf20Sopenharmony_ci	QED_FILTER_MAC_VNI_PAIR,
688c2ecf20Sopenharmony_ci	QED_FILTER_VNI,
698c2ecf20Sopenharmony_ci};
708c2ecf20Sopenharmony_ci
718c2ecf20Sopenharmony_cistruct qed_filter_ucast {
728c2ecf20Sopenharmony_ci	enum qed_filter_opcode opcode;
738c2ecf20Sopenharmony_ci	enum qed_filter_ucast_type type;
748c2ecf20Sopenharmony_ci	u8 is_rx_filter;
758c2ecf20Sopenharmony_ci	u8 is_tx_filter;
768c2ecf20Sopenharmony_ci	u8 vport_to_add_to;
778c2ecf20Sopenharmony_ci	u8 vport_to_remove_from;
788c2ecf20Sopenharmony_ci	unsigned char mac[ETH_ALEN];
798c2ecf20Sopenharmony_ci	u8 assert_on_error;
808c2ecf20Sopenharmony_ci	u16 vlan;
818c2ecf20Sopenharmony_ci	u32 vni;
828c2ecf20Sopenharmony_ci};
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_cistruct qed_filter_mcast {
858c2ecf20Sopenharmony_ci	/* MOVE is not supported for multicast */
868c2ecf20Sopenharmony_ci	enum qed_filter_opcode opcode;
878c2ecf20Sopenharmony_ci	u8 vport_to_add_to;
888c2ecf20Sopenharmony_ci	u8 vport_to_remove_from;
898c2ecf20Sopenharmony_ci	u8 num_mc_addrs;
908c2ecf20Sopenharmony_ci#define QED_MAX_MC_ADDRS        64
918c2ecf20Sopenharmony_ci	unsigned char mac[QED_MAX_MC_ADDRS][ETH_ALEN];
928c2ecf20Sopenharmony_ci};
938c2ecf20Sopenharmony_ci
948c2ecf20Sopenharmony_ci/**
958c2ecf20Sopenharmony_ci * @brief qed_eth_rx_queue_stop - This ramrod closes an Rx queue
968c2ecf20Sopenharmony_ci *
978c2ecf20Sopenharmony_ci * @param p_hwfn
988c2ecf20Sopenharmony_ci * @param p_rxq			Handler of queue to close
998c2ecf20Sopenharmony_ci * @param eq_completion_only	If True completion will be on
1008c2ecf20Sopenharmony_ci *				EQe, if False completion will be
1018c2ecf20Sopenharmony_ci *				on EQe if p_hwfn opaque
1028c2ecf20Sopenharmony_ci *				different from the RXQ opaque
1038c2ecf20Sopenharmony_ci *				otherwise on CQe.
1048c2ecf20Sopenharmony_ci * @param cqe_completion	If True completion will be
1058c2ecf20Sopenharmony_ci *				receive on CQe.
1068c2ecf20Sopenharmony_ci * @return int
1078c2ecf20Sopenharmony_ci */
1088c2ecf20Sopenharmony_ciint
1098c2ecf20Sopenharmony_ciqed_eth_rx_queue_stop(struct qed_hwfn *p_hwfn,
1108c2ecf20Sopenharmony_ci		      void *p_rxq,
1118c2ecf20Sopenharmony_ci		      bool eq_completion_only, bool cqe_completion);
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_ci/**
1148c2ecf20Sopenharmony_ci * @brief qed_eth_tx_queue_stop - closes a Tx queue
1158c2ecf20Sopenharmony_ci *
1168c2ecf20Sopenharmony_ci * @param p_hwfn
1178c2ecf20Sopenharmony_ci * @param p_txq - handle to Tx queue needed to be closed
1188c2ecf20Sopenharmony_ci *
1198c2ecf20Sopenharmony_ci * @return int
1208c2ecf20Sopenharmony_ci */
1218c2ecf20Sopenharmony_ciint qed_eth_tx_queue_stop(struct qed_hwfn *p_hwfn, void *p_txq);
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_cienum qed_tpa_mode {
1248c2ecf20Sopenharmony_ci	QED_TPA_MODE_NONE,
1258c2ecf20Sopenharmony_ci	QED_TPA_MODE_UNUSED,
1268c2ecf20Sopenharmony_ci	QED_TPA_MODE_GRO,
1278c2ecf20Sopenharmony_ci	QED_TPA_MODE_MAX
1288c2ecf20Sopenharmony_ci};
1298c2ecf20Sopenharmony_ci
1308c2ecf20Sopenharmony_cistruct qed_sp_vport_start_params {
1318c2ecf20Sopenharmony_ci	enum qed_tpa_mode tpa_mode;
1328c2ecf20Sopenharmony_ci	bool remove_inner_vlan;
1338c2ecf20Sopenharmony_ci	bool tx_switching;
1348c2ecf20Sopenharmony_ci	bool handle_ptp_pkts;
1358c2ecf20Sopenharmony_ci	bool only_untagged;
1368c2ecf20Sopenharmony_ci	bool drop_ttl0;
1378c2ecf20Sopenharmony_ci	u8 max_buffers_per_cqe;
1388c2ecf20Sopenharmony_ci	u32 concrete_fid;
1398c2ecf20Sopenharmony_ci	u16 opaque_fid;
1408c2ecf20Sopenharmony_ci	u8 vport_id;
1418c2ecf20Sopenharmony_ci	u16 mtu;
1428c2ecf20Sopenharmony_ci	bool check_mac;
1438c2ecf20Sopenharmony_ci	bool check_ethtype;
1448c2ecf20Sopenharmony_ci};
1458c2ecf20Sopenharmony_ci
1468c2ecf20Sopenharmony_ciint qed_sp_eth_vport_start(struct qed_hwfn *p_hwfn,
1478c2ecf20Sopenharmony_ci			   struct qed_sp_vport_start_params *p_params);
1488c2ecf20Sopenharmony_ci
1498c2ecf20Sopenharmony_ci
1508c2ecf20Sopenharmony_cistruct qed_filter_accept_flags {
1518c2ecf20Sopenharmony_ci	u8	update_rx_mode_config;
1528c2ecf20Sopenharmony_ci	u8	update_tx_mode_config;
1538c2ecf20Sopenharmony_ci	u8	rx_accept_filter;
1548c2ecf20Sopenharmony_ci	u8	tx_accept_filter;
1558c2ecf20Sopenharmony_ci#define QED_ACCEPT_NONE         0x01
1568c2ecf20Sopenharmony_ci#define QED_ACCEPT_UCAST_MATCHED        0x02
1578c2ecf20Sopenharmony_ci#define QED_ACCEPT_UCAST_UNMATCHED      0x04
1588c2ecf20Sopenharmony_ci#define QED_ACCEPT_MCAST_MATCHED        0x08
1598c2ecf20Sopenharmony_ci#define QED_ACCEPT_MCAST_UNMATCHED      0x10
1608c2ecf20Sopenharmony_ci#define QED_ACCEPT_BCAST                0x20
1618c2ecf20Sopenharmony_ci#define QED_ACCEPT_ANY_VNI              0x40
1628c2ecf20Sopenharmony_ci};
1638c2ecf20Sopenharmony_ci
1648c2ecf20Sopenharmony_cistruct qed_arfs_config_params {
1658c2ecf20Sopenharmony_ci	bool tcp;
1668c2ecf20Sopenharmony_ci	bool udp;
1678c2ecf20Sopenharmony_ci	bool ipv4;
1688c2ecf20Sopenharmony_ci	bool ipv6;
1698c2ecf20Sopenharmony_ci	enum qed_filter_config_mode mode;
1708c2ecf20Sopenharmony_ci};
1718c2ecf20Sopenharmony_ci
1728c2ecf20Sopenharmony_cistruct qed_sp_vport_update_params {
1738c2ecf20Sopenharmony_ci	u16				opaque_fid;
1748c2ecf20Sopenharmony_ci	u8				vport_id;
1758c2ecf20Sopenharmony_ci	u8				update_vport_active_rx_flg;
1768c2ecf20Sopenharmony_ci	u8				vport_active_rx_flg;
1778c2ecf20Sopenharmony_ci	u8				update_vport_active_tx_flg;
1788c2ecf20Sopenharmony_ci	u8				vport_active_tx_flg;
1798c2ecf20Sopenharmony_ci	u8				update_inner_vlan_removal_flg;
1808c2ecf20Sopenharmony_ci	u8				inner_vlan_removal_flg;
1818c2ecf20Sopenharmony_ci	u8				silent_vlan_removal_flg;
1828c2ecf20Sopenharmony_ci	u8				update_default_vlan_enable_flg;
1838c2ecf20Sopenharmony_ci	u8				default_vlan_enable_flg;
1848c2ecf20Sopenharmony_ci	u8				update_default_vlan_flg;
1858c2ecf20Sopenharmony_ci	u16				default_vlan;
1868c2ecf20Sopenharmony_ci	u8				update_tx_switching_flg;
1878c2ecf20Sopenharmony_ci	u8				tx_switching_flg;
1888c2ecf20Sopenharmony_ci	u8				update_approx_mcast_flg;
1898c2ecf20Sopenharmony_ci	u8				update_anti_spoofing_en_flg;
1908c2ecf20Sopenharmony_ci	u8				anti_spoofing_en;
1918c2ecf20Sopenharmony_ci	u8				update_accept_any_vlan_flg;
1928c2ecf20Sopenharmony_ci	u8				accept_any_vlan;
1938c2ecf20Sopenharmony_ci	u32				bins[8];
1948c2ecf20Sopenharmony_ci	struct qed_rss_params		*rss_params;
1958c2ecf20Sopenharmony_ci	struct qed_filter_accept_flags	accept_flags;
1968c2ecf20Sopenharmony_ci	struct qed_sge_tpa_params	*sge_tpa_params;
1978c2ecf20Sopenharmony_ci	u8				update_ctl_frame_check;
1988c2ecf20Sopenharmony_ci	u8				mac_chk_en;
1998c2ecf20Sopenharmony_ci	u8				ethtype_chk_en;
2008c2ecf20Sopenharmony_ci};
2018c2ecf20Sopenharmony_ci
2028c2ecf20Sopenharmony_ciint qed_sp_vport_update(struct qed_hwfn *p_hwfn,
2038c2ecf20Sopenharmony_ci			struct qed_sp_vport_update_params *p_params,
2048c2ecf20Sopenharmony_ci			enum spq_mode comp_mode,
2058c2ecf20Sopenharmony_ci			struct qed_spq_comp_cb *p_comp_data);
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_ci/**
2088c2ecf20Sopenharmony_ci * @brief qed_sp_vport_stop -
2098c2ecf20Sopenharmony_ci *
2108c2ecf20Sopenharmony_ci * This ramrod closes a VPort after all its RX and TX queues are terminated.
2118c2ecf20Sopenharmony_ci * An Assert is generated if any queues are left open.
2128c2ecf20Sopenharmony_ci *
2138c2ecf20Sopenharmony_ci * @param p_hwfn
2148c2ecf20Sopenharmony_ci * @param opaque_fid
2158c2ecf20Sopenharmony_ci * @param vport_id VPort ID
2168c2ecf20Sopenharmony_ci *
2178c2ecf20Sopenharmony_ci * @return int
2188c2ecf20Sopenharmony_ci */
2198c2ecf20Sopenharmony_ciint qed_sp_vport_stop(struct qed_hwfn *p_hwfn, u16 opaque_fid, u8 vport_id);
2208c2ecf20Sopenharmony_ci
2218c2ecf20Sopenharmony_ciint qed_sp_eth_filter_ucast(struct qed_hwfn *p_hwfn,
2228c2ecf20Sopenharmony_ci			    u16 opaque_fid,
2238c2ecf20Sopenharmony_ci			    struct qed_filter_ucast *p_filter_cmd,
2248c2ecf20Sopenharmony_ci			    enum spq_mode comp_mode,
2258c2ecf20Sopenharmony_ci			    struct qed_spq_comp_cb *p_comp_data);
2268c2ecf20Sopenharmony_ci
2278c2ecf20Sopenharmony_ci/**
2288c2ecf20Sopenharmony_ci * @brief qed_sp_rx_eth_queues_update -
2298c2ecf20Sopenharmony_ci *
2308c2ecf20Sopenharmony_ci * This ramrod updates an RX queue. It is used for setting the active state
2318c2ecf20Sopenharmony_ci * of the queue and updating the TPA and SGE parameters.
2328c2ecf20Sopenharmony_ci *
2338c2ecf20Sopenharmony_ci * @note At the moment - only used by non-linux VFs.
2348c2ecf20Sopenharmony_ci *
2358c2ecf20Sopenharmony_ci * @param p_hwfn
2368c2ecf20Sopenharmony_ci * @param pp_rxq_handlers	An array of queue handlers to be updated.
2378c2ecf20Sopenharmony_ci * @param num_rxqs              number of queues to update.
2388c2ecf20Sopenharmony_ci * @param complete_cqe_flg	Post completion to the CQE Ring if set
2398c2ecf20Sopenharmony_ci * @param complete_event_flg	Post completion to the Event Ring if set
2408c2ecf20Sopenharmony_ci * @param comp_mode
2418c2ecf20Sopenharmony_ci * @param p_comp_data
2428c2ecf20Sopenharmony_ci *
2438c2ecf20Sopenharmony_ci * @return int
2448c2ecf20Sopenharmony_ci */
2458c2ecf20Sopenharmony_ci
2468c2ecf20Sopenharmony_ciint
2478c2ecf20Sopenharmony_ciqed_sp_eth_rx_queues_update(struct qed_hwfn *p_hwfn,
2488c2ecf20Sopenharmony_ci			    void **pp_rxq_handlers,
2498c2ecf20Sopenharmony_ci			    u8 num_rxqs,
2508c2ecf20Sopenharmony_ci			    u8 complete_cqe_flg,
2518c2ecf20Sopenharmony_ci			    u8 complete_event_flg,
2528c2ecf20Sopenharmony_ci			    enum spq_mode comp_mode,
2538c2ecf20Sopenharmony_ci			    struct qed_spq_comp_cb *p_comp_data);
2548c2ecf20Sopenharmony_ci
2558c2ecf20Sopenharmony_civoid qed_get_vport_stats(struct qed_dev *cdev, struct qed_eth_stats *stats);
2568c2ecf20Sopenharmony_ci
2578c2ecf20Sopenharmony_civoid qed_reset_vport_stats(struct qed_dev *cdev);
2588c2ecf20Sopenharmony_ci
2598c2ecf20Sopenharmony_ci/**
2608c2ecf20Sopenharmony_ci * *@brief qed_arfs_mode_configure -
2618c2ecf20Sopenharmony_ci *
2628c2ecf20Sopenharmony_ci **Enable or disable rfs mode. It must accept atleast one of tcp or udp true
2638c2ecf20Sopenharmony_ci **and atleast one of ipv4 or ipv6 true to enable rfs mode.
2648c2ecf20Sopenharmony_ci *
2658c2ecf20Sopenharmony_ci **@param p_hwfn
2668c2ecf20Sopenharmony_ci **@param p_ptt
2678c2ecf20Sopenharmony_ci **@param p_cfg_params - arfs mode configuration parameters.
2688c2ecf20Sopenharmony_ci *
2698c2ecf20Sopenharmony_ci */
2708c2ecf20Sopenharmony_civoid qed_arfs_mode_configure(struct qed_hwfn *p_hwfn,
2718c2ecf20Sopenharmony_ci			     struct qed_ptt *p_ptt,
2728c2ecf20Sopenharmony_ci			     struct qed_arfs_config_params *p_cfg_params);
2738c2ecf20Sopenharmony_ci
2748c2ecf20Sopenharmony_ci/**
2758c2ecf20Sopenharmony_ci * @brief - qed_configure_rfs_ntuple_filter
2768c2ecf20Sopenharmony_ci *
2778c2ecf20Sopenharmony_ci * This ramrod should be used to add or remove arfs hw filter
2788c2ecf20Sopenharmony_ci *
2798c2ecf20Sopenharmony_ci * @params p_hwfn
2808c2ecf20Sopenharmony_ci * @params p_cb - Used for QED_SPQ_MODE_CB,where client would initialize
2818c2ecf20Sopenharmony_ci *		  it with cookie and callback function address, if not
2828c2ecf20Sopenharmony_ci *		  using this mode then client must pass NULL.
2838c2ecf20Sopenharmony_ci * @params p_params
2848c2ecf20Sopenharmony_ci */
2858c2ecf20Sopenharmony_ciint
2868c2ecf20Sopenharmony_ciqed_configure_rfs_ntuple_filter(struct qed_hwfn *p_hwfn,
2878c2ecf20Sopenharmony_ci				struct qed_spq_comp_cb *p_cb,
2888c2ecf20Sopenharmony_ci				struct qed_ntuple_filter_params *p_params);
2898c2ecf20Sopenharmony_ci
2908c2ecf20Sopenharmony_ci#define MAX_QUEUES_PER_QZONE    (sizeof(unsigned long) * 8)
2918c2ecf20Sopenharmony_ci#define QED_QUEUE_CID_SELF	(0xff)
2928c2ecf20Sopenharmony_ci
2938c2ecf20Sopenharmony_ci/* Almost identical to the qed_queue_start_common_params,
2948c2ecf20Sopenharmony_ci * but here we maintain the SB index in IGU CAM.
2958c2ecf20Sopenharmony_ci */
2968c2ecf20Sopenharmony_cistruct qed_queue_cid_params {
2978c2ecf20Sopenharmony_ci	u8 vport_id;
2988c2ecf20Sopenharmony_ci	u16 queue_id;
2998c2ecf20Sopenharmony_ci	u8 stats_id;
3008c2ecf20Sopenharmony_ci};
3018c2ecf20Sopenharmony_ci
3028c2ecf20Sopenharmony_ci/* Additional parameters required for initialization of the queue_cid
3038c2ecf20Sopenharmony_ci * and are relevant only for a PF initializing one for its VFs.
3048c2ecf20Sopenharmony_ci */
3058c2ecf20Sopenharmony_cistruct qed_queue_cid_vf_params {
3068c2ecf20Sopenharmony_ci	/* Should match the VF's relative index */
3078c2ecf20Sopenharmony_ci	u8 vfid;
3088c2ecf20Sopenharmony_ci
3098c2ecf20Sopenharmony_ci	/* 0-based queue index. Should reflect the relative qzone the
3108c2ecf20Sopenharmony_ci	 * VF thinks is associated with it [in its range].
3118c2ecf20Sopenharmony_ci	 */
3128c2ecf20Sopenharmony_ci	u8 vf_qid;
3138c2ecf20Sopenharmony_ci
3148c2ecf20Sopenharmony_ci	/* Indicates a VF is legacy, making it differ in several things:
3158c2ecf20Sopenharmony_ci	 *  - Producers would be placed in a different place.
3168c2ecf20Sopenharmony_ci	 *  - Makes assumptions regarding the CIDs.
3178c2ecf20Sopenharmony_ci	 */
3188c2ecf20Sopenharmony_ci	u8 vf_legacy;
3198c2ecf20Sopenharmony_ci
3208c2ecf20Sopenharmony_ci	u8 qid_usage_idx;
3218c2ecf20Sopenharmony_ci};
3228c2ecf20Sopenharmony_ci
3238c2ecf20Sopenharmony_cistruct qed_queue_cid {
3248c2ecf20Sopenharmony_ci	/* For stats-id, the `rel' is actually absolute as well */
3258c2ecf20Sopenharmony_ci	struct qed_queue_cid_params rel;
3268c2ecf20Sopenharmony_ci	struct qed_queue_cid_params abs;
3278c2ecf20Sopenharmony_ci
3288c2ecf20Sopenharmony_ci	/* These have no 'relative' meaning */
3298c2ecf20Sopenharmony_ci	u16 sb_igu_id;
3308c2ecf20Sopenharmony_ci	u8 sb_idx;
3318c2ecf20Sopenharmony_ci
3328c2ecf20Sopenharmony_ci	u32 cid;
3338c2ecf20Sopenharmony_ci	u16 opaque_fid;
3348c2ecf20Sopenharmony_ci
3358c2ecf20Sopenharmony_ci	bool b_is_rx;
3368c2ecf20Sopenharmony_ci
3378c2ecf20Sopenharmony_ci	/* VFs queues are mapped differently, so we need to know the
3388c2ecf20Sopenharmony_ci	 * relative queue associated with them [0-based].
3398c2ecf20Sopenharmony_ci	 * Notice this is relevant on the *PF* queue-cid of its VF's queues,
3408c2ecf20Sopenharmony_ci	 * and not on the VF itself.
3418c2ecf20Sopenharmony_ci	 */
3428c2ecf20Sopenharmony_ci	u8 vfid;
3438c2ecf20Sopenharmony_ci	u8 vf_qid;
3448c2ecf20Sopenharmony_ci
3458c2ecf20Sopenharmony_ci	/* We need an additional index to differentiate between queues opened
3468c2ecf20Sopenharmony_ci	 * for same queue-zone, as VFs would have to communicate the info
3478c2ecf20Sopenharmony_ci	 * to the PF [otherwise PF has no way to differentiate].
3488c2ecf20Sopenharmony_ci	 */
3498c2ecf20Sopenharmony_ci	u8 qid_usage_idx;
3508c2ecf20Sopenharmony_ci
3518c2ecf20Sopenharmony_ci	u8 vf_legacy;
3528c2ecf20Sopenharmony_ci#define QED_QCID_LEGACY_VF_RX_PROD	(BIT(0))
3538c2ecf20Sopenharmony_ci#define QED_QCID_LEGACY_VF_CID		(BIT(1))
3548c2ecf20Sopenharmony_ci
3558c2ecf20Sopenharmony_ci	struct qed_hwfn *p_owner;
3568c2ecf20Sopenharmony_ci};
3578c2ecf20Sopenharmony_ci
3588c2ecf20Sopenharmony_ciint qed_l2_alloc(struct qed_hwfn *p_hwfn);
3598c2ecf20Sopenharmony_civoid qed_l2_setup(struct qed_hwfn *p_hwfn);
3608c2ecf20Sopenharmony_civoid qed_l2_free(struct qed_hwfn *p_hwfn);
3618c2ecf20Sopenharmony_ci
3628c2ecf20Sopenharmony_civoid qed_eth_queue_cid_release(struct qed_hwfn *p_hwfn,
3638c2ecf20Sopenharmony_ci			       struct qed_queue_cid *p_cid);
3648c2ecf20Sopenharmony_ci
3658c2ecf20Sopenharmony_cistruct qed_queue_cid *
3668c2ecf20Sopenharmony_ciqed_eth_queue_to_cid(struct qed_hwfn *p_hwfn,
3678c2ecf20Sopenharmony_ci		     u16 opaque_fid,
3688c2ecf20Sopenharmony_ci		     struct qed_queue_start_common_params *p_params,
3698c2ecf20Sopenharmony_ci		     bool b_is_rx,
3708c2ecf20Sopenharmony_ci		     struct qed_queue_cid_vf_params *p_vf_params);
3718c2ecf20Sopenharmony_ci
3728c2ecf20Sopenharmony_ciint
3738c2ecf20Sopenharmony_ciqed_sp_eth_vport_start(struct qed_hwfn *p_hwfn,
3748c2ecf20Sopenharmony_ci		       struct qed_sp_vport_start_params *p_params);
3758c2ecf20Sopenharmony_ci
3768c2ecf20Sopenharmony_ci/**
3778c2ecf20Sopenharmony_ci * @brief - Starts an Rx queue, when queue_cid is already prepared
3788c2ecf20Sopenharmony_ci *
3798c2ecf20Sopenharmony_ci * @param p_hwfn
3808c2ecf20Sopenharmony_ci * @param p_cid
3818c2ecf20Sopenharmony_ci * @param bd_max_bytes
3828c2ecf20Sopenharmony_ci * @param bd_chain_phys_addr
3838c2ecf20Sopenharmony_ci * @param cqe_pbl_addr
3848c2ecf20Sopenharmony_ci * @param cqe_pbl_size
3858c2ecf20Sopenharmony_ci *
3868c2ecf20Sopenharmony_ci * @return int
3878c2ecf20Sopenharmony_ci */
3888c2ecf20Sopenharmony_ciint
3898c2ecf20Sopenharmony_ciqed_eth_rxq_start_ramrod(struct qed_hwfn *p_hwfn,
3908c2ecf20Sopenharmony_ci			 struct qed_queue_cid *p_cid,
3918c2ecf20Sopenharmony_ci			 u16 bd_max_bytes,
3928c2ecf20Sopenharmony_ci			 dma_addr_t bd_chain_phys_addr,
3938c2ecf20Sopenharmony_ci			 dma_addr_t cqe_pbl_addr, u16 cqe_pbl_size);
3948c2ecf20Sopenharmony_ci
3958c2ecf20Sopenharmony_ci/**
3968c2ecf20Sopenharmony_ci * @brief - Starts a Tx queue, where queue_cid is already prepared
3978c2ecf20Sopenharmony_ci *
3988c2ecf20Sopenharmony_ci * @param p_hwfn
3998c2ecf20Sopenharmony_ci * @param p_cid
4008c2ecf20Sopenharmony_ci * @param pbl_addr
4018c2ecf20Sopenharmony_ci * @param pbl_size
4028c2ecf20Sopenharmony_ci * @param p_pq_params - parameters for choosing the PQ for this Tx queue
4038c2ecf20Sopenharmony_ci *
4048c2ecf20Sopenharmony_ci * @return int
4058c2ecf20Sopenharmony_ci */
4068c2ecf20Sopenharmony_ciint
4078c2ecf20Sopenharmony_ciqed_eth_txq_start_ramrod(struct qed_hwfn *p_hwfn,
4088c2ecf20Sopenharmony_ci			 struct qed_queue_cid *p_cid,
4098c2ecf20Sopenharmony_ci			 dma_addr_t pbl_addr, u16 pbl_size, u16 pq_id);
4108c2ecf20Sopenharmony_ci
4118c2ecf20Sopenharmony_ciu8 qed_mcast_bin_from_mac(u8 *mac);
4128c2ecf20Sopenharmony_ci
4138c2ecf20Sopenharmony_ciint qed_set_rxq_coalesce(struct qed_hwfn *p_hwfn,
4148c2ecf20Sopenharmony_ci			 struct qed_ptt *p_ptt,
4158c2ecf20Sopenharmony_ci			 u16 coalesce, struct qed_queue_cid *p_cid);
4168c2ecf20Sopenharmony_ci
4178c2ecf20Sopenharmony_ciint qed_set_txq_coalesce(struct qed_hwfn *p_hwfn,
4188c2ecf20Sopenharmony_ci			 struct qed_ptt *p_ptt,
4198c2ecf20Sopenharmony_ci			 u16 coalesce, struct qed_queue_cid *p_cid);
4208c2ecf20Sopenharmony_ci
4218c2ecf20Sopenharmony_ciint qed_get_rxq_coalesce(struct qed_hwfn *p_hwfn,
4228c2ecf20Sopenharmony_ci			 struct qed_ptt *p_ptt,
4238c2ecf20Sopenharmony_ci			 struct qed_queue_cid *p_cid, u16 *p_hw_coal);
4248c2ecf20Sopenharmony_ci
4258c2ecf20Sopenharmony_ciint qed_get_txq_coalesce(struct qed_hwfn *p_hwfn,
4268c2ecf20Sopenharmony_ci			 struct qed_ptt *p_ptt,
4278c2ecf20Sopenharmony_ci			 struct qed_queue_cid *p_cid, u16 *p_hw_coal);
4288c2ecf20Sopenharmony_ci
4298c2ecf20Sopenharmony_ci#endif
430