132a47e72SYuval Mintz /* QLogic qed NIC Driver
232a47e72SYuval Mintz  * Copyright (c) 2015 QLogic Corporation
332a47e72SYuval Mintz  *
432a47e72SYuval Mintz  * This software is available under the terms of the GNU General Public License
532a47e72SYuval Mintz  * (GPL) Version 2, available from the file COPYING in the main directory of
632a47e72SYuval Mintz  * this source tree.
732a47e72SYuval Mintz  */
832a47e72SYuval Mintz 
932a47e72SYuval Mintz #ifndef _QED_VF_H
1032a47e72SYuval Mintz #define _QED_VF_H
1132a47e72SYuval Mintz 
12dacd88d6SYuval Mintz #include "qed_l2.h"
1336558c3dSYuval Mintz #include "qed_mcp.h"
14dacd88d6SYuval Mintz 
15dacd88d6SYuval Mintz #define T_ETH_INDIRECTION_TABLE_SIZE 128
16dacd88d6SYuval Mintz #define T_ETH_RSS_KEY_SIZE 10
17dacd88d6SYuval Mintz 
181408cc1fSYuval Mintz struct vf_pf_resc_request {
191408cc1fSYuval Mintz 	u8 num_rxqs;
201408cc1fSYuval Mintz 	u8 num_txqs;
211408cc1fSYuval Mintz 	u8 num_sbs;
221408cc1fSYuval Mintz 	u8 num_mac_filters;
231408cc1fSYuval Mintz 	u8 num_vlan_filters;
241408cc1fSYuval Mintz 	u8 num_mc_filters;
251408cc1fSYuval Mintz 	u16 padding;
261408cc1fSYuval Mintz };
271408cc1fSYuval Mintz 
281408cc1fSYuval Mintz struct hw_sb_info {
291408cc1fSYuval Mintz 	u16 hw_sb_id;
301408cc1fSYuval Mintz 	u8 sb_qid;
311408cc1fSYuval Mintz 	u8 padding[5];
321408cc1fSYuval Mintz };
331408cc1fSYuval Mintz 
34dacd88d6SYuval Mintz #define TLV_BUFFER_SIZE                 1024
35dacd88d6SYuval Mintz 
3637bff2b9SYuval Mintz enum {
3737bff2b9SYuval Mintz 	PFVF_STATUS_WAITING,
3837bff2b9SYuval Mintz 	PFVF_STATUS_SUCCESS,
3937bff2b9SYuval Mintz 	PFVF_STATUS_FAILURE,
4037bff2b9SYuval Mintz 	PFVF_STATUS_NOT_SUPPORTED,
4137bff2b9SYuval Mintz 	PFVF_STATUS_NO_RESOURCE,
4237bff2b9SYuval Mintz 	PFVF_STATUS_FORCED,
437eff82b0SYuval Mintz 	PFVF_STATUS_MALICIOUS,
4437bff2b9SYuval Mintz };
4537bff2b9SYuval Mintz 
4637bff2b9SYuval Mintz /* vf pf channel tlvs */
4737bff2b9SYuval Mintz /* general tlv header (used for both vf->pf request and pf->vf response) */
4837bff2b9SYuval Mintz struct channel_tlv {
4937bff2b9SYuval Mintz 	u16 type;
5037bff2b9SYuval Mintz 	u16 length;
5137bff2b9SYuval Mintz };
5237bff2b9SYuval Mintz 
5337bff2b9SYuval Mintz /* header of first vf->pf tlv carries the offset used to calculate reponse
5437bff2b9SYuval Mintz  * buffer address
5537bff2b9SYuval Mintz  */
5637bff2b9SYuval Mintz struct vfpf_first_tlv {
5737bff2b9SYuval Mintz 	struct channel_tlv tl;
5837bff2b9SYuval Mintz 	u32 padding;
5937bff2b9SYuval Mintz 	u64 reply_address;
6037bff2b9SYuval Mintz };
6137bff2b9SYuval Mintz 
6237bff2b9SYuval Mintz /* header of pf->vf tlvs, carries the status of handling the request */
6337bff2b9SYuval Mintz struct pfvf_tlv {
6437bff2b9SYuval Mintz 	struct channel_tlv tl;
6537bff2b9SYuval Mintz 	u8 status;
6637bff2b9SYuval Mintz 	u8 padding[3];
6737bff2b9SYuval Mintz };
6837bff2b9SYuval Mintz 
6937bff2b9SYuval Mintz /* response tlv used for most tlvs */
7037bff2b9SYuval Mintz struct pfvf_def_resp_tlv {
7137bff2b9SYuval Mintz 	struct pfvf_tlv hdr;
7237bff2b9SYuval Mintz };
7337bff2b9SYuval Mintz 
7437bff2b9SYuval Mintz /* used to terminate and pad a tlv list */
7537bff2b9SYuval Mintz struct channel_list_end_tlv {
7637bff2b9SYuval Mintz 	struct channel_tlv tl;
7737bff2b9SYuval Mintz 	u8 padding[4];
7837bff2b9SYuval Mintz };
7937bff2b9SYuval Mintz 
801408cc1fSYuval Mintz #define VFPF_ACQUIRE_OS_LINUX (0)
811408cc1fSYuval Mintz #define VFPF_ACQUIRE_OS_WINDOWS (1)
821408cc1fSYuval Mintz #define VFPF_ACQUIRE_OS_ESX (2)
831408cc1fSYuval Mintz #define VFPF_ACQUIRE_OS_SOLARIS (3)
841408cc1fSYuval Mintz #define VFPF_ACQUIRE_OS_LINUX_USERSPACE (4)
851408cc1fSYuval Mintz 
861408cc1fSYuval Mintz struct vfpf_acquire_tlv {
871408cc1fSYuval Mintz 	struct vfpf_first_tlv first_tlv;
881408cc1fSYuval Mintz 
891408cc1fSYuval Mintz 	struct vf_pf_vfdev_info {
90a044df83SYuval Mintz #define VFPF_ACQUIRE_CAP_PRE_FP_HSI     (1 << 0) /* VF pre-FP hsi version */
911408cc1fSYuval Mintz #define VFPF_ACQUIRE_CAP_100G		(1 << 1) /* VF can support 100g */
921408cc1fSYuval Mintz 		u64 capabilities;
931408cc1fSYuval Mintz 		u8 fw_major;
941408cc1fSYuval Mintz 		u8 fw_minor;
951408cc1fSYuval Mintz 		u8 fw_revision;
961408cc1fSYuval Mintz 		u8 fw_engineering;
971408cc1fSYuval Mintz 		u32 driver_version;
981408cc1fSYuval Mintz 		u16 opaque_fid;	/* ME register value */
991408cc1fSYuval Mintz 		u8 os_type;	/* VFPF_ACQUIRE_OS_* value */
1001fe614d1SYuval Mintz 		u8 eth_fp_hsi_major;
1011fe614d1SYuval Mintz 		u8 eth_fp_hsi_minor;
1021fe614d1SYuval Mintz 		u8 padding[3];
1031408cc1fSYuval Mintz 	} vfdev_info;
1041408cc1fSYuval Mintz 
1051408cc1fSYuval Mintz 	struct vf_pf_resc_request resc_request;
1061408cc1fSYuval Mintz 
1071408cc1fSYuval Mintz 	u64 bulletin_addr;
1081408cc1fSYuval Mintz 	u32 bulletin_size;
1091408cc1fSYuval Mintz 	u32 padding;
1101408cc1fSYuval Mintz };
1111408cc1fSYuval Mintz 
112dacd88d6SYuval Mintz /* receive side scaling tlv */
113dacd88d6SYuval Mintz struct vfpf_vport_update_rss_tlv {
114dacd88d6SYuval Mintz 	struct channel_tlv tl;
115dacd88d6SYuval Mintz 
116dacd88d6SYuval Mintz 	u8 update_rss_flags;
117dacd88d6SYuval Mintz #define VFPF_UPDATE_RSS_CONFIG_FLAG       BIT(0)
118dacd88d6SYuval Mintz #define VFPF_UPDATE_RSS_CAPS_FLAG         BIT(1)
119dacd88d6SYuval Mintz #define VFPF_UPDATE_RSS_IND_TABLE_FLAG    BIT(2)
120dacd88d6SYuval Mintz #define VFPF_UPDATE_RSS_KEY_FLAG          BIT(3)
121dacd88d6SYuval Mintz 
122dacd88d6SYuval Mintz 	u8 rss_enable;
123dacd88d6SYuval Mintz 	u8 rss_caps;
124dacd88d6SYuval Mintz 	u8 rss_table_size_log;	/* The table size is 2 ^ rss_table_size_log */
125dacd88d6SYuval Mintz 	u16 rss_ind_table[T_ETH_INDIRECTION_TABLE_SIZE];
126dacd88d6SYuval Mintz 	u32 rss_key[T_ETH_RSS_KEY_SIZE];
127dacd88d6SYuval Mintz };
128dacd88d6SYuval Mintz 
1291408cc1fSYuval Mintz struct pfvf_storm_stats {
1301408cc1fSYuval Mintz 	u32 address;
1311408cc1fSYuval Mintz 	u32 len;
1321408cc1fSYuval Mintz };
1331408cc1fSYuval Mintz 
1341408cc1fSYuval Mintz struct pfvf_stats_info {
1351408cc1fSYuval Mintz 	struct pfvf_storm_stats mstats;
1361408cc1fSYuval Mintz 	struct pfvf_storm_stats pstats;
1371408cc1fSYuval Mintz 	struct pfvf_storm_stats tstats;
1381408cc1fSYuval Mintz 	struct pfvf_storm_stats ustats;
1391408cc1fSYuval Mintz };
1401408cc1fSYuval Mintz 
1411408cc1fSYuval Mintz struct pfvf_acquire_resp_tlv {
1421408cc1fSYuval Mintz 	struct pfvf_tlv hdr;
1431408cc1fSYuval Mintz 
1441408cc1fSYuval Mintz 	struct pf_vf_pfdev_info {
1451408cc1fSYuval Mintz 		u32 chip_num;
1461408cc1fSYuval Mintz 		u32 mfw_ver;
1471408cc1fSYuval Mintz 
1481408cc1fSYuval Mintz 		u16 fw_major;
1491408cc1fSYuval Mintz 		u16 fw_minor;
1501408cc1fSYuval Mintz 		u16 fw_rev;
1511408cc1fSYuval Mintz 		u16 fw_eng;
1521408cc1fSYuval Mintz 
1531408cc1fSYuval Mintz 		u64 capabilities;
1541408cc1fSYuval Mintz #define PFVF_ACQUIRE_CAP_DEFAULT_UNTAGGED	BIT(0)
1551408cc1fSYuval Mintz #define PFVF_ACQUIRE_CAP_100G			BIT(1)	/* If set, 100g PF */
1561408cc1fSYuval Mintz /* There are old PF versions where the PF might mistakenly override the sanity
1571408cc1fSYuval Mintz  * mechanism [version-based] and allow a VF that can't be supported to pass
1581408cc1fSYuval Mintz  * the acquisition phase.
1591408cc1fSYuval Mintz  * To overcome this, PFs now indicate that they're past that point and the new
1601408cc1fSYuval Mintz  * VFs would fail probe on the older PFs that fail to do so.
1611408cc1fSYuval Mintz  */
1621408cc1fSYuval Mintz #define PFVF_ACQUIRE_CAP_POST_FW_OVERRIDE	BIT(2)
1631408cc1fSYuval Mintz 
1641408cc1fSYuval Mintz 		u16 db_size;
1651408cc1fSYuval Mintz 		u8 indices_per_sb;
1661408cc1fSYuval Mintz 		u8 os_type;
1671408cc1fSYuval Mintz 
1681408cc1fSYuval Mintz 		/* These should match the PF's qed_dev values */
1691408cc1fSYuval Mintz 		u16 chip_rev;
1701408cc1fSYuval Mintz 		u8 dev_type;
1711408cc1fSYuval Mintz 
1721408cc1fSYuval Mintz 		u8 padding;
1731408cc1fSYuval Mintz 
1741408cc1fSYuval Mintz 		struct pfvf_stats_info stats_info;
1751408cc1fSYuval Mintz 
1761408cc1fSYuval Mintz 		u8 port_mac[ETH_ALEN];
1771fe614d1SYuval Mintz 
1781fe614d1SYuval Mintz 		/* It's possible PF had to configure an older fastpath HSI
1791fe614d1SYuval Mintz 		 * [in case VF is newer than PF]. This is communicated back
1801fe614d1SYuval Mintz 		 * to the VF. It can also be used in case of error due to
1811fe614d1SYuval Mintz 		 * non-matching versions to shed light in VF about failure.
1821fe614d1SYuval Mintz 		 */
1831fe614d1SYuval Mintz 		u8 major_fp_hsi;
1841fe614d1SYuval Mintz 		u8 minor_fp_hsi;
1851408cc1fSYuval Mintz 	} pfdev_info;
1861408cc1fSYuval Mintz 
1871408cc1fSYuval Mintz 	struct pf_vf_resc {
1881408cc1fSYuval Mintz #define PFVF_MAX_QUEUES_PER_VF		16
1891408cc1fSYuval Mintz #define PFVF_MAX_SBS_PER_VF		16
1901408cc1fSYuval Mintz 		struct hw_sb_info hw_sbs[PFVF_MAX_SBS_PER_VF];
1911408cc1fSYuval Mintz 		u8 hw_qid[PFVF_MAX_QUEUES_PER_VF];
1921408cc1fSYuval Mintz 		u8 cid[PFVF_MAX_QUEUES_PER_VF];
1931408cc1fSYuval Mintz 
1941408cc1fSYuval Mintz 		u8 num_rxqs;
1951408cc1fSYuval Mintz 		u8 num_txqs;
1961408cc1fSYuval Mintz 		u8 num_sbs;
1971408cc1fSYuval Mintz 		u8 num_mac_filters;
1981408cc1fSYuval Mintz 		u8 num_vlan_filters;
1991408cc1fSYuval Mintz 		u8 num_mc_filters;
2001408cc1fSYuval Mintz 		u8 padding[2];
2011408cc1fSYuval Mintz 	} resc;
2021408cc1fSYuval Mintz 
2031408cc1fSYuval Mintz 	u32 bulletin_size;
2041408cc1fSYuval Mintz 	u32 padding;
2051408cc1fSYuval Mintz };
2061408cc1fSYuval Mintz 
207dacd88d6SYuval Mintz struct pfvf_start_queue_resp_tlv {
208dacd88d6SYuval Mintz 	struct pfvf_tlv hdr;
209dacd88d6SYuval Mintz 	u32 offset;		/* offset to consumer/producer of queue */
210dacd88d6SYuval Mintz 	u8 padding[4];
211dacd88d6SYuval Mintz };
212dacd88d6SYuval Mintz 
213dacd88d6SYuval Mintz /* Setup Queue */
214dacd88d6SYuval Mintz struct vfpf_start_rxq_tlv {
215dacd88d6SYuval Mintz 	struct vfpf_first_tlv first_tlv;
216dacd88d6SYuval Mintz 
217dacd88d6SYuval Mintz 	/* physical addresses */
218dacd88d6SYuval Mintz 	u64 rxq_addr;
219dacd88d6SYuval Mintz 	u64 deprecated_sge_addr;
220dacd88d6SYuval Mintz 	u64 cqe_pbl_addr;
221dacd88d6SYuval Mintz 
222dacd88d6SYuval Mintz 	u16 cqe_pbl_size;
223dacd88d6SYuval Mintz 	u16 hw_sb;
224dacd88d6SYuval Mintz 	u16 rx_qid;
225dacd88d6SYuval Mintz 	u16 hc_rate;		/* desired interrupts per sec. */
226dacd88d6SYuval Mintz 
227dacd88d6SYuval Mintz 	u16 bd_max_bytes;
228dacd88d6SYuval Mintz 	u16 stat_id;
229dacd88d6SYuval Mintz 	u8 sb_index;
230dacd88d6SYuval Mintz 	u8 padding[3];
231dacd88d6SYuval Mintz };
232dacd88d6SYuval Mintz 
233dacd88d6SYuval Mintz struct vfpf_start_txq_tlv {
234dacd88d6SYuval Mintz 	struct vfpf_first_tlv first_tlv;
235dacd88d6SYuval Mintz 
236dacd88d6SYuval Mintz 	/* physical addresses */
237dacd88d6SYuval Mintz 	u64 pbl_addr;
238dacd88d6SYuval Mintz 	u16 pbl_size;
239dacd88d6SYuval Mintz 	u16 stat_id;
240dacd88d6SYuval Mintz 	u16 tx_qid;
241dacd88d6SYuval Mintz 	u16 hw_sb;
242dacd88d6SYuval Mintz 
243dacd88d6SYuval Mintz 	u32 flags;		/* VFPF_QUEUE_FLG_X flags */
244dacd88d6SYuval Mintz 	u16 hc_rate;		/* desired interrupts per sec. */
245dacd88d6SYuval Mintz 	u8 sb_index;
246dacd88d6SYuval Mintz 	u8 padding[3];
247dacd88d6SYuval Mintz };
248dacd88d6SYuval Mintz 
249dacd88d6SYuval Mintz /* Stop RX Queue */
250dacd88d6SYuval Mintz struct vfpf_stop_rxqs_tlv {
251dacd88d6SYuval Mintz 	struct vfpf_first_tlv first_tlv;
252dacd88d6SYuval Mintz 
253dacd88d6SYuval Mintz 	u16 rx_qid;
254dacd88d6SYuval Mintz 	u8 num_rxqs;
255dacd88d6SYuval Mintz 	u8 cqe_completion;
256dacd88d6SYuval Mintz 	u8 padding[4];
257dacd88d6SYuval Mintz };
258dacd88d6SYuval Mintz 
259dacd88d6SYuval Mintz /* Stop TX Queues */
260dacd88d6SYuval Mintz struct vfpf_stop_txqs_tlv {
261dacd88d6SYuval Mintz 	struct vfpf_first_tlv first_tlv;
262dacd88d6SYuval Mintz 
263dacd88d6SYuval Mintz 	u16 tx_qid;
264dacd88d6SYuval Mintz 	u8 num_txqs;
265dacd88d6SYuval Mintz 	u8 padding[5];
266dacd88d6SYuval Mintz };
267dacd88d6SYuval Mintz 
268dacd88d6SYuval Mintz struct vfpf_update_rxq_tlv {
269dacd88d6SYuval Mintz 	struct vfpf_first_tlv first_tlv;
270dacd88d6SYuval Mintz 
271dacd88d6SYuval Mintz 	u64 deprecated_sge_addr[PFVF_MAX_QUEUES_PER_VF];
272dacd88d6SYuval Mintz 
273dacd88d6SYuval Mintz 	u16 rx_qid;
274dacd88d6SYuval Mintz 	u8 num_rxqs;
275dacd88d6SYuval Mintz 	u8 flags;
276dacd88d6SYuval Mintz #define VFPF_RXQ_UPD_INIT_SGE_DEPRECATE_FLAG    BIT(0)
277dacd88d6SYuval Mintz #define VFPF_RXQ_UPD_COMPLETE_CQE_FLAG          BIT(1)
278dacd88d6SYuval Mintz #define VFPF_RXQ_UPD_COMPLETE_EVENT_FLAG        BIT(2)
279dacd88d6SYuval Mintz 
280dacd88d6SYuval Mintz 	u8 padding[4];
281dacd88d6SYuval Mintz };
282dacd88d6SYuval Mintz 
283dacd88d6SYuval Mintz /* Set Queue Filters */
284dacd88d6SYuval Mintz struct vfpf_q_mac_vlan_filter {
285dacd88d6SYuval Mintz 	u32 flags;
286dacd88d6SYuval Mintz #define VFPF_Q_FILTER_DEST_MAC_VALID    0x01
287dacd88d6SYuval Mintz #define VFPF_Q_FILTER_VLAN_TAG_VALID    0x02
288dacd88d6SYuval Mintz #define VFPF_Q_FILTER_SET_MAC           0x100	/* set/clear */
289dacd88d6SYuval Mintz 
290dacd88d6SYuval Mintz 	u8 mac[ETH_ALEN];
291dacd88d6SYuval Mintz 	u16 vlan_tag;
292dacd88d6SYuval Mintz 
293dacd88d6SYuval Mintz 	u8 padding[4];
294dacd88d6SYuval Mintz };
295dacd88d6SYuval Mintz 
296dacd88d6SYuval Mintz /* Start a vport */
297dacd88d6SYuval Mintz struct vfpf_vport_start_tlv {
298dacd88d6SYuval Mintz 	struct vfpf_first_tlv first_tlv;
299dacd88d6SYuval Mintz 
300dacd88d6SYuval Mintz 	u64 sb_addr[PFVF_MAX_SBS_PER_VF];
301dacd88d6SYuval Mintz 
302dacd88d6SYuval Mintz 	u32 tpa_mode;
303dacd88d6SYuval Mintz 	u16 dep1;
304dacd88d6SYuval Mintz 	u16 mtu;
305dacd88d6SYuval Mintz 
306dacd88d6SYuval Mintz 	u8 vport_id;
307dacd88d6SYuval Mintz 	u8 inner_vlan_removal;
308dacd88d6SYuval Mintz 
309dacd88d6SYuval Mintz 	u8 only_untagged;
310dacd88d6SYuval Mintz 	u8 max_buffers_per_cqe;
311dacd88d6SYuval Mintz 
312dacd88d6SYuval Mintz 	u8 padding[4];
313dacd88d6SYuval Mintz };
314dacd88d6SYuval Mintz 
315dacd88d6SYuval Mintz /* Extended tlvs - need to add rss, mcast, accept mode tlvs */
316dacd88d6SYuval Mintz struct vfpf_vport_update_activate_tlv {
317dacd88d6SYuval Mintz 	struct channel_tlv tl;
318dacd88d6SYuval Mintz 	u8 update_rx;
319dacd88d6SYuval Mintz 	u8 update_tx;
320dacd88d6SYuval Mintz 	u8 active_rx;
321dacd88d6SYuval Mintz 	u8 active_tx;
322dacd88d6SYuval Mintz };
323dacd88d6SYuval Mintz 
32417b235c1SYuval Mintz struct vfpf_vport_update_tx_switch_tlv {
32517b235c1SYuval Mintz 	struct channel_tlv tl;
32617b235c1SYuval Mintz 	u8 tx_switching;
32717b235c1SYuval Mintz 	u8 padding[3];
32817b235c1SYuval Mintz };
32917b235c1SYuval Mintz 
33017b235c1SYuval Mintz struct vfpf_vport_update_vlan_strip_tlv {
33117b235c1SYuval Mintz 	struct channel_tlv tl;
33217b235c1SYuval Mintz 	u8 remove_vlan;
33317b235c1SYuval Mintz 	u8 padding[3];
33417b235c1SYuval Mintz };
33517b235c1SYuval Mintz 
336dacd88d6SYuval Mintz struct vfpf_vport_update_mcast_bin_tlv {
337dacd88d6SYuval Mintz 	struct channel_tlv tl;
338dacd88d6SYuval Mintz 	u8 padding[4];
339dacd88d6SYuval Mintz 
340dacd88d6SYuval Mintz 	u64 bins[8];
341dacd88d6SYuval Mintz };
342dacd88d6SYuval Mintz 
343dacd88d6SYuval Mintz struct vfpf_vport_update_accept_param_tlv {
344dacd88d6SYuval Mintz 	struct channel_tlv tl;
345dacd88d6SYuval Mintz 	u8 update_rx_mode;
346dacd88d6SYuval Mintz 	u8 update_tx_mode;
347dacd88d6SYuval Mintz 	u8 rx_accept_filter;
348dacd88d6SYuval Mintz 	u8 tx_accept_filter;
349dacd88d6SYuval Mintz };
350dacd88d6SYuval Mintz 
35117b235c1SYuval Mintz struct vfpf_vport_update_accept_any_vlan_tlv {
35217b235c1SYuval Mintz 	struct channel_tlv tl;
35317b235c1SYuval Mintz 	u8 update_accept_any_vlan_flg;
35417b235c1SYuval Mintz 	u8 accept_any_vlan;
35517b235c1SYuval Mintz 
35617b235c1SYuval Mintz 	u8 padding[2];
35717b235c1SYuval Mintz };
35817b235c1SYuval Mintz 
35917b235c1SYuval Mintz struct vfpf_vport_update_sge_tpa_tlv {
36017b235c1SYuval Mintz 	struct channel_tlv tl;
36117b235c1SYuval Mintz 
36217b235c1SYuval Mintz 	u16 sge_tpa_flags;
36317b235c1SYuval Mintz #define VFPF_TPA_IPV4_EN_FLAG		BIT(0)
36417b235c1SYuval Mintz #define VFPF_TPA_IPV6_EN_FLAG		BIT(1)
36517b235c1SYuval Mintz #define VFPF_TPA_PKT_SPLIT_FLAG		BIT(2)
36617b235c1SYuval Mintz #define VFPF_TPA_HDR_DATA_SPLIT_FLAG	BIT(3)
36717b235c1SYuval Mintz #define VFPF_TPA_GRO_CONSIST_FLAG	BIT(4)
36817b235c1SYuval Mintz 
36917b235c1SYuval Mintz 	u8 update_sge_tpa_flags;
37017b235c1SYuval Mintz #define VFPF_UPDATE_SGE_DEPRECATED_FLAG	BIT(0)
37117b235c1SYuval Mintz #define VFPF_UPDATE_TPA_EN_FLAG		BIT(1)
37217b235c1SYuval Mintz #define VFPF_UPDATE_TPA_PARAM_FLAG	BIT(2)
37317b235c1SYuval Mintz 
37417b235c1SYuval Mintz 	u8 max_buffers_per_cqe;
37517b235c1SYuval Mintz 
37617b235c1SYuval Mintz 	u16 deprecated_sge_buff_size;
37717b235c1SYuval Mintz 	u16 tpa_max_size;
37817b235c1SYuval Mintz 	u16 tpa_min_size_to_start;
37917b235c1SYuval Mintz 	u16 tpa_min_size_to_cont;
38017b235c1SYuval Mintz 
38117b235c1SYuval Mintz 	u8 tpa_max_aggs_num;
38217b235c1SYuval Mintz 	u8 padding[7];
38317b235c1SYuval Mintz };
38417b235c1SYuval Mintz 
385dacd88d6SYuval Mintz /* Primary tlv as a header for various extended tlvs for
386dacd88d6SYuval Mintz  * various functionalities in vport update ramrod.
387dacd88d6SYuval Mintz  */
388dacd88d6SYuval Mintz struct vfpf_vport_update_tlv {
389dacd88d6SYuval Mintz 	struct vfpf_first_tlv first_tlv;
390dacd88d6SYuval Mintz };
391dacd88d6SYuval Mintz 
392dacd88d6SYuval Mintz struct vfpf_ucast_filter_tlv {
393dacd88d6SYuval Mintz 	struct vfpf_first_tlv first_tlv;
394dacd88d6SYuval Mintz 
395dacd88d6SYuval Mintz 	u8 opcode;
396dacd88d6SYuval Mintz 	u8 type;
397dacd88d6SYuval Mintz 
398dacd88d6SYuval Mintz 	u8 mac[ETH_ALEN];
399dacd88d6SYuval Mintz 
400dacd88d6SYuval Mintz 	u16 vlan;
401dacd88d6SYuval Mintz 	u16 padding[3];
402dacd88d6SYuval Mintz };
403dacd88d6SYuval Mintz 
40432a47e72SYuval Mintz struct tlv_buffer_size {
40532a47e72SYuval Mintz 	u8 tlv_buffer[TLV_BUFFER_SIZE];
40632a47e72SYuval Mintz };
40732a47e72SYuval Mintz 
40832a47e72SYuval Mintz union vfpf_tlvs {
40937bff2b9SYuval Mintz 	struct vfpf_first_tlv first_tlv;
4101408cc1fSYuval Mintz 	struct vfpf_acquire_tlv acquire;
411dacd88d6SYuval Mintz 	struct vfpf_start_rxq_tlv start_rxq;
412dacd88d6SYuval Mintz 	struct vfpf_start_txq_tlv start_txq;
413dacd88d6SYuval Mintz 	struct vfpf_stop_rxqs_tlv stop_rxqs;
414dacd88d6SYuval Mintz 	struct vfpf_stop_txqs_tlv stop_txqs;
41517b235c1SYuval Mintz 	struct vfpf_update_rxq_tlv update_rxq;
416dacd88d6SYuval Mintz 	struct vfpf_vport_start_tlv start_vport;
417dacd88d6SYuval Mintz 	struct vfpf_vport_update_tlv vport_update;
418dacd88d6SYuval Mintz 	struct vfpf_ucast_filter_tlv ucast_filter;
41937bff2b9SYuval Mintz 	struct channel_list_end_tlv list_end;
42032a47e72SYuval Mintz 	struct tlv_buffer_size tlv_buf_size;
42132a47e72SYuval Mintz };
42232a47e72SYuval Mintz 
42332a47e72SYuval Mintz union pfvf_tlvs {
42437bff2b9SYuval Mintz 	struct pfvf_def_resp_tlv default_resp;
4251408cc1fSYuval Mintz 	struct pfvf_acquire_resp_tlv acquire_resp;
42632a47e72SYuval Mintz 	struct tlv_buffer_size tlv_buf_size;
427dacd88d6SYuval Mintz 	struct pfvf_start_queue_resp_tlv queue_start;
42832a47e72SYuval Mintz };
42932a47e72SYuval Mintz 
43008feecd7SYuval Mintz enum qed_bulletin_bit {
431eff16960SYuval Mintz 	/* Alert the VF that a forced MAC was set by the PF */
432eff16960SYuval Mintz 	MAC_ADDR_FORCED = 0,
43308feecd7SYuval Mintz 	/* Alert the VF that a forced VLAN was set by the PF */
43408feecd7SYuval Mintz 	VLAN_ADDR_FORCED = 2,
43508feecd7SYuval Mintz 
43608feecd7SYuval Mintz 	/* Indicate that `default_only_untagged' contains actual data */
43708feecd7SYuval Mintz 	VFPF_BULLETIN_UNTAGGED_DEFAULT = 3,
43808feecd7SYuval Mintz 	VFPF_BULLETIN_UNTAGGED_DEFAULT_FORCED = 4,
43908feecd7SYuval Mintz 
440eff16960SYuval Mintz 	/* Alert the VF that suggested mac was sent by the PF.
441eff16960SYuval Mintz 	 * MAC_ADDR will be disabled in case MAC_ADDR_FORCED is set.
442eff16960SYuval Mintz 	 */
443eff16960SYuval Mintz 	VFPF_BULLETIN_MAC_ADDR = 5
44408feecd7SYuval Mintz };
44508feecd7SYuval Mintz 
44632a47e72SYuval Mintz struct qed_bulletin_content {
44732a47e72SYuval Mintz 	/* crc of structure to ensure is not in mid-update */
44832a47e72SYuval Mintz 	u32 crc;
44932a47e72SYuval Mintz 
45032a47e72SYuval Mintz 	u32 version;
45132a47e72SYuval Mintz 
45232a47e72SYuval Mintz 	/* bitmap indicating which fields hold valid values */
45332a47e72SYuval Mintz 	u64 valid_bitmap;
45436558c3dSYuval Mintz 
45536558c3dSYuval Mintz 	/* used for MAC_ADDR or MAC_ADDR_FORCED */
45636558c3dSYuval Mintz 	u8 mac[ETH_ALEN];
45736558c3dSYuval Mintz 
45836558c3dSYuval Mintz 	/* If valid, 1 => only untagged Rx if no vlan is configured */
45936558c3dSYuval Mintz 	u8 default_only_untagged;
46036558c3dSYuval Mintz 	u8 padding;
46136558c3dSYuval Mintz 
46236558c3dSYuval Mintz 	/* The following is a 'copy' of qed_mcp_link_state,
46336558c3dSYuval Mintz 	 * qed_mcp_link_params and qed_mcp_link_capabilities. Since it's
46436558c3dSYuval Mintz 	 * possible the structs will increase further along the road we cannot
46536558c3dSYuval Mintz 	 * have it here; Instead we need to have all of its fields.
46636558c3dSYuval Mintz 	 */
46736558c3dSYuval Mintz 	u8 req_autoneg;
46836558c3dSYuval Mintz 	u8 req_autoneg_pause;
46936558c3dSYuval Mintz 	u8 req_forced_rx;
47036558c3dSYuval Mintz 	u8 req_forced_tx;
47136558c3dSYuval Mintz 	u8 padding2[4];
47236558c3dSYuval Mintz 
47336558c3dSYuval Mintz 	u32 req_adv_speed;
47436558c3dSYuval Mintz 	u32 req_forced_speed;
47536558c3dSYuval Mintz 	u32 req_loopback;
47636558c3dSYuval Mintz 	u32 padding3;
47736558c3dSYuval Mintz 
47836558c3dSYuval Mintz 	u8 link_up;
47936558c3dSYuval Mintz 	u8 full_duplex;
48036558c3dSYuval Mintz 	u8 autoneg;
48136558c3dSYuval Mintz 	u8 autoneg_complete;
48236558c3dSYuval Mintz 	u8 parallel_detection;
48336558c3dSYuval Mintz 	u8 pfc_enabled;
48436558c3dSYuval Mintz 	u8 partner_tx_flow_ctrl_en;
48536558c3dSYuval Mintz 	u8 partner_rx_flow_ctrl_en;
48636558c3dSYuval Mintz 	u8 partner_adv_pause;
48736558c3dSYuval Mintz 	u8 sfp_tx_fault;
48836558c3dSYuval Mintz 	u8 padding4[6];
48936558c3dSYuval Mintz 
49036558c3dSYuval Mintz 	u32 speed;
49136558c3dSYuval Mintz 	u32 partner_adv_speed;
49236558c3dSYuval Mintz 
49336558c3dSYuval Mintz 	u32 capability_speed;
49408feecd7SYuval Mintz 
49508feecd7SYuval Mintz 	/* Forced vlan */
49608feecd7SYuval Mintz 	u16 pvid;
49708feecd7SYuval Mintz 	u16 padding5;
49832a47e72SYuval Mintz };
49932a47e72SYuval Mintz 
50032a47e72SYuval Mintz struct qed_bulletin {
50132a47e72SYuval Mintz 	dma_addr_t phys;
50232a47e72SYuval Mintz 	struct qed_bulletin_content *p_virt;
50332a47e72SYuval Mintz 	u32 size;
50432a47e72SYuval Mintz };
50532a47e72SYuval Mintz 
50637bff2b9SYuval Mintz enum {
50737bff2b9SYuval Mintz 	CHANNEL_TLV_NONE,	/* ends tlv sequence */
5081408cc1fSYuval Mintz 	CHANNEL_TLV_ACQUIRE,
509dacd88d6SYuval Mintz 	CHANNEL_TLV_VPORT_START,
510dacd88d6SYuval Mintz 	CHANNEL_TLV_VPORT_UPDATE,
511dacd88d6SYuval Mintz 	CHANNEL_TLV_VPORT_TEARDOWN,
512dacd88d6SYuval Mintz 	CHANNEL_TLV_START_RXQ,
513dacd88d6SYuval Mintz 	CHANNEL_TLV_START_TXQ,
514dacd88d6SYuval Mintz 	CHANNEL_TLV_STOP_RXQS,
515dacd88d6SYuval Mintz 	CHANNEL_TLV_STOP_TXQS,
51617b235c1SYuval Mintz 	CHANNEL_TLV_UPDATE_RXQ,
5170b55e27dSYuval Mintz 	CHANNEL_TLV_INT_CLEANUP,
5180b55e27dSYuval Mintz 	CHANNEL_TLV_CLOSE,
5190b55e27dSYuval Mintz 	CHANNEL_TLV_RELEASE,
52037bff2b9SYuval Mintz 	CHANNEL_TLV_LIST_END,
521dacd88d6SYuval Mintz 	CHANNEL_TLV_UCAST_FILTER,
522dacd88d6SYuval Mintz 	CHANNEL_TLV_VPORT_UPDATE_ACTIVATE,
52317b235c1SYuval Mintz 	CHANNEL_TLV_VPORT_UPDATE_TX_SWITCH,
52417b235c1SYuval Mintz 	CHANNEL_TLV_VPORT_UPDATE_VLAN_STRIP,
525dacd88d6SYuval Mintz 	CHANNEL_TLV_VPORT_UPDATE_MCAST,
526dacd88d6SYuval Mintz 	CHANNEL_TLV_VPORT_UPDATE_ACCEPT_PARAM,
527dacd88d6SYuval Mintz 	CHANNEL_TLV_VPORT_UPDATE_RSS,
52817b235c1SYuval Mintz 	CHANNEL_TLV_VPORT_UPDATE_ACCEPT_ANY_VLAN,
52917b235c1SYuval Mintz 	CHANNEL_TLV_VPORT_UPDATE_SGE_TPA,
530dacd88d6SYuval Mintz 	CHANNEL_TLV_MAX,
531dacd88d6SYuval Mintz 
532dacd88d6SYuval Mintz 	/* Required for iterating over vport-update tlvs.
533dacd88d6SYuval Mintz 	 * Will break in case non-sequential vport-update tlvs.
534dacd88d6SYuval Mintz 	 */
53517b235c1SYuval Mintz 	CHANNEL_TLV_VPORT_UPDATE_MAX = CHANNEL_TLV_VPORT_UPDATE_SGE_TPA + 1,
53637bff2b9SYuval Mintz };
53737bff2b9SYuval Mintz 
5381408cc1fSYuval Mintz /* This data is held in the qed_hwfn structure for VFs only. */
5391408cc1fSYuval Mintz struct qed_vf_iov {
5401408cc1fSYuval Mintz 	union vfpf_tlvs *vf2pf_request;
5411408cc1fSYuval Mintz 	dma_addr_t vf2pf_request_phys;
5421408cc1fSYuval Mintz 	union pfvf_tlvs *pf2vf_reply;
5431408cc1fSYuval Mintz 	dma_addr_t pf2vf_reply_phys;
5441408cc1fSYuval Mintz 
5451408cc1fSYuval Mintz 	/* Should be taken whenever the mailbox buffers are accessed */
5461408cc1fSYuval Mintz 	struct mutex mutex;
5471408cc1fSYuval Mintz 	u8 *offset;
5481408cc1fSYuval Mintz 
5491408cc1fSYuval Mintz 	/* Bulletin Board */
5501408cc1fSYuval Mintz 	struct qed_bulletin bulletin;
5511408cc1fSYuval Mintz 	struct qed_bulletin_content bulletin_shadow;
5521408cc1fSYuval Mintz 
5531408cc1fSYuval Mintz 	/* we set aside a copy of the acquire response */
5541408cc1fSYuval Mintz 	struct pfvf_acquire_resp_tlv acquire_resp;
555d8c2c7e3SYuval Mintz 
556d8c2c7e3SYuval Mintz 	/* In case PF originates prior to the fp-hsi version comparison,
557d8c2c7e3SYuval Mintz 	 * this has to be propagated as it affects the fastpath.
558d8c2c7e3SYuval Mintz 	 */
559d8c2c7e3SYuval Mintz 	bool b_pre_fp_hsi;
5601408cc1fSYuval Mintz };
5611408cc1fSYuval Mintz 
5621408cc1fSYuval Mintz #ifdef CONFIG_QED_SRIOV
5631408cc1fSYuval Mintz /**
56436558c3dSYuval Mintz  * @brief Read the VF bulletin and act on it if needed
56536558c3dSYuval Mintz  *
56636558c3dSYuval Mintz  * @param p_hwfn
56736558c3dSYuval Mintz  * @param p_change - qed fills 1 iff bulletin board has changed, 0 otherwise.
56836558c3dSYuval Mintz  *
56936558c3dSYuval Mintz  * @return enum _qed_status
57036558c3dSYuval Mintz  */
57136558c3dSYuval Mintz int qed_vf_read_bulletin(struct qed_hwfn *p_hwfn, u8 *p_change);
57236558c3dSYuval Mintz 
57336558c3dSYuval Mintz /**
57436558c3dSYuval Mintz  * @brief Get link paramters for VF from qed
57536558c3dSYuval Mintz  *
57636558c3dSYuval Mintz  * @param p_hwfn
57736558c3dSYuval Mintz  * @param params - the link params structure to be filled for the VF
57836558c3dSYuval Mintz  */
57936558c3dSYuval Mintz void qed_vf_get_link_params(struct qed_hwfn *p_hwfn,
58036558c3dSYuval Mintz 			    struct qed_mcp_link_params *params);
58136558c3dSYuval Mintz 
58236558c3dSYuval Mintz /**
58336558c3dSYuval Mintz  * @brief Get link state for VF from qed
58436558c3dSYuval Mintz  *
58536558c3dSYuval Mintz  * @param p_hwfn
58636558c3dSYuval Mintz  * @param link - the link state structure to be filled for the VF
58736558c3dSYuval Mintz  */
58836558c3dSYuval Mintz void qed_vf_get_link_state(struct qed_hwfn *p_hwfn,
58936558c3dSYuval Mintz 			   struct qed_mcp_link_state *link);
59036558c3dSYuval Mintz 
59136558c3dSYuval Mintz /**
59236558c3dSYuval Mintz  * @brief Get link capabilities for VF from qed
59336558c3dSYuval Mintz  *
59436558c3dSYuval Mintz  * @param p_hwfn
59536558c3dSYuval Mintz  * @param p_link_caps - the link capabilities structure to be filled for the VF
59636558c3dSYuval Mintz  */
59736558c3dSYuval Mintz void qed_vf_get_link_caps(struct qed_hwfn *p_hwfn,
59836558c3dSYuval Mintz 			  struct qed_mcp_link_capabilities *p_link_caps);
59936558c3dSYuval Mintz 
60036558c3dSYuval Mintz /**
6011408cc1fSYuval Mintz  * @brief Get number of Rx queues allocated for VF by qed
6021408cc1fSYuval Mintz  *
6031408cc1fSYuval Mintz  *  @param p_hwfn
6041408cc1fSYuval Mintz  *  @param num_rxqs - allocated RX queues
6051408cc1fSYuval Mintz  */
6061408cc1fSYuval Mintz void qed_vf_get_num_rxqs(struct qed_hwfn *p_hwfn, u8 *num_rxqs);
6071408cc1fSYuval Mintz 
6081408cc1fSYuval Mintz /**
6091408cc1fSYuval Mintz  * @brief Get port mac address for VF
6101408cc1fSYuval Mintz  *
6111408cc1fSYuval Mintz  * @param p_hwfn
6121408cc1fSYuval Mintz  * @param port_mac - destination location for port mac
6131408cc1fSYuval Mintz  */
6141408cc1fSYuval Mintz void qed_vf_get_port_mac(struct qed_hwfn *p_hwfn, u8 *port_mac);
6151408cc1fSYuval Mintz 
6161408cc1fSYuval Mintz /**
6171408cc1fSYuval Mintz  * @brief Get number of VLAN filters allocated for VF by qed
6181408cc1fSYuval Mintz  *
6191408cc1fSYuval Mintz  *  @param p_hwfn
6201408cc1fSYuval Mintz  *  @param num_rxqs - allocated VLAN filters
6211408cc1fSYuval Mintz  */
6221408cc1fSYuval Mintz void qed_vf_get_num_vlan_filters(struct qed_hwfn *p_hwfn,
6231408cc1fSYuval Mintz 				 u8 *num_vlan_filters);
6241408cc1fSYuval Mintz 
6251408cc1fSYuval Mintz /**
626b0fca312SMintz, Yuval  * @brief Get number of MAC filters allocated for VF by qed
627b0fca312SMintz, Yuval  *
628b0fca312SMintz, Yuval  *  @param p_hwfn
629b0fca312SMintz, Yuval  *  @param num_rxqs - allocated MAC filters
630b0fca312SMintz, Yuval  */
631b0fca312SMintz, Yuval void qed_vf_get_num_mac_filters(struct qed_hwfn *p_hwfn, u8 *num_mac_filters);
632b0fca312SMintz, Yuval 
633b0fca312SMintz, Yuval /**
634eff16960SYuval Mintz  * @brief Check if VF can set a MAC address
635eff16960SYuval Mintz  *
636eff16960SYuval Mintz  * @param p_hwfn
637eff16960SYuval Mintz  * @param mac
638eff16960SYuval Mintz  *
639eff16960SYuval Mintz  * @return bool
640eff16960SYuval Mintz  */
641eff16960SYuval Mintz bool qed_vf_check_mac(struct qed_hwfn *p_hwfn, u8 *mac);
642eff16960SYuval Mintz 
643eff16960SYuval Mintz /**
6441408cc1fSYuval Mintz  * @brief Set firmware version information in dev_info from VFs acquire response tlv
6451408cc1fSYuval Mintz  *
6461408cc1fSYuval Mintz  * @param p_hwfn
6471408cc1fSYuval Mintz  * @param fw_major
6481408cc1fSYuval Mintz  * @param fw_minor
6491408cc1fSYuval Mintz  * @param fw_rev
6501408cc1fSYuval Mintz  * @param fw_eng
6511408cc1fSYuval Mintz  */
6521408cc1fSYuval Mintz void qed_vf_get_fw_version(struct qed_hwfn *p_hwfn,
6531408cc1fSYuval Mintz 			   u16 *fw_major, u16 *fw_minor,
6541408cc1fSYuval Mintz 			   u16 *fw_rev, u16 *fw_eng);
6551408cc1fSYuval Mintz 
6561408cc1fSYuval Mintz /**
6571408cc1fSYuval Mintz  * @brief hw preparation for VF
6581408cc1fSYuval Mintz  *      sends ACQUIRE message
6591408cc1fSYuval Mintz  *
6601408cc1fSYuval Mintz  * @param p_hwfn
6611408cc1fSYuval Mintz  *
6621408cc1fSYuval Mintz  * @return int
6631408cc1fSYuval Mintz  */
6641408cc1fSYuval Mintz int qed_vf_hw_prepare(struct qed_hwfn *p_hwfn);
6651408cc1fSYuval Mintz 
6661408cc1fSYuval Mintz /**
667dacd88d6SYuval Mintz  * @brief VF - start the RX Queue by sending a message to the PF
668dacd88d6SYuval Mintz  * @param p_hwfn
669dacd88d6SYuval Mintz  * @param cid                   - zero based within the VF
670dacd88d6SYuval Mintz  * @param rx_queue_id           - zero based within the VF
671dacd88d6SYuval Mintz  * @param sb                    - VF status block for this queue
672dacd88d6SYuval Mintz  * @param sb_index              - Index within the status block
673dacd88d6SYuval Mintz  * @param bd_max_bytes          - maximum number of bytes per bd
674dacd88d6SYuval Mintz  * @param bd_chain_phys_addr    - physical address of bd chain
675dacd88d6SYuval Mintz  * @param cqe_pbl_addr          - physical address of pbl
676dacd88d6SYuval Mintz  * @param cqe_pbl_size          - pbl size
677dacd88d6SYuval Mintz  * @param pp_prod               - pointer to the producer to be
678dacd88d6SYuval Mintz  *				  used in fastpath
679dacd88d6SYuval Mintz  *
680dacd88d6SYuval Mintz  * @return int
681dacd88d6SYuval Mintz  */
682dacd88d6SYuval Mintz int qed_vf_pf_rxq_start(struct qed_hwfn *p_hwfn,
683dacd88d6SYuval Mintz 			u8 rx_queue_id,
684dacd88d6SYuval Mintz 			u16 sb,
685dacd88d6SYuval Mintz 			u8 sb_index,
686dacd88d6SYuval Mintz 			u16 bd_max_bytes,
687dacd88d6SYuval Mintz 			dma_addr_t bd_chain_phys_addr,
688dacd88d6SYuval Mintz 			dma_addr_t cqe_pbl_addr,
689dacd88d6SYuval Mintz 			u16 cqe_pbl_size, void __iomem **pp_prod);
690dacd88d6SYuval Mintz 
691dacd88d6SYuval Mintz /**
692dacd88d6SYuval Mintz  * @brief VF - start the TX queue by sending a message to the
693dacd88d6SYuval Mintz  *        PF.
694dacd88d6SYuval Mintz  *
695dacd88d6SYuval Mintz  * @param p_hwfn
696dacd88d6SYuval Mintz  * @param tx_queue_id           - zero based within the VF
697dacd88d6SYuval Mintz  * @param sb                    - status block for this queue
698dacd88d6SYuval Mintz  * @param sb_index              - index within the status block
699dacd88d6SYuval Mintz  * @param bd_chain_phys_addr    - physical address of tx chain
700dacd88d6SYuval Mintz  * @param pp_doorbell           - pointer to address to which to
701dacd88d6SYuval Mintz  *                      write the doorbell too..
702dacd88d6SYuval Mintz  *
703dacd88d6SYuval Mintz  * @return int
704dacd88d6SYuval Mintz  */
705dacd88d6SYuval Mintz int qed_vf_pf_txq_start(struct qed_hwfn *p_hwfn,
706dacd88d6SYuval Mintz 			u16 tx_queue_id,
707dacd88d6SYuval Mintz 			u16 sb,
708dacd88d6SYuval Mintz 			u8 sb_index,
709dacd88d6SYuval Mintz 			dma_addr_t pbl_addr,
710dacd88d6SYuval Mintz 			u16 pbl_size, void __iomem **pp_doorbell);
711dacd88d6SYuval Mintz 
712dacd88d6SYuval Mintz /**
713dacd88d6SYuval Mintz  * @brief VF - stop the RX queue by sending a message to the PF
714dacd88d6SYuval Mintz  *
715dacd88d6SYuval Mintz  * @param p_hwfn
716dacd88d6SYuval Mintz  * @param rx_qid
717dacd88d6SYuval Mintz  * @param cqe_completion
718dacd88d6SYuval Mintz  *
719dacd88d6SYuval Mintz  * @return int
720dacd88d6SYuval Mintz  */
721dacd88d6SYuval Mintz int qed_vf_pf_rxq_stop(struct qed_hwfn *p_hwfn,
722dacd88d6SYuval Mintz 		       u16 rx_qid, bool cqe_completion);
723dacd88d6SYuval Mintz 
724dacd88d6SYuval Mintz /**
725dacd88d6SYuval Mintz  * @brief VF - stop the TX queue by sending a message to the PF
726dacd88d6SYuval Mintz  *
727dacd88d6SYuval Mintz  * @param p_hwfn
728dacd88d6SYuval Mintz  * @param tx_qid
729dacd88d6SYuval Mintz  *
730dacd88d6SYuval Mintz  * @return int
731dacd88d6SYuval Mintz  */
732dacd88d6SYuval Mintz int qed_vf_pf_txq_stop(struct qed_hwfn *p_hwfn, u16 tx_qid);
733dacd88d6SYuval Mintz 
734dacd88d6SYuval Mintz /**
735dacd88d6SYuval Mintz  * @brief VF - send a vport update command
736dacd88d6SYuval Mintz  *
737dacd88d6SYuval Mintz  * @param p_hwfn
738dacd88d6SYuval Mintz  * @param params
739dacd88d6SYuval Mintz  *
740dacd88d6SYuval Mintz  * @return int
741dacd88d6SYuval Mintz  */
742dacd88d6SYuval Mintz int qed_vf_pf_vport_update(struct qed_hwfn *p_hwfn,
743dacd88d6SYuval Mintz 			   struct qed_sp_vport_update_params *p_params);
744dacd88d6SYuval Mintz 
745dacd88d6SYuval Mintz /**
7460b55e27dSYuval Mintz  *
7470b55e27dSYuval Mintz  * @brief VF - send a close message to PF
7480b55e27dSYuval Mintz  *
7490b55e27dSYuval Mintz  * @param p_hwfn
7500b55e27dSYuval Mintz  *
7510b55e27dSYuval Mintz  * @return enum _qed_status
7520b55e27dSYuval Mintz  */
7530b55e27dSYuval Mintz int qed_vf_pf_reset(struct qed_hwfn *p_hwfn);
7540b55e27dSYuval Mintz 
7550b55e27dSYuval Mintz /**
7560b55e27dSYuval Mintz  * @brief VF - free vf`s memories
7570b55e27dSYuval Mintz  *
7580b55e27dSYuval Mintz  * @param p_hwfn
7590b55e27dSYuval Mintz  *
7600b55e27dSYuval Mintz  * @return enum _qed_status
7610b55e27dSYuval Mintz  */
7620b55e27dSYuval Mintz int qed_vf_pf_release(struct qed_hwfn *p_hwfn);
76336558c3dSYuval Mintz 
7640b55e27dSYuval Mintz /**
7651408cc1fSYuval Mintz  * @brief qed_vf_get_igu_sb_id - Get the IGU SB ID for a given
7661408cc1fSYuval Mintz  *        sb_id. For VFs igu sbs don't have to be contiguous
7671408cc1fSYuval Mintz  *
7681408cc1fSYuval Mintz  * @param p_hwfn
7691408cc1fSYuval Mintz  * @param sb_id
7701408cc1fSYuval Mintz  *
7711408cc1fSYuval Mintz  * @return INLINE u16
7721408cc1fSYuval Mintz  */
7731408cc1fSYuval Mintz u16 qed_vf_get_igu_sb_id(struct qed_hwfn *p_hwfn, u16 sb_id);
7740b55e27dSYuval Mintz 
7750b55e27dSYuval Mintz /**
776dacd88d6SYuval Mintz  * @brief qed_vf_pf_vport_start - perform vport start for VF.
777dacd88d6SYuval Mintz  *
778dacd88d6SYuval Mintz  * @param p_hwfn
779dacd88d6SYuval Mintz  * @param vport_id
780dacd88d6SYuval Mintz  * @param mtu
781dacd88d6SYuval Mintz  * @param inner_vlan_removal
782dacd88d6SYuval Mintz  * @param tpa_mode
783dacd88d6SYuval Mintz  * @param max_buffers_per_cqe,
784dacd88d6SYuval Mintz  * @param only_untagged - default behavior regarding vlan acceptance
785dacd88d6SYuval Mintz  *
786dacd88d6SYuval Mintz  * @return enum _qed_status
787dacd88d6SYuval Mintz  */
788dacd88d6SYuval Mintz int qed_vf_pf_vport_start(struct qed_hwfn *p_hwfn,
789dacd88d6SYuval Mintz 			  u8 vport_id,
790dacd88d6SYuval Mintz 			  u16 mtu,
791dacd88d6SYuval Mintz 			  u8 inner_vlan_removal,
792dacd88d6SYuval Mintz 			  enum qed_tpa_mode tpa_mode,
79308feecd7SYuval Mintz 			  u8 max_buffers_per_cqe, u8 only_untagged);
794dacd88d6SYuval Mintz 
795dacd88d6SYuval Mintz /**
796dacd88d6SYuval Mintz  * @brief qed_vf_pf_vport_stop - stop the VF's vport
797dacd88d6SYuval Mintz  *
798dacd88d6SYuval Mintz  * @param p_hwfn
799dacd88d6SYuval Mintz  *
800dacd88d6SYuval Mintz  * @return enum _qed_status
801dacd88d6SYuval Mintz  */
802dacd88d6SYuval Mintz int qed_vf_pf_vport_stop(struct qed_hwfn *p_hwfn);
803dacd88d6SYuval Mintz 
804dacd88d6SYuval Mintz int qed_vf_pf_filter_ucast(struct qed_hwfn *p_hwfn,
805dacd88d6SYuval Mintz 			   struct qed_filter_ucast *p_param);
806dacd88d6SYuval Mintz 
807dacd88d6SYuval Mintz void qed_vf_pf_filter_mcast(struct qed_hwfn *p_hwfn,
808dacd88d6SYuval Mintz 			    struct qed_filter_mcast *p_filter_cmd);
809dacd88d6SYuval Mintz 
810dacd88d6SYuval Mintz /**
8110b55e27dSYuval Mintz  * @brief qed_vf_pf_int_cleanup - clean the SB of the VF
8120b55e27dSYuval Mintz  *
8130b55e27dSYuval Mintz  * @param p_hwfn
8140b55e27dSYuval Mintz  *
8150b55e27dSYuval Mintz  * @return enum _qed_status
8160b55e27dSYuval Mintz  */
8170b55e27dSYuval Mintz int qed_vf_pf_int_cleanup(struct qed_hwfn *p_hwfn);
81836558c3dSYuval Mintz 
81936558c3dSYuval Mintz /**
82036558c3dSYuval Mintz  * @brief - return the link params in a given bulletin board
82136558c3dSYuval Mintz  *
82236558c3dSYuval Mintz  * @param p_hwfn
82336558c3dSYuval Mintz  * @param p_params - pointer to a struct to fill with link params
82436558c3dSYuval Mintz  * @param p_bulletin
82536558c3dSYuval Mintz  */
82636558c3dSYuval Mintz void __qed_vf_get_link_params(struct qed_hwfn *p_hwfn,
82736558c3dSYuval Mintz 			      struct qed_mcp_link_params *p_params,
82836558c3dSYuval Mintz 			      struct qed_bulletin_content *p_bulletin);
82936558c3dSYuval Mintz 
83036558c3dSYuval Mintz /**
83136558c3dSYuval Mintz  * @brief - return the link state in a given bulletin board
83236558c3dSYuval Mintz  *
83336558c3dSYuval Mintz  * @param p_hwfn
83436558c3dSYuval Mintz  * @param p_link - pointer to a struct to fill with link state
83536558c3dSYuval Mintz  * @param p_bulletin
83636558c3dSYuval Mintz  */
83736558c3dSYuval Mintz void __qed_vf_get_link_state(struct qed_hwfn *p_hwfn,
83836558c3dSYuval Mintz 			     struct qed_mcp_link_state *p_link,
83936558c3dSYuval Mintz 			     struct qed_bulletin_content *p_bulletin);
84036558c3dSYuval Mintz 
84136558c3dSYuval Mintz /**
84236558c3dSYuval Mintz  * @brief - return the link capabilities in a given bulletin board
84336558c3dSYuval Mintz  *
84436558c3dSYuval Mintz  * @param p_hwfn
84536558c3dSYuval Mintz  * @param p_link - pointer to a struct to fill with link capabilities
84636558c3dSYuval Mintz  * @param p_bulletin
84736558c3dSYuval Mintz  */
84836558c3dSYuval Mintz void __qed_vf_get_link_caps(struct qed_hwfn *p_hwfn,
84936558c3dSYuval Mintz 			    struct qed_mcp_link_capabilities *p_link_caps,
85036558c3dSYuval Mintz 			    struct qed_bulletin_content *p_bulletin);
85136558c3dSYuval Mintz 
85236558c3dSYuval Mintz void qed_iov_vf_task(struct work_struct *work);
8531408cc1fSYuval Mintz #else
85436558c3dSYuval Mintz static inline void qed_vf_get_link_params(struct qed_hwfn *p_hwfn,
85536558c3dSYuval Mintz 					  struct qed_mcp_link_params *params)
85636558c3dSYuval Mintz {
85736558c3dSYuval Mintz }
85836558c3dSYuval Mintz 
85936558c3dSYuval Mintz static inline void qed_vf_get_link_state(struct qed_hwfn *p_hwfn,
86036558c3dSYuval Mintz 					 struct qed_mcp_link_state *link)
86136558c3dSYuval Mintz {
86236558c3dSYuval Mintz }
86336558c3dSYuval Mintz 
86436558c3dSYuval Mintz static inline void
86536558c3dSYuval Mintz qed_vf_get_link_caps(struct qed_hwfn *p_hwfn,
86636558c3dSYuval Mintz 		     struct qed_mcp_link_capabilities *p_link_caps)
86736558c3dSYuval Mintz {
86836558c3dSYuval Mintz }
86936558c3dSYuval Mintz 
8701408cc1fSYuval Mintz static inline void qed_vf_get_num_rxqs(struct qed_hwfn *p_hwfn, u8 *num_rxqs)
8711408cc1fSYuval Mintz {
8721408cc1fSYuval Mintz }
8731408cc1fSYuval Mintz 
8741408cc1fSYuval Mintz static inline void qed_vf_get_port_mac(struct qed_hwfn *p_hwfn, u8 *port_mac)
8751408cc1fSYuval Mintz {
8761408cc1fSYuval Mintz }
8771408cc1fSYuval Mintz 
8781408cc1fSYuval Mintz static inline void qed_vf_get_num_vlan_filters(struct qed_hwfn *p_hwfn,
8791408cc1fSYuval Mintz 					       u8 *num_vlan_filters)
8801408cc1fSYuval Mintz {
8811408cc1fSYuval Mintz }
8821408cc1fSYuval Mintz 
883b0fca312SMintz, Yuval static inline void qed_vf_get_num_mac_filters(struct qed_hwfn *p_hwfn,
884b0fca312SMintz, Yuval 					      u8 *num_mac_filters)
885b0fca312SMintz, Yuval {
886b0fca312SMintz, Yuval }
887b0fca312SMintz, Yuval 
888eff16960SYuval Mintz static inline bool qed_vf_check_mac(struct qed_hwfn *p_hwfn, u8 *mac)
889eff16960SYuval Mintz {
890eff16960SYuval Mintz 	return false;
891eff16960SYuval Mintz }
892eff16960SYuval Mintz 
8931408cc1fSYuval Mintz static inline void qed_vf_get_fw_version(struct qed_hwfn *p_hwfn,
8941408cc1fSYuval Mintz 					 u16 *fw_major, u16 *fw_minor,
8951408cc1fSYuval Mintz 					 u16 *fw_rev, u16 *fw_eng)
8961408cc1fSYuval Mintz {
8971408cc1fSYuval Mintz }
8981408cc1fSYuval Mintz 
8991408cc1fSYuval Mintz static inline int qed_vf_hw_prepare(struct qed_hwfn *p_hwfn)
9001408cc1fSYuval Mintz {
9011408cc1fSYuval Mintz 	return -EINVAL;
9021408cc1fSYuval Mintz }
9031408cc1fSYuval Mintz 
904dacd88d6SYuval Mintz static inline int qed_vf_pf_rxq_start(struct qed_hwfn *p_hwfn,
905dacd88d6SYuval Mintz 				      u8 rx_queue_id,
906dacd88d6SYuval Mintz 				      u16 sb,
907dacd88d6SYuval Mintz 				      u8 sb_index,
908dacd88d6SYuval Mintz 				      u16 bd_max_bytes,
909dacd88d6SYuval Mintz 				      dma_addr_t bd_chain_phys_adr,
910dacd88d6SYuval Mintz 				      dma_addr_t cqe_pbl_addr,
911dacd88d6SYuval Mintz 				      u16 cqe_pbl_size, void __iomem **pp_prod)
912dacd88d6SYuval Mintz {
913dacd88d6SYuval Mintz 	return -EINVAL;
914dacd88d6SYuval Mintz }
915dacd88d6SYuval Mintz 
916dacd88d6SYuval Mintz static inline int qed_vf_pf_txq_start(struct qed_hwfn *p_hwfn,
917dacd88d6SYuval Mintz 				      u16 tx_queue_id,
918dacd88d6SYuval Mintz 				      u16 sb,
919dacd88d6SYuval Mintz 				      u8 sb_index,
920dacd88d6SYuval Mintz 				      dma_addr_t pbl_addr,
921dacd88d6SYuval Mintz 				      u16 pbl_size, void __iomem **pp_doorbell)
922dacd88d6SYuval Mintz {
923dacd88d6SYuval Mintz 	return -EINVAL;
924dacd88d6SYuval Mintz }
925dacd88d6SYuval Mintz 
926dacd88d6SYuval Mintz static inline int qed_vf_pf_rxq_stop(struct qed_hwfn *p_hwfn,
927dacd88d6SYuval Mintz 				     u16 rx_qid, bool cqe_completion)
928dacd88d6SYuval Mintz {
929dacd88d6SYuval Mintz 	return -EINVAL;
930dacd88d6SYuval Mintz }
931dacd88d6SYuval Mintz 
932dacd88d6SYuval Mintz static inline int qed_vf_pf_txq_stop(struct qed_hwfn *p_hwfn, u16 tx_qid)
933dacd88d6SYuval Mintz {
934dacd88d6SYuval Mintz 	return -EINVAL;
935dacd88d6SYuval Mintz }
936dacd88d6SYuval Mintz 
937dacd88d6SYuval Mintz static inline int
938dacd88d6SYuval Mintz qed_vf_pf_vport_update(struct qed_hwfn *p_hwfn,
939dacd88d6SYuval Mintz 		       struct qed_sp_vport_update_params *p_params)
940dacd88d6SYuval Mintz {
941dacd88d6SYuval Mintz 	return -EINVAL;
942dacd88d6SYuval Mintz }
943dacd88d6SYuval Mintz 
9440b55e27dSYuval Mintz static inline int qed_vf_pf_reset(struct qed_hwfn *p_hwfn)
9450b55e27dSYuval Mintz {
9460b55e27dSYuval Mintz 	return -EINVAL;
9470b55e27dSYuval Mintz }
9480b55e27dSYuval Mintz 
9490b55e27dSYuval Mintz static inline int qed_vf_pf_release(struct qed_hwfn *p_hwfn)
9500b55e27dSYuval Mintz {
9510b55e27dSYuval Mintz 	return -EINVAL;
9520b55e27dSYuval Mintz }
9530b55e27dSYuval Mintz 
9541408cc1fSYuval Mintz static inline u16 qed_vf_get_igu_sb_id(struct qed_hwfn *p_hwfn, u16 sb_id)
9551408cc1fSYuval Mintz {
9561408cc1fSYuval Mintz 	return 0;
9571408cc1fSYuval Mintz }
9580b55e27dSYuval Mintz 
959dacd88d6SYuval Mintz static inline int qed_vf_pf_vport_start(struct qed_hwfn *p_hwfn,
960dacd88d6SYuval Mintz 					u8 vport_id,
961dacd88d6SYuval Mintz 					u16 mtu,
962dacd88d6SYuval Mintz 					u8 inner_vlan_removal,
963dacd88d6SYuval Mintz 					enum qed_tpa_mode tpa_mode,
96408feecd7SYuval Mintz 					u8 max_buffers_per_cqe,
96508feecd7SYuval Mintz 					u8 only_untagged)
966dacd88d6SYuval Mintz {
967dacd88d6SYuval Mintz 	return -EINVAL;
968dacd88d6SYuval Mintz }
969dacd88d6SYuval Mintz 
970dacd88d6SYuval Mintz static inline int qed_vf_pf_vport_stop(struct qed_hwfn *p_hwfn)
971dacd88d6SYuval Mintz {
972dacd88d6SYuval Mintz 	return -EINVAL;
973dacd88d6SYuval Mintz }
974dacd88d6SYuval Mintz 
975dacd88d6SYuval Mintz static inline int qed_vf_pf_filter_ucast(struct qed_hwfn *p_hwfn,
976dacd88d6SYuval Mintz 					 struct qed_filter_ucast *p_param)
977dacd88d6SYuval Mintz {
978dacd88d6SYuval Mintz 	return -EINVAL;
979dacd88d6SYuval Mintz }
980dacd88d6SYuval Mintz 
981dacd88d6SYuval Mintz static inline void qed_vf_pf_filter_mcast(struct qed_hwfn *p_hwfn,
982dacd88d6SYuval Mintz 					  struct qed_filter_mcast *p_filter_cmd)
983dacd88d6SYuval Mintz {
984dacd88d6SYuval Mintz }
985dacd88d6SYuval Mintz 
9860b55e27dSYuval Mintz static inline int qed_vf_pf_int_cleanup(struct qed_hwfn *p_hwfn)
9870b55e27dSYuval Mintz {
9880b55e27dSYuval Mintz 	return -EINVAL;
9890b55e27dSYuval Mintz }
99036558c3dSYuval Mintz 
99136558c3dSYuval Mintz static inline void __qed_vf_get_link_params(struct qed_hwfn *p_hwfn,
99236558c3dSYuval Mintz 					    struct qed_mcp_link_params
99336558c3dSYuval Mintz 					    *p_params,
99436558c3dSYuval Mintz 					    struct qed_bulletin_content
99536558c3dSYuval Mintz 					    *p_bulletin)
99636558c3dSYuval Mintz {
99736558c3dSYuval Mintz }
99836558c3dSYuval Mintz 
99936558c3dSYuval Mintz static inline void __qed_vf_get_link_state(struct qed_hwfn *p_hwfn,
100036558c3dSYuval Mintz 					   struct qed_mcp_link_state *p_link,
100136558c3dSYuval Mintz 					   struct qed_bulletin_content
100236558c3dSYuval Mintz 					   *p_bulletin)
100336558c3dSYuval Mintz {
100436558c3dSYuval Mintz }
100536558c3dSYuval Mintz 
100636558c3dSYuval Mintz static inline void
100736558c3dSYuval Mintz __qed_vf_get_link_caps(struct qed_hwfn *p_hwfn,
100836558c3dSYuval Mintz 		       struct qed_mcp_link_capabilities *p_link_caps,
100936558c3dSYuval Mintz 		       struct qed_bulletin_content *p_bulletin)
101036558c3dSYuval Mintz {
101136558c3dSYuval Mintz }
101236558c3dSYuval Mintz 
101336558c3dSYuval Mintz static inline void qed_iov_vf_task(struct work_struct *work)
101436558c3dSYuval Mintz {
101536558c3dSYuval Mintz }
10161408cc1fSYuval Mintz #endif
10171408cc1fSYuval Mintz 
101832a47e72SYuval Mintz #endif
1019