132a47e72SYuval Mintz /* QLogic qed NIC Driver
2e8f1cb50SMintz, Yuval  * Copyright (c) 2015-2017  QLogic Corporation
332a47e72SYuval Mintz  *
4e8f1cb50SMintz, Yuval  * This software is available to you under a choice of one of two
5e8f1cb50SMintz, Yuval  * licenses.  You may choose to be licensed under the terms of the GNU
6e8f1cb50SMintz, Yuval  * General Public License (GPL) Version 2, available from the file
7e8f1cb50SMintz, Yuval  * COPYING in the main directory of this source tree, or the
8e8f1cb50SMintz, Yuval  * OpenIB.org BSD license below:
9e8f1cb50SMintz, Yuval  *
10e8f1cb50SMintz, Yuval  *     Redistribution and use in source and binary forms, with or
11e8f1cb50SMintz, Yuval  *     without modification, are permitted provided that the following
12e8f1cb50SMintz, Yuval  *     conditions are met:
13e8f1cb50SMintz, Yuval  *
14e8f1cb50SMintz, Yuval  *      - Redistributions of source code must retain the above
15e8f1cb50SMintz, Yuval  *        copyright notice, this list of conditions and the following
16e8f1cb50SMintz, Yuval  *        disclaimer.
17e8f1cb50SMintz, Yuval  *
18e8f1cb50SMintz, Yuval  *      - Redistributions in binary form must reproduce the above
19e8f1cb50SMintz, Yuval  *        copyright notice, this list of conditions and the following
20e8f1cb50SMintz, Yuval  *        disclaimer in the documentation and /or other materials
21e8f1cb50SMintz, Yuval  *        provided with the distribution.
22e8f1cb50SMintz, Yuval  *
23e8f1cb50SMintz, Yuval  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24e8f1cb50SMintz, Yuval  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25e8f1cb50SMintz, Yuval  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26e8f1cb50SMintz, Yuval  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27e8f1cb50SMintz, Yuval  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28e8f1cb50SMintz, Yuval  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29e8f1cb50SMintz, Yuval  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30e8f1cb50SMintz, Yuval  * SOFTWARE.
3132a47e72SYuval Mintz  */
3232a47e72SYuval Mintz 
3332a47e72SYuval Mintz #ifndef _QED_VF_H
3432a47e72SYuval Mintz #define _QED_VF_H
3532a47e72SYuval Mintz 
36dacd88d6SYuval Mintz #include "qed_l2.h"
3736558c3dSYuval Mintz #include "qed_mcp.h"
38dacd88d6SYuval Mintz 
39dacd88d6SYuval Mintz #define T_ETH_INDIRECTION_TABLE_SIZE 128
40dacd88d6SYuval Mintz #define T_ETH_RSS_KEY_SIZE 10
41dacd88d6SYuval Mintz 
421408cc1fSYuval Mintz struct vf_pf_resc_request {
431408cc1fSYuval Mintz 	u8 num_rxqs;
441408cc1fSYuval Mintz 	u8 num_txqs;
451408cc1fSYuval Mintz 	u8 num_sbs;
461408cc1fSYuval Mintz 	u8 num_mac_filters;
471408cc1fSYuval Mintz 	u8 num_vlan_filters;
481408cc1fSYuval Mintz 	u8 num_mc_filters;
491408cc1fSYuval Mintz 	u16 padding;
501408cc1fSYuval Mintz };
511408cc1fSYuval Mintz 
521408cc1fSYuval Mintz struct hw_sb_info {
531408cc1fSYuval Mintz 	u16 hw_sb_id;
541408cc1fSYuval Mintz 	u8 sb_qid;
551408cc1fSYuval Mintz 	u8 padding[5];
561408cc1fSYuval Mintz };
571408cc1fSYuval Mintz 
58dacd88d6SYuval Mintz #define TLV_BUFFER_SIZE                 1024
59dacd88d6SYuval Mintz 
6037bff2b9SYuval Mintz enum {
6137bff2b9SYuval Mintz 	PFVF_STATUS_WAITING,
6237bff2b9SYuval Mintz 	PFVF_STATUS_SUCCESS,
6337bff2b9SYuval Mintz 	PFVF_STATUS_FAILURE,
6437bff2b9SYuval Mintz 	PFVF_STATUS_NOT_SUPPORTED,
6537bff2b9SYuval Mintz 	PFVF_STATUS_NO_RESOURCE,
6637bff2b9SYuval Mintz 	PFVF_STATUS_FORCED,
677eff82b0SYuval Mintz 	PFVF_STATUS_MALICIOUS,
6837bff2b9SYuval Mintz };
6937bff2b9SYuval Mintz 
7037bff2b9SYuval Mintz /* vf pf channel tlvs */
7137bff2b9SYuval Mintz /* general tlv header (used for both vf->pf request and pf->vf response) */
7237bff2b9SYuval Mintz struct channel_tlv {
7337bff2b9SYuval Mintz 	u16 type;
7437bff2b9SYuval Mintz 	u16 length;
7537bff2b9SYuval Mintz };
7637bff2b9SYuval Mintz 
7737bff2b9SYuval Mintz /* header of first vf->pf tlv carries the offset used to calculate reponse
7837bff2b9SYuval Mintz  * buffer address
7937bff2b9SYuval Mintz  */
8037bff2b9SYuval Mintz struct vfpf_first_tlv {
8137bff2b9SYuval Mintz 	struct channel_tlv tl;
8237bff2b9SYuval Mintz 	u32 padding;
8337bff2b9SYuval Mintz 	u64 reply_address;
8437bff2b9SYuval Mintz };
8537bff2b9SYuval Mintz 
8637bff2b9SYuval Mintz /* header of pf->vf tlvs, carries the status of handling the request */
8737bff2b9SYuval Mintz struct pfvf_tlv {
8837bff2b9SYuval Mintz 	struct channel_tlv tl;
8937bff2b9SYuval Mintz 	u8 status;
9037bff2b9SYuval Mintz 	u8 padding[3];
9137bff2b9SYuval Mintz };
9237bff2b9SYuval Mintz 
9337bff2b9SYuval Mintz /* response tlv used for most tlvs */
9437bff2b9SYuval Mintz struct pfvf_def_resp_tlv {
9537bff2b9SYuval Mintz 	struct pfvf_tlv hdr;
9637bff2b9SYuval Mintz };
9737bff2b9SYuval Mintz 
9837bff2b9SYuval Mintz /* used to terminate and pad a tlv list */
9937bff2b9SYuval Mintz struct channel_list_end_tlv {
10037bff2b9SYuval Mintz 	struct channel_tlv tl;
10137bff2b9SYuval Mintz 	u8 padding[4];
10237bff2b9SYuval Mintz };
10337bff2b9SYuval Mintz 
1041408cc1fSYuval Mintz #define VFPF_ACQUIRE_OS_LINUX (0)
1051408cc1fSYuval Mintz #define VFPF_ACQUIRE_OS_WINDOWS (1)
1061408cc1fSYuval Mintz #define VFPF_ACQUIRE_OS_ESX (2)
1071408cc1fSYuval Mintz #define VFPF_ACQUIRE_OS_SOLARIS (3)
1081408cc1fSYuval Mintz #define VFPF_ACQUIRE_OS_LINUX_USERSPACE (4)
1091408cc1fSYuval Mintz 
1101408cc1fSYuval Mintz struct vfpf_acquire_tlv {
1111408cc1fSYuval Mintz 	struct vfpf_first_tlv first_tlv;
1121408cc1fSYuval Mintz 
1131408cc1fSYuval Mintz 	struct vf_pf_vfdev_info {
114a044df83SYuval Mintz #define VFPF_ACQUIRE_CAP_PRE_FP_HSI     (1 << 0) /* VF pre-FP hsi version */
1151408cc1fSYuval Mintz #define VFPF_ACQUIRE_CAP_100G		(1 << 1) /* VF can support 100g */
1161408cc1fSYuval Mintz 		u64 capabilities;
1171408cc1fSYuval Mintz 		u8 fw_major;
1181408cc1fSYuval Mintz 		u8 fw_minor;
1191408cc1fSYuval Mintz 		u8 fw_revision;
1201408cc1fSYuval Mintz 		u8 fw_engineering;
1211408cc1fSYuval Mintz 		u32 driver_version;
1221408cc1fSYuval Mintz 		u16 opaque_fid;	/* ME register value */
1231408cc1fSYuval Mintz 		u8 os_type;	/* VFPF_ACQUIRE_OS_* value */
1241fe614d1SYuval Mintz 		u8 eth_fp_hsi_major;
1251fe614d1SYuval Mintz 		u8 eth_fp_hsi_minor;
1261fe614d1SYuval Mintz 		u8 padding[3];
1271408cc1fSYuval Mintz 	} vfdev_info;
1281408cc1fSYuval Mintz 
1291408cc1fSYuval Mintz 	struct vf_pf_resc_request resc_request;
1301408cc1fSYuval Mintz 
1311408cc1fSYuval Mintz 	u64 bulletin_addr;
1321408cc1fSYuval Mintz 	u32 bulletin_size;
1331408cc1fSYuval Mintz 	u32 padding;
1341408cc1fSYuval Mintz };
1351408cc1fSYuval Mintz 
136dacd88d6SYuval Mintz /* receive side scaling tlv */
137dacd88d6SYuval Mintz struct vfpf_vport_update_rss_tlv {
138dacd88d6SYuval Mintz 	struct channel_tlv tl;
139dacd88d6SYuval Mintz 
140dacd88d6SYuval Mintz 	u8 update_rss_flags;
141dacd88d6SYuval Mintz #define VFPF_UPDATE_RSS_CONFIG_FLAG       BIT(0)
142dacd88d6SYuval Mintz #define VFPF_UPDATE_RSS_CAPS_FLAG         BIT(1)
143dacd88d6SYuval Mintz #define VFPF_UPDATE_RSS_IND_TABLE_FLAG    BIT(2)
144dacd88d6SYuval Mintz #define VFPF_UPDATE_RSS_KEY_FLAG          BIT(3)
145dacd88d6SYuval Mintz 
146dacd88d6SYuval Mintz 	u8 rss_enable;
147dacd88d6SYuval Mintz 	u8 rss_caps;
148dacd88d6SYuval Mintz 	u8 rss_table_size_log;	/* The table size is 2 ^ rss_table_size_log */
149dacd88d6SYuval Mintz 	u16 rss_ind_table[T_ETH_INDIRECTION_TABLE_SIZE];
150dacd88d6SYuval Mintz 	u32 rss_key[T_ETH_RSS_KEY_SIZE];
151dacd88d6SYuval Mintz };
152dacd88d6SYuval Mintz 
1531408cc1fSYuval Mintz struct pfvf_storm_stats {
1541408cc1fSYuval Mintz 	u32 address;
1551408cc1fSYuval Mintz 	u32 len;
1561408cc1fSYuval Mintz };
1571408cc1fSYuval Mintz 
1581408cc1fSYuval Mintz struct pfvf_stats_info {
1591408cc1fSYuval Mintz 	struct pfvf_storm_stats mstats;
1601408cc1fSYuval Mintz 	struct pfvf_storm_stats pstats;
1611408cc1fSYuval Mintz 	struct pfvf_storm_stats tstats;
1621408cc1fSYuval Mintz 	struct pfvf_storm_stats ustats;
1631408cc1fSYuval Mintz };
1641408cc1fSYuval Mintz 
1651408cc1fSYuval Mintz struct pfvf_acquire_resp_tlv {
1661408cc1fSYuval Mintz 	struct pfvf_tlv hdr;
1671408cc1fSYuval Mintz 
1681408cc1fSYuval Mintz 	struct pf_vf_pfdev_info {
1691408cc1fSYuval Mintz 		u32 chip_num;
1701408cc1fSYuval Mintz 		u32 mfw_ver;
1711408cc1fSYuval Mintz 
1721408cc1fSYuval Mintz 		u16 fw_major;
1731408cc1fSYuval Mintz 		u16 fw_minor;
1741408cc1fSYuval Mintz 		u16 fw_rev;
1751408cc1fSYuval Mintz 		u16 fw_eng;
1761408cc1fSYuval Mintz 
1771408cc1fSYuval Mintz 		u64 capabilities;
1781408cc1fSYuval Mintz #define PFVF_ACQUIRE_CAP_DEFAULT_UNTAGGED	BIT(0)
1791408cc1fSYuval Mintz #define PFVF_ACQUIRE_CAP_100G			BIT(1)	/* If set, 100g PF */
1801408cc1fSYuval Mintz /* There are old PF versions where the PF might mistakenly override the sanity
1811408cc1fSYuval Mintz  * mechanism [version-based] and allow a VF that can't be supported to pass
1821408cc1fSYuval Mintz  * the acquisition phase.
1831408cc1fSYuval Mintz  * To overcome this, PFs now indicate that they're past that point and the new
1841408cc1fSYuval Mintz  * VFs would fail probe on the older PFs that fail to do so.
1851408cc1fSYuval Mintz  */
1861408cc1fSYuval Mintz #define PFVF_ACQUIRE_CAP_POST_FW_OVERRIDE	BIT(2)
1871408cc1fSYuval Mintz 
1881408cc1fSYuval Mintz 		u16 db_size;
1891408cc1fSYuval Mintz 		u8 indices_per_sb;
1901408cc1fSYuval Mintz 		u8 os_type;
1911408cc1fSYuval Mintz 
1921408cc1fSYuval Mintz 		/* These should match the PF's qed_dev values */
1931408cc1fSYuval Mintz 		u16 chip_rev;
1941408cc1fSYuval Mintz 		u8 dev_type;
1951408cc1fSYuval Mintz 
1961408cc1fSYuval Mintz 		u8 padding;
1971408cc1fSYuval Mintz 
1981408cc1fSYuval Mintz 		struct pfvf_stats_info stats_info;
1991408cc1fSYuval Mintz 
2001408cc1fSYuval Mintz 		u8 port_mac[ETH_ALEN];
2011fe614d1SYuval Mintz 
2021fe614d1SYuval Mintz 		/* It's possible PF had to configure an older fastpath HSI
2031fe614d1SYuval Mintz 		 * [in case VF is newer than PF]. This is communicated back
2041fe614d1SYuval Mintz 		 * to the VF. It can also be used in case of error due to
2051fe614d1SYuval Mintz 		 * non-matching versions to shed light in VF about failure.
2061fe614d1SYuval Mintz 		 */
2071fe614d1SYuval Mintz 		u8 major_fp_hsi;
2081fe614d1SYuval Mintz 		u8 minor_fp_hsi;
2091408cc1fSYuval Mintz 	} pfdev_info;
2101408cc1fSYuval Mintz 
2111408cc1fSYuval Mintz 	struct pf_vf_resc {
2121408cc1fSYuval Mintz #define PFVF_MAX_QUEUES_PER_VF		16
2131408cc1fSYuval Mintz #define PFVF_MAX_SBS_PER_VF		16
2141408cc1fSYuval Mintz 		struct hw_sb_info hw_sbs[PFVF_MAX_SBS_PER_VF];
2151408cc1fSYuval Mintz 		u8 hw_qid[PFVF_MAX_QUEUES_PER_VF];
2161408cc1fSYuval Mintz 		u8 cid[PFVF_MAX_QUEUES_PER_VF];
2171408cc1fSYuval Mintz 
2181408cc1fSYuval Mintz 		u8 num_rxqs;
2191408cc1fSYuval Mintz 		u8 num_txqs;
2201408cc1fSYuval Mintz 		u8 num_sbs;
2211408cc1fSYuval Mintz 		u8 num_mac_filters;
2221408cc1fSYuval Mintz 		u8 num_vlan_filters;
2231408cc1fSYuval Mintz 		u8 num_mc_filters;
2241408cc1fSYuval Mintz 		u8 padding[2];
2251408cc1fSYuval Mintz 	} resc;
2261408cc1fSYuval Mintz 
2271408cc1fSYuval Mintz 	u32 bulletin_size;
2281408cc1fSYuval Mintz 	u32 padding;
2291408cc1fSYuval Mintz };
2301408cc1fSYuval Mintz 
231dacd88d6SYuval Mintz struct pfvf_start_queue_resp_tlv {
232dacd88d6SYuval Mintz 	struct pfvf_tlv hdr;
233dacd88d6SYuval Mintz 	u32 offset;		/* offset to consumer/producer of queue */
234dacd88d6SYuval Mintz 	u8 padding[4];
235dacd88d6SYuval Mintz };
236dacd88d6SYuval Mintz 
237dacd88d6SYuval Mintz /* Setup Queue */
238dacd88d6SYuval Mintz struct vfpf_start_rxq_tlv {
239dacd88d6SYuval Mintz 	struct vfpf_first_tlv first_tlv;
240dacd88d6SYuval Mintz 
241dacd88d6SYuval Mintz 	/* physical addresses */
242dacd88d6SYuval Mintz 	u64 rxq_addr;
243dacd88d6SYuval Mintz 	u64 deprecated_sge_addr;
244dacd88d6SYuval Mintz 	u64 cqe_pbl_addr;
245dacd88d6SYuval Mintz 
246dacd88d6SYuval Mintz 	u16 cqe_pbl_size;
247dacd88d6SYuval Mintz 	u16 hw_sb;
248dacd88d6SYuval Mintz 	u16 rx_qid;
249dacd88d6SYuval Mintz 	u16 hc_rate;		/* desired interrupts per sec. */
250dacd88d6SYuval Mintz 
251dacd88d6SYuval Mintz 	u16 bd_max_bytes;
252dacd88d6SYuval Mintz 	u16 stat_id;
253dacd88d6SYuval Mintz 	u8 sb_index;
254dacd88d6SYuval Mintz 	u8 padding[3];
255dacd88d6SYuval Mintz };
256dacd88d6SYuval Mintz 
257dacd88d6SYuval Mintz struct vfpf_start_txq_tlv {
258dacd88d6SYuval Mintz 	struct vfpf_first_tlv first_tlv;
259dacd88d6SYuval Mintz 
260dacd88d6SYuval Mintz 	/* physical addresses */
261dacd88d6SYuval Mintz 	u64 pbl_addr;
262dacd88d6SYuval Mintz 	u16 pbl_size;
263dacd88d6SYuval Mintz 	u16 stat_id;
264dacd88d6SYuval Mintz 	u16 tx_qid;
265dacd88d6SYuval Mintz 	u16 hw_sb;
266dacd88d6SYuval Mintz 
267dacd88d6SYuval Mintz 	u32 flags;		/* VFPF_QUEUE_FLG_X flags */
268dacd88d6SYuval Mintz 	u16 hc_rate;		/* desired interrupts per sec. */
269dacd88d6SYuval Mintz 	u8 sb_index;
270dacd88d6SYuval Mintz 	u8 padding[3];
271dacd88d6SYuval Mintz };
272dacd88d6SYuval Mintz 
273dacd88d6SYuval Mintz /* Stop RX Queue */
274dacd88d6SYuval Mintz struct vfpf_stop_rxqs_tlv {
275dacd88d6SYuval Mintz 	struct vfpf_first_tlv first_tlv;
276dacd88d6SYuval Mintz 
277dacd88d6SYuval Mintz 	u16 rx_qid;
2784c4fa793SMintz, Yuval 
2794c4fa793SMintz, Yuval 	/* this field is deprecated and should *always* be set to '1' */
280dacd88d6SYuval Mintz 	u8 num_rxqs;
281dacd88d6SYuval Mintz 	u8 cqe_completion;
282dacd88d6SYuval Mintz 	u8 padding[4];
283dacd88d6SYuval Mintz };
284dacd88d6SYuval Mintz 
285dacd88d6SYuval Mintz /* Stop TX Queues */
286dacd88d6SYuval Mintz struct vfpf_stop_txqs_tlv {
287dacd88d6SYuval Mintz 	struct vfpf_first_tlv first_tlv;
288dacd88d6SYuval Mintz 
289dacd88d6SYuval Mintz 	u16 tx_qid;
2904c4fa793SMintz, Yuval 
2914c4fa793SMintz, Yuval 	/* this field is deprecated and should *always* be set to '1' */
292dacd88d6SYuval Mintz 	u8 num_txqs;
293dacd88d6SYuval Mintz 	u8 padding[5];
294dacd88d6SYuval Mintz };
295dacd88d6SYuval Mintz 
296dacd88d6SYuval Mintz struct vfpf_update_rxq_tlv {
297dacd88d6SYuval Mintz 	struct vfpf_first_tlv first_tlv;
298dacd88d6SYuval Mintz 
299dacd88d6SYuval Mintz 	u64 deprecated_sge_addr[PFVF_MAX_QUEUES_PER_VF];
300dacd88d6SYuval Mintz 
301dacd88d6SYuval Mintz 	u16 rx_qid;
302dacd88d6SYuval Mintz 	u8 num_rxqs;
303dacd88d6SYuval Mintz 	u8 flags;
304dacd88d6SYuval Mintz #define VFPF_RXQ_UPD_INIT_SGE_DEPRECATE_FLAG    BIT(0)
305dacd88d6SYuval Mintz #define VFPF_RXQ_UPD_COMPLETE_CQE_FLAG          BIT(1)
306dacd88d6SYuval Mintz #define VFPF_RXQ_UPD_COMPLETE_EVENT_FLAG        BIT(2)
307dacd88d6SYuval Mintz 
308dacd88d6SYuval Mintz 	u8 padding[4];
309dacd88d6SYuval Mintz };
310dacd88d6SYuval Mintz 
311dacd88d6SYuval Mintz /* Set Queue Filters */
312dacd88d6SYuval Mintz struct vfpf_q_mac_vlan_filter {
313dacd88d6SYuval Mintz 	u32 flags;
314dacd88d6SYuval Mintz #define VFPF_Q_FILTER_DEST_MAC_VALID    0x01
315dacd88d6SYuval Mintz #define VFPF_Q_FILTER_VLAN_TAG_VALID    0x02
316dacd88d6SYuval Mintz #define VFPF_Q_FILTER_SET_MAC           0x100	/* set/clear */
317dacd88d6SYuval Mintz 
318dacd88d6SYuval Mintz 	u8 mac[ETH_ALEN];
319dacd88d6SYuval Mintz 	u16 vlan_tag;
320dacd88d6SYuval Mintz 
321dacd88d6SYuval Mintz 	u8 padding[4];
322dacd88d6SYuval Mintz };
323dacd88d6SYuval Mintz 
324dacd88d6SYuval Mintz /* Start a vport */
325dacd88d6SYuval Mintz struct vfpf_vport_start_tlv {
326dacd88d6SYuval Mintz 	struct vfpf_first_tlv first_tlv;
327dacd88d6SYuval Mintz 
328dacd88d6SYuval Mintz 	u64 sb_addr[PFVF_MAX_SBS_PER_VF];
329dacd88d6SYuval Mintz 
330dacd88d6SYuval Mintz 	u32 tpa_mode;
331dacd88d6SYuval Mintz 	u16 dep1;
332dacd88d6SYuval Mintz 	u16 mtu;
333dacd88d6SYuval Mintz 
334dacd88d6SYuval Mintz 	u8 vport_id;
335dacd88d6SYuval Mintz 	u8 inner_vlan_removal;
336dacd88d6SYuval Mintz 
337dacd88d6SYuval Mintz 	u8 only_untagged;
338dacd88d6SYuval Mintz 	u8 max_buffers_per_cqe;
339dacd88d6SYuval Mintz 
340dacd88d6SYuval Mintz 	u8 padding[4];
341dacd88d6SYuval Mintz };
342dacd88d6SYuval Mintz 
343dacd88d6SYuval Mintz /* Extended tlvs - need to add rss, mcast, accept mode tlvs */
344dacd88d6SYuval Mintz struct vfpf_vport_update_activate_tlv {
345dacd88d6SYuval Mintz 	struct channel_tlv tl;
346dacd88d6SYuval Mintz 	u8 update_rx;
347dacd88d6SYuval Mintz 	u8 update_tx;
348dacd88d6SYuval Mintz 	u8 active_rx;
349dacd88d6SYuval Mintz 	u8 active_tx;
350dacd88d6SYuval Mintz };
351dacd88d6SYuval Mintz 
35217b235c1SYuval Mintz struct vfpf_vport_update_tx_switch_tlv {
35317b235c1SYuval Mintz 	struct channel_tlv tl;
35417b235c1SYuval Mintz 	u8 tx_switching;
35517b235c1SYuval Mintz 	u8 padding[3];
35617b235c1SYuval Mintz };
35717b235c1SYuval Mintz 
35817b235c1SYuval Mintz struct vfpf_vport_update_vlan_strip_tlv {
35917b235c1SYuval Mintz 	struct channel_tlv tl;
36017b235c1SYuval Mintz 	u8 remove_vlan;
36117b235c1SYuval Mintz 	u8 padding[3];
36217b235c1SYuval Mintz };
36317b235c1SYuval Mintz 
364dacd88d6SYuval Mintz struct vfpf_vport_update_mcast_bin_tlv {
365dacd88d6SYuval Mintz 	struct channel_tlv tl;
366dacd88d6SYuval Mintz 	u8 padding[4];
367dacd88d6SYuval Mintz 
368dacd88d6SYuval Mintz 	u64 bins[8];
369dacd88d6SYuval Mintz };
370dacd88d6SYuval Mintz 
371dacd88d6SYuval Mintz struct vfpf_vport_update_accept_param_tlv {
372dacd88d6SYuval Mintz 	struct channel_tlv tl;
373dacd88d6SYuval Mintz 	u8 update_rx_mode;
374dacd88d6SYuval Mintz 	u8 update_tx_mode;
375dacd88d6SYuval Mintz 	u8 rx_accept_filter;
376dacd88d6SYuval Mintz 	u8 tx_accept_filter;
377dacd88d6SYuval Mintz };
378dacd88d6SYuval Mintz 
37917b235c1SYuval Mintz struct vfpf_vport_update_accept_any_vlan_tlv {
38017b235c1SYuval Mintz 	struct channel_tlv tl;
38117b235c1SYuval Mintz 	u8 update_accept_any_vlan_flg;
38217b235c1SYuval Mintz 	u8 accept_any_vlan;
38317b235c1SYuval Mintz 
38417b235c1SYuval Mintz 	u8 padding[2];
38517b235c1SYuval Mintz };
38617b235c1SYuval Mintz 
38717b235c1SYuval Mintz struct vfpf_vport_update_sge_tpa_tlv {
38817b235c1SYuval Mintz 	struct channel_tlv tl;
38917b235c1SYuval Mintz 
39017b235c1SYuval Mintz 	u16 sge_tpa_flags;
39117b235c1SYuval Mintz #define VFPF_TPA_IPV4_EN_FLAG		BIT(0)
39217b235c1SYuval Mintz #define VFPF_TPA_IPV6_EN_FLAG		BIT(1)
39317b235c1SYuval Mintz #define VFPF_TPA_PKT_SPLIT_FLAG		BIT(2)
39417b235c1SYuval Mintz #define VFPF_TPA_HDR_DATA_SPLIT_FLAG	BIT(3)
39517b235c1SYuval Mintz #define VFPF_TPA_GRO_CONSIST_FLAG	BIT(4)
39617b235c1SYuval Mintz 
39717b235c1SYuval Mintz 	u8 update_sge_tpa_flags;
39817b235c1SYuval Mintz #define VFPF_UPDATE_SGE_DEPRECATED_FLAG	BIT(0)
39917b235c1SYuval Mintz #define VFPF_UPDATE_TPA_EN_FLAG		BIT(1)
40017b235c1SYuval Mintz #define VFPF_UPDATE_TPA_PARAM_FLAG	BIT(2)
40117b235c1SYuval Mintz 
40217b235c1SYuval Mintz 	u8 max_buffers_per_cqe;
40317b235c1SYuval Mintz 
40417b235c1SYuval Mintz 	u16 deprecated_sge_buff_size;
40517b235c1SYuval Mintz 	u16 tpa_max_size;
40617b235c1SYuval Mintz 	u16 tpa_min_size_to_start;
40717b235c1SYuval Mintz 	u16 tpa_min_size_to_cont;
40817b235c1SYuval Mintz 
40917b235c1SYuval Mintz 	u8 tpa_max_aggs_num;
41017b235c1SYuval Mintz 	u8 padding[7];
41117b235c1SYuval Mintz };
41217b235c1SYuval Mintz 
413dacd88d6SYuval Mintz /* Primary tlv as a header for various extended tlvs for
414dacd88d6SYuval Mintz  * various functionalities in vport update ramrod.
415dacd88d6SYuval Mintz  */
416dacd88d6SYuval Mintz struct vfpf_vport_update_tlv {
417dacd88d6SYuval Mintz 	struct vfpf_first_tlv first_tlv;
418dacd88d6SYuval Mintz };
419dacd88d6SYuval Mintz 
420dacd88d6SYuval Mintz struct vfpf_ucast_filter_tlv {
421dacd88d6SYuval Mintz 	struct vfpf_first_tlv first_tlv;
422dacd88d6SYuval Mintz 
423dacd88d6SYuval Mintz 	u8 opcode;
424dacd88d6SYuval Mintz 	u8 type;
425dacd88d6SYuval Mintz 
426dacd88d6SYuval Mintz 	u8 mac[ETH_ALEN];
427dacd88d6SYuval Mintz 
428dacd88d6SYuval Mintz 	u16 vlan;
429dacd88d6SYuval Mintz 	u16 padding[3];
430dacd88d6SYuval Mintz };
431dacd88d6SYuval Mintz 
43232a47e72SYuval Mintz struct tlv_buffer_size {
43332a47e72SYuval Mintz 	u8 tlv_buffer[TLV_BUFFER_SIZE];
43432a47e72SYuval Mintz };
43532a47e72SYuval Mintz 
43632a47e72SYuval Mintz union vfpf_tlvs {
43737bff2b9SYuval Mintz 	struct vfpf_first_tlv first_tlv;
4381408cc1fSYuval Mintz 	struct vfpf_acquire_tlv acquire;
439dacd88d6SYuval Mintz 	struct vfpf_start_rxq_tlv start_rxq;
440dacd88d6SYuval Mintz 	struct vfpf_start_txq_tlv start_txq;
441dacd88d6SYuval Mintz 	struct vfpf_stop_rxqs_tlv stop_rxqs;
442dacd88d6SYuval Mintz 	struct vfpf_stop_txqs_tlv stop_txqs;
44317b235c1SYuval Mintz 	struct vfpf_update_rxq_tlv update_rxq;
444dacd88d6SYuval Mintz 	struct vfpf_vport_start_tlv start_vport;
445dacd88d6SYuval Mintz 	struct vfpf_vport_update_tlv vport_update;
446dacd88d6SYuval Mintz 	struct vfpf_ucast_filter_tlv ucast_filter;
44737bff2b9SYuval Mintz 	struct channel_list_end_tlv list_end;
44832a47e72SYuval Mintz 	struct tlv_buffer_size tlv_buf_size;
44932a47e72SYuval Mintz };
45032a47e72SYuval Mintz 
45132a47e72SYuval Mintz union pfvf_tlvs {
45237bff2b9SYuval Mintz 	struct pfvf_def_resp_tlv default_resp;
4531408cc1fSYuval Mintz 	struct pfvf_acquire_resp_tlv acquire_resp;
45432a47e72SYuval Mintz 	struct tlv_buffer_size tlv_buf_size;
455dacd88d6SYuval Mintz 	struct pfvf_start_queue_resp_tlv queue_start;
45632a47e72SYuval Mintz };
45732a47e72SYuval Mintz 
45808feecd7SYuval Mintz enum qed_bulletin_bit {
459eff16960SYuval Mintz 	/* Alert the VF that a forced MAC was set by the PF */
460eff16960SYuval Mintz 	MAC_ADDR_FORCED = 0,
46108feecd7SYuval Mintz 	/* Alert the VF that a forced VLAN was set by the PF */
46208feecd7SYuval Mintz 	VLAN_ADDR_FORCED = 2,
46308feecd7SYuval Mintz 
46408feecd7SYuval Mintz 	/* Indicate that `default_only_untagged' contains actual data */
46508feecd7SYuval Mintz 	VFPF_BULLETIN_UNTAGGED_DEFAULT = 3,
46608feecd7SYuval Mintz 	VFPF_BULLETIN_UNTAGGED_DEFAULT_FORCED = 4,
46708feecd7SYuval Mintz 
468eff16960SYuval Mintz 	/* Alert the VF that suggested mac was sent by the PF.
469eff16960SYuval Mintz 	 * MAC_ADDR will be disabled in case MAC_ADDR_FORCED is set.
470eff16960SYuval Mintz 	 */
471eff16960SYuval Mintz 	VFPF_BULLETIN_MAC_ADDR = 5
47208feecd7SYuval Mintz };
47308feecd7SYuval Mintz 
47432a47e72SYuval Mintz struct qed_bulletin_content {
47532a47e72SYuval Mintz 	/* crc of structure to ensure is not in mid-update */
47632a47e72SYuval Mintz 	u32 crc;
47732a47e72SYuval Mintz 
47832a47e72SYuval Mintz 	u32 version;
47932a47e72SYuval Mintz 
48032a47e72SYuval Mintz 	/* bitmap indicating which fields hold valid values */
48132a47e72SYuval Mintz 	u64 valid_bitmap;
48236558c3dSYuval Mintz 
48336558c3dSYuval Mintz 	/* used for MAC_ADDR or MAC_ADDR_FORCED */
48436558c3dSYuval Mintz 	u8 mac[ETH_ALEN];
48536558c3dSYuval Mintz 
48636558c3dSYuval Mintz 	/* If valid, 1 => only untagged Rx if no vlan is configured */
48736558c3dSYuval Mintz 	u8 default_only_untagged;
48836558c3dSYuval Mintz 	u8 padding;
48936558c3dSYuval Mintz 
49036558c3dSYuval Mintz 	/* The following is a 'copy' of qed_mcp_link_state,
49136558c3dSYuval Mintz 	 * qed_mcp_link_params and qed_mcp_link_capabilities. Since it's
49236558c3dSYuval Mintz 	 * possible the structs will increase further along the road we cannot
49336558c3dSYuval Mintz 	 * have it here; Instead we need to have all of its fields.
49436558c3dSYuval Mintz 	 */
49536558c3dSYuval Mintz 	u8 req_autoneg;
49636558c3dSYuval Mintz 	u8 req_autoneg_pause;
49736558c3dSYuval Mintz 	u8 req_forced_rx;
49836558c3dSYuval Mintz 	u8 req_forced_tx;
49936558c3dSYuval Mintz 	u8 padding2[4];
50036558c3dSYuval Mintz 
50136558c3dSYuval Mintz 	u32 req_adv_speed;
50236558c3dSYuval Mintz 	u32 req_forced_speed;
50336558c3dSYuval Mintz 	u32 req_loopback;
50436558c3dSYuval Mintz 	u32 padding3;
50536558c3dSYuval Mintz 
50636558c3dSYuval Mintz 	u8 link_up;
50736558c3dSYuval Mintz 	u8 full_duplex;
50836558c3dSYuval Mintz 	u8 autoneg;
50936558c3dSYuval Mintz 	u8 autoneg_complete;
51036558c3dSYuval Mintz 	u8 parallel_detection;
51136558c3dSYuval Mintz 	u8 pfc_enabled;
51236558c3dSYuval Mintz 	u8 partner_tx_flow_ctrl_en;
51336558c3dSYuval Mintz 	u8 partner_rx_flow_ctrl_en;
51436558c3dSYuval Mintz 	u8 partner_adv_pause;
51536558c3dSYuval Mintz 	u8 sfp_tx_fault;
51636558c3dSYuval Mintz 	u8 padding4[6];
51736558c3dSYuval Mintz 
51836558c3dSYuval Mintz 	u32 speed;
51936558c3dSYuval Mintz 	u32 partner_adv_speed;
52036558c3dSYuval Mintz 
52136558c3dSYuval Mintz 	u32 capability_speed;
52208feecd7SYuval Mintz 
52308feecd7SYuval Mintz 	/* Forced vlan */
52408feecd7SYuval Mintz 	u16 pvid;
52508feecd7SYuval Mintz 	u16 padding5;
52632a47e72SYuval Mintz };
52732a47e72SYuval Mintz 
52832a47e72SYuval Mintz struct qed_bulletin {
52932a47e72SYuval Mintz 	dma_addr_t phys;
53032a47e72SYuval Mintz 	struct qed_bulletin_content *p_virt;
53132a47e72SYuval Mintz 	u32 size;
53232a47e72SYuval Mintz };
53332a47e72SYuval Mintz 
53437bff2b9SYuval Mintz enum {
53537bff2b9SYuval Mintz 	CHANNEL_TLV_NONE,	/* ends tlv sequence */
5361408cc1fSYuval Mintz 	CHANNEL_TLV_ACQUIRE,
537dacd88d6SYuval Mintz 	CHANNEL_TLV_VPORT_START,
538dacd88d6SYuval Mintz 	CHANNEL_TLV_VPORT_UPDATE,
539dacd88d6SYuval Mintz 	CHANNEL_TLV_VPORT_TEARDOWN,
540dacd88d6SYuval Mintz 	CHANNEL_TLV_START_RXQ,
541dacd88d6SYuval Mintz 	CHANNEL_TLV_START_TXQ,
542dacd88d6SYuval Mintz 	CHANNEL_TLV_STOP_RXQS,
543dacd88d6SYuval Mintz 	CHANNEL_TLV_STOP_TXQS,
54417b235c1SYuval Mintz 	CHANNEL_TLV_UPDATE_RXQ,
5450b55e27dSYuval Mintz 	CHANNEL_TLV_INT_CLEANUP,
5460b55e27dSYuval Mintz 	CHANNEL_TLV_CLOSE,
5470b55e27dSYuval Mintz 	CHANNEL_TLV_RELEASE,
54837bff2b9SYuval Mintz 	CHANNEL_TLV_LIST_END,
549dacd88d6SYuval Mintz 	CHANNEL_TLV_UCAST_FILTER,
550dacd88d6SYuval Mintz 	CHANNEL_TLV_VPORT_UPDATE_ACTIVATE,
55117b235c1SYuval Mintz 	CHANNEL_TLV_VPORT_UPDATE_TX_SWITCH,
55217b235c1SYuval Mintz 	CHANNEL_TLV_VPORT_UPDATE_VLAN_STRIP,
553dacd88d6SYuval Mintz 	CHANNEL_TLV_VPORT_UPDATE_MCAST,
554dacd88d6SYuval Mintz 	CHANNEL_TLV_VPORT_UPDATE_ACCEPT_PARAM,
555dacd88d6SYuval Mintz 	CHANNEL_TLV_VPORT_UPDATE_RSS,
55617b235c1SYuval Mintz 	CHANNEL_TLV_VPORT_UPDATE_ACCEPT_ANY_VLAN,
55717b235c1SYuval Mintz 	CHANNEL_TLV_VPORT_UPDATE_SGE_TPA,
558dacd88d6SYuval Mintz 	CHANNEL_TLV_MAX,
559dacd88d6SYuval Mintz 
560dacd88d6SYuval Mintz 	/* Required for iterating over vport-update tlvs.
561dacd88d6SYuval Mintz 	 * Will break in case non-sequential vport-update tlvs.
562dacd88d6SYuval Mintz 	 */
56317b235c1SYuval Mintz 	CHANNEL_TLV_VPORT_UPDATE_MAX = CHANNEL_TLV_VPORT_UPDATE_SGE_TPA + 1,
56437bff2b9SYuval Mintz };
56537bff2b9SYuval Mintz 
5661408cc1fSYuval Mintz /* This data is held in the qed_hwfn structure for VFs only. */
5671408cc1fSYuval Mintz struct qed_vf_iov {
5681408cc1fSYuval Mintz 	union vfpf_tlvs *vf2pf_request;
5691408cc1fSYuval Mintz 	dma_addr_t vf2pf_request_phys;
5701408cc1fSYuval Mintz 	union pfvf_tlvs *pf2vf_reply;
5711408cc1fSYuval Mintz 	dma_addr_t pf2vf_reply_phys;
5721408cc1fSYuval Mintz 
5731408cc1fSYuval Mintz 	/* Should be taken whenever the mailbox buffers are accessed */
5741408cc1fSYuval Mintz 	struct mutex mutex;
5751408cc1fSYuval Mintz 	u8 *offset;
5761408cc1fSYuval Mintz 
5771408cc1fSYuval Mintz 	/* Bulletin Board */
5781408cc1fSYuval Mintz 	struct qed_bulletin bulletin;
5791408cc1fSYuval Mintz 	struct qed_bulletin_content bulletin_shadow;
5801408cc1fSYuval Mintz 
5811408cc1fSYuval Mintz 	/* we set aside a copy of the acquire response */
5821408cc1fSYuval Mintz 	struct pfvf_acquire_resp_tlv acquire_resp;
583d8c2c7e3SYuval Mintz 
584d8c2c7e3SYuval Mintz 	/* In case PF originates prior to the fp-hsi version comparison,
585d8c2c7e3SYuval Mintz 	 * this has to be propagated as it affects the fastpath.
586d8c2c7e3SYuval Mintz 	 */
587d8c2c7e3SYuval Mintz 	bool b_pre_fp_hsi;
5881408cc1fSYuval Mintz };
5891408cc1fSYuval Mintz 
5901408cc1fSYuval Mintz #ifdef CONFIG_QED_SRIOV
5911408cc1fSYuval Mintz /**
59236558c3dSYuval Mintz  * @brief Read the VF bulletin and act on it if needed
59336558c3dSYuval Mintz  *
59436558c3dSYuval Mintz  * @param p_hwfn
59536558c3dSYuval Mintz  * @param p_change - qed fills 1 iff bulletin board has changed, 0 otherwise.
59636558c3dSYuval Mintz  *
59736558c3dSYuval Mintz  * @return enum _qed_status
59836558c3dSYuval Mintz  */
59936558c3dSYuval Mintz int qed_vf_read_bulletin(struct qed_hwfn *p_hwfn, u8 *p_change);
60036558c3dSYuval Mintz 
60136558c3dSYuval Mintz /**
60236558c3dSYuval Mintz  * @brief Get link paramters for VF from qed
60336558c3dSYuval Mintz  *
60436558c3dSYuval Mintz  * @param p_hwfn
60536558c3dSYuval Mintz  * @param params - the link params structure to be filled for the VF
60636558c3dSYuval Mintz  */
60736558c3dSYuval Mintz void qed_vf_get_link_params(struct qed_hwfn *p_hwfn,
60836558c3dSYuval Mintz 			    struct qed_mcp_link_params *params);
60936558c3dSYuval Mintz 
61036558c3dSYuval Mintz /**
61136558c3dSYuval Mintz  * @brief Get link state for VF from qed
61236558c3dSYuval Mintz  *
61336558c3dSYuval Mintz  * @param p_hwfn
61436558c3dSYuval Mintz  * @param link - the link state structure to be filled for the VF
61536558c3dSYuval Mintz  */
61636558c3dSYuval Mintz void qed_vf_get_link_state(struct qed_hwfn *p_hwfn,
61736558c3dSYuval Mintz 			   struct qed_mcp_link_state *link);
61836558c3dSYuval Mintz 
61936558c3dSYuval Mintz /**
62036558c3dSYuval Mintz  * @brief Get link capabilities for VF from qed
62136558c3dSYuval Mintz  *
62236558c3dSYuval Mintz  * @param p_hwfn
62336558c3dSYuval Mintz  * @param p_link_caps - the link capabilities structure to be filled for the VF
62436558c3dSYuval Mintz  */
62536558c3dSYuval Mintz void qed_vf_get_link_caps(struct qed_hwfn *p_hwfn,
62636558c3dSYuval Mintz 			  struct qed_mcp_link_capabilities *p_link_caps);
62736558c3dSYuval Mintz 
62836558c3dSYuval Mintz /**
6291408cc1fSYuval Mintz  * @brief Get number of Rx queues allocated for VF by qed
6301408cc1fSYuval Mintz  *
6311408cc1fSYuval Mintz  *  @param p_hwfn
6321408cc1fSYuval Mintz  *  @param num_rxqs - allocated RX queues
6331408cc1fSYuval Mintz  */
6341408cc1fSYuval Mintz void qed_vf_get_num_rxqs(struct qed_hwfn *p_hwfn, u8 *num_rxqs);
6351408cc1fSYuval Mintz 
6361408cc1fSYuval Mintz /**
6371408cc1fSYuval Mintz  * @brief Get port mac address for VF
6381408cc1fSYuval Mintz  *
6391408cc1fSYuval Mintz  * @param p_hwfn
6401408cc1fSYuval Mintz  * @param port_mac - destination location for port mac
6411408cc1fSYuval Mintz  */
6421408cc1fSYuval Mintz void qed_vf_get_port_mac(struct qed_hwfn *p_hwfn, u8 *port_mac);
6431408cc1fSYuval Mintz 
6441408cc1fSYuval Mintz /**
6451408cc1fSYuval Mintz  * @brief Get number of VLAN filters allocated for VF by qed
6461408cc1fSYuval Mintz  *
6471408cc1fSYuval Mintz  *  @param p_hwfn
6481408cc1fSYuval Mintz  *  @param num_rxqs - allocated VLAN filters
6491408cc1fSYuval Mintz  */
6501408cc1fSYuval Mintz void qed_vf_get_num_vlan_filters(struct qed_hwfn *p_hwfn,
6511408cc1fSYuval Mintz 				 u8 *num_vlan_filters);
6521408cc1fSYuval Mintz 
6531408cc1fSYuval Mintz /**
654b0fca312SMintz, Yuval  * @brief Get number of MAC filters allocated for VF by qed
655b0fca312SMintz, Yuval  *
656b0fca312SMintz, Yuval  *  @param p_hwfn
657b0fca312SMintz, Yuval  *  @param num_rxqs - allocated MAC filters
658b0fca312SMintz, Yuval  */
659b0fca312SMintz, Yuval void qed_vf_get_num_mac_filters(struct qed_hwfn *p_hwfn, u8 *num_mac_filters);
660b0fca312SMintz, Yuval 
661b0fca312SMintz, Yuval /**
662eff16960SYuval Mintz  * @brief Check if VF can set a MAC address
663eff16960SYuval Mintz  *
664eff16960SYuval Mintz  * @param p_hwfn
665eff16960SYuval Mintz  * @param mac
666eff16960SYuval Mintz  *
667eff16960SYuval Mintz  * @return bool
668eff16960SYuval Mintz  */
669eff16960SYuval Mintz bool qed_vf_check_mac(struct qed_hwfn *p_hwfn, u8 *mac);
670eff16960SYuval Mintz 
671eff16960SYuval Mintz /**
6721408cc1fSYuval Mintz  * @brief Set firmware version information in dev_info from VFs acquire response tlv
6731408cc1fSYuval Mintz  *
6741408cc1fSYuval Mintz  * @param p_hwfn
6751408cc1fSYuval Mintz  * @param fw_major
6761408cc1fSYuval Mintz  * @param fw_minor
6771408cc1fSYuval Mintz  * @param fw_rev
6781408cc1fSYuval Mintz  * @param fw_eng
6791408cc1fSYuval Mintz  */
6801408cc1fSYuval Mintz void qed_vf_get_fw_version(struct qed_hwfn *p_hwfn,
6811408cc1fSYuval Mintz 			   u16 *fw_major, u16 *fw_minor,
6821408cc1fSYuval Mintz 			   u16 *fw_rev, u16 *fw_eng);
6831408cc1fSYuval Mintz 
6841408cc1fSYuval Mintz /**
6851408cc1fSYuval Mintz  * @brief hw preparation for VF
6861408cc1fSYuval Mintz  *      sends ACQUIRE message
6871408cc1fSYuval Mintz  *
6881408cc1fSYuval Mintz  * @param p_hwfn
6891408cc1fSYuval Mintz  *
6901408cc1fSYuval Mintz  * @return int
6911408cc1fSYuval Mintz  */
6921408cc1fSYuval Mintz int qed_vf_hw_prepare(struct qed_hwfn *p_hwfn);
6931408cc1fSYuval Mintz 
6941408cc1fSYuval Mintz /**
695dacd88d6SYuval Mintz  * @brief VF - start the RX Queue by sending a message to the PF
696dacd88d6SYuval Mintz  * @param p_hwfn
6973da7a37aSMintz, Yuval  * @param p_cid			- Only relative fields are relevant
698dacd88d6SYuval Mintz  * @param bd_max_bytes          - maximum number of bytes per bd
699dacd88d6SYuval Mintz  * @param bd_chain_phys_addr    - physical address of bd chain
700dacd88d6SYuval Mintz  * @param cqe_pbl_addr          - physical address of pbl
701dacd88d6SYuval Mintz  * @param cqe_pbl_size          - pbl size
702dacd88d6SYuval Mintz  * @param pp_prod               - pointer to the producer to be
703dacd88d6SYuval Mintz  *				  used in fastpath
704dacd88d6SYuval Mintz  *
705dacd88d6SYuval Mintz  * @return int
706dacd88d6SYuval Mintz  */
707dacd88d6SYuval Mintz int qed_vf_pf_rxq_start(struct qed_hwfn *p_hwfn,
7083da7a37aSMintz, Yuval 			struct qed_queue_cid *p_cid,
709dacd88d6SYuval Mintz 			u16 bd_max_bytes,
710dacd88d6SYuval Mintz 			dma_addr_t bd_chain_phys_addr,
711dacd88d6SYuval Mintz 			dma_addr_t cqe_pbl_addr,
712dacd88d6SYuval Mintz 			u16 cqe_pbl_size, void __iomem **pp_prod);
713dacd88d6SYuval Mintz 
714dacd88d6SYuval Mintz /**
715dacd88d6SYuval Mintz  * @brief VF - start the TX queue by sending a message to the
716dacd88d6SYuval Mintz  *        PF.
717dacd88d6SYuval Mintz  *
718dacd88d6SYuval Mintz  * @param p_hwfn
719dacd88d6SYuval Mintz  * @param tx_queue_id           - zero based within the VF
720dacd88d6SYuval Mintz  * @param sb                    - status block for this queue
721dacd88d6SYuval Mintz  * @param sb_index              - index within the status block
722dacd88d6SYuval Mintz  * @param bd_chain_phys_addr    - physical address of tx chain
723dacd88d6SYuval Mintz  * @param pp_doorbell           - pointer to address to which to
724dacd88d6SYuval Mintz  *                      write the doorbell too..
725dacd88d6SYuval Mintz  *
726dacd88d6SYuval Mintz  * @return int
727dacd88d6SYuval Mintz  */
7283da7a37aSMintz, Yuval int
7293da7a37aSMintz, Yuval qed_vf_pf_txq_start(struct qed_hwfn *p_hwfn,
7303da7a37aSMintz, Yuval 		    struct qed_queue_cid *p_cid,
731dacd88d6SYuval Mintz 		    dma_addr_t pbl_addr,
732dacd88d6SYuval Mintz 		    u16 pbl_size, void __iomem **pp_doorbell);
733dacd88d6SYuval Mintz 
734dacd88d6SYuval Mintz /**
735dacd88d6SYuval Mintz  * @brief VF - stop the RX queue by sending a message to the PF
736dacd88d6SYuval Mintz  *
737dacd88d6SYuval Mintz  * @param p_hwfn
7383da7a37aSMintz, Yuval  * @param p_cid
739dacd88d6SYuval Mintz  * @param cqe_completion
740dacd88d6SYuval Mintz  *
741dacd88d6SYuval Mintz  * @return int
742dacd88d6SYuval Mintz  */
743dacd88d6SYuval Mintz int qed_vf_pf_rxq_stop(struct qed_hwfn *p_hwfn,
7443da7a37aSMintz, Yuval 		       struct qed_queue_cid *p_cid, bool cqe_completion);
745dacd88d6SYuval Mintz 
746dacd88d6SYuval Mintz /**
747dacd88d6SYuval Mintz  * @brief VF - stop the TX queue by sending a message to the PF
748dacd88d6SYuval Mintz  *
749dacd88d6SYuval Mintz  * @param p_hwfn
750dacd88d6SYuval Mintz  * @param tx_qid
751dacd88d6SYuval Mintz  *
752dacd88d6SYuval Mintz  * @return int
753dacd88d6SYuval Mintz  */
7543da7a37aSMintz, Yuval int qed_vf_pf_txq_stop(struct qed_hwfn *p_hwfn, struct qed_queue_cid *p_cid);
755dacd88d6SYuval Mintz 
756dacd88d6SYuval Mintz /**
757dacd88d6SYuval Mintz  * @brief VF - send a vport update command
758dacd88d6SYuval Mintz  *
759dacd88d6SYuval Mintz  * @param p_hwfn
760dacd88d6SYuval Mintz  * @param params
761dacd88d6SYuval Mintz  *
762dacd88d6SYuval Mintz  * @return int
763dacd88d6SYuval Mintz  */
764dacd88d6SYuval Mintz int qed_vf_pf_vport_update(struct qed_hwfn *p_hwfn,
765dacd88d6SYuval Mintz 			   struct qed_sp_vport_update_params *p_params);
766dacd88d6SYuval Mintz 
767dacd88d6SYuval Mintz /**
7680b55e27dSYuval Mintz  *
7690b55e27dSYuval Mintz  * @brief VF - send a close message to PF
7700b55e27dSYuval Mintz  *
7710b55e27dSYuval Mintz  * @param p_hwfn
7720b55e27dSYuval Mintz  *
7730b55e27dSYuval Mintz  * @return enum _qed_status
7740b55e27dSYuval Mintz  */
7750b55e27dSYuval Mintz int qed_vf_pf_reset(struct qed_hwfn *p_hwfn);
7760b55e27dSYuval Mintz 
7770b55e27dSYuval Mintz /**
7780b55e27dSYuval Mintz  * @brief VF - free vf`s memories
7790b55e27dSYuval Mintz  *
7800b55e27dSYuval Mintz  * @param p_hwfn
7810b55e27dSYuval Mintz  *
7820b55e27dSYuval Mintz  * @return enum _qed_status
7830b55e27dSYuval Mintz  */
7840b55e27dSYuval Mintz int qed_vf_pf_release(struct qed_hwfn *p_hwfn);
78536558c3dSYuval Mintz 
7860b55e27dSYuval Mintz /**
7871408cc1fSYuval Mintz  * @brief qed_vf_get_igu_sb_id - Get the IGU SB ID for a given
7881408cc1fSYuval Mintz  *        sb_id. For VFs igu sbs don't have to be contiguous
7891408cc1fSYuval Mintz  *
7901408cc1fSYuval Mintz  * @param p_hwfn
7911408cc1fSYuval Mintz  * @param sb_id
7921408cc1fSYuval Mintz  *
7931408cc1fSYuval Mintz  * @return INLINE u16
7941408cc1fSYuval Mintz  */
7951408cc1fSYuval Mintz u16 qed_vf_get_igu_sb_id(struct qed_hwfn *p_hwfn, u16 sb_id);
7960b55e27dSYuval Mintz 
7970b55e27dSYuval Mintz /**
798dacd88d6SYuval Mintz  * @brief qed_vf_pf_vport_start - perform vport start for VF.
799dacd88d6SYuval Mintz  *
800dacd88d6SYuval Mintz  * @param p_hwfn
801dacd88d6SYuval Mintz  * @param vport_id
802dacd88d6SYuval Mintz  * @param mtu
803dacd88d6SYuval Mintz  * @param inner_vlan_removal
804dacd88d6SYuval Mintz  * @param tpa_mode
805dacd88d6SYuval Mintz  * @param max_buffers_per_cqe,
806dacd88d6SYuval Mintz  * @param only_untagged - default behavior regarding vlan acceptance
807dacd88d6SYuval Mintz  *
808dacd88d6SYuval Mintz  * @return enum _qed_status
809dacd88d6SYuval Mintz  */
810dacd88d6SYuval Mintz int qed_vf_pf_vport_start(struct qed_hwfn *p_hwfn,
811dacd88d6SYuval Mintz 			  u8 vport_id,
812dacd88d6SYuval Mintz 			  u16 mtu,
813dacd88d6SYuval Mintz 			  u8 inner_vlan_removal,
814dacd88d6SYuval Mintz 			  enum qed_tpa_mode tpa_mode,
81508feecd7SYuval Mintz 			  u8 max_buffers_per_cqe, u8 only_untagged);
816dacd88d6SYuval Mintz 
817dacd88d6SYuval Mintz /**
818dacd88d6SYuval Mintz  * @brief qed_vf_pf_vport_stop - stop the VF's vport
819dacd88d6SYuval Mintz  *
820dacd88d6SYuval Mintz  * @param p_hwfn
821dacd88d6SYuval Mintz  *
822dacd88d6SYuval Mintz  * @return enum _qed_status
823dacd88d6SYuval Mintz  */
824dacd88d6SYuval Mintz int qed_vf_pf_vport_stop(struct qed_hwfn *p_hwfn);
825dacd88d6SYuval Mintz 
826dacd88d6SYuval Mintz int qed_vf_pf_filter_ucast(struct qed_hwfn *p_hwfn,
827dacd88d6SYuval Mintz 			   struct qed_filter_ucast *p_param);
828dacd88d6SYuval Mintz 
829dacd88d6SYuval Mintz void qed_vf_pf_filter_mcast(struct qed_hwfn *p_hwfn,
830dacd88d6SYuval Mintz 			    struct qed_filter_mcast *p_filter_cmd);
831dacd88d6SYuval Mintz 
832dacd88d6SYuval Mintz /**
8330b55e27dSYuval Mintz  * @brief qed_vf_pf_int_cleanup - clean the SB of the VF
8340b55e27dSYuval Mintz  *
8350b55e27dSYuval Mintz  * @param p_hwfn
8360b55e27dSYuval Mintz  *
8370b55e27dSYuval Mintz  * @return enum _qed_status
8380b55e27dSYuval Mintz  */
8390b55e27dSYuval Mintz int qed_vf_pf_int_cleanup(struct qed_hwfn *p_hwfn);
84036558c3dSYuval Mintz 
84136558c3dSYuval Mintz /**
84236558c3dSYuval Mintz  * @brief - return the link params in a given bulletin board
84336558c3dSYuval Mintz  *
84436558c3dSYuval Mintz  * @param p_hwfn
84536558c3dSYuval Mintz  * @param p_params - pointer to a struct to fill with link params
84636558c3dSYuval Mintz  * @param p_bulletin
84736558c3dSYuval Mintz  */
84836558c3dSYuval Mintz void __qed_vf_get_link_params(struct qed_hwfn *p_hwfn,
84936558c3dSYuval Mintz 			      struct qed_mcp_link_params *p_params,
85036558c3dSYuval Mintz 			      struct qed_bulletin_content *p_bulletin);
85136558c3dSYuval Mintz 
85236558c3dSYuval Mintz /**
85336558c3dSYuval Mintz  * @brief - return the link state in a given bulletin board
85436558c3dSYuval Mintz  *
85536558c3dSYuval Mintz  * @param p_hwfn
85636558c3dSYuval Mintz  * @param p_link - pointer to a struct to fill with link state
85736558c3dSYuval Mintz  * @param p_bulletin
85836558c3dSYuval Mintz  */
85936558c3dSYuval Mintz void __qed_vf_get_link_state(struct qed_hwfn *p_hwfn,
86036558c3dSYuval Mintz 			     struct qed_mcp_link_state *p_link,
86136558c3dSYuval Mintz 			     struct qed_bulletin_content *p_bulletin);
86236558c3dSYuval Mintz 
86336558c3dSYuval Mintz /**
86436558c3dSYuval Mintz  * @brief - return the link capabilities in a given bulletin board
86536558c3dSYuval Mintz  *
86636558c3dSYuval Mintz  * @param p_hwfn
86736558c3dSYuval Mintz  * @param p_link - pointer to a struct to fill with link capabilities
86836558c3dSYuval Mintz  * @param p_bulletin
86936558c3dSYuval Mintz  */
87036558c3dSYuval Mintz void __qed_vf_get_link_caps(struct qed_hwfn *p_hwfn,
87136558c3dSYuval Mintz 			    struct qed_mcp_link_capabilities *p_link_caps,
87236558c3dSYuval Mintz 			    struct qed_bulletin_content *p_bulletin);
87336558c3dSYuval Mintz 
87436558c3dSYuval Mintz void qed_iov_vf_task(struct work_struct *work);
8751408cc1fSYuval Mintz #else
87636558c3dSYuval Mintz static inline void qed_vf_get_link_params(struct qed_hwfn *p_hwfn,
87736558c3dSYuval Mintz 					  struct qed_mcp_link_params *params)
87836558c3dSYuval Mintz {
87936558c3dSYuval Mintz }
88036558c3dSYuval Mintz 
88136558c3dSYuval Mintz static inline void qed_vf_get_link_state(struct qed_hwfn *p_hwfn,
88236558c3dSYuval Mintz 					 struct qed_mcp_link_state *link)
88336558c3dSYuval Mintz {
88436558c3dSYuval Mintz }
88536558c3dSYuval Mintz 
88636558c3dSYuval Mintz static inline void
88736558c3dSYuval Mintz qed_vf_get_link_caps(struct qed_hwfn *p_hwfn,
88836558c3dSYuval Mintz 		     struct qed_mcp_link_capabilities *p_link_caps)
88936558c3dSYuval Mintz {
89036558c3dSYuval Mintz }
89136558c3dSYuval Mintz 
8921408cc1fSYuval Mintz static inline void qed_vf_get_num_rxqs(struct qed_hwfn *p_hwfn, u8 *num_rxqs)
8931408cc1fSYuval Mintz {
8941408cc1fSYuval Mintz }
8951408cc1fSYuval Mintz 
8961408cc1fSYuval Mintz static inline void qed_vf_get_port_mac(struct qed_hwfn *p_hwfn, u8 *port_mac)
8971408cc1fSYuval Mintz {
8981408cc1fSYuval Mintz }
8991408cc1fSYuval Mintz 
9001408cc1fSYuval Mintz static inline void qed_vf_get_num_vlan_filters(struct qed_hwfn *p_hwfn,
9011408cc1fSYuval Mintz 					       u8 *num_vlan_filters)
9021408cc1fSYuval Mintz {
9031408cc1fSYuval Mintz }
9041408cc1fSYuval Mintz 
905b0fca312SMintz, Yuval static inline void qed_vf_get_num_mac_filters(struct qed_hwfn *p_hwfn,
906b0fca312SMintz, Yuval 					      u8 *num_mac_filters)
907b0fca312SMintz, Yuval {
908b0fca312SMintz, Yuval }
909b0fca312SMintz, Yuval 
910eff16960SYuval Mintz static inline bool qed_vf_check_mac(struct qed_hwfn *p_hwfn, u8 *mac)
911eff16960SYuval Mintz {
912eff16960SYuval Mintz 	return false;
913eff16960SYuval Mintz }
914eff16960SYuval Mintz 
9151408cc1fSYuval Mintz static inline void qed_vf_get_fw_version(struct qed_hwfn *p_hwfn,
9161408cc1fSYuval Mintz 					 u16 *fw_major, u16 *fw_minor,
9171408cc1fSYuval Mintz 					 u16 *fw_rev, u16 *fw_eng)
9181408cc1fSYuval Mintz {
9191408cc1fSYuval Mintz }
9201408cc1fSYuval Mintz 
9211408cc1fSYuval Mintz static inline int qed_vf_hw_prepare(struct qed_hwfn *p_hwfn)
9221408cc1fSYuval Mintz {
9231408cc1fSYuval Mintz 	return -EINVAL;
9241408cc1fSYuval Mintz }
9251408cc1fSYuval Mintz 
926dacd88d6SYuval Mintz static inline int qed_vf_pf_rxq_start(struct qed_hwfn *p_hwfn,
9273da7a37aSMintz, Yuval 				      struct qed_queue_cid *p_cid,
928dacd88d6SYuval Mintz 				      u16 bd_max_bytes,
929dacd88d6SYuval Mintz 				      dma_addr_t bd_chain_phys_adr,
930dacd88d6SYuval Mintz 				      dma_addr_t cqe_pbl_addr,
931dacd88d6SYuval Mintz 				      u16 cqe_pbl_size, void __iomem **pp_prod)
932dacd88d6SYuval Mintz {
933dacd88d6SYuval Mintz 	return -EINVAL;
934dacd88d6SYuval Mintz }
935dacd88d6SYuval Mintz 
936dacd88d6SYuval Mintz static inline int qed_vf_pf_txq_start(struct qed_hwfn *p_hwfn,
9373da7a37aSMintz, Yuval 				      struct qed_queue_cid *p_cid,
938dacd88d6SYuval Mintz 				      dma_addr_t pbl_addr,
939dacd88d6SYuval Mintz 				      u16 pbl_size, void __iomem **pp_doorbell)
940dacd88d6SYuval Mintz {
941dacd88d6SYuval Mintz 	return -EINVAL;
942dacd88d6SYuval Mintz }
943dacd88d6SYuval Mintz 
944dacd88d6SYuval Mintz static inline int qed_vf_pf_rxq_stop(struct qed_hwfn *p_hwfn,
9453da7a37aSMintz, Yuval 				     struct qed_queue_cid *p_cid,
9463da7a37aSMintz, Yuval 				     bool cqe_completion)
947dacd88d6SYuval Mintz {
948dacd88d6SYuval Mintz 	return -EINVAL;
949dacd88d6SYuval Mintz }
950dacd88d6SYuval Mintz 
9513da7a37aSMintz, Yuval static inline int qed_vf_pf_txq_stop(struct qed_hwfn *p_hwfn,
9523da7a37aSMintz, Yuval 				     struct qed_queue_cid *p_cid)
953dacd88d6SYuval Mintz {
954dacd88d6SYuval Mintz 	return -EINVAL;
955dacd88d6SYuval Mintz }
956dacd88d6SYuval Mintz 
957dacd88d6SYuval Mintz static inline int
958dacd88d6SYuval Mintz qed_vf_pf_vport_update(struct qed_hwfn *p_hwfn,
959dacd88d6SYuval Mintz 		       struct qed_sp_vport_update_params *p_params)
960dacd88d6SYuval Mintz {
961dacd88d6SYuval Mintz 	return -EINVAL;
962dacd88d6SYuval Mintz }
963dacd88d6SYuval Mintz 
9640b55e27dSYuval Mintz static inline int qed_vf_pf_reset(struct qed_hwfn *p_hwfn)
9650b55e27dSYuval Mintz {
9660b55e27dSYuval Mintz 	return -EINVAL;
9670b55e27dSYuval Mintz }
9680b55e27dSYuval Mintz 
9690b55e27dSYuval Mintz static inline int qed_vf_pf_release(struct qed_hwfn *p_hwfn)
9700b55e27dSYuval Mintz {
9710b55e27dSYuval Mintz 	return -EINVAL;
9720b55e27dSYuval Mintz }
9730b55e27dSYuval Mintz 
9741408cc1fSYuval Mintz static inline u16 qed_vf_get_igu_sb_id(struct qed_hwfn *p_hwfn, u16 sb_id)
9751408cc1fSYuval Mintz {
9761408cc1fSYuval Mintz 	return 0;
9771408cc1fSYuval Mintz }
9780b55e27dSYuval Mintz 
979dacd88d6SYuval Mintz static inline int qed_vf_pf_vport_start(struct qed_hwfn *p_hwfn,
980dacd88d6SYuval Mintz 					u8 vport_id,
981dacd88d6SYuval Mintz 					u16 mtu,
982dacd88d6SYuval Mintz 					u8 inner_vlan_removal,
983dacd88d6SYuval Mintz 					enum qed_tpa_mode tpa_mode,
98408feecd7SYuval Mintz 					u8 max_buffers_per_cqe,
98508feecd7SYuval Mintz 					u8 only_untagged)
986dacd88d6SYuval Mintz {
987dacd88d6SYuval Mintz 	return -EINVAL;
988dacd88d6SYuval Mintz }
989dacd88d6SYuval Mintz 
990dacd88d6SYuval Mintz static inline int qed_vf_pf_vport_stop(struct qed_hwfn *p_hwfn)
991dacd88d6SYuval Mintz {
992dacd88d6SYuval Mintz 	return -EINVAL;
993dacd88d6SYuval Mintz }
994dacd88d6SYuval Mintz 
995dacd88d6SYuval Mintz static inline int qed_vf_pf_filter_ucast(struct qed_hwfn *p_hwfn,
996dacd88d6SYuval Mintz 					 struct qed_filter_ucast *p_param)
997dacd88d6SYuval Mintz {
998dacd88d6SYuval Mintz 	return -EINVAL;
999dacd88d6SYuval Mintz }
1000dacd88d6SYuval Mintz 
1001dacd88d6SYuval Mintz static inline void qed_vf_pf_filter_mcast(struct qed_hwfn *p_hwfn,
1002dacd88d6SYuval Mintz 					  struct qed_filter_mcast *p_filter_cmd)
1003dacd88d6SYuval Mintz {
1004dacd88d6SYuval Mintz }
1005dacd88d6SYuval Mintz 
10060b55e27dSYuval Mintz static inline int qed_vf_pf_int_cleanup(struct qed_hwfn *p_hwfn)
10070b55e27dSYuval Mintz {
10080b55e27dSYuval Mintz 	return -EINVAL;
10090b55e27dSYuval Mintz }
101036558c3dSYuval Mintz 
101136558c3dSYuval Mintz static inline void __qed_vf_get_link_params(struct qed_hwfn *p_hwfn,
101236558c3dSYuval Mintz 					    struct qed_mcp_link_params
101336558c3dSYuval Mintz 					    *p_params,
101436558c3dSYuval Mintz 					    struct qed_bulletin_content
101536558c3dSYuval Mintz 					    *p_bulletin)
101636558c3dSYuval Mintz {
101736558c3dSYuval Mintz }
101836558c3dSYuval Mintz 
101936558c3dSYuval Mintz static inline void __qed_vf_get_link_state(struct qed_hwfn *p_hwfn,
102036558c3dSYuval Mintz 					   struct qed_mcp_link_state *p_link,
102136558c3dSYuval Mintz 					   struct qed_bulletin_content
102236558c3dSYuval Mintz 					   *p_bulletin)
102336558c3dSYuval Mintz {
102436558c3dSYuval Mintz }
102536558c3dSYuval Mintz 
102636558c3dSYuval Mintz static inline void
102736558c3dSYuval Mintz __qed_vf_get_link_caps(struct qed_hwfn *p_hwfn,
102836558c3dSYuval Mintz 		       struct qed_mcp_link_capabilities *p_link_caps,
102936558c3dSYuval Mintz 		       struct qed_bulletin_content *p_bulletin)
103036558c3dSYuval Mintz {
103136558c3dSYuval Mintz }
103236558c3dSYuval Mintz 
103336558c3dSYuval Mintz static inline void qed_iov_vf_task(struct work_struct *work)
103436558c3dSYuval Mintz {
103536558c3dSYuval Mintz }
10361408cc1fSYuval Mintz #endif
10371408cc1fSYuval Mintz 
103832a47e72SYuval Mintz #endif
1039