1*14b24e2bSVaishali Kulkarni /*
2*14b24e2bSVaishali Kulkarni * CDDL HEADER START
3*14b24e2bSVaishali Kulkarni *
4*14b24e2bSVaishali Kulkarni * The contents of this file are subject to the terms of the
5*14b24e2bSVaishali Kulkarni * Common Development and Distribution License, v.1,  (the "License").
6*14b24e2bSVaishali Kulkarni * You may not use this file except in compliance with the License.
7*14b24e2bSVaishali Kulkarni *
8*14b24e2bSVaishali Kulkarni * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*14b24e2bSVaishali Kulkarni * or http://opensource.org/licenses/CDDL-1.0.
10*14b24e2bSVaishali Kulkarni * See the License for the specific language governing permissions
11*14b24e2bSVaishali Kulkarni * and limitations under the License.
12*14b24e2bSVaishali Kulkarni *
13*14b24e2bSVaishali Kulkarni * When distributing Covered Code, include this CDDL HEADER in each
14*14b24e2bSVaishali Kulkarni * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*14b24e2bSVaishali Kulkarni * If applicable, add the following below this CDDL HEADER, with the
16*14b24e2bSVaishali Kulkarni * fields enclosed by brackets "[]" replaced with your own identifying
17*14b24e2bSVaishali Kulkarni * information: Portions Copyright [yyyy] [name of copyright owner]
18*14b24e2bSVaishali Kulkarni *
19*14b24e2bSVaishali Kulkarni * CDDL HEADER END
20*14b24e2bSVaishali Kulkarni */
21*14b24e2bSVaishali Kulkarni 
22*14b24e2bSVaishali Kulkarni /*
23*14b24e2bSVaishali Kulkarni * Copyright 2014-2017 Cavium, Inc.
24*14b24e2bSVaishali Kulkarni * The contents of this file are subject to the terms of the Common Development
25*14b24e2bSVaishali Kulkarni * and Distribution License, v.1,  (the "License").
26*14b24e2bSVaishali Kulkarni 
27*14b24e2bSVaishali Kulkarni * You may not use this file except in compliance with the License.
28*14b24e2bSVaishali Kulkarni 
29*14b24e2bSVaishali Kulkarni * You can obtain a copy of the License at available
30*14b24e2bSVaishali Kulkarni * at http://opensource.org/licenses/CDDL-1.0
31*14b24e2bSVaishali Kulkarni 
32*14b24e2bSVaishali Kulkarni * See the License for the specific language governing permissions and
33*14b24e2bSVaishali Kulkarni * limitations under the License.
34*14b24e2bSVaishali Kulkarni */
35*14b24e2bSVaishali Kulkarni 
36*14b24e2bSVaishali Kulkarni #include "bcm_osal.h"
37*14b24e2bSVaishali Kulkarni 
38*14b24e2bSVaishali Kulkarni #include "ecore.h"
39*14b24e2bSVaishali Kulkarni #include "ecore_status.h"
40*14b24e2bSVaishali Kulkarni #include "ecore_chain.h"
41*14b24e2bSVaishali Kulkarni #include "ecore_spq.h"
42*14b24e2bSVaishali Kulkarni #include "ecore_init_fw_funcs.h"
43*14b24e2bSVaishali Kulkarni #include "ecore_cxt.h"
44*14b24e2bSVaishali Kulkarni #include "ecore_sp_commands.h"
45*14b24e2bSVaishali Kulkarni #include "ecore_gtt_reg_addr.h"
46*14b24e2bSVaishali Kulkarni #include "ecore_iro.h"
47*14b24e2bSVaishali Kulkarni #include "reg_addr.h"
48*14b24e2bSVaishali Kulkarni #include "ecore_int.h"
49*14b24e2bSVaishali Kulkarni #include "ecore_hw.h"
50*14b24e2bSVaishali Kulkarni #include "ecore_dcbx.h"
51*14b24e2bSVaishali Kulkarni #include "ecore_sriov.h"
52*14b24e2bSVaishali Kulkarni #include "ecore_vf.h"
53*14b24e2bSVaishali Kulkarni 
ecore_sp_init_request(struct ecore_hwfn * p_hwfn,struct ecore_spq_entry ** pp_ent,u8 cmd,u8 protocol,struct ecore_sp_init_data * p_data)54*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_sp_init_request(struct ecore_hwfn *p_hwfn,
55*14b24e2bSVaishali Kulkarni 					   struct ecore_spq_entry **pp_ent,
56*14b24e2bSVaishali Kulkarni 					   u8 cmd,
57*14b24e2bSVaishali Kulkarni 					   u8 protocol,
58*14b24e2bSVaishali Kulkarni 					   struct ecore_sp_init_data *p_data)
59*14b24e2bSVaishali Kulkarni {
60*14b24e2bSVaishali Kulkarni 	u32 opaque_cid = p_data->opaque_fid << 16 | p_data->cid;
61*14b24e2bSVaishali Kulkarni 	struct ecore_spq_entry *p_ent = OSAL_NULL;
62*14b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
63*14b24e2bSVaishali Kulkarni 
64*14b24e2bSVaishali Kulkarni 	if (!pp_ent)
65*14b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
66*14b24e2bSVaishali Kulkarni 
67*14b24e2bSVaishali Kulkarni 	/* Get an SPQ entry */
68*14b24e2bSVaishali Kulkarni 	rc = ecore_spq_get_entry(p_hwfn, pp_ent);
69*14b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
70*14b24e2bSVaishali Kulkarni 		return rc;
71*14b24e2bSVaishali Kulkarni 
72*14b24e2bSVaishali Kulkarni 	/* Fill the SPQ entry */
73*14b24e2bSVaishali Kulkarni 	p_ent = *pp_ent;
74*14b24e2bSVaishali Kulkarni 	p_ent->elem.hdr.cid = OSAL_CPU_TO_LE32(opaque_cid);
75*14b24e2bSVaishali Kulkarni 	p_ent->elem.hdr.cmd_id = cmd;
76*14b24e2bSVaishali Kulkarni 	p_ent->elem.hdr.protocol_id = protocol;
77*14b24e2bSVaishali Kulkarni 	p_ent->priority = ECORE_SPQ_PRIORITY_NORMAL;
78*14b24e2bSVaishali Kulkarni 	p_ent->comp_mode = p_data->comp_mode;
79*14b24e2bSVaishali Kulkarni 	p_ent->comp_done.done = 0;
80*14b24e2bSVaishali Kulkarni 
81*14b24e2bSVaishali Kulkarni 	switch (p_ent->comp_mode) {
82*14b24e2bSVaishali Kulkarni 	case ECORE_SPQ_MODE_EBLOCK:
83*14b24e2bSVaishali Kulkarni 		p_ent->comp_cb.cookie = &p_ent->comp_done;
84*14b24e2bSVaishali Kulkarni 		break;
85*14b24e2bSVaishali Kulkarni 
86*14b24e2bSVaishali Kulkarni 	case ECORE_SPQ_MODE_BLOCK:
87*14b24e2bSVaishali Kulkarni 		if (!p_data->p_comp_data)
88*14b24e2bSVaishali Kulkarni 			return ECORE_INVAL;
89*14b24e2bSVaishali Kulkarni 
90*14b24e2bSVaishali Kulkarni 		p_ent->comp_cb.cookie = p_data->p_comp_data->cookie;
91*14b24e2bSVaishali Kulkarni 		break;
92*14b24e2bSVaishali Kulkarni 
93*14b24e2bSVaishali Kulkarni 	case ECORE_SPQ_MODE_CB:
94*14b24e2bSVaishali Kulkarni 		if (!p_data->p_comp_data)
95*14b24e2bSVaishali Kulkarni 			p_ent->comp_cb.function = OSAL_NULL;
96*14b24e2bSVaishali Kulkarni 		else
97*14b24e2bSVaishali Kulkarni 			p_ent->comp_cb = *p_data->p_comp_data;
98*14b24e2bSVaishali Kulkarni 		break;
99*14b24e2bSVaishali Kulkarni 
100*14b24e2bSVaishali Kulkarni 	default:
101*14b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, true, "Unknown SPQE completion mode %d\n",
102*14b24e2bSVaishali Kulkarni 			  p_ent->comp_mode);
103*14b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
104*14b24e2bSVaishali Kulkarni 	}
105*14b24e2bSVaishali Kulkarni 
106*14b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_SPQ,
107*14b24e2bSVaishali Kulkarni 		   "Initialized: CID %08x cmd %02x protocol %02x data_addr %lu comp_mode [%s]\n",
108*14b24e2bSVaishali Kulkarni 		   opaque_cid, cmd, protocol,
109*14b24e2bSVaishali Kulkarni 		   (unsigned long)&p_ent->ramrod,
110*14b24e2bSVaishali Kulkarni 		   D_TRINE(p_ent->comp_mode, ECORE_SPQ_MODE_EBLOCK,
111*14b24e2bSVaishali Kulkarni 			   ECORE_SPQ_MODE_BLOCK, "MODE_EBLOCK", "MODE_BLOCK",
112*14b24e2bSVaishali Kulkarni 			   "MODE_CB"));
113*14b24e2bSVaishali Kulkarni 
114*14b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&p_ent->ramrod, 0, sizeof(p_ent->ramrod));
115*14b24e2bSVaishali Kulkarni 
116*14b24e2bSVaishali Kulkarni 	return ECORE_SUCCESS;
117*14b24e2bSVaishali Kulkarni }
118*14b24e2bSVaishali Kulkarni 
ecore_tunn_clss_to_fw_clss(u8 type)119*14b24e2bSVaishali Kulkarni static enum tunnel_clss ecore_tunn_clss_to_fw_clss(u8 type)
120*14b24e2bSVaishali Kulkarni {
121*14b24e2bSVaishali Kulkarni 	switch (type) {
122*14b24e2bSVaishali Kulkarni 	case ECORE_TUNN_CLSS_MAC_VLAN:
123*14b24e2bSVaishali Kulkarni 		return TUNNEL_CLSS_MAC_VLAN;
124*14b24e2bSVaishali Kulkarni 	case ECORE_TUNN_CLSS_MAC_VNI:
125*14b24e2bSVaishali Kulkarni 		return TUNNEL_CLSS_MAC_VNI;
126*14b24e2bSVaishali Kulkarni 	case ECORE_TUNN_CLSS_INNER_MAC_VLAN:
127*14b24e2bSVaishali Kulkarni 		return TUNNEL_CLSS_INNER_MAC_VLAN;
128*14b24e2bSVaishali Kulkarni 	case ECORE_TUNN_CLSS_INNER_MAC_VNI:
129*14b24e2bSVaishali Kulkarni 		return TUNNEL_CLSS_INNER_MAC_VNI;
130*14b24e2bSVaishali Kulkarni 	case ECORE_TUNN_CLSS_MAC_VLAN_DUAL_STAGE:
131*14b24e2bSVaishali Kulkarni 		return TUNNEL_CLSS_MAC_VLAN_DUAL_STAGE;
132*14b24e2bSVaishali Kulkarni 	default:
133*14b24e2bSVaishali Kulkarni 		return TUNNEL_CLSS_MAC_VLAN;
134*14b24e2bSVaishali Kulkarni 	}
135*14b24e2bSVaishali Kulkarni }
136*14b24e2bSVaishali Kulkarni 
137*14b24e2bSVaishali Kulkarni static void
ecore_set_pf_update_tunn_mode(struct ecore_tunnel_info * p_tun,struct ecore_tunnel_info * p_src,bool b_pf_start)138*14b24e2bSVaishali Kulkarni ecore_set_pf_update_tunn_mode(struct ecore_tunnel_info *p_tun,
139*14b24e2bSVaishali Kulkarni 			      struct ecore_tunnel_info *p_src,
140*14b24e2bSVaishali Kulkarni 			      bool b_pf_start)
141*14b24e2bSVaishali Kulkarni {
142*14b24e2bSVaishali Kulkarni 	if (p_src->vxlan.b_update_mode || b_pf_start)
143*14b24e2bSVaishali Kulkarni 		p_tun->vxlan.b_mode_enabled = p_src->vxlan.b_mode_enabled;
144*14b24e2bSVaishali Kulkarni 
145*14b24e2bSVaishali Kulkarni 	if (p_src->l2_gre.b_update_mode || b_pf_start)
146*14b24e2bSVaishali Kulkarni 		p_tun->l2_gre.b_mode_enabled = p_src->l2_gre.b_mode_enabled;
147*14b24e2bSVaishali Kulkarni 
148*14b24e2bSVaishali Kulkarni 	if (p_src->ip_gre.b_update_mode || b_pf_start)
149*14b24e2bSVaishali Kulkarni 		p_tun->ip_gre.b_mode_enabled = p_src->ip_gre.b_mode_enabled;
150*14b24e2bSVaishali Kulkarni 
151*14b24e2bSVaishali Kulkarni 	if (p_src->l2_geneve.b_update_mode || b_pf_start)
152*14b24e2bSVaishali Kulkarni 		p_tun->l2_geneve.b_mode_enabled =
153*14b24e2bSVaishali Kulkarni 				p_src->l2_geneve.b_mode_enabled;
154*14b24e2bSVaishali Kulkarni 
155*14b24e2bSVaishali Kulkarni 	if (p_src->ip_geneve.b_update_mode || b_pf_start)
156*14b24e2bSVaishali Kulkarni 		p_tun->ip_geneve.b_mode_enabled =
157*14b24e2bSVaishali Kulkarni 				p_src->ip_geneve.b_mode_enabled;
158*14b24e2bSVaishali Kulkarni }
159*14b24e2bSVaishali Kulkarni 
ecore_set_tunn_cls_info(struct ecore_tunnel_info * p_tun,struct ecore_tunnel_info * p_src)160*14b24e2bSVaishali Kulkarni static void ecore_set_tunn_cls_info(struct ecore_tunnel_info *p_tun,
161*14b24e2bSVaishali Kulkarni 				    struct ecore_tunnel_info *p_src)
162*14b24e2bSVaishali Kulkarni {
163*14b24e2bSVaishali Kulkarni 	enum tunnel_clss type;
164*14b24e2bSVaishali Kulkarni 
165*14b24e2bSVaishali Kulkarni 	p_tun->b_update_rx_cls = p_src->b_update_rx_cls;
166*14b24e2bSVaishali Kulkarni 	p_tun->b_update_tx_cls = p_src->b_update_tx_cls;
167*14b24e2bSVaishali Kulkarni 
168*14b24e2bSVaishali Kulkarni 	type = ecore_tunn_clss_to_fw_clss(p_src->vxlan.tun_cls);
169*14b24e2bSVaishali Kulkarni 	p_tun->vxlan.tun_cls = (enum ecore_tunn_clss)type;
170*14b24e2bSVaishali Kulkarni 	type = ecore_tunn_clss_to_fw_clss(p_src->l2_gre.tun_cls);
171*14b24e2bSVaishali Kulkarni 	p_tun->l2_gre.tun_cls = (enum ecore_tunn_clss)type;
172*14b24e2bSVaishali Kulkarni 	type = ecore_tunn_clss_to_fw_clss(p_src->ip_gre.tun_cls);
173*14b24e2bSVaishali Kulkarni 	p_tun->ip_gre.tun_cls = (enum ecore_tunn_clss)type;
174*14b24e2bSVaishali Kulkarni 	type = ecore_tunn_clss_to_fw_clss(p_src->l2_geneve.tun_cls);
175*14b24e2bSVaishali Kulkarni 	p_tun->l2_geneve.tun_cls = (enum ecore_tunn_clss)type;
176*14b24e2bSVaishali Kulkarni 	type = ecore_tunn_clss_to_fw_clss(p_src->ip_geneve.tun_cls);
177*14b24e2bSVaishali Kulkarni 	p_tun->ip_geneve.tun_cls = (enum ecore_tunn_clss)type;
178*14b24e2bSVaishali Kulkarni }
179*14b24e2bSVaishali Kulkarni 
ecore_set_tunn_ports(struct ecore_tunnel_info * p_tun,struct ecore_tunnel_info * p_src)180*14b24e2bSVaishali Kulkarni static void ecore_set_tunn_ports(struct ecore_tunnel_info *p_tun,
181*14b24e2bSVaishali Kulkarni 				 struct ecore_tunnel_info *p_src)
182*14b24e2bSVaishali Kulkarni {
183*14b24e2bSVaishali Kulkarni 	p_tun->geneve_port.b_update_port = p_src->geneve_port.b_update_port;
184*14b24e2bSVaishali Kulkarni 	p_tun->vxlan_port.b_update_port = p_src->vxlan_port.b_update_port;
185*14b24e2bSVaishali Kulkarni 
186*14b24e2bSVaishali Kulkarni 	if (p_src->geneve_port.b_update_port)
187*14b24e2bSVaishali Kulkarni 		p_tun->geneve_port.port = p_src->geneve_port.port;
188*14b24e2bSVaishali Kulkarni 
189*14b24e2bSVaishali Kulkarni 	if (p_src->vxlan_port.b_update_port)
190*14b24e2bSVaishali Kulkarni 		p_tun->vxlan_port.port = p_src->vxlan_port.port;
191*14b24e2bSVaishali Kulkarni }
192*14b24e2bSVaishali Kulkarni 
193*14b24e2bSVaishali Kulkarni static void
__ecore_set_ramrod_tunnel_param(u8 * p_tunn_cls,struct ecore_tunn_update_type * tun_type)194*14b24e2bSVaishali Kulkarni __ecore_set_ramrod_tunnel_param(u8 *p_tunn_cls,
195*14b24e2bSVaishali Kulkarni 				struct ecore_tunn_update_type *tun_type)
196*14b24e2bSVaishali Kulkarni {
197*14b24e2bSVaishali Kulkarni 	*p_tunn_cls = tun_type->tun_cls;
198*14b24e2bSVaishali Kulkarni }
199*14b24e2bSVaishali Kulkarni 
200*14b24e2bSVaishali Kulkarni static void
ecore_set_ramrod_tunnel_param(u8 * p_tunn_cls,struct ecore_tunn_update_type * tun_type,u8 * p_update_port,__le16 * p_port,struct ecore_tunn_update_udp_port * p_udp_port)201*14b24e2bSVaishali Kulkarni ecore_set_ramrod_tunnel_param(u8 *p_tunn_cls,
202*14b24e2bSVaishali Kulkarni 			      struct ecore_tunn_update_type *tun_type,
203*14b24e2bSVaishali Kulkarni 			      u8 *p_update_port, __le16 *p_port,
204*14b24e2bSVaishali Kulkarni 			      struct ecore_tunn_update_udp_port *p_udp_port)
205*14b24e2bSVaishali Kulkarni {
206*14b24e2bSVaishali Kulkarni 	__ecore_set_ramrod_tunnel_param(p_tunn_cls, tun_type);
207*14b24e2bSVaishali Kulkarni 	if (p_udp_port->b_update_port) {
208*14b24e2bSVaishali Kulkarni 		*p_update_port = 1;
209*14b24e2bSVaishali Kulkarni 		*p_port = OSAL_CPU_TO_LE16(p_udp_port->port);
210*14b24e2bSVaishali Kulkarni 	}
211*14b24e2bSVaishali Kulkarni }
212*14b24e2bSVaishali Kulkarni 
213*14b24e2bSVaishali Kulkarni static void
ecore_tunn_set_pf_update_params(struct ecore_hwfn * p_hwfn,struct ecore_tunnel_info * p_src,struct pf_update_tunnel_config * p_tunn_cfg)214*14b24e2bSVaishali Kulkarni ecore_tunn_set_pf_update_params(struct ecore_hwfn		*p_hwfn,
215*14b24e2bSVaishali Kulkarni 				struct ecore_tunnel_info *p_src,
216*14b24e2bSVaishali Kulkarni 				struct pf_update_tunnel_config	*p_tunn_cfg)
217*14b24e2bSVaishali Kulkarni {
218*14b24e2bSVaishali Kulkarni 	struct ecore_tunnel_info *p_tun = &p_hwfn->p_dev->tunnel;
219*14b24e2bSVaishali Kulkarni 
220*14b24e2bSVaishali Kulkarni 	ecore_set_pf_update_tunn_mode(p_tun, p_src, false);
221*14b24e2bSVaishali Kulkarni 	ecore_set_tunn_cls_info(p_tun, p_src);
222*14b24e2bSVaishali Kulkarni 	ecore_set_tunn_ports(p_tun, p_src);
223*14b24e2bSVaishali Kulkarni 
224*14b24e2bSVaishali Kulkarni 	ecore_set_ramrod_tunnel_param(&p_tunn_cfg->tunnel_clss_vxlan,
225*14b24e2bSVaishali Kulkarni 				      &p_tun->vxlan,
226*14b24e2bSVaishali Kulkarni 				      &p_tunn_cfg->set_vxlan_udp_port_flg,
227*14b24e2bSVaishali Kulkarni 				      &p_tunn_cfg->vxlan_udp_port,
228*14b24e2bSVaishali Kulkarni 				      &p_tun->vxlan_port);
229*14b24e2bSVaishali Kulkarni 
230*14b24e2bSVaishali Kulkarni 	ecore_set_ramrod_tunnel_param(&p_tunn_cfg->tunnel_clss_l2geneve,
231*14b24e2bSVaishali Kulkarni 				      &p_tun->l2_geneve,
232*14b24e2bSVaishali Kulkarni 				      &p_tunn_cfg->set_geneve_udp_port_flg,
233*14b24e2bSVaishali Kulkarni 				      &p_tunn_cfg->geneve_udp_port,
234*14b24e2bSVaishali Kulkarni 				      &p_tun->geneve_port);
235*14b24e2bSVaishali Kulkarni 
236*14b24e2bSVaishali Kulkarni 	__ecore_set_ramrod_tunnel_param(&p_tunn_cfg->tunnel_clss_ipgeneve,
237*14b24e2bSVaishali Kulkarni 					&p_tun->ip_geneve);
238*14b24e2bSVaishali Kulkarni 
239*14b24e2bSVaishali Kulkarni 	__ecore_set_ramrod_tunnel_param(&p_tunn_cfg->tunnel_clss_l2gre,
240*14b24e2bSVaishali Kulkarni 					&p_tun->l2_gre);
241*14b24e2bSVaishali Kulkarni 
242*14b24e2bSVaishali Kulkarni 	__ecore_set_ramrod_tunnel_param(&p_tunn_cfg->tunnel_clss_ipgre,
243*14b24e2bSVaishali Kulkarni 					&p_tun->ip_gre);
244*14b24e2bSVaishali Kulkarni 
245*14b24e2bSVaishali Kulkarni 	p_tunn_cfg->update_rx_pf_clss = p_tun->b_update_rx_cls;
246*14b24e2bSVaishali Kulkarni }
247*14b24e2bSVaishali Kulkarni 
ecore_set_hw_tunn_mode(struct ecore_hwfn * p_hwfn,struct ecore_ptt * p_ptt,struct ecore_tunnel_info * p_tun)248*14b24e2bSVaishali Kulkarni static void ecore_set_hw_tunn_mode(struct ecore_hwfn *p_hwfn,
249*14b24e2bSVaishali Kulkarni 				   struct ecore_ptt  *p_ptt,
250*14b24e2bSVaishali Kulkarni 				   struct ecore_tunnel_info *p_tun)
251*14b24e2bSVaishali Kulkarni {
252*14b24e2bSVaishali Kulkarni 	ecore_set_gre_enable(p_hwfn, p_ptt, p_tun->l2_gre.b_mode_enabled,
253*14b24e2bSVaishali Kulkarni 			     p_tun->ip_gre.b_mode_enabled);
254*14b24e2bSVaishali Kulkarni 	ecore_set_vxlan_enable(p_hwfn, p_ptt, p_tun->vxlan.b_mode_enabled);
255*14b24e2bSVaishali Kulkarni 
256*14b24e2bSVaishali Kulkarni 	ecore_set_geneve_enable(p_hwfn, p_ptt, p_tun->l2_geneve.b_mode_enabled,
257*14b24e2bSVaishali Kulkarni 				p_tun->ip_geneve.b_mode_enabled);
258*14b24e2bSVaishali Kulkarni }
259*14b24e2bSVaishali Kulkarni 
ecore_set_hw_tunn_mode_port(struct ecore_hwfn * p_hwfn,struct ecore_tunnel_info * p_tunn)260*14b24e2bSVaishali Kulkarni static void ecore_set_hw_tunn_mode_port(struct ecore_hwfn *p_hwfn,
261*14b24e2bSVaishali Kulkarni 					struct ecore_tunnel_info *p_tunn)
262*14b24e2bSVaishali Kulkarni {
263*14b24e2bSVaishali Kulkarni 	if (ECORE_IS_BB_A0(p_hwfn->p_dev)) {
264*14b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, true,
265*14b24e2bSVaishali Kulkarni 			  "A0 chip: tunnel hw config is not supported\n");
266*14b24e2bSVaishali Kulkarni 		return;
267*14b24e2bSVaishali Kulkarni 	}
268*14b24e2bSVaishali Kulkarni 
269*14b24e2bSVaishali Kulkarni 	if (p_tunn->vxlan_port.b_update_port)
270*14b24e2bSVaishali Kulkarni 		ecore_set_vxlan_dest_port(p_hwfn, p_hwfn->p_main_ptt,
271*14b24e2bSVaishali Kulkarni 					  p_tunn->vxlan_port.port);
272*14b24e2bSVaishali Kulkarni 
273*14b24e2bSVaishali Kulkarni 	if (p_tunn->geneve_port.b_update_port)
274*14b24e2bSVaishali Kulkarni 		ecore_set_geneve_dest_port(p_hwfn, p_hwfn->p_main_ptt,
275*14b24e2bSVaishali Kulkarni 					   p_tunn->geneve_port.port);
276*14b24e2bSVaishali Kulkarni 
277*14b24e2bSVaishali Kulkarni 	ecore_set_hw_tunn_mode(p_hwfn, p_hwfn->p_main_ptt, p_tunn);
278*14b24e2bSVaishali Kulkarni }
279*14b24e2bSVaishali Kulkarni 
280*14b24e2bSVaishali Kulkarni static void
ecore_tunn_set_pf_start_params(struct ecore_hwfn * p_hwfn,struct ecore_tunnel_info * p_src,struct pf_start_tunnel_config * p_tunn_cfg)281*14b24e2bSVaishali Kulkarni ecore_tunn_set_pf_start_params(struct ecore_hwfn		*p_hwfn,
282*14b24e2bSVaishali Kulkarni 			       struct ecore_tunnel_info		*p_src,
283*14b24e2bSVaishali Kulkarni 			       struct pf_start_tunnel_config	*p_tunn_cfg)
284*14b24e2bSVaishali Kulkarni {
285*14b24e2bSVaishali Kulkarni 	struct ecore_tunnel_info *p_tun = &p_hwfn->p_dev->tunnel;
286*14b24e2bSVaishali Kulkarni 
287*14b24e2bSVaishali Kulkarni 	if (ECORE_IS_BB_A0(p_hwfn->p_dev)) {
288*14b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, true,
289*14b24e2bSVaishali Kulkarni 			  "A0 chip: tunnel pf start config is not supported\n");
290*14b24e2bSVaishali Kulkarni 		return;
291*14b24e2bSVaishali Kulkarni 	}
292*14b24e2bSVaishali Kulkarni 
293*14b24e2bSVaishali Kulkarni 	if (!p_src)
294*14b24e2bSVaishali Kulkarni 		return;
295*14b24e2bSVaishali Kulkarni 
296*14b24e2bSVaishali Kulkarni 	ecore_set_pf_update_tunn_mode(p_tun, p_src, true);
297*14b24e2bSVaishali Kulkarni 	ecore_set_tunn_cls_info(p_tun, p_src);
298*14b24e2bSVaishali Kulkarni 	ecore_set_tunn_ports(p_tun, p_src);
299*14b24e2bSVaishali Kulkarni 
300*14b24e2bSVaishali Kulkarni 	ecore_set_ramrod_tunnel_param(&p_tunn_cfg->tunnel_clss_vxlan,
301*14b24e2bSVaishali Kulkarni 				      &p_tun->vxlan,
302*14b24e2bSVaishali Kulkarni 				      &p_tunn_cfg->set_vxlan_udp_port_flg,
303*14b24e2bSVaishali Kulkarni 				      &p_tunn_cfg->vxlan_udp_port,
304*14b24e2bSVaishali Kulkarni 				      &p_tun->vxlan_port);
305*14b24e2bSVaishali Kulkarni 
306*14b24e2bSVaishali Kulkarni 	ecore_set_ramrod_tunnel_param(&p_tunn_cfg->tunnel_clss_l2geneve,
307*14b24e2bSVaishali Kulkarni 				      &p_tun->l2_geneve,
308*14b24e2bSVaishali Kulkarni 				      &p_tunn_cfg->set_geneve_udp_port_flg,
309*14b24e2bSVaishali Kulkarni 				      &p_tunn_cfg->geneve_udp_port,
310*14b24e2bSVaishali Kulkarni 				      &p_tun->geneve_port);
311*14b24e2bSVaishali Kulkarni 
312*14b24e2bSVaishali Kulkarni 	__ecore_set_ramrod_tunnel_param(&p_tunn_cfg->tunnel_clss_ipgeneve,
313*14b24e2bSVaishali Kulkarni 					&p_tun->ip_geneve);
314*14b24e2bSVaishali Kulkarni 
315*14b24e2bSVaishali Kulkarni 	__ecore_set_ramrod_tunnel_param(&p_tunn_cfg->tunnel_clss_l2gre,
316*14b24e2bSVaishali Kulkarni 					&p_tun->l2_gre);
317*14b24e2bSVaishali Kulkarni 
318*14b24e2bSVaishali Kulkarni 	__ecore_set_ramrod_tunnel_param(&p_tunn_cfg->tunnel_clss_ipgre,
319*14b24e2bSVaishali Kulkarni 					&p_tun->ip_gre);
320*14b24e2bSVaishali Kulkarni }
321*14b24e2bSVaishali Kulkarni 
ecore_sp_pf_start(struct ecore_hwfn * p_hwfn,struct ecore_tunnel_info * p_tunn,enum ecore_mf_mode mode,bool allow_npar_tx_switch)322*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_sp_pf_start(struct ecore_hwfn	*p_hwfn,
323*14b24e2bSVaishali Kulkarni 				       struct ecore_tunnel_info *p_tunn,
324*14b24e2bSVaishali Kulkarni 				       enum ecore_mf_mode mode,
325*14b24e2bSVaishali Kulkarni 				       bool allow_npar_tx_switch)
326*14b24e2bSVaishali Kulkarni {
327*14b24e2bSVaishali Kulkarni 	struct pf_start_ramrod_data *p_ramrod = OSAL_NULL;
328*14b24e2bSVaishali Kulkarni 	u16 sb = ecore_int_get_sp_sb_id(p_hwfn);
329*14b24e2bSVaishali Kulkarni 	u8 sb_index = p_hwfn->p_eq->eq_sb_index;
330*14b24e2bSVaishali Kulkarni 	struct ecore_spq_entry *p_ent = OSAL_NULL;
331*14b24e2bSVaishali Kulkarni 	struct ecore_sp_init_data init_data;
332*14b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_NOTIMPL;
333*14b24e2bSVaishali Kulkarni 	u8 page_cnt;
334*14b24e2bSVaishali Kulkarni 
335*14b24e2bSVaishali Kulkarni 	/* update initial eq producer */
336*14b24e2bSVaishali Kulkarni 	ecore_eq_prod_update(p_hwfn,
337*14b24e2bSVaishali Kulkarni 			     ecore_chain_get_prod_idx(&p_hwfn->p_eq->chain));
338*14b24e2bSVaishali Kulkarni 
339*14b24e2bSVaishali Kulkarni 	/* Initialize the SPQ entry for the ramrod */
340*14b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&init_data, 0, sizeof(init_data));
341*14b24e2bSVaishali Kulkarni 	init_data.cid = ecore_spq_get_cid(p_hwfn);
342*14b24e2bSVaishali Kulkarni 	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
343*14b24e2bSVaishali Kulkarni 	init_data.comp_mode = ECORE_SPQ_MODE_EBLOCK;
344*14b24e2bSVaishali Kulkarni 
345*14b24e2bSVaishali Kulkarni 	rc = ecore_sp_init_request(p_hwfn, &p_ent,
346*14b24e2bSVaishali Kulkarni 				   COMMON_RAMROD_PF_START,
347*14b24e2bSVaishali Kulkarni 				   PROTOCOLID_COMMON,
348*14b24e2bSVaishali Kulkarni 				   &init_data);
349*14b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
350*14b24e2bSVaishali Kulkarni 		return rc;
351*14b24e2bSVaishali Kulkarni 
352*14b24e2bSVaishali Kulkarni 	/* Fill the ramrod data */
353*14b24e2bSVaishali Kulkarni 	p_ramrod = &p_ent->ramrod.pf_start;
354*14b24e2bSVaishali Kulkarni 	p_ramrod->event_ring_sb_id = OSAL_CPU_TO_LE16(sb);
355*14b24e2bSVaishali Kulkarni 	p_ramrod->event_ring_sb_index = sb_index;
356*14b24e2bSVaishali Kulkarni 	p_ramrod->path_id = ECORE_PATH_ID(p_hwfn);
357*14b24e2bSVaishali Kulkarni 
358*14b24e2bSVaishali Kulkarni 	/* For easier debugging */
359*14b24e2bSVaishali Kulkarni 	p_ramrod->dont_log_ramrods = 0;
360*14b24e2bSVaishali Kulkarni 	p_ramrod->log_type_mask = OSAL_CPU_TO_LE16(0x8f);
361*14b24e2bSVaishali Kulkarni 
362*14b24e2bSVaishali Kulkarni 	switch (mode) {
363*14b24e2bSVaishali Kulkarni 	case ECORE_MF_DEFAULT:
364*14b24e2bSVaishali Kulkarni 	case ECORE_MF_NPAR:
365*14b24e2bSVaishali Kulkarni 		p_ramrod->mf_mode = MF_NPAR;
366*14b24e2bSVaishali Kulkarni 		break;
367*14b24e2bSVaishali Kulkarni 	case ECORE_MF_OVLAN:
368*14b24e2bSVaishali Kulkarni 		p_ramrod->mf_mode = MF_OVLAN;
369*14b24e2bSVaishali Kulkarni 		break;
370*14b24e2bSVaishali Kulkarni 	default:
371*14b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, true, "Unsupported MF mode, init as DEFAULT\n");
372*14b24e2bSVaishali Kulkarni 		p_ramrod->mf_mode = MF_NPAR;
373*14b24e2bSVaishali Kulkarni 	}
374*14b24e2bSVaishali Kulkarni 	p_ramrod->outer_tag = p_hwfn->hw_info.ovlan;
375*14b24e2bSVaishali Kulkarni 
376*14b24e2bSVaishali Kulkarni 	/* Place EQ address in RAMROD */
377*14b24e2bSVaishali Kulkarni 	DMA_REGPAIR_LE(p_ramrod->event_ring_pbl_addr,
378*14b24e2bSVaishali Kulkarni 		       p_hwfn->p_eq->chain.pbl_sp.p_phys_table);
379*14b24e2bSVaishali Kulkarni 	page_cnt = (u8)ecore_chain_get_page_cnt(&p_hwfn->p_eq->chain);
380*14b24e2bSVaishali Kulkarni 	p_ramrod->event_ring_num_pages = page_cnt;
381*14b24e2bSVaishali Kulkarni 	DMA_REGPAIR_LE(p_ramrod->consolid_q_pbl_addr,
382*14b24e2bSVaishali Kulkarni 		       p_hwfn->p_consq->chain.pbl_sp.p_phys_table);
383*14b24e2bSVaishali Kulkarni 
384*14b24e2bSVaishali Kulkarni 	ecore_tunn_set_pf_start_params(p_hwfn, p_tunn,
385*14b24e2bSVaishali Kulkarni 				       &p_ramrod->tunnel_config);
386*14b24e2bSVaishali Kulkarni 
387*14b24e2bSVaishali Kulkarni 	if (IS_MF_SI(p_hwfn))
388*14b24e2bSVaishali Kulkarni 		p_ramrod->allow_npar_tx_switching = allow_npar_tx_switch;
389*14b24e2bSVaishali Kulkarni 
390*14b24e2bSVaishali Kulkarni 	switch (p_hwfn->hw_info.personality) {
391*14b24e2bSVaishali Kulkarni 	case ECORE_PCI_ETH:
392*14b24e2bSVaishali Kulkarni 		p_ramrod->personality = PERSONALITY_ETH;
393*14b24e2bSVaishali Kulkarni 		break;
394*14b24e2bSVaishali Kulkarni 	case ECORE_PCI_FCOE:
395*14b24e2bSVaishali Kulkarni 		p_ramrod->personality = PERSONALITY_FCOE;
396*14b24e2bSVaishali Kulkarni 		break;
397*14b24e2bSVaishali Kulkarni 	case ECORE_PCI_ISCSI:
398*14b24e2bSVaishali Kulkarni 		p_ramrod->personality = PERSONALITY_ISCSI;
399*14b24e2bSVaishali Kulkarni 		break;
400*14b24e2bSVaishali Kulkarni 	case ECORE_PCI_ETH_IWARP:
401*14b24e2bSVaishali Kulkarni 	case ECORE_PCI_ETH_ROCE:
402*14b24e2bSVaishali Kulkarni 	case ECORE_PCI_ETH_RDMA:
403*14b24e2bSVaishali Kulkarni 		p_ramrod->personality = PERSONALITY_RDMA_AND_ETH;
404*14b24e2bSVaishali Kulkarni 		break;
405*14b24e2bSVaishali Kulkarni 	default:
406*14b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, true, "Unknown personality %d\n",
407*14b24e2bSVaishali Kulkarni 			  p_hwfn->hw_info.personality);
408*14b24e2bSVaishali Kulkarni 		p_ramrod->personality = PERSONALITY_ETH;
409*14b24e2bSVaishali Kulkarni 	}
410*14b24e2bSVaishali Kulkarni 
411*14b24e2bSVaishali Kulkarni 	if (p_hwfn->p_dev->p_iov_info) {
412*14b24e2bSVaishali Kulkarni 		struct ecore_hw_sriov_info *p_iov = p_hwfn->p_dev->p_iov_info;
413*14b24e2bSVaishali Kulkarni 
414*14b24e2bSVaishali Kulkarni 		p_ramrod->base_vf_id = (u8)p_iov->first_vf_in_pf;
415*14b24e2bSVaishali Kulkarni 		p_ramrod->num_vfs = (u8)p_iov->total_vfs;
416*14b24e2bSVaishali Kulkarni 	}
417*14b24e2bSVaishali Kulkarni 	/* @@@TBD - update also the "ROCE_VER_KEY" entries when the FW RoCE HSI
418*14b24e2bSVaishali Kulkarni 	 * version is available.
419*14b24e2bSVaishali Kulkarni 	 */
420*14b24e2bSVaishali Kulkarni 	p_ramrod->hsi_fp_ver.major_ver_arr[ETH_VER_KEY] = ETH_HSI_VER_MAJOR;
421*14b24e2bSVaishali Kulkarni 	p_ramrod->hsi_fp_ver.minor_ver_arr[ETH_VER_KEY] = ETH_HSI_VER_MINOR;
422*14b24e2bSVaishali Kulkarni 
423*14b24e2bSVaishali Kulkarni 	DP_VERBOSE(p_hwfn, ECORE_MSG_SPQ,
424*14b24e2bSVaishali Kulkarni 		   "Setting event_ring_sb [id %04x index %02x], outer_tag [%d]\n",
425*14b24e2bSVaishali Kulkarni 		   sb, sb_index, p_ramrod->outer_tag);
426*14b24e2bSVaishali Kulkarni 
427*14b24e2bSVaishali Kulkarni 	rc = ecore_spq_post(p_hwfn, p_ent, OSAL_NULL);
428*14b24e2bSVaishali Kulkarni 
429*14b24e2bSVaishali Kulkarni 	if (p_tunn)
430*14b24e2bSVaishali Kulkarni 		ecore_set_hw_tunn_mode_port(p_hwfn, &p_hwfn->p_dev->tunnel);
431*14b24e2bSVaishali Kulkarni 
432*14b24e2bSVaishali Kulkarni 	return rc;
433*14b24e2bSVaishali Kulkarni }
434*14b24e2bSVaishali Kulkarni 
ecore_sp_pf_update_dcbx(struct ecore_hwfn * p_hwfn)435*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_sp_pf_update_dcbx(struct ecore_hwfn *p_hwfn)
436*14b24e2bSVaishali Kulkarni {
437*14b24e2bSVaishali Kulkarni 	struct ecore_spq_entry *p_ent = OSAL_NULL;
438*14b24e2bSVaishali Kulkarni 	struct ecore_sp_init_data init_data;
439*14b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_NOTIMPL;
440*14b24e2bSVaishali Kulkarni 
441*14b24e2bSVaishali Kulkarni 	/* Get SPQ entry */
442*14b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&init_data, 0, sizeof(init_data));
443*14b24e2bSVaishali Kulkarni 	init_data.cid = ecore_spq_get_cid(p_hwfn);
444*14b24e2bSVaishali Kulkarni 	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
445*14b24e2bSVaishali Kulkarni 	init_data.comp_mode = ECORE_SPQ_MODE_CB;
446*14b24e2bSVaishali Kulkarni 
447*14b24e2bSVaishali Kulkarni 	rc = ecore_sp_init_request(p_hwfn, &p_ent,
448*14b24e2bSVaishali Kulkarni 				   COMMON_RAMROD_PF_UPDATE, PROTOCOLID_COMMON,
449*14b24e2bSVaishali Kulkarni 				   &init_data);
450*14b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
451*14b24e2bSVaishali Kulkarni 		return rc;
452*14b24e2bSVaishali Kulkarni 
453*14b24e2bSVaishali Kulkarni 	ecore_dcbx_set_pf_update_params(&p_hwfn->p_dcbx_info->results,
454*14b24e2bSVaishali Kulkarni 					&p_ent->ramrod.pf_update);
455*14b24e2bSVaishali Kulkarni 
456*14b24e2bSVaishali Kulkarni 	return ecore_spq_post(p_hwfn, p_ent, OSAL_NULL);
457*14b24e2bSVaishali Kulkarni }
458*14b24e2bSVaishali Kulkarni 
ecore_sp_rl_update(struct ecore_hwfn * p_hwfn,struct ecore_rl_update_params * params)459*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_sp_rl_update(struct ecore_hwfn *p_hwfn,
460*14b24e2bSVaishali Kulkarni 					struct ecore_rl_update_params *params)
461*14b24e2bSVaishali Kulkarni {
462*14b24e2bSVaishali Kulkarni 	struct ecore_spq_entry *p_ent = OSAL_NULL;
463*14b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_NOTIMPL;
464*14b24e2bSVaishali Kulkarni 	struct rl_update_ramrod_data *rl_update;
465*14b24e2bSVaishali Kulkarni 	struct ecore_sp_init_data init_data;
466*14b24e2bSVaishali Kulkarni 
467*14b24e2bSVaishali Kulkarni 	/* Get SPQ entry */
468*14b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&init_data, 0, sizeof(init_data));
469*14b24e2bSVaishali Kulkarni 	init_data.cid = ecore_spq_get_cid(p_hwfn);
470*14b24e2bSVaishali Kulkarni 	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
471*14b24e2bSVaishali Kulkarni 	init_data.comp_mode = ECORE_SPQ_MODE_EBLOCK;
472*14b24e2bSVaishali Kulkarni 
473*14b24e2bSVaishali Kulkarni 	rc = ecore_sp_init_request(p_hwfn, &p_ent,
474*14b24e2bSVaishali Kulkarni 				   COMMON_RAMROD_RL_UPDATE, PROTOCOLID_COMMON,
475*14b24e2bSVaishali Kulkarni 				   &init_data);
476*14b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
477*14b24e2bSVaishali Kulkarni 		return rc;
478*14b24e2bSVaishali Kulkarni 
479*14b24e2bSVaishali Kulkarni 	rl_update = &p_ent->ramrod.rl_update;
480*14b24e2bSVaishali Kulkarni 
481*14b24e2bSVaishali Kulkarni 	rl_update->qcn_update_param_flg = params->qcn_update_param_flg;
482*14b24e2bSVaishali Kulkarni 	rl_update->dcqcn_update_param_flg = params->dcqcn_update_param_flg;
483*14b24e2bSVaishali Kulkarni 	rl_update->rl_init_flg = params->rl_init_flg;
484*14b24e2bSVaishali Kulkarni 	rl_update->rl_start_flg = params->rl_start_flg;
485*14b24e2bSVaishali Kulkarni 	rl_update->rl_stop_flg = params->rl_stop_flg;
486*14b24e2bSVaishali Kulkarni 	rl_update->rl_id_first = params->rl_id_first;
487*14b24e2bSVaishali Kulkarni 	rl_update->rl_id_last = params->rl_id_last;
488*14b24e2bSVaishali Kulkarni 	rl_update->rl_dc_qcn_flg = params->rl_dc_qcn_flg;
489*14b24e2bSVaishali Kulkarni 	rl_update->rl_bc_rate = OSAL_CPU_TO_LE32(params->rl_bc_rate);
490*14b24e2bSVaishali Kulkarni 	rl_update->rl_max_rate = OSAL_CPU_TO_LE16(params->rl_max_rate);
491*14b24e2bSVaishali Kulkarni 	rl_update->rl_r_ai = OSAL_CPU_TO_LE16(params->rl_r_ai);
492*14b24e2bSVaishali Kulkarni 	rl_update->rl_r_hai = OSAL_CPU_TO_LE16(params->rl_r_hai);
493*14b24e2bSVaishali Kulkarni 	rl_update->dcqcn_g = OSAL_CPU_TO_LE16(params->dcqcn_g);
494*14b24e2bSVaishali Kulkarni 	rl_update->dcqcn_k_us = OSAL_CPU_TO_LE32(params->dcqcn_k_us);
495*14b24e2bSVaishali Kulkarni 	rl_update->dcqcn_timeuot_us = OSAL_CPU_TO_LE32(
496*14b24e2bSVaishali Kulkarni 		params->dcqcn_timeuot_us);
497*14b24e2bSVaishali Kulkarni 	rl_update->qcn_timeuot_us = OSAL_CPU_TO_LE32(params->qcn_timeuot_us);
498*14b24e2bSVaishali Kulkarni 
499*14b24e2bSVaishali Kulkarni 	return ecore_spq_post(p_hwfn, p_ent, OSAL_NULL);
500*14b24e2bSVaishali Kulkarni }
501*14b24e2bSVaishali Kulkarni 
502*14b24e2bSVaishali Kulkarni /* Set pf update ramrod command params */
503*14b24e2bSVaishali Kulkarni enum _ecore_status_t
ecore_sp_pf_update_tunn_cfg(struct ecore_hwfn * p_hwfn,struct ecore_tunnel_info * p_tunn,enum spq_mode comp_mode,struct ecore_spq_comp_cb * p_comp_data)504*14b24e2bSVaishali Kulkarni ecore_sp_pf_update_tunn_cfg(struct ecore_hwfn *p_hwfn,
505*14b24e2bSVaishali Kulkarni 			    struct ecore_tunnel_info *p_tunn,
506*14b24e2bSVaishali Kulkarni 			    enum spq_mode comp_mode,
507*14b24e2bSVaishali Kulkarni 			    struct ecore_spq_comp_cb *p_comp_data)
508*14b24e2bSVaishali Kulkarni {
509*14b24e2bSVaishali Kulkarni 	struct ecore_spq_entry *p_ent = OSAL_NULL;
510*14b24e2bSVaishali Kulkarni 	struct ecore_sp_init_data init_data;
511*14b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_NOTIMPL;
512*14b24e2bSVaishali Kulkarni 
513*14b24e2bSVaishali Kulkarni 	if (IS_VF(p_hwfn->p_dev))
514*14b24e2bSVaishali Kulkarni 		return ecore_vf_pf_tunnel_param_update(p_hwfn, p_tunn);
515*14b24e2bSVaishali Kulkarni 
516*14b24e2bSVaishali Kulkarni 	if (ECORE_IS_BB_A0(p_hwfn->p_dev)) {
517*14b24e2bSVaishali Kulkarni 		DP_NOTICE(p_hwfn, true,
518*14b24e2bSVaishali Kulkarni 			  "A0 chip: tunnel pf update config is not supported\n");
519*14b24e2bSVaishali Kulkarni 		return rc;
520*14b24e2bSVaishali Kulkarni 	}
521*14b24e2bSVaishali Kulkarni 
522*14b24e2bSVaishali Kulkarni 	if (!p_tunn)
523*14b24e2bSVaishali Kulkarni 		return ECORE_INVAL;
524*14b24e2bSVaishali Kulkarni 
525*14b24e2bSVaishali Kulkarni 	/* Get SPQ entry */
526*14b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&init_data, 0, sizeof(init_data));
527*14b24e2bSVaishali Kulkarni 	init_data.cid = ecore_spq_get_cid(p_hwfn);
528*14b24e2bSVaishali Kulkarni 	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
529*14b24e2bSVaishali Kulkarni 	init_data.comp_mode = comp_mode;
530*14b24e2bSVaishali Kulkarni 	init_data.p_comp_data = p_comp_data;
531*14b24e2bSVaishali Kulkarni 
532*14b24e2bSVaishali Kulkarni 	rc = ecore_sp_init_request(p_hwfn, &p_ent,
533*14b24e2bSVaishali Kulkarni 				   COMMON_RAMROD_PF_UPDATE, PROTOCOLID_COMMON,
534*14b24e2bSVaishali Kulkarni 				   &init_data);
535*14b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
536*14b24e2bSVaishali Kulkarni 		return rc;
537*14b24e2bSVaishali Kulkarni 
538*14b24e2bSVaishali Kulkarni 	ecore_tunn_set_pf_update_params(p_hwfn, p_tunn,
539*14b24e2bSVaishali Kulkarni 					&p_ent->ramrod.pf_update.tunnel_config);
540*14b24e2bSVaishali Kulkarni 
541*14b24e2bSVaishali Kulkarni 	rc = ecore_spq_post(p_hwfn, p_ent, OSAL_NULL);
542*14b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
543*14b24e2bSVaishali Kulkarni 		return rc;
544*14b24e2bSVaishali Kulkarni 
545*14b24e2bSVaishali Kulkarni 	ecore_set_hw_tunn_mode_port(p_hwfn, &p_hwfn->p_dev->tunnel);
546*14b24e2bSVaishali Kulkarni 
547*14b24e2bSVaishali Kulkarni 	return rc;
548*14b24e2bSVaishali Kulkarni }
549*14b24e2bSVaishali Kulkarni 
ecore_sp_pf_stop(struct ecore_hwfn * p_hwfn)550*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_sp_pf_stop(struct ecore_hwfn *p_hwfn)
551*14b24e2bSVaishali Kulkarni {
552*14b24e2bSVaishali Kulkarni 	struct ecore_spq_entry *p_ent = OSAL_NULL;
553*14b24e2bSVaishali Kulkarni 	struct ecore_sp_init_data init_data;
554*14b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_NOTIMPL;
555*14b24e2bSVaishali Kulkarni 
556*14b24e2bSVaishali Kulkarni 	/* Get SPQ entry */
557*14b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&init_data, 0, sizeof(init_data));
558*14b24e2bSVaishali Kulkarni 	init_data.cid = ecore_spq_get_cid(p_hwfn);
559*14b24e2bSVaishali Kulkarni 	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
560*14b24e2bSVaishali Kulkarni 	init_data.comp_mode = ECORE_SPQ_MODE_EBLOCK;
561*14b24e2bSVaishali Kulkarni 
562*14b24e2bSVaishali Kulkarni 	rc = ecore_sp_init_request(p_hwfn, &p_ent,
563*14b24e2bSVaishali Kulkarni 				   COMMON_RAMROD_PF_STOP, PROTOCOLID_COMMON,
564*14b24e2bSVaishali Kulkarni 				   &init_data);
565*14b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
566*14b24e2bSVaishali Kulkarni 		return rc;
567*14b24e2bSVaishali Kulkarni 
568*14b24e2bSVaishali Kulkarni 	return ecore_spq_post(p_hwfn, p_ent, OSAL_NULL);
569*14b24e2bSVaishali Kulkarni }
570*14b24e2bSVaishali Kulkarni 
ecore_sp_heartbeat_ramrod(struct ecore_hwfn * p_hwfn)571*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_sp_heartbeat_ramrod(struct ecore_hwfn *p_hwfn)
572*14b24e2bSVaishali Kulkarni {
573*14b24e2bSVaishali Kulkarni 	struct ecore_spq_entry *p_ent = OSAL_NULL;
574*14b24e2bSVaishali Kulkarni 	struct ecore_sp_init_data init_data;
575*14b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc;
576*14b24e2bSVaishali Kulkarni 
577*14b24e2bSVaishali Kulkarni 	/* Get SPQ entry */
578*14b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&init_data, 0, sizeof(init_data));
579*14b24e2bSVaishali Kulkarni 	init_data.cid = ecore_spq_get_cid(p_hwfn);
580*14b24e2bSVaishali Kulkarni 	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
581*14b24e2bSVaishali Kulkarni 	init_data.comp_mode = ECORE_SPQ_MODE_EBLOCK;
582*14b24e2bSVaishali Kulkarni 
583*14b24e2bSVaishali Kulkarni 	rc = ecore_sp_init_request(p_hwfn, &p_ent,
584*14b24e2bSVaishali Kulkarni 				   COMMON_RAMROD_EMPTY, PROTOCOLID_COMMON,
585*14b24e2bSVaishali Kulkarni 				   &init_data);
586*14b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
587*14b24e2bSVaishali Kulkarni 		return rc;
588*14b24e2bSVaishali Kulkarni 
589*14b24e2bSVaishali Kulkarni 	return ecore_spq_post(p_hwfn, p_ent, OSAL_NULL);
590*14b24e2bSVaishali Kulkarni }
591*14b24e2bSVaishali Kulkarni 
ecore_sp_pf_update_stag(struct ecore_hwfn * p_hwfn)592*14b24e2bSVaishali Kulkarni enum _ecore_status_t ecore_sp_pf_update_stag(struct ecore_hwfn *p_hwfn)
593*14b24e2bSVaishali Kulkarni {
594*14b24e2bSVaishali Kulkarni 	struct ecore_spq_entry *p_ent = OSAL_NULL;
595*14b24e2bSVaishali Kulkarni 	struct ecore_sp_init_data init_data;
596*14b24e2bSVaishali Kulkarni 	enum _ecore_status_t rc = ECORE_NOTIMPL;
597*14b24e2bSVaishali Kulkarni 
598*14b24e2bSVaishali Kulkarni 	/* Get SPQ entry */
599*14b24e2bSVaishali Kulkarni 	OSAL_MEMSET(&init_data, 0, sizeof(init_data));
600*14b24e2bSVaishali Kulkarni 	init_data.cid = ecore_spq_get_cid(p_hwfn);
601*14b24e2bSVaishali Kulkarni 	init_data.opaque_fid = p_hwfn->hw_info.opaque_fid;
602*14b24e2bSVaishali Kulkarni 	init_data.comp_mode = ECORE_SPQ_MODE_CB;
603*14b24e2bSVaishali Kulkarni 
604*14b24e2bSVaishali Kulkarni 	rc = ecore_sp_init_request(p_hwfn, &p_ent,
605*14b24e2bSVaishali Kulkarni 				   COMMON_RAMROD_PF_UPDATE, PROTOCOLID_COMMON,
606*14b24e2bSVaishali Kulkarni 				   &init_data);
607*14b24e2bSVaishali Kulkarni 	if (rc != ECORE_SUCCESS)
608*14b24e2bSVaishali Kulkarni 		return rc;
609*14b24e2bSVaishali Kulkarni 
610*14b24e2bSVaishali Kulkarni 	p_ent->ramrod.pf_update.update_mf_vlan_flag = true;
611*14b24e2bSVaishali Kulkarni 	p_ent->ramrod.pf_update.mf_vlan = OSAL_CPU_TO_LE16(p_hwfn->hw_info.ovlan);
612*14b24e2bSVaishali Kulkarni 
613*14b24e2bSVaishali Kulkarni 	return ecore_spq_post(p_hwfn, p_ent, OSAL_NULL);
614*14b24e2bSVaishali Kulkarni }
615