1/******************************************************************************
2
3  Copyright (c) 2013-2018, Intel Corporation
4  All rights reserved.
5
6  Redistribution and use in source and binary forms, with or without
7  modification, are permitted provided that the following conditions are met:
8
9   1. Redistributions of source code must retain the above copyright notice,
10      this list of conditions and the following disclaimer.
11
12   2. Redistributions in binary form must reproduce the above copyright
13      notice, this list of conditions and the following disclaimer in the
14      documentation and/or other materials provided with the distribution.
15
16   3. Neither the name of the Intel Corporation nor the names of its
17      contributors may be used to endorse or promote products derived from
18      this software without specific prior written permission.
19
20  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  POSSIBILITY OF SUCH DAMAGE.
31
32******************************************************************************/
33/*$FreeBSD$*/
34
35#ifndef _I40E_PROTOTYPE_H_
36#define _I40E_PROTOTYPE_H_
37
38#include "i40e_type.h"
39#include "i40e_alloc.h"
40#include "virtchnl.h"
41
42/* Prototypes for shared code functions that are not in
43 * the standard function pointer structures.  These are
44 * mostly because they are needed even before the init
45 * has happened and will assist in the early SW and FW
46 * setup.
47 */
48
49/* adminq functions */
50enum i40e_status_code i40e_init_adminq(struct i40e_hw *hw);
51enum i40e_status_code i40e_shutdown_adminq(struct i40e_hw *hw);
52enum i40e_status_code i40e_init_asq(struct i40e_hw *hw);
53enum i40e_status_code i40e_init_arq(struct i40e_hw *hw);
54enum i40e_status_code i40e_alloc_adminq_asq_ring(struct i40e_hw *hw);
55enum i40e_status_code i40e_alloc_adminq_arq_ring(struct i40e_hw *hw);
56enum i40e_status_code i40e_shutdown_asq(struct i40e_hw *hw);
57enum i40e_status_code i40e_shutdown_arq(struct i40e_hw *hw);
58u16 i40e_clean_asq(struct i40e_hw *hw);
59void i40e_free_adminq_asq(struct i40e_hw *hw);
60void i40e_free_adminq_arq(struct i40e_hw *hw);
61enum i40e_status_code i40e_validate_mac_addr(u8 *mac_addr);
62void i40e_adminq_init_ring_data(struct i40e_hw *hw);
63enum i40e_status_code i40e_clean_arq_element(struct i40e_hw *hw,
64					     struct i40e_arq_event_info *e,
65					     u16 *events_pending);
66enum i40e_status_code i40e_asq_send_command(struct i40e_hw *hw,
67				struct i40e_aq_desc *desc,
68				void *buff, /* can be NULL */
69				u16  buff_size,
70				struct i40e_asq_cmd_details *cmd_details);
71bool i40e_asq_done(struct i40e_hw *hw);
72
73/* debug function for adminq */
74void i40e_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask,
75		   void *desc, void *buffer, u16 buf_len);
76
77void i40e_idle_aq(struct i40e_hw *hw);
78bool i40e_check_asq_alive(struct i40e_hw *hw);
79enum i40e_status_code i40e_aq_queue_shutdown(struct i40e_hw *hw, bool unloading);
80
81enum i40e_status_code i40e_aq_get_rss_lut(struct i40e_hw *hw, u16 seid,
82					  bool pf_lut, u8 *lut, u16 lut_size);
83enum i40e_status_code i40e_aq_set_rss_lut(struct i40e_hw *hw, u16 seid,
84					  bool pf_lut, u8 *lut, u16 lut_size);
85enum i40e_status_code i40e_aq_get_rss_key(struct i40e_hw *hw,
86				     u16 seid,
87				     struct i40e_aqc_get_set_rss_key_data *key);
88enum i40e_status_code i40e_aq_set_rss_key(struct i40e_hw *hw,
89				     u16 seid,
90				     struct i40e_aqc_get_set_rss_key_data *key);
91const char *i40e_aq_str(struct i40e_hw *hw, enum i40e_admin_queue_err aq_err);
92const char *i40e_stat_str(struct i40e_hw *hw, enum i40e_status_code stat_err);
93
94
95u32 i40e_led_get(struct i40e_hw *hw);
96void i40e_led_set(struct i40e_hw *hw, u32 mode, bool blink);
97enum i40e_status_code i40e_led_set_phy(struct i40e_hw *hw, bool on,
98				       u16 led_addr, u32 mode);
99enum i40e_status_code i40e_led_get_phy(struct i40e_hw *hw, u16 *led_addr,
100				       u16 *val);
101enum i40e_status_code i40e_blink_phy_link_led(struct i40e_hw *hw,
102					      u32 time, u32 interval);
103enum i40e_status_code i40e_led_get_reg(struct i40e_hw *hw, u16 led_addr,
104				       u32 *reg_val);
105enum i40e_status_code i40e_led_set_reg(struct i40e_hw *hw, u16 led_addr,
106				       u32 reg_val);
107enum i40e_status_code i40e_get_phy_lpi_status(struct i40e_hw *hw,
108					      struct i40e_hw_port_stats *stats);
109enum i40e_status_code i40e_get_lpi_counters(struct i40e_hw *hw, u32 *tx_counter,
110					    u32 *rx_counter, bool *is_clear);
111enum i40e_status_code i40e_lpi_stat_update(struct i40e_hw *hw,
112					   bool offset_loaded, u64 *tx_offset,
113					   u64 *tx_stat, u64 *rx_offset,
114					   u64 *rx_stat);
115enum i40e_status_code i40e_get_lpi_duration(struct i40e_hw *hw,
116					    struct i40e_hw_port_stats *stat,
117					    u64 *tx_duration, u64 *rx_duration);
118/* admin send queue commands */
119
120enum i40e_status_code i40e_aq_get_firmware_version(struct i40e_hw *hw,
121				u16 *fw_major_version, u16 *fw_minor_version,
122				u32 *fw_build,
123				u16 *api_major_version, u16 *api_minor_version,
124				struct i40e_asq_cmd_details *cmd_details);
125enum i40e_status_code i40e_aq_debug_write_register(struct i40e_hw *hw,
126				u32 reg_addr, u64 reg_val,
127				struct i40e_asq_cmd_details *cmd_details);
128enum i40e_status_code i40e_aq_debug_read_register(struct i40e_hw *hw,
129				u32  reg_addr, u64 *reg_val,
130				struct i40e_asq_cmd_details *cmd_details);
131enum i40e_status_code i40e_aq_set_phy_debug(struct i40e_hw *hw, u8 cmd_flags,
132				struct i40e_asq_cmd_details *cmd_details);
133enum i40e_status_code i40e_aq_set_default_vsi(struct i40e_hw *hw, u16 vsi_id,
134				struct i40e_asq_cmd_details *cmd_details);
135enum i40e_status_code i40e_aq_clear_default_vsi(struct i40e_hw *hw, u16 vsi_id,
136				struct i40e_asq_cmd_details *cmd_details);
137enum i40e_status_code i40e_aq_get_phy_capabilities(struct i40e_hw *hw,
138			bool qualified_modules, bool report_init,
139			struct i40e_aq_get_phy_abilities_resp *abilities,
140			struct i40e_asq_cmd_details *cmd_details);
141enum i40e_status_code i40e_aq_set_phy_config(struct i40e_hw *hw,
142				struct i40e_aq_set_phy_config *config,
143				struct i40e_asq_cmd_details *cmd_details);
144enum i40e_status_code i40e_set_fc(struct i40e_hw *hw, u8 *aq_failures,
145				  bool atomic_reset);
146enum i40e_status_code i40e_aq_set_phy_int_mask(struct i40e_hw *hw, u16 mask,
147				struct i40e_asq_cmd_details *cmd_details);
148enum i40e_status_code i40e_aq_set_mac_config(struct i40e_hw *hw,
149				u16 max_frame_size, bool crc_en, u16 pacing,
150				bool auto_drop_blocking_packets,
151				struct i40e_asq_cmd_details *cmd_details);
152enum i40e_status_code i40e_aq_get_local_advt_reg(struct i40e_hw *hw,
153				u64 *advt_reg,
154				struct i40e_asq_cmd_details *cmd_details);
155enum i40e_status_code i40e_aq_get_partner_advt(struct i40e_hw *hw,
156				u64 *advt_reg,
157				struct i40e_asq_cmd_details *cmd_details);
158enum i40e_status_code
159i40e_aq_set_lb_modes(struct i40e_hw *hw, u8 lb_level, u8 lb_type, u8 speed,
160		     struct i40e_asq_cmd_details *cmd_details);
161enum i40e_status_code i40e_aq_clear_pxe_mode(struct i40e_hw *hw,
162			struct i40e_asq_cmd_details *cmd_details);
163enum i40e_status_code i40e_aq_set_link_restart_an(struct i40e_hw *hw,
164		bool enable_link, struct i40e_asq_cmd_details *cmd_details);
165enum i40e_status_code i40e_aq_get_link_info(struct i40e_hw *hw,
166				bool enable_lse, struct i40e_link_status *link,
167				struct i40e_asq_cmd_details *cmd_details);
168enum i40e_status_code i40e_aq_set_local_advt_reg(struct i40e_hw *hw,
169				u64 advt_reg,
170				struct i40e_asq_cmd_details *cmd_details);
171enum i40e_status_code i40e_aq_send_driver_version(struct i40e_hw *hw,
172				struct i40e_driver_version *dv,
173				struct i40e_asq_cmd_details *cmd_details);
174enum i40e_status_code i40e_aq_add_vsi(struct i40e_hw *hw,
175				struct i40e_vsi_context *vsi_ctx,
176				struct i40e_asq_cmd_details *cmd_details);
177enum i40e_status_code i40e_aq_set_vsi_broadcast(struct i40e_hw *hw,
178				u16 vsi_id, bool set_filter,
179				struct i40e_asq_cmd_details *cmd_details);
180enum i40e_status_code i40e_aq_set_vsi_unicast_promiscuous(struct i40e_hw *hw,
181		u16 vsi_id, bool set, struct i40e_asq_cmd_details *cmd_details,
182		bool rx_only_promisc);
183enum i40e_status_code i40e_aq_set_vsi_multicast_promiscuous(struct i40e_hw *hw,
184		u16 vsi_id, bool set, struct i40e_asq_cmd_details *cmd_details);
185enum i40e_status_code i40e_aq_set_vsi_full_promiscuous(struct i40e_hw *hw,
186				u16 seid, bool set,
187				struct i40e_asq_cmd_details *cmd_details);
188enum i40e_status_code i40e_aq_set_vsi_mc_promisc_on_vlan(struct i40e_hw *hw,
189				u16 seid, bool enable, u16 vid,
190				struct i40e_asq_cmd_details *cmd_details);
191enum i40e_status_code i40e_aq_set_vsi_uc_promisc_on_vlan(struct i40e_hw *hw,
192				u16 seid, bool enable, u16 vid,
193				struct i40e_asq_cmd_details *cmd_details);
194enum i40e_status_code i40e_aq_set_vsi_bc_promisc_on_vlan(struct i40e_hw *hw,
195				u16 seid, bool enable, u16 vid,
196				struct i40e_asq_cmd_details *cmd_details);
197enum i40e_status_code i40e_aq_set_vsi_vlan_promisc(struct i40e_hw *hw,
198				u16 seid, bool enable,
199				struct i40e_asq_cmd_details *cmd_details);
200enum i40e_status_code i40e_aq_get_vsi_params(struct i40e_hw *hw,
201				struct i40e_vsi_context *vsi_ctx,
202				struct i40e_asq_cmd_details *cmd_details);
203enum i40e_status_code i40e_aq_update_vsi_params(struct i40e_hw *hw,
204				struct i40e_vsi_context *vsi_ctx,
205				struct i40e_asq_cmd_details *cmd_details);
206enum i40e_status_code i40e_aq_add_veb(struct i40e_hw *hw, u16 uplink_seid,
207				u16 downlink_seid, u8 enabled_tc,
208				bool default_port, u16 *pveb_seid,
209				bool enable_stats,
210				struct i40e_asq_cmd_details *cmd_details);
211enum i40e_status_code i40e_aq_get_veb_parameters(struct i40e_hw *hw,
212				u16 veb_seid, u16 *switch_id, bool *floating,
213				u16 *statistic_index, u16 *vebs_used,
214				u16 *vebs_free,
215				struct i40e_asq_cmd_details *cmd_details);
216enum i40e_status_code i40e_aq_add_macvlan(struct i40e_hw *hw, u16 vsi_id,
217			struct i40e_aqc_add_macvlan_element_data *mv_list,
218			u16 count, struct i40e_asq_cmd_details *cmd_details);
219enum i40e_status_code i40e_aq_remove_macvlan(struct i40e_hw *hw, u16 vsi_id,
220			struct i40e_aqc_remove_macvlan_element_data *mv_list,
221			u16 count, struct i40e_asq_cmd_details *cmd_details);
222enum i40e_status_code i40e_aq_add_mirrorrule(struct i40e_hw *hw, u16 sw_seid,
223			u16 rule_type, u16 dest_vsi, u16 count, __le16 *mr_list,
224			struct i40e_asq_cmd_details *cmd_details,
225			u16 *rule_id, u16 *rules_used, u16 *rules_free);
226enum i40e_status_code i40e_aq_delete_mirrorrule(struct i40e_hw *hw, u16 sw_seid,
227			u16 rule_type, u16 rule_id, u16 count, __le16 *mr_list,
228			struct i40e_asq_cmd_details *cmd_details,
229			u16 *rules_used, u16 *rules_free);
230
231enum i40e_status_code i40e_aq_add_vlan(struct i40e_hw *hw, u16 vsi_id,
232			struct i40e_aqc_add_remove_vlan_element_data *v_list,
233			u8 count, struct i40e_asq_cmd_details *cmd_details);
234enum i40e_status_code i40e_aq_remove_vlan(struct i40e_hw *hw, u16 vsi_id,
235			struct i40e_aqc_add_remove_vlan_element_data *v_list,
236			u8 count, struct i40e_asq_cmd_details *cmd_details);
237enum i40e_status_code i40e_aq_send_msg_to_vf(struct i40e_hw *hw, u16 vfid,
238				u32 v_opcode, u32 v_retval, u8 *msg, u16 msglen,
239				struct i40e_asq_cmd_details *cmd_details);
240enum i40e_status_code i40e_aq_get_switch_config(struct i40e_hw *hw,
241				struct i40e_aqc_get_switch_config_resp *buf,
242				u16 buf_size, u16 *start_seid,
243				struct i40e_asq_cmd_details *cmd_details);
244enum i40e_status_code i40e_aq_set_switch_config(struct i40e_hw *hw,
245				u16 flags, u16 valid_flags, u8 mode,
246				struct i40e_asq_cmd_details *cmd_details);
247enum i40e_status_code i40e_aq_request_resource(struct i40e_hw *hw,
248				enum i40e_aq_resources_ids resource,
249				enum i40e_aq_resource_access_type access,
250				u8 sdp_number, u64 *timeout,
251				struct i40e_asq_cmd_details *cmd_details);
252enum i40e_status_code i40e_aq_release_resource(struct i40e_hw *hw,
253				enum i40e_aq_resources_ids resource,
254				u8 sdp_number,
255				struct i40e_asq_cmd_details *cmd_details);
256enum i40e_status_code i40e_aq_read_nvm(struct i40e_hw *hw, u8 module_pointer,
257				u32 offset, u16 length, void *data,
258				bool last_command,
259				struct i40e_asq_cmd_details *cmd_details);
260enum i40e_status_code i40e_aq_erase_nvm(struct i40e_hw *hw, u8 module_pointer,
261				u32 offset, u16 length, bool last_command,
262				struct i40e_asq_cmd_details *cmd_details);
263enum i40e_status_code i40e_aq_read_nvm_config(struct i40e_hw *hw,
264				u8 cmd_flags, u32 field_id, void *data,
265				u16 buf_size, u16 *element_count,
266				struct i40e_asq_cmd_details *cmd_details);
267enum i40e_status_code i40e_aq_write_nvm_config(struct i40e_hw *hw,
268				u8 cmd_flags, void *data, u16 buf_size,
269				u16 element_count,
270				struct i40e_asq_cmd_details *cmd_details);
271enum i40e_status_code i40e_aq_oem_post_update(struct i40e_hw *hw,
272				void *buff, u16 buff_size,
273				struct i40e_asq_cmd_details *cmd_details);
274enum i40e_status_code i40e_aq_discover_capabilities(struct i40e_hw *hw,
275				void *buff, u16 buff_size, u16 *data_size,
276				enum i40e_admin_queue_opc list_type_opc,
277				struct i40e_asq_cmd_details *cmd_details);
278enum i40e_status_code i40e_aq_update_nvm(struct i40e_hw *hw, u8 module_pointer,
279				u32 offset, u16 length, void *data,
280				bool last_command, u8 preservation_flags,
281				struct i40e_asq_cmd_details *cmd_details);
282enum i40e_status_code i40e_aq_nvm_progress(struct i40e_hw *hw, u8 *progress,
283				struct i40e_asq_cmd_details *cmd_details);
284enum i40e_status_code i40e_aq_get_lldp_mib(struct i40e_hw *hw, u8 bridge_type,
285				u8 mib_type, void *buff, u16 buff_size,
286				u16 *local_len, u16 *remote_len,
287				struct i40e_asq_cmd_details *cmd_details);
288enum i40e_status_code i40e_aq_set_lldp_mib(struct i40e_hw *hw,
289				u8 mib_type, void *buff, u16 buff_size,
290				struct i40e_asq_cmd_details *cmd_details);
291enum i40e_status_code i40e_aq_cfg_lldp_mib_change_event(struct i40e_hw *hw,
292				bool enable_update,
293				struct i40e_asq_cmd_details *cmd_details);
294enum i40e_status_code
295i40e_aq_restore_lldp(struct i40e_hw *hw, u8 *setting, bool restore,
296		     struct i40e_asq_cmd_details *cmd_details);
297enum i40e_status_code i40e_aq_stop_lldp(struct i40e_hw *hw, bool shutdown_agent,
298				bool persist,
299				struct i40e_asq_cmd_details *cmd_details);
300enum i40e_status_code i40e_aq_set_dcb_parameters(struct i40e_hw *hw,
301						 bool dcb_enable,
302						 struct i40e_asq_cmd_details
303						 *cmd_details);
304enum i40e_status_code i40e_aq_start_lldp(struct i40e_hw *hw,
305				bool persist,
306				struct i40e_asq_cmd_details *cmd_details);
307enum i40e_status_code i40e_aq_get_cee_dcb_config(struct i40e_hw *hw,
308				void *buff, u16 buff_size,
309				struct i40e_asq_cmd_details *cmd_details);
310enum i40e_status_code i40e_aq_start_stop_dcbx(struct i40e_hw *hw,
311				bool start_agent,
312				struct i40e_asq_cmd_details *cmd_details);
313enum i40e_status_code i40e_aq_add_udp_tunnel(struct i40e_hw *hw,
314				u16 udp_port, u8 protocol_index,
315				u8 *filter_index,
316				struct i40e_asq_cmd_details *cmd_details);
317enum i40e_status_code i40e_aq_del_udp_tunnel(struct i40e_hw *hw, u8 index,
318				struct i40e_asq_cmd_details *cmd_details);
319enum i40e_status_code i40e_aq_get_switch_resource_alloc(struct i40e_hw *hw,
320			u8 *num_entries,
321			struct i40e_aqc_switch_resource_alloc_element_resp *buf,
322			u16 count,
323			struct i40e_asq_cmd_details *cmd_details);
324enum i40e_status_code i40e_aq_add_pvirt(struct i40e_hw *hw, u16 flags,
325				       u16 mac_seid, u16 vsi_seid,
326				       u16 *ret_seid);
327enum i40e_status_code i40e_aq_add_tag(struct i40e_hw *hw, bool direct_to_queue,
328				u16 vsi_seid, u16 tag, u16 queue_num,
329				u16 *tags_used, u16 *tags_free,
330				struct i40e_asq_cmd_details *cmd_details);
331enum i40e_status_code i40e_aq_remove_tag(struct i40e_hw *hw, u16 vsi_seid,
332				u16 tag, u16 *tags_used, u16 *tags_free,
333				struct i40e_asq_cmd_details *cmd_details);
334enum i40e_status_code i40e_aq_add_mcast_etag(struct i40e_hw *hw, u16 pe_seid,
335				u16 etag, u8 num_tags_in_buf, void *buf,
336				u16 *tags_used, u16 *tags_free,
337				struct i40e_asq_cmd_details *cmd_details);
338enum i40e_status_code i40e_aq_remove_mcast_etag(struct i40e_hw *hw, u16 pe_seid,
339				u16 etag, u16 *tags_used, u16 *tags_free,
340				struct i40e_asq_cmd_details *cmd_details);
341enum i40e_status_code i40e_aq_update_tag(struct i40e_hw *hw, u16 vsi_seid,
342				u16 old_tag, u16 new_tag, u16 *tags_used,
343				u16 *tags_free,
344				struct i40e_asq_cmd_details *cmd_details);
345enum i40e_status_code i40e_aq_add_statistics(struct i40e_hw *hw, u16 seid,
346				u16 vlan_id, u16 *stat_index,
347				struct i40e_asq_cmd_details *cmd_details);
348enum i40e_status_code i40e_aq_remove_statistics(struct i40e_hw *hw, u16 seid,
349				u16 vlan_id, u16 stat_index,
350				struct i40e_asq_cmd_details *cmd_details);
351enum i40e_status_code i40e_aq_set_port_parameters(struct i40e_hw *hw,
352				u16 bad_frame_vsi, bool save_bad_pac,
353				bool pad_short_pac, bool double_vlan,
354				struct i40e_asq_cmd_details *cmd_details);
355enum i40e_status_code i40e_aq_delete_element(struct i40e_hw *hw, u16 seid,
356				struct i40e_asq_cmd_details *cmd_details);
357enum i40e_status_code i40e_aq_mac_address_write(struct i40e_hw *hw,
358				    u16 flags, u8 *mac_addr,
359				    struct i40e_asq_cmd_details *cmd_details);
360enum i40e_status_code i40e_aq_config_vsi_bw_limit(struct i40e_hw *hw,
361				u16 seid, u16 credit, u8 max_credit,
362				struct i40e_asq_cmd_details *cmd_details);
363enum i40e_status_code i40e_aq_dcb_ignore_pfc(struct i40e_hw *hw,
364				u8 tcmap, bool request, u8 *tcmap_ret,
365				struct i40e_asq_cmd_details *cmd_details);
366enum i40e_status_code i40e_aq_config_switch_comp_ets_bw_limit(
367	struct i40e_hw *hw, u16 seid,
368	struct i40e_aqc_configure_switching_comp_ets_bw_limit_data *bw_data,
369	struct i40e_asq_cmd_details *cmd_details);
370enum i40e_status_code i40e_aq_config_vsi_ets_sla_bw_limit(struct i40e_hw *hw,
371			u16 seid,
372			struct i40e_aqc_configure_vsi_ets_sla_bw_data *bw_data,
373			struct i40e_asq_cmd_details *cmd_details);
374enum i40e_status_code i40e_aq_dcb_updated(struct i40e_hw *hw,
375				struct i40e_asq_cmd_details *cmd_details);
376enum i40e_status_code i40e_aq_config_switch_comp_bw_limit(struct i40e_hw *hw,
377				u16 seid, u16 credit, u8 max_bw,
378				struct i40e_asq_cmd_details *cmd_details);
379enum i40e_status_code i40e_aq_config_vsi_tc_bw(struct i40e_hw *hw, u16 seid,
380			struct i40e_aqc_configure_vsi_tc_bw_data *bw_data,
381			struct i40e_asq_cmd_details *cmd_details);
382enum i40e_status_code i40e_aq_query_vsi_bw_config(struct i40e_hw *hw,
383			u16 seid,
384			struct i40e_aqc_query_vsi_bw_config_resp *bw_data,
385			struct i40e_asq_cmd_details *cmd_details);
386enum i40e_status_code i40e_aq_query_vsi_ets_sla_config(struct i40e_hw *hw,
387			u16 seid,
388			struct i40e_aqc_query_vsi_ets_sla_config_resp *bw_data,
389			struct i40e_asq_cmd_details *cmd_details);
390enum i40e_status_code i40e_aq_query_switch_comp_ets_config(struct i40e_hw *hw,
391		u16 seid,
392		struct i40e_aqc_query_switching_comp_ets_config_resp *bw_data,
393		struct i40e_asq_cmd_details *cmd_details);
394enum i40e_status_code i40e_aq_query_port_ets_config(struct i40e_hw *hw,
395		u16 seid,
396		struct i40e_aqc_query_port_ets_config_resp *bw_data,
397		struct i40e_asq_cmd_details *cmd_details);
398enum i40e_status_code i40e_aq_query_switch_comp_bw_config(struct i40e_hw *hw,
399		u16 seid,
400		struct i40e_aqc_query_switching_comp_bw_config_resp *bw_data,
401		struct i40e_asq_cmd_details *cmd_details);
402enum i40e_status_code i40e_aq_resume_port_tx(struct i40e_hw *hw,
403				struct i40e_asq_cmd_details *cmd_details);
404enum i40e_status_code
405i40e_aq_add_cloud_filters_bb(struct i40e_hw *hw, u16 seid,
406			     struct i40e_aqc_cloud_filters_element_bb *filters,
407			     u8 filter_count);
408enum i40e_status_code
409i40e_aq_add_cloud_filters(struct i40e_hw *hw, u16 vsi,
410			  struct i40e_aqc_cloud_filters_element_data *filters,
411			  u8 filter_count);
412enum i40e_status_code
413i40e_aq_rem_cloud_filters(struct i40e_hw *hw, u16 vsi,
414			  struct i40e_aqc_cloud_filters_element_data *filters,
415			  u8 filter_count);
416enum i40e_status_code
417i40e_aq_rem_cloud_filters_bb(struct i40e_hw *hw, u16 seid,
418			     struct i40e_aqc_cloud_filters_element_bb *filters,
419			     u8 filter_count);
420enum i40e_status_code i40e_read_lldp_cfg(struct i40e_hw *hw,
421					struct i40e_lldp_variables *lldp_cfg);
422enum i40e_status_code i40e_aq_replace_cloud_filters(struct i40e_hw *hw,
423		struct i40e_aqc_replace_cloud_filters_cmd *filters,
424		struct i40e_aqc_replace_cloud_filters_cmd_buf *cmd_buf);
425enum i40e_status_code i40e_aq_alternate_read(struct i40e_hw *hw,
426				u32 reg_addr0, u32 *reg_val0,
427				u32 reg_addr1, u32 *reg_val1);
428enum i40e_status_code i40e_aq_alternate_read_indirect(struct i40e_hw *hw,
429				u32 addr, u32 dw_count, void *buffer);
430enum i40e_status_code i40e_aq_alternate_write(struct i40e_hw *hw,
431				u32 reg_addr0, u32 reg_val0,
432				u32 reg_addr1, u32 reg_val1);
433enum i40e_status_code i40e_aq_alternate_write_indirect(struct i40e_hw *hw,
434				u32 addr, u32 dw_count, void *buffer);
435enum i40e_status_code i40e_aq_alternate_clear(struct i40e_hw *hw);
436enum i40e_status_code i40e_aq_alternate_write_done(struct i40e_hw *hw,
437				u8 bios_mode, bool *reset_needed);
438enum i40e_status_code i40e_aq_set_oem_mode(struct i40e_hw *hw,
439				u8 oem_mode);
440
441/* i40e_common */
442enum i40e_status_code i40e_init_shared_code(struct i40e_hw *hw);
443enum i40e_status_code i40e_pf_reset(struct i40e_hw *hw);
444void i40e_clear_hw(struct i40e_hw *hw);
445void i40e_clear_pxe_mode(struct i40e_hw *hw);
446enum i40e_status_code i40e_get_link_status(struct i40e_hw *hw, bool *link_up);
447enum i40e_status_code i40e_update_link_info(struct i40e_hw *hw);
448enum i40e_status_code i40e_get_mac_addr(struct i40e_hw *hw, u8 *mac_addr);
449enum i40e_status_code i40e_read_bw_from_alt_ram(struct i40e_hw *hw,
450		u32 *max_bw, u32 *min_bw, bool *min_valid, bool *max_valid);
451enum i40e_status_code i40e_aq_configure_partition_bw(struct i40e_hw *hw,
452			struct i40e_aqc_configure_partition_bw_data *bw_data,
453			struct i40e_asq_cmd_details *cmd_details);
454enum i40e_status_code i40e_get_port_mac_addr(struct i40e_hw *hw, u8 *mac_addr);
455enum i40e_status_code i40e_read_pba_string(struct i40e_hw *hw, u8 *pba_num,
456					    u32 pba_num_size);
457void i40e_pre_tx_queue_cfg(struct i40e_hw *hw, u32 queue, bool enable);
458enum i40e_aq_link_speed i40e_get_link_speed(struct i40e_hw *hw);
459/* prototype for functions used for NVM access */
460enum i40e_status_code i40e_init_nvm(struct i40e_hw *hw);
461enum i40e_status_code i40e_acquire_nvm(struct i40e_hw *hw,
462				      enum i40e_aq_resource_access_type access);
463void i40e_release_nvm(struct i40e_hw *hw);
464enum i40e_status_code i40e_read_nvm_word(struct i40e_hw *hw, u16 offset,
465					 u16 *data);
466enum i40e_status_code
467i40e_read_nvm_module_data(struct i40e_hw *hw, u8 module_ptr, u16 module_offset,
468			  u16 data_offset, u16 words_data_size, u16 *data_ptr);
469enum i40e_status_code i40e_read_nvm_buffer(struct i40e_hw *hw, u16 offset,
470					   u16 *words, u16 *data);
471enum i40e_status_code i40e_write_nvm_aq(struct i40e_hw *hw, u8 module,
472					u32 offset, u16 words, void *data,
473					bool last_command);
474enum i40e_status_code __i40e_read_nvm_word(struct i40e_hw *hw, u16 offset,
475					   u16 *data);
476enum i40e_status_code __i40e_read_nvm_buffer(struct i40e_hw *hw, u16 offset,
477					     u16 *words, u16 *data);
478enum i40e_status_code __i40e_write_nvm_word(struct i40e_hw *hw, u32 offset,
479					  void *data);
480enum i40e_status_code __i40e_write_nvm_buffer(struct i40e_hw *hw, u8 module,
481					    u32 offset, u16 words, void *data);
482enum i40e_status_code i40e_calc_nvm_checksum(struct i40e_hw *hw, u16 *checksum);
483enum i40e_status_code i40e_update_nvm_checksum(struct i40e_hw *hw);
484enum i40e_status_code i40e_validate_nvm_checksum(struct i40e_hw *hw,
485						 u16 *checksum);
486enum i40e_status_code i40e_nvmupd_command(struct i40e_hw *hw,
487					  struct i40e_nvm_access *cmd,
488					  u8 *bytes, int *);
489void i40e_nvmupd_check_wait_event(struct i40e_hw *hw, u16 opcode,
490				  struct i40e_aq_desc *desc);
491void i40e_nvmupd_clear_wait_state(struct i40e_hw *hw);
492void i40e_set_pci_config_data(struct i40e_hw *hw, u16 link_status);
493enum i40e_status_code i40e_enable_eee(struct i40e_hw *hw, bool enable);
494
495enum i40e_status_code i40e_set_mac_type(struct i40e_hw *hw);
496
497extern struct i40e_rx_ptype_decoded i40e_ptype_lookup[];
498
499static INLINE struct i40e_rx_ptype_decoded decode_rx_desc_ptype(u8 ptype)
500{
501	return i40e_ptype_lookup[ptype];
502}
503
504/**
505 * i40e_virtchnl_link_speed - Convert AdminQ link_speed to virtchnl definition
506 * @link_speed: the speed to convert
507 *
508 * Returns the link_speed in terms of the virtchnl interface, for use in
509 * converting link_speed as reported by the AdminQ into the format used for
510 * talking to virtchnl devices. If we can't represent the link speed properly,
511 * report LINK_SPEED_UNKNOWN.
512 **/
513static INLINE enum virtchnl_link_speed
514i40e_virtchnl_link_speed(enum i40e_aq_link_speed link_speed)
515{
516	switch (link_speed) {
517	case I40E_LINK_SPEED_100MB:
518		return VIRTCHNL_LINK_SPEED_100MB;
519	case I40E_LINK_SPEED_1GB:
520		return VIRTCHNL_LINK_SPEED_1GB;
521	case I40E_LINK_SPEED_2_5GB:
522		return VIRTCHNL_LINK_SPEED_2_5GB;
523	case I40E_LINK_SPEED_5GB:
524		return VIRTCHNL_LINK_SPEED_5GB;
525	case I40E_LINK_SPEED_10GB:
526		return VIRTCHNL_LINK_SPEED_10GB;
527	case I40E_LINK_SPEED_40GB:
528		return VIRTCHNL_LINK_SPEED_40GB;
529	case I40E_LINK_SPEED_20GB:
530		return VIRTCHNL_LINK_SPEED_20GB;
531	case I40E_LINK_SPEED_25GB:
532		return VIRTCHNL_LINK_SPEED_25GB;
533	case I40E_LINK_SPEED_UNKNOWN:
534	default:
535		return VIRTCHNL_LINK_SPEED_UNKNOWN;
536	}
537}
538
539/* prototype for functions used for SW spinlocks */
540void i40e_init_spinlock(struct i40e_spinlock *sp);
541void i40e_acquire_spinlock(struct i40e_spinlock *sp);
542void i40e_release_spinlock(struct i40e_spinlock *sp);
543void i40e_destroy_spinlock(struct i40e_spinlock *sp);
544
545/* i40e_common for VF drivers*/
546void i40e_vf_parse_hw_config(struct i40e_hw *hw,
547			     struct virtchnl_vf_resource *msg);
548enum i40e_status_code i40e_vf_reset(struct i40e_hw *hw);
549enum i40e_status_code i40e_aq_send_msg_to_pf(struct i40e_hw *hw,
550				enum virtchnl_ops v_opcode,
551				enum i40e_status_code v_retval,
552				u8 *msg, u16 msglen,
553				struct i40e_asq_cmd_details *cmd_details);
554enum i40e_status_code i40e_set_filter_control(struct i40e_hw *hw,
555				struct i40e_filter_control_settings *settings);
556enum i40e_status_code i40e_aq_add_rem_control_packet_filter(struct i40e_hw *hw,
557				u8 *mac_addr, u16 ethtype, u16 flags,
558				u16 vsi_seid, u16 queue, bool is_add,
559				struct i40e_control_filter_stats *stats,
560				struct i40e_asq_cmd_details *cmd_details);
561enum i40e_status_code i40e_aq_debug_dump(struct i40e_hw *hw, u8 cluster_id,
562				u8 table_id, u32 start_index, u16 buff_size,
563				void *buff, u16 *ret_buff_size,
564				u8 *ret_next_table, u32 *ret_next_index,
565				struct i40e_asq_cmd_details *cmd_details);
566void i40e_add_filter_to_drop_tx_flow_control_frames(struct i40e_hw *hw,
567						    u16 vsi_seid);
568enum i40e_status_code i40e_aq_rx_ctl_read_register(struct i40e_hw *hw,
569				u32 reg_addr, u32 *reg_val,
570				struct i40e_asq_cmd_details *cmd_details);
571u32 i40e_read_rx_ctl(struct i40e_hw *hw, u32 reg_addr);
572enum i40e_status_code i40e_aq_rx_ctl_write_register(struct i40e_hw *hw,
573				u32 reg_addr, u32 reg_val,
574				struct i40e_asq_cmd_details *cmd_details);
575void i40e_write_rx_ctl(struct i40e_hw *hw, u32 reg_addr, u32 reg_val);
576enum i40e_status_code
577i40e_aq_set_phy_register_ext(struct i40e_hw *hw,
578			     u8 phy_select, u8 dev_addr, bool page_change,
579			     bool set_mdio, u8 mdio_num,
580			     u32 reg_addr, u32 reg_val,
581			     struct i40e_asq_cmd_details *cmd_details);
582enum i40e_status_code
583i40e_aq_get_phy_register_ext(struct i40e_hw *hw,
584			     u8 phy_select, u8 dev_addr, bool page_change,
585			     bool set_mdio, u8 mdio_num,
586			     u32 reg_addr, u32 *reg_val,
587			     struct i40e_asq_cmd_details *cmd_details);
588
589/* Convenience wrappers for most common use case */
590#define i40e_aq_set_phy_register(hw, ps, da, pc, ra, rv, cd) \
591	i40e_aq_set_phy_register_ext(hw, ps, da, pc, FALSE, 0, ra, rv, cd)
592#define i40e_aq_get_phy_register(hw, ps, da, pc, ra, rv, cd) \
593	i40e_aq_get_phy_register_ext(hw, ps, da, pc, FALSE, 0, ra, rv, cd)
594
595enum i40e_status_code
596i40e_aq_run_phy_activity(struct i40e_hw *hw, u16 activity_id, u32 opcode,
597			 u32 *cmd_status, u32 *data0, u32 *data1,
598			 struct i40e_asq_cmd_details *cmd_details);
599
600enum i40e_status_code i40e_aq_set_arp_proxy_config(struct i40e_hw *hw,
601			struct i40e_aqc_arp_proxy_data *proxy_config,
602			struct i40e_asq_cmd_details *cmd_details);
603enum i40e_status_code i40e_aq_set_ns_proxy_table_entry(struct i40e_hw *hw,
604			struct i40e_aqc_ns_proxy_data *ns_proxy_table_entry,
605			struct i40e_asq_cmd_details *cmd_details);
606enum i40e_status_code i40e_aq_set_clear_wol_filter(struct i40e_hw *hw,
607			u8 filter_index,
608			struct i40e_aqc_set_wol_filter_data *filter,
609			bool set_filter, bool no_wol_tco,
610			bool filter_valid, bool no_wol_tco_valid,
611			struct i40e_asq_cmd_details *cmd_details);
612enum i40e_status_code i40e_aq_get_wake_event_reason(struct i40e_hw *hw,
613			u16 *wake_reason,
614			struct i40e_asq_cmd_details *cmd_details);
615enum i40e_status_code i40e_aq_clear_all_wol_filters(struct i40e_hw *hw,
616			struct i40e_asq_cmd_details *cmd_details);
617enum i40e_status_code i40e_read_phy_register_clause22(struct i40e_hw *hw,
618					u16 reg, u8 phy_addr, u16 *value);
619enum i40e_status_code i40e_write_phy_register_clause22(struct i40e_hw *hw,
620					u16 reg, u8 phy_addr, u16 value);
621enum i40e_status_code i40e_read_phy_register_clause45(struct i40e_hw *hw,
622				u8 page, u16 reg, u8 phy_addr, u16 *value);
623enum i40e_status_code i40e_write_phy_register_clause45(struct i40e_hw *hw,
624				u8 page, u16 reg, u8 phy_addr, u16 value);
625enum i40e_status_code i40e_read_phy_register(struct i40e_hw *hw,
626				u8 page, u16 reg, u8 phy_addr, u16 *value);
627enum i40e_status_code i40e_write_phy_register(struct i40e_hw *hw,
628				u8 page, u16 reg, u8 phy_addr, u16 value);
629u8 i40e_get_phy_address(struct i40e_hw *hw, u8 dev_num);
630#endif /* _I40E_PROTOTYPE_H_ */
631