1fe56b9e6SYuval Mintz /* QLogic qed NIC Driver
2fe56b9e6SYuval Mintz  * Copyright (c) 2015 QLogic Corporation
3fe56b9e6SYuval Mintz  *
4fe56b9e6SYuval Mintz  * This software is available under the terms of the GNU General Public License
5fe56b9e6SYuval Mintz  * (GPL) Version 2, available from the file COPYING in the main directory of
6fe56b9e6SYuval Mintz  * this source tree.
7fe56b9e6SYuval Mintz  */
8fe56b9e6SYuval Mintz 
9fe56b9e6SYuval Mintz #ifndef _QED_MCP_H
10fe56b9e6SYuval Mintz #define _QED_MCP_H
11fe56b9e6SYuval Mintz 
12fe56b9e6SYuval Mintz #include <linux/types.h>
13fe56b9e6SYuval Mintz #include <linux/delay.h>
14fe56b9e6SYuval Mintz #include <linux/slab.h>
155529bad9STomer Tayar #include <linux/spinlock.h>
16fe56b9e6SYuval Mintz #include "qed_hsi.h"
17fe56b9e6SYuval Mintz 
18cc875c2eSYuval Mintz struct qed_mcp_link_speed_params {
19cc875c2eSYuval Mintz 	bool    autoneg;
20cc875c2eSYuval Mintz 	u32     advertised_speeds;      /* bitmask of DRV_SPEED_CAPABILITY */
21cc875c2eSYuval Mintz 	u32     forced_speed;	   /* In Mb/s */
22cc875c2eSYuval Mintz };
23cc875c2eSYuval Mintz 
24cc875c2eSYuval Mintz struct qed_mcp_link_pause_params {
25cc875c2eSYuval Mintz 	bool    autoneg;
26cc875c2eSYuval Mintz 	bool    forced_rx;
27cc875c2eSYuval Mintz 	bool    forced_tx;
28cc875c2eSYuval Mintz };
29cc875c2eSYuval Mintz 
30cc875c2eSYuval Mintz struct qed_mcp_link_params {
31cc875c2eSYuval Mintz 	struct qed_mcp_link_speed_params	speed;
32cc875c2eSYuval Mintz 	struct qed_mcp_link_pause_params	pause;
33cc875c2eSYuval Mintz 	u32				     loopback_mode;
34cc875c2eSYuval Mintz };
35cc875c2eSYuval Mintz 
36cc875c2eSYuval Mintz struct qed_mcp_link_capabilities {
37cc875c2eSYuval Mintz 	u32 speed_capabilities;
38cc875c2eSYuval Mintz };
39cc875c2eSYuval Mintz 
40cc875c2eSYuval Mintz struct qed_mcp_link_state {
41cc875c2eSYuval Mintz 	bool    link_up;
42cc875c2eSYuval Mintz 
43a64b02d5SManish Chopra 	u32	min_pf_rate;
44a64b02d5SManish Chopra 
454b01e519SManish Chopra 	/* Actual link speed in Mb/s */
464b01e519SManish Chopra 	u32	line_speed;
474b01e519SManish Chopra 
484b01e519SManish Chopra 	/* PF max speed in Mb/s, deduced from line_speed
494b01e519SManish Chopra 	 * according to PF max bandwidth configuration.
504b01e519SManish Chopra 	 */
514b01e519SManish Chopra 	u32     speed;
52cc875c2eSYuval Mintz 	bool    full_duplex;
53cc875c2eSYuval Mintz 
54cc875c2eSYuval Mintz 	bool    an;
55cc875c2eSYuval Mintz 	bool    an_complete;
56cc875c2eSYuval Mintz 	bool    parallel_detection;
57cc875c2eSYuval Mintz 	bool    pfc_enabled;
58cc875c2eSYuval Mintz 
59cc875c2eSYuval Mintz #define QED_LINK_PARTNER_SPEED_1G_HD    BIT(0)
60cc875c2eSYuval Mintz #define QED_LINK_PARTNER_SPEED_1G_FD    BIT(1)
61cc875c2eSYuval Mintz #define QED_LINK_PARTNER_SPEED_10G      BIT(2)
62cc875c2eSYuval Mintz #define QED_LINK_PARTNER_SPEED_20G      BIT(3)
63cc875c2eSYuval Mintz #define QED_LINK_PARTNER_SPEED_40G      BIT(4)
64cc875c2eSYuval Mintz #define QED_LINK_PARTNER_SPEED_50G      BIT(5)
65cc875c2eSYuval Mintz #define QED_LINK_PARTNER_SPEED_100G     BIT(6)
66cc875c2eSYuval Mintz 	u32     partner_adv_speed;
67cc875c2eSYuval Mintz 
68cc875c2eSYuval Mintz 	bool    partner_tx_flow_ctrl_en;
69cc875c2eSYuval Mintz 	bool    partner_rx_flow_ctrl_en;
70cc875c2eSYuval Mintz 
71cc875c2eSYuval Mintz #define QED_LINK_PARTNER_SYMMETRIC_PAUSE (1)
72cc875c2eSYuval Mintz #define QED_LINK_PARTNER_ASYMMETRIC_PAUSE (2)
73cc875c2eSYuval Mintz #define QED_LINK_PARTNER_BOTH_PAUSE (3)
74cc875c2eSYuval Mintz 	u8      partner_adv_pause;
75cc875c2eSYuval Mintz 
76cc875c2eSYuval Mintz 	bool    sfp_tx_fault;
77cc875c2eSYuval Mintz };
78cc875c2eSYuval Mintz 
79fe56b9e6SYuval Mintz struct qed_mcp_function_info {
80fe56b9e6SYuval Mintz 	u8				pause_on_host;
81fe56b9e6SYuval Mintz 
82fe56b9e6SYuval Mintz 	enum qed_pci_personality	protocol;
83fe56b9e6SYuval Mintz 
84fe56b9e6SYuval Mintz 	u8				bandwidth_min;
85fe56b9e6SYuval Mintz 	u8				bandwidth_max;
86fe56b9e6SYuval Mintz 
87fe56b9e6SYuval Mintz 	u8				mac[ETH_ALEN];
88fe56b9e6SYuval Mintz 
89fe56b9e6SYuval Mintz 	u64				wwn_port;
90fe56b9e6SYuval Mintz 	u64				wwn_node;
91fe56b9e6SYuval Mintz 
92fe56b9e6SYuval Mintz #define QED_MCP_VLAN_UNSET              (0xffff)
93fe56b9e6SYuval Mintz 	u16				ovlan;
94fe56b9e6SYuval Mintz };
95fe56b9e6SYuval Mintz 
96fe56b9e6SYuval Mintz struct qed_mcp_nvm_common {
97fe56b9e6SYuval Mintz 	u32	offset;
98fe56b9e6SYuval Mintz 	u32	param;
99fe56b9e6SYuval Mintz 	u32	resp;
100fe56b9e6SYuval Mintz 	u32	cmd;
101fe56b9e6SYuval Mintz };
102fe56b9e6SYuval Mintz 
103fe56b9e6SYuval Mintz struct qed_mcp_drv_version {
104fe56b9e6SYuval Mintz 	u32	version;
105fe56b9e6SYuval Mintz 	u8	name[MCP_DRV_VER_STR_SIZE - 4];
106fe56b9e6SYuval Mintz };
107fe56b9e6SYuval Mintz 
108fe56b9e6SYuval Mintz /**
109cc875c2eSYuval Mintz  * @brief - returns the link params of the hw function
110cc875c2eSYuval Mintz  *
111cc875c2eSYuval Mintz  * @param p_hwfn
112cc875c2eSYuval Mintz  *
113cc875c2eSYuval Mintz  * @returns pointer to link params
114cc875c2eSYuval Mintz  */
115cc875c2eSYuval Mintz struct qed_mcp_link_params *qed_mcp_get_link_params(struct qed_hwfn *);
116cc875c2eSYuval Mintz 
117cc875c2eSYuval Mintz /**
118cc875c2eSYuval Mintz  * @brief - return the link state of the hw function
119cc875c2eSYuval Mintz  *
120cc875c2eSYuval Mintz  * @param p_hwfn
121cc875c2eSYuval Mintz  *
122cc875c2eSYuval Mintz  * @returns pointer to link state
123cc875c2eSYuval Mintz  */
124cc875c2eSYuval Mintz struct qed_mcp_link_state *qed_mcp_get_link_state(struct qed_hwfn *);
125cc875c2eSYuval Mintz 
126cc875c2eSYuval Mintz /**
127cc875c2eSYuval Mintz  * @brief - return the link capabilities of the hw function
128cc875c2eSYuval Mintz  *
129cc875c2eSYuval Mintz  * @param p_hwfn
130cc875c2eSYuval Mintz  *
131cc875c2eSYuval Mintz  * @returns pointer to link capabilities
132cc875c2eSYuval Mintz  */
133cc875c2eSYuval Mintz struct qed_mcp_link_capabilities
134cc875c2eSYuval Mintz 	*qed_mcp_get_link_capabilities(struct qed_hwfn *p_hwfn);
135cc875c2eSYuval Mintz 
136cc875c2eSYuval Mintz /**
137cc875c2eSYuval Mintz  * @brief Request the MFW to set the the link according to 'link_input'.
138cc875c2eSYuval Mintz  *
139cc875c2eSYuval Mintz  * @param p_hwfn
140cc875c2eSYuval Mintz  * @param p_ptt
141cc875c2eSYuval Mintz  * @param b_up - raise link if `true'. Reset link if `false'.
142cc875c2eSYuval Mintz  *
143cc875c2eSYuval Mintz  * @return int
144cc875c2eSYuval Mintz  */
145cc875c2eSYuval Mintz int qed_mcp_set_link(struct qed_hwfn   *p_hwfn,
146cc875c2eSYuval Mintz 		     struct qed_ptt     *p_ptt,
147cc875c2eSYuval Mintz 		     bool               b_up);
148cc875c2eSYuval Mintz 
149cc875c2eSYuval Mintz /**
150fe56b9e6SYuval Mintz  * @brief Get the management firmware version value
151fe56b9e6SYuval Mintz  *
1521408cc1fSYuval Mintz  * @param p_hwfn
1531408cc1fSYuval Mintz  * @param p_ptt
1541408cc1fSYuval Mintz  * @param p_mfw_ver    - mfw version value
1551408cc1fSYuval Mintz  * @param p_running_bundle_id	- image id in nvram; Optional.
156fe56b9e6SYuval Mintz  *
1571408cc1fSYuval Mintz  * @return int - 0 - operation was successful.
158fe56b9e6SYuval Mintz  */
1591408cc1fSYuval Mintz int qed_mcp_get_mfw_ver(struct qed_hwfn *p_hwfn,
1601408cc1fSYuval Mintz 			struct qed_ptt *p_ptt,
1611408cc1fSYuval Mintz 			u32 *p_mfw_ver, u32 *p_running_bundle_id);
162fe56b9e6SYuval Mintz 
163fe56b9e6SYuval Mintz /**
164cc875c2eSYuval Mintz  * @brief Get media type value of the port.
165cc875c2eSYuval Mintz  *
166cc875c2eSYuval Mintz  * @param cdev      - qed dev pointer
167cc875c2eSYuval Mintz  * @param mfw_ver    - media type value
168cc875c2eSYuval Mintz  *
169cc875c2eSYuval Mintz  * @return int -
170cc875c2eSYuval Mintz  *      0 - Operation was successul.
171cc875c2eSYuval Mintz  *      -EBUSY - Operation failed
172cc875c2eSYuval Mintz  */
173cc875c2eSYuval Mintz int qed_mcp_get_media_type(struct qed_dev      *cdev,
174cc875c2eSYuval Mintz 			   u32                  *media_type);
175cc875c2eSYuval Mintz 
176cc875c2eSYuval Mintz /**
177fe56b9e6SYuval Mintz  * @brief General function for sending commands to the MCP
178fe56b9e6SYuval Mintz  *        mailbox. It acquire mutex lock for the entire
179fe56b9e6SYuval Mintz  *        operation, from sending the request until the MCP
180fe56b9e6SYuval Mintz  *        response. Waiting for MCP response will be checked up
181fe56b9e6SYuval Mintz  *        to 5 seconds every 5ms.
182fe56b9e6SYuval Mintz  *
183fe56b9e6SYuval Mintz  * @param p_hwfn     - hw function
184fe56b9e6SYuval Mintz  * @param p_ptt      - PTT required for register access
185fe56b9e6SYuval Mintz  * @param cmd        - command to be sent to the MCP.
186fe56b9e6SYuval Mintz  * @param param      - Optional param
187fe56b9e6SYuval Mintz  * @param o_mcp_resp - The MCP response code (exclude sequence).
188fe56b9e6SYuval Mintz  * @param o_mcp_param- Optional parameter provided by the MCP
189fe56b9e6SYuval Mintz  *                     response
190fe56b9e6SYuval Mintz  * @return int - 0 - operation
191fe56b9e6SYuval Mintz  * was successul.
192fe56b9e6SYuval Mintz  */
193fe56b9e6SYuval Mintz int qed_mcp_cmd(struct qed_hwfn *p_hwfn,
194fe56b9e6SYuval Mintz 		struct qed_ptt *p_ptt,
195fe56b9e6SYuval Mintz 		u32 cmd,
196fe56b9e6SYuval Mintz 		u32 param,
197fe56b9e6SYuval Mintz 		u32 *o_mcp_resp,
198fe56b9e6SYuval Mintz 		u32 *o_mcp_param);
199fe56b9e6SYuval Mintz 
200fe56b9e6SYuval Mintz /**
201fe56b9e6SYuval Mintz  * @brief - drains the nig, allowing completion to pass in case of pauses.
202fe56b9e6SYuval Mintz  *          (Should be called only from sleepable context)
203fe56b9e6SYuval Mintz  *
204fe56b9e6SYuval Mintz  * @param p_hwfn
205fe56b9e6SYuval Mintz  * @param p_ptt
206fe56b9e6SYuval Mintz  */
207fe56b9e6SYuval Mintz int qed_mcp_drain(struct qed_hwfn *p_hwfn,
208fe56b9e6SYuval Mintz 		  struct qed_ptt *p_ptt);
209fe56b9e6SYuval Mintz 
210fe56b9e6SYuval Mintz /**
211cee4d264SManish Chopra  * @brief Get the flash size value
212cee4d264SManish Chopra  *
213cee4d264SManish Chopra  * @param p_hwfn
214cee4d264SManish Chopra  * @param p_ptt
215cee4d264SManish Chopra  * @param p_flash_size  - flash size in bytes to be filled.
216cee4d264SManish Chopra  *
217cee4d264SManish Chopra  * @return int - 0 - operation was successul.
218cee4d264SManish Chopra  */
219cee4d264SManish Chopra int qed_mcp_get_flash_size(struct qed_hwfn     *p_hwfn,
220cee4d264SManish Chopra 			   struct qed_ptt       *p_ptt,
221cee4d264SManish Chopra 			   u32 *p_flash_size);
222cee4d264SManish Chopra 
223cee4d264SManish Chopra /**
224fe56b9e6SYuval Mintz  * @brief Send driver version to MFW
225fe56b9e6SYuval Mintz  *
226fe56b9e6SYuval Mintz  * @param p_hwfn
227fe56b9e6SYuval Mintz  * @param p_ptt
228fe56b9e6SYuval Mintz  * @param version - Version value
229fe56b9e6SYuval Mintz  * @param name - Protocol driver name
230fe56b9e6SYuval Mintz  *
231fe56b9e6SYuval Mintz  * @return int - 0 - operation was successul.
232fe56b9e6SYuval Mintz  */
233fe56b9e6SYuval Mintz int
234fe56b9e6SYuval Mintz qed_mcp_send_drv_version(struct qed_hwfn *p_hwfn,
235fe56b9e6SYuval Mintz 			 struct qed_ptt *p_ptt,
236fe56b9e6SYuval Mintz 			 struct qed_mcp_drv_version *p_ver);
237fe56b9e6SYuval Mintz 
23891420b83SSudarsana Kalluru /**
23991420b83SSudarsana Kalluru  * @brief Set LED status
24091420b83SSudarsana Kalluru  *
24191420b83SSudarsana Kalluru  *  @param p_hwfn
24291420b83SSudarsana Kalluru  *  @param p_ptt
24391420b83SSudarsana Kalluru  *  @param mode - LED mode
24491420b83SSudarsana Kalluru  *
24591420b83SSudarsana Kalluru  * @return int - 0 - operation was successful.
24691420b83SSudarsana Kalluru  */
24791420b83SSudarsana Kalluru int qed_mcp_set_led(struct qed_hwfn *p_hwfn,
24891420b83SSudarsana Kalluru 		    struct qed_ptt *p_ptt,
24991420b83SSudarsana Kalluru 		    enum qed_led_mode mode);
25091420b83SSudarsana Kalluru 
25103dc76caSSudarsana Reddy Kalluru /**
25203dc76caSSudarsana Reddy Kalluru  * @brief Bist register test
25303dc76caSSudarsana Reddy Kalluru  *
25403dc76caSSudarsana Reddy Kalluru  *  @param p_hwfn    - hw function
25503dc76caSSudarsana Reddy Kalluru  *  @param p_ptt     - PTT required for register access
25603dc76caSSudarsana Reddy Kalluru  *
25703dc76caSSudarsana Reddy Kalluru  * @return int - 0 - operation was successful.
25803dc76caSSudarsana Reddy Kalluru  */
25903dc76caSSudarsana Reddy Kalluru int qed_mcp_bist_register_test(struct qed_hwfn *p_hwfn,
26003dc76caSSudarsana Reddy Kalluru 			       struct qed_ptt *p_ptt);
26103dc76caSSudarsana Reddy Kalluru 
26203dc76caSSudarsana Reddy Kalluru /**
26303dc76caSSudarsana Reddy Kalluru  * @brief Bist clock test
26403dc76caSSudarsana Reddy Kalluru  *
26503dc76caSSudarsana Reddy Kalluru  *  @param p_hwfn    - hw function
26603dc76caSSudarsana Reddy Kalluru  *  @param p_ptt     - PTT required for register access
26703dc76caSSudarsana Reddy Kalluru  *
26803dc76caSSudarsana Reddy Kalluru  * @return int - 0 - operation was successful.
26903dc76caSSudarsana Reddy Kalluru  */
27003dc76caSSudarsana Reddy Kalluru int qed_mcp_bist_clock_test(struct qed_hwfn *p_hwfn,
27103dc76caSSudarsana Reddy Kalluru 			    struct qed_ptt *p_ptt);
27203dc76caSSudarsana Reddy Kalluru 
273fe56b9e6SYuval Mintz /* Using hwfn number (and not pf_num) is required since in CMT mode,
274fe56b9e6SYuval Mintz  * same pf_num may be used by two different hwfn
275fe56b9e6SYuval Mintz  * TODO - this shouldn't really be in .h file, but until all fields
276fe56b9e6SYuval Mintz  * required during hw-init will be placed in their correct place in shmem
277fe56b9e6SYuval Mintz  * we need it in qed_dev.c [for readin the nvram reflection in shmem].
278fe56b9e6SYuval Mintz  */
279fe56b9e6SYuval Mintz #define MCP_PF_ID_BY_REL(p_hwfn, rel_pfid) (QED_IS_BB((p_hwfn)->cdev) ?	       \
280fe56b9e6SYuval Mintz 					    ((rel_pfid) |		       \
281fe56b9e6SYuval Mintz 					     ((p_hwfn)->abs_pf_id & 1) << 3) : \
282fe56b9e6SYuval Mintz 					    rel_pfid)
283fe56b9e6SYuval Mintz #define MCP_PF_ID(p_hwfn) MCP_PF_ID_BY_REL(p_hwfn, (p_hwfn)->rel_pf_id)
284fe56b9e6SYuval Mintz 
285fe56b9e6SYuval Mintz /* TODO - this is only correct as long as only BB is supported, and
286fe56b9e6SYuval Mintz  * no port-swapping is implemented; Afterwards we'll need to fix it.
287fe56b9e6SYuval Mintz  */
288fe56b9e6SYuval Mintz #define MFW_PORT(_p_hwfn)       ((_p_hwfn)->abs_pf_id %	\
289fe56b9e6SYuval Mintz 				 ((_p_hwfn)->cdev->num_ports_in_engines * 2))
290fe56b9e6SYuval Mintz struct qed_mcp_info {
2915529bad9STomer Tayar 	spinlock_t				lock;
2925529bad9STomer Tayar 	bool					block_mb_sending;
293fe56b9e6SYuval Mintz 	u32					public_base;
294fe56b9e6SYuval Mintz 	u32					drv_mb_addr;
295fe56b9e6SYuval Mintz 	u32					mfw_mb_addr;
296fe56b9e6SYuval Mintz 	u32					port_addr;
297fe56b9e6SYuval Mintz 	u16					drv_mb_seq;
298fe56b9e6SYuval Mintz 	u16					drv_pulse_seq;
299cc875c2eSYuval Mintz 	struct qed_mcp_link_params		link_input;
300cc875c2eSYuval Mintz 	struct qed_mcp_link_state		link_output;
301cc875c2eSYuval Mintz 	struct qed_mcp_link_capabilities	link_capabilities;
302fe56b9e6SYuval Mintz 	struct qed_mcp_function_info		func_info;
303fe56b9e6SYuval Mintz 	u8					*mfw_mb_cur;
304fe56b9e6SYuval Mintz 	u8					*mfw_mb_shadow;
305fe56b9e6SYuval Mintz 	u16					mfw_mb_length;
306fe56b9e6SYuval Mintz 	u16					mcp_hist;
307fe56b9e6SYuval Mintz };
308fe56b9e6SYuval Mintz 
3095529bad9STomer Tayar struct qed_mcp_mb_params {
3105529bad9STomer Tayar 	u32			cmd;
3115529bad9STomer Tayar 	u32			param;
3125529bad9STomer Tayar 	union drv_union_data	*p_data_src;
3135529bad9STomer Tayar 	union drv_union_data	*p_data_dst;
3145529bad9STomer Tayar 	u32			mcp_resp;
3155529bad9STomer Tayar 	u32			mcp_param;
3165529bad9STomer Tayar };
3175529bad9STomer Tayar 
318fe56b9e6SYuval Mintz /**
319fe56b9e6SYuval Mintz  * @brief Initialize the interface with the MCP
320fe56b9e6SYuval Mintz  *
321fe56b9e6SYuval Mintz  * @param p_hwfn - HW func
322fe56b9e6SYuval Mintz  * @param p_ptt - PTT required for register access
323fe56b9e6SYuval Mintz  *
324fe56b9e6SYuval Mintz  * @return int
325fe56b9e6SYuval Mintz  */
326fe56b9e6SYuval Mintz int qed_mcp_cmd_init(struct qed_hwfn *p_hwfn,
327fe56b9e6SYuval Mintz 		     struct qed_ptt *p_ptt);
328fe56b9e6SYuval Mintz 
329fe56b9e6SYuval Mintz /**
330fe56b9e6SYuval Mintz  * @brief Initialize the port interface with the MCP
331fe56b9e6SYuval Mintz  *
332fe56b9e6SYuval Mintz  * @param p_hwfn
333fe56b9e6SYuval Mintz  * @param p_ptt
334fe56b9e6SYuval Mintz  * Can only be called after `num_ports_in_engines' is set
335fe56b9e6SYuval Mintz  */
336fe56b9e6SYuval Mintz void qed_mcp_cmd_port_init(struct qed_hwfn *p_hwfn,
337fe56b9e6SYuval Mintz 			   struct qed_ptt *p_ptt);
338fe56b9e6SYuval Mintz /**
339fe56b9e6SYuval Mintz  * @brief Releases resources allocated during the init process.
340fe56b9e6SYuval Mintz  *
341fe56b9e6SYuval Mintz  * @param p_hwfn - HW func
342fe56b9e6SYuval Mintz  * @param p_ptt - PTT required for register access
343fe56b9e6SYuval Mintz  *
344fe56b9e6SYuval Mintz  * @return int
345fe56b9e6SYuval Mintz  */
346fe56b9e6SYuval Mintz 
347fe56b9e6SYuval Mintz int qed_mcp_free(struct qed_hwfn *p_hwfn);
348fe56b9e6SYuval Mintz 
349fe56b9e6SYuval Mintz /**
350cc875c2eSYuval Mintz  * @brief This function is called from the DPC context. After
351cc875c2eSYuval Mintz  * pointing PTT to the mfw mb, check for events sent by the MCP
352cc875c2eSYuval Mintz  * to the driver and ack them. In case a critical event
353cc875c2eSYuval Mintz  * detected, it will be handled here, otherwise the work will be
354cc875c2eSYuval Mintz  * queued to a sleepable work-queue.
355cc875c2eSYuval Mintz  *
356cc875c2eSYuval Mintz  * @param p_hwfn - HW function
357cc875c2eSYuval Mintz  * @param p_ptt - PTT required for register access
358cc875c2eSYuval Mintz  * @return int - 0 - operation
359cc875c2eSYuval Mintz  * was successul.
360cc875c2eSYuval Mintz  */
361cc875c2eSYuval Mintz int qed_mcp_handle_events(struct qed_hwfn *p_hwfn,
362cc875c2eSYuval Mintz 			  struct qed_ptt *p_ptt);
363cc875c2eSYuval Mintz 
364cc875c2eSYuval Mintz /**
365fe56b9e6SYuval Mintz  * @brief Sends a LOAD_REQ to the MFW, and in case operation
366fe56b9e6SYuval Mintz  *        succeed, returns whether this PF is the first on the
367fe56b9e6SYuval Mintz  *        chip/engine/port or function. This function should be
368fe56b9e6SYuval Mintz  *        called when driver is ready to accept MFW events after
369fe56b9e6SYuval Mintz  *        Storms initializations are done.
370fe56b9e6SYuval Mintz  *
371fe56b9e6SYuval Mintz  * @param p_hwfn       - hw function
372fe56b9e6SYuval Mintz  * @param p_ptt        - PTT required for register access
373fe56b9e6SYuval Mintz  * @param p_load_code  - The MCP response param containing one
374fe56b9e6SYuval Mintz  *      of the following:
375fe56b9e6SYuval Mintz  *      FW_MSG_CODE_DRV_LOAD_ENGINE
376fe56b9e6SYuval Mintz  *      FW_MSG_CODE_DRV_LOAD_PORT
377fe56b9e6SYuval Mintz  *      FW_MSG_CODE_DRV_LOAD_FUNCTION
378fe56b9e6SYuval Mintz  * @return int -
379fe56b9e6SYuval Mintz  *      0 - Operation was successul.
380fe56b9e6SYuval Mintz  *      -EBUSY - Operation failed
381fe56b9e6SYuval Mintz  */
382fe56b9e6SYuval Mintz int qed_mcp_load_req(struct qed_hwfn *p_hwfn,
383fe56b9e6SYuval Mintz 		     struct qed_ptt *p_ptt,
384fe56b9e6SYuval Mintz 		     u32 *p_load_code);
385fe56b9e6SYuval Mintz 
386fe56b9e6SYuval Mintz /**
387fe56b9e6SYuval Mintz  * @brief Read the MFW mailbox into Current buffer.
388fe56b9e6SYuval Mintz  *
389fe56b9e6SYuval Mintz  * @param p_hwfn
390fe56b9e6SYuval Mintz  * @param p_ptt
391fe56b9e6SYuval Mintz  */
392fe56b9e6SYuval Mintz void qed_mcp_read_mb(struct qed_hwfn *p_hwfn,
393fe56b9e6SYuval Mintz 		     struct qed_ptt *p_ptt);
394fe56b9e6SYuval Mintz 
395fe56b9e6SYuval Mintz /**
3960b55e27dSYuval Mintz  * @brief Ack to mfw that driver finished FLR process for VFs
3970b55e27dSYuval Mintz  *
3980b55e27dSYuval Mintz  * @param p_hwfn
3990b55e27dSYuval Mintz  * @param p_ptt
4000b55e27dSYuval Mintz  * @param vfs_to_ack - bit mask of all engine VFs for which the PF acks.
4010b55e27dSYuval Mintz  *
4020b55e27dSYuval Mintz  * @param return int - 0 upon success.
4030b55e27dSYuval Mintz  */
4040b55e27dSYuval Mintz int qed_mcp_ack_vf_flr(struct qed_hwfn *p_hwfn,
4050b55e27dSYuval Mintz 		       struct qed_ptt *p_ptt, u32 *vfs_to_ack);
4060b55e27dSYuval Mintz 
4070b55e27dSYuval Mintz /**
408fe56b9e6SYuval Mintz  * @brief - calls during init to read shmem of all function-related info.
409fe56b9e6SYuval Mintz  *
410fe56b9e6SYuval Mintz  * @param p_hwfn
411fe56b9e6SYuval Mintz  *
412fe56b9e6SYuval Mintz  * @param return 0 upon success.
413fe56b9e6SYuval Mintz  */
414fe56b9e6SYuval Mintz int qed_mcp_fill_shmem_func_info(struct qed_hwfn *p_hwfn,
415fe56b9e6SYuval Mintz 				 struct qed_ptt *p_ptt);
416fe56b9e6SYuval Mintz 
417fe56b9e6SYuval Mintz /**
418fe56b9e6SYuval Mintz  * @brief - Reset the MCP using mailbox command.
419fe56b9e6SYuval Mintz  *
420fe56b9e6SYuval Mintz  * @param p_hwfn
421fe56b9e6SYuval Mintz  * @param p_ptt
422fe56b9e6SYuval Mintz  *
423fe56b9e6SYuval Mintz  * @param return 0 upon success.
424fe56b9e6SYuval Mintz  */
425fe56b9e6SYuval Mintz int qed_mcp_reset(struct qed_hwfn *p_hwfn,
426fe56b9e6SYuval Mintz 		  struct qed_ptt *p_ptt);
427fe56b9e6SYuval Mintz 
428fe56b9e6SYuval Mintz /**
429fe56b9e6SYuval Mintz  * @brief indicates whether the MFW objects [under mcp_info] are accessible
430fe56b9e6SYuval Mintz  *
431fe56b9e6SYuval Mintz  * @param p_hwfn
432fe56b9e6SYuval Mintz  *
433fe56b9e6SYuval Mintz  * @return true iff MFW is running and mcp_info is initialized
434fe56b9e6SYuval Mintz  */
435fe56b9e6SYuval Mintz bool qed_mcp_is_init(struct qed_hwfn *p_hwfn);
4361408cc1fSYuval Mintz 
4371408cc1fSYuval Mintz /**
4381408cc1fSYuval Mintz  * @brief request MFW to configure MSI-X for a VF
4391408cc1fSYuval Mintz  *
4401408cc1fSYuval Mintz  * @param p_hwfn
4411408cc1fSYuval Mintz  * @param p_ptt
4421408cc1fSYuval Mintz  * @param vf_id - absolute inside engine
4431408cc1fSYuval Mintz  * @param num_sbs - number of entries to request
4441408cc1fSYuval Mintz  *
4451408cc1fSYuval Mintz  * @return int
4461408cc1fSYuval Mintz  */
4471408cc1fSYuval Mintz int qed_mcp_config_vf_msix(struct qed_hwfn *p_hwfn,
4481408cc1fSYuval Mintz 			   struct qed_ptt *p_ptt, u8 vf_id, u8 num);
4491408cc1fSYuval Mintz 
450a64b02d5SManish Chopra int qed_configure_pf_min_bandwidth(struct qed_dev *cdev, u8 min_bw);
4514b01e519SManish Chopra int qed_configure_pf_max_bandwidth(struct qed_dev *cdev, u8 max_bw);
4524b01e519SManish Chopra int __qed_configure_pf_max_bandwidth(struct qed_hwfn *p_hwfn,
4534b01e519SManish Chopra 				     struct qed_ptt *p_ptt,
4544b01e519SManish Chopra 				     struct qed_mcp_link_state *p_link,
4554b01e519SManish Chopra 				     u8 max_bw);
456a64b02d5SManish Chopra int __qed_configure_pf_min_bandwidth(struct qed_hwfn *p_hwfn,
457a64b02d5SManish Chopra 				     struct qed_ptt *p_ptt,
458a64b02d5SManish Chopra 				     struct qed_mcp_link_state *p_link,
459a64b02d5SManish Chopra 				     u8 min_bw);
460fe56b9e6SYuval Mintz #endif
461