• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (C) 2005 - 2016 Broadcom
4  * All rights reserved.
5  *
6  * Contact Information:
7  * linux-drivers@emulex.com
8  *
9  * Emulex
10  * 3333 Susan Street
11  * Costa Mesa, CA 92626
12  */
13 
14 #include <linux/module.h>
15 #include "be.h"
16 #include "be_cmds.h"
17 
18 const char * const be_misconfig_evt_port_state[] = {
19 	"Physical Link is functional",
20 	"Optics faulted/incorrectly installed/not installed - Reseat optics. If issue not resolved, replace.",
21 	"Optics of two types installed – Remove one optic or install matching pair of optics.",
22 	"Incompatible optics – Replace with compatible optics for card to function.",
23 	"Unqualified optics – Replace with Avago optics for Warranty and Technical Support.",
24 	"Uncertified optics – Replace with Avago-certified optics to enable link operation."
25 };
26 
27 static char *be_port_misconfig_evt_severity[] = {
28 	"KERN_WARN",
29 	"KERN_INFO",
30 	"KERN_ERR",
31 	"KERN_WARN"
32 };
33 
34 static char *phy_state_oper_desc[] = {
35 	"Link is non-operational",
36 	"Link is operational",
37 	""
38 };
39 
40 static struct be_cmd_priv_map cmd_priv_map[] = {
41 	{
42 		OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG,
43 		CMD_SUBSYSTEM_ETH,
44 		BE_PRIV_LNKMGMT | BE_PRIV_VHADM |
45 		BE_PRIV_DEVCFG | BE_PRIV_DEVSEC
46 	},
47 	{
48 		OPCODE_COMMON_GET_FLOW_CONTROL,
49 		CMD_SUBSYSTEM_COMMON,
50 		BE_PRIV_LNKQUERY | BE_PRIV_VHADM |
51 		BE_PRIV_DEVCFG | BE_PRIV_DEVSEC
52 	},
53 	{
54 		OPCODE_COMMON_SET_FLOW_CONTROL,
55 		CMD_SUBSYSTEM_COMMON,
56 		BE_PRIV_LNKMGMT | BE_PRIV_VHADM |
57 		BE_PRIV_DEVCFG | BE_PRIV_DEVSEC
58 	},
59 	{
60 		OPCODE_ETH_GET_PPORT_STATS,
61 		CMD_SUBSYSTEM_ETH,
62 		BE_PRIV_LNKMGMT | BE_PRIV_VHADM |
63 		BE_PRIV_DEVCFG | BE_PRIV_DEVSEC
64 	},
65 	{
66 		OPCODE_COMMON_GET_PHY_DETAILS,
67 		CMD_SUBSYSTEM_COMMON,
68 		BE_PRIV_LNKMGMT | BE_PRIV_VHADM |
69 		BE_PRIV_DEVCFG | BE_PRIV_DEVSEC
70 	},
71 	{
72 		OPCODE_LOWLEVEL_HOST_DDR_DMA,
73 		CMD_SUBSYSTEM_LOWLEVEL,
74 		BE_PRIV_DEVCFG | BE_PRIV_DEVSEC
75 	},
76 	{
77 		OPCODE_LOWLEVEL_LOOPBACK_TEST,
78 		CMD_SUBSYSTEM_LOWLEVEL,
79 		BE_PRIV_DEVCFG | BE_PRIV_DEVSEC
80 	},
81 	{
82 		OPCODE_LOWLEVEL_SET_LOOPBACK_MODE,
83 		CMD_SUBSYSTEM_LOWLEVEL,
84 		BE_PRIV_DEVCFG | BE_PRIV_DEVSEC
85 	},
86 	{
87 		OPCODE_COMMON_SET_HSW_CONFIG,
88 		CMD_SUBSYSTEM_COMMON,
89 		BE_PRIV_DEVCFG | BE_PRIV_VHADM |
90 		BE_PRIV_DEVSEC
91 	},
92 	{
93 		OPCODE_COMMON_GET_EXT_FAT_CAPABILITIES,
94 		CMD_SUBSYSTEM_COMMON,
95 		BE_PRIV_DEVCFG
96 	}
97 };
98 
be_cmd_allowed(struct be_adapter * adapter,u8 opcode,u8 subsystem)99 static bool be_cmd_allowed(struct be_adapter *adapter, u8 opcode, u8 subsystem)
100 {
101 	int i;
102 	int num_entries = ARRAY_SIZE(cmd_priv_map);
103 	u32 cmd_privileges = adapter->cmd_privileges;
104 
105 	for (i = 0; i < num_entries; i++)
106 		if (opcode == cmd_priv_map[i].opcode &&
107 		    subsystem == cmd_priv_map[i].subsystem)
108 			if (!(cmd_privileges & cmd_priv_map[i].priv_mask))
109 				return false;
110 
111 	return true;
112 }
113 
embedded_payload(struct be_mcc_wrb * wrb)114 static inline void *embedded_payload(struct be_mcc_wrb *wrb)
115 {
116 	return wrb->payload.embedded_payload;
117 }
118 
be_mcc_notify(struct be_adapter * adapter)119 static int be_mcc_notify(struct be_adapter *adapter)
120 {
121 	struct be_queue_info *mccq = &adapter->mcc_obj.q;
122 	u32 val = 0;
123 
124 	if (be_check_error(adapter, BE_ERROR_ANY))
125 		return -EIO;
126 
127 	val |= mccq->id & DB_MCCQ_RING_ID_MASK;
128 	val |= 1 << DB_MCCQ_NUM_POSTED_SHIFT;
129 
130 	wmb();
131 	iowrite32(val, adapter->db + DB_MCCQ_OFFSET);
132 
133 	return 0;
134 }
135 
136 /* To check if valid bit is set, check the entire word as we don't know
137  * the endianness of the data (old entry is host endian while a new entry is
138  * little endian) */
be_mcc_compl_is_new(struct be_mcc_compl * compl)139 static inline bool be_mcc_compl_is_new(struct be_mcc_compl *compl)
140 {
141 	u32 flags;
142 
143 	if (compl->flags != 0) {
144 		flags = le32_to_cpu(compl->flags);
145 		if (flags & CQE_FLAGS_VALID_MASK) {
146 			compl->flags = flags;
147 			return true;
148 		}
149 	}
150 	return false;
151 }
152 
153 /* Need to reset the entire word that houses the valid bit */
be_mcc_compl_use(struct be_mcc_compl * compl)154 static inline void be_mcc_compl_use(struct be_mcc_compl *compl)
155 {
156 	compl->flags = 0;
157 }
158 
be_decode_resp_hdr(u32 tag0,u32 tag1)159 static struct be_cmd_resp_hdr *be_decode_resp_hdr(u32 tag0, u32 tag1)
160 {
161 	unsigned long addr;
162 
163 	addr = tag1;
164 	addr = ((addr << 16) << 16) | tag0;
165 	return (void *)addr;
166 }
167 
be_skip_err_log(u8 opcode,u16 base_status,u16 addl_status)168 static bool be_skip_err_log(u8 opcode, u16 base_status, u16 addl_status)
169 {
170 	if (base_status == MCC_STATUS_NOT_SUPPORTED ||
171 	    base_status == MCC_STATUS_ILLEGAL_REQUEST ||
172 	    addl_status == MCC_ADDL_STATUS_TOO_MANY_INTERFACES ||
173 	    addl_status == MCC_ADDL_STATUS_INSUFFICIENT_VLANS ||
174 	    (opcode == OPCODE_COMMON_WRITE_FLASHROM &&
175 	    (base_status == MCC_STATUS_ILLEGAL_FIELD ||
176 	     addl_status == MCC_ADDL_STATUS_FLASH_IMAGE_CRC_MISMATCH)))
177 		return true;
178 	else
179 		return false;
180 }
181 
182 /* Place holder for all the async MCC cmds wherein the caller is not in a busy
183  * loop (has not issued be_mcc_notify_wait())
184  */
be_async_cmd_process(struct be_adapter * adapter,struct be_mcc_compl * compl,struct be_cmd_resp_hdr * resp_hdr)185 static void be_async_cmd_process(struct be_adapter *adapter,
186 				 struct be_mcc_compl *compl,
187 				 struct be_cmd_resp_hdr *resp_hdr)
188 {
189 	enum mcc_base_status base_status = base_status(compl->status);
190 	u8 opcode = 0, subsystem = 0;
191 
192 	if (resp_hdr) {
193 		opcode = resp_hdr->opcode;
194 		subsystem = resp_hdr->subsystem;
195 	}
196 
197 	if (opcode == OPCODE_LOWLEVEL_LOOPBACK_TEST &&
198 	    subsystem == CMD_SUBSYSTEM_LOWLEVEL) {
199 		complete(&adapter->et_cmd_compl);
200 		return;
201 	}
202 
203 	if (opcode == OPCODE_LOWLEVEL_SET_LOOPBACK_MODE &&
204 	    subsystem == CMD_SUBSYSTEM_LOWLEVEL) {
205 		complete(&adapter->et_cmd_compl);
206 		return;
207 	}
208 
209 	if ((opcode == OPCODE_COMMON_WRITE_FLASHROM ||
210 	     opcode == OPCODE_COMMON_WRITE_OBJECT) &&
211 	    subsystem == CMD_SUBSYSTEM_COMMON) {
212 		adapter->flash_status = compl->status;
213 		complete(&adapter->et_cmd_compl);
214 		return;
215 	}
216 
217 	if ((opcode == OPCODE_ETH_GET_STATISTICS ||
218 	     opcode == OPCODE_ETH_GET_PPORT_STATS) &&
219 	    subsystem == CMD_SUBSYSTEM_ETH &&
220 	    base_status == MCC_STATUS_SUCCESS) {
221 		be_parse_stats(adapter);
222 		adapter->stats_cmd_sent = false;
223 		return;
224 	}
225 
226 	if (opcode == OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES &&
227 	    subsystem == CMD_SUBSYSTEM_COMMON) {
228 		if (base_status == MCC_STATUS_SUCCESS) {
229 			struct be_cmd_resp_get_cntl_addnl_attribs *resp =
230 							(void *)resp_hdr;
231 			adapter->hwmon_info.be_on_die_temp =
232 						resp->on_die_temperature;
233 		} else {
234 			adapter->be_get_temp_freq = 0;
235 			adapter->hwmon_info.be_on_die_temp =
236 						BE_INVALID_DIE_TEMP;
237 		}
238 		return;
239 	}
240 }
241 
be_mcc_compl_process(struct be_adapter * adapter,struct be_mcc_compl * compl)242 static int be_mcc_compl_process(struct be_adapter *adapter,
243 				struct be_mcc_compl *compl)
244 {
245 	enum mcc_base_status base_status;
246 	enum mcc_addl_status addl_status;
247 	struct be_cmd_resp_hdr *resp_hdr;
248 	u8 opcode = 0, subsystem = 0;
249 
250 	/* Just swap the status to host endian; mcc tag is opaquely copied
251 	 * from mcc_wrb */
252 	be_dws_le_to_cpu(compl, 4);
253 
254 	base_status = base_status(compl->status);
255 	addl_status = addl_status(compl->status);
256 
257 	resp_hdr = be_decode_resp_hdr(compl->tag0, compl->tag1);
258 	if (resp_hdr) {
259 		opcode = resp_hdr->opcode;
260 		subsystem = resp_hdr->subsystem;
261 	}
262 
263 	be_async_cmd_process(adapter, compl, resp_hdr);
264 
265 	if (base_status != MCC_STATUS_SUCCESS &&
266 	    !be_skip_err_log(opcode, base_status, addl_status)) {
267 		if (base_status == MCC_STATUS_UNAUTHORIZED_REQUEST ||
268 		    addl_status == MCC_ADDL_STATUS_INSUFFICIENT_PRIVILEGES) {
269 			dev_warn(&adapter->pdev->dev,
270 				 "VF is not privileged to issue opcode %d-%d\n",
271 				 opcode, subsystem);
272 		} else {
273 			dev_err(&adapter->pdev->dev,
274 				"opcode %d-%d failed:status %d-%d\n",
275 				opcode, subsystem, base_status, addl_status);
276 		}
277 	}
278 	return compl->status;
279 }
280 
281 /* Link state evt is a string of bytes; no need for endian swapping */
be_async_link_state_process(struct be_adapter * adapter,struct be_mcc_compl * compl)282 static void be_async_link_state_process(struct be_adapter *adapter,
283 					struct be_mcc_compl *compl)
284 {
285 	struct be_async_event_link_state *evt =
286 			(struct be_async_event_link_state *)compl;
287 
288 	/* When link status changes, link speed must be re-queried from FW */
289 	adapter->phy.link_speed = -1;
290 
291 	/* On BEx the FW does not send a separate link status
292 	 * notification for physical and logical link.
293 	 * On other chips just process the logical link
294 	 * status notification
295 	 */
296 	if (!BEx_chip(adapter) &&
297 	    !(evt->port_link_status & LOGICAL_LINK_STATUS_MASK))
298 		return;
299 
300 	/* For the initial link status do not rely on the ASYNC event as
301 	 * it may not be received in some cases.
302 	 */
303 	if (adapter->flags & BE_FLAGS_LINK_STATUS_INIT)
304 		be_link_status_update(adapter,
305 				      evt->port_link_status & LINK_STATUS_MASK);
306 }
307 
be_async_port_misconfig_event_process(struct be_adapter * adapter,struct be_mcc_compl * compl)308 static void be_async_port_misconfig_event_process(struct be_adapter *adapter,
309 						  struct be_mcc_compl *compl)
310 {
311 	struct be_async_event_misconfig_port *evt =
312 			(struct be_async_event_misconfig_port *)compl;
313 	u32 sfp_misconfig_evt_word1 = le32_to_cpu(evt->event_data_word1);
314 	u32 sfp_misconfig_evt_word2 = le32_to_cpu(evt->event_data_word2);
315 	u8 phy_oper_state = PHY_STATE_OPER_MSG_NONE;
316 	struct device *dev = &adapter->pdev->dev;
317 	u8 msg_severity = DEFAULT_MSG_SEVERITY;
318 	u8 phy_state_info;
319 	u8 new_phy_state;
320 
321 	new_phy_state =
322 		(sfp_misconfig_evt_word1 >> (adapter->hba_port_num * 8)) & 0xff;
323 
324 	if (new_phy_state == adapter->phy_state)
325 		return;
326 
327 	adapter->phy_state = new_phy_state;
328 
329 	/* for older fw that doesn't populate link effect data */
330 	if (!sfp_misconfig_evt_word2)
331 		goto log_message;
332 
333 	phy_state_info =
334 		(sfp_misconfig_evt_word2 >> (adapter->hba_port_num * 8)) & 0xff;
335 
336 	if (phy_state_info & PHY_STATE_INFO_VALID) {
337 		msg_severity = (phy_state_info & PHY_STATE_MSG_SEVERITY) >> 1;
338 
339 		if (be_phy_unqualified(new_phy_state))
340 			phy_oper_state = (phy_state_info & PHY_STATE_OPER);
341 	}
342 
343 log_message:
344 	/* Log an error message that would allow a user to determine
345 	 * whether the SFPs have an issue
346 	 */
347 	if (be_phy_state_unknown(new_phy_state))
348 		dev_printk(be_port_misconfig_evt_severity[msg_severity], dev,
349 			   "Port %c: Unrecognized Optics state: 0x%x. %s",
350 			   adapter->port_name,
351 			   new_phy_state,
352 			   phy_state_oper_desc[phy_oper_state]);
353 	else
354 		dev_printk(be_port_misconfig_evt_severity[msg_severity], dev,
355 			   "Port %c: %s %s",
356 			   adapter->port_name,
357 			   be_misconfig_evt_port_state[new_phy_state],
358 			   phy_state_oper_desc[phy_oper_state]);
359 
360 	/* Log Vendor name and part no. if a misconfigured SFP is detected */
361 	if (be_phy_misconfigured(new_phy_state))
362 		adapter->flags |= BE_FLAGS_PHY_MISCONFIGURED;
363 }
364 
365 /* Grp5 CoS Priority evt */
be_async_grp5_cos_priority_process(struct be_adapter * adapter,struct be_mcc_compl * compl)366 static void be_async_grp5_cos_priority_process(struct be_adapter *adapter,
367 					       struct be_mcc_compl *compl)
368 {
369 	struct be_async_event_grp5_cos_priority *evt =
370 			(struct be_async_event_grp5_cos_priority *)compl;
371 
372 	if (evt->valid) {
373 		adapter->vlan_prio_bmap = evt->available_priority_bmap;
374 		adapter->recommended_prio_bits =
375 			evt->reco_default_priority << VLAN_PRIO_SHIFT;
376 	}
377 }
378 
379 /* Grp5 QOS Speed evt: qos_link_speed is in units of 10 Mbps */
be_async_grp5_qos_speed_process(struct be_adapter * adapter,struct be_mcc_compl * compl)380 static void be_async_grp5_qos_speed_process(struct be_adapter *adapter,
381 					    struct be_mcc_compl *compl)
382 {
383 	struct be_async_event_grp5_qos_link_speed *evt =
384 			(struct be_async_event_grp5_qos_link_speed *)compl;
385 
386 	if (adapter->phy.link_speed >= 0 &&
387 	    evt->physical_port == adapter->port_num)
388 		adapter->phy.link_speed = le16_to_cpu(evt->qos_link_speed) * 10;
389 }
390 
391 /*Grp5 PVID evt*/
be_async_grp5_pvid_state_process(struct be_adapter * adapter,struct be_mcc_compl * compl)392 static void be_async_grp5_pvid_state_process(struct be_adapter *adapter,
393 					     struct be_mcc_compl *compl)
394 {
395 	struct be_async_event_grp5_pvid_state *evt =
396 			(struct be_async_event_grp5_pvid_state *)compl;
397 
398 	if (evt->enabled) {
399 		adapter->pvid = le16_to_cpu(evt->tag) & VLAN_VID_MASK;
400 		dev_info(&adapter->pdev->dev, "LPVID: %d\n", adapter->pvid);
401 	} else {
402 		adapter->pvid = 0;
403 	}
404 }
405 
406 #define MGMT_ENABLE_MASK	0x4
be_async_grp5_fw_control_process(struct be_adapter * adapter,struct be_mcc_compl * compl)407 static void be_async_grp5_fw_control_process(struct be_adapter *adapter,
408 					     struct be_mcc_compl *compl)
409 {
410 	struct be_async_fw_control *evt = (struct be_async_fw_control *)compl;
411 	u32 evt_dw1 = le32_to_cpu(evt->event_data_word1);
412 
413 	if (evt_dw1 & MGMT_ENABLE_MASK) {
414 		adapter->flags |= BE_FLAGS_OS2BMC;
415 		adapter->bmc_filt_mask = le32_to_cpu(evt->event_data_word2);
416 	} else {
417 		adapter->flags &= ~BE_FLAGS_OS2BMC;
418 	}
419 }
420 
be_async_grp5_evt_process(struct be_adapter * adapter,struct be_mcc_compl * compl)421 static void be_async_grp5_evt_process(struct be_adapter *adapter,
422 				      struct be_mcc_compl *compl)
423 {
424 	u8 event_type = (compl->flags >> ASYNC_EVENT_TYPE_SHIFT) &
425 				ASYNC_EVENT_TYPE_MASK;
426 
427 	switch (event_type) {
428 	case ASYNC_EVENT_COS_PRIORITY:
429 		be_async_grp5_cos_priority_process(adapter, compl);
430 		break;
431 	case ASYNC_EVENT_QOS_SPEED:
432 		be_async_grp5_qos_speed_process(adapter, compl);
433 		break;
434 	case ASYNC_EVENT_PVID_STATE:
435 		be_async_grp5_pvid_state_process(adapter, compl);
436 		break;
437 	/* Async event to disable/enable os2bmc and/or mac-learning */
438 	case ASYNC_EVENT_FW_CONTROL:
439 		be_async_grp5_fw_control_process(adapter, compl);
440 		break;
441 	default:
442 		break;
443 	}
444 }
445 
be_async_dbg_evt_process(struct be_adapter * adapter,struct be_mcc_compl * cmp)446 static void be_async_dbg_evt_process(struct be_adapter *adapter,
447 				     struct be_mcc_compl *cmp)
448 {
449 	u8 event_type = 0;
450 	struct be_async_event_qnq *evt = (struct be_async_event_qnq *)cmp;
451 
452 	event_type = (cmp->flags >> ASYNC_EVENT_TYPE_SHIFT) &
453 			ASYNC_EVENT_TYPE_MASK;
454 
455 	switch (event_type) {
456 	case ASYNC_DEBUG_EVENT_TYPE_QNQ:
457 		if (evt->valid)
458 			adapter->qnq_vid = le16_to_cpu(evt->vlan_tag);
459 		adapter->flags |= BE_FLAGS_QNQ_ASYNC_EVT_RCVD;
460 	break;
461 	default:
462 		dev_warn(&adapter->pdev->dev, "Unknown debug event 0x%x!\n",
463 			 event_type);
464 	break;
465 	}
466 }
467 
be_async_sliport_evt_process(struct be_adapter * adapter,struct be_mcc_compl * cmp)468 static void be_async_sliport_evt_process(struct be_adapter *adapter,
469 					 struct be_mcc_compl *cmp)
470 {
471 	u8 event_type = (cmp->flags >> ASYNC_EVENT_TYPE_SHIFT) &
472 			ASYNC_EVENT_TYPE_MASK;
473 
474 	if (event_type == ASYNC_EVENT_PORT_MISCONFIG)
475 		be_async_port_misconfig_event_process(adapter, cmp);
476 }
477 
is_link_state_evt(u32 flags)478 static inline bool is_link_state_evt(u32 flags)
479 {
480 	return ((flags >> ASYNC_EVENT_CODE_SHIFT) & ASYNC_EVENT_CODE_MASK) ==
481 			ASYNC_EVENT_CODE_LINK_STATE;
482 }
483 
is_grp5_evt(u32 flags)484 static inline bool is_grp5_evt(u32 flags)
485 {
486 	return ((flags >> ASYNC_EVENT_CODE_SHIFT) & ASYNC_EVENT_CODE_MASK) ==
487 			ASYNC_EVENT_CODE_GRP_5;
488 }
489 
is_dbg_evt(u32 flags)490 static inline bool is_dbg_evt(u32 flags)
491 {
492 	return ((flags >> ASYNC_EVENT_CODE_SHIFT) & ASYNC_EVENT_CODE_MASK) ==
493 			ASYNC_EVENT_CODE_QNQ;
494 }
495 
is_sliport_evt(u32 flags)496 static inline bool is_sliport_evt(u32 flags)
497 {
498 	return ((flags >> ASYNC_EVENT_CODE_SHIFT) & ASYNC_EVENT_CODE_MASK) ==
499 		ASYNC_EVENT_CODE_SLIPORT;
500 }
501 
be_mcc_event_process(struct be_adapter * adapter,struct be_mcc_compl * compl)502 static void be_mcc_event_process(struct be_adapter *adapter,
503 				 struct be_mcc_compl *compl)
504 {
505 	if (is_link_state_evt(compl->flags))
506 		be_async_link_state_process(adapter, compl);
507 	else if (is_grp5_evt(compl->flags))
508 		be_async_grp5_evt_process(adapter, compl);
509 	else if (is_dbg_evt(compl->flags))
510 		be_async_dbg_evt_process(adapter, compl);
511 	else if (is_sliport_evt(compl->flags))
512 		be_async_sliport_evt_process(adapter, compl);
513 }
514 
be_mcc_compl_get(struct be_adapter * adapter)515 static struct be_mcc_compl *be_mcc_compl_get(struct be_adapter *adapter)
516 {
517 	struct be_queue_info *mcc_cq = &adapter->mcc_obj.cq;
518 	struct be_mcc_compl *compl = queue_tail_node(mcc_cq);
519 
520 	if (be_mcc_compl_is_new(compl)) {
521 		queue_tail_inc(mcc_cq);
522 		return compl;
523 	}
524 	return NULL;
525 }
526 
be_async_mcc_enable(struct be_adapter * adapter)527 void be_async_mcc_enable(struct be_adapter *adapter)
528 {
529 	spin_lock_bh(&adapter->mcc_cq_lock);
530 
531 	be_cq_notify(adapter, adapter->mcc_obj.cq.id, true, 0);
532 	adapter->mcc_obj.rearm_cq = true;
533 
534 	spin_unlock_bh(&adapter->mcc_cq_lock);
535 }
536 
be_async_mcc_disable(struct be_adapter * adapter)537 void be_async_mcc_disable(struct be_adapter *adapter)
538 {
539 	spin_lock_bh(&adapter->mcc_cq_lock);
540 
541 	adapter->mcc_obj.rearm_cq = false;
542 	be_cq_notify(adapter, adapter->mcc_obj.cq.id, false, 0);
543 
544 	spin_unlock_bh(&adapter->mcc_cq_lock);
545 }
546 
be_process_mcc(struct be_adapter * adapter)547 int be_process_mcc(struct be_adapter *adapter)
548 {
549 	struct be_mcc_compl *compl;
550 	int num = 0, status = 0;
551 	struct be_mcc_obj *mcc_obj = &adapter->mcc_obj;
552 
553 	spin_lock(&adapter->mcc_cq_lock);
554 
555 	while ((compl = be_mcc_compl_get(adapter))) {
556 		if (compl->flags & CQE_FLAGS_ASYNC_MASK) {
557 			be_mcc_event_process(adapter, compl);
558 		} else if (compl->flags & CQE_FLAGS_COMPLETED_MASK) {
559 			status = be_mcc_compl_process(adapter, compl);
560 			atomic_dec(&mcc_obj->q.used);
561 		}
562 		be_mcc_compl_use(compl);
563 		num++;
564 	}
565 
566 	if (num)
567 		be_cq_notify(adapter, mcc_obj->cq.id, mcc_obj->rearm_cq, num);
568 
569 	spin_unlock(&adapter->mcc_cq_lock);
570 	return status;
571 }
572 
573 /* Wait till no more pending mcc requests are present */
be_mcc_wait_compl(struct be_adapter * adapter)574 static int be_mcc_wait_compl(struct be_adapter *adapter)
575 {
576 #define mcc_timeout		12000 /* 12s timeout */
577 	int i, status = 0;
578 	struct be_mcc_obj *mcc_obj = &adapter->mcc_obj;
579 
580 	for (i = 0; i < mcc_timeout; i++) {
581 		if (be_check_error(adapter, BE_ERROR_ANY))
582 			return -EIO;
583 
584 		local_bh_disable();
585 		status = be_process_mcc(adapter);
586 		local_bh_enable();
587 
588 		if (atomic_read(&mcc_obj->q.used) == 0)
589 			break;
590 		usleep_range(500, 1000);
591 	}
592 	if (i == mcc_timeout) {
593 		dev_err(&adapter->pdev->dev, "FW not responding\n");
594 		be_set_error(adapter, BE_ERROR_FW);
595 		return -EIO;
596 	}
597 	return status;
598 }
599 
600 /* Notify MCC requests and wait for completion */
be_mcc_notify_wait(struct be_adapter * adapter)601 static int be_mcc_notify_wait(struct be_adapter *adapter)
602 {
603 	int status;
604 	struct be_mcc_wrb *wrb;
605 	struct be_mcc_obj *mcc_obj = &adapter->mcc_obj;
606 	u32 index = mcc_obj->q.head;
607 	struct be_cmd_resp_hdr *resp;
608 
609 	index_dec(&index, mcc_obj->q.len);
610 	wrb = queue_index_node(&mcc_obj->q, index);
611 
612 	resp = be_decode_resp_hdr(wrb->tag0, wrb->tag1);
613 
614 	status = be_mcc_notify(adapter);
615 	if (status)
616 		goto out;
617 
618 	status = be_mcc_wait_compl(adapter);
619 	if (status == -EIO)
620 		goto out;
621 
622 	status = (resp->base_status |
623 		  ((resp->addl_status & CQE_ADDL_STATUS_MASK) <<
624 		   CQE_ADDL_STATUS_SHIFT));
625 out:
626 	return status;
627 }
628 
be_mbox_db_ready_wait(struct be_adapter * adapter,void __iomem * db)629 static int be_mbox_db_ready_wait(struct be_adapter *adapter, void __iomem *db)
630 {
631 	int msecs = 0;
632 	u32 ready;
633 
634 	do {
635 		if (be_check_error(adapter, BE_ERROR_ANY))
636 			return -EIO;
637 
638 		ready = ioread32(db);
639 		if (ready == 0xffffffff)
640 			return -1;
641 
642 		ready &= MPU_MAILBOX_DB_RDY_MASK;
643 		if (ready)
644 			break;
645 
646 		if (msecs > 4000) {
647 			dev_err(&adapter->pdev->dev, "FW not responding\n");
648 			be_set_error(adapter, BE_ERROR_FW);
649 			be_detect_error(adapter);
650 			return -1;
651 		}
652 
653 		msleep(1);
654 		msecs++;
655 	} while (true);
656 
657 	return 0;
658 }
659 
660 /*
661  * Insert the mailbox address into the doorbell in two steps
662  * Polls on the mbox doorbell till a command completion (or a timeout) occurs
663  */
be_mbox_notify_wait(struct be_adapter * adapter)664 static int be_mbox_notify_wait(struct be_adapter *adapter)
665 {
666 	int status;
667 	u32 val = 0;
668 	void __iomem *db = adapter->db + MPU_MAILBOX_DB_OFFSET;
669 	struct be_dma_mem *mbox_mem = &adapter->mbox_mem;
670 	struct be_mcc_mailbox *mbox = mbox_mem->va;
671 	struct be_mcc_compl *compl = &mbox->compl;
672 
673 	/* wait for ready to be set */
674 	status = be_mbox_db_ready_wait(adapter, db);
675 	if (status != 0)
676 		return status;
677 
678 	val |= MPU_MAILBOX_DB_HI_MASK;
679 	/* at bits 2 - 31 place mbox dma addr msb bits 34 - 63 */
680 	val |= (upper_32_bits(mbox_mem->dma) >> 2) << 2;
681 	iowrite32(val, db);
682 
683 	/* wait for ready to be set */
684 	status = be_mbox_db_ready_wait(adapter, db);
685 	if (status != 0)
686 		return status;
687 
688 	val = 0;
689 	/* at bits 2 - 31 place mbox dma addr lsb bits 4 - 33 */
690 	val |= (u32)(mbox_mem->dma >> 4) << 2;
691 	iowrite32(val, db);
692 
693 	status = be_mbox_db_ready_wait(adapter, db);
694 	if (status != 0)
695 		return status;
696 
697 	/* A cq entry has been made now */
698 	if (be_mcc_compl_is_new(compl)) {
699 		status = be_mcc_compl_process(adapter, &mbox->compl);
700 		be_mcc_compl_use(compl);
701 		if (status)
702 			return status;
703 	} else {
704 		dev_err(&adapter->pdev->dev, "invalid mailbox completion\n");
705 		return -1;
706 	}
707 	return 0;
708 }
709 
be_POST_stage_get(struct be_adapter * adapter)710 u16 be_POST_stage_get(struct be_adapter *adapter)
711 {
712 	u32 sem;
713 
714 	if (BEx_chip(adapter))
715 		sem  = ioread32(adapter->csr + SLIPORT_SEMAPHORE_OFFSET_BEx);
716 	else
717 		pci_read_config_dword(adapter->pdev,
718 				      SLIPORT_SEMAPHORE_OFFSET_SH, &sem);
719 
720 	return sem & POST_STAGE_MASK;
721 }
722 
lancer_wait_ready(struct be_adapter * adapter)723 static int lancer_wait_ready(struct be_adapter *adapter)
724 {
725 #define SLIPORT_READY_TIMEOUT 30
726 	u32 sliport_status;
727 	int i;
728 
729 	for (i = 0; i < SLIPORT_READY_TIMEOUT; i++) {
730 		sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET);
731 		if (sliport_status & SLIPORT_STATUS_RDY_MASK)
732 			return 0;
733 
734 		if (sliport_status & SLIPORT_STATUS_ERR_MASK &&
735 		    !(sliport_status & SLIPORT_STATUS_RN_MASK))
736 			return -EIO;
737 
738 		msleep(1000);
739 	}
740 
741 	return sliport_status ? : -1;
742 }
743 
be_fw_wait_ready(struct be_adapter * adapter)744 int be_fw_wait_ready(struct be_adapter *adapter)
745 {
746 	u16 stage;
747 	int status, timeout = 0;
748 	struct device *dev = &adapter->pdev->dev;
749 
750 	if (lancer_chip(adapter)) {
751 		status = lancer_wait_ready(adapter);
752 		if (status) {
753 			stage = status;
754 			goto err;
755 		}
756 		return 0;
757 	}
758 
759 	do {
760 		/* There's no means to poll POST state on BE2/3 VFs */
761 		if (BEx_chip(adapter) && be_virtfn(adapter))
762 			return 0;
763 
764 		stage = be_POST_stage_get(adapter);
765 		if (stage == POST_STAGE_ARMFW_RDY)
766 			return 0;
767 
768 		dev_info(dev, "Waiting for POST, %ds elapsed\n", timeout);
769 		if (msleep_interruptible(2000)) {
770 			dev_err(dev, "Waiting for POST aborted\n");
771 			return -EINTR;
772 		}
773 		timeout += 2;
774 	} while (timeout < 60);
775 
776 err:
777 	dev_err(dev, "POST timeout; stage=%#x\n", stage);
778 	return -ETIMEDOUT;
779 }
780 
nonembedded_sgl(struct be_mcc_wrb * wrb)781 static inline struct be_sge *nonembedded_sgl(struct be_mcc_wrb *wrb)
782 {
783 	return &wrb->payload.sgl[0];
784 }
785 
fill_wrb_tags(struct be_mcc_wrb * wrb,unsigned long addr)786 static inline void fill_wrb_tags(struct be_mcc_wrb *wrb, unsigned long addr)
787 {
788 	wrb->tag0 = addr & 0xFFFFFFFF;
789 	wrb->tag1 = upper_32_bits(addr);
790 }
791 
792 /* Don't touch the hdr after it's prepared */
793 /* mem will be NULL for embedded commands */
be_wrb_cmd_hdr_prepare(struct be_cmd_req_hdr * req_hdr,u8 subsystem,u8 opcode,int cmd_len,struct be_mcc_wrb * wrb,struct be_dma_mem * mem)794 static void be_wrb_cmd_hdr_prepare(struct be_cmd_req_hdr *req_hdr,
795 				   u8 subsystem, u8 opcode, int cmd_len,
796 				   struct be_mcc_wrb *wrb,
797 				   struct be_dma_mem *mem)
798 {
799 	struct be_sge *sge;
800 
801 	req_hdr->opcode = opcode;
802 	req_hdr->subsystem = subsystem;
803 	req_hdr->request_length = cpu_to_le32(cmd_len - sizeof(*req_hdr));
804 	req_hdr->version = 0;
805 	fill_wrb_tags(wrb, (ulong) req_hdr);
806 	wrb->payload_length = cmd_len;
807 	if (mem) {
808 		wrb->embedded |= (1 & MCC_WRB_SGE_CNT_MASK) <<
809 			MCC_WRB_SGE_CNT_SHIFT;
810 		sge = nonembedded_sgl(wrb);
811 		sge->pa_hi = cpu_to_le32(upper_32_bits(mem->dma));
812 		sge->pa_lo = cpu_to_le32(mem->dma & 0xFFFFFFFF);
813 		sge->len = cpu_to_le32(mem->size);
814 	} else
815 		wrb->embedded |= MCC_WRB_EMBEDDED_MASK;
816 	be_dws_cpu_to_le(wrb, 8);
817 }
818 
be_cmd_page_addrs_prepare(struct phys_addr * pages,u32 max_pages,struct be_dma_mem * mem)819 static void be_cmd_page_addrs_prepare(struct phys_addr *pages, u32 max_pages,
820 				      struct be_dma_mem *mem)
821 {
822 	int i, buf_pages = min(PAGES_4K_SPANNED(mem->va, mem->size), max_pages);
823 	u64 dma = (u64)mem->dma;
824 
825 	for (i = 0; i < buf_pages; i++) {
826 		pages[i].lo = cpu_to_le32(dma & 0xFFFFFFFF);
827 		pages[i].hi = cpu_to_le32(upper_32_bits(dma));
828 		dma += PAGE_SIZE_4K;
829 	}
830 }
831 
wrb_from_mbox(struct be_adapter * adapter)832 static inline struct be_mcc_wrb *wrb_from_mbox(struct be_adapter *adapter)
833 {
834 	struct be_dma_mem *mbox_mem = &adapter->mbox_mem;
835 	struct be_mcc_wrb *wrb
836 		= &((struct be_mcc_mailbox *)(mbox_mem->va))->wrb;
837 	memset(wrb, 0, sizeof(*wrb));
838 	return wrb;
839 }
840 
wrb_from_mccq(struct be_adapter * adapter)841 static struct be_mcc_wrb *wrb_from_mccq(struct be_adapter *adapter)
842 {
843 	struct be_queue_info *mccq = &adapter->mcc_obj.q;
844 	struct be_mcc_wrb *wrb;
845 
846 	if (!mccq->created)
847 		return NULL;
848 
849 	if (atomic_read(&mccq->used) >= mccq->len)
850 		return NULL;
851 
852 	wrb = queue_head_node(mccq);
853 	queue_head_inc(mccq);
854 	atomic_inc(&mccq->used);
855 	memset(wrb, 0, sizeof(*wrb));
856 	return wrb;
857 }
858 
use_mcc(struct be_adapter * adapter)859 static bool use_mcc(struct be_adapter *adapter)
860 {
861 	return adapter->mcc_obj.q.created;
862 }
863 
864 /* Must be used only in process context */
be_cmd_lock(struct be_adapter * adapter)865 static int be_cmd_lock(struct be_adapter *adapter)
866 {
867 	if (use_mcc(adapter)) {
868 		mutex_lock(&adapter->mcc_lock);
869 		return 0;
870 	} else {
871 		return mutex_lock_interruptible(&adapter->mbox_lock);
872 	}
873 }
874 
875 /* Must be used only in process context */
be_cmd_unlock(struct be_adapter * adapter)876 static void be_cmd_unlock(struct be_adapter *adapter)
877 {
878 	if (use_mcc(adapter))
879 		return mutex_unlock(&adapter->mcc_lock);
880 	else
881 		return mutex_unlock(&adapter->mbox_lock);
882 }
883 
be_cmd_copy(struct be_adapter * adapter,struct be_mcc_wrb * wrb)884 static struct be_mcc_wrb *be_cmd_copy(struct be_adapter *adapter,
885 				      struct be_mcc_wrb *wrb)
886 {
887 	struct be_mcc_wrb *dest_wrb;
888 
889 	if (use_mcc(adapter)) {
890 		dest_wrb = wrb_from_mccq(adapter);
891 		if (!dest_wrb)
892 			return NULL;
893 	} else {
894 		dest_wrb = wrb_from_mbox(adapter);
895 	}
896 
897 	memcpy(dest_wrb, wrb, sizeof(*wrb));
898 	if (wrb->embedded & cpu_to_le32(MCC_WRB_EMBEDDED_MASK))
899 		fill_wrb_tags(dest_wrb, (ulong) embedded_payload(wrb));
900 
901 	return dest_wrb;
902 }
903 
904 /* Must be used only in process context */
be_cmd_notify_wait(struct be_adapter * adapter,struct be_mcc_wrb * wrb)905 static int be_cmd_notify_wait(struct be_adapter *adapter,
906 			      struct be_mcc_wrb *wrb)
907 {
908 	struct be_mcc_wrb *dest_wrb;
909 	int status;
910 
911 	status = be_cmd_lock(adapter);
912 	if (status)
913 		return status;
914 
915 	dest_wrb = be_cmd_copy(adapter, wrb);
916 	if (!dest_wrb) {
917 		status = -EBUSY;
918 		goto unlock;
919 	}
920 
921 	if (use_mcc(adapter))
922 		status = be_mcc_notify_wait(adapter);
923 	else
924 		status = be_mbox_notify_wait(adapter);
925 
926 	if (!status)
927 		memcpy(wrb, dest_wrb, sizeof(*wrb));
928 
929 unlock:
930 	be_cmd_unlock(adapter);
931 	return status;
932 }
933 
934 /* Tell fw we're about to start firing cmds by writing a
935  * special pattern across the wrb hdr; uses mbox
936  */
be_cmd_fw_init(struct be_adapter * adapter)937 int be_cmd_fw_init(struct be_adapter *adapter)
938 {
939 	u8 *wrb;
940 	int status;
941 
942 	if (lancer_chip(adapter))
943 		return 0;
944 
945 	if (mutex_lock_interruptible(&adapter->mbox_lock))
946 		return -1;
947 
948 	wrb = (u8 *)wrb_from_mbox(adapter);
949 	*wrb++ = 0xFF;
950 	*wrb++ = 0x12;
951 	*wrb++ = 0x34;
952 	*wrb++ = 0xFF;
953 	*wrb++ = 0xFF;
954 	*wrb++ = 0x56;
955 	*wrb++ = 0x78;
956 	*wrb = 0xFF;
957 
958 	status = be_mbox_notify_wait(adapter);
959 
960 	mutex_unlock(&adapter->mbox_lock);
961 	return status;
962 }
963 
964 /* Tell fw we're done with firing cmds by writing a
965  * special pattern across the wrb hdr; uses mbox
966  */
be_cmd_fw_clean(struct be_adapter * adapter)967 int be_cmd_fw_clean(struct be_adapter *adapter)
968 {
969 	u8 *wrb;
970 	int status;
971 
972 	if (lancer_chip(adapter))
973 		return 0;
974 
975 	if (mutex_lock_interruptible(&adapter->mbox_lock))
976 		return -1;
977 
978 	wrb = (u8 *)wrb_from_mbox(adapter);
979 	*wrb++ = 0xFF;
980 	*wrb++ = 0xAA;
981 	*wrb++ = 0xBB;
982 	*wrb++ = 0xFF;
983 	*wrb++ = 0xFF;
984 	*wrb++ = 0xCC;
985 	*wrb++ = 0xDD;
986 	*wrb = 0xFF;
987 
988 	status = be_mbox_notify_wait(adapter);
989 
990 	mutex_unlock(&adapter->mbox_lock);
991 	return status;
992 }
993 
be_cmd_eq_create(struct be_adapter * adapter,struct be_eq_obj * eqo)994 int be_cmd_eq_create(struct be_adapter *adapter, struct be_eq_obj *eqo)
995 {
996 	struct be_mcc_wrb *wrb;
997 	struct be_cmd_req_eq_create *req;
998 	struct be_dma_mem *q_mem = &eqo->q.dma_mem;
999 	int status, ver = 0;
1000 
1001 	if (mutex_lock_interruptible(&adapter->mbox_lock))
1002 		return -1;
1003 
1004 	wrb = wrb_from_mbox(adapter);
1005 	req = embedded_payload(wrb);
1006 
1007 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1008 			       OPCODE_COMMON_EQ_CREATE, sizeof(*req), wrb,
1009 			       NULL);
1010 
1011 	/* Support for EQ_CREATEv2 available only SH-R onwards */
1012 	if (!(BEx_chip(adapter) || lancer_chip(adapter)))
1013 		ver = 2;
1014 
1015 	req->hdr.version = ver;
1016 	req->num_pages =  cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
1017 
1018 	AMAP_SET_BITS(struct amap_eq_context, valid, req->context, 1);
1019 	/* 4byte eqe*/
1020 	AMAP_SET_BITS(struct amap_eq_context, size, req->context, 0);
1021 	AMAP_SET_BITS(struct amap_eq_context, count, req->context,
1022 		      __ilog2_u32(eqo->q.len / 256));
1023 	be_dws_cpu_to_le(req->context, sizeof(req->context));
1024 
1025 	be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
1026 
1027 	status = be_mbox_notify_wait(adapter);
1028 	if (!status) {
1029 		struct be_cmd_resp_eq_create *resp = embedded_payload(wrb);
1030 
1031 		eqo->q.id = le16_to_cpu(resp->eq_id);
1032 		eqo->msix_idx =
1033 			(ver == 2) ? le16_to_cpu(resp->msix_idx) : eqo->idx;
1034 		eqo->q.created = true;
1035 	}
1036 
1037 	mutex_unlock(&adapter->mbox_lock);
1038 	return status;
1039 }
1040 
1041 /* Use MCC */
be_cmd_mac_addr_query(struct be_adapter * adapter,u8 * mac_addr,bool permanent,u32 if_handle,u32 pmac_id)1042 int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr,
1043 			  bool permanent, u32 if_handle, u32 pmac_id)
1044 {
1045 	struct be_mcc_wrb *wrb;
1046 	struct be_cmd_req_mac_query *req;
1047 	int status;
1048 
1049 	mutex_lock(&adapter->mcc_lock);
1050 
1051 	wrb = wrb_from_mccq(adapter);
1052 	if (!wrb) {
1053 		status = -EBUSY;
1054 		goto err;
1055 	}
1056 	req = embedded_payload(wrb);
1057 
1058 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1059 			       OPCODE_COMMON_NTWK_MAC_QUERY, sizeof(*req), wrb,
1060 			       NULL);
1061 	req->type = MAC_ADDRESS_TYPE_NETWORK;
1062 	if (permanent) {
1063 		req->permanent = 1;
1064 	} else {
1065 		req->if_id = cpu_to_le16((u16)if_handle);
1066 		req->pmac_id = cpu_to_le32(pmac_id);
1067 		req->permanent = 0;
1068 	}
1069 
1070 	status = be_mcc_notify_wait(adapter);
1071 	if (!status) {
1072 		struct be_cmd_resp_mac_query *resp = embedded_payload(wrb);
1073 
1074 		memcpy(mac_addr, resp->mac.addr, ETH_ALEN);
1075 	}
1076 
1077 err:
1078 	mutex_unlock(&adapter->mcc_lock);
1079 	return status;
1080 }
1081 
1082 /* Uses synchronous MCCQ */
be_cmd_pmac_add(struct be_adapter * adapter,const u8 * mac_addr,u32 if_id,u32 * pmac_id,u32 domain)1083 int be_cmd_pmac_add(struct be_adapter *adapter, const u8 *mac_addr,
1084 		    u32 if_id, u32 *pmac_id, u32 domain)
1085 {
1086 	struct be_mcc_wrb *wrb;
1087 	struct be_cmd_req_pmac_add *req;
1088 	int status;
1089 
1090 	mutex_lock(&adapter->mcc_lock);
1091 
1092 	wrb = wrb_from_mccq(adapter);
1093 	if (!wrb) {
1094 		status = -EBUSY;
1095 		goto err;
1096 	}
1097 	req = embedded_payload(wrb);
1098 
1099 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1100 			       OPCODE_COMMON_NTWK_PMAC_ADD, sizeof(*req), wrb,
1101 			       NULL);
1102 
1103 	req->hdr.domain = domain;
1104 	req->if_id = cpu_to_le32(if_id);
1105 	memcpy(req->mac_address, mac_addr, ETH_ALEN);
1106 
1107 	status = be_mcc_notify_wait(adapter);
1108 	if (!status) {
1109 		struct be_cmd_resp_pmac_add *resp = embedded_payload(wrb);
1110 
1111 		*pmac_id = le32_to_cpu(resp->pmac_id);
1112 	}
1113 
1114 err:
1115 	mutex_unlock(&adapter->mcc_lock);
1116 
1117 	 if (base_status(status) == MCC_STATUS_UNAUTHORIZED_REQUEST)
1118 		status = -EPERM;
1119 
1120 	return status;
1121 }
1122 
1123 /* Uses synchronous MCCQ */
be_cmd_pmac_del(struct be_adapter * adapter,u32 if_id,int pmac_id,u32 dom)1124 int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, int pmac_id, u32 dom)
1125 {
1126 	struct be_mcc_wrb *wrb;
1127 	struct be_cmd_req_pmac_del *req;
1128 	int status;
1129 
1130 	if (pmac_id == -1)
1131 		return 0;
1132 
1133 	mutex_lock(&adapter->mcc_lock);
1134 
1135 	wrb = wrb_from_mccq(adapter);
1136 	if (!wrb) {
1137 		status = -EBUSY;
1138 		goto err;
1139 	}
1140 	req = embedded_payload(wrb);
1141 
1142 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1143 			       OPCODE_COMMON_NTWK_PMAC_DEL, sizeof(*req),
1144 			       wrb, NULL);
1145 
1146 	req->hdr.domain = dom;
1147 	req->if_id = cpu_to_le32(if_id);
1148 	req->pmac_id = cpu_to_le32(pmac_id);
1149 
1150 	status = be_mcc_notify_wait(adapter);
1151 
1152 err:
1153 	mutex_unlock(&adapter->mcc_lock);
1154 	return status;
1155 }
1156 
1157 /* Uses Mbox */
be_cmd_cq_create(struct be_adapter * adapter,struct be_queue_info * cq,struct be_queue_info * eq,bool no_delay,int coalesce_wm)1158 int be_cmd_cq_create(struct be_adapter *adapter, struct be_queue_info *cq,
1159 		     struct be_queue_info *eq, bool no_delay, int coalesce_wm)
1160 {
1161 	struct be_mcc_wrb *wrb;
1162 	struct be_cmd_req_cq_create *req;
1163 	struct be_dma_mem *q_mem = &cq->dma_mem;
1164 	void *ctxt;
1165 	int status;
1166 
1167 	if (mutex_lock_interruptible(&adapter->mbox_lock))
1168 		return -1;
1169 
1170 	wrb = wrb_from_mbox(adapter);
1171 	req = embedded_payload(wrb);
1172 	ctxt = &req->context;
1173 
1174 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1175 			       OPCODE_COMMON_CQ_CREATE, sizeof(*req), wrb,
1176 			       NULL);
1177 
1178 	req->num_pages =  cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
1179 
1180 	if (BEx_chip(adapter)) {
1181 		AMAP_SET_BITS(struct amap_cq_context_be, coalescwm, ctxt,
1182 			      coalesce_wm);
1183 		AMAP_SET_BITS(struct amap_cq_context_be, nodelay,
1184 			      ctxt, no_delay);
1185 		AMAP_SET_BITS(struct amap_cq_context_be, count, ctxt,
1186 			      __ilog2_u32(cq->len / 256));
1187 		AMAP_SET_BITS(struct amap_cq_context_be, valid, ctxt, 1);
1188 		AMAP_SET_BITS(struct amap_cq_context_be, eventable, ctxt, 1);
1189 		AMAP_SET_BITS(struct amap_cq_context_be, eqid, ctxt, eq->id);
1190 	} else {
1191 		req->hdr.version = 2;
1192 		req->page_size = 1; /* 1 for 4K */
1193 
1194 		/* coalesce-wm field in this cmd is not relevant to Lancer.
1195 		 * Lancer uses COMMON_MODIFY_CQ to set this field
1196 		 */
1197 		if (!lancer_chip(adapter))
1198 			AMAP_SET_BITS(struct amap_cq_context_v2, coalescwm,
1199 				      ctxt, coalesce_wm);
1200 		AMAP_SET_BITS(struct amap_cq_context_v2, nodelay, ctxt,
1201 			      no_delay);
1202 		AMAP_SET_BITS(struct amap_cq_context_v2, count, ctxt,
1203 			      __ilog2_u32(cq->len / 256));
1204 		AMAP_SET_BITS(struct amap_cq_context_v2, valid, ctxt, 1);
1205 		AMAP_SET_BITS(struct amap_cq_context_v2, eventable, ctxt, 1);
1206 		AMAP_SET_BITS(struct amap_cq_context_v2, eqid, ctxt, eq->id);
1207 	}
1208 
1209 	be_dws_cpu_to_le(ctxt, sizeof(req->context));
1210 
1211 	be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
1212 
1213 	status = be_mbox_notify_wait(adapter);
1214 	if (!status) {
1215 		struct be_cmd_resp_cq_create *resp = embedded_payload(wrb);
1216 
1217 		cq->id = le16_to_cpu(resp->cq_id);
1218 		cq->created = true;
1219 	}
1220 
1221 	mutex_unlock(&adapter->mbox_lock);
1222 
1223 	return status;
1224 }
1225 
be_encoded_q_len(int q_len)1226 static u32 be_encoded_q_len(int q_len)
1227 {
1228 	u32 len_encoded = fls(q_len); /* log2(len) + 1 */
1229 
1230 	if (len_encoded == 16)
1231 		len_encoded = 0;
1232 	return len_encoded;
1233 }
1234 
be_cmd_mccq_ext_create(struct be_adapter * adapter,struct be_queue_info * mccq,struct be_queue_info * cq)1235 static int be_cmd_mccq_ext_create(struct be_adapter *adapter,
1236 				  struct be_queue_info *mccq,
1237 				  struct be_queue_info *cq)
1238 {
1239 	struct be_mcc_wrb *wrb;
1240 	struct be_cmd_req_mcc_ext_create *req;
1241 	struct be_dma_mem *q_mem = &mccq->dma_mem;
1242 	void *ctxt;
1243 	int status;
1244 
1245 	if (mutex_lock_interruptible(&adapter->mbox_lock))
1246 		return -1;
1247 
1248 	wrb = wrb_from_mbox(adapter);
1249 	req = embedded_payload(wrb);
1250 	ctxt = &req->context;
1251 
1252 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1253 			       OPCODE_COMMON_MCC_CREATE_EXT, sizeof(*req), wrb,
1254 			       NULL);
1255 
1256 	req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
1257 	if (BEx_chip(adapter)) {
1258 		AMAP_SET_BITS(struct amap_mcc_context_be, valid, ctxt, 1);
1259 		AMAP_SET_BITS(struct amap_mcc_context_be, ring_size, ctxt,
1260 			      be_encoded_q_len(mccq->len));
1261 		AMAP_SET_BITS(struct amap_mcc_context_be, cq_id, ctxt, cq->id);
1262 	} else {
1263 		req->hdr.version = 1;
1264 		req->cq_id = cpu_to_le16(cq->id);
1265 
1266 		AMAP_SET_BITS(struct amap_mcc_context_v1, ring_size, ctxt,
1267 			      be_encoded_q_len(mccq->len));
1268 		AMAP_SET_BITS(struct amap_mcc_context_v1, valid, ctxt, 1);
1269 		AMAP_SET_BITS(struct amap_mcc_context_v1, async_cq_id,
1270 			      ctxt, cq->id);
1271 		AMAP_SET_BITS(struct amap_mcc_context_v1, async_cq_valid,
1272 			      ctxt, 1);
1273 	}
1274 
1275 	/* Subscribe to Link State, Sliport Event and Group 5 Events
1276 	 * (bits 1, 5 and 17 set)
1277 	 */
1278 	req->async_event_bitmap[0] =
1279 			cpu_to_le32(BIT(ASYNC_EVENT_CODE_LINK_STATE) |
1280 				    BIT(ASYNC_EVENT_CODE_GRP_5) |
1281 				    BIT(ASYNC_EVENT_CODE_QNQ) |
1282 				    BIT(ASYNC_EVENT_CODE_SLIPORT));
1283 
1284 	be_dws_cpu_to_le(ctxt, sizeof(req->context));
1285 
1286 	be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
1287 
1288 	status = be_mbox_notify_wait(adapter);
1289 	if (!status) {
1290 		struct be_cmd_resp_mcc_create *resp = embedded_payload(wrb);
1291 
1292 		mccq->id = le16_to_cpu(resp->id);
1293 		mccq->created = true;
1294 	}
1295 	mutex_unlock(&adapter->mbox_lock);
1296 
1297 	return status;
1298 }
1299 
be_cmd_mccq_org_create(struct be_adapter * adapter,struct be_queue_info * mccq,struct be_queue_info * cq)1300 static int be_cmd_mccq_org_create(struct be_adapter *adapter,
1301 				  struct be_queue_info *mccq,
1302 				  struct be_queue_info *cq)
1303 {
1304 	struct be_mcc_wrb *wrb;
1305 	struct be_cmd_req_mcc_create *req;
1306 	struct be_dma_mem *q_mem = &mccq->dma_mem;
1307 	void *ctxt;
1308 	int status;
1309 
1310 	if (mutex_lock_interruptible(&adapter->mbox_lock))
1311 		return -1;
1312 
1313 	wrb = wrb_from_mbox(adapter);
1314 	req = embedded_payload(wrb);
1315 	ctxt = &req->context;
1316 
1317 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1318 			       OPCODE_COMMON_MCC_CREATE, sizeof(*req), wrb,
1319 			       NULL);
1320 
1321 	req->num_pages = cpu_to_le16(PAGES_4K_SPANNED(q_mem->va, q_mem->size));
1322 
1323 	AMAP_SET_BITS(struct amap_mcc_context_be, valid, ctxt, 1);
1324 	AMAP_SET_BITS(struct amap_mcc_context_be, ring_size, ctxt,
1325 		      be_encoded_q_len(mccq->len));
1326 	AMAP_SET_BITS(struct amap_mcc_context_be, cq_id, ctxt, cq->id);
1327 
1328 	be_dws_cpu_to_le(ctxt, sizeof(req->context));
1329 
1330 	be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
1331 
1332 	status = be_mbox_notify_wait(adapter);
1333 	if (!status) {
1334 		struct be_cmd_resp_mcc_create *resp = embedded_payload(wrb);
1335 
1336 		mccq->id = le16_to_cpu(resp->id);
1337 		mccq->created = true;
1338 	}
1339 
1340 	mutex_unlock(&adapter->mbox_lock);
1341 	return status;
1342 }
1343 
be_cmd_mccq_create(struct be_adapter * adapter,struct be_queue_info * mccq,struct be_queue_info * cq)1344 int be_cmd_mccq_create(struct be_adapter *adapter,
1345 		       struct be_queue_info *mccq, struct be_queue_info *cq)
1346 {
1347 	int status;
1348 
1349 	status = be_cmd_mccq_ext_create(adapter, mccq, cq);
1350 	if (status && BEx_chip(adapter)) {
1351 		dev_warn(&adapter->pdev->dev, "Upgrade to F/W ver 2.102.235.0 "
1352 			"or newer to avoid conflicting priorities between NIC "
1353 			"and FCoE traffic");
1354 		status = be_cmd_mccq_org_create(adapter, mccq, cq);
1355 	}
1356 	return status;
1357 }
1358 
be_cmd_txq_create(struct be_adapter * adapter,struct be_tx_obj * txo)1359 int be_cmd_txq_create(struct be_adapter *adapter, struct be_tx_obj *txo)
1360 {
1361 	struct be_mcc_wrb wrb = {0};
1362 	struct be_cmd_req_eth_tx_create *req;
1363 	struct be_queue_info *txq = &txo->q;
1364 	struct be_queue_info *cq = &txo->cq;
1365 	struct be_dma_mem *q_mem = &txq->dma_mem;
1366 	int status, ver = 0;
1367 
1368 	req = embedded_payload(&wrb);
1369 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
1370 			       OPCODE_ETH_TX_CREATE, sizeof(*req), &wrb, NULL);
1371 
1372 	if (lancer_chip(adapter)) {
1373 		req->hdr.version = 1;
1374 	} else if (BEx_chip(adapter)) {
1375 		if (adapter->function_caps & BE_FUNCTION_CAPS_SUPER_NIC)
1376 			req->hdr.version = 2;
1377 	} else { /* For SH */
1378 		req->hdr.version = 2;
1379 	}
1380 
1381 	if (req->hdr.version > 0)
1382 		req->if_id = cpu_to_le16(adapter->if_handle);
1383 	req->num_pages = PAGES_4K_SPANNED(q_mem->va, q_mem->size);
1384 	req->ulp_num = BE_ULP1_NUM;
1385 	req->type = BE_ETH_TX_RING_TYPE_STANDARD;
1386 	req->cq_id = cpu_to_le16(cq->id);
1387 	req->queue_size = be_encoded_q_len(txq->len);
1388 	be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
1389 	ver = req->hdr.version;
1390 
1391 	status = be_cmd_notify_wait(adapter, &wrb);
1392 	if (!status) {
1393 		struct be_cmd_resp_eth_tx_create *resp = embedded_payload(&wrb);
1394 
1395 		txq->id = le16_to_cpu(resp->cid);
1396 		if (ver == 2)
1397 			txo->db_offset = le32_to_cpu(resp->db_offset);
1398 		else
1399 			txo->db_offset = DB_TXULP1_OFFSET;
1400 		txq->created = true;
1401 	}
1402 
1403 	return status;
1404 }
1405 
1406 /* Uses MCC */
be_cmd_rxq_create(struct be_adapter * adapter,struct be_queue_info * rxq,u16 cq_id,u16 frag_size,u32 if_id,u32 rss,u8 * rss_id)1407 int be_cmd_rxq_create(struct be_adapter *adapter,
1408 		      struct be_queue_info *rxq, u16 cq_id, u16 frag_size,
1409 		      u32 if_id, u32 rss, u8 *rss_id)
1410 {
1411 	struct be_mcc_wrb *wrb;
1412 	struct be_cmd_req_eth_rx_create *req;
1413 	struct be_dma_mem *q_mem = &rxq->dma_mem;
1414 	int status;
1415 
1416 	mutex_lock(&adapter->mcc_lock);
1417 
1418 	wrb = wrb_from_mccq(adapter);
1419 	if (!wrb) {
1420 		status = -EBUSY;
1421 		goto err;
1422 	}
1423 	req = embedded_payload(wrb);
1424 
1425 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
1426 			       OPCODE_ETH_RX_CREATE, sizeof(*req), wrb, NULL);
1427 
1428 	req->cq_id = cpu_to_le16(cq_id);
1429 	req->frag_size = fls(frag_size) - 1;
1430 	req->num_pages = 2;
1431 	be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
1432 	req->interface_id = cpu_to_le32(if_id);
1433 	req->max_frame_size = cpu_to_le16(BE_MAX_JUMBO_FRAME_SIZE);
1434 	req->rss_queue = cpu_to_le32(rss);
1435 
1436 	status = be_mcc_notify_wait(adapter);
1437 	if (!status) {
1438 		struct be_cmd_resp_eth_rx_create *resp = embedded_payload(wrb);
1439 
1440 		rxq->id = le16_to_cpu(resp->id);
1441 		rxq->created = true;
1442 		*rss_id = resp->rss_id;
1443 	}
1444 
1445 err:
1446 	mutex_unlock(&adapter->mcc_lock);
1447 	return status;
1448 }
1449 
1450 /* Generic destroyer function for all types of queues
1451  * Uses Mbox
1452  */
be_cmd_q_destroy(struct be_adapter * adapter,struct be_queue_info * q,int queue_type)1453 int be_cmd_q_destroy(struct be_adapter *adapter, struct be_queue_info *q,
1454 		     int queue_type)
1455 {
1456 	struct be_mcc_wrb *wrb;
1457 	struct be_cmd_req_q_destroy *req;
1458 	u8 subsys = 0, opcode = 0;
1459 	int status;
1460 
1461 	if (mutex_lock_interruptible(&adapter->mbox_lock))
1462 		return -1;
1463 
1464 	wrb = wrb_from_mbox(adapter);
1465 	req = embedded_payload(wrb);
1466 
1467 	switch (queue_type) {
1468 	case QTYPE_EQ:
1469 		subsys = CMD_SUBSYSTEM_COMMON;
1470 		opcode = OPCODE_COMMON_EQ_DESTROY;
1471 		break;
1472 	case QTYPE_CQ:
1473 		subsys = CMD_SUBSYSTEM_COMMON;
1474 		opcode = OPCODE_COMMON_CQ_DESTROY;
1475 		break;
1476 	case QTYPE_TXQ:
1477 		subsys = CMD_SUBSYSTEM_ETH;
1478 		opcode = OPCODE_ETH_TX_DESTROY;
1479 		break;
1480 	case QTYPE_RXQ:
1481 		subsys = CMD_SUBSYSTEM_ETH;
1482 		opcode = OPCODE_ETH_RX_DESTROY;
1483 		break;
1484 	case QTYPE_MCCQ:
1485 		subsys = CMD_SUBSYSTEM_COMMON;
1486 		opcode = OPCODE_COMMON_MCC_DESTROY;
1487 		break;
1488 	default:
1489 		BUG();
1490 	}
1491 
1492 	be_wrb_cmd_hdr_prepare(&req->hdr, subsys, opcode, sizeof(*req), wrb,
1493 			       NULL);
1494 	req->id = cpu_to_le16(q->id);
1495 
1496 	status = be_mbox_notify_wait(adapter);
1497 	q->created = false;
1498 
1499 	mutex_unlock(&adapter->mbox_lock);
1500 	return status;
1501 }
1502 
1503 /* Uses MCC */
be_cmd_rxq_destroy(struct be_adapter * adapter,struct be_queue_info * q)1504 int be_cmd_rxq_destroy(struct be_adapter *adapter, struct be_queue_info *q)
1505 {
1506 	struct be_mcc_wrb *wrb;
1507 	struct be_cmd_req_q_destroy *req;
1508 	int status;
1509 
1510 	mutex_lock(&adapter->mcc_lock);
1511 
1512 	wrb = wrb_from_mccq(adapter);
1513 	if (!wrb) {
1514 		status = -EBUSY;
1515 		goto err;
1516 	}
1517 	req = embedded_payload(wrb);
1518 
1519 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
1520 			       OPCODE_ETH_RX_DESTROY, sizeof(*req), wrb, NULL);
1521 	req->id = cpu_to_le16(q->id);
1522 
1523 	status = be_mcc_notify_wait(adapter);
1524 	q->created = false;
1525 
1526 err:
1527 	mutex_unlock(&adapter->mcc_lock);
1528 	return status;
1529 }
1530 
1531 /* Create an rx filtering policy configuration on an i/f
1532  * Will use MBOX only if MCCQ has not been created.
1533  */
be_cmd_if_create(struct be_adapter * adapter,u32 cap_flags,u32 en_flags,u32 * if_handle,u32 domain)1534 int be_cmd_if_create(struct be_adapter *adapter, u32 cap_flags, u32 en_flags,
1535 		     u32 *if_handle, u32 domain)
1536 {
1537 	struct be_mcc_wrb wrb = {0};
1538 	struct be_cmd_req_if_create *req;
1539 	int status;
1540 
1541 	req = embedded_payload(&wrb);
1542 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1543 			       OPCODE_COMMON_NTWK_INTERFACE_CREATE,
1544 			       sizeof(*req), &wrb, NULL);
1545 	req->hdr.domain = domain;
1546 	req->capability_flags = cpu_to_le32(cap_flags);
1547 	req->enable_flags = cpu_to_le32(en_flags);
1548 	req->pmac_invalid = true;
1549 
1550 	status = be_cmd_notify_wait(adapter, &wrb);
1551 	if (!status) {
1552 		struct be_cmd_resp_if_create *resp = embedded_payload(&wrb);
1553 
1554 		*if_handle = le32_to_cpu(resp->interface_id);
1555 
1556 		/* Hack to retrieve VF's pmac-id on BE3 */
1557 		if (BE3_chip(adapter) && be_virtfn(adapter))
1558 			adapter->pmac_id[0] = le32_to_cpu(resp->pmac_id);
1559 	}
1560 	return status;
1561 }
1562 
1563 /* Uses MCCQ if available else MBOX */
be_cmd_if_destroy(struct be_adapter * adapter,int interface_id,u32 domain)1564 int be_cmd_if_destroy(struct be_adapter *adapter, int interface_id, u32 domain)
1565 {
1566 	struct be_mcc_wrb wrb = {0};
1567 	struct be_cmd_req_if_destroy *req;
1568 	int status;
1569 
1570 	if (interface_id == -1)
1571 		return 0;
1572 
1573 	req = embedded_payload(&wrb);
1574 
1575 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1576 			       OPCODE_COMMON_NTWK_INTERFACE_DESTROY,
1577 			       sizeof(*req), &wrb, NULL);
1578 	req->hdr.domain = domain;
1579 	req->interface_id = cpu_to_le32(interface_id);
1580 
1581 	status = be_cmd_notify_wait(adapter, &wrb);
1582 	return status;
1583 }
1584 
1585 /* Get stats is a non embedded command: the request is not embedded inside
1586  * WRB but is a separate dma memory block
1587  * Uses asynchronous MCC
1588  */
be_cmd_get_stats(struct be_adapter * adapter,struct be_dma_mem * nonemb_cmd)1589 int be_cmd_get_stats(struct be_adapter *adapter, struct be_dma_mem *nonemb_cmd)
1590 {
1591 	struct be_mcc_wrb *wrb;
1592 	struct be_cmd_req_hdr *hdr;
1593 	int status = 0;
1594 
1595 	mutex_lock(&adapter->mcc_lock);
1596 
1597 	wrb = wrb_from_mccq(adapter);
1598 	if (!wrb) {
1599 		status = -EBUSY;
1600 		goto err;
1601 	}
1602 	hdr = nonemb_cmd->va;
1603 
1604 	be_wrb_cmd_hdr_prepare(hdr, CMD_SUBSYSTEM_ETH,
1605 			       OPCODE_ETH_GET_STATISTICS, nonemb_cmd->size, wrb,
1606 			       nonemb_cmd);
1607 
1608 	/* version 1 of the cmd is not supported only by BE2 */
1609 	if (BE2_chip(adapter))
1610 		hdr->version = 0;
1611 	if (BE3_chip(adapter) || lancer_chip(adapter))
1612 		hdr->version = 1;
1613 	else
1614 		hdr->version = 2;
1615 
1616 	status = be_mcc_notify(adapter);
1617 	if (status)
1618 		goto err;
1619 
1620 	adapter->stats_cmd_sent = true;
1621 
1622 err:
1623 	mutex_unlock(&adapter->mcc_lock);
1624 	return status;
1625 }
1626 
1627 /* Lancer Stats */
lancer_cmd_get_pport_stats(struct be_adapter * adapter,struct be_dma_mem * nonemb_cmd)1628 int lancer_cmd_get_pport_stats(struct be_adapter *adapter,
1629 			       struct be_dma_mem *nonemb_cmd)
1630 {
1631 	struct be_mcc_wrb *wrb;
1632 	struct lancer_cmd_req_pport_stats *req;
1633 	int status = 0;
1634 
1635 	if (!be_cmd_allowed(adapter, OPCODE_ETH_GET_PPORT_STATS,
1636 			    CMD_SUBSYSTEM_ETH))
1637 		return -EPERM;
1638 
1639 	mutex_lock(&adapter->mcc_lock);
1640 
1641 	wrb = wrb_from_mccq(adapter);
1642 	if (!wrb) {
1643 		status = -EBUSY;
1644 		goto err;
1645 	}
1646 	req = nonemb_cmd->va;
1647 
1648 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
1649 			       OPCODE_ETH_GET_PPORT_STATS, nonemb_cmd->size,
1650 			       wrb, nonemb_cmd);
1651 
1652 	req->cmd_params.params.pport_num = cpu_to_le16(adapter->hba_port_num);
1653 	req->cmd_params.params.reset_stats = 0;
1654 
1655 	status = be_mcc_notify(adapter);
1656 	if (status)
1657 		goto err;
1658 
1659 	adapter->stats_cmd_sent = true;
1660 
1661 err:
1662 	mutex_unlock(&adapter->mcc_lock);
1663 	return status;
1664 }
1665 
be_mac_to_link_speed(int mac_speed)1666 static int be_mac_to_link_speed(int mac_speed)
1667 {
1668 	switch (mac_speed) {
1669 	case PHY_LINK_SPEED_ZERO:
1670 		return 0;
1671 	case PHY_LINK_SPEED_10MBPS:
1672 		return 10;
1673 	case PHY_LINK_SPEED_100MBPS:
1674 		return 100;
1675 	case PHY_LINK_SPEED_1GBPS:
1676 		return 1000;
1677 	case PHY_LINK_SPEED_10GBPS:
1678 		return 10000;
1679 	case PHY_LINK_SPEED_20GBPS:
1680 		return 20000;
1681 	case PHY_LINK_SPEED_25GBPS:
1682 		return 25000;
1683 	case PHY_LINK_SPEED_40GBPS:
1684 		return 40000;
1685 	}
1686 	return 0;
1687 }
1688 
1689 /* Uses synchronous mcc
1690  * Returns link_speed in Mbps
1691  */
be_cmd_link_status_query(struct be_adapter * adapter,u16 * link_speed,u8 * link_status,u32 dom)1692 int be_cmd_link_status_query(struct be_adapter *adapter, u16 *link_speed,
1693 			     u8 *link_status, u32 dom)
1694 {
1695 	struct be_mcc_wrb *wrb;
1696 	struct be_cmd_req_link_status *req;
1697 	int status;
1698 
1699 	mutex_lock(&adapter->mcc_lock);
1700 
1701 	if (link_status)
1702 		*link_status = LINK_DOWN;
1703 
1704 	wrb = wrb_from_mccq(adapter);
1705 	if (!wrb) {
1706 		status = -EBUSY;
1707 		goto err;
1708 	}
1709 	req = embedded_payload(wrb);
1710 
1711 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1712 			       OPCODE_COMMON_NTWK_LINK_STATUS_QUERY,
1713 			       sizeof(*req), wrb, NULL);
1714 
1715 	/* version 1 of the cmd is not supported only by BE2 */
1716 	if (!BE2_chip(adapter))
1717 		req->hdr.version = 1;
1718 
1719 	req->hdr.domain = dom;
1720 
1721 	status = be_mcc_notify_wait(adapter);
1722 	if (!status) {
1723 		struct be_cmd_resp_link_status *resp = embedded_payload(wrb);
1724 
1725 		if (link_speed) {
1726 			*link_speed = resp->link_speed ?
1727 				      le16_to_cpu(resp->link_speed) * 10 :
1728 				      be_mac_to_link_speed(resp->mac_speed);
1729 
1730 			if (!resp->logical_link_status)
1731 				*link_speed = 0;
1732 		}
1733 		if (link_status)
1734 			*link_status = resp->logical_link_status;
1735 	}
1736 
1737 err:
1738 	mutex_unlock(&adapter->mcc_lock);
1739 	return status;
1740 }
1741 
1742 /* Uses synchronous mcc */
be_cmd_get_die_temperature(struct be_adapter * adapter)1743 int be_cmd_get_die_temperature(struct be_adapter *adapter)
1744 {
1745 	struct be_mcc_wrb *wrb;
1746 	struct be_cmd_req_get_cntl_addnl_attribs *req;
1747 	int status = 0;
1748 
1749 	mutex_lock(&adapter->mcc_lock);
1750 
1751 	wrb = wrb_from_mccq(adapter);
1752 	if (!wrb) {
1753 		status = -EBUSY;
1754 		goto err;
1755 	}
1756 	req = embedded_payload(wrb);
1757 
1758 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1759 			       OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES,
1760 			       sizeof(*req), wrb, NULL);
1761 
1762 	status = be_mcc_notify(adapter);
1763 err:
1764 	mutex_unlock(&adapter->mcc_lock);
1765 	return status;
1766 }
1767 
1768 /* Uses synchronous mcc */
be_cmd_get_fat_dump_len(struct be_adapter * adapter,u32 * dump_size)1769 int be_cmd_get_fat_dump_len(struct be_adapter *adapter, u32 *dump_size)
1770 {
1771 	struct be_mcc_wrb wrb = {0};
1772 	struct be_cmd_req_get_fat *req;
1773 	int status;
1774 
1775 	req = embedded_payload(&wrb);
1776 
1777 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1778 			       OPCODE_COMMON_MANAGE_FAT, sizeof(*req),
1779 			       &wrb, NULL);
1780 	req->fat_operation = cpu_to_le32(QUERY_FAT);
1781 	status = be_cmd_notify_wait(adapter, &wrb);
1782 	if (!status) {
1783 		struct be_cmd_resp_get_fat *resp = embedded_payload(&wrb);
1784 
1785 		if (dump_size && resp->log_size)
1786 			*dump_size = le32_to_cpu(resp->log_size) -
1787 					sizeof(u32);
1788 	}
1789 	return status;
1790 }
1791 
be_cmd_get_fat_dump(struct be_adapter * adapter,u32 buf_len,void * buf)1792 int be_cmd_get_fat_dump(struct be_adapter *adapter, u32 buf_len, void *buf)
1793 {
1794 	struct be_dma_mem get_fat_cmd;
1795 	struct be_mcc_wrb *wrb;
1796 	struct be_cmd_req_get_fat *req;
1797 	u32 offset = 0, total_size, buf_size,
1798 				log_offset = sizeof(u32), payload_len;
1799 	int status;
1800 
1801 	if (buf_len == 0)
1802 		return 0;
1803 
1804 	total_size = buf_len;
1805 
1806 	get_fat_cmd.size = sizeof(struct be_cmd_req_get_fat) + 60*1024;
1807 	get_fat_cmd.va = dma_alloc_coherent(&adapter->pdev->dev,
1808 					    get_fat_cmd.size,
1809 					    &get_fat_cmd.dma, GFP_ATOMIC);
1810 	if (!get_fat_cmd.va)
1811 		return -ENOMEM;
1812 
1813 	mutex_lock(&adapter->mcc_lock);
1814 
1815 	while (total_size) {
1816 		buf_size = min(total_size, (u32)60*1024);
1817 		total_size -= buf_size;
1818 
1819 		wrb = wrb_from_mccq(adapter);
1820 		if (!wrb) {
1821 			status = -EBUSY;
1822 			goto err;
1823 		}
1824 		req = get_fat_cmd.va;
1825 
1826 		payload_len = sizeof(struct be_cmd_req_get_fat) + buf_size;
1827 		be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1828 				       OPCODE_COMMON_MANAGE_FAT, payload_len,
1829 				       wrb, &get_fat_cmd);
1830 
1831 		req->fat_operation = cpu_to_le32(RETRIEVE_FAT);
1832 		req->read_log_offset = cpu_to_le32(log_offset);
1833 		req->read_log_length = cpu_to_le32(buf_size);
1834 		req->data_buffer_size = cpu_to_le32(buf_size);
1835 
1836 		status = be_mcc_notify_wait(adapter);
1837 		if (!status) {
1838 			struct be_cmd_resp_get_fat *resp = get_fat_cmd.va;
1839 
1840 			memcpy(buf + offset,
1841 			       resp->data_buffer,
1842 			       le32_to_cpu(resp->read_log_length));
1843 		} else {
1844 			dev_err(&adapter->pdev->dev, "FAT Table Retrieve error\n");
1845 			goto err;
1846 		}
1847 		offset += buf_size;
1848 		log_offset += buf_size;
1849 	}
1850 err:
1851 	dma_free_coherent(&adapter->pdev->dev, get_fat_cmd.size,
1852 			  get_fat_cmd.va, get_fat_cmd.dma);
1853 	mutex_unlock(&adapter->mcc_lock);
1854 	return status;
1855 }
1856 
1857 /* Uses synchronous mcc */
be_cmd_get_fw_ver(struct be_adapter * adapter)1858 int be_cmd_get_fw_ver(struct be_adapter *adapter)
1859 {
1860 	struct be_mcc_wrb *wrb;
1861 	struct be_cmd_req_get_fw_version *req;
1862 	int status;
1863 
1864 	mutex_lock(&adapter->mcc_lock);
1865 
1866 	wrb = wrb_from_mccq(adapter);
1867 	if (!wrb) {
1868 		status = -EBUSY;
1869 		goto err;
1870 	}
1871 
1872 	req = embedded_payload(wrb);
1873 
1874 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1875 			       OPCODE_COMMON_GET_FW_VERSION, sizeof(*req), wrb,
1876 			       NULL);
1877 	status = be_mcc_notify_wait(adapter);
1878 	if (!status) {
1879 		struct be_cmd_resp_get_fw_version *resp = embedded_payload(wrb);
1880 
1881 		strscpy(adapter->fw_ver, resp->firmware_version_string,
1882 			sizeof(adapter->fw_ver));
1883 		strscpy(adapter->fw_on_flash, resp->fw_on_flash_version_string,
1884 			sizeof(adapter->fw_on_flash));
1885 	}
1886 err:
1887 	mutex_unlock(&adapter->mcc_lock);
1888 	return status;
1889 }
1890 
1891 /* set the EQ delay interval of an EQ to specified value
1892  * Uses async mcc
1893  */
__be_cmd_modify_eqd(struct be_adapter * adapter,struct be_set_eqd * set_eqd,int num)1894 static int __be_cmd_modify_eqd(struct be_adapter *adapter,
1895 			       struct be_set_eqd *set_eqd, int num)
1896 {
1897 	struct be_mcc_wrb *wrb;
1898 	struct be_cmd_req_modify_eq_delay *req;
1899 	int status = 0, i;
1900 
1901 	mutex_lock(&adapter->mcc_lock);
1902 
1903 	wrb = wrb_from_mccq(adapter);
1904 	if (!wrb) {
1905 		status = -EBUSY;
1906 		goto err;
1907 	}
1908 	req = embedded_payload(wrb);
1909 
1910 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1911 			       OPCODE_COMMON_MODIFY_EQ_DELAY, sizeof(*req), wrb,
1912 			       NULL);
1913 
1914 	req->num_eq = cpu_to_le32(num);
1915 	for (i = 0; i < num; i++) {
1916 		req->set_eqd[i].eq_id = cpu_to_le32(set_eqd[i].eq_id);
1917 		req->set_eqd[i].phase = 0;
1918 		req->set_eqd[i].delay_multiplier =
1919 				cpu_to_le32(set_eqd[i].delay_multiplier);
1920 	}
1921 
1922 	status = be_mcc_notify(adapter);
1923 err:
1924 	mutex_unlock(&adapter->mcc_lock);
1925 	return status;
1926 }
1927 
be_cmd_modify_eqd(struct be_adapter * adapter,struct be_set_eqd * set_eqd,int num)1928 int be_cmd_modify_eqd(struct be_adapter *adapter, struct be_set_eqd *set_eqd,
1929 		      int num)
1930 {
1931 	int num_eqs, i = 0;
1932 
1933 	while (num) {
1934 		num_eqs = min(num, 8);
1935 		__be_cmd_modify_eqd(adapter, &set_eqd[i], num_eqs);
1936 		i += num_eqs;
1937 		num -= num_eqs;
1938 	}
1939 
1940 	return 0;
1941 }
1942 
1943 /* Uses sycnhronous mcc */
be_cmd_vlan_config(struct be_adapter * adapter,u32 if_id,u16 * vtag_array,u32 num,u32 domain)1944 int be_cmd_vlan_config(struct be_adapter *adapter, u32 if_id, u16 *vtag_array,
1945 		       u32 num, u32 domain)
1946 {
1947 	struct be_mcc_wrb *wrb;
1948 	struct be_cmd_req_vlan_config *req;
1949 	int status;
1950 
1951 	mutex_lock(&adapter->mcc_lock);
1952 
1953 	wrb = wrb_from_mccq(adapter);
1954 	if (!wrb) {
1955 		status = -EBUSY;
1956 		goto err;
1957 	}
1958 	req = embedded_payload(wrb);
1959 
1960 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1961 			       OPCODE_COMMON_NTWK_VLAN_CONFIG, sizeof(*req),
1962 			       wrb, NULL);
1963 	req->hdr.domain = domain;
1964 
1965 	req->interface_id = if_id;
1966 	req->untagged = BE_IF_FLAGS_UNTAGGED & be_if_cap_flags(adapter) ? 1 : 0;
1967 	req->num_vlan = num;
1968 	memcpy(req->normal_vlan, vtag_array,
1969 	       req->num_vlan * sizeof(vtag_array[0]));
1970 
1971 	status = be_mcc_notify_wait(adapter);
1972 err:
1973 	mutex_unlock(&adapter->mcc_lock);
1974 	return status;
1975 }
1976 
__be_cmd_rx_filter(struct be_adapter * adapter,u32 flags,u32 value)1977 static int __be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
1978 {
1979 	struct be_mcc_wrb *wrb;
1980 	struct be_dma_mem *mem = &adapter->rx_filter;
1981 	struct be_cmd_req_rx_filter *req = mem->va;
1982 	int status;
1983 
1984 	mutex_lock(&adapter->mcc_lock);
1985 
1986 	wrb = wrb_from_mccq(adapter);
1987 	if (!wrb) {
1988 		status = -EBUSY;
1989 		goto err;
1990 	}
1991 	memset(req, 0, sizeof(*req));
1992 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1993 			       OPCODE_COMMON_NTWK_RX_FILTER, sizeof(*req),
1994 			       wrb, mem);
1995 
1996 	req->if_id = cpu_to_le32(adapter->if_handle);
1997 	req->if_flags_mask = cpu_to_le32(flags);
1998 	req->if_flags = (value == ON) ? req->if_flags_mask : 0;
1999 
2000 	if (flags & BE_IF_FLAGS_MULTICAST) {
2001 		int i;
2002 
2003 		/* Reset mcast promisc mode if already set by setting mask
2004 		 * and not setting flags field
2005 		 */
2006 		req->if_flags_mask |=
2007 			cpu_to_le32(BE_IF_FLAGS_MCAST_PROMISCUOUS &
2008 				    be_if_cap_flags(adapter));
2009 		req->mcast_num = cpu_to_le32(adapter->mc_count);
2010 		for (i = 0; i < adapter->mc_count; i++)
2011 			ether_addr_copy(req->mcast_mac[i].byte,
2012 					adapter->mc_list[i].mac);
2013 	}
2014 
2015 	status = be_mcc_notify_wait(adapter);
2016 err:
2017 	mutex_unlock(&adapter->mcc_lock);
2018 	return status;
2019 }
2020 
be_cmd_rx_filter(struct be_adapter * adapter,u32 flags,u32 value)2021 int be_cmd_rx_filter(struct be_adapter *adapter, u32 flags, u32 value)
2022 {
2023 	struct device *dev = &adapter->pdev->dev;
2024 
2025 	if ((flags & be_if_cap_flags(adapter)) != flags) {
2026 		dev_warn(dev, "Cannot set rx filter flags 0x%x\n", flags);
2027 		dev_warn(dev, "Interface is capable of 0x%x flags only\n",
2028 			 be_if_cap_flags(adapter));
2029 	}
2030 	flags &= be_if_cap_flags(adapter);
2031 	if (!flags)
2032 		return -ENOTSUPP;
2033 
2034 	return __be_cmd_rx_filter(adapter, flags, value);
2035 }
2036 
2037 /* Uses synchrounous mcc */
be_cmd_set_flow_control(struct be_adapter * adapter,u32 tx_fc,u32 rx_fc)2038 int be_cmd_set_flow_control(struct be_adapter *adapter, u32 tx_fc, u32 rx_fc)
2039 {
2040 	struct be_mcc_wrb *wrb;
2041 	struct be_cmd_req_set_flow_control *req;
2042 	int status;
2043 
2044 	if (!be_cmd_allowed(adapter, OPCODE_COMMON_SET_FLOW_CONTROL,
2045 			    CMD_SUBSYSTEM_COMMON))
2046 		return -EPERM;
2047 
2048 	mutex_lock(&adapter->mcc_lock);
2049 
2050 	wrb = wrb_from_mccq(adapter);
2051 	if (!wrb) {
2052 		status = -EBUSY;
2053 		goto err;
2054 	}
2055 	req = embedded_payload(wrb);
2056 
2057 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2058 			       OPCODE_COMMON_SET_FLOW_CONTROL, sizeof(*req),
2059 			       wrb, NULL);
2060 
2061 	req->hdr.version = 1;
2062 	req->tx_flow_control = cpu_to_le16((u16)tx_fc);
2063 	req->rx_flow_control = cpu_to_le16((u16)rx_fc);
2064 
2065 	status = be_mcc_notify_wait(adapter);
2066 
2067 err:
2068 	mutex_unlock(&adapter->mcc_lock);
2069 
2070 	if (base_status(status) == MCC_STATUS_FEATURE_NOT_SUPPORTED)
2071 		return  -EOPNOTSUPP;
2072 
2073 	return status;
2074 }
2075 
2076 /* Uses sycn mcc */
be_cmd_get_flow_control(struct be_adapter * adapter,u32 * tx_fc,u32 * rx_fc)2077 int be_cmd_get_flow_control(struct be_adapter *adapter, u32 *tx_fc, u32 *rx_fc)
2078 {
2079 	struct be_mcc_wrb *wrb;
2080 	struct be_cmd_req_get_flow_control *req;
2081 	int status;
2082 
2083 	if (!be_cmd_allowed(adapter, OPCODE_COMMON_GET_FLOW_CONTROL,
2084 			    CMD_SUBSYSTEM_COMMON))
2085 		return -EPERM;
2086 
2087 	mutex_lock(&adapter->mcc_lock);
2088 
2089 	wrb = wrb_from_mccq(adapter);
2090 	if (!wrb) {
2091 		status = -EBUSY;
2092 		goto err;
2093 	}
2094 	req = embedded_payload(wrb);
2095 
2096 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2097 			       OPCODE_COMMON_GET_FLOW_CONTROL, sizeof(*req),
2098 			       wrb, NULL);
2099 
2100 	status = be_mcc_notify_wait(adapter);
2101 	if (!status) {
2102 		struct be_cmd_resp_get_flow_control *resp =
2103 						embedded_payload(wrb);
2104 
2105 		*tx_fc = le16_to_cpu(resp->tx_flow_control);
2106 		*rx_fc = le16_to_cpu(resp->rx_flow_control);
2107 	}
2108 
2109 err:
2110 	mutex_unlock(&adapter->mcc_lock);
2111 	return status;
2112 }
2113 
2114 /* Uses mbox */
be_cmd_query_fw_cfg(struct be_adapter * adapter)2115 int be_cmd_query_fw_cfg(struct be_adapter *adapter)
2116 {
2117 	struct be_mcc_wrb *wrb;
2118 	struct be_cmd_req_query_fw_cfg *req;
2119 	int status;
2120 
2121 	if (mutex_lock_interruptible(&adapter->mbox_lock))
2122 		return -1;
2123 
2124 	wrb = wrb_from_mbox(adapter);
2125 	req = embedded_payload(wrb);
2126 
2127 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2128 			       OPCODE_COMMON_QUERY_FIRMWARE_CONFIG,
2129 			       sizeof(*req), wrb, NULL);
2130 
2131 	status = be_mbox_notify_wait(adapter);
2132 	if (!status) {
2133 		struct be_cmd_resp_query_fw_cfg *resp = embedded_payload(wrb);
2134 
2135 		adapter->port_num = le32_to_cpu(resp->phys_port);
2136 		adapter->function_mode = le32_to_cpu(resp->function_mode);
2137 		adapter->function_caps = le32_to_cpu(resp->function_caps);
2138 		adapter->asic_rev = le32_to_cpu(resp->asic_revision) & 0xFF;
2139 		dev_info(&adapter->pdev->dev,
2140 			 "FW config: function_mode=0x%x, function_caps=0x%x\n",
2141 			 adapter->function_mode, adapter->function_caps);
2142 	}
2143 
2144 	mutex_unlock(&adapter->mbox_lock);
2145 	return status;
2146 }
2147 
2148 /* Uses mbox */
be_cmd_reset_function(struct be_adapter * adapter)2149 int be_cmd_reset_function(struct be_adapter *adapter)
2150 {
2151 	struct be_mcc_wrb *wrb;
2152 	struct be_cmd_req_hdr *req;
2153 	int status;
2154 
2155 	if (lancer_chip(adapter)) {
2156 		iowrite32(SLI_PORT_CONTROL_IP_MASK,
2157 			  adapter->db + SLIPORT_CONTROL_OFFSET);
2158 		status = lancer_wait_ready(adapter);
2159 		if (status)
2160 			dev_err(&adapter->pdev->dev,
2161 				"Adapter in non recoverable error\n");
2162 		return status;
2163 	}
2164 
2165 	if (mutex_lock_interruptible(&adapter->mbox_lock))
2166 		return -1;
2167 
2168 	wrb = wrb_from_mbox(adapter);
2169 	req = embedded_payload(wrb);
2170 
2171 	be_wrb_cmd_hdr_prepare(req, CMD_SUBSYSTEM_COMMON,
2172 			       OPCODE_COMMON_FUNCTION_RESET, sizeof(*req), wrb,
2173 			       NULL);
2174 
2175 	status = be_mbox_notify_wait(adapter);
2176 
2177 	mutex_unlock(&adapter->mbox_lock);
2178 	return status;
2179 }
2180 
be_cmd_rss_config(struct be_adapter * adapter,u8 * rsstable,u32 rss_hash_opts,u16 table_size,const u8 * rss_hkey)2181 int be_cmd_rss_config(struct be_adapter *adapter, u8 *rsstable,
2182 		      u32 rss_hash_opts, u16 table_size, const u8 *rss_hkey)
2183 {
2184 	struct be_mcc_wrb *wrb;
2185 	struct be_cmd_req_rss_config *req;
2186 	int status;
2187 
2188 	if (!(be_if_cap_flags(adapter) & BE_IF_FLAGS_RSS))
2189 		return 0;
2190 
2191 	mutex_lock(&adapter->mcc_lock);
2192 
2193 	wrb = wrb_from_mccq(adapter);
2194 	if (!wrb) {
2195 		status = -EBUSY;
2196 		goto err;
2197 	}
2198 	req = embedded_payload(wrb);
2199 
2200 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
2201 			       OPCODE_ETH_RSS_CONFIG, sizeof(*req), wrb, NULL);
2202 
2203 	req->if_id = cpu_to_le32(adapter->if_handle);
2204 	req->enable_rss = cpu_to_le16(rss_hash_opts);
2205 	req->cpu_table_size_log2 = cpu_to_le16(fls(table_size) - 1);
2206 
2207 	if (!BEx_chip(adapter))
2208 		req->hdr.version = 1;
2209 
2210 	memcpy(req->cpu_table, rsstable, table_size);
2211 	memcpy(req->hash, rss_hkey, RSS_HASH_KEY_LEN);
2212 	be_dws_cpu_to_le(req->hash, sizeof(req->hash));
2213 
2214 	status = be_mcc_notify_wait(adapter);
2215 err:
2216 	mutex_unlock(&adapter->mcc_lock);
2217 	return status;
2218 }
2219 
2220 /* Uses sync mcc */
be_cmd_set_beacon_state(struct be_adapter * adapter,u8 port_num,u8 bcn,u8 sts,u8 state)2221 int be_cmd_set_beacon_state(struct be_adapter *adapter, u8 port_num,
2222 			    u8 bcn, u8 sts, u8 state)
2223 {
2224 	struct be_mcc_wrb *wrb;
2225 	struct be_cmd_req_enable_disable_beacon *req;
2226 	int status;
2227 
2228 	mutex_lock(&adapter->mcc_lock);
2229 
2230 	wrb = wrb_from_mccq(adapter);
2231 	if (!wrb) {
2232 		status = -EBUSY;
2233 		goto err;
2234 	}
2235 	req = embedded_payload(wrb);
2236 
2237 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2238 			       OPCODE_COMMON_ENABLE_DISABLE_BEACON,
2239 			       sizeof(*req), wrb, NULL);
2240 
2241 	req->port_num = port_num;
2242 	req->beacon_state = state;
2243 	req->beacon_duration = bcn;
2244 	req->status_duration = sts;
2245 
2246 	status = be_mcc_notify_wait(adapter);
2247 
2248 err:
2249 	mutex_unlock(&adapter->mcc_lock);
2250 	return status;
2251 }
2252 
2253 /* Uses sync mcc */
be_cmd_get_beacon_state(struct be_adapter * adapter,u8 port_num,u32 * state)2254 int be_cmd_get_beacon_state(struct be_adapter *adapter, u8 port_num, u32 *state)
2255 {
2256 	struct be_mcc_wrb *wrb;
2257 	struct be_cmd_req_get_beacon_state *req;
2258 	int status;
2259 
2260 	mutex_lock(&adapter->mcc_lock);
2261 
2262 	wrb = wrb_from_mccq(adapter);
2263 	if (!wrb) {
2264 		status = -EBUSY;
2265 		goto err;
2266 	}
2267 	req = embedded_payload(wrb);
2268 
2269 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2270 			       OPCODE_COMMON_GET_BEACON_STATE, sizeof(*req),
2271 			       wrb, NULL);
2272 
2273 	req->port_num = port_num;
2274 
2275 	status = be_mcc_notify_wait(adapter);
2276 	if (!status) {
2277 		struct be_cmd_resp_get_beacon_state *resp =
2278 						embedded_payload(wrb);
2279 
2280 		*state = resp->beacon_state;
2281 	}
2282 
2283 err:
2284 	mutex_unlock(&adapter->mcc_lock);
2285 	return status;
2286 }
2287 
2288 /* Uses sync mcc */
be_cmd_read_port_transceiver_data(struct be_adapter * adapter,u8 page_num,u32 off,u32 len,u8 * data)2289 int be_cmd_read_port_transceiver_data(struct be_adapter *adapter,
2290 				      u8 page_num, u32 off, u32 len, u8 *data)
2291 {
2292 	struct be_dma_mem cmd;
2293 	struct be_mcc_wrb *wrb;
2294 	struct be_cmd_req_port_type *req;
2295 	int status;
2296 
2297 	if (page_num > TR_PAGE_A2)
2298 		return -EINVAL;
2299 
2300 	cmd.size = sizeof(struct be_cmd_resp_port_type);
2301 	cmd.va = dma_alloc_coherent(&adapter->pdev->dev, cmd.size, &cmd.dma,
2302 				    GFP_ATOMIC);
2303 	if (!cmd.va) {
2304 		dev_err(&adapter->pdev->dev, "Memory allocation failed\n");
2305 		return -ENOMEM;
2306 	}
2307 
2308 	mutex_lock(&adapter->mcc_lock);
2309 
2310 	wrb = wrb_from_mccq(adapter);
2311 	if (!wrb) {
2312 		status = -EBUSY;
2313 		goto err;
2314 	}
2315 	req = cmd.va;
2316 
2317 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2318 			       OPCODE_COMMON_READ_TRANSRECV_DATA,
2319 			       cmd.size, wrb, &cmd);
2320 
2321 	req->port = cpu_to_le32(adapter->hba_port_num);
2322 	req->page_num = cpu_to_le32(page_num);
2323 	status = be_mcc_notify_wait(adapter);
2324 	if (!status && len > 0) {
2325 		struct be_cmd_resp_port_type *resp = cmd.va;
2326 
2327 		memcpy(data, resp->page_data + off, len);
2328 	}
2329 err:
2330 	mutex_unlock(&adapter->mcc_lock);
2331 	dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma);
2332 	return status;
2333 }
2334 
lancer_cmd_write_object(struct be_adapter * adapter,struct be_dma_mem * cmd,u32 data_size,u32 data_offset,const char * obj_name,u32 * data_written,u8 * change_status,u8 * addn_status)2335 static int lancer_cmd_write_object(struct be_adapter *adapter,
2336 				   struct be_dma_mem *cmd, u32 data_size,
2337 				   u32 data_offset, const char *obj_name,
2338 				   u32 *data_written, u8 *change_status,
2339 				   u8 *addn_status)
2340 {
2341 	struct be_mcc_wrb *wrb;
2342 	struct lancer_cmd_req_write_object *req;
2343 	struct lancer_cmd_resp_write_object *resp;
2344 	void *ctxt = NULL;
2345 	int status;
2346 
2347 	mutex_lock(&adapter->mcc_lock);
2348 	adapter->flash_status = 0;
2349 
2350 	wrb = wrb_from_mccq(adapter);
2351 	if (!wrb) {
2352 		status = -EBUSY;
2353 		goto err_unlock;
2354 	}
2355 
2356 	req = embedded_payload(wrb);
2357 
2358 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2359 			       OPCODE_COMMON_WRITE_OBJECT,
2360 			       sizeof(struct lancer_cmd_req_write_object), wrb,
2361 			       NULL);
2362 
2363 	ctxt = &req->context;
2364 	AMAP_SET_BITS(struct amap_lancer_write_obj_context,
2365 		      write_length, ctxt, data_size);
2366 
2367 	if (data_size == 0)
2368 		AMAP_SET_BITS(struct amap_lancer_write_obj_context,
2369 			      eof, ctxt, 1);
2370 	else
2371 		AMAP_SET_BITS(struct amap_lancer_write_obj_context,
2372 			      eof, ctxt, 0);
2373 
2374 	be_dws_cpu_to_le(ctxt, sizeof(req->context));
2375 	req->write_offset = cpu_to_le32(data_offset);
2376 	strscpy(req->object_name, obj_name, sizeof(req->object_name));
2377 	req->descriptor_count = cpu_to_le32(1);
2378 	req->buf_len = cpu_to_le32(data_size);
2379 	req->addr_low = cpu_to_le32((cmd->dma +
2380 				     sizeof(struct lancer_cmd_req_write_object))
2381 				    & 0xFFFFFFFF);
2382 	req->addr_high = cpu_to_le32(upper_32_bits(cmd->dma +
2383 				sizeof(struct lancer_cmd_req_write_object)));
2384 
2385 	status = be_mcc_notify(adapter);
2386 	if (status)
2387 		goto err_unlock;
2388 
2389 	mutex_unlock(&adapter->mcc_lock);
2390 
2391 	if (!wait_for_completion_timeout(&adapter->et_cmd_compl,
2392 					 msecs_to_jiffies(60000)))
2393 		status = -ETIMEDOUT;
2394 	else
2395 		status = adapter->flash_status;
2396 
2397 	resp = embedded_payload(wrb);
2398 	if (!status) {
2399 		*data_written = le32_to_cpu(resp->actual_write_len);
2400 		*change_status = resp->change_status;
2401 	} else {
2402 		*addn_status = resp->additional_status;
2403 	}
2404 
2405 	return status;
2406 
2407 err_unlock:
2408 	mutex_unlock(&adapter->mcc_lock);
2409 	return status;
2410 }
2411 
be_cmd_query_cable_type(struct be_adapter * adapter)2412 int be_cmd_query_cable_type(struct be_adapter *adapter)
2413 {
2414 	u8 page_data[PAGE_DATA_LEN];
2415 	int status;
2416 
2417 	status = be_cmd_read_port_transceiver_data(adapter, TR_PAGE_A0,
2418 						   0, PAGE_DATA_LEN, page_data);
2419 	if (!status) {
2420 		switch (adapter->phy.interface_type) {
2421 		case PHY_TYPE_QSFP:
2422 			adapter->phy.cable_type =
2423 				page_data[QSFP_PLUS_CABLE_TYPE_OFFSET];
2424 			break;
2425 		case PHY_TYPE_SFP_PLUS_10GB:
2426 			adapter->phy.cable_type =
2427 				page_data[SFP_PLUS_CABLE_TYPE_OFFSET];
2428 			break;
2429 		default:
2430 			adapter->phy.cable_type = 0;
2431 			break;
2432 		}
2433 	}
2434 	return status;
2435 }
2436 
be_cmd_query_sfp_info(struct be_adapter * adapter)2437 int be_cmd_query_sfp_info(struct be_adapter *adapter)
2438 {
2439 	u8 page_data[PAGE_DATA_LEN];
2440 	int status;
2441 
2442 	status = be_cmd_read_port_transceiver_data(adapter, TR_PAGE_A0,
2443 						   0, PAGE_DATA_LEN, page_data);
2444 	if (!status) {
2445 		strscpy(adapter->phy.vendor_name, page_data +
2446 			SFP_VENDOR_NAME_OFFSET, SFP_VENDOR_NAME_LEN - 1);
2447 		strscpy(adapter->phy.vendor_pn,
2448 			page_data + SFP_VENDOR_PN_OFFSET,
2449 			SFP_VENDOR_NAME_LEN - 1);
2450 	}
2451 
2452 	return status;
2453 }
2454 
lancer_cmd_delete_object(struct be_adapter * adapter,const char * obj_name)2455 static int lancer_cmd_delete_object(struct be_adapter *adapter,
2456 				    const char *obj_name)
2457 {
2458 	struct lancer_cmd_req_delete_object *req;
2459 	struct be_mcc_wrb *wrb;
2460 	int status;
2461 
2462 	mutex_lock(&adapter->mcc_lock);
2463 
2464 	wrb = wrb_from_mccq(adapter);
2465 	if (!wrb) {
2466 		status = -EBUSY;
2467 		goto err;
2468 	}
2469 
2470 	req = embedded_payload(wrb);
2471 
2472 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2473 			       OPCODE_COMMON_DELETE_OBJECT,
2474 			       sizeof(*req), wrb, NULL);
2475 
2476 	strscpy(req->object_name, obj_name, sizeof(req->object_name));
2477 
2478 	status = be_mcc_notify_wait(adapter);
2479 err:
2480 	mutex_unlock(&adapter->mcc_lock);
2481 	return status;
2482 }
2483 
lancer_cmd_read_object(struct be_adapter * adapter,struct be_dma_mem * cmd,u32 data_size,u32 data_offset,const char * obj_name,u32 * data_read,u32 * eof,u8 * addn_status)2484 int lancer_cmd_read_object(struct be_adapter *adapter, struct be_dma_mem *cmd,
2485 			   u32 data_size, u32 data_offset, const char *obj_name,
2486 			   u32 *data_read, u32 *eof, u8 *addn_status)
2487 {
2488 	struct be_mcc_wrb *wrb;
2489 	struct lancer_cmd_req_read_object *req;
2490 	struct lancer_cmd_resp_read_object *resp;
2491 	int status;
2492 
2493 	mutex_lock(&adapter->mcc_lock);
2494 
2495 	wrb = wrb_from_mccq(adapter);
2496 	if (!wrb) {
2497 		status = -EBUSY;
2498 		goto err_unlock;
2499 	}
2500 
2501 	req = embedded_payload(wrb);
2502 
2503 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2504 			       OPCODE_COMMON_READ_OBJECT,
2505 			       sizeof(struct lancer_cmd_req_read_object), wrb,
2506 			       NULL);
2507 
2508 	req->desired_read_len = cpu_to_le32(data_size);
2509 	req->read_offset = cpu_to_le32(data_offset);
2510 	strcpy(req->object_name, obj_name);
2511 	req->descriptor_count = cpu_to_le32(1);
2512 	req->buf_len = cpu_to_le32(data_size);
2513 	req->addr_low = cpu_to_le32((cmd->dma & 0xFFFFFFFF));
2514 	req->addr_high = cpu_to_le32(upper_32_bits(cmd->dma));
2515 
2516 	status = be_mcc_notify_wait(adapter);
2517 
2518 	resp = embedded_payload(wrb);
2519 	if (!status) {
2520 		*data_read = le32_to_cpu(resp->actual_read_len);
2521 		*eof = le32_to_cpu(resp->eof);
2522 	} else {
2523 		*addn_status = resp->additional_status;
2524 	}
2525 
2526 err_unlock:
2527 	mutex_unlock(&adapter->mcc_lock);
2528 	return status;
2529 }
2530 
be_cmd_write_flashrom(struct be_adapter * adapter,struct be_dma_mem * cmd,u32 flash_type,u32 flash_opcode,u32 img_offset,u32 buf_size)2531 static int be_cmd_write_flashrom(struct be_adapter *adapter,
2532 				 struct be_dma_mem *cmd, u32 flash_type,
2533 				 u32 flash_opcode, u32 img_offset, u32 buf_size)
2534 {
2535 	struct be_mcc_wrb *wrb;
2536 	struct be_cmd_write_flashrom *req;
2537 	int status;
2538 
2539 	mutex_lock(&adapter->mcc_lock);
2540 	adapter->flash_status = 0;
2541 
2542 	wrb = wrb_from_mccq(adapter);
2543 	if (!wrb) {
2544 		status = -EBUSY;
2545 		goto err_unlock;
2546 	}
2547 	req = cmd->va;
2548 
2549 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2550 			       OPCODE_COMMON_WRITE_FLASHROM, cmd->size, wrb,
2551 			       cmd);
2552 
2553 	req->params.op_type = cpu_to_le32(flash_type);
2554 	if (flash_type == OPTYPE_OFFSET_SPECIFIED)
2555 		req->params.offset = cpu_to_le32(img_offset);
2556 
2557 	req->params.op_code = cpu_to_le32(flash_opcode);
2558 	req->params.data_buf_size = cpu_to_le32(buf_size);
2559 
2560 	status = be_mcc_notify(adapter);
2561 	if (status)
2562 		goto err_unlock;
2563 
2564 	mutex_unlock(&adapter->mcc_lock);
2565 
2566 	if (!wait_for_completion_timeout(&adapter->et_cmd_compl,
2567 					 msecs_to_jiffies(40000)))
2568 		status = -ETIMEDOUT;
2569 	else
2570 		status = adapter->flash_status;
2571 
2572 	return status;
2573 
2574 err_unlock:
2575 	mutex_unlock(&adapter->mcc_lock);
2576 	return status;
2577 }
2578 
be_cmd_get_flash_crc(struct be_adapter * adapter,u8 * flashed_crc,u16 img_optype,u32 img_offset,u32 crc_offset)2579 static int be_cmd_get_flash_crc(struct be_adapter *adapter, u8 *flashed_crc,
2580 				u16 img_optype, u32 img_offset, u32 crc_offset)
2581 {
2582 	struct be_cmd_read_flash_crc *req;
2583 	struct be_mcc_wrb *wrb;
2584 	int status;
2585 
2586 	mutex_lock(&adapter->mcc_lock);
2587 
2588 	wrb = wrb_from_mccq(adapter);
2589 	if (!wrb) {
2590 		status = -EBUSY;
2591 		goto err;
2592 	}
2593 	req = embedded_payload(wrb);
2594 
2595 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2596 			       OPCODE_COMMON_READ_FLASHROM, sizeof(*req),
2597 			       wrb, NULL);
2598 
2599 	req->params.op_type = cpu_to_le32(img_optype);
2600 	if (img_optype == OPTYPE_OFFSET_SPECIFIED)
2601 		req->params.offset = cpu_to_le32(img_offset + crc_offset);
2602 	else
2603 		req->params.offset = cpu_to_le32(crc_offset);
2604 
2605 	req->params.op_code = cpu_to_le32(FLASHROM_OPER_REPORT);
2606 	req->params.data_buf_size = cpu_to_le32(0x4);
2607 
2608 	status = be_mcc_notify_wait(adapter);
2609 	if (!status)
2610 		memcpy(flashed_crc, req->crc, 4);
2611 
2612 err:
2613 	mutex_unlock(&adapter->mcc_lock);
2614 	return status;
2615 }
2616 
2617 static char flash_cookie[2][16] = {"*** SE FLAS", "H DIRECTORY *** "};
2618 
phy_flashing_required(struct be_adapter * adapter)2619 static bool phy_flashing_required(struct be_adapter *adapter)
2620 {
2621 	return (adapter->phy.phy_type == PHY_TYPE_TN_8022 &&
2622 		adapter->phy.interface_type == PHY_TYPE_BASET_10GB);
2623 }
2624 
is_comp_in_ufi(struct be_adapter * adapter,struct flash_section_info * fsec,int type)2625 static bool is_comp_in_ufi(struct be_adapter *adapter,
2626 			   struct flash_section_info *fsec, int type)
2627 {
2628 	int i = 0, img_type = 0;
2629 	struct flash_section_info_g2 *fsec_g2 = NULL;
2630 
2631 	if (BE2_chip(adapter))
2632 		fsec_g2 = (struct flash_section_info_g2 *)fsec;
2633 
2634 	for (i = 0; i < MAX_FLASH_COMP; i++) {
2635 		if (fsec_g2)
2636 			img_type = le32_to_cpu(fsec_g2->fsec_entry[i].type);
2637 		else
2638 			img_type = le32_to_cpu(fsec->fsec_entry[i].type);
2639 
2640 		if (img_type == type)
2641 			return true;
2642 	}
2643 	return false;
2644 }
2645 
get_fsec_info(struct be_adapter * adapter,int header_size,const struct firmware * fw)2646 static struct flash_section_info *get_fsec_info(struct be_adapter *adapter,
2647 						int header_size,
2648 						const struct firmware *fw)
2649 {
2650 	struct flash_section_info *fsec = NULL;
2651 	const u8 *p = fw->data;
2652 
2653 	p += header_size;
2654 	while (p < (fw->data + fw->size)) {
2655 		fsec = (struct flash_section_info *)p;
2656 		if (!memcmp(flash_cookie, fsec->cookie, sizeof(flash_cookie)))
2657 			return fsec;
2658 		p += 32;
2659 	}
2660 	return NULL;
2661 }
2662 
be_check_flash_crc(struct be_adapter * adapter,const u8 * p,u32 img_offset,u32 img_size,int hdr_size,u16 img_optype,bool * crc_match)2663 static int be_check_flash_crc(struct be_adapter *adapter, const u8 *p,
2664 			      u32 img_offset, u32 img_size, int hdr_size,
2665 			      u16 img_optype, bool *crc_match)
2666 {
2667 	u32 crc_offset;
2668 	int status;
2669 	u8 crc[4];
2670 
2671 	status = be_cmd_get_flash_crc(adapter, crc, img_optype, img_offset,
2672 				      img_size - 4);
2673 	if (status)
2674 		return status;
2675 
2676 	crc_offset = hdr_size + img_offset + img_size - 4;
2677 
2678 	/* Skip flashing, if crc of flashed region matches */
2679 	if (!memcmp(crc, p + crc_offset, 4))
2680 		*crc_match = true;
2681 	else
2682 		*crc_match = false;
2683 
2684 	return status;
2685 }
2686 
be_flash(struct be_adapter * adapter,const u8 * img,struct be_dma_mem * flash_cmd,int optype,int img_size,u32 img_offset)2687 static int be_flash(struct be_adapter *adapter, const u8 *img,
2688 		    struct be_dma_mem *flash_cmd, int optype, int img_size,
2689 		    u32 img_offset)
2690 {
2691 	u32 flash_op, num_bytes, total_bytes = img_size, bytes_sent = 0;
2692 	struct be_cmd_write_flashrom *req = flash_cmd->va;
2693 	int status;
2694 
2695 	while (total_bytes) {
2696 		num_bytes = min_t(u32, 32 * 1024, total_bytes);
2697 
2698 		total_bytes -= num_bytes;
2699 
2700 		if (!total_bytes) {
2701 			if (optype == OPTYPE_PHY_FW)
2702 				flash_op = FLASHROM_OPER_PHY_FLASH;
2703 			else
2704 				flash_op = FLASHROM_OPER_FLASH;
2705 		} else {
2706 			if (optype == OPTYPE_PHY_FW)
2707 				flash_op = FLASHROM_OPER_PHY_SAVE;
2708 			else
2709 				flash_op = FLASHROM_OPER_SAVE;
2710 		}
2711 
2712 		memcpy(req->data_buf, img, num_bytes);
2713 		img += num_bytes;
2714 		status = be_cmd_write_flashrom(adapter, flash_cmd, optype,
2715 					       flash_op, img_offset +
2716 					       bytes_sent, num_bytes);
2717 		if (base_status(status) == MCC_STATUS_ILLEGAL_REQUEST &&
2718 		    optype == OPTYPE_PHY_FW)
2719 			break;
2720 		else if (status)
2721 			return status;
2722 
2723 		bytes_sent += num_bytes;
2724 	}
2725 	return 0;
2726 }
2727 
2728 #define NCSI_UPDATE_LOG	"NCSI section update is not supported in FW ver %s\n"
be_fw_ncsi_supported(char * ver)2729 static bool be_fw_ncsi_supported(char *ver)
2730 {
2731 	int v1[4] = {3, 102, 148, 0}; /* Min ver that supports NCSI FW */
2732 	int v2[4];
2733 	int i;
2734 
2735 	if (sscanf(ver, "%d.%d.%d.%d", &v2[0], &v2[1], &v2[2], &v2[3]) != 4)
2736 		return false;
2737 
2738 	for (i = 0; i < 4; i++) {
2739 		if (v1[i] < v2[i])
2740 			return true;
2741 		else if (v1[i] > v2[i])
2742 			return false;
2743 	}
2744 
2745 	return true;
2746 }
2747 
2748 /* For BE2, BE3 and BE3-R */
be_flash_BEx(struct be_adapter * adapter,const struct firmware * fw,struct be_dma_mem * flash_cmd,int num_of_images)2749 static int be_flash_BEx(struct be_adapter *adapter,
2750 			const struct firmware *fw,
2751 			struct be_dma_mem *flash_cmd, int num_of_images)
2752 {
2753 	int img_hdrs_size = (num_of_images * sizeof(struct image_hdr));
2754 	struct device *dev = &adapter->pdev->dev;
2755 	struct flash_section_info *fsec = NULL;
2756 	int status, i, filehdr_size, num_comp;
2757 	const struct flash_comp *pflashcomp;
2758 	bool crc_match;
2759 	const u8 *p;
2760 
2761 	static const struct flash_comp gen3_flash_types[] = {
2762 		{ BE3_ISCSI_PRIMARY_IMAGE_START, OPTYPE_ISCSI_ACTIVE,
2763 			BE3_COMP_MAX_SIZE, IMAGE_FIRMWARE_ISCSI},
2764 		{ BE3_REDBOOT_START, OPTYPE_REDBOOT,
2765 			BE3_REDBOOT_COMP_MAX_SIZE, IMAGE_BOOT_CODE},
2766 		{ BE3_ISCSI_BIOS_START, OPTYPE_BIOS,
2767 			BE3_BIOS_COMP_MAX_SIZE, IMAGE_OPTION_ROM_ISCSI},
2768 		{ BE3_PXE_BIOS_START, OPTYPE_PXE_BIOS,
2769 			BE3_BIOS_COMP_MAX_SIZE, IMAGE_OPTION_ROM_PXE},
2770 		{ BE3_FCOE_BIOS_START, OPTYPE_FCOE_BIOS,
2771 			BE3_BIOS_COMP_MAX_SIZE, IMAGE_OPTION_ROM_FCOE},
2772 		{ BE3_ISCSI_BACKUP_IMAGE_START, OPTYPE_ISCSI_BACKUP,
2773 			BE3_COMP_MAX_SIZE, IMAGE_FIRMWARE_BACKUP_ISCSI},
2774 		{ BE3_FCOE_PRIMARY_IMAGE_START, OPTYPE_FCOE_FW_ACTIVE,
2775 			BE3_COMP_MAX_SIZE, IMAGE_FIRMWARE_FCOE},
2776 		{ BE3_FCOE_BACKUP_IMAGE_START, OPTYPE_FCOE_FW_BACKUP,
2777 			BE3_COMP_MAX_SIZE, IMAGE_FIRMWARE_BACKUP_FCOE},
2778 		{ BE3_NCSI_START, OPTYPE_NCSI_FW,
2779 			BE3_NCSI_COMP_MAX_SIZE, IMAGE_NCSI},
2780 		{ BE3_PHY_FW_START, OPTYPE_PHY_FW,
2781 			BE3_PHY_FW_COMP_MAX_SIZE, IMAGE_FIRMWARE_PHY}
2782 	};
2783 
2784 	static const struct flash_comp gen2_flash_types[] = {
2785 		{ BE2_ISCSI_PRIMARY_IMAGE_START, OPTYPE_ISCSI_ACTIVE,
2786 			BE2_COMP_MAX_SIZE, IMAGE_FIRMWARE_ISCSI},
2787 		{ BE2_REDBOOT_START, OPTYPE_REDBOOT,
2788 			BE2_REDBOOT_COMP_MAX_SIZE, IMAGE_BOOT_CODE},
2789 		{ BE2_ISCSI_BIOS_START, OPTYPE_BIOS,
2790 			BE2_BIOS_COMP_MAX_SIZE, IMAGE_OPTION_ROM_ISCSI},
2791 		{ BE2_PXE_BIOS_START, OPTYPE_PXE_BIOS,
2792 			BE2_BIOS_COMP_MAX_SIZE, IMAGE_OPTION_ROM_PXE},
2793 		{ BE2_FCOE_BIOS_START, OPTYPE_FCOE_BIOS,
2794 			BE2_BIOS_COMP_MAX_SIZE, IMAGE_OPTION_ROM_FCOE},
2795 		{ BE2_ISCSI_BACKUP_IMAGE_START, OPTYPE_ISCSI_BACKUP,
2796 			BE2_COMP_MAX_SIZE, IMAGE_FIRMWARE_BACKUP_ISCSI},
2797 		{ BE2_FCOE_PRIMARY_IMAGE_START, OPTYPE_FCOE_FW_ACTIVE,
2798 			BE2_COMP_MAX_SIZE, IMAGE_FIRMWARE_FCOE},
2799 		{ BE2_FCOE_BACKUP_IMAGE_START, OPTYPE_FCOE_FW_BACKUP,
2800 			 BE2_COMP_MAX_SIZE, IMAGE_FIRMWARE_BACKUP_FCOE}
2801 	};
2802 
2803 	if (BE3_chip(adapter)) {
2804 		pflashcomp = gen3_flash_types;
2805 		filehdr_size = sizeof(struct flash_file_hdr_g3);
2806 		num_comp = ARRAY_SIZE(gen3_flash_types);
2807 	} else {
2808 		pflashcomp = gen2_flash_types;
2809 		filehdr_size = sizeof(struct flash_file_hdr_g2);
2810 		num_comp = ARRAY_SIZE(gen2_flash_types);
2811 		img_hdrs_size = 0;
2812 	}
2813 
2814 	/* Get flash section info*/
2815 	fsec = get_fsec_info(adapter, filehdr_size + img_hdrs_size, fw);
2816 	if (!fsec) {
2817 		dev_err(dev, "Invalid Cookie. FW image may be corrupted\n");
2818 		return -1;
2819 	}
2820 	for (i = 0; i < num_comp; i++) {
2821 		if (!is_comp_in_ufi(adapter, fsec, pflashcomp[i].img_type))
2822 			continue;
2823 
2824 		if ((pflashcomp[i].optype == OPTYPE_NCSI_FW) &&
2825 		    !be_fw_ncsi_supported(adapter->fw_ver)) {
2826 			dev_info(dev, NCSI_UPDATE_LOG, adapter->fw_ver);
2827 			continue;
2828 		}
2829 
2830 		if (pflashcomp[i].optype == OPTYPE_PHY_FW  &&
2831 		    !phy_flashing_required(adapter))
2832 			continue;
2833 
2834 		if (pflashcomp[i].optype == OPTYPE_REDBOOT) {
2835 			status = be_check_flash_crc(adapter, fw->data,
2836 						    pflashcomp[i].offset,
2837 						    pflashcomp[i].size,
2838 						    filehdr_size +
2839 						    img_hdrs_size,
2840 						    OPTYPE_REDBOOT, &crc_match);
2841 			if (status) {
2842 				dev_err(dev,
2843 					"Could not get CRC for 0x%x region\n",
2844 					pflashcomp[i].optype);
2845 				continue;
2846 			}
2847 
2848 			if (crc_match)
2849 				continue;
2850 		}
2851 
2852 		p = fw->data + filehdr_size + pflashcomp[i].offset +
2853 			img_hdrs_size;
2854 		if (p + pflashcomp[i].size > fw->data + fw->size)
2855 			return -1;
2856 
2857 		status = be_flash(adapter, p, flash_cmd, pflashcomp[i].optype,
2858 				  pflashcomp[i].size, 0);
2859 		if (status) {
2860 			dev_err(dev, "Flashing section type 0x%x failed\n",
2861 				pflashcomp[i].img_type);
2862 			return status;
2863 		}
2864 	}
2865 	return 0;
2866 }
2867 
be_get_img_optype(struct flash_section_entry fsec_entry)2868 static u16 be_get_img_optype(struct flash_section_entry fsec_entry)
2869 {
2870 	u32 img_type = le32_to_cpu(fsec_entry.type);
2871 	u16 img_optype = le16_to_cpu(fsec_entry.optype);
2872 
2873 	if (img_optype != 0xFFFF)
2874 		return img_optype;
2875 
2876 	switch (img_type) {
2877 	case IMAGE_FIRMWARE_ISCSI:
2878 		img_optype = OPTYPE_ISCSI_ACTIVE;
2879 		break;
2880 	case IMAGE_BOOT_CODE:
2881 		img_optype = OPTYPE_REDBOOT;
2882 		break;
2883 	case IMAGE_OPTION_ROM_ISCSI:
2884 		img_optype = OPTYPE_BIOS;
2885 		break;
2886 	case IMAGE_OPTION_ROM_PXE:
2887 		img_optype = OPTYPE_PXE_BIOS;
2888 		break;
2889 	case IMAGE_OPTION_ROM_FCOE:
2890 		img_optype = OPTYPE_FCOE_BIOS;
2891 		break;
2892 	case IMAGE_FIRMWARE_BACKUP_ISCSI:
2893 		img_optype = OPTYPE_ISCSI_BACKUP;
2894 		break;
2895 	case IMAGE_NCSI:
2896 		img_optype = OPTYPE_NCSI_FW;
2897 		break;
2898 	case IMAGE_FLASHISM_JUMPVECTOR:
2899 		img_optype = OPTYPE_FLASHISM_JUMPVECTOR;
2900 		break;
2901 	case IMAGE_FIRMWARE_PHY:
2902 		img_optype = OPTYPE_SH_PHY_FW;
2903 		break;
2904 	case IMAGE_REDBOOT_DIR:
2905 		img_optype = OPTYPE_REDBOOT_DIR;
2906 		break;
2907 	case IMAGE_REDBOOT_CONFIG:
2908 		img_optype = OPTYPE_REDBOOT_CONFIG;
2909 		break;
2910 	case IMAGE_UFI_DIR:
2911 		img_optype = OPTYPE_UFI_DIR;
2912 		break;
2913 	default:
2914 		break;
2915 	}
2916 
2917 	return img_optype;
2918 }
2919 
be_flash_skyhawk(struct be_adapter * adapter,const struct firmware * fw,struct be_dma_mem * flash_cmd,int num_of_images)2920 static int be_flash_skyhawk(struct be_adapter *adapter,
2921 			    const struct firmware *fw,
2922 			    struct be_dma_mem *flash_cmd, int num_of_images)
2923 {
2924 	int img_hdrs_size = num_of_images * sizeof(struct image_hdr);
2925 	bool crc_match, old_fw_img, flash_offset_support = true;
2926 	struct device *dev = &adapter->pdev->dev;
2927 	struct flash_section_info *fsec = NULL;
2928 	u32 img_offset, img_size, img_type;
2929 	u16 img_optype, flash_optype;
2930 	int status, i, filehdr_size;
2931 	const u8 *p;
2932 
2933 	filehdr_size = sizeof(struct flash_file_hdr_g3);
2934 	fsec = get_fsec_info(adapter, filehdr_size + img_hdrs_size, fw);
2935 	if (!fsec) {
2936 		dev_err(dev, "Invalid Cookie. FW image may be corrupted\n");
2937 		return -EINVAL;
2938 	}
2939 
2940 retry_flash:
2941 	for (i = 0; i < le32_to_cpu(fsec->fsec_hdr.num_images); i++) {
2942 		img_offset = le32_to_cpu(fsec->fsec_entry[i].offset);
2943 		img_size   = le32_to_cpu(fsec->fsec_entry[i].pad_size);
2944 		img_type   = le32_to_cpu(fsec->fsec_entry[i].type);
2945 		img_optype = be_get_img_optype(fsec->fsec_entry[i]);
2946 		old_fw_img = fsec->fsec_entry[i].optype == 0xFFFF;
2947 
2948 		if (img_optype == 0xFFFF)
2949 			continue;
2950 
2951 		if (flash_offset_support)
2952 			flash_optype = OPTYPE_OFFSET_SPECIFIED;
2953 		else
2954 			flash_optype = img_optype;
2955 
2956 		/* Don't bother verifying CRC if an old FW image is being
2957 		 * flashed
2958 		 */
2959 		if (old_fw_img)
2960 			goto flash;
2961 
2962 		status = be_check_flash_crc(adapter, fw->data, img_offset,
2963 					    img_size, filehdr_size +
2964 					    img_hdrs_size, flash_optype,
2965 					    &crc_match);
2966 		if (base_status(status) == MCC_STATUS_ILLEGAL_REQUEST ||
2967 		    base_status(status) == MCC_STATUS_ILLEGAL_FIELD) {
2968 			/* The current FW image on the card does not support
2969 			 * OFFSET based flashing. Retry using older mechanism
2970 			 * of OPTYPE based flashing
2971 			 */
2972 			if (flash_optype == OPTYPE_OFFSET_SPECIFIED) {
2973 				flash_offset_support = false;
2974 				goto retry_flash;
2975 			}
2976 
2977 			/* The current FW image on the card does not recognize
2978 			 * the new FLASH op_type. The FW download is partially
2979 			 * complete. Reboot the server now to enable FW image
2980 			 * to recognize the new FLASH op_type. To complete the
2981 			 * remaining process, download the same FW again after
2982 			 * the reboot.
2983 			 */
2984 			dev_err(dev, "Flash incomplete. Reset the server\n");
2985 			dev_err(dev, "Download FW image again after reset\n");
2986 			return -EAGAIN;
2987 		} else if (status) {
2988 			dev_err(dev, "Could not get CRC for 0x%x region\n",
2989 				img_optype);
2990 			return -EFAULT;
2991 		}
2992 
2993 		if (crc_match)
2994 			continue;
2995 
2996 flash:
2997 		p = fw->data + filehdr_size + img_offset + img_hdrs_size;
2998 		if (p + img_size > fw->data + fw->size)
2999 			return -1;
3000 
3001 		status = be_flash(adapter, p, flash_cmd, flash_optype, img_size,
3002 				  img_offset);
3003 
3004 		/* The current FW image on the card does not support OFFSET
3005 		 * based flashing. Retry using older mechanism of OPTYPE based
3006 		 * flashing
3007 		 */
3008 		if (base_status(status) == MCC_STATUS_ILLEGAL_FIELD &&
3009 		    flash_optype == OPTYPE_OFFSET_SPECIFIED) {
3010 			flash_offset_support = false;
3011 			goto retry_flash;
3012 		}
3013 
3014 		/* For old FW images ignore ILLEGAL_FIELD error or errors on
3015 		 * UFI_DIR region
3016 		 */
3017 		if (old_fw_img &&
3018 		    (base_status(status) == MCC_STATUS_ILLEGAL_FIELD ||
3019 		     (img_optype == OPTYPE_UFI_DIR &&
3020 		      base_status(status) == MCC_STATUS_FAILED))) {
3021 			continue;
3022 		} else if (status) {
3023 			dev_err(dev, "Flashing section type 0x%x failed\n",
3024 				img_type);
3025 
3026 			switch (addl_status(status)) {
3027 			case MCC_ADDL_STATUS_MISSING_SIGNATURE:
3028 				dev_err(dev,
3029 					"Digital signature missing in FW\n");
3030 				return -EINVAL;
3031 			case MCC_ADDL_STATUS_INVALID_SIGNATURE:
3032 				dev_err(dev,
3033 					"Invalid digital signature in FW\n");
3034 				return -EINVAL;
3035 			default:
3036 				return -EFAULT;
3037 			}
3038 		}
3039 	}
3040 	return 0;
3041 }
3042 
lancer_fw_download(struct be_adapter * adapter,const struct firmware * fw)3043 int lancer_fw_download(struct be_adapter *adapter,
3044 		       const struct firmware *fw)
3045 {
3046 	struct device *dev = &adapter->pdev->dev;
3047 	struct be_dma_mem flash_cmd;
3048 	const u8 *data_ptr = NULL;
3049 	u8 *dest_image_ptr = NULL;
3050 	size_t image_size = 0;
3051 	u32 chunk_size = 0;
3052 	u32 data_written = 0;
3053 	u32 offset = 0;
3054 	int status = 0;
3055 	u8 add_status = 0;
3056 	u8 change_status;
3057 
3058 	if (!IS_ALIGNED(fw->size, sizeof(u32))) {
3059 		dev_err(dev, "FW image size should be multiple of 4\n");
3060 		return -EINVAL;
3061 	}
3062 
3063 	flash_cmd.size = sizeof(struct lancer_cmd_req_write_object)
3064 				+ LANCER_FW_DOWNLOAD_CHUNK;
3065 	flash_cmd.va = dma_alloc_coherent(dev, flash_cmd.size, &flash_cmd.dma,
3066 					  GFP_KERNEL);
3067 	if (!flash_cmd.va)
3068 		return -ENOMEM;
3069 
3070 	dest_image_ptr = flash_cmd.va +
3071 				sizeof(struct lancer_cmd_req_write_object);
3072 	image_size = fw->size;
3073 	data_ptr = fw->data;
3074 
3075 	while (image_size) {
3076 		chunk_size = min_t(u32, image_size, LANCER_FW_DOWNLOAD_CHUNK);
3077 
3078 		/* Copy the image chunk content. */
3079 		memcpy(dest_image_ptr, data_ptr, chunk_size);
3080 
3081 		status = lancer_cmd_write_object(adapter, &flash_cmd,
3082 						 chunk_size, offset,
3083 						 LANCER_FW_DOWNLOAD_LOCATION,
3084 						 &data_written, &change_status,
3085 						 &add_status);
3086 		if (status)
3087 			break;
3088 
3089 		offset += data_written;
3090 		data_ptr += data_written;
3091 		image_size -= data_written;
3092 	}
3093 
3094 	if (!status) {
3095 		/* Commit the FW written */
3096 		status = lancer_cmd_write_object(adapter, &flash_cmd,
3097 						 0, offset,
3098 						 LANCER_FW_DOWNLOAD_LOCATION,
3099 						 &data_written, &change_status,
3100 						 &add_status);
3101 	}
3102 
3103 	dma_free_coherent(dev, flash_cmd.size, flash_cmd.va, flash_cmd.dma);
3104 	if (status) {
3105 		dev_err(dev, "Firmware load error\n");
3106 		return be_cmd_status(status);
3107 	}
3108 
3109 	dev_info(dev, "Firmware flashed successfully\n");
3110 
3111 	if (change_status == LANCER_FW_RESET_NEEDED) {
3112 		dev_info(dev, "Resetting adapter to activate new FW\n");
3113 		status = lancer_physdev_ctrl(adapter,
3114 					     PHYSDEV_CONTROL_FW_RESET_MASK);
3115 		if (status) {
3116 			dev_err(dev, "Adapter busy, could not reset FW\n");
3117 			dev_err(dev, "Reboot server to activate new FW\n");
3118 		}
3119 	} else if (change_status != LANCER_NO_RESET_NEEDED) {
3120 		dev_info(dev, "Reboot server to activate new FW\n");
3121 	}
3122 
3123 	return 0;
3124 }
3125 
3126 /* Check if the flash image file is compatible with the adapter that
3127  * is being flashed.
3128  */
be_check_ufi_compatibility(struct be_adapter * adapter,struct flash_file_hdr_g3 * fhdr)3129 static bool be_check_ufi_compatibility(struct be_adapter *adapter,
3130 				       struct flash_file_hdr_g3 *fhdr)
3131 {
3132 	if (!fhdr) {
3133 		dev_err(&adapter->pdev->dev, "Invalid FW UFI file");
3134 		return false;
3135 	}
3136 
3137 	/* First letter of the build version is used to identify
3138 	 * which chip this image file is meant for.
3139 	 */
3140 	switch (fhdr->build[0]) {
3141 	case BLD_STR_UFI_TYPE_SH:
3142 		if (!skyhawk_chip(adapter))
3143 			return false;
3144 		break;
3145 	case BLD_STR_UFI_TYPE_BE3:
3146 		if (!BE3_chip(adapter))
3147 			return false;
3148 		break;
3149 	case BLD_STR_UFI_TYPE_BE2:
3150 		if (!BE2_chip(adapter))
3151 			return false;
3152 		break;
3153 	default:
3154 		return false;
3155 	}
3156 
3157 	/* In BE3 FW images the "asic_type_rev" field doesn't track the
3158 	 * asic_rev of the chips it is compatible with.
3159 	 * When asic_type_rev is 0 the image is compatible only with
3160 	 * pre-BE3-R chips (asic_rev < 0x10)
3161 	 */
3162 	if (BEx_chip(adapter) && fhdr->asic_type_rev == 0)
3163 		return adapter->asic_rev < 0x10;
3164 	else
3165 		return (fhdr->asic_type_rev >= adapter->asic_rev);
3166 }
3167 
be_fw_download(struct be_adapter * adapter,const struct firmware * fw)3168 int be_fw_download(struct be_adapter *adapter, const struct firmware *fw)
3169 {
3170 	struct device *dev = &adapter->pdev->dev;
3171 	struct flash_file_hdr_g3 *fhdr3;
3172 	struct image_hdr *img_hdr_ptr;
3173 	int status = 0, i, num_imgs;
3174 	struct be_dma_mem flash_cmd;
3175 
3176 	fhdr3 = (struct flash_file_hdr_g3 *)fw->data;
3177 	if (!be_check_ufi_compatibility(adapter, fhdr3)) {
3178 		dev_err(dev, "Flash image is not compatible with adapter\n");
3179 		return -EINVAL;
3180 	}
3181 
3182 	flash_cmd.size = sizeof(struct be_cmd_write_flashrom);
3183 	flash_cmd.va = dma_alloc_coherent(dev, flash_cmd.size, &flash_cmd.dma,
3184 					  GFP_KERNEL);
3185 	if (!flash_cmd.va)
3186 		return -ENOMEM;
3187 
3188 	num_imgs = le32_to_cpu(fhdr3->num_imgs);
3189 	for (i = 0; i < num_imgs; i++) {
3190 		img_hdr_ptr = (struct image_hdr *)(fw->data +
3191 				(sizeof(struct flash_file_hdr_g3) +
3192 				 i * sizeof(struct image_hdr)));
3193 		if (!BE2_chip(adapter) &&
3194 		    le32_to_cpu(img_hdr_ptr->imageid) != 1)
3195 			continue;
3196 
3197 		if (skyhawk_chip(adapter))
3198 			status = be_flash_skyhawk(adapter, fw, &flash_cmd,
3199 						  num_imgs);
3200 		else
3201 			status = be_flash_BEx(adapter, fw, &flash_cmd,
3202 					      num_imgs);
3203 	}
3204 
3205 	dma_free_coherent(dev, flash_cmd.size, flash_cmd.va, flash_cmd.dma);
3206 	if (!status)
3207 		dev_info(dev, "Firmware flashed successfully\n");
3208 
3209 	return status;
3210 }
3211 
be_cmd_enable_magic_wol(struct be_adapter * adapter,u8 * mac,struct be_dma_mem * nonemb_cmd)3212 int be_cmd_enable_magic_wol(struct be_adapter *adapter, u8 *mac,
3213 			    struct be_dma_mem *nonemb_cmd)
3214 {
3215 	struct be_mcc_wrb *wrb;
3216 	struct be_cmd_req_acpi_wol_magic_config *req;
3217 	int status;
3218 
3219 	mutex_lock(&adapter->mcc_lock);
3220 
3221 	wrb = wrb_from_mccq(adapter);
3222 	if (!wrb) {
3223 		status = -EBUSY;
3224 		goto err;
3225 	}
3226 	req = nonemb_cmd->va;
3227 
3228 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
3229 			       OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG, sizeof(*req),
3230 			       wrb, nonemb_cmd);
3231 	memcpy(req->magic_mac, mac, ETH_ALEN);
3232 
3233 	status = be_mcc_notify_wait(adapter);
3234 
3235 err:
3236 	mutex_unlock(&adapter->mcc_lock);
3237 	return status;
3238 }
3239 
be_cmd_set_loopback(struct be_adapter * adapter,u8 port_num,u8 loopback_type,u8 enable)3240 int be_cmd_set_loopback(struct be_adapter *adapter, u8 port_num,
3241 			u8 loopback_type, u8 enable)
3242 {
3243 	struct be_mcc_wrb *wrb;
3244 	struct be_cmd_req_set_lmode *req;
3245 	int status;
3246 
3247 	if (!be_cmd_allowed(adapter, OPCODE_LOWLEVEL_SET_LOOPBACK_MODE,
3248 			    CMD_SUBSYSTEM_LOWLEVEL))
3249 		return -EPERM;
3250 
3251 	mutex_lock(&adapter->mcc_lock);
3252 
3253 	wrb = wrb_from_mccq(adapter);
3254 	if (!wrb) {
3255 		status = -EBUSY;
3256 		goto err_unlock;
3257 	}
3258 
3259 	req = embedded_payload(wrb);
3260 
3261 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_LOWLEVEL,
3262 			       OPCODE_LOWLEVEL_SET_LOOPBACK_MODE, sizeof(*req),
3263 			       wrb, NULL);
3264 
3265 	req->src_port = port_num;
3266 	req->dest_port = port_num;
3267 	req->loopback_type = loopback_type;
3268 	req->loopback_state = enable;
3269 
3270 	status = be_mcc_notify(adapter);
3271 	if (status)
3272 		goto err_unlock;
3273 
3274 	mutex_unlock(&adapter->mcc_lock);
3275 
3276 	if (!wait_for_completion_timeout(&adapter->et_cmd_compl,
3277 					 msecs_to_jiffies(SET_LB_MODE_TIMEOUT)))
3278 		status = -ETIMEDOUT;
3279 
3280 	return status;
3281 
3282 err_unlock:
3283 	mutex_unlock(&adapter->mcc_lock);
3284 	return status;
3285 }
3286 
be_cmd_loopback_test(struct be_adapter * adapter,u32 port_num,u32 loopback_type,u32 pkt_size,u32 num_pkts,u64 pattern)3287 int be_cmd_loopback_test(struct be_adapter *adapter, u32 port_num,
3288 			 u32 loopback_type, u32 pkt_size, u32 num_pkts,
3289 			 u64 pattern)
3290 {
3291 	struct be_mcc_wrb *wrb;
3292 	struct be_cmd_req_loopback_test *req;
3293 	struct be_cmd_resp_loopback_test *resp;
3294 	int status;
3295 
3296 	if (!be_cmd_allowed(adapter, OPCODE_LOWLEVEL_LOOPBACK_TEST,
3297 			    CMD_SUBSYSTEM_LOWLEVEL))
3298 		return -EPERM;
3299 
3300 	mutex_lock(&adapter->mcc_lock);
3301 
3302 	wrb = wrb_from_mccq(adapter);
3303 	if (!wrb) {
3304 		status = -EBUSY;
3305 		goto err;
3306 	}
3307 
3308 	req = embedded_payload(wrb);
3309 
3310 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_LOWLEVEL,
3311 			       OPCODE_LOWLEVEL_LOOPBACK_TEST, sizeof(*req), wrb,
3312 			       NULL);
3313 
3314 	req->hdr.timeout = cpu_to_le32(15);
3315 	req->pattern = cpu_to_le64(pattern);
3316 	req->src_port = cpu_to_le32(port_num);
3317 	req->dest_port = cpu_to_le32(port_num);
3318 	req->pkt_size = cpu_to_le32(pkt_size);
3319 	req->num_pkts = cpu_to_le32(num_pkts);
3320 	req->loopback_type = cpu_to_le32(loopback_type);
3321 
3322 	status = be_mcc_notify(adapter);
3323 	if (status)
3324 		goto err;
3325 
3326 	mutex_unlock(&adapter->mcc_lock);
3327 
3328 	wait_for_completion(&adapter->et_cmd_compl);
3329 	resp = embedded_payload(wrb);
3330 	status = le32_to_cpu(resp->status);
3331 
3332 	return status;
3333 err:
3334 	mutex_unlock(&adapter->mcc_lock);
3335 	return status;
3336 }
3337 
be_cmd_ddr_dma_test(struct be_adapter * adapter,u64 pattern,u32 byte_cnt,struct be_dma_mem * cmd)3338 int be_cmd_ddr_dma_test(struct be_adapter *adapter, u64 pattern,
3339 			u32 byte_cnt, struct be_dma_mem *cmd)
3340 {
3341 	struct be_mcc_wrb *wrb;
3342 	struct be_cmd_req_ddrdma_test *req;
3343 	int status;
3344 	int i, j = 0;
3345 
3346 	if (!be_cmd_allowed(adapter, OPCODE_LOWLEVEL_HOST_DDR_DMA,
3347 			    CMD_SUBSYSTEM_LOWLEVEL))
3348 		return -EPERM;
3349 
3350 	mutex_lock(&adapter->mcc_lock);
3351 
3352 	wrb = wrb_from_mccq(adapter);
3353 	if (!wrb) {
3354 		status = -EBUSY;
3355 		goto err;
3356 	}
3357 	req = cmd->va;
3358 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_LOWLEVEL,
3359 			       OPCODE_LOWLEVEL_HOST_DDR_DMA, cmd->size, wrb,
3360 			       cmd);
3361 
3362 	req->pattern = cpu_to_le64(pattern);
3363 	req->byte_count = cpu_to_le32(byte_cnt);
3364 	for (i = 0; i < byte_cnt; i++) {
3365 		req->snd_buff[i] = (u8)(pattern >> (j*8));
3366 		j++;
3367 		if (j > 7)
3368 			j = 0;
3369 	}
3370 
3371 	status = be_mcc_notify_wait(adapter);
3372 
3373 	if (!status) {
3374 		struct be_cmd_resp_ddrdma_test *resp;
3375 
3376 		resp = cmd->va;
3377 		if ((memcmp(resp->rcv_buff, req->snd_buff, byte_cnt) != 0) ||
3378 		    resp->snd_err) {
3379 			status = -1;
3380 		}
3381 	}
3382 
3383 err:
3384 	mutex_unlock(&adapter->mcc_lock);
3385 	return status;
3386 }
3387 
be_cmd_get_seeprom_data(struct be_adapter * adapter,struct be_dma_mem * nonemb_cmd)3388 int be_cmd_get_seeprom_data(struct be_adapter *adapter,
3389 			    struct be_dma_mem *nonemb_cmd)
3390 {
3391 	struct be_mcc_wrb *wrb;
3392 	struct be_cmd_req_seeprom_read *req;
3393 	int status;
3394 
3395 	mutex_lock(&adapter->mcc_lock);
3396 
3397 	wrb = wrb_from_mccq(adapter);
3398 	if (!wrb) {
3399 		status = -EBUSY;
3400 		goto err;
3401 	}
3402 	req = nonemb_cmd->va;
3403 
3404 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
3405 			       OPCODE_COMMON_SEEPROM_READ, sizeof(*req), wrb,
3406 			       nonemb_cmd);
3407 
3408 	status = be_mcc_notify_wait(adapter);
3409 
3410 err:
3411 	mutex_unlock(&adapter->mcc_lock);
3412 	return status;
3413 }
3414 
be_cmd_get_phy_info(struct be_adapter * adapter)3415 int be_cmd_get_phy_info(struct be_adapter *adapter)
3416 {
3417 	struct be_mcc_wrb *wrb;
3418 	struct be_cmd_req_get_phy_info *req;
3419 	struct be_dma_mem cmd;
3420 	int status;
3421 
3422 	if (!be_cmd_allowed(adapter, OPCODE_COMMON_GET_PHY_DETAILS,
3423 			    CMD_SUBSYSTEM_COMMON))
3424 		return -EPERM;
3425 
3426 	mutex_lock(&adapter->mcc_lock);
3427 
3428 	wrb = wrb_from_mccq(adapter);
3429 	if (!wrb) {
3430 		status = -EBUSY;
3431 		goto err;
3432 	}
3433 	cmd.size = sizeof(struct be_cmd_req_get_phy_info);
3434 	cmd.va = dma_alloc_coherent(&adapter->pdev->dev, cmd.size, &cmd.dma,
3435 				    GFP_ATOMIC);
3436 	if (!cmd.va) {
3437 		dev_err(&adapter->pdev->dev, "Memory alloc failure\n");
3438 		status = -ENOMEM;
3439 		goto err;
3440 	}
3441 
3442 	req = cmd.va;
3443 
3444 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
3445 			       OPCODE_COMMON_GET_PHY_DETAILS, sizeof(*req),
3446 			       wrb, &cmd);
3447 
3448 	status = be_mcc_notify_wait(adapter);
3449 	if (!status) {
3450 		struct be_phy_info *resp_phy_info =
3451 				cmd.va + sizeof(struct be_cmd_req_hdr);
3452 
3453 		adapter->phy.phy_type = le16_to_cpu(resp_phy_info->phy_type);
3454 		adapter->phy.interface_type =
3455 			le16_to_cpu(resp_phy_info->interface_type);
3456 		adapter->phy.auto_speeds_supported =
3457 			le16_to_cpu(resp_phy_info->auto_speeds_supported);
3458 		adapter->phy.fixed_speeds_supported =
3459 			le16_to_cpu(resp_phy_info->fixed_speeds_supported);
3460 		adapter->phy.misc_params =
3461 			le32_to_cpu(resp_phy_info->misc_params);
3462 
3463 		if (BE2_chip(adapter)) {
3464 			adapter->phy.fixed_speeds_supported =
3465 				BE_SUPPORTED_SPEED_10GBPS |
3466 				BE_SUPPORTED_SPEED_1GBPS;
3467 		}
3468 	}
3469 	dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma);
3470 err:
3471 	mutex_unlock(&adapter->mcc_lock);
3472 	return status;
3473 }
3474 
be_cmd_set_qos(struct be_adapter * adapter,u32 bps,u32 domain)3475 static int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain)
3476 {
3477 	struct be_mcc_wrb *wrb;
3478 	struct be_cmd_req_set_qos *req;
3479 	int status;
3480 
3481 	mutex_lock(&adapter->mcc_lock);
3482 
3483 	wrb = wrb_from_mccq(adapter);
3484 	if (!wrb) {
3485 		status = -EBUSY;
3486 		goto err;
3487 	}
3488 
3489 	req = embedded_payload(wrb);
3490 
3491 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
3492 			       OPCODE_COMMON_SET_QOS, sizeof(*req), wrb, NULL);
3493 
3494 	req->hdr.domain = domain;
3495 	req->valid_bits = cpu_to_le32(BE_QOS_BITS_NIC);
3496 	req->max_bps_nic = cpu_to_le32(bps);
3497 
3498 	status = be_mcc_notify_wait(adapter);
3499 
3500 err:
3501 	mutex_unlock(&adapter->mcc_lock);
3502 	return status;
3503 }
3504 
be_cmd_get_cntl_attributes(struct be_adapter * adapter)3505 int be_cmd_get_cntl_attributes(struct be_adapter *adapter)
3506 {
3507 	struct be_mcc_wrb *wrb;
3508 	struct be_cmd_req_cntl_attribs *req;
3509 	struct be_cmd_resp_cntl_attribs *resp;
3510 	int status, i;
3511 	int payload_len = max(sizeof(*req), sizeof(*resp));
3512 	struct mgmt_controller_attrib *attribs;
3513 	struct be_dma_mem attribs_cmd;
3514 	u32 *serial_num;
3515 
3516 	if (mutex_lock_interruptible(&adapter->mbox_lock))
3517 		return -1;
3518 
3519 	memset(&attribs_cmd, 0, sizeof(struct be_dma_mem));
3520 	attribs_cmd.size = sizeof(struct be_cmd_resp_cntl_attribs);
3521 	attribs_cmd.va = dma_alloc_coherent(&adapter->pdev->dev,
3522 					    attribs_cmd.size,
3523 					    &attribs_cmd.dma, GFP_ATOMIC);
3524 	if (!attribs_cmd.va) {
3525 		dev_err(&adapter->pdev->dev, "Memory allocation failure\n");
3526 		status = -ENOMEM;
3527 		goto err;
3528 	}
3529 
3530 	wrb = wrb_from_mbox(adapter);
3531 	if (!wrb) {
3532 		status = -EBUSY;
3533 		goto err;
3534 	}
3535 	req = attribs_cmd.va;
3536 
3537 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
3538 			       OPCODE_COMMON_GET_CNTL_ATTRIBUTES, payload_len,
3539 			       wrb, &attribs_cmd);
3540 
3541 	status = be_mbox_notify_wait(adapter);
3542 	if (!status) {
3543 		attribs = attribs_cmd.va + sizeof(struct be_cmd_resp_hdr);
3544 		adapter->hba_port_num = attribs->hba_attribs.phy_port;
3545 		serial_num = attribs->hba_attribs.controller_serial_number;
3546 		for (i = 0; i < CNTL_SERIAL_NUM_WORDS; i++)
3547 			adapter->serial_num[i] = le32_to_cpu(serial_num[i]) &
3548 				(BIT_MASK(16) - 1);
3549 		/* For BEx, since GET_FUNC_CONFIG command is not
3550 		 * supported, we read funcnum here as a workaround.
3551 		 */
3552 		if (BEx_chip(adapter))
3553 			adapter->pf_num = attribs->hba_attribs.pci_funcnum;
3554 	}
3555 
3556 err:
3557 	mutex_unlock(&adapter->mbox_lock);
3558 	if (attribs_cmd.va)
3559 		dma_free_coherent(&adapter->pdev->dev, attribs_cmd.size,
3560 				  attribs_cmd.va, attribs_cmd.dma);
3561 	return status;
3562 }
3563 
3564 /* Uses mbox */
be_cmd_req_native_mode(struct be_adapter * adapter)3565 int be_cmd_req_native_mode(struct be_adapter *adapter)
3566 {
3567 	struct be_mcc_wrb *wrb;
3568 	struct be_cmd_req_set_func_cap *req;
3569 	int status;
3570 
3571 	if (mutex_lock_interruptible(&adapter->mbox_lock))
3572 		return -1;
3573 
3574 	wrb = wrb_from_mbox(adapter);
3575 	if (!wrb) {
3576 		status = -EBUSY;
3577 		goto err;
3578 	}
3579 
3580 	req = embedded_payload(wrb);
3581 
3582 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
3583 			       OPCODE_COMMON_SET_DRIVER_FUNCTION_CAP,
3584 			       sizeof(*req), wrb, NULL);
3585 
3586 	req->valid_cap_flags = cpu_to_le32(CAPABILITY_SW_TIMESTAMPS |
3587 				CAPABILITY_BE3_NATIVE_ERX_API);
3588 	req->cap_flags = cpu_to_le32(CAPABILITY_BE3_NATIVE_ERX_API);
3589 
3590 	status = be_mbox_notify_wait(adapter);
3591 	if (!status) {
3592 		struct be_cmd_resp_set_func_cap *resp = embedded_payload(wrb);
3593 
3594 		adapter->be3_native = le32_to_cpu(resp->cap_flags) &
3595 					CAPABILITY_BE3_NATIVE_ERX_API;
3596 		if (!adapter->be3_native)
3597 			dev_warn(&adapter->pdev->dev,
3598 				 "adapter not in advanced mode\n");
3599 	}
3600 err:
3601 	mutex_unlock(&adapter->mbox_lock);
3602 	return status;
3603 }
3604 
3605 /* Get privilege(s) for a function */
be_cmd_get_fn_privileges(struct be_adapter * adapter,u32 * privilege,u32 domain)3606 int be_cmd_get_fn_privileges(struct be_adapter *adapter, u32 *privilege,
3607 			     u32 domain)
3608 {
3609 	struct be_mcc_wrb *wrb;
3610 	struct be_cmd_req_get_fn_privileges *req;
3611 	int status;
3612 
3613 	mutex_lock(&adapter->mcc_lock);
3614 
3615 	wrb = wrb_from_mccq(adapter);
3616 	if (!wrb) {
3617 		status = -EBUSY;
3618 		goto err;
3619 	}
3620 
3621 	req = embedded_payload(wrb);
3622 
3623 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
3624 			       OPCODE_COMMON_GET_FN_PRIVILEGES, sizeof(*req),
3625 			       wrb, NULL);
3626 
3627 	req->hdr.domain = domain;
3628 
3629 	status = be_mcc_notify_wait(adapter);
3630 	if (!status) {
3631 		struct be_cmd_resp_get_fn_privileges *resp =
3632 						embedded_payload(wrb);
3633 
3634 		*privilege = le32_to_cpu(resp->privilege_mask);
3635 
3636 		/* In UMC mode FW does not return right privileges.
3637 		 * Override with correct privilege equivalent to PF.
3638 		 */
3639 		if (BEx_chip(adapter) && be_is_mc(adapter) &&
3640 		    be_physfn(adapter))
3641 			*privilege = MAX_PRIVILEGES;
3642 	}
3643 
3644 err:
3645 	mutex_unlock(&adapter->mcc_lock);
3646 	return status;
3647 }
3648 
3649 /* Set privilege(s) for a function */
be_cmd_set_fn_privileges(struct be_adapter * adapter,u32 privileges,u32 domain)3650 int be_cmd_set_fn_privileges(struct be_adapter *adapter, u32 privileges,
3651 			     u32 domain)
3652 {
3653 	struct be_mcc_wrb *wrb;
3654 	struct be_cmd_req_set_fn_privileges *req;
3655 	int status;
3656 
3657 	mutex_lock(&adapter->mcc_lock);
3658 
3659 	wrb = wrb_from_mccq(adapter);
3660 	if (!wrb) {
3661 		status = -EBUSY;
3662 		goto err;
3663 	}
3664 
3665 	req = embedded_payload(wrb);
3666 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
3667 			       OPCODE_COMMON_SET_FN_PRIVILEGES, sizeof(*req),
3668 			       wrb, NULL);
3669 	req->hdr.domain = domain;
3670 	if (lancer_chip(adapter))
3671 		req->privileges_lancer = cpu_to_le32(privileges);
3672 	else
3673 		req->privileges = cpu_to_le32(privileges);
3674 
3675 	status = be_mcc_notify_wait(adapter);
3676 err:
3677 	mutex_unlock(&adapter->mcc_lock);
3678 	return status;
3679 }
3680 
3681 /* pmac_id_valid: true => pmac_id is supplied and MAC address is requested.
3682  * pmac_id_valid: false => pmac_id or MAC address is requested.
3683  *		  If pmac_id is returned, pmac_id_valid is returned as true
3684  */
be_cmd_get_mac_from_list(struct be_adapter * adapter,u8 * mac,bool * pmac_id_valid,u32 * pmac_id,u32 if_handle,u8 domain)3685 int be_cmd_get_mac_from_list(struct be_adapter *adapter, u8 *mac,
3686 			     bool *pmac_id_valid, u32 *pmac_id, u32 if_handle,
3687 			     u8 domain)
3688 {
3689 	struct be_mcc_wrb *wrb;
3690 	struct be_cmd_req_get_mac_list *req;
3691 	int status;
3692 	int mac_count;
3693 	struct be_dma_mem get_mac_list_cmd;
3694 	int i;
3695 
3696 	memset(&get_mac_list_cmd, 0, sizeof(struct be_dma_mem));
3697 	get_mac_list_cmd.size = sizeof(struct be_cmd_resp_get_mac_list);
3698 	get_mac_list_cmd.va = dma_alloc_coherent(&adapter->pdev->dev,
3699 						 get_mac_list_cmd.size,
3700 						 &get_mac_list_cmd.dma,
3701 						 GFP_ATOMIC);
3702 
3703 	if (!get_mac_list_cmd.va) {
3704 		dev_err(&adapter->pdev->dev,
3705 			"Memory allocation failure during GET_MAC_LIST\n");
3706 		return -ENOMEM;
3707 	}
3708 
3709 	mutex_lock(&adapter->mcc_lock);
3710 
3711 	wrb = wrb_from_mccq(adapter);
3712 	if (!wrb) {
3713 		status = -EBUSY;
3714 		goto out;
3715 	}
3716 
3717 	req = get_mac_list_cmd.va;
3718 
3719 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
3720 			       OPCODE_COMMON_GET_MAC_LIST,
3721 			       get_mac_list_cmd.size, wrb, &get_mac_list_cmd);
3722 	req->hdr.domain = domain;
3723 	req->mac_type = MAC_ADDRESS_TYPE_NETWORK;
3724 	if (*pmac_id_valid) {
3725 		req->mac_id = cpu_to_le32(*pmac_id);
3726 		req->iface_id = cpu_to_le16(if_handle);
3727 		req->perm_override = 0;
3728 	} else {
3729 		req->perm_override = 1;
3730 	}
3731 
3732 	status = be_mcc_notify_wait(adapter);
3733 	if (!status) {
3734 		struct be_cmd_resp_get_mac_list *resp =
3735 						get_mac_list_cmd.va;
3736 
3737 		if (*pmac_id_valid) {
3738 			memcpy(mac, resp->macid_macaddr.mac_addr_id.macaddr,
3739 			       ETH_ALEN);
3740 			goto out;
3741 		}
3742 
3743 		mac_count = resp->true_mac_count + resp->pseudo_mac_count;
3744 		/* Mac list returned could contain one or more active mac_ids
3745 		 * or one or more true or pseudo permanent mac addresses.
3746 		 * If an active mac_id is present, return first active mac_id
3747 		 * found.
3748 		 */
3749 		for (i = 0; i < mac_count; i++) {
3750 			struct get_list_macaddr *mac_entry;
3751 			u16 mac_addr_size;
3752 			u32 mac_id;
3753 
3754 			mac_entry = &resp->macaddr_list[i];
3755 			mac_addr_size = le16_to_cpu(mac_entry->mac_addr_size);
3756 			/* mac_id is a 32 bit value and mac_addr size
3757 			 * is 6 bytes
3758 			 */
3759 			if (mac_addr_size == sizeof(u32)) {
3760 				*pmac_id_valid = true;
3761 				mac_id = mac_entry->mac_addr_id.s_mac_id.mac_id;
3762 				*pmac_id = le32_to_cpu(mac_id);
3763 				goto out;
3764 			}
3765 		}
3766 		/* If no active mac_id found, return first mac addr */
3767 		*pmac_id_valid = false;
3768 		memcpy(mac, resp->macaddr_list[0].mac_addr_id.macaddr,
3769 		       ETH_ALEN);
3770 	}
3771 
3772 out:
3773 	mutex_unlock(&adapter->mcc_lock);
3774 	dma_free_coherent(&adapter->pdev->dev, get_mac_list_cmd.size,
3775 			  get_mac_list_cmd.va, get_mac_list_cmd.dma);
3776 	return status;
3777 }
3778 
be_cmd_get_active_mac(struct be_adapter * adapter,u32 curr_pmac_id,u8 * mac,u32 if_handle,bool active,u32 domain)3779 int be_cmd_get_active_mac(struct be_adapter *adapter, u32 curr_pmac_id,
3780 			  u8 *mac, u32 if_handle, bool active, u32 domain)
3781 {
3782 	if (!active)
3783 		be_cmd_get_mac_from_list(adapter, mac, &active, &curr_pmac_id,
3784 					 if_handle, domain);
3785 	if (BEx_chip(adapter))
3786 		return be_cmd_mac_addr_query(adapter, mac, false,
3787 					     if_handle, curr_pmac_id);
3788 	else
3789 		/* Fetch the MAC address using pmac_id */
3790 		return be_cmd_get_mac_from_list(adapter, mac, &active,
3791 						&curr_pmac_id,
3792 						if_handle, domain);
3793 }
3794 
be_cmd_get_perm_mac(struct be_adapter * adapter,u8 * mac)3795 int be_cmd_get_perm_mac(struct be_adapter *adapter, u8 *mac)
3796 {
3797 	int status;
3798 	bool pmac_valid = false;
3799 
3800 	eth_zero_addr(mac);
3801 
3802 	if (BEx_chip(adapter)) {
3803 		if (be_physfn(adapter))
3804 			status = be_cmd_mac_addr_query(adapter, mac, true, 0,
3805 						       0);
3806 		else
3807 			status = be_cmd_mac_addr_query(adapter, mac, false,
3808 						       adapter->if_handle, 0);
3809 	} else {
3810 		status = be_cmd_get_mac_from_list(adapter, mac, &pmac_valid,
3811 						  NULL, adapter->if_handle, 0);
3812 	}
3813 
3814 	return status;
3815 }
3816 
3817 /* Uses synchronous MCCQ */
be_cmd_set_mac_list(struct be_adapter * adapter,u8 * mac_array,u8 mac_count,u32 domain)3818 int be_cmd_set_mac_list(struct be_adapter *adapter, u8 *mac_array,
3819 			u8 mac_count, u32 domain)
3820 {
3821 	struct be_mcc_wrb *wrb;
3822 	struct be_cmd_req_set_mac_list *req;
3823 	int status;
3824 	struct be_dma_mem cmd;
3825 
3826 	memset(&cmd, 0, sizeof(struct be_dma_mem));
3827 	cmd.size = sizeof(struct be_cmd_req_set_mac_list);
3828 	cmd.va = dma_alloc_coherent(&adapter->pdev->dev, cmd.size, &cmd.dma,
3829 				    GFP_KERNEL);
3830 	if (!cmd.va)
3831 		return -ENOMEM;
3832 
3833 	mutex_lock(&adapter->mcc_lock);
3834 
3835 	wrb = wrb_from_mccq(adapter);
3836 	if (!wrb) {
3837 		status = -EBUSY;
3838 		goto err;
3839 	}
3840 
3841 	req = cmd.va;
3842 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
3843 			       OPCODE_COMMON_SET_MAC_LIST, sizeof(*req),
3844 			       wrb, &cmd);
3845 
3846 	req->hdr.domain = domain;
3847 	req->mac_count = mac_count;
3848 	if (mac_count)
3849 		memcpy(req->mac, mac_array, ETH_ALEN*mac_count);
3850 
3851 	status = be_mcc_notify_wait(adapter);
3852 
3853 err:
3854 	dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va, cmd.dma);
3855 	mutex_unlock(&adapter->mcc_lock);
3856 	return status;
3857 }
3858 
3859 /* Wrapper to delete any active MACs and provision the new mac.
3860  * Changes to MAC_LIST are allowed iff none of the MAC addresses in the
3861  * current list are active.
3862  */
be_cmd_set_mac(struct be_adapter * adapter,u8 * mac,int if_id,u32 dom)3863 int be_cmd_set_mac(struct be_adapter *adapter, u8 *mac, int if_id, u32 dom)
3864 {
3865 	bool active_mac = false;
3866 	u8 old_mac[ETH_ALEN];
3867 	u32 pmac_id;
3868 	int status;
3869 
3870 	status = be_cmd_get_mac_from_list(adapter, old_mac, &active_mac,
3871 					  &pmac_id, if_id, dom);
3872 
3873 	if (!status && active_mac)
3874 		be_cmd_pmac_del(adapter, if_id, pmac_id, dom);
3875 
3876 	return be_cmd_set_mac_list(adapter, mac, mac ? 1 : 0, dom);
3877 }
3878 
be_cmd_set_hsw_config(struct be_adapter * adapter,u16 pvid,u32 domain,u16 intf_id,u16 hsw_mode,u8 spoofchk)3879 int be_cmd_set_hsw_config(struct be_adapter *adapter, u16 pvid,
3880 			  u32 domain, u16 intf_id, u16 hsw_mode, u8 spoofchk)
3881 {
3882 	struct be_mcc_wrb *wrb;
3883 	struct be_cmd_req_set_hsw_config *req;
3884 	void *ctxt;
3885 	int status;
3886 
3887 	if (!be_cmd_allowed(adapter, OPCODE_COMMON_SET_HSW_CONFIG,
3888 			    CMD_SUBSYSTEM_COMMON))
3889 		return -EPERM;
3890 
3891 	mutex_lock(&adapter->mcc_lock);
3892 
3893 	wrb = wrb_from_mccq(adapter);
3894 	if (!wrb) {
3895 		status = -EBUSY;
3896 		goto err;
3897 	}
3898 
3899 	req = embedded_payload(wrb);
3900 	ctxt = &req->context;
3901 
3902 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
3903 			       OPCODE_COMMON_SET_HSW_CONFIG, sizeof(*req), wrb,
3904 			       NULL);
3905 
3906 	req->hdr.domain = domain;
3907 	AMAP_SET_BITS(struct amap_set_hsw_context, interface_id, ctxt, intf_id);
3908 	if (pvid) {
3909 		AMAP_SET_BITS(struct amap_set_hsw_context, pvid_valid, ctxt, 1);
3910 		AMAP_SET_BITS(struct amap_set_hsw_context, pvid, ctxt, pvid);
3911 	}
3912 	if (hsw_mode) {
3913 		AMAP_SET_BITS(struct amap_set_hsw_context, interface_id,
3914 			      ctxt, adapter->hba_port_num);
3915 		AMAP_SET_BITS(struct amap_set_hsw_context, pport, ctxt, 1);
3916 		AMAP_SET_BITS(struct amap_set_hsw_context, port_fwd_type,
3917 			      ctxt, hsw_mode);
3918 	}
3919 
3920 	/* Enable/disable both mac and vlan spoof checking */
3921 	if (!BEx_chip(adapter) && spoofchk) {
3922 		AMAP_SET_BITS(struct amap_set_hsw_context, mac_spoofchk,
3923 			      ctxt, spoofchk);
3924 		AMAP_SET_BITS(struct amap_set_hsw_context, vlan_spoofchk,
3925 			      ctxt, spoofchk);
3926 	}
3927 
3928 	be_dws_cpu_to_le(req->context, sizeof(req->context));
3929 	status = be_mcc_notify_wait(adapter);
3930 
3931 err:
3932 	mutex_unlock(&adapter->mcc_lock);
3933 	return status;
3934 }
3935 
3936 /* Get Hyper switch config */
be_cmd_get_hsw_config(struct be_adapter * adapter,u16 * pvid,u32 domain,u16 intf_id,u8 * mode,bool * spoofchk)3937 int be_cmd_get_hsw_config(struct be_adapter *adapter, u16 *pvid,
3938 			  u32 domain, u16 intf_id, u8 *mode, bool *spoofchk)
3939 {
3940 	struct be_mcc_wrb *wrb;
3941 	struct be_cmd_req_get_hsw_config *req;
3942 	void *ctxt;
3943 	int status;
3944 	u16 vid;
3945 
3946 	mutex_lock(&adapter->mcc_lock);
3947 
3948 	wrb = wrb_from_mccq(adapter);
3949 	if (!wrb) {
3950 		status = -EBUSY;
3951 		goto err;
3952 	}
3953 
3954 	req = embedded_payload(wrb);
3955 	ctxt = &req->context;
3956 
3957 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
3958 			       OPCODE_COMMON_GET_HSW_CONFIG, sizeof(*req), wrb,
3959 			       NULL);
3960 
3961 	req->hdr.domain = domain;
3962 	AMAP_SET_BITS(struct amap_get_hsw_req_context, interface_id,
3963 		      ctxt, intf_id);
3964 	AMAP_SET_BITS(struct amap_get_hsw_req_context, pvid_valid, ctxt, 1);
3965 
3966 	if (!BEx_chip(adapter) && mode) {
3967 		AMAP_SET_BITS(struct amap_get_hsw_req_context, interface_id,
3968 			      ctxt, adapter->hba_port_num);
3969 		AMAP_SET_BITS(struct amap_get_hsw_req_context, pport, ctxt, 1);
3970 	}
3971 	be_dws_cpu_to_le(req->context, sizeof(req->context));
3972 
3973 	status = be_mcc_notify_wait(adapter);
3974 	if (!status) {
3975 		struct be_cmd_resp_get_hsw_config *resp =
3976 						embedded_payload(wrb);
3977 
3978 		be_dws_le_to_cpu(&resp->context, sizeof(resp->context));
3979 		vid = AMAP_GET_BITS(struct amap_get_hsw_resp_context,
3980 				    pvid, &resp->context);
3981 		if (pvid)
3982 			*pvid = le16_to_cpu(vid);
3983 		if (mode)
3984 			*mode = AMAP_GET_BITS(struct amap_get_hsw_resp_context,
3985 					      port_fwd_type, &resp->context);
3986 		if (spoofchk)
3987 			*spoofchk =
3988 				AMAP_GET_BITS(struct amap_get_hsw_resp_context,
3989 					      spoofchk, &resp->context);
3990 	}
3991 
3992 err:
3993 	mutex_unlock(&adapter->mcc_lock);
3994 	return status;
3995 }
3996 
be_is_wol_excluded(struct be_adapter * adapter)3997 static bool be_is_wol_excluded(struct be_adapter *adapter)
3998 {
3999 	struct pci_dev *pdev = adapter->pdev;
4000 
4001 	if (be_virtfn(adapter))
4002 		return true;
4003 
4004 	switch (pdev->subsystem_device) {
4005 	case OC_SUBSYS_DEVICE_ID1:
4006 	case OC_SUBSYS_DEVICE_ID2:
4007 	case OC_SUBSYS_DEVICE_ID3:
4008 	case OC_SUBSYS_DEVICE_ID4:
4009 		return true;
4010 	default:
4011 		return false;
4012 	}
4013 }
4014 
be_cmd_get_acpi_wol_cap(struct be_adapter * adapter)4015 int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter)
4016 {
4017 	struct be_mcc_wrb *wrb;
4018 	struct be_cmd_req_acpi_wol_magic_config_v1 *req;
4019 	int status = 0;
4020 	struct be_dma_mem cmd;
4021 
4022 	if (!be_cmd_allowed(adapter, OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG,
4023 			    CMD_SUBSYSTEM_ETH))
4024 		return -EPERM;
4025 
4026 	if (be_is_wol_excluded(adapter))
4027 		return status;
4028 
4029 	if (mutex_lock_interruptible(&adapter->mbox_lock))
4030 		return -1;
4031 
4032 	memset(&cmd, 0, sizeof(struct be_dma_mem));
4033 	cmd.size = sizeof(struct be_cmd_resp_acpi_wol_magic_config_v1);
4034 	cmd.va = dma_alloc_coherent(&adapter->pdev->dev, cmd.size, &cmd.dma,
4035 				    GFP_ATOMIC);
4036 	if (!cmd.va) {
4037 		dev_err(&adapter->pdev->dev, "Memory allocation failure\n");
4038 		status = -ENOMEM;
4039 		goto err;
4040 	}
4041 
4042 	wrb = wrb_from_mbox(adapter);
4043 	if (!wrb) {
4044 		status = -EBUSY;
4045 		goto err;
4046 	}
4047 
4048 	req = cmd.va;
4049 
4050 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ETH,
4051 			       OPCODE_ETH_ACPI_WOL_MAGIC_CONFIG,
4052 			       sizeof(*req), wrb, &cmd);
4053 
4054 	req->hdr.version = 1;
4055 	req->query_options = BE_GET_WOL_CAP;
4056 
4057 	status = be_mbox_notify_wait(adapter);
4058 	if (!status) {
4059 		struct be_cmd_resp_acpi_wol_magic_config_v1 *resp;
4060 
4061 		resp = (struct be_cmd_resp_acpi_wol_magic_config_v1 *)cmd.va;
4062 
4063 		adapter->wol_cap = resp->wol_settings;
4064 
4065 		/* Non-zero macaddr indicates WOL is enabled */
4066 		if (adapter->wol_cap & BE_WOL_CAP &&
4067 		    !is_zero_ether_addr(resp->magic_mac))
4068 			adapter->wol_en = true;
4069 	}
4070 err:
4071 	mutex_unlock(&adapter->mbox_lock);
4072 	if (cmd.va)
4073 		dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va,
4074 				  cmd.dma);
4075 	return status;
4076 
4077 }
4078 
be_cmd_set_fw_log_level(struct be_adapter * adapter,u32 level)4079 int be_cmd_set_fw_log_level(struct be_adapter *adapter, u32 level)
4080 {
4081 	struct be_dma_mem extfat_cmd;
4082 	struct be_fat_conf_params *cfgs;
4083 	int status;
4084 	int i, j;
4085 
4086 	memset(&extfat_cmd, 0, sizeof(struct be_dma_mem));
4087 	extfat_cmd.size = sizeof(struct be_cmd_resp_get_ext_fat_caps);
4088 	extfat_cmd.va = dma_alloc_coherent(&adapter->pdev->dev,
4089 					   extfat_cmd.size, &extfat_cmd.dma,
4090 					   GFP_ATOMIC);
4091 	if (!extfat_cmd.va)
4092 		return -ENOMEM;
4093 
4094 	status = be_cmd_get_ext_fat_capabilites(adapter, &extfat_cmd);
4095 	if (status)
4096 		goto err;
4097 
4098 	cfgs = (struct be_fat_conf_params *)
4099 			(extfat_cmd.va + sizeof(struct be_cmd_resp_hdr));
4100 	for (i = 0; i < le32_to_cpu(cfgs->num_modules); i++) {
4101 		u32 num_modes = le32_to_cpu(cfgs->module[i].num_modes);
4102 
4103 		for (j = 0; j < num_modes; j++) {
4104 			if (cfgs->module[i].trace_lvl[j].mode == MODE_UART)
4105 				cfgs->module[i].trace_lvl[j].dbg_lvl =
4106 							cpu_to_le32(level);
4107 		}
4108 	}
4109 
4110 	status = be_cmd_set_ext_fat_capabilites(adapter, &extfat_cmd, cfgs);
4111 err:
4112 	dma_free_coherent(&adapter->pdev->dev, extfat_cmd.size, extfat_cmd.va,
4113 			  extfat_cmd.dma);
4114 	return status;
4115 }
4116 
be_cmd_get_fw_log_level(struct be_adapter * adapter)4117 int be_cmd_get_fw_log_level(struct be_adapter *adapter)
4118 {
4119 	struct be_dma_mem extfat_cmd;
4120 	struct be_fat_conf_params *cfgs;
4121 	int status, j;
4122 	int level = 0;
4123 
4124 	memset(&extfat_cmd, 0, sizeof(struct be_dma_mem));
4125 	extfat_cmd.size = sizeof(struct be_cmd_resp_get_ext_fat_caps);
4126 	extfat_cmd.va = dma_alloc_coherent(&adapter->pdev->dev,
4127 					   extfat_cmd.size, &extfat_cmd.dma,
4128 					   GFP_ATOMIC);
4129 
4130 	if (!extfat_cmd.va) {
4131 		dev_err(&adapter->pdev->dev, "%s: Memory allocation failure\n",
4132 			__func__);
4133 		goto err;
4134 	}
4135 
4136 	status = be_cmd_get_ext_fat_capabilites(adapter, &extfat_cmd);
4137 	if (!status) {
4138 		cfgs = (struct be_fat_conf_params *)(extfat_cmd.va +
4139 						sizeof(struct be_cmd_resp_hdr));
4140 
4141 		for (j = 0; j < le32_to_cpu(cfgs->module[0].num_modes); j++) {
4142 			if (cfgs->module[0].trace_lvl[j].mode == MODE_UART)
4143 				level = cfgs->module[0].trace_lvl[j].dbg_lvl;
4144 		}
4145 	}
4146 	dma_free_coherent(&adapter->pdev->dev, extfat_cmd.size, extfat_cmd.va,
4147 			  extfat_cmd.dma);
4148 err:
4149 	return level;
4150 }
4151 
be_cmd_get_ext_fat_capabilites(struct be_adapter * adapter,struct be_dma_mem * cmd)4152 int be_cmd_get_ext_fat_capabilites(struct be_adapter *adapter,
4153 				   struct be_dma_mem *cmd)
4154 {
4155 	struct be_mcc_wrb *wrb;
4156 	struct be_cmd_req_get_ext_fat_caps *req;
4157 	int status;
4158 
4159 	if (!be_cmd_allowed(adapter, OPCODE_COMMON_GET_EXT_FAT_CAPABILITIES,
4160 			    CMD_SUBSYSTEM_COMMON))
4161 		return -EPERM;
4162 
4163 	if (mutex_lock_interruptible(&adapter->mbox_lock))
4164 		return -1;
4165 
4166 	wrb = wrb_from_mbox(adapter);
4167 	if (!wrb) {
4168 		status = -EBUSY;
4169 		goto err;
4170 	}
4171 
4172 	req = cmd->va;
4173 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
4174 			       OPCODE_COMMON_GET_EXT_FAT_CAPABILITIES,
4175 			       cmd->size, wrb, cmd);
4176 	req->parameter_type = cpu_to_le32(1);
4177 
4178 	status = be_mbox_notify_wait(adapter);
4179 err:
4180 	mutex_unlock(&adapter->mbox_lock);
4181 	return status;
4182 }
4183 
be_cmd_set_ext_fat_capabilites(struct be_adapter * adapter,struct be_dma_mem * cmd,struct be_fat_conf_params * configs)4184 int be_cmd_set_ext_fat_capabilites(struct be_adapter *adapter,
4185 				   struct be_dma_mem *cmd,
4186 				   struct be_fat_conf_params *configs)
4187 {
4188 	struct be_mcc_wrb *wrb;
4189 	struct be_cmd_req_set_ext_fat_caps *req;
4190 	int status;
4191 
4192 	mutex_lock(&adapter->mcc_lock);
4193 
4194 	wrb = wrb_from_mccq(adapter);
4195 	if (!wrb) {
4196 		status = -EBUSY;
4197 		goto err;
4198 	}
4199 
4200 	req = cmd->va;
4201 	memcpy(&req->set_params, configs, sizeof(struct be_fat_conf_params));
4202 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
4203 			       OPCODE_COMMON_SET_EXT_FAT_CAPABILITIES,
4204 			       cmd->size, wrb, cmd);
4205 
4206 	status = be_mcc_notify_wait(adapter);
4207 err:
4208 	mutex_unlock(&adapter->mcc_lock);
4209 	return status;
4210 }
4211 
be_cmd_query_port_name(struct be_adapter * adapter)4212 int be_cmd_query_port_name(struct be_adapter *adapter)
4213 {
4214 	struct be_cmd_req_get_port_name *req;
4215 	struct be_mcc_wrb *wrb;
4216 	int status;
4217 
4218 	if (mutex_lock_interruptible(&adapter->mbox_lock))
4219 		return -1;
4220 
4221 	wrb = wrb_from_mbox(adapter);
4222 	req = embedded_payload(wrb);
4223 
4224 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
4225 			       OPCODE_COMMON_GET_PORT_NAME, sizeof(*req), wrb,
4226 			       NULL);
4227 	if (!BEx_chip(adapter))
4228 		req->hdr.version = 1;
4229 
4230 	status = be_mbox_notify_wait(adapter);
4231 	if (!status) {
4232 		struct be_cmd_resp_get_port_name *resp = embedded_payload(wrb);
4233 
4234 		adapter->port_name = resp->port_name[adapter->hba_port_num];
4235 	} else {
4236 		adapter->port_name = adapter->hba_port_num + '0';
4237 	}
4238 
4239 	mutex_unlock(&adapter->mbox_lock);
4240 	return status;
4241 }
4242 
4243 /* When more than 1 NIC descriptor is present in the descriptor list,
4244  * the caller must specify the pf_num to obtain the NIC descriptor
4245  * corresponding to its pci function.
4246  * get_vft must be true when the caller wants the VF-template desc of the
4247  * PF-pool.
4248  * The pf_num should be set to PF_NUM_IGNORE when the caller knows
4249  * that only it's NIC descriptor is present in the descriptor list.
4250  */
be_get_nic_desc(u8 * buf,u32 desc_count,bool get_vft,u8 pf_num)4251 static struct be_nic_res_desc *be_get_nic_desc(u8 *buf, u32 desc_count,
4252 					       bool get_vft, u8 pf_num)
4253 {
4254 	struct be_res_desc_hdr *hdr = (struct be_res_desc_hdr *)buf;
4255 	struct be_nic_res_desc *nic;
4256 	int i;
4257 
4258 	for (i = 0; i < desc_count; i++) {
4259 		if (hdr->desc_type == NIC_RESOURCE_DESC_TYPE_V0 ||
4260 		    hdr->desc_type == NIC_RESOURCE_DESC_TYPE_V1) {
4261 			nic = (struct be_nic_res_desc *)hdr;
4262 
4263 			if ((pf_num == PF_NUM_IGNORE ||
4264 			     nic->pf_num == pf_num) &&
4265 			    (!get_vft || nic->flags & BIT(VFT_SHIFT)))
4266 				return nic;
4267 		}
4268 		hdr->desc_len = hdr->desc_len ? : RESOURCE_DESC_SIZE_V0;
4269 		hdr = (void *)hdr + hdr->desc_len;
4270 	}
4271 	return NULL;
4272 }
4273 
be_get_vft_desc(u8 * buf,u32 desc_count,u8 pf_num)4274 static struct be_nic_res_desc *be_get_vft_desc(u8 *buf, u32 desc_count,
4275 					       u8 pf_num)
4276 {
4277 	return be_get_nic_desc(buf, desc_count, true, pf_num);
4278 }
4279 
be_get_func_nic_desc(u8 * buf,u32 desc_count,u8 pf_num)4280 static struct be_nic_res_desc *be_get_func_nic_desc(u8 *buf, u32 desc_count,
4281 						    u8 pf_num)
4282 {
4283 	return be_get_nic_desc(buf, desc_count, false, pf_num);
4284 }
4285 
be_get_pcie_desc(u8 * buf,u32 desc_count,u8 pf_num)4286 static struct be_pcie_res_desc *be_get_pcie_desc(u8 *buf, u32 desc_count,
4287 						 u8 pf_num)
4288 {
4289 	struct be_res_desc_hdr *hdr = (struct be_res_desc_hdr *)buf;
4290 	struct be_pcie_res_desc *pcie;
4291 	int i;
4292 
4293 	for (i = 0; i < desc_count; i++) {
4294 		if (hdr->desc_type == PCIE_RESOURCE_DESC_TYPE_V0 ||
4295 		    hdr->desc_type == PCIE_RESOURCE_DESC_TYPE_V1) {
4296 			pcie = (struct be_pcie_res_desc *)hdr;
4297 			if (pcie->pf_num == pf_num)
4298 				return pcie;
4299 		}
4300 
4301 		hdr->desc_len = hdr->desc_len ? : RESOURCE_DESC_SIZE_V0;
4302 		hdr = (void *)hdr + hdr->desc_len;
4303 	}
4304 	return NULL;
4305 }
4306 
be_get_port_desc(u8 * buf,u32 desc_count)4307 static struct be_port_res_desc *be_get_port_desc(u8 *buf, u32 desc_count)
4308 {
4309 	struct be_res_desc_hdr *hdr = (struct be_res_desc_hdr *)buf;
4310 	int i;
4311 
4312 	for (i = 0; i < desc_count; i++) {
4313 		if (hdr->desc_type == PORT_RESOURCE_DESC_TYPE_V1)
4314 			return (struct be_port_res_desc *)hdr;
4315 
4316 		hdr->desc_len = hdr->desc_len ? : RESOURCE_DESC_SIZE_V0;
4317 		hdr = (void *)hdr + hdr->desc_len;
4318 	}
4319 	return NULL;
4320 }
4321 
be_copy_nic_desc(struct be_resources * res,struct be_nic_res_desc * desc)4322 static void be_copy_nic_desc(struct be_resources *res,
4323 			     struct be_nic_res_desc *desc)
4324 {
4325 	res->max_uc_mac = le16_to_cpu(desc->unicast_mac_count);
4326 	res->max_vlans = le16_to_cpu(desc->vlan_count);
4327 	res->max_mcast_mac = le16_to_cpu(desc->mcast_mac_count);
4328 	res->max_tx_qs = le16_to_cpu(desc->txq_count);
4329 	res->max_rss_qs = le16_to_cpu(desc->rssq_count);
4330 	res->max_rx_qs = le16_to_cpu(desc->rq_count);
4331 	res->max_evt_qs = le16_to_cpu(desc->eq_count);
4332 	res->max_cq_count = le16_to_cpu(desc->cq_count);
4333 	res->max_iface_count = le16_to_cpu(desc->iface_count);
4334 	res->max_mcc_count = le16_to_cpu(desc->mcc_count);
4335 	/* Clear flags that driver is not interested in */
4336 	res->if_cap_flags = le32_to_cpu(desc->cap_flags) &
4337 				BE_IF_CAP_FLAGS_WANT;
4338 }
4339 
4340 /* Uses Mbox */
be_cmd_get_func_config(struct be_adapter * adapter,struct be_resources * res)4341 int be_cmd_get_func_config(struct be_adapter *adapter, struct be_resources *res)
4342 {
4343 	struct be_mcc_wrb *wrb;
4344 	struct be_cmd_req_get_func_config *req;
4345 	int status;
4346 	struct be_dma_mem cmd;
4347 
4348 	if (mutex_lock_interruptible(&adapter->mbox_lock))
4349 		return -1;
4350 
4351 	memset(&cmd, 0, sizeof(struct be_dma_mem));
4352 	cmd.size = sizeof(struct be_cmd_resp_get_func_config);
4353 	cmd.va = dma_alloc_coherent(&adapter->pdev->dev, cmd.size, &cmd.dma,
4354 				    GFP_ATOMIC);
4355 	if (!cmd.va) {
4356 		dev_err(&adapter->pdev->dev, "Memory alloc failure\n");
4357 		status = -ENOMEM;
4358 		goto err;
4359 	}
4360 
4361 	wrb = wrb_from_mbox(adapter);
4362 	if (!wrb) {
4363 		status = -EBUSY;
4364 		goto err;
4365 	}
4366 
4367 	req = cmd.va;
4368 
4369 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
4370 			       OPCODE_COMMON_GET_FUNC_CONFIG,
4371 			       cmd.size, wrb, &cmd);
4372 
4373 	if (skyhawk_chip(adapter))
4374 		req->hdr.version = 1;
4375 
4376 	status = be_mbox_notify_wait(adapter);
4377 	if (!status) {
4378 		struct be_cmd_resp_get_func_config *resp = cmd.va;
4379 		u32 desc_count = le32_to_cpu(resp->desc_count);
4380 		struct be_nic_res_desc *desc;
4381 
4382 		/* GET_FUNC_CONFIG returns resource descriptors of the
4383 		 * current function only. So, pf_num should be set to
4384 		 * PF_NUM_IGNORE.
4385 		 */
4386 		desc = be_get_func_nic_desc(resp->func_param, desc_count,
4387 					    PF_NUM_IGNORE);
4388 		if (!desc) {
4389 			status = -EINVAL;
4390 			goto err;
4391 		}
4392 
4393 		/* Store pf_num & vf_num for later use in GET_PROFILE_CONFIG */
4394 		adapter->pf_num = desc->pf_num;
4395 		adapter->vf_num = desc->vf_num;
4396 
4397 		if (res)
4398 			be_copy_nic_desc(res, desc);
4399 	}
4400 err:
4401 	mutex_unlock(&adapter->mbox_lock);
4402 	if (cmd.va)
4403 		dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va,
4404 				  cmd.dma);
4405 	return status;
4406 }
4407 
4408 /* This routine returns a list of all the NIC PF_nums in the adapter */
be_get_nic_pf_num_list(u8 * buf,u32 desc_count,u16 * nic_pf_nums)4409 static u16 be_get_nic_pf_num_list(u8 *buf, u32 desc_count, u16 *nic_pf_nums)
4410 {
4411 	struct be_res_desc_hdr *hdr = (struct be_res_desc_hdr *)buf;
4412 	struct be_pcie_res_desc *pcie = NULL;
4413 	int i;
4414 	u16 nic_pf_count = 0;
4415 
4416 	for (i = 0; i < desc_count; i++) {
4417 		if (hdr->desc_type == PCIE_RESOURCE_DESC_TYPE_V0 ||
4418 		    hdr->desc_type == PCIE_RESOURCE_DESC_TYPE_V1) {
4419 			pcie = (struct be_pcie_res_desc *)hdr;
4420 			if (pcie->pf_state && (pcie->pf_type == MISSION_NIC ||
4421 					       pcie->pf_type == MISSION_RDMA)) {
4422 				nic_pf_nums[nic_pf_count++] = pcie->pf_num;
4423 			}
4424 		}
4425 
4426 		hdr->desc_len = hdr->desc_len ? : RESOURCE_DESC_SIZE_V0;
4427 		hdr = (void *)hdr + hdr->desc_len;
4428 	}
4429 	return nic_pf_count;
4430 }
4431 
4432 /* Will use MBOX only if MCCQ has not been created */
be_cmd_get_profile_config(struct be_adapter * adapter,struct be_resources * res,struct be_port_resources * port_res,u8 profile_type,u8 query,u8 domain)4433 int be_cmd_get_profile_config(struct be_adapter *adapter,
4434 			      struct be_resources *res,
4435 			      struct be_port_resources *port_res,
4436 			      u8 profile_type, u8 query, u8 domain)
4437 {
4438 	struct be_cmd_resp_get_profile_config *resp;
4439 	struct be_cmd_req_get_profile_config *req;
4440 	struct be_nic_res_desc *vf_res;
4441 	struct be_pcie_res_desc *pcie;
4442 	struct be_port_res_desc *port;
4443 	struct be_nic_res_desc *nic;
4444 	struct be_mcc_wrb wrb = {0};
4445 	struct be_dma_mem cmd;
4446 	u16 desc_count;
4447 	int status;
4448 
4449 	memset(&cmd, 0, sizeof(struct be_dma_mem));
4450 	cmd.size = sizeof(struct be_cmd_resp_get_profile_config);
4451 	cmd.va = dma_alloc_coherent(&adapter->pdev->dev, cmd.size, &cmd.dma,
4452 				    GFP_ATOMIC);
4453 	if (!cmd.va)
4454 		return -ENOMEM;
4455 
4456 	req = cmd.va;
4457 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
4458 			       OPCODE_COMMON_GET_PROFILE_CONFIG,
4459 			       cmd.size, &wrb, &cmd);
4460 
4461 	if (!lancer_chip(adapter))
4462 		req->hdr.version = 1;
4463 	req->type = profile_type;
4464 	req->hdr.domain = domain;
4465 
4466 	/* When QUERY_MODIFIABLE_FIELDS_TYPE bit is set, cmd returns the
4467 	 * descriptors with all bits set to "1" for the fields which can be
4468 	 * modified using SET_PROFILE_CONFIG cmd.
4469 	 */
4470 	if (query == RESOURCE_MODIFIABLE)
4471 		req->type |= QUERY_MODIFIABLE_FIELDS_TYPE;
4472 
4473 	status = be_cmd_notify_wait(adapter, &wrb);
4474 	if (status)
4475 		goto err;
4476 
4477 	resp = cmd.va;
4478 	desc_count = le16_to_cpu(resp->desc_count);
4479 
4480 	if (port_res) {
4481 		u16 nic_pf_cnt = 0, i;
4482 		u16 nic_pf_num_list[MAX_NIC_FUNCS];
4483 
4484 		nic_pf_cnt = be_get_nic_pf_num_list(resp->func_param,
4485 						    desc_count,
4486 						    nic_pf_num_list);
4487 
4488 		for (i = 0; i < nic_pf_cnt; i++) {
4489 			nic = be_get_func_nic_desc(resp->func_param, desc_count,
4490 						   nic_pf_num_list[i]);
4491 			if (nic->link_param == adapter->port_num) {
4492 				port_res->nic_pfs++;
4493 				pcie = be_get_pcie_desc(resp->func_param,
4494 							desc_count,
4495 							nic_pf_num_list[i]);
4496 				port_res->max_vfs += le16_to_cpu(pcie->num_vfs);
4497 			}
4498 		}
4499 		goto err;
4500 	}
4501 
4502 	pcie = be_get_pcie_desc(resp->func_param, desc_count,
4503 				adapter->pf_num);
4504 	if (pcie)
4505 		res->max_vfs = le16_to_cpu(pcie->num_vfs);
4506 
4507 	port = be_get_port_desc(resp->func_param, desc_count);
4508 	if (port)
4509 		adapter->mc_type = port->mc_type;
4510 
4511 	nic = be_get_func_nic_desc(resp->func_param, desc_count,
4512 				   adapter->pf_num);
4513 	if (nic)
4514 		be_copy_nic_desc(res, nic);
4515 
4516 	vf_res = be_get_vft_desc(resp->func_param, desc_count,
4517 				 adapter->pf_num);
4518 	if (vf_res)
4519 		res->vf_if_cap_flags = vf_res->cap_flags;
4520 err:
4521 	if (cmd.va)
4522 		dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va,
4523 				  cmd.dma);
4524 	return status;
4525 }
4526 
4527 /* Will use MBOX only if MCCQ has not been created */
be_cmd_set_profile_config(struct be_adapter * adapter,void * desc,int size,int count,u8 version,u8 domain)4528 static int be_cmd_set_profile_config(struct be_adapter *adapter, void *desc,
4529 				     int size, int count, u8 version, u8 domain)
4530 {
4531 	struct be_cmd_req_set_profile_config *req;
4532 	struct be_mcc_wrb wrb = {0};
4533 	struct be_dma_mem cmd;
4534 	int status;
4535 
4536 	memset(&cmd, 0, sizeof(struct be_dma_mem));
4537 	cmd.size = sizeof(struct be_cmd_req_set_profile_config);
4538 	cmd.va = dma_alloc_coherent(&adapter->pdev->dev, cmd.size, &cmd.dma,
4539 				    GFP_ATOMIC);
4540 	if (!cmd.va)
4541 		return -ENOMEM;
4542 
4543 	req = cmd.va;
4544 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
4545 			       OPCODE_COMMON_SET_PROFILE_CONFIG, cmd.size,
4546 			       &wrb, &cmd);
4547 	req->hdr.version = version;
4548 	req->hdr.domain = domain;
4549 	req->desc_count = cpu_to_le32(count);
4550 	memcpy(req->desc, desc, size);
4551 
4552 	status = be_cmd_notify_wait(adapter, &wrb);
4553 
4554 	if (cmd.va)
4555 		dma_free_coherent(&adapter->pdev->dev, cmd.size, cmd.va,
4556 				  cmd.dma);
4557 	return status;
4558 }
4559 
4560 /* Mark all fields invalid */
be_reset_nic_desc(struct be_nic_res_desc * nic)4561 static void be_reset_nic_desc(struct be_nic_res_desc *nic)
4562 {
4563 	memset(nic, 0, sizeof(*nic));
4564 	nic->unicast_mac_count = 0xFFFF;
4565 	nic->mcc_count = 0xFFFF;
4566 	nic->vlan_count = 0xFFFF;
4567 	nic->mcast_mac_count = 0xFFFF;
4568 	nic->txq_count = 0xFFFF;
4569 	nic->rq_count = 0xFFFF;
4570 	nic->rssq_count = 0xFFFF;
4571 	nic->lro_count = 0xFFFF;
4572 	nic->cq_count = 0xFFFF;
4573 	nic->toe_conn_count = 0xFFFF;
4574 	nic->eq_count = 0xFFFF;
4575 	nic->iface_count = 0xFFFF;
4576 	nic->link_param = 0xFF;
4577 	nic->channel_id_param = cpu_to_le16(0xF000);
4578 	nic->acpi_params = 0xFF;
4579 	nic->wol_param = 0x0F;
4580 	nic->tunnel_iface_count = 0xFFFF;
4581 	nic->direct_tenant_iface_count = 0xFFFF;
4582 	nic->bw_min = 0xFFFFFFFF;
4583 	nic->bw_max = 0xFFFFFFFF;
4584 }
4585 
4586 /* Mark all fields invalid */
be_reset_pcie_desc(struct be_pcie_res_desc * pcie)4587 static void be_reset_pcie_desc(struct be_pcie_res_desc *pcie)
4588 {
4589 	memset(pcie, 0, sizeof(*pcie));
4590 	pcie->sriov_state = 0xFF;
4591 	pcie->pf_state = 0xFF;
4592 	pcie->pf_type = 0xFF;
4593 	pcie->num_vfs = 0xFFFF;
4594 }
4595 
be_cmd_config_qos(struct be_adapter * adapter,u32 max_rate,u16 link_speed,u8 domain)4596 int be_cmd_config_qos(struct be_adapter *adapter, u32 max_rate, u16 link_speed,
4597 		      u8 domain)
4598 {
4599 	struct be_nic_res_desc nic_desc;
4600 	u32 bw_percent;
4601 	u16 version = 0;
4602 
4603 	if (BE3_chip(adapter))
4604 		return be_cmd_set_qos(adapter, max_rate / 10, domain);
4605 
4606 	be_reset_nic_desc(&nic_desc);
4607 	nic_desc.pf_num = adapter->pf_num;
4608 	nic_desc.vf_num = domain;
4609 	nic_desc.bw_min = 0;
4610 	if (lancer_chip(adapter)) {
4611 		nic_desc.hdr.desc_type = NIC_RESOURCE_DESC_TYPE_V0;
4612 		nic_desc.hdr.desc_len = RESOURCE_DESC_SIZE_V0;
4613 		nic_desc.flags = (1 << QUN_SHIFT) | (1 << IMM_SHIFT) |
4614 					(1 << NOSV_SHIFT);
4615 		nic_desc.bw_max = cpu_to_le32(max_rate / 10);
4616 	} else {
4617 		version = 1;
4618 		nic_desc.hdr.desc_type = NIC_RESOURCE_DESC_TYPE_V1;
4619 		nic_desc.hdr.desc_len = RESOURCE_DESC_SIZE_V1;
4620 		nic_desc.flags = (1 << IMM_SHIFT) | (1 << NOSV_SHIFT);
4621 		bw_percent = max_rate ? (max_rate * 100) / link_speed : 100;
4622 		nic_desc.bw_max = cpu_to_le32(bw_percent);
4623 	}
4624 
4625 	return be_cmd_set_profile_config(adapter, &nic_desc,
4626 					 nic_desc.hdr.desc_len,
4627 					 1, version, domain);
4628 }
4629 
be_cmd_set_sriov_config(struct be_adapter * adapter,struct be_resources pool_res,u16 num_vfs,struct be_resources * vft_res)4630 int be_cmd_set_sriov_config(struct be_adapter *adapter,
4631 			    struct be_resources pool_res, u16 num_vfs,
4632 			    struct be_resources *vft_res)
4633 {
4634 	struct {
4635 		struct be_pcie_res_desc pcie;
4636 		struct be_nic_res_desc nic_vft;
4637 	} __packed desc;
4638 
4639 	/* PF PCIE descriptor */
4640 	be_reset_pcie_desc(&desc.pcie);
4641 	desc.pcie.hdr.desc_type = PCIE_RESOURCE_DESC_TYPE_V1;
4642 	desc.pcie.hdr.desc_len = RESOURCE_DESC_SIZE_V1;
4643 	desc.pcie.flags = BIT(IMM_SHIFT) | BIT(NOSV_SHIFT);
4644 	desc.pcie.pf_num = adapter->pdev->devfn;
4645 	desc.pcie.sriov_state = num_vfs ? 1 : 0;
4646 	desc.pcie.num_vfs = cpu_to_le16(num_vfs);
4647 
4648 	/* VF NIC Template descriptor */
4649 	be_reset_nic_desc(&desc.nic_vft);
4650 	desc.nic_vft.hdr.desc_type = NIC_RESOURCE_DESC_TYPE_V1;
4651 	desc.nic_vft.hdr.desc_len = RESOURCE_DESC_SIZE_V1;
4652 	desc.nic_vft.flags = vft_res->flags | BIT(VFT_SHIFT) |
4653 			     BIT(IMM_SHIFT) | BIT(NOSV_SHIFT);
4654 	desc.nic_vft.pf_num = adapter->pdev->devfn;
4655 	desc.nic_vft.vf_num = 0;
4656 	desc.nic_vft.cap_flags = cpu_to_le32(vft_res->vf_if_cap_flags);
4657 	desc.nic_vft.rq_count = cpu_to_le16(vft_res->max_rx_qs);
4658 	desc.nic_vft.txq_count = cpu_to_le16(vft_res->max_tx_qs);
4659 	desc.nic_vft.rssq_count = cpu_to_le16(vft_res->max_rss_qs);
4660 	desc.nic_vft.cq_count = cpu_to_le16(vft_res->max_cq_count);
4661 
4662 	if (vft_res->max_uc_mac)
4663 		desc.nic_vft.unicast_mac_count =
4664 					cpu_to_le16(vft_res->max_uc_mac);
4665 	if (vft_res->max_vlans)
4666 		desc.nic_vft.vlan_count = cpu_to_le16(vft_res->max_vlans);
4667 	if (vft_res->max_iface_count)
4668 		desc.nic_vft.iface_count =
4669 				cpu_to_le16(vft_res->max_iface_count);
4670 	if (vft_res->max_mcc_count)
4671 		desc.nic_vft.mcc_count = cpu_to_le16(vft_res->max_mcc_count);
4672 
4673 	return be_cmd_set_profile_config(adapter, &desc,
4674 					 2 * RESOURCE_DESC_SIZE_V1, 2, 1, 0);
4675 }
4676 
be_cmd_manage_iface(struct be_adapter * adapter,u32 iface,u8 op)4677 int be_cmd_manage_iface(struct be_adapter *adapter, u32 iface, u8 op)
4678 {
4679 	struct be_mcc_wrb *wrb;
4680 	struct be_cmd_req_manage_iface_filters *req;
4681 	int status;
4682 
4683 	if (iface == 0xFFFFFFFF)
4684 		return -1;
4685 
4686 	mutex_lock(&adapter->mcc_lock);
4687 
4688 	wrb = wrb_from_mccq(adapter);
4689 	if (!wrb) {
4690 		status = -EBUSY;
4691 		goto err;
4692 	}
4693 	req = embedded_payload(wrb);
4694 
4695 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
4696 			       OPCODE_COMMON_MANAGE_IFACE_FILTERS, sizeof(*req),
4697 			       wrb, NULL);
4698 	req->op = op;
4699 	req->target_iface_id = cpu_to_le32(iface);
4700 
4701 	status = be_mcc_notify_wait(adapter);
4702 err:
4703 	mutex_unlock(&adapter->mcc_lock);
4704 	return status;
4705 }
4706 
be_cmd_set_vxlan_port(struct be_adapter * adapter,__be16 port)4707 int be_cmd_set_vxlan_port(struct be_adapter *adapter, __be16 port)
4708 {
4709 	struct be_port_res_desc port_desc;
4710 
4711 	memset(&port_desc, 0, sizeof(port_desc));
4712 	port_desc.hdr.desc_type = PORT_RESOURCE_DESC_TYPE_V1;
4713 	port_desc.hdr.desc_len = RESOURCE_DESC_SIZE_V1;
4714 	port_desc.flags = (1 << IMM_SHIFT) | (1 << NOSV_SHIFT);
4715 	port_desc.link_num = adapter->hba_port_num;
4716 	if (port) {
4717 		port_desc.nv_flags = NV_TYPE_VXLAN | (1 << SOCVID_SHIFT) |
4718 					(1 << RCVID_SHIFT);
4719 		port_desc.nv_port = swab16(port);
4720 	} else {
4721 		port_desc.nv_flags = NV_TYPE_DISABLED;
4722 		port_desc.nv_port = 0;
4723 	}
4724 
4725 	return be_cmd_set_profile_config(adapter, &port_desc,
4726 					 RESOURCE_DESC_SIZE_V1, 1, 1, 0);
4727 }
4728 
be_cmd_get_if_id(struct be_adapter * adapter,struct be_vf_cfg * vf_cfg,int vf_num)4729 int be_cmd_get_if_id(struct be_adapter *adapter, struct be_vf_cfg *vf_cfg,
4730 		     int vf_num)
4731 {
4732 	struct be_mcc_wrb *wrb;
4733 	struct be_cmd_req_get_iface_list *req;
4734 	struct be_cmd_resp_get_iface_list *resp;
4735 	int status;
4736 
4737 	mutex_lock(&adapter->mcc_lock);
4738 
4739 	wrb = wrb_from_mccq(adapter);
4740 	if (!wrb) {
4741 		status = -EBUSY;
4742 		goto err;
4743 	}
4744 	req = embedded_payload(wrb);
4745 
4746 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
4747 			       OPCODE_COMMON_GET_IFACE_LIST, sizeof(*resp),
4748 			       wrb, NULL);
4749 	req->hdr.domain = vf_num + 1;
4750 
4751 	status = be_mcc_notify_wait(adapter);
4752 	if (!status) {
4753 		resp = (struct be_cmd_resp_get_iface_list *)req;
4754 		vf_cfg->if_handle = le32_to_cpu(resp->if_desc.if_id);
4755 	}
4756 
4757 err:
4758 	mutex_unlock(&adapter->mcc_lock);
4759 	return status;
4760 }
4761 
lancer_wait_idle(struct be_adapter * adapter)4762 static int lancer_wait_idle(struct be_adapter *adapter)
4763 {
4764 #define SLIPORT_IDLE_TIMEOUT 30
4765 	u32 reg_val;
4766 	int status = 0, i;
4767 
4768 	for (i = 0; i < SLIPORT_IDLE_TIMEOUT; i++) {
4769 		reg_val = ioread32(adapter->db + PHYSDEV_CONTROL_OFFSET);
4770 		if ((reg_val & PHYSDEV_CONTROL_INP_MASK) == 0)
4771 			break;
4772 
4773 		ssleep(1);
4774 	}
4775 
4776 	if (i == SLIPORT_IDLE_TIMEOUT)
4777 		status = -1;
4778 
4779 	return status;
4780 }
4781 
lancer_physdev_ctrl(struct be_adapter * adapter,u32 mask)4782 int lancer_physdev_ctrl(struct be_adapter *adapter, u32 mask)
4783 {
4784 	int status = 0;
4785 
4786 	status = lancer_wait_idle(adapter);
4787 	if (status)
4788 		return status;
4789 
4790 	iowrite32(mask, adapter->db + PHYSDEV_CONTROL_OFFSET);
4791 
4792 	return status;
4793 }
4794 
4795 /* Routine to check whether dump image is present or not */
dump_present(struct be_adapter * adapter)4796 bool dump_present(struct be_adapter *adapter)
4797 {
4798 	u32 sliport_status = 0;
4799 
4800 	sliport_status = ioread32(adapter->db + SLIPORT_STATUS_OFFSET);
4801 	return !!(sliport_status & SLIPORT_STATUS_DIP_MASK);
4802 }
4803 
lancer_initiate_dump(struct be_adapter * adapter)4804 int lancer_initiate_dump(struct be_adapter *adapter)
4805 {
4806 	struct device *dev = &adapter->pdev->dev;
4807 	int status;
4808 
4809 	if (dump_present(adapter)) {
4810 		dev_info(dev, "Previous dump not cleared, not forcing dump\n");
4811 		return -EEXIST;
4812 	}
4813 
4814 	/* give firmware reset and diagnostic dump */
4815 	status = lancer_physdev_ctrl(adapter, PHYSDEV_CONTROL_FW_RESET_MASK |
4816 				     PHYSDEV_CONTROL_DD_MASK);
4817 	if (status < 0) {
4818 		dev_err(dev, "FW reset failed\n");
4819 		return status;
4820 	}
4821 
4822 	status = lancer_wait_idle(adapter);
4823 	if (status)
4824 		return status;
4825 
4826 	if (!dump_present(adapter)) {
4827 		dev_err(dev, "FW dump not generated\n");
4828 		return -EIO;
4829 	}
4830 
4831 	return 0;
4832 }
4833 
lancer_delete_dump(struct be_adapter * adapter)4834 int lancer_delete_dump(struct be_adapter *adapter)
4835 {
4836 	int status;
4837 
4838 	status = lancer_cmd_delete_object(adapter, LANCER_FW_DUMP_FILE);
4839 	return be_cmd_status(status);
4840 }
4841 
4842 /* Uses sync mcc */
be_cmd_enable_vf(struct be_adapter * adapter,u8 domain)4843 int be_cmd_enable_vf(struct be_adapter *adapter, u8 domain)
4844 {
4845 	struct be_mcc_wrb *wrb;
4846 	struct be_cmd_enable_disable_vf *req;
4847 	int status;
4848 
4849 	if (BEx_chip(adapter))
4850 		return 0;
4851 
4852 	mutex_lock(&adapter->mcc_lock);
4853 
4854 	wrb = wrb_from_mccq(adapter);
4855 	if (!wrb) {
4856 		status = -EBUSY;
4857 		goto err;
4858 	}
4859 
4860 	req = embedded_payload(wrb);
4861 
4862 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
4863 			       OPCODE_COMMON_ENABLE_DISABLE_VF, sizeof(*req),
4864 			       wrb, NULL);
4865 
4866 	req->hdr.domain = domain;
4867 	req->enable = 1;
4868 	status = be_mcc_notify_wait(adapter);
4869 err:
4870 	mutex_unlock(&adapter->mcc_lock);
4871 	return status;
4872 }
4873 
be_cmd_intr_set(struct be_adapter * adapter,bool intr_enable)4874 int be_cmd_intr_set(struct be_adapter *adapter, bool intr_enable)
4875 {
4876 	struct be_mcc_wrb *wrb;
4877 	struct be_cmd_req_intr_set *req;
4878 	int status;
4879 
4880 	if (mutex_lock_interruptible(&adapter->mbox_lock))
4881 		return -1;
4882 
4883 	wrb = wrb_from_mbox(adapter);
4884 
4885 	req = embedded_payload(wrb);
4886 
4887 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
4888 			       OPCODE_COMMON_SET_INTERRUPT_ENABLE, sizeof(*req),
4889 			       wrb, NULL);
4890 
4891 	req->intr_enabled = intr_enable;
4892 
4893 	status = be_mbox_notify_wait(adapter);
4894 
4895 	mutex_unlock(&adapter->mbox_lock);
4896 	return status;
4897 }
4898 
4899 /* Uses MBOX */
be_cmd_get_active_profile(struct be_adapter * adapter,u16 * profile_id)4900 int be_cmd_get_active_profile(struct be_adapter *adapter, u16 *profile_id)
4901 {
4902 	struct be_cmd_req_get_active_profile *req;
4903 	struct be_mcc_wrb *wrb;
4904 	int status;
4905 
4906 	if (mutex_lock_interruptible(&adapter->mbox_lock))
4907 		return -1;
4908 
4909 	wrb = wrb_from_mbox(adapter);
4910 	if (!wrb) {
4911 		status = -EBUSY;
4912 		goto err;
4913 	}
4914 
4915 	req = embedded_payload(wrb);
4916 
4917 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
4918 			       OPCODE_COMMON_GET_ACTIVE_PROFILE, sizeof(*req),
4919 			       wrb, NULL);
4920 
4921 	status = be_mbox_notify_wait(adapter);
4922 	if (!status) {
4923 		struct be_cmd_resp_get_active_profile *resp =
4924 							embedded_payload(wrb);
4925 
4926 		*profile_id = le16_to_cpu(resp->active_profile_id);
4927 	}
4928 
4929 err:
4930 	mutex_unlock(&adapter->mbox_lock);
4931 	return status;
4932 }
4933 
4934 static int
__be_cmd_set_logical_link_config(struct be_adapter * adapter,int link_state,int version,u8 domain)4935 __be_cmd_set_logical_link_config(struct be_adapter *adapter,
4936 				 int link_state, int version, u8 domain)
4937 {
4938 	struct be_cmd_req_set_ll_link *req;
4939 	struct be_mcc_wrb *wrb;
4940 	u32 link_config = 0;
4941 	int status;
4942 
4943 	mutex_lock(&adapter->mcc_lock);
4944 
4945 	wrb = wrb_from_mccq(adapter);
4946 	if (!wrb) {
4947 		status = -EBUSY;
4948 		goto err;
4949 	}
4950 
4951 	req = embedded_payload(wrb);
4952 
4953 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
4954 			       OPCODE_COMMON_SET_LOGICAL_LINK_CONFIG,
4955 			       sizeof(*req), wrb, NULL);
4956 
4957 	req->hdr.version = version;
4958 	req->hdr.domain = domain;
4959 
4960 	if (link_state == IFLA_VF_LINK_STATE_ENABLE ||
4961 	    link_state == IFLA_VF_LINK_STATE_AUTO)
4962 		link_config |= PLINK_ENABLE;
4963 
4964 	if (link_state == IFLA_VF_LINK_STATE_AUTO)
4965 		link_config |= PLINK_TRACK;
4966 
4967 	req->link_config = cpu_to_le32(link_config);
4968 
4969 	status = be_mcc_notify_wait(adapter);
4970 err:
4971 	mutex_unlock(&adapter->mcc_lock);
4972 	return status;
4973 }
4974 
be_cmd_set_logical_link_config(struct be_adapter * adapter,int link_state,u8 domain)4975 int be_cmd_set_logical_link_config(struct be_adapter *adapter,
4976 				   int link_state, u8 domain)
4977 {
4978 	int status;
4979 
4980 	if (BE2_chip(adapter))
4981 		return -EOPNOTSUPP;
4982 
4983 	status = __be_cmd_set_logical_link_config(adapter, link_state,
4984 						  2, domain);
4985 
4986 	/* Version 2 of the command will not be recognized by older FW.
4987 	 * On such a failure issue version 1 of the command.
4988 	 */
4989 	if (base_status(status) == MCC_STATUS_ILLEGAL_REQUEST)
4990 		status = __be_cmd_set_logical_link_config(adapter, link_state,
4991 							  1, domain);
4992 	return status;
4993 }
4994 
be_cmd_set_features(struct be_adapter * adapter)4995 int be_cmd_set_features(struct be_adapter *adapter)
4996 {
4997 	struct be_cmd_resp_set_features *resp;
4998 	struct be_cmd_req_set_features *req;
4999 	struct be_mcc_wrb *wrb;
5000 	int status;
5001 
5002 	if (mutex_lock_interruptible(&adapter->mcc_lock))
5003 		return -1;
5004 
5005 	wrb = wrb_from_mccq(adapter);
5006 	if (!wrb) {
5007 		status = -EBUSY;
5008 		goto err;
5009 	}
5010 
5011 	req = embedded_payload(wrb);
5012 
5013 	be_wrb_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
5014 			       OPCODE_COMMON_SET_FEATURES,
5015 			       sizeof(*req), wrb, NULL);
5016 
5017 	req->features = cpu_to_le32(BE_FEATURE_UE_RECOVERY);
5018 	req->parameter_len = cpu_to_le32(sizeof(struct be_req_ue_recovery));
5019 	req->parameter.req.uer = cpu_to_le32(BE_UE_RECOVERY_UER_MASK);
5020 
5021 	status = be_mcc_notify_wait(adapter);
5022 	if (status)
5023 		goto err;
5024 
5025 	resp = embedded_payload(wrb);
5026 
5027 	adapter->error_recovery.ue_to_poll_time =
5028 		le16_to_cpu(resp->parameter.resp.ue2rp);
5029 	adapter->error_recovery.ue_to_reset_time =
5030 		le16_to_cpu(resp->parameter.resp.ue2sr);
5031 	adapter->error_recovery.recovery_supported = true;
5032 err:
5033 	/* Checking "MCC_STATUS_INVALID_LENGTH" for SKH as FW
5034 	 * returns this error in older firmware versions
5035 	 */
5036 	if (base_status(status) == MCC_STATUS_ILLEGAL_REQUEST ||
5037 	    base_status(status) == MCC_STATUS_INVALID_LENGTH)
5038 		dev_info(&adapter->pdev->dev,
5039 			 "Adapter does not support HW error recovery\n");
5040 
5041 	mutex_unlock(&adapter->mcc_lock);
5042 	return status;
5043 }
5044 
be_roce_mcc_cmd(void * netdev_handle,void * wrb_payload,int wrb_payload_size,u16 * cmd_status,u16 * ext_status)5045 int be_roce_mcc_cmd(void *netdev_handle, void *wrb_payload,
5046 		    int wrb_payload_size, u16 *cmd_status, u16 *ext_status)
5047 {
5048 	struct be_adapter *adapter = netdev_priv(netdev_handle);
5049 	struct be_mcc_wrb *wrb;
5050 	struct be_cmd_req_hdr *hdr = (struct be_cmd_req_hdr *)wrb_payload;
5051 	struct be_cmd_req_hdr *req;
5052 	struct be_cmd_resp_hdr *resp;
5053 	int status;
5054 
5055 	mutex_lock(&adapter->mcc_lock);
5056 
5057 	wrb = wrb_from_mccq(adapter);
5058 	if (!wrb) {
5059 		status = -EBUSY;
5060 		goto err;
5061 	}
5062 	req = embedded_payload(wrb);
5063 	resp = embedded_payload(wrb);
5064 
5065 	be_wrb_cmd_hdr_prepare(req, hdr->subsystem,
5066 			       hdr->opcode, wrb_payload_size, wrb, NULL);
5067 	memcpy(req, wrb_payload, wrb_payload_size);
5068 	be_dws_cpu_to_le(req, wrb_payload_size);
5069 
5070 	status = be_mcc_notify_wait(adapter);
5071 	if (cmd_status)
5072 		*cmd_status = (status & 0xffff);
5073 	if (ext_status)
5074 		*ext_status = 0;
5075 	memcpy(wrb_payload, resp, sizeof(*resp) + resp->response_length);
5076 	be_dws_le_to_cpu(wrb_payload, sizeof(*resp) + resp->response_length);
5077 err:
5078 	mutex_unlock(&adapter->mcc_lock);
5079 	return status;
5080 }
5081 EXPORT_SYMBOL(be_roce_mcc_cmd);
5082