Lines Matching +full:x +full:- +full:rc
1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
3 * Copyright (c) 2015-2017 QLogic Corporation
4 * Copyright (c) 2019-2020 Marvell International Ltd.
33 qed_wr(_p_hwfn, _p_ptt, (_p_hwfn->mcp_info->_ptr + _offset), \
37 qed_rd(_p_hwfn, _p_ptt, (_p_hwfn->mcp_info->_ptr + _offset))
54 if (!p_hwfn->mcp_info || !p_hwfn->mcp_info->public_base) in qed_mcp_is_init()
61 u32 addr = SECTION_OFFSIZE_ADDR(p_hwfn->mcp_info->public_base, in qed_mcp_cmd_port_init()
65 p_hwfn->mcp_info->port_addr = SECTION_ADDR(mfw_mb_offsize, in qed_mcp_cmd_port_init()
68 "port_addr = 0x%x, port_id 0x%02x\n", in qed_mcp_cmd_port_init()
69 p_hwfn->mcp_info->port_addr, MFW_PORT(p_hwfn)); in qed_mcp_cmd_port_init()
74 u32 length = MFW_DRV_MSG_MAX_DWORDS(p_hwfn->mcp_info->mfw_mb_length); in qed_mcp_read_mb()
77 if (!p_hwfn->mcp_info->public_base) in qed_mcp_read_mb()
82 p_hwfn->mcp_info->mfw_mb_addr + in qed_mcp_read_mb()
86 ((u32 *)p_hwfn->mcp_info->mfw_mb_cur)[i] = in qed_mcp_read_mb()
110 p_cmd_elem->p_mb_params = p_mb_params; in qed_mcp_cmd_add_elem()
111 p_cmd_elem->expected_seq_num = expected_seq_num; in qed_mcp_cmd_add_elem()
112 list_add(&p_cmd_elem->list, &p_hwfn->mcp_info->cmd_list); in qed_mcp_cmd_add_elem()
121 list_del(&p_cmd_elem->list); in qed_mcp_cmd_del_elem()
131 list_for_each_entry(p_cmd_elem, &p_hwfn->mcp_info->cmd_list, list) { in qed_mcp_cmd_get_elem()
132 if (p_cmd_elem->expected_seq_num == seq_num) in qed_mcp_cmd_get_elem()
141 if (p_hwfn->mcp_info) { in qed_mcp_free()
144 kfree(p_hwfn->mcp_info->mfw_mb_cur); in qed_mcp_free()
145 kfree(p_hwfn->mcp_info->mfw_mb_shadow); in qed_mcp_free()
147 spin_lock_bh(&p_hwfn->mcp_info->cmd_lock); in qed_mcp_free()
150 &p_hwfn->mcp_info->cmd_list, list) { in qed_mcp_free()
153 spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock); in qed_mcp_free()
156 kfree(p_hwfn->mcp_info); in qed_mcp_free()
157 p_hwfn->mcp_info = NULL; in qed_mcp_free()
168 struct qed_mcp_info *p_info = p_hwfn->mcp_info; in qed_load_mcp_offsets()
174 p_info->public_base = qed_rd(p_hwfn, p_ptt, MISC_REG_SHARED_MEM_ADDR); in qed_load_mcp_offsets()
175 if (!p_info->public_base) { in qed_load_mcp_offsets()
177 "The address of the MCP scratch-pad is not configured\n"); in qed_load_mcp_offsets()
178 return -EINVAL; in qed_load_mcp_offsets()
181 p_info->public_base |= GRCBASE_MCP; in qed_load_mcp_offsets()
185 SECTION_OFFSIZE_ADDR(p_info->public_base, in qed_load_mcp_offsets()
187 p_info->mfw_mb_addr = SECTION_ADDR(mfw_mb_offsize, mcp_pf_id); in qed_load_mcp_offsets()
188 p_info->mfw_mb_length = (u16)qed_rd(p_hwfn, p_ptt, in qed_load_mcp_offsets()
189 p_info->mfw_mb_addr + in qed_load_mcp_offsets()
198 while (!p_info->mfw_mb_length && --cnt) { in qed_load_mcp_offsets()
200 p_info->mfw_mb_length = in qed_load_mcp_offsets()
202 p_info->mfw_mb_addr + in qed_load_mcp_offsets()
210 return -EBUSY; in qed_load_mcp_offsets()
215 SECTION_OFFSIZE_ADDR(p_info->public_base, in qed_load_mcp_offsets()
217 p_info->drv_mb_addr = SECTION_ADDR(drv_mb_offsize, mcp_pf_id); in qed_load_mcp_offsets()
219 "drv_mb_offsiz = 0x%x, drv_mb_addr = 0x%x mcp_pf_id = 0x%x\n", in qed_load_mcp_offsets()
220 drv_mb_offsize, p_info->drv_mb_addr, mcp_pf_id); in qed_load_mcp_offsets()
225 p_info->drv_mb_seq = DRV_MB_RD(p_hwfn, p_ptt, drv_mb_header) & in qed_load_mcp_offsets()
229 p_info->drv_pulse_seq = DRV_MB_RD(p_hwfn, p_ptt, drv_pulse_mb) & in qed_load_mcp_offsets()
232 p_info->mcp_hist = qed_rd(p_hwfn, p_ptt, MISCS_REG_GENERIC_POR_0); in qed_load_mcp_offsets()
243 p_hwfn->mcp_info = kzalloc(sizeof(*p_hwfn->mcp_info), GFP_KERNEL); in qed_mcp_cmd_init()
244 if (!p_hwfn->mcp_info) in qed_mcp_cmd_init()
246 p_info = p_hwfn->mcp_info; in qed_mcp_cmd_init()
249 spin_lock_init(&p_info->cmd_lock); in qed_mcp_cmd_init()
250 spin_lock_init(&p_info->link_lock); in qed_mcp_cmd_init()
252 INIT_LIST_HEAD(&p_info->cmd_list); in qed_mcp_cmd_init()
262 size = MFW_DRV_MSG_MAX_DWORDS(p_info->mfw_mb_length) * sizeof(u32); in qed_mcp_cmd_init()
263 p_info->mfw_mb_cur = kzalloc(size, GFP_KERNEL); in qed_mcp_cmd_init()
264 p_info->mfw_mb_shadow = kzalloc(size, GFP_KERNEL); in qed_mcp_cmd_init()
265 if (!p_info->mfw_mb_cur || !p_info->mfw_mb_shadow) in qed_mcp_cmd_init()
272 return -ENOMEM; in qed_mcp_cmd_init()
283 if (p_hwfn->mcp_info->mcp_hist != generic_por_0) { in qed_mcp_reread_offsets()
286 "Rereading MCP offsets [mcp_hist 0x%08x, generic_por_0 0x%08x]\n", in qed_mcp_reread_offsets()
287 p_hwfn->mcp_info->mcp_hist, generic_por_0); in qed_mcp_reread_offsets()
297 int rc = 0; in qed_mcp_reset() local
299 if (p_hwfn->mcp_info->b_block_cmd) { in qed_mcp_reset()
302 return -EBUSY; in qed_mcp_reset()
306 spin_lock_bh(&p_hwfn->mcp_info->cmd_lock); in qed_mcp_reset()
312 seq = ++p_hwfn->mcp_info->drv_mb_seq; in qed_mcp_reset()
329 rc = -EAGAIN; in qed_mcp_reset()
332 spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock); in qed_mcp_reset()
334 return rc; in qed_mcp_reset()
343 * exists - it is placed at the HEAD of the list. in qed_mcp_has_pending_cmd()
345 if (!list_empty(&p_hwfn->mcp_info->cmd_list)) { in qed_mcp_has_pending_cmd()
346 p_cmd_elem = list_first_entry(&p_hwfn->mcp_info->cmd_list, in qed_mcp_has_pending_cmd()
348 return !p_cmd_elem->b_is_completed; in qed_mcp_has_pending_cmd()
366 /* Return if no new non-handled response has been received */ in qed_mcp_update_pending_cmd()
367 if (seq_num != p_hwfn->mcp_info->drv_mb_seq) in qed_mcp_update_pending_cmd()
368 return -EAGAIN; in qed_mcp_update_pending_cmd()
375 return -EINVAL; in qed_mcp_update_pending_cmd()
378 p_mb_params = p_cmd_elem->p_mb_params; in qed_mcp_update_pending_cmd()
381 p_mb_params->mcp_resp = mcp_resp; in qed_mcp_update_pending_cmd()
384 p_mb_params->mcp_param = DRV_MB_RD(p_hwfn, p_ptt, fw_mb_param); in qed_mcp_update_pending_cmd()
387 if (p_mb_params->p_data_dst != NULL && p_mb_params->data_dst_size) { in qed_mcp_update_pending_cmd()
388 u32 union_data_addr = p_hwfn->mcp_info->drv_mb_addr + in qed_mcp_update_pending_cmd()
391 qed_memcpy_from(p_hwfn, p_ptt, p_mb_params->p_data_dst, in qed_mcp_update_pending_cmd()
392 union_data_addr, p_mb_params->data_dst_size); in qed_mcp_update_pending_cmd()
395 p_cmd_elem->b_is_completed = true; in qed_mcp_update_pending_cmd()
410 union_data_addr = p_hwfn->mcp_info->drv_mb_addr + in __qed_mcp_cmd_and_union()
413 if (p_mb_params->p_data_src != NULL && p_mb_params->data_src_size) in __qed_mcp_cmd_and_union()
414 memcpy(&union_data, p_mb_params->p_data_src, in __qed_mcp_cmd_and_union()
415 p_mb_params->data_src_size); in __qed_mcp_cmd_and_union()
420 DRV_MB_WR(p_hwfn, p_ptt, drv_mb_param, p_mb_params->param); in __qed_mcp_cmd_and_union()
423 DRV_MB_WR(p_hwfn, p_ptt, drv_mb_header, (p_mb_params->cmd | seq_num)); in __qed_mcp_cmd_and_union()
426 "MFW mailbox: command 0x%08x param 0x%08x\n", in __qed_mcp_cmd_and_union()
427 (p_mb_params->cmd | seq_num), p_mb_params->param); in __qed_mcp_cmd_and_union()
432 p_hwfn->mcp_info->b_block_cmd = block_cmd; in qed_mcp_cmd_set_blocking()
453 "MCP CPU info: mode 0x%08x, state 0x%08x, pc {0x%08x, 0x%08x, 0x%08x}\n", in qed_mcp_print_cpu_info()
466 int rc = 0; in _qed_mcp_cmd_and_union() local
468 /* Wait until the mailbox is non-occupied */ in _qed_mcp_cmd_and_union()
475 spin_lock_bh(&p_hwfn->mcp_info->cmd_lock); in _qed_mcp_cmd_and_union()
480 rc = qed_mcp_update_pending_cmd(p_hwfn, p_ptt); in _qed_mcp_cmd_and_union()
481 if (!rc) in _qed_mcp_cmd_and_union()
483 else if (rc != -EAGAIN) in _qed_mcp_cmd_and_union()
486 spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock); in _qed_mcp_cmd_and_union()
496 …FW mailbox is occupied by an uncompleted command. Failed to send command 0x%08x [param 0x%08x].\n", in _qed_mcp_cmd_and_union()
497 p_mb_params->cmd, p_mb_params->param); in _qed_mcp_cmd_and_union()
498 return -EAGAIN; in _qed_mcp_cmd_and_union()
503 seq_num = ++p_hwfn->mcp_info->drv_mb_seq; in _qed_mcp_cmd_and_union()
506 rc = -ENOMEM; in _qed_mcp_cmd_and_union()
511 spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock); in _qed_mcp_cmd_and_union()
525 spin_lock_bh(&p_hwfn->mcp_info->cmd_lock); in _qed_mcp_cmd_and_union()
527 if (p_cmd_elem->b_is_completed) in _qed_mcp_cmd_and_union()
530 rc = qed_mcp_update_pending_cmd(p_hwfn, p_ptt); in _qed_mcp_cmd_and_union()
531 if (!rc) in _qed_mcp_cmd_and_union()
533 else if (rc != -EAGAIN) in _qed_mcp_cmd_and_union()
536 spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock); in _qed_mcp_cmd_and_union()
541 "The MFW failed to respond to command 0x%08x [param 0x%08x].\n", in _qed_mcp_cmd_and_union()
542 p_mb_params->cmd, p_mb_params->param); in _qed_mcp_cmd_and_union()
545 spin_lock_bh(&p_hwfn->mcp_info->cmd_lock); in _qed_mcp_cmd_and_union()
547 spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock); in _qed_mcp_cmd_and_union()
554 return -EAGAIN; in _qed_mcp_cmd_and_union()
558 spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock); in _qed_mcp_cmd_and_union()
562 "MFW mailbox: response 0x%08x param 0x%08x [after %d.%03d ms]\n", in _qed_mcp_cmd_and_union()
563 p_mb_params->mcp_resp, in _qed_mcp_cmd_and_union()
564 p_mb_params->mcp_param, in _qed_mcp_cmd_and_union()
568 p_mb_params->mcp_resp &= FW_MSG_CODE_MASK; in _qed_mcp_cmd_and_union()
573 spin_unlock_bh(&p_hwfn->mcp_info->cmd_lock); in _qed_mcp_cmd_and_union()
574 return rc; in _qed_mcp_cmd_and_union()
588 return -EBUSY; in qed_mcp_cmd_and_union()
591 if (p_hwfn->mcp_info->b_block_cmd) { in qed_mcp_cmd_and_union()
593 "The MFW is not responsive. Avoid sending mailbox command 0x%08x [param 0x%08x].\n", in qed_mcp_cmd_and_union()
594 p_mb_params->cmd, p_mb_params->param); in qed_mcp_cmd_and_union()
595 return -EBUSY; in qed_mcp_cmd_and_union()
598 if (p_mb_params->data_src_size > union_data_size || in qed_mcp_cmd_and_union()
599 p_mb_params->data_dst_size > union_data_size) { in qed_mcp_cmd_and_union()
602 p_mb_params->data_src_size, in qed_mcp_cmd_and_union()
603 p_mb_params->data_dst_size, union_data_size); in qed_mcp_cmd_and_union()
604 return -EINVAL; in qed_mcp_cmd_and_union()
624 int rc; in qed_mcp_cmd() local
630 rc = qed_mcp_cmd_and_union(p_hwfn, p_ptt, &mb_params); in qed_mcp_cmd()
631 if (rc) in qed_mcp_cmd()
632 return rc; in qed_mcp_cmd()
649 int rc; in qed_mcp_nvm_wr_cmd() local
656 rc = qed_mcp_cmd_and_union(p_hwfn, p_ptt, &mb_params); in qed_mcp_nvm_wr_cmd()
657 if (rc) in qed_mcp_nvm_wr_cmd()
658 return rc; in qed_mcp_nvm_wr_cmd()
664 p_hwfn->nvm_info.valid = false; in qed_mcp_nvm_wr_cmd()
678 int rc; in qed_mcp_nvm_rd_cmd() local
688 rc = qed_mcp_cmd_and_union(p_hwfn, p_ptt, &mb_params); in qed_mcp_nvm_rd_cmd()
689 if (rc) in qed_mcp_nvm_rd_cmd()
690 return rc; in qed_mcp_nvm_rd_cmd()
730 int rc; in qed_mcp_cancel_load_req() local
732 rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_CANCEL_LOAD_REQ, 0, in qed_mcp_cancel_load_req()
734 if (rc) in qed_mcp_cancel_load_req()
736 "Failed to send cancel load request, rc = %d\n", rc); in qed_mcp_cancel_load_req()
738 return rc; in qed_mcp_cancel_load_req()
806 int rc; in __qed_mcp_load_req() local
809 load_req.drv_ver_0 = p_in_params->drv_ver_0; in __qed_mcp_load_req()
810 load_req.drv_ver_1 = p_in_params->drv_ver_1; in __qed_mcp_load_req()
811 load_req.fw_ver = p_in_params->fw_ver; in __qed_mcp_load_req()
812 QED_MFW_SET_FIELD(load_req.misc0, LOAD_REQ_ROLE, p_in_params->drv_role); in __qed_mcp_load_req()
814 p_in_params->timeout_val); in __qed_mcp_load_req()
816 p_in_params->force_cmd); in __qed_mcp_load_req()
818 p_in_params->avoid_eng_reset); in __qed_mcp_load_req()
820 hsi_ver = (p_in_params->hsi_ver == QED_LOAD_REQ_HSI_VER_DEFAULT) ? in __qed_mcp_load_req()
822 (p_in_params->hsi_ver << DRV_ID_MCP_HSI_VER_SHIFT); in __qed_mcp_load_req()
826 mb_params.param = PDA_COMP | hsi_ver | p_hwfn->cdev->drv_type; in __qed_mcp_load_req()
834 "Load Request: param 0x%08x [init_hw %d, drv_type %d, hsi_ver %d, pda 0x%04x]\n", in __qed_mcp_load_req()
841 if (p_in_params->hsi_ver != QED_LOAD_REQ_HSI_VER_1) { in __qed_mcp_load_req()
843 …"Load Request: drv_ver 0x%08x_0x%08x, fw_ver 0x%08x, misc0 0x%08x [role %d, timeout %d, force %d, … in __qed_mcp_load_req()
855 rc = qed_mcp_cmd_and_union(p_hwfn, p_ptt, &mb_params); in __qed_mcp_load_req()
856 if (rc) { in __qed_mcp_load_req()
857 DP_NOTICE(p_hwfn, "Failed to send load request, rc = %d\n", rc); in __qed_mcp_load_req()
858 return rc; in __qed_mcp_load_req()
862 "Load Response: resp 0x%08x\n", mb_params.mcp_resp); in __qed_mcp_load_req()
863 p_out_params->load_code = mb_params.mcp_resp; in __qed_mcp_load_req()
865 if (p_in_params->hsi_ver != QED_LOAD_REQ_HSI_VER_1 && in __qed_mcp_load_req()
866 p_out_params->load_code != FW_MSG_CODE_DRV_LOAD_REFUSED_HSI_1) { in __qed_mcp_load_req()
869 …"Load Response: exist_drv_ver 0x%08x_0x%08x, exist_fw_ver 0x%08x, misc0 0x%08x [exist_role %d, mfw… in __qed_mcp_load_req()
878 p_out_params->exist_drv_ver_0 = load_rsp.drv_ver_0; in __qed_mcp_load_req()
879 p_out_params->exist_drv_ver_1 = load_rsp.drv_ver_1; in __qed_mcp_load_req()
880 p_out_params->exist_fw_ver = load_rsp.fw_ver; in __qed_mcp_load_req()
881 p_out_params->exist_drv_role = in __qed_mcp_load_req()
883 p_out_params->mfw_hsi_ver = in __qed_mcp_load_req()
885 p_out_params->drv_exists = in __qed_mcp_load_req()
906 return -EINVAL; in eocre_get_mfw_drv_role()
943 int rc; in qed_mcp_load_req() local
949 rc = eocre_get_mfw_drv_role(p_hwfn, p_params->drv_role, &mfw_drv_role); in qed_mcp_load_req()
950 if (rc) in qed_mcp_load_req()
951 return rc; in qed_mcp_load_req()
954 in_params.timeout_val = p_params->timeout_val; in qed_mcp_load_req()
959 in_params.avoid_eng_reset = p_params->avoid_eng_reset; in qed_mcp_load_req()
962 rc = __qed_mcp_load_req(p_hwfn, p_ptt, &in_params, &out_params); in qed_mcp_load_req()
963 if (rc) in qed_mcp_load_req()
964 return rc; in qed_mcp_load_req()
967 * - MFW expects the old interface [HSI version = 1] in qed_mcp_load_req()
968 * - MFW responds that a force load request is required in qed_mcp_load_req()
976 rc = __qed_mcp_load_req(p_hwfn, p_ptt, &in_params, &out_params); in qed_mcp_load_req()
977 if (rc) in qed_mcp_load_req()
978 return rc; in qed_mcp_load_req()
983 p_params->override_force_load)) { in qed_mcp_load_req()
985 …equired [{role, fw_ver, drv_ver}: loading={%d, 0x%08x, x%08x_0x%08x}, existing={%d, 0x%08x, 0x%08x… in qed_mcp_load_req()
999 rc = __qed_mcp_load_req(p_hwfn, p_ptt, &in_params, in qed_mcp_load_req()
1001 if (rc) in qed_mcp_load_req()
1002 return rc; in qed_mcp_load_req()
1005 …uired [{role, fw_ver, drv_ver}: loading={%d, 0x%08x, x%08x_0x%08x}, existing={%d, 0x%08x, 0x%08x_0… in qed_mcp_load_req()
1016 return -EBUSY; in qed_mcp_load_req()
1035 return -EINVAL; in qed_mcp_load_req()
1040 "Unexpected refusal to load request [resp 0x%08x]. Aborting.\n", in qed_mcp_load_req()
1042 return -EBUSY; in qed_mcp_load_req()
1045 p_params->load_code = out_params.load_code; in qed_mcp_load_req()
1053 int rc; in qed_mcp_load_done() local
1055 rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_LOAD_DONE, 0, &resp, in qed_mcp_load_done()
1057 if (rc) { in qed_mcp_load_done()
1059 "Failed to send a LOAD_DONE command, rc = %d\n", rc); in qed_mcp_load_done()
1060 return rc; in qed_mcp_load_done()
1063 /* Check if there is a DID mismatch between nvm-cfg/efuse */ in qed_mcp_load_done()
1076 switch (p_hwfn->cdev->wol_config) { in qed_mcp_unload_req()
1085 "Unknown WoL configuration %02x\n", in qed_mcp_unload_req()
1086 p_hwfn->cdev->wol_config); in qed_mcp_unload_req()
1109 if (p_hwfn->cdev->wol_config == QED_OV_WOL_ENABLED) { in qed_mcp_unload_done()
1110 u8 *p_mac = p_hwfn->cdev->wol_mac; in qed_mcp_unload_done()
1119 "Setting WoL MAC: %pM --> [%08x,%08x]\n", in qed_mcp_unload_done()
1132 u32 addr = SECTION_OFFSIZE_ADDR(p_hwfn->mcp_info->public_base, in qed_mcp_handle_vf_flr()
1142 "Reading Disabled VF information from [offset %08x], path_addr %08x\n", in qed_mcp_handle_vf_flr()
1152 "FLR-ed VFs [%08x,...,%08x] - %08x\n", in qed_mcp_handle_vf_flr()
1153 i * 32, (i + 1) * 32 - 1, disabled_vfs[i]); in qed_mcp_handle_vf_flr()
1163 u32 addr = SECTION_OFFSIZE_ADDR(p_hwfn->mcp_info->public_base, in qed_mcp_ack_vf_flr()
1169 int rc; in qed_mcp_ack_vf_flr() local
1174 "Acking VFs [%08x,...,%08x] - %08x\n", in qed_mcp_ack_vf_flr()
1175 i * 32, (i + 1) * 32 - 1, vfs_to_ack[i]); in qed_mcp_ack_vf_flr()
1181 rc = qed_mcp_cmd_and_union(p_hwfn, p_ptt, &mb_params); in qed_mcp_ack_vf_flr()
1182 if (rc) { in qed_mcp_ack_vf_flr()
1184 return -EBUSY; in qed_mcp_ack_vf_flr()
1194 return rc; in qed_mcp_ack_vf_flr()
1203 p_hwfn->mcp_info->port_addr + in qed_mcp_handle_transceiver_change()
1209 "Received transceiver state update [0x%08x] from mfw [Addr 0x%x]\n", in qed_mcp_handle_transceiver_change()
1211 (u32)(p_hwfn->mcp_info->port_addr + in qed_mcp_handle_transceiver_change()
1229 p_link->eee_adv_caps = 0; in qed_mcp_read_eee_config()
1230 p_link->eee_lp_adv_caps = 0; in qed_mcp_read_eee_config()
1233 p_hwfn->mcp_info->port_addr + in qed_mcp_read_eee_config()
1235 p_link->eee_active = !!(eee_status & EEE_ACTIVE_BIT); in qed_mcp_read_eee_config()
1238 p_link->eee_adv_caps |= QED_EEE_1G_ADV; in qed_mcp_read_eee_config()
1240 p_link->eee_adv_caps |= QED_EEE_10G_ADV; in qed_mcp_read_eee_config()
1243 p_link->eee_lp_adv_caps |= QED_EEE_1G_ADV; in qed_mcp_read_eee_config()
1245 p_link->eee_lp_adv_caps |= QED_EEE_10G_ADV; in qed_mcp_read_eee_config()
1252 u32 addr = SECTION_OFFSIZE_ADDR(p_hwfn->mcp_info->public_base, in qed_mcp_get_shmem_func()
1273 p_info = &p_hwfn->mcp_info->func_info; in qed_read_pf_bandwidth()
1275 p_info->bandwidth_min = QED_MFW_GET_FIELD(p_shmem_info->config, in qed_read_pf_bandwidth()
1277 if (p_info->bandwidth_min < 1 || p_info->bandwidth_min > 100) { in qed_read_pf_bandwidth()
1279 "bandwidth minimum out of bounds [%02x]. Set to 1\n", in qed_read_pf_bandwidth()
1280 p_info->bandwidth_min); in qed_read_pf_bandwidth()
1281 p_info->bandwidth_min = 1; in qed_read_pf_bandwidth()
1284 p_info->bandwidth_max = QED_MFW_GET_FIELD(p_shmem_info->config, in qed_read_pf_bandwidth()
1286 if (p_info->bandwidth_max < 1 || p_info->bandwidth_max > 100) { in qed_read_pf_bandwidth()
1288 "bandwidth maximum out of bounds [%02x]. Set to 100\n", in qed_read_pf_bandwidth()
1289 p_info->bandwidth_max); in qed_read_pf_bandwidth()
1290 p_info->bandwidth_max = 100; in qed_read_pf_bandwidth()
1302 spin_lock_bh(&p_hwfn->mcp_info->link_lock); in qed_mcp_handle_link_change()
1304 p_link = &p_hwfn->mcp_info->link_output; in qed_mcp_handle_link_change()
1308 p_hwfn->mcp_info->port_addr + in qed_mcp_handle_link_change()
1311 "Received link update [0x%08x] from mfw [Addr 0x%x]\n", in qed_mcp_handle_link_change()
1313 (u32)(p_hwfn->mcp_info->port_addr + in qed_mcp_handle_link_change()
1321 if (p_hwfn->b_drv_link_init) { in qed_mcp_handle_link_change()
1322 /* Link indication with modern MFW arrives as per-PF in qed_mcp_handle_link_change()
1325 if (p_hwfn->mcp_info->capabilities & in qed_mcp_handle_link_change()
1331 p_link->link_up = !!(shmem_info.status & in qed_mcp_handle_link_change()
1335 "Virtual link_up = %d\n", p_link->link_up); in qed_mcp_handle_link_change()
1337 p_link->link_up = !!(status & LINK_STATUS_LINK_UP); in qed_mcp_handle_link_change()
1339 "Physical link_up = %d\n", p_link->link_up); in qed_mcp_handle_link_change()
1342 p_link->link_up = false; in qed_mcp_handle_link_change()
1345 p_link->full_duplex = true; in qed_mcp_handle_link_change()
1348 p_link->speed = 100000; in qed_mcp_handle_link_change()
1351 p_link->speed = 50000; in qed_mcp_handle_link_change()
1354 p_link->speed = 40000; in qed_mcp_handle_link_change()
1357 p_link->speed = 25000; in qed_mcp_handle_link_change()
1360 p_link->speed = 20000; in qed_mcp_handle_link_change()
1363 p_link->speed = 10000; in qed_mcp_handle_link_change()
1366 p_link->full_duplex = false; in qed_mcp_handle_link_change()
1369 p_link->speed = 1000; in qed_mcp_handle_link_change()
1372 p_link->speed = 0; in qed_mcp_handle_link_change()
1373 p_link->link_up = 0; in qed_mcp_handle_link_change()
1376 if (p_link->link_up && p_link->speed) in qed_mcp_handle_link_change()
1377 p_link->line_speed = p_link->speed; in qed_mcp_handle_link_change()
1379 p_link->line_speed = 0; in qed_mcp_handle_link_change()
1381 max_bw = p_hwfn->mcp_info->func_info.bandwidth_max; in qed_mcp_handle_link_change()
1382 min_bw = p_hwfn->mcp_info->func_info.bandwidth_min; in qed_mcp_handle_link_change()
1389 qed_configure_vp_wfq_on_link_change(p_hwfn->cdev, p_ptt, in qed_mcp_handle_link_change()
1390 p_link->min_pf_rate); in qed_mcp_handle_link_change()
1392 p_link->an = !!(status & LINK_STATUS_AUTO_NEGOTIATE_ENABLED); in qed_mcp_handle_link_change()
1393 p_link->an_complete = !!(status & in qed_mcp_handle_link_change()
1395 p_link->parallel_detection = !!(status & in qed_mcp_handle_link_change()
1397 p_link->pfc_enabled = !!(status & LINK_STATUS_PFC_ENABLED); in qed_mcp_handle_link_change()
1399 p_link->partner_adv_speed |= in qed_mcp_handle_link_change()
1402 p_link->partner_adv_speed |= in qed_mcp_handle_link_change()
1405 p_link->partner_adv_speed |= in qed_mcp_handle_link_change()
1408 p_link->partner_adv_speed |= in qed_mcp_handle_link_change()
1411 p_link->partner_adv_speed |= in qed_mcp_handle_link_change()
1414 p_link->partner_adv_speed |= in qed_mcp_handle_link_change()
1417 p_link->partner_adv_speed |= in qed_mcp_handle_link_change()
1420 p_link->partner_adv_speed |= in qed_mcp_handle_link_change()
1424 p_link->partner_tx_flow_ctrl_en = in qed_mcp_handle_link_change()
1426 p_link->partner_rx_flow_ctrl_en = in qed_mcp_handle_link_change()
1431 p_link->partner_adv_pause = QED_LINK_PARTNER_SYMMETRIC_PAUSE; in qed_mcp_handle_link_change()
1434 p_link->partner_adv_pause = QED_LINK_PARTNER_ASYMMETRIC_PAUSE; in qed_mcp_handle_link_change()
1437 p_link->partner_adv_pause = QED_LINK_PARTNER_BOTH_PAUSE; in qed_mcp_handle_link_change()
1440 p_link->partner_adv_pause = 0; in qed_mcp_handle_link_change()
1443 p_link->sfp_tx_fault = !!(status & LINK_STATUS_SFP_TX_FAULT); in qed_mcp_handle_link_change()
1445 if (p_hwfn->mcp_info->capabilities & FW_MB_PARAM_FEATURE_SUPPORT_EEE) in qed_mcp_handle_link_change()
1448 if (p_hwfn->mcp_info->capabilities & in qed_mcp_handle_link_change()
1452 p_link->fec_active = QED_FEC_MODE_NONE; in qed_mcp_handle_link_change()
1455 p_link->fec_active = QED_FEC_MODE_FIRECODE; in qed_mcp_handle_link_change()
1458 p_link->fec_active = QED_FEC_MODE_RS; in qed_mcp_handle_link_change()
1461 p_link->fec_active = QED_FEC_MODE_AUTO; in qed_mcp_handle_link_change()
1464 p_link->fec_active = QED_FEC_MODE_UNSUPPORTED; in qed_mcp_handle_link_change()
1469 spin_unlock_bh(&p_hwfn->mcp_info->link_lock); in qed_mcp_handle_link_change()
1474 struct qed_mcp_link_params *params = &p_hwfn->mcp_info->link_input; in qed_mcp_set_link()
1479 int rc = 0; in qed_mcp_set_link() local
1484 if (!params->speed.autoneg) in qed_mcp_set_link()
1485 phy_cfg.speed = params->speed.forced_speed; in qed_mcp_set_link()
1486 phy_cfg.pause |= (params->pause.autoneg) ? ETH_PAUSE_AUTONEG : 0; in qed_mcp_set_link()
1487 phy_cfg.pause |= (params->pause.forced_rx) ? ETH_PAUSE_RX : 0; in qed_mcp_set_link()
1488 phy_cfg.pause |= (params->pause.forced_tx) ? ETH_PAUSE_TX : 0; in qed_mcp_set_link()
1489 phy_cfg.adv_speed = params->speed.advertised_speeds; in qed_mcp_set_link()
1490 phy_cfg.loopback_mode = params->loopback_mode; in qed_mcp_set_link()
1497 if ((p_hwfn->mcp_info->capabilities & in qed_mcp_set_link()
1498 FW_MB_PARAM_FEATURE_SUPPORT_EEE) && params->eee.enable) { in qed_mcp_set_link()
1500 if (params->eee.tx_lpi_enable) in qed_mcp_set_link()
1502 if (params->eee.adv_caps & QED_EEE_1G_ADV) in qed_mcp_set_link()
1504 if (params->eee.adv_caps & QED_EEE_10G_ADV) in qed_mcp_set_link()
1506 phy_cfg.eee_cfg |= (params->eee.tx_lpi_timer << in qed_mcp_set_link()
1511 if (p_hwfn->mcp_info->capabilities & in qed_mcp_set_link()
1513 if (params->fec & QED_FEC_MODE_NONE) in qed_mcp_set_link()
1515 else if (params->fec & QED_FEC_MODE_FIRECODE) in qed_mcp_set_link()
1517 else if (params->fec & QED_FEC_MODE_RS) in qed_mcp_set_link()
1519 else if (params->fec & QED_FEC_MODE_AUTO) in qed_mcp_set_link()
1525 if (p_hwfn->mcp_info->capabilities & in qed_mcp_set_link()
1528 if (params->ext_speed.autoneg) in qed_mcp_set_link()
1531 val = params->ext_speed.forced_speed; in qed_mcp_set_link()
1558 val = params->ext_speed.advertised_speeds; in qed_mcp_set_link()
1583 params->ext_fec_mode); in qed_mcp_set_link()
1586 p_hwfn->b_drv_link_init = b_up; in qed_mcp_set_link()
1590 …"Configuring Link: Speed 0x%08x, Pause 0x%08x, Adv. Speed 0x%08x, Loopback 0x%08x, FEC 0x%08x, Ext… in qed_mcp_set_link()
1602 rc = qed_mcp_cmd_and_union(p_hwfn, p_ptt, &mb_params); in qed_mcp_set_link()
1605 if (rc) { in qed_mcp_set_link()
1607 return rc; in qed_mcp_set_link()
1610 /* Mimic link-change attention, done for several reasons: in qed_mcp_set_link()
1611 * - On reset, there's no guarantee MFW would trigger in qed_mcp_set_link()
1613 * - On initialization, older MFWs might not indicate link change in qed_mcp_set_link()
1626 if (IS_VF(p_hwfn->cdev)) in qed_get_process_kill_counter()
1627 return -EINVAL; in qed_get_process_kill_counter()
1629 path_offsize_addr = SECTION_OFFSIZE_ADDR(p_hwfn->mcp_info->public_base, in qed_get_process_kill_counter()
1645 struct qed_dev *cdev = p_hwfn->cdev; in qed_mcp_handle_process_kill()
1649 * and till its load phase, during which they will be re-enabled. in qed_mcp_handle_process_kill()
1661 if (cdev->recov_in_prog) { in qed_mcp_handle_process_kill()
1667 cdev->recov_in_prog = true; in qed_mcp_handle_process_kill()
1706 qed_get_protocol_stats(p_hwfn->cdev, stats_type, &stats); in qed_mcp_send_protocol_stats()
1726 p_info = &p_hwfn->mcp_info->func_info; in qed_mcp_update_bw()
1728 qed_configure_pf_min_bandwidth(p_hwfn->cdev, p_info->bandwidth_min); in qed_mcp_update_bw()
1729 qed_configure_pf_max_bandwidth(p_hwfn->cdev, p_info->bandwidth_max); in qed_mcp_update_bw()
1743 p_hwfn->mcp_info->func_info.ovlan = (u16)shmem_info.ovlan_stag & in qed_mcp_update_stag()
1745 p_hwfn->hw_info.ovlan = p_hwfn->mcp_info->func_info.ovlan; in qed_mcp_update_stag()
1746 if (test_bit(QED_MF_OVLAN_CLSS, &p_hwfn->cdev->mf_bits)) { in qed_mcp_update_stag()
1747 if (p_hwfn->hw_info.ovlan != QED_MCP_VLAN_UNSET) { in qed_mcp_update_stag()
1749 p_hwfn->hw_info.ovlan); in qed_mcp_update_stag()
1755 p_hwfn->hw_info.ovlan); in qed_mcp_update_stag()
1766 DP_VERBOSE(p_hwfn, QED_MSG_SP, "ovlan = %d hw_mode = 0x%x\n", in qed_mcp_update_stag()
1767 p_hwfn->mcp_info->func_info.ovlan, p_hwfn->hw_info.hw_mode); in qed_mcp_update_stag()
1778 if (p_hwfn != QED_LEADING_HWFN(p_hwfn->cdev)) in qed_mcp_handle_fan_failure()
1800 int rc; in qed_mcp_mdump_cmd() local
1804 mb_params.param = p_mdump_cmd_params->cmd; in qed_mcp_mdump_cmd()
1805 mb_params.p_data_src = p_mdump_cmd_params->p_data_src; in qed_mcp_mdump_cmd()
1806 mb_params.data_src_size = p_mdump_cmd_params->data_src_size; in qed_mcp_mdump_cmd()
1807 mb_params.p_data_dst = p_mdump_cmd_params->p_data_dst; in qed_mcp_mdump_cmd()
1808 mb_params.data_dst_size = p_mdump_cmd_params->data_dst_size; in qed_mcp_mdump_cmd()
1809 rc = qed_mcp_cmd_and_union(p_hwfn, p_ptt, &mb_params); in qed_mcp_mdump_cmd()
1810 if (rc) in qed_mcp_mdump_cmd()
1811 return rc; in qed_mcp_mdump_cmd()
1813 p_mdump_cmd_params->mcp_resp = mb_params.mcp_resp; in qed_mcp_mdump_cmd()
1815 if (p_mdump_cmd_params->mcp_resp == FW_MSG_CODE_MDUMP_INVALID_CMD) { in qed_mcp_mdump_cmd()
1817 "The mdump sub command is unsupported by the MFW [mdump_cmd 0x%x]\n", in qed_mcp_mdump_cmd()
1818 p_mdump_cmd_params->cmd); in qed_mcp_mdump_cmd()
1819 rc = -EOPNOTSUPP; in qed_mcp_mdump_cmd()
1820 } else if (p_mdump_cmd_params->mcp_resp == FW_MSG_CODE_UNSUPPORTED) { in qed_mcp_mdump_cmd()
1823 rc = -EOPNOTSUPP; in qed_mcp_mdump_cmd()
1826 return rc; in qed_mcp_mdump_cmd()
1845 int rc; in qed_mcp_mdump_get_retain() local
1852 rc = qed_mcp_mdump_cmd(p_hwfn, p_ptt, &mdump_cmd_params); in qed_mcp_mdump_get_retain()
1853 if (rc) in qed_mcp_mdump_get_retain()
1854 return rc; in qed_mcp_mdump_get_retain()
1858 "Failed to get the mdump retained data [mcp_resp 0x%x]\n", in qed_mcp_mdump_get_retain()
1860 return -EINVAL; in qed_mcp_mdump_get_retain()
1870 int rc; in qed_mcp_handle_critical_error() local
1872 /* In CMT mode - no need for more than a single acknowledgment to the in qed_mcp_handle_critical_error()
1875 if (p_hwfn != QED_LEADING_HWFN(p_hwfn->cdev)) in qed_mcp_handle_critical_error()
1878 rc = qed_mcp_mdump_get_retain(p_hwfn, p_ptt, &mdump_retain); in qed_mcp_handle_critical_error()
1879 if (rc == 0 && mdump_retain.valid) in qed_mcp_handle_critical_error()
1881 …FW notified that a critical error occurred in the device [epoch 0x%08x, pf 0x%x, status 0x%08x]\n", in qed_mcp_handle_critical_error()
1900 if (!test_bit(QED_MF_UFP_SPECIFIC, &p_hwfn->cdev->mf_bits)) in qed_mcp_read_ufp_config()
1903 memset(&p_hwfn->ufp_info, 0, sizeof(p_hwfn->ufp_info)); in qed_mcp_read_ufp_config()
1904 port_cfg = qed_rd(p_hwfn, p_ptt, p_hwfn->mcp_info->port_addr + in qed_mcp_read_ufp_config()
1910 "Incorrect UFP Channel type %d port_id 0x%02x\n", in qed_mcp_read_ufp_config()
1915 p_hwfn->ufp_info.mode = QED_UFP_MODE_ETS; in qed_mcp_read_ufp_config()
1917 p_hwfn->ufp_info.mode = QED_UFP_MODE_VNIC_BW; in qed_mcp_read_ufp_config()
1919 p_hwfn->ufp_info.mode = QED_UFP_MODE_UNKNOWN; in qed_mcp_read_ufp_config()
1921 "Unknown UFP scheduling mode %d port_id 0x%02x\n", in qed_mcp_read_ufp_config()
1928 p_hwfn->ufp_info.tc = (u8)val; in qed_mcp_read_ufp_config()
1932 p_hwfn->ufp_info.pri_type = QED_UFP_PRI_VNIC; in qed_mcp_read_ufp_config()
1934 p_hwfn->ufp_info.pri_type = QED_UFP_PRI_OS; in qed_mcp_read_ufp_config()
1936 p_hwfn->ufp_info.pri_type = QED_UFP_PRI_UNKNOWN; in qed_mcp_read_ufp_config()
1938 "Unknown Host priority control %d port_id 0x%02x\n", in qed_mcp_read_ufp_config()
1943 "UFP shmem config: mode = %d tc = %d pri_type = %d port_id 0x%02x\n", in qed_mcp_read_ufp_config()
1944 p_hwfn->ufp_info.mode, p_hwfn->ufp_info.tc, in qed_mcp_read_ufp_config()
1945 p_hwfn->ufp_info.pri_type, MFW_PORT(p_hwfn)); in qed_mcp_read_ufp_config()
1953 if (p_hwfn->ufp_info.mode == QED_UFP_MODE_VNIC_BW) { in qed_mcp_handle_ufp_event()
1954 p_hwfn->qm_info.ooo_tc = p_hwfn->ufp_info.tc; in qed_mcp_handle_ufp_event()
1955 qed_hw_info_set_offload_tc(&p_hwfn->hw_info, in qed_mcp_handle_ufp_event()
1956 p_hwfn->ufp_info.tc); in qed_mcp_handle_ufp_event()
1959 } else if (p_hwfn->ufp_info.mode == QED_UFP_MODE_ETS) { in qed_mcp_handle_ufp_event()
1965 return -EINVAL; in qed_mcp_handle_ufp_event()
1980 struct qed_mcp_info *info = p_hwfn->mcp_info; in qed_mcp_handle_events()
1981 int rc = 0; in qed_mcp_handle_events() local
1991 for (i = 0; i < info->mfw_mb_length; i++) { in qed_mcp_handle_events()
1992 if (info->mfw_mb_cur[i] == info->mfw_mb_shadow[i]) in qed_mcp_handle_events()
1998 "Msg [%d] - old CMD 0x%02x, new CMD 0x%02x\n", in qed_mcp_handle_events()
1999 i, info->mfw_mb_shadow[i], info->mfw_mb_cur[i]); in qed_mcp_handle_events()
2052 rc = -EINVAL; in qed_mcp_handle_events()
2057 for (i = 0; i < MFW_DRV_MSG_MAX_DWORDS(info->mfw_mb_length); i++) { in qed_mcp_handle_events()
2058 __be32 val = cpu_to_be32(((u32 *)info->mfw_mb_cur)[i]); in qed_mcp_handle_events()
2062 info->mfw_mb_addr + sizeof(u32) + in qed_mcp_handle_events()
2063 MFW_DRV_MSG_MAX_DWORDS(info->mfw_mb_length) * in qed_mcp_handle_events()
2071 rc = -EINVAL; in qed_mcp_handle_events()
2075 memcpy(info->mfw_mb_shadow, info->mfw_mb_cur, info->mfw_mb_length); in qed_mcp_handle_events()
2077 return rc; in qed_mcp_handle_events()
2086 if (IS_VF(p_hwfn->cdev)) { in qed_mcp_get_mfw_ver()
2087 if (p_hwfn->vf_iov_info) { in qed_mcp_get_mfw_ver()
2090 p_resp = &p_hwfn->vf_iov_info->acquire_resp; in qed_mcp_get_mfw_ver()
2091 *p_mfw_ver = p_resp->pfdev_info.mfw_ver; in qed_mcp_get_mfw_ver()
2097 return -EINVAL; in qed_mcp_get_mfw_ver()
2102 SECTION_OFFSIZE_ADDR(p_hwfn-> in qed_mcp_get_mfw_ver()
2103 mcp_info->public_base, in qed_mcp_get_mfw_ver()
2125 if (IS_VF(p_hwfn->cdev)) in qed_mcp_get_mbi_ver()
2126 return -EINVAL; in qed_mcp_get_mbi_ver()
2132 return -EINVAL; in qed_mcp_get_mbi_ver()
2155 if (IS_VF(p_hwfn->cdev)) in qed_mcp_get_media_type()
2156 return -EINVAL; in qed_mcp_get_media_type()
2160 return -EBUSY; in qed_mcp_get_media_type()
2165 return -EINVAL; in qed_mcp_get_media_type()
2169 p_hwfn->mcp_info->port_addr + in qed_mcp_get_media_type()
2186 if (IS_VF(p_hwfn->cdev)) in qed_mcp_get_transceiver_data()
2187 return -EINVAL; in qed_mcp_get_transceiver_data()
2191 return -EBUSY; in qed_mcp_get_transceiver_data()
2195 p_hwfn->mcp_info->port_addr + in qed_mcp_get_transceiver_data()
2236 return -EINVAL; in qed_mcp_trans_speed_mask()
2328 DP_INFO(p_hwfn, "Unknown transceiver type 0x%x\n", in qed_mcp_trans_speed_mask()
2342 if (IS_VF(p_hwfn->cdev)) in qed_mcp_get_board_config()
2343 return -EINVAL; in qed_mcp_get_board_config()
2347 return -EBUSY; in qed_mcp_get_board_config()
2351 return -EINVAL; in qed_mcp_get_board_config()
2374 if (test_bit(QED_DEV_CAP_ROCE, &p_hwfn->hw_info.device_capabilities)) in qed_mcp_get_shmem_proto_legacy()
2380 "According to Legacy capabilities, L2 personality is %08x\n", in qed_mcp_get_shmem_proto_legacy()
2390 int rc; in qed_mcp_get_shmem_proto_mfw() local
2392 rc = qed_mcp_cmd(p_hwfn, p_ptt, in qed_mcp_get_shmem_proto_mfw()
2394 if (rc) in qed_mcp_get_shmem_proto_mfw()
2395 return rc; in qed_mcp_get_shmem_proto_mfw()
2398 "MFW lacks support for command; Returns %08x\n", in qed_mcp_get_shmem_proto_mfw()
2400 return -EINVAL; in qed_mcp_get_shmem_proto_mfw()
2418 "MFW answers GET_PF_RDMA_PROTOCOL but param is %08x\n", in qed_mcp_get_shmem_proto_mfw()
2420 return -EINVAL; in qed_mcp_get_shmem_proto_mfw()
2425 "According to capabilities, L2 personality is %08x [resp %08x param %08x]\n", in qed_mcp_get_shmem_proto_mfw()
2436 int rc = 0; in qed_mcp_get_shmem_proto() local
2438 switch (p_info->config & FUNC_MF_CFG_PROTOCOL_MASK) { in qed_mcp_get_shmem_proto()
2458 rc = -EINVAL; in qed_mcp_get_shmem_proto()
2461 return rc; in qed_mcp_get_shmem_proto()
2471 info = &p_hwfn->mcp_info->func_info; in qed_mcp_fill_shmem_func_info()
2473 info->pause_on_host = (shmem_info.config & in qed_mcp_fill_shmem_func_info()
2477 &info->protocol)) { in qed_mcp_fill_shmem_func_info()
2478 DP_ERR(p_hwfn, "Unknown personality %08x\n", in qed_mcp_fill_shmem_func_info()
2480 return -EINVAL; in qed_mcp_fill_shmem_func_info()
2486 info->mac[0] = (u8)(shmem_info.mac_upper >> 8); in qed_mcp_fill_shmem_func_info()
2487 info->mac[1] = (u8)(shmem_info.mac_upper); in qed_mcp_fill_shmem_func_info()
2488 info->mac[2] = (u8)(shmem_info.mac_lower >> 24); in qed_mcp_fill_shmem_func_info()
2489 info->mac[3] = (u8)(shmem_info.mac_lower >> 16); in qed_mcp_fill_shmem_func_info()
2490 info->mac[4] = (u8)(shmem_info.mac_lower >> 8); in qed_mcp_fill_shmem_func_info()
2491 info->mac[5] = (u8)(shmem_info.mac_lower); in qed_mcp_fill_shmem_func_info()
2494 memcpy(&p_hwfn->cdev->wol_mac, info->mac, ETH_ALEN); in qed_mcp_fill_shmem_func_info()
2499 info->wwn_port = (u64)shmem_info.fcoe_wwn_port_name_lower | in qed_mcp_fill_shmem_func_info()
2501 info->wwn_node = (u64)shmem_info.fcoe_wwn_node_name_lower | in qed_mcp_fill_shmem_func_info()
2504 info->ovlan = (u16)(shmem_info.ovlan_stag & FUNC_MF_CFG_OV_STAG_MASK); in qed_mcp_fill_shmem_func_info()
2506 info->mtu = (u16)shmem_info.mtu_size; in qed_mcp_fill_shmem_func_info()
2508 p_hwfn->hw_info.b_wol_support = QED_WOL_SUPPORT_NONE; in qed_mcp_fill_shmem_func_info()
2509 p_hwfn->cdev->wol_config = (u8)QED_OV_WOL_DEFAULT; in qed_mcp_fill_shmem_func_info()
2512 int rc; in qed_mcp_fill_shmem_func_info() local
2514 rc = qed_mcp_cmd(p_hwfn, p_ptt, in qed_mcp_fill_shmem_func_info()
2516 if (rc) in qed_mcp_fill_shmem_func_info()
2517 return rc; in qed_mcp_fill_shmem_func_info()
2519 p_hwfn->hw_info.b_wol_support = QED_WOL_SUPPORT_PME; in qed_mcp_fill_shmem_func_info()
2523 …tion from shmem: pause_on_host %02x protocol %02x BW [%02x - %02x] MAC %pM wwn port %llx node %llx… in qed_mcp_fill_shmem_func_info()
2524 info->pause_on_host, info->protocol, in qed_mcp_fill_shmem_func_info()
2525 info->bandwidth_min, info->bandwidth_max, in qed_mcp_fill_shmem_func_info()
2526 info->mac, in qed_mcp_fill_shmem_func_info()
2527 info->wwn_port, info->wwn_node, in qed_mcp_fill_shmem_func_info()
2528 info->ovlan, (u8)p_hwfn->hw_info.b_wol_support); in qed_mcp_fill_shmem_func_info()
2536 if (!p_hwfn || !p_hwfn->mcp_info) in qed_mcp_get_link_params()
2538 return &p_hwfn->mcp_info->link_input; in qed_mcp_get_link_params()
2544 if (!p_hwfn || !p_hwfn->mcp_info) in qed_mcp_get_link_state()
2546 return &p_hwfn->mcp_info->link_output; in qed_mcp_get_link_state()
2552 if (!p_hwfn || !p_hwfn->mcp_info) in qed_mcp_get_link_capabilities()
2554 return &p_hwfn->mcp_info->link_capabilities; in qed_mcp_get_link_capabilities()
2560 int rc; in qed_mcp_drain() local
2562 rc = qed_mcp_cmd(p_hwfn, p_ptt, in qed_mcp_drain()
2568 return rc; in qed_mcp_drain()
2576 if (IS_VF(p_hwfn->cdev)) in qed_mcp_get_flash_size()
2577 return -EINVAL; in qed_mcp_get_flash_size()
2591 struct qed_dev *cdev = p_hwfn->cdev; in qed_start_recovery_process()
2593 if (cdev->recov_in_prog) { in qed_start_recovery_process()
2596 return -EAGAIN; in qed_start_recovery_process()
2610 struct qed_ptt *p_ptt = p_hwfn->p_main_ptt; in qed_recovery_prolog()
2611 int rc; in qed_recovery_prolog() local
2617 rc = qed_pglueb_set_pfid_enable(p_hwfn, p_ptt, false); in qed_recovery_prolog()
2618 if (rc) in qed_recovery_prolog()
2620 "qed_pglueb_set_pfid_enable() failed. rc = %d.\n", in qed_recovery_prolog()
2621 rc); in qed_recovery_prolog()
2623 return rc; in qed_recovery_prolog()
2631 int rc; in qed_mcp_config_vf_msix_bb() local
2636 num *= p_hwfn->cdev->num_hwfns; in qed_mcp_config_vf_msix_bb()
2643 rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_CFG_VF_MSIX, param, in qed_mcp_config_vf_msix_bb()
2647 DP_NOTICE(p_hwfn, "VF[%d]: MFW failed to set MSI-X\n", vf_id); in qed_mcp_config_vf_msix_bb()
2648 rc = -EINVAL; in qed_mcp_config_vf_msix_bb()
2651 "Requested 0x%02x MSI-x interrupts from VF 0x%02x\n", in qed_mcp_config_vf_msix_bb()
2655 return rc; in qed_mcp_config_vf_msix_bb()
2663 int rc; in qed_mcp_config_vf_msix_ah() local
2665 rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_CFG_PF_VFS_MSIX, in qed_mcp_config_vf_msix_ah()
2669 DP_NOTICE(p_hwfn, "MFW failed to set MSI-X for VFs\n"); in qed_mcp_config_vf_msix_ah()
2670 rc = -EINVAL; in qed_mcp_config_vf_msix_ah()
2673 "Requested 0x%02x MSI-x interrupts for VFs\n", num); in qed_mcp_config_vf_msix_ah()
2676 return rc; in qed_mcp_config_vf_msix_ah()
2682 if (QED_IS_BB(p_hwfn->cdev)) in qed_mcp_config_vf_msix()
2697 int rc; in qed_mcp_send_drv_version() local
2700 drv_version.version = p_ver->version; in qed_mcp_send_drv_version()
2701 for (i = 0; i < (MCP_DRV_VER_STR_SIZE - 4) / sizeof(u32); i++) { in qed_mcp_send_drv_version()
2702 val = cpu_to_be32(*((u32 *)&p_ver->name[i * sizeof(u32)])); in qed_mcp_send_drv_version()
2710 rc = qed_mcp_cmd_and_union(p_hwfn, p_ptt, &mb_params); in qed_mcp_send_drv_version()
2711 if (rc) in qed_mcp_send_drv_version()
2714 return rc; in qed_mcp_send_drv_version()
2724 int rc; in qed_mcp_halt() local
2726 rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_MCP_HALT, 0, &resp, in qed_mcp_halt()
2728 if (rc) { in qed_mcp_halt()
2730 return rc; in qed_mcp_halt()
2742 "Failed to halt the MCP [CPU_MODE = 0x%08x, CPU_STATE = 0x%08x]\n", in qed_mcp_halt()
2744 return -EBUSY; in qed_mcp_halt()
2768 "Failed to resume the MCP [CPU_MODE = 0x%08x, CPU_STATE = 0x%08x]\n", in qed_mcp_resume()
2770 return -EBUSY; in qed_mcp_resume()
2784 int rc; in qed_mcp_ov_update_current_config() local
2798 return -EINVAL; in qed_mcp_ov_update_current_config()
2801 rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_OV_UPDATE_CURR_CFG, in qed_mcp_ov_update_current_config()
2803 if (rc) in qed_mcp_ov_update_current_config()
2806 return rc; in qed_mcp_ov_update_current_config()
2815 int rc; in qed_mcp_ov_update_driver_state() local
2829 return -EINVAL; in qed_mcp_ov_update_driver_state()
2832 rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_OV_UPDATE_DRIVER_STATE, in qed_mcp_ov_update_driver_state()
2834 if (rc) in qed_mcp_ov_update_driver_state()
2837 return rc; in qed_mcp_ov_update_driver_state()
2845 int rc; in qed_mcp_ov_update_mtu() local
2848 rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_OV_UPDATE_MTU, in qed_mcp_ov_update_mtu()
2850 if (rc) in qed_mcp_ov_update_mtu()
2851 DP_ERR(p_hwfn, "Failed to send mtu value, rc = %d\n", rc); in qed_mcp_ov_update_mtu()
2853 return rc; in qed_mcp_ov_update_mtu()
2861 int rc; in qed_mcp_ov_update_mac() local
2870 * in 32-bit granularity. in qed_mcp_ov_update_mac()
2879 rc = qed_mcp_cmd_and_union(p_hwfn, p_ptt, &mb_params); in qed_mcp_ov_update_mac()
2880 if (rc) in qed_mcp_ov_update_mac()
2881 DP_ERR(p_hwfn, "Failed to send mac address, rc = %d\n", rc); in qed_mcp_ov_update_mac()
2884 memcpy(p_hwfn->cdev->wol_mac, mac, ETH_ALEN); in qed_mcp_ov_update_mac()
2886 return rc; in qed_mcp_ov_update_mac()
2894 int rc; in qed_mcp_ov_update_wol() local
2896 if (p_hwfn->hw_info.b_wol_support == QED_WOL_SUPPORT_NONE) { in qed_mcp_ov_update_wol()
2899 return -EINVAL; in qed_mcp_ov_update_wol()
2914 return -EINVAL; in qed_mcp_ov_update_wol()
2917 rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_OV_UPDATE_WOL, in qed_mcp_ov_update_wol()
2919 if (rc) in qed_mcp_ov_update_wol()
2920 DP_ERR(p_hwfn, "Failed to send wol mode, rc = %d\n", rc); in qed_mcp_ov_update_wol()
2923 p_hwfn->cdev->wol_config = (u8)wol; in qed_mcp_ov_update_wol()
2925 return rc; in qed_mcp_ov_update_wol()
2934 int rc; in qed_mcp_ov_update_eswitch() local
2948 return -EINVAL; in qed_mcp_ov_update_eswitch()
2951 rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_OV_UPDATE_ESWITCH_MODE, in qed_mcp_ov_update_eswitch()
2953 if (rc) in qed_mcp_ov_update_eswitch()
2954 DP_ERR(p_hwfn, "Failed to send eswitch mode, rc = %d\n", rc); in qed_mcp_ov_update_eswitch()
2956 return rc; in qed_mcp_ov_update_eswitch()
2963 int rc; in qed_mcp_set_led() local
2977 return -EINVAL; in qed_mcp_set_led()
2980 rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_SET_LED_MODE, in qed_mcp_set_led()
2983 return rc; in qed_mcp_set_led()
2990 int rc; in qed_mcp_mask_parities() local
2992 rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_MASK_PARITIES, in qed_mcp_mask_parities()
2995 if (rc) { in qed_mcp_mask_parities()
3001 rc = -EINVAL; in qed_mcp_mask_parities()
3004 return rc; in qed_mcp_mask_parities()
3013 int rc = 0; in qed_mcp_nvm_read() local
3017 return -EBUSY; in qed_mcp_nvm_read()
3022 rc = qed_mcp_nvm_rd_cmd(p_hwfn, p_ptt, in qed_mcp_nvm_read()
3031 if (rc || (resp != FW_MSG_CODE_NVM_OK)) { in qed_mcp_nvm_read()
3032 DP_NOTICE(cdev, "MCP command rc = %d\n", rc); in qed_mcp_nvm_read()
3040 (bytes_left - read_len) % 0x1000) in qed_mcp_nvm_read()
3044 bytes_left -= read_len; in qed_mcp_nvm_read()
3047 cdev->mcp_nvm_resp = resp; in qed_mcp_nvm_read()
3050 return rc; in qed_mcp_nvm_read()
3060 return -EBUSY; in qed_mcp_nvm_resp()
3062 memcpy(p_buf, &cdev->mcp_nvm_resp, sizeof(cdev->mcp_nvm_resp)); in qed_mcp_nvm_resp()
3074 int rc = -EINVAL; in qed_mcp_nvm_write() local
3078 return -EBUSY; in qed_mcp_nvm_write()
3091 DP_NOTICE(p_hwfn, "Invalid nvm write command 0x%x\n", cmd); in qed_mcp_nvm_write()
3092 rc = -EINVAL; in qed_mcp_nvm_write()
3096 buf_size = min_t(u32, (len - buf_idx), MCP_DRV_NVM_BUF_LEN); in qed_mcp_nvm_write()
3104 rc = qed_mcp_nvm_wr_cmd(p_hwfn, p_ptt, nvm_cmd, nvm_offset, in qed_mcp_nvm_write()
3107 if (rc) { in qed_mcp_nvm_write()
3108 DP_NOTICE(cdev, "nvm write failed, rc = %d\n", rc); in qed_mcp_nvm_write()
3117 "nvm write failed, resp = 0x%08x\n", resp); in qed_mcp_nvm_write()
3118 rc = -EINVAL; in qed_mcp_nvm_write()
3123 * isn't pre-emptable. Sleep a bit to prevent CPU hogging. in qed_mcp_nvm_write()
3138 buf_size = min_t(u32, (len - buf_idx), in qed_mcp_nvm_write()
3143 cdev->mcp_nvm_resp = resp; in qed_mcp_nvm_write()
3147 return rc; in qed_mcp_nvm_write()
3155 int rc; in qed_mcp_phy_sfp_read() local
3176 rc = qed_mcp_nvm_rd_cmd(p_hwfn, p_ptt, in qed_mcp_phy_sfp_read()
3180 if (rc) { in qed_mcp_phy_sfp_read()
3182 "Failed to send a transceiver read command to the MFW. rc = %d.\n", in qed_mcp_phy_sfp_read()
3183 rc); in qed_mcp_phy_sfp_read()
3184 return rc; in qed_mcp_phy_sfp_read()
3188 return -ENODEV; in qed_mcp_phy_sfp_read()
3190 return -EINVAL; in qed_mcp_phy_sfp_read()
3193 bytes_left -= buf_size; in qed_mcp_phy_sfp_read()
3202 int rc = 0; in qed_mcp_bist_register_test() local
3207 rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_BIST_TEST, in qed_mcp_bist_register_test()
3210 if (rc) in qed_mcp_bist_register_test()
3211 return rc; in qed_mcp_bist_register_test()
3215 rc = -EAGAIN; in qed_mcp_bist_register_test()
3217 return rc; in qed_mcp_bist_register_test()
3223 int rc = 0; in qed_mcp_bist_clock_test() local
3228 rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_BIST_TEST, in qed_mcp_bist_clock_test()
3231 if (rc) in qed_mcp_bist_clock_test()
3232 return rc; in qed_mcp_bist_clock_test()
3236 rc = -EAGAIN; in qed_mcp_bist_clock_test()
3238 return rc; in qed_mcp_bist_clock_test()
3246 int rc = 0; in qed_mcp_bist_nvm_get_num_images() local
3251 rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_BIST_TEST, in qed_mcp_bist_nvm_get_num_images()
3253 if (rc) in qed_mcp_bist_nvm_get_num_images()
3254 return rc; in qed_mcp_bist_nvm_get_num_images()
3257 rc = -EINVAL; in qed_mcp_bist_nvm_get_num_images()
3259 return rc; in qed_mcp_bist_nvm_get_num_images()
3268 int rc; in qed_mcp_bist_nvm_get_image_att() local
3274 rc = qed_mcp_nvm_rd_cmd(p_hwfn, p_ptt, in qed_mcp_bist_nvm_get_image_att()
3279 if (rc) in qed_mcp_bist_nvm_get_image_att()
3280 return rc; in qed_mcp_bist_nvm_get_image_att()
3283 (p_image_att->return_code != 1)) in qed_mcp_bist_nvm_get_image_att()
3284 rc = -EINVAL; in qed_mcp_bist_nvm_get_image_att()
3286 return rc; in qed_mcp_bist_nvm_get_image_att()
3293 int rc; in qed_mcp_nvm_info_populate() local
3296 if (p_hwfn->nvm_info.valid) in qed_mcp_nvm_info_populate()
3302 return -EBUSY; in qed_mcp_nvm_info_populate()
3307 rc = qed_mcp_bist_nvm_get_num_images(p_hwfn, in qed_mcp_nvm_info_populate()
3309 if (rc == -EOPNOTSUPP) { in qed_mcp_nvm_info_populate()
3312 } else if (rc || !nvm_info.num_images) { in qed_mcp_nvm_info_populate()
3321 rc = -ENOMEM; in qed_mcp_nvm_info_populate()
3327 rc = qed_mcp_bist_nvm_get_image_att(p_hwfn, p_ptt, in qed_mcp_nvm_info_populate()
3329 if (rc) { in qed_mcp_nvm_info_populate()
3335 DP_VERBOSE(p_hwfn, QED_MSG_SP, "image index %d, size %x\n", i, in qed_mcp_nvm_info_populate()
3341 p_hwfn->nvm_info.num_images = nvm_info.num_images; in qed_mcp_nvm_info_populate()
3342 kfree(p_hwfn->nvm_info.image_att); in qed_mcp_nvm_info_populate()
3343 p_hwfn->nvm_info.image_att = nvm_info.image_att; in qed_mcp_nvm_info_populate()
3344 p_hwfn->nvm_info.valid = true; in qed_mcp_nvm_info_populate()
3354 return rc; in qed_mcp_nvm_info_populate()
3359 kfree(p_hwfn->nvm_info.image_att); in qed_mcp_nvm_info_free()
3360 p_hwfn->nvm_info.image_att = NULL; in qed_mcp_nvm_info_free()
3361 p_hwfn->nvm_info.valid = false; in qed_mcp_nvm_info_free()
3370 int rc; in qed_mcp_get_nvm_image_att() local
3394 DP_NOTICE(p_hwfn, "Unknown request of image_id %08x\n", in qed_mcp_get_nvm_image_att()
3396 return -EINVAL; in qed_mcp_get_nvm_image_att()
3399 rc = qed_mcp_nvm_info_populate(p_hwfn); in qed_mcp_get_nvm_image_att()
3400 if (rc) in qed_mcp_get_nvm_image_att()
3401 return rc; in qed_mcp_get_nvm_image_att()
3403 for (i = 0; i < p_hwfn->nvm_info.num_images; i++) in qed_mcp_get_nvm_image_att()
3404 if (type == p_hwfn->nvm_info.image_att[i].image_type) in qed_mcp_get_nvm_image_att()
3406 if (i == p_hwfn->nvm_info.num_images) { in qed_mcp_get_nvm_image_att()
3408 "Failed to find nvram image of type %08x\n", in qed_mcp_get_nvm_image_att()
3410 return -ENOENT; in qed_mcp_get_nvm_image_att()
3413 p_image_att->start_addr = p_hwfn->nvm_info.image_att[i].nvm_start_addr; in qed_mcp_get_nvm_image_att()
3414 p_image_att->length = p_hwfn->nvm_info.image_att[i].len; in qed_mcp_get_nvm_image_att()
3424 int rc; in qed_mcp_get_nvm_image() local
3428 rc = qed_mcp_get_nvm_image_att(p_hwfn, image_id, &image_att); in qed_mcp_get_nvm_image()
3429 if (rc) in qed_mcp_get_nvm_image()
3430 return rc; in qed_mcp_get_nvm_image()
3432 /* Validate sizes - both the image's and the supplied buffer's */ in qed_mcp_get_nvm_image()
3435 "Image [%d] is too small - only %d bytes\n", in qed_mcp_get_nvm_image()
3437 return -EINVAL; in qed_mcp_get_nvm_image()
3443 "Image [%d] is too big - %08x bytes where only %08x are available\n", in qed_mcp_get_nvm_image()
3445 return -ENOMEM; in qed_mcp_get_nvm_image()
3448 return qed_mcp_nvm_read(p_hwfn->cdev, image_att.start_addr, in qed_mcp_get_nvm_image()
3539 int rc; in qed_mcp_resc_allocation_msg() local
3543 mfw_resc_info.res_id = qed_mcp_get_mfw_res_id(p_in_params->res_id); in qed_mcp_resc_allocation_msg()
3547 p_in_params->res_id, in qed_mcp_resc_allocation_msg()
3548 qed_hw_get_resc_name(p_in_params->res_id)); in qed_mcp_resc_allocation_msg()
3549 return -EINVAL; in qed_mcp_resc_allocation_msg()
3552 switch (p_in_params->cmd) { in qed_mcp_resc_allocation_msg()
3554 mfw_resc_info.size = p_in_params->resc_max_val; in qed_mcp_resc_allocation_msg()
3559 DP_ERR(p_hwfn, "Unexpected resource alloc command [0x%08x]\n", in qed_mcp_resc_allocation_msg()
3560 p_in_params->cmd); in qed_mcp_resc_allocation_msg()
3561 return -EINVAL; in qed_mcp_resc_allocation_msg()
3565 mb_params.cmd = p_in_params->cmd; in qed_mcp_resc_allocation_msg()
3574 "Resource message request: cmd 0x%08x, res_id %d [%s], hsi_version %d.%d, val 0x%x\n", in qed_mcp_resc_allocation_msg()
3575 p_in_params->cmd, in qed_mcp_resc_allocation_msg()
3576 p_in_params->res_id, in qed_mcp_resc_allocation_msg()
3577 qed_hw_get_resc_name(p_in_params->res_id), in qed_mcp_resc_allocation_msg()
3582 p_in_params->resc_max_val); in qed_mcp_resc_allocation_msg()
3584 rc = qed_mcp_cmd_and_union(p_hwfn, p_ptt, &mb_params); in qed_mcp_resc_allocation_msg()
3585 if (rc) in qed_mcp_resc_allocation_msg()
3586 return rc; in qed_mcp_resc_allocation_msg()
3588 p_out_params->mcp_resp = mb_params.mcp_resp; in qed_mcp_resc_allocation_msg()
3589 p_out_params->mcp_param = mb_params.mcp_param; in qed_mcp_resc_allocation_msg()
3590 p_out_params->resc_num = mfw_resc_info.size; in qed_mcp_resc_allocation_msg()
3591 p_out_params->resc_start = mfw_resc_info.offset; in qed_mcp_resc_allocation_msg()
3592 p_out_params->vf_resc_num = mfw_resc_info.vf_size; in qed_mcp_resc_allocation_msg()
3593 p_out_params->vf_resc_start = mfw_resc_info.vf_offset; in qed_mcp_resc_allocation_msg()
3594 p_out_params->flags = mfw_resc_info.flags; in qed_mcp_resc_allocation_msg()
3598 …e message response: mfw_hsi_version %d.%d, num 0x%x, start 0x%x, vf_num 0x%x, vf_start 0x%x, flags… in qed_mcp_resc_allocation_msg()
3599 QED_MFW_GET_FIELD(p_out_params->mcp_param, in qed_mcp_resc_allocation_msg()
3601 QED_MFW_GET_FIELD(p_out_params->mcp_param, in qed_mcp_resc_allocation_msg()
3603 p_out_params->resc_num, in qed_mcp_resc_allocation_msg()
3604 p_out_params->resc_start, in qed_mcp_resc_allocation_msg()
3605 p_out_params->vf_resc_num, in qed_mcp_resc_allocation_msg()
3606 p_out_params->vf_resc_start, p_out_params->flags); in qed_mcp_resc_allocation_msg()
3619 int rc; in qed_mcp_set_resc_max_val() local
3626 rc = qed_mcp_resc_allocation_msg(p_hwfn, p_ptt, &in_params, in qed_mcp_set_resc_max_val()
3628 if (rc) in qed_mcp_set_resc_max_val()
3629 return rc; in qed_mcp_set_resc_max_val()
3644 int rc; in qed_mcp_get_resc_info() local
3650 rc = qed_mcp_resc_allocation_msg(p_hwfn, p_ptt, &in_params, in qed_mcp_get_resc_info()
3652 if (rc) in qed_mcp_get_resc_info()
3653 return rc; in qed_mcp_get_resc_info()
3677 int rc; in qed_mcp_resource_cmd() local
3679 rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_RESOURCE_CMD, param, in qed_mcp_resource_cmd()
3681 if (rc) in qed_mcp_resource_cmd()
3682 return rc; in qed_mcp_resource_cmd()
3687 return -EINVAL; in qed_mcp_resource_cmd()
3694 "The resource command is unknown to the MFW [param 0x%08x, opcode %d]\n", in qed_mcp_resource_cmd()
3696 return -EINVAL; in qed_mcp_resource_cmd()
3699 return rc; in qed_mcp_resource_cmd()
3709 int rc; in __qed_mcp_resc_lock() local
3711 switch (p_params->timeout) { in __qed_mcp_resc_lock()
3714 p_params->timeout = 0; in __qed_mcp_resc_lock()
3718 p_params->timeout = 0; in __qed_mcp_resc_lock()
3725 QED_MFW_SET_FIELD(param, RESOURCE_CMD_REQ_RESC, p_params->resource); in __qed_mcp_resc_lock()
3727 QED_MFW_SET_FIELD(param, RESOURCE_CMD_REQ_AGE, p_params->timeout); in __qed_mcp_resc_lock()
3731 "Resource lock request: param 0x%08x [age %d, opcode %d, resource %d]\n", in __qed_mcp_resc_lock()
3732 param, p_params->timeout, opcode, p_params->resource); in __qed_mcp_resc_lock()
3735 rc = qed_mcp_resource_cmd(p_hwfn, p_ptt, param, &mcp_resp, &mcp_param); in __qed_mcp_resc_lock()
3736 if (rc) in __qed_mcp_resc_lock()
3737 return rc; in __qed_mcp_resc_lock()
3740 p_params->owner = QED_MFW_GET_FIELD(mcp_param, RESOURCE_CMD_RSP_OWNER); in __qed_mcp_resc_lock()
3745 "Resource lock response: mcp_param 0x%08x [opcode %d, owner %d]\n", in __qed_mcp_resc_lock()
3746 mcp_param, opcode, p_params->owner); in __qed_mcp_resc_lock()
3750 p_params->b_granted = true; in __qed_mcp_resc_lock()
3753 p_params->b_granted = false; in __qed_mcp_resc_lock()
3757 "Unexpected opcode in resource lock response [mcp_param 0x%08x, opcode %d]\n", in __qed_mcp_resc_lock()
3759 return -EINVAL; in __qed_mcp_resc_lock()
3770 int rc; in qed_mcp_resc_lock() local
3775 if (p_params->sleep_b4_retry) { in qed_mcp_resc_lock()
3777 DIV_ROUND_UP(p_params->retry_interval, in qed_mcp_resc_lock()
3782 udelay(p_params->retry_interval); in qed_mcp_resc_lock()
3786 rc = __qed_mcp_resc_lock(p_hwfn, p_ptt, p_params); in qed_mcp_resc_lock()
3787 if (rc) in qed_mcp_resc_lock()
3788 return rc; in qed_mcp_resc_lock()
3790 if (p_params->b_granted) in qed_mcp_resc_lock()
3792 } while (retry_cnt++ < p_params->retry_num); in qed_mcp_resc_lock()
3804 int rc; in qed_mcp_resc_unlock() local
3806 opcode = p_params->b_force ? RESOURCE_OPCODE_FORCE_RELEASE in qed_mcp_resc_unlock()
3808 QED_MFW_SET_FIELD(param, RESOURCE_CMD_REQ_RESC, p_params->resource); in qed_mcp_resc_unlock()
3812 "Resource unlock request: param 0x%08x [opcode %d, resource %d]\n", in qed_mcp_resc_unlock()
3813 param, opcode, p_params->resource); in qed_mcp_resc_unlock()
3816 rc = qed_mcp_resource_cmd(p_hwfn, p_ptt, param, &mcp_resp, &mcp_param); in qed_mcp_resc_unlock()
3817 if (rc) in qed_mcp_resc_unlock()
3818 return rc; in qed_mcp_resc_unlock()
3824 "Resource unlock response: mcp_param 0x%08x [opcode %d]\n", in qed_mcp_resc_unlock()
3831 p_params->resource); in qed_mcp_resc_unlock()
3834 p_params->b_released = true; in qed_mcp_resc_unlock()
3837 p_params->b_released = false; in qed_mcp_resc_unlock()
3841 "Unexpected opcode in resource unlock response [mcp_param 0x%08x, opcode %d]\n", in qed_mcp_resc_unlock()
3843 return -EINVAL; in qed_mcp_resc_unlock()
3862 p_lock->timeout = QED_MCP_RESC_LOCK_TO_NONE; in qed_mcp_resc_lock_default_init()
3864 p_lock->retry_num = QED_MCP_RESC_LOCK_RETRY_CNT_DFLT; in qed_mcp_resc_lock_default_init()
3865 p_lock->retry_interval = in qed_mcp_resc_lock_default_init()
3867 p_lock->sleep_b4_retry = true; in qed_mcp_resc_lock_default_init()
3870 p_lock->resource = resource; in qed_mcp_resc_lock_default_init()
3875 p_unlock->resource = resource; in qed_mcp_resc_lock_default_init()
3881 return !!(p_hwfn->mcp_info->capabilities & in qed_mcp_is_smart_an_supported()
3888 int rc; in qed_mcp_get_capabilities() local
3890 rc = qed_mcp_cmd(p_hwfn, p_ptt, DRV_MSG_CODE_GET_MFW_FEATURE_SUPPORT, in qed_mcp_get_capabilities()
3891 0, &mcp_resp, &p_hwfn->mcp_info->capabilities); in qed_mcp_get_capabilities()
3892 if (!rc) in qed_mcp_get_capabilities()
3894 "MFW supported features: %08x\n", in qed_mcp_get_capabilities()
3895 p_hwfn->mcp_info->capabilities); in qed_mcp_get_capabilities()
3897 return rc; in qed_mcp_get_capabilities()
3908 if (QED_IS_E5(p_hwfn->cdev)) in qed_mcp_set_capabilities()
3919 struct qed_dev *cdev = p_hwfn->cdev; in qed_mcp_get_engine_config()
3921 int rc; in qed_mcp_get_engine_config() local
3924 rc = qed_mcp_cmd_and_union(p_hwfn, p_ptt, &mb_params); in qed_mcp_get_engine_config()
3925 if (rc) in qed_mcp_get_engine_config()
3926 return rc; in qed_mcp_get_engine_config()
3931 return -EOPNOTSUPP; in qed_mcp_get_engine_config()
3937 cdev->fir_affin = in qed_mcp_get_engine_config()
3944 cdev->l2_affin_hint = in qed_mcp_get_engine_config()
3950 fir_valid, cdev->fir_affin, l2_valid, cdev->l2_affin_hint); in qed_mcp_get_engine_config()
3958 struct qed_dev *cdev = p_hwfn->cdev; in qed_mcp_get_ppfid_bitmap()
3959 int rc; in qed_mcp_get_ppfid_bitmap() local
3962 rc = qed_mcp_cmd_and_union(p_hwfn, p_ptt, &mb_params); in qed_mcp_get_ppfid_bitmap()
3963 if (rc) in qed_mcp_get_ppfid_bitmap()
3964 return rc; in qed_mcp_get_ppfid_bitmap()
3969 return -EOPNOTSUPP; in qed_mcp_get_ppfid_bitmap()
3972 cdev->ppfid_bitmap = QED_MFW_GET_FIELD(mb_params.mcp_param, in qed_mcp_get_ppfid_bitmap()
3975 DP_VERBOSE(p_hwfn, QED_MSG_SP, "PPFID bitmap 0x%hhx\n", in qed_mcp_get_ppfid_bitmap()
3976 cdev->ppfid_bitmap); in qed_mcp_get_ppfid_bitmap()
3986 int rc; in qed_mcp_nvm_get_cfg() local
4003 rc = qed_mcp_nvm_rd_cmd(p_hwfn, p_ptt, in qed_mcp_nvm_get_cfg()
4007 return rc; in qed_mcp_nvm_get_cfg()
4045 (QED_MCP_DBG_DATA_MAX_SIZE - QED_MCP_DBG_DATA_MAX_HEADER_SIZE)
4052 int rc; in __qed_mcp_send_debug_data() local
4058 return -EINVAL; in __qed_mcp_send_debug_data()
4066 rc = qed_mcp_cmd_and_union(p_hwfn, p_ptt, &mb_params); in __qed_mcp_send_debug_data()
4067 if (rc) in __qed_mcp_send_debug_data()
4068 return rc; in __qed_mcp_send_debug_data()
4073 return -EOPNOTSUPP; in __qed_mcp_send_debug_data()
4076 return -EBUSY; in __qed_mcp_send_debug_data()
4079 "Failed to send debug data to the MFW [resp 0x%08x]\n", in __qed_mcp_send_debug_data()
4081 return -EINVAL; in __qed_mcp_send_debug_data()
4113 int rc; in qed_mcp_send_debug_data() local
4118 seq = (u16)atomic_inc_return(&p_hwfn->mcp_info->dbg_data_seq); in qed_mcp_send_debug_data()
4127 SET_MFW_FIELD(*p_header, QED_MCP_DBG_DATA_HDR_PF, p_hwfn->abs_pf_id); in qed_mcp_send_debug_data()
4131 rc = __qed_mcp_send_debug_data(p_hwfn, p_ptt, raw_data, in qed_mcp_send_debug_data()
4133 if (rc) in qed_mcp_send_debug_data()
4134 return rc; in qed_mcp_send_debug_data()
4144 tmp_size -= QED_MCP_DBG_DATA_MAX_PAYLOAD_SIZE; in qed_mcp_send_debug_data()