Lines Matching +full:primary +full:- +full:bond
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.
11 #include <linux/dma-mapping.h>
72 db_entry->db_addr, in qed_db_recovery_dp_entry()
73 db_entry->db_data, in qed_db_recovery_dp_entry()
74 db_entry->db_width == DB_REC_WIDTH_32B ? "32b" : "64b", in qed_db_recovery_dp_entry()
75 db_entry->db_space == DB_REC_USER ? "user" : "kernel", in qed_db_recovery_dp_entry()
76 db_entry->hwfn_idx); in qed_db_recovery_dp_entry()
88 if (db_addr < cdev->doorbells || in qed_db_rec_sanity()
90 (u8 __iomem *)cdev->doorbells + cdev->db_size) { in qed_db_rec_sanity()
94 cdev->doorbells, in qed_db_rec_sanity()
95 (u8 __iomem *)cdev->doorbells + cdev->db_size); in qed_db_rec_sanity()
115 if (cdev->num_hwfns > 1) in qed_db_rec_find_hwfn()
116 p_hwfn = db_addr < cdev->hwfns[1].doorbells ? in qed_db_rec_find_hwfn()
117 &cdev->hwfns[0] : &cdev->hwfns[1]; in qed_db_rec_find_hwfn()
137 QED_MSG_IOV, "db recovery - skipping VF doorbell\n"); in qed_db_recovery_add()
143 return -EINVAL; in qed_db_recovery_add()
152 return -ENOMEM; in qed_db_recovery_add()
156 db_entry->db_addr = db_addr; in qed_db_recovery_add()
157 db_entry->db_data = db_data; in qed_db_recovery_add()
158 db_entry->db_width = db_width; in qed_db_recovery_add()
159 db_entry->db_space = db_space; in qed_db_recovery_add()
160 db_entry->hwfn_idx = p_hwfn->my_id; in qed_db_recovery_add()
166 spin_lock_bh(&p_hwfn->db_recovery_info.lock); in qed_db_recovery_add()
167 list_add_tail(&db_entry->list_entry, &p_hwfn->db_recovery_info.list); in qed_db_recovery_add()
168 spin_unlock_bh(&p_hwfn->db_recovery_info.lock); in qed_db_recovery_add()
179 int rc = -EINVAL; in qed_db_recovery_del()
184 QED_MSG_IOV, "db recovery - skipping VF doorbell\n"); in qed_db_recovery_del()
192 spin_lock_bh(&p_hwfn->db_recovery_info.lock); in qed_db_recovery_del()
194 &p_hwfn->db_recovery_info.list, list_entry) { in qed_db_recovery_del()
196 if (db_entry->db_data == db_data) { in qed_db_recovery_del()
198 list_del(&db_entry->list_entry); in qed_db_recovery_del()
204 spin_unlock_bh(&p_hwfn->db_recovery_info.lock); in qed_db_recovery_del()
206 if (rc == -EINVAL) in qed_db_recovery_del()
223 if (!p_hwfn->cdev->db_size) { in qed_db_recovery_setup()
224 DP_ERR(p_hwfn->cdev, "db_size not set\n"); in qed_db_recovery_setup()
225 return -EINVAL; in qed_db_recovery_setup()
228 INIT_LIST_HEAD(&p_hwfn->db_recovery_info.list); in qed_db_recovery_setup()
229 spin_lock_init(&p_hwfn->db_recovery_info.lock); in qed_db_recovery_setup()
230 p_hwfn->db_recovery_info.db_recovery_counter = 0; in qed_db_recovery_setup()
241 if (!list_empty(&p_hwfn->db_recovery_info.list)) { in qed_db_recovery_teardown()
245 while (!list_empty(&p_hwfn->db_recovery_info.list)) { in qed_db_recovery_teardown()
247 list_first_entry(&p_hwfn->db_recovery_info.list, in qed_db_recovery_teardown()
251 list_del(&db_entry->list_entry); in qed_db_recovery_teardown()
255 p_hwfn->db_recovery_info.db_recovery_counter = 0; in qed_db_recovery_teardown()
263 if (db_entry->db_width == DB_REC_WIDTH_32B) { in qed_db_recovery_ring()
266 db_entry->db_addr, in qed_db_recovery_ring()
267 *(u32 *)db_entry->db_data); in qed_db_recovery_ring()
271 db_entry->db_addr, in qed_db_recovery_ring()
272 *(u64 *)(db_entry->db_data)); in qed_db_recovery_ring()
276 if (!qed_db_rec_sanity(p_hwfn->cdev, db_entry->db_addr, in qed_db_recovery_ring()
277 db_entry->db_width, db_entry->db_data)) in qed_db_recovery_ring()
287 if (db_entry->db_width == DB_REC_WIDTH_32B) in qed_db_recovery_ring()
288 DIRECT_REG_WR(db_entry->db_addr, in qed_db_recovery_ring()
289 *(u32 *)(db_entry->db_data)); in qed_db_recovery_ring()
291 DIRECT_REG_WR64(db_entry->db_addr, in qed_db_recovery_ring()
292 *(u64 *)(db_entry->db_data)); in qed_db_recovery_ring()
306 p_hwfn->db_recovery_info.db_recovery_counter); in qed_db_recovery_execute()
309 p_hwfn->db_recovery_info.db_recovery_counter++; in qed_db_recovery_execute()
312 spin_lock_bh(&p_hwfn->db_recovery_info.lock); in qed_db_recovery_execute()
314 &p_hwfn->db_recovery_info.list, list_entry) in qed_db_recovery_execute()
316 spin_unlock_bh(&p_hwfn->db_recovery_info.lock); in qed_db_recovery_execute()
366 struct qed_llh_info *p_llh_info = cdev->p_llh_info; in qed_llh_free()
370 if (p_llh_info->pp_filters) in qed_llh_free()
371 for (i = 0; i < p_llh_info->num_ppfid; i++) in qed_llh_free()
372 kfree(p_llh_info->pp_filters[i]); in qed_llh_free()
374 kfree(p_llh_info->pp_filters); in qed_llh_free()
378 cdev->p_llh_info = NULL; in qed_llh_free()
388 return -ENOMEM; in qed_llh_alloc()
389 cdev->p_llh_info = p_llh_info; in qed_llh_alloc()
392 if (!(cdev->ppfid_bitmap & (0x1 << i))) in qed_llh_alloc()
395 p_llh_info->ppfid_array[p_llh_info->num_ppfid] = i; in qed_llh_alloc()
397 p_llh_info->num_ppfid, i); in qed_llh_alloc()
398 p_llh_info->num_ppfid++; in qed_llh_alloc()
401 size = p_llh_info->num_ppfid * sizeof(*p_llh_info->pp_filters); in qed_llh_alloc()
402 p_llh_info->pp_filters = kzalloc(size, GFP_KERNEL); in qed_llh_alloc()
403 if (!p_llh_info->pp_filters) in qed_llh_alloc()
404 return -ENOMEM; in qed_llh_alloc()
407 sizeof(**p_llh_info->pp_filters); in qed_llh_alloc()
408 for (i = 0; i < p_llh_info->num_ppfid; i++) { in qed_llh_alloc()
409 p_llh_info->pp_filters[i] = kzalloc(size, GFP_KERNEL); in qed_llh_alloc()
410 if (!p_llh_info->pp_filters[i]) in qed_llh_alloc()
411 return -ENOMEM; in qed_llh_alloc()
420 struct qed_llh_info *p_llh_info = cdev->p_llh_info; in qed_llh_shadow_sanity()
422 if (ppfid >= p_llh_info->num_ppfid) { in qed_llh_shadow_sanity()
425 action, ppfid, p_llh_info->num_ppfid); in qed_llh_shadow_sanity()
426 return -EINVAL; in qed_llh_shadow_sanity()
433 return -EINVAL; in qed_llh_shadow_sanity()
446 struct qed_llh_info *p_llh_info = cdev->p_llh_info; in qed_llh_shadow_search_filter()
457 p_filters = p_llh_info->pp_filters[ppfid]; in qed_llh_shadow_search_filter()
472 struct qed_llh_info *p_llh_info = cdev->p_llh_info; in qed_llh_shadow_get_free_idx()
483 p_filters = p_llh_info->pp_filters[ppfid]; in qed_llh_shadow_get_free_idx()
501 struct qed_llh_info *p_llh_info = cdev->p_llh_info; in __qed_llh_shadow_add_filter()
509 p_filters = p_llh_info->pp_filters[ppfid]; in __qed_llh_shadow_add_filter()
548 return -EINVAL; in qed_llh_shadow_add_filter()
559 struct qed_llh_info *p_llh_info = cdev->p_llh_info; in __qed_llh_shadow_remove_filter()
567 p_filters = p_llh_info->pp_filters[ppfid]; in __qed_llh_shadow_remove_filter()
571 return -EINVAL; in __qed_llh_shadow_remove_filter()
574 *p_ref_cnt = --p_filters[filter_idx].ref_cnt; in __qed_llh_shadow_remove_filter()
597 return -EINVAL; in qed_llh_shadow_remove_filter()
606 struct qed_llh_info *p_llh_info = cdev->p_llh_info; in qed_llh_abs_ppfid()
608 if (ppfid >= p_llh_info->num_ppfid) { in qed_llh_abs_ppfid()
611 ppfid, p_llh_info->num_ppfid - 1); in qed_llh_abs_ppfid()
613 return -EINVAL; in qed_llh_abs_ppfid()
616 *p_abs_ppfid = p_llh_info->ppfid_array[ppfid]; in qed_llh_abs_ppfid()
624 struct qed_dev *cdev = p_hwfn->cdev; in qed_llh_set_engine_affin()
630 if (rc != 0 && rc != -EOPNOTSUPP) { in qed_llh_set_engine_affin()
638 eng = cdev->fir_affin ? QED_ENG1 : QED_ENG0; in qed_llh_set_engine_affin()
655 eng = cdev->fir_affin ? QED_ENG1 : QED_ENG0; in qed_llh_set_engine_affin()
659 for (ppfid = 0; ppfid < cdev->p_llh_info->num_ppfid; ppfid++) { in qed_llh_set_engine_affin()
670 "LLH: Set the engine affinity of non-RoCE packets as %d\n", in qed_llh_set_engine_affin()
679 struct qed_dev *cdev = p_hwfn->cdev; in qed_llh_hw_init_pf()
683 for (ppfid = 0; ppfid < cdev->p_llh_info->num_ppfid; ppfid++) { in qed_llh_hw_init_pf()
691 qed_wr(p_hwfn, p_ptt, addr, p_hwfn->rel_pf_id); in qed_llh_hw_init_pf()
694 if (test_bit(QED_MF_LLH_MAC_CLSS, &cdev->mf_bits) && in qed_llh_hw_init_pf()
697 p_hwfn->hw_info.hw_mac_addr); in qed_llh_hw_init_pf()
700 "Failed to add an LLH filter with the primary MAC\n"); in qed_llh_hw_init_pf()
714 return cdev->p_llh_info->num_ppfid; in qed_llh_get_num_ppfid()
731 return -EAGAIN; in qed_llh_set_ppfid_affinity()
752 rc = -EINVAL; in qed_llh_set_ppfid_affinity()
763 cdev->iwarp_affin = (eng == QED_ENG1) ? 1 : 0; in qed_llh_set_ppfid_affinity()
779 return -EAGAIN; in qed_llh_set_roce_affinity()
798 rc = -EINVAL; in qed_llh_set_roce_affinity()
802 for (ppfid = 0; ppfid < cdev->p_llh_info->num_ppfid; ppfid++) { in qed_llh_set_roce_affinity()
842 * The calculation of PPFID->PFID in AH is based on the relative index in qed_llh_access_filter()
846 if (QED_IS_BB(p_hwfn->cdev)) in qed_llh_access_filter()
849 pfid = abs_ppfid * p_hwfn->cdev->num_ports_in_engine + in qed_llh_access_filter()
852 /* Filter enable - should be done first when removing a filter */ in qed_llh_access_filter()
853 if (!p_details->enable) { in qed_llh_access_filter()
858 qed_wr(p_hwfn, p_ptt, addr, p_details->enable); in qed_llh_access_filter()
861 p_hwfn->rel_pf_id << in qed_llh_access_filter()
872 (u64)(uintptr_t)&p_details->value, in qed_llh_access_filter()
883 qed_wr(p_hwfn, p_ptt, addr, p_details->mode); in qed_llh_access_filter()
887 qed_wr(p_hwfn, p_ptt, addr, p_details->protocol_type); in qed_llh_access_filter()
891 qed_wr(p_hwfn, p_ptt, addr, p_details->hdr_sel); in qed_llh_access_filter()
893 /* Filter enable - should be done last when adding a filter */ in qed_llh_access_filter()
894 if (p_details->enable) { in qed_llh_access_filter()
896 qed_wr(p_hwfn, p_ptt, addr, p_details->enable); in qed_llh_access_filter()
900 p_hwfn->rel_pf_id << in qed_llh_access_filter()
918 /* Mode: 0: MAC-address classification 1: protocol classification */ in qed_llh_add_filter()
946 return -EAGAIN; in qed_llh_add_mac_filter()
948 if (!test_bit(QED_MF_LLH_MAC_CLSS, &cdev->mf_bits)) in qed_llh_add_mac_filter()
1025 return -EINVAL; in qed_llh_protocol_filter_stringify()
1059 return -EINVAL; in qed_llh_protocol_filter_to_hilo()
1079 return -EAGAIN; in qed_llh_add_protocol_filter()
1081 if (!test_bit(QED_MF_LLH_PROTO_CLSS, &cdev->mf_bits)) in qed_llh_add_protocol_filter()
1148 if (!test_bit(QED_MF_LLH_MAC_CLSS, &cdev->mf_bits)) in qed_llh_remove_mac_filter()
1201 if (!test_bit(QED_MF_LLH_PROTO_CLSS, &cdev->mf_bits)) in qed_llh_remove_protocol_filter()
1244 /******************************* NIG LLH - End ********************************/
1256 if (IS_VF(p_hwfn->cdev)) in qed_hw_bar_size()
1264 if (p_hwfn->cdev->num_hwfns > 1) { in qed_hw_bar_size()
1279 cdev->dp_level = dp_level; in qed_init_dp()
1280 cdev->dp_module = dp_module; in qed_init_dp()
1282 struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; in qed_init_dp()
1284 p_hwfn->dp_level = dp_level; in qed_init_dp()
1285 p_hwfn->dp_module = dp_module; in qed_init_dp()
1294 struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; in qed_init_struct()
1296 p_hwfn->cdev = cdev; in qed_init_struct()
1297 p_hwfn->my_id = i; in qed_init_struct()
1298 p_hwfn->b_active = false; in qed_init_struct()
1300 mutex_init(&p_hwfn->dmae_info.mutex); in qed_init_struct()
1304 cdev->hwfns[0].b_active = true; in qed_init_struct()
1307 cdev->cache_shift = 7; in qed_init_struct()
1312 struct qed_qm_info *qm_info = &p_hwfn->qm_info; in qed_qm_info_free()
1314 kfree(qm_info->qm_pq_params); in qed_qm_info_free()
1315 qm_info->qm_pq_params = NULL; in qed_qm_info_free()
1316 kfree(qm_info->qm_vport_params); in qed_qm_info_free()
1317 qm_info->qm_vport_params = NULL; in qed_qm_info_free()
1318 kfree(qm_info->qm_port_params); in qed_qm_info_free()
1319 qm_info->qm_port_params = NULL; in qed_qm_info_free()
1320 kfree(qm_info->wfq_data); in qed_qm_info_free()
1321 qm_info->wfq_data = NULL; in qed_qm_info_free()
1326 kfree(p_hwfn->dbg_user_info); in qed_dbg_user_data_free()
1327 p_hwfn->dbg_user_info = NULL; in qed_dbg_user_data_free()
1338 qed_l2_free(&cdev->hwfns[i]); in qed_resc_free()
1342 kfree(cdev->fw_data); in qed_resc_free()
1343 cdev->fw_data = NULL; in qed_resc_free()
1345 kfree(cdev->reset_stats); in qed_resc_free()
1346 cdev->reset_stats = NULL; in qed_resc_free()
1351 p_hwfn = cdev->hwfns + i; in qed_resc_free()
1352 rdma_info = p_hwfn->p_rdma_info; in qed_resc_free()
1363 if (p_hwfn->hw_info.personality == QED_PCI_FCOE) in qed_resc_free()
1366 if (p_hwfn->hw_info.personality == QED_PCI_ISCSI) { in qed_resc_free()
1371 if (p_hwfn->hw_info.personality == QED_PCI_NVMETCP) { in qed_resc_free()
1377 qed_spq_unregister_async_cb(p_hwfn, rdma_info->proto); in qed_resc_free()
1387 qed_fw_overlay_mem_free(p_hwfn, &p_hwfn->fw_overlay_mem); in qed_resc_free()
1407 if (IS_QED_SRIOV(p_hwfn->cdev)) in qed_get_pq_flags()
1411 switch (p_hwfn->hw_info.personality) { in qed_get_pq_flags()
1433 "unknown personality %d\n", p_hwfn->hw_info.personality); in qed_get_pq_flags()
1443 return p_hwfn->hw_info.num_hw_tc; in qed_init_qm_get_num_tcs()
1448 return IS_QED_SRIOV(p_hwfn->cdev) ? in qed_init_qm_get_num_vfs()
1449 p_hwfn->cdev->p_iov_info->total_vfs : 0; in qed_init_qm_get_num_vfs()
1477 num_pf_rls -= num_vfs + NUM_DEFAULT_RLS; in qed_init_qm_get_num_pf_rls()
1514 struct qed_qm_info *qm_info = &p_hwfn->qm_info; in qed_init_qm_params()
1518 qm_info->start_pq = (u16)RESC_START(p_hwfn, QED_PQ); in qed_init_qm_params()
1519 qm_info->start_vport = (u8)RESC_START(p_hwfn, QED_VPORT); in qed_init_qm_params()
1522 qm_info->vport_rl_en = true; in qed_init_qm_params()
1523 qm_info->vport_wfq_en = true; in qed_init_qm_params()
1526 four_port = p_hwfn->cdev->num_ports_in_engine == MAX_NUM_PORTS_K2; in qed_init_qm_params()
1529 qm_info->max_phys_tcs_per_port = four_port ? NUM_PHYS_TCS_4PORT_K2 : in qed_init_qm_params()
1533 * AH 4-port and 4 otherwise. in qed_init_qm_params()
1535 if (!qm_info->ooo_tc) in qed_init_qm_params()
1536 qm_info->ooo_tc = four_port ? DCBX_TCP_OOO_K2_4PORT_TC : in qed_init_qm_params()
1543 struct qed_qm_info *qm_info = &p_hwfn->qm_info; in qed_init_qm_vport_params()
1548 qm_info->qm_vport_params[i].wfq = 1; in qed_init_qm_vport_params()
1555 u8 i, active_phys_tcs, num_ports = p_hwfn->cdev->num_ports_in_engine; in qed_init_qm_port_params()
1556 struct qed_dev *cdev = p_hwfn->cdev; in qed_init_qm_port_params()
1565 &p_hwfn->qm_info.qm_port_params[i]; in qed_init_qm_port_params()
1568 p_qm_port->active = 1; in qed_init_qm_port_params()
1569 p_qm_port->active_phys_tcs = active_phys_tcs; in qed_init_qm_port_params()
1571 p_qm_port->num_pbf_cmd_lines = pbf_max_cmd_lines / num_ports; in qed_init_qm_port_params()
1572 p_qm_port->num_btb_blocks = NUM_OF_BTB_BLOCKS(cdev) / num_ports; in qed_init_qm_port_params()
1584 struct qed_qm_info *qm_info = &p_hwfn->qm_info; in qed_init_qm_reset_params()
1586 qm_info->num_pqs = 0; in qed_init_qm_reset_params()
1587 qm_info->num_vports = 0; in qed_init_qm_reset_params()
1588 qm_info->num_pf_rls = 0; in qed_init_qm_reset_params()
1589 qm_info->num_vf_pqs = 0; in qed_init_qm_reset_params()
1590 qm_info->first_vf_pq = 0; in qed_init_qm_reset_params()
1591 qm_info->first_mcos_pq = 0; in qed_init_qm_reset_params()
1592 qm_info->first_rl_pq = 0; in qed_init_qm_reset_params()
1597 struct qed_qm_info *qm_info = &p_hwfn->qm_info; in qed_init_qm_advance_vport()
1599 qm_info->num_vports++; in qed_init_qm_advance_vport()
1601 if (qm_info->num_vports > qed_init_qm_get_num_vports(p_hwfn)) in qed_init_qm_advance_vport()
1603 "vport overflow! qm_info->num_vports %d, qm_init_get_num_vports() %d\n", in qed_init_qm_advance_vport()
1604 qm_info->num_vports, qed_init_qm_get_num_vports(p_hwfn)); in qed_init_qm_advance_vport()
1624 p_info->offload_tc = tc; in qed_hw_info_set_offload_tc()
1625 p_info->offload_tc_set = true; in qed_hw_info_set_offload_tc()
1630 return p_hwfn->hw_info.offload_tc_set; in qed_is_offload_tc_set()
1636 return p_hwfn->hw_info.offload_tc; in qed_get_offload_tc()
1645 u16 pq_idx = qm_info->num_pqs, max_pq = qed_init_qm_get_num_pqs(p_hwfn); in qed_init_qm_pq()
1652 qm_info->qm_pq_params[pq_idx].port_id = p_hwfn->port_id; in qed_init_qm_pq()
1653 qm_info->qm_pq_params[pq_idx].vport_id = qm_info->start_vport + in qed_init_qm_pq()
1654 qm_info->num_vports; in qed_init_qm_pq()
1655 qm_info->qm_pq_params[pq_idx].tc_id = tc; in qed_init_qm_pq()
1656 qm_info->qm_pq_params[pq_idx].wrr_group = PQ_INIT_DEFAULT_WRR_GROUP; in qed_init_qm_pq()
1657 qm_info->qm_pq_params[pq_idx].rl_valid = in qed_init_qm_pq()
1661 qm_info->num_pqs++; in qed_init_qm_pq()
1663 qm_info->num_vports++; in qed_init_qm_pq()
1666 qm_info->num_pf_rls++; in qed_init_qm_pq()
1668 if (qm_info->num_vports > qed_init_qm_get_num_vports(p_hwfn)) in qed_init_qm_pq()
1670 "vport overflow! qm_info->num_vports %d, qm_init_get_num_vports() %d\n", in qed_init_qm_pq()
1671 qm_info->num_vports, qed_init_qm_get_num_vports(p_hwfn)); in qed_init_qm_pq()
1673 if (qm_info->num_pf_rls > qed_init_qm_get_num_pf_rls(p_hwfn)) in qed_init_qm_pq()
1675 "rl overflow! qm_info->num_pf_rls %d, qm_init_get_num_pf_rls() %d\n", in qed_init_qm_pq()
1676 qm_info->num_pf_rls, qed_init_qm_get_num_pf_rls(p_hwfn)); in qed_init_qm_pq()
1683 struct qed_qm_info *qm_info = &p_hwfn->qm_info; in qed_init_qm_get_idx_from_flags()
1699 return &qm_info->first_rl_pq; in qed_init_qm_get_idx_from_flags()
1701 return &qm_info->first_mcos_pq; in qed_init_qm_get_idx_from_flags()
1703 return &qm_info->pure_lb_pq; in qed_init_qm_get_idx_from_flags()
1705 return &qm_info->ooo_pq; in qed_init_qm_get_idx_from_flags()
1707 return &qm_info->pure_ack_pq; in qed_init_qm_get_idx_from_flags()
1709 return &qm_info->first_ofld_pq; in qed_init_qm_get_idx_from_flags()
1711 return &qm_info->first_llt_pq; in qed_init_qm_get_idx_from_flags()
1713 return &qm_info->first_vf_pq; in qed_init_qm_get_idx_from_flags()
1719 return &qm_info->start_pq; in qed_init_qm_get_idx_from_flags()
1728 *base_pq_idx = p_hwfn->qm_info.start_pq + pq_val; in qed_init_qm_set_idx()
1746 return p_hwfn->qm_info.start_pq; in qed_get_cm_pq_idx_mcos()
1762 return p_hwfn->qm_info.start_pq; in qed_get_cm_pq_idx_vf()
1796 struct qed_qm_info *qm_info = &p_hwfn->qm_info; in qed_init_qm_lb_pq()
1801 qed_init_qm_set_idx(p_hwfn, PQ_FLAGS_LB, qm_info->num_pqs); in qed_init_qm_lb_pq()
1807 struct qed_qm_info *qm_info = &p_hwfn->qm_info; in qed_init_qm_ooo_pq()
1812 qed_init_qm_set_idx(p_hwfn, PQ_FLAGS_OOO, qm_info->num_pqs); in qed_init_qm_ooo_pq()
1813 qed_init_qm_pq(p_hwfn, qm_info, qm_info->ooo_tc, PQ_INIT_SHARE_VPORT); in qed_init_qm_ooo_pq()
1818 struct qed_qm_info *qm_info = &p_hwfn->qm_info; in qed_init_qm_pure_ack_pq()
1823 qed_init_qm_set_idx(p_hwfn, PQ_FLAGS_ACK, qm_info->num_pqs); in qed_init_qm_pure_ack_pq()
1831 struct qed_qm_info *qm_info = &p_hwfn->qm_info; in qed_init_qm_mtc_pqs()
1838 p_hwfn->hw_info.offload_tc : tc, in qed_init_qm_mtc_pqs()
1844 struct qed_qm_info *qm_info = &p_hwfn->qm_info; in qed_init_qm_offload_pq()
1849 qed_init_qm_set_idx(p_hwfn, PQ_FLAGS_OFLD, qm_info->num_pqs); in qed_init_qm_offload_pq()
1855 struct qed_qm_info *qm_info = &p_hwfn->qm_info; in qed_init_qm_low_latency_pq()
1860 qed_init_qm_set_idx(p_hwfn, PQ_FLAGS_LLT, qm_info->num_pqs); in qed_init_qm_low_latency_pq()
1866 struct qed_qm_info *qm_info = &p_hwfn->qm_info; in qed_init_qm_mcos_pqs()
1872 qed_init_qm_set_idx(p_hwfn, PQ_FLAGS_MCOS, qm_info->num_pqs); in qed_init_qm_mcos_pqs()
1879 struct qed_qm_info *qm_info = &p_hwfn->qm_info; in qed_init_qm_vf_pqs()
1885 qed_init_qm_set_idx(p_hwfn, PQ_FLAGS_VFS, qm_info->num_pqs); in qed_init_qm_vf_pqs()
1886 qm_info->num_vf_pqs = num_vfs; in qed_init_qm_vf_pqs()
1895 struct qed_qm_info *qm_info = &p_hwfn->qm_info; in qed_init_qm_rl_pqs()
1900 qed_init_qm_set_idx(p_hwfn, PQ_FLAGS_RLS, qm_info->num_pqs); in qed_init_qm_rl_pqs()
1941 return -EINVAL; in qed_init_qm_sanity()
1948 p_hwfn->hw_info.multi_tc_roce_en = false; in qed_init_qm_sanity()
1950 "multi-tc roce was disabled to reduce requested amount of pqs\n"); in qed_init_qm_sanity()
1956 return -EINVAL; in qed_init_qm_sanity()
1961 struct qed_qm_info *qm_info = &p_hwfn->qm_info; in qed_dp_init_qm_params()
1971 qm_info->start_pq, in qed_dp_init_qm_params()
1972 qm_info->start_vport, in qed_dp_init_qm_params()
1973 qm_info->pure_lb_pq, in qed_dp_init_qm_params()
1974 qm_info->first_ofld_pq, in qed_dp_init_qm_params()
1975 qm_info->first_llt_pq, in qed_dp_init_qm_params()
1976 qm_info->pure_ack_pq); in qed_dp_init_qm_params()
1980 qm_info->ooo_pq, in qed_dp_init_qm_params()
1981 qm_info->first_vf_pq, in qed_dp_init_qm_params()
1982 qm_info->num_pqs, in qed_dp_init_qm_params()
1983 qm_info->num_vf_pqs, in qed_dp_init_qm_params()
1984 qm_info->num_vports, qm_info->max_phys_tcs_per_port); in qed_dp_init_qm_params()
1988 qm_info->pf_rl_en, in qed_dp_init_qm_params()
1989 qm_info->pf_wfq_en, in qed_dp_init_qm_params()
1990 qm_info->vport_rl_en, in qed_dp_init_qm_params()
1991 qm_info->vport_wfq_en, in qed_dp_init_qm_params()
1992 qm_info->pf_wfq, in qed_dp_init_qm_params()
1993 qm_info->pf_rl, in qed_dp_init_qm_params()
1994 qm_info->num_pf_rls, qed_get_pq_flags(p_hwfn)); in qed_dp_init_qm_params()
1997 for (i = 0; i < p_hwfn->cdev->num_ports_in_engine; i++) { in qed_dp_init_qm_params()
1998 port = &(qm_info->qm_port_params[i]); in qed_dp_init_qm_params()
2003 port->active, in qed_dp_init_qm_params()
2004 port->active_phys_tcs, in qed_dp_init_qm_params()
2005 port->num_pbf_cmd_lines, in qed_dp_init_qm_params()
2006 port->num_btb_blocks, port->reserved); in qed_dp_init_qm_params()
2010 for (i = 0; i < qm_info->num_vports; i++) { in qed_dp_init_qm_params()
2011 vport = &(qm_info->qm_vport_params[i]); in qed_dp_init_qm_params()
2015 qm_info->start_vport + i, vport->wfq); in qed_dp_init_qm_params()
2019 "%d ", vport->first_tx_pq_id[tc]); in qed_dp_init_qm_params()
2024 for (i = 0; i < qm_info->num_pqs; i++) { in qed_dp_init_qm_params()
2025 pq = &(qm_info->qm_pq_params[i]); in qed_dp_init_qm_params()
2029 qm_info->start_pq + i, in qed_dp_init_qm_params()
2030 pq->port_id, in qed_dp_init_qm_params()
2031 pq->vport_id, in qed_dp_init_qm_params()
2032 pq->tc_id, pq->wrr_group, pq->rl_valid, pq->rl_id); in qed_dp_init_qm_params()
2067 struct qed_qm_info *qm_info = &p_hwfn->qm_info; in qed_qm_reconf()
2077 qm_info->start_pq, qm_info->num_pqs); in qed_qm_reconf()
2080 return -EINVAL; in qed_qm_reconf()
2086 rc = qed_init_run(p_hwfn, p_ptt, PHASE_QM_PF, p_hwfn->rel_pf_id, in qed_qm_reconf()
2087 p_hwfn->hw_info.hw_mode); in qed_qm_reconf()
2094 qm_info->start_pq, qm_info->num_pqs); in qed_qm_reconf()
2097 return -EINVAL; in qed_qm_reconf()
2104 struct qed_qm_info *qm_info = &p_hwfn->qm_info; in qed_alloc_qm_data()
2111 qm_info->qm_pq_params = kcalloc(qed_init_qm_get_num_pqs(p_hwfn), in qed_alloc_qm_data()
2112 sizeof(*qm_info->qm_pq_params), in qed_alloc_qm_data()
2114 if (!qm_info->qm_pq_params) in qed_alloc_qm_data()
2117 qm_info->qm_vport_params = kcalloc(qed_init_qm_get_num_vports(p_hwfn), in qed_alloc_qm_data()
2118 sizeof(*qm_info->qm_vport_params), in qed_alloc_qm_data()
2120 if (!qm_info->qm_vport_params) in qed_alloc_qm_data()
2123 qm_info->qm_port_params = kcalloc(p_hwfn->cdev->num_ports_in_engine, in qed_alloc_qm_data()
2124 sizeof(*qm_info->qm_port_params), in qed_alloc_qm_data()
2126 if (!qm_info->qm_port_params) in qed_alloc_qm_data()
2129 qm_info->wfq_data = kcalloc(qed_init_qm_get_num_vports(p_hwfn), in qed_alloc_qm_data()
2130 sizeof(*qm_info->wfq_data), in qed_alloc_qm_data()
2132 if (!qm_info->wfq_data) in qed_alloc_qm_data()
2140 return -ENOMEM; in qed_alloc_qm_data()
2151 rc = qed_l2_alloc(&cdev->hwfns[i]); in qed_resc_alloc()
2158 cdev->fw_data = kzalloc(sizeof(*cdev->fw_data), GFP_KERNEL); in qed_resc_alloc()
2159 if (!cdev->fw_data) in qed_resc_alloc()
2160 return -ENOMEM; in qed_resc_alloc()
2163 struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; in qed_resc_alloc()
2194 "too many ILT lines; re-computing with less lines\n"); in qed_resc_alloc()
2196 * number of RDMA tasks and re-compute. in qed_resc_alloc()
2203 rdma_tasks = RDMA_MAX_TIDS - excess_tasks; in qed_resc_alloc()
2231 p_hwfn->p_dpc_ptt = qed_get_reserved_ptt(p_hwfn, in qed_resc_alloc()
2234 rc = qed_int_alloc(p_hwfn, p_hwfn->p_main_ptt); in qed_resc_alloc()
2243 n_eqes = qed_chain_get_capacity(&p_hwfn->p_spq->chain); in qed_resc_alloc()
2260 } else if (p_hwfn->hw_info.personality == QED_PCI_ISCSI || in qed_resc_alloc()
2261 p_hwfn->hw_info.personality == QED_PCI_NVMETCP) { in qed_resc_alloc()
2289 if (p_hwfn->using_ll2) { in qed_resc_alloc()
2296 if (p_hwfn->hw_info.personality == QED_PCI_FCOE) { in qed_resc_alloc()
2302 if (p_hwfn->hw_info.personality == QED_PCI_ISCSI) { in qed_resc_alloc()
2311 if (p_hwfn->hw_info.personality == QED_PCI_NVMETCP) { in qed_resc_alloc()
2336 rc = qed_dbg_alloc_user_data(p_hwfn, &p_hwfn->dbg_user_info); in qed_resc_alloc()
2348 cdev->reset_stats = kzalloc(sizeof(*cdev->reset_stats), GFP_KERNEL); in qed_resc_alloc()
2349 if (!cdev->reset_stats) in qed_resc_alloc()
2355 rc = -ENOMEM; in qed_resc_alloc()
2369 if (data->err_data.recovery_scope == ERR_SCOPE_FUNC && in qed_fw_err_handler()
2370 le16_to_cpu(data->err_data.entity_id) >= MAX_NUM_PFS) { in qed_fw_err_handler()
2371 qed_sriov_vfpf_malicious(p_hwfn, &data->err_data); in qed_fw_err_handler()
2379 return -EINVAL; in qed_fw_err_handler()
2398 DP_INFO(p_hwfn->cdev, "Unknown eqe event 0x%02x, echo 0x%x\n", in qed_common_eqe_event()
2400 return -EINVAL; in qed_common_eqe_event()
2410 qed_l2_setup(&cdev->hwfns[i]); in qed_resc_setup()
2415 struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; in qed_resc_setup()
2423 qed_mcp_read_mb(p_hwfn, p_hwfn->p_main_ptt); in qed_resc_setup()
2424 memcpy(p_hwfn->mcp_info->mfw_mb_shadow, in qed_resc_setup()
2425 p_hwfn->mcp_info->mfw_mb_cur, in qed_resc_setup()
2426 p_hwfn->mcp_info->mfw_mb_length); in qed_resc_setup()
2428 qed_int_setup(p_hwfn, p_hwfn->p_main_ptt); in qed_resc_setup()
2435 if (p_hwfn->using_ll2) in qed_resc_setup()
2438 if (p_hwfn->hw_info.personality == QED_PCI_FCOE) in qed_resc_setup()
2441 if (p_hwfn->hw_info.personality == QED_PCI_ISCSI) { in qed_resc_setup()
2446 if (p_hwfn->hw_info.personality == QED_PCI_NVMETCP) { in qed_resc_setup()
2459 int rc = -EBUSY; in qed_final_cleanup()
2462 USTORM_FLR_FINAL_ACK, p_hwfn->rel_pf_id); in qed_final_cleanup()
2486 while (!REG_RD(p_hwfn, addr) && count--) in qed_final_cleanup()
2505 if (QED_IS_BB_B0(p_hwfn->cdev)) { in qed_calc_hw_mode()
2507 } else if (QED_IS_AH(p_hwfn->cdev)) { in qed_calc_hw_mode()
2511 p_hwfn->cdev->type); in qed_calc_hw_mode()
2512 return -EINVAL; in qed_calc_hw_mode()
2515 switch (p_hwfn->cdev->num_ports_in_engine) { in qed_calc_hw_mode()
2527 p_hwfn->cdev->num_ports_in_engine); in qed_calc_hw_mode()
2528 return -EINVAL; in qed_calc_hw_mode()
2531 if (test_bit(QED_MF_OVLAN_CLSS, &p_hwfn->cdev->mf_bits)) in qed_calc_hw_mode()
2538 if (p_hwfn->cdev->num_hwfns > 1) in qed_calc_hw_mode()
2541 p_hwfn->hw_info.hw_mode = hw_mode; in qed_calc_hw_mode()
2545 p_hwfn->hw_info.hw_mode); in qed_calc_hw_mode()
2557 struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; in qed_init_cau_rt_data()
2562 p_igu_info = p_hwfn->hw_info.p_igu_info; in qed_init_cau_rt_data()
2566 p_block = &p_igu_info->entry[igu_sb_id]; in qed_init_cau_rt_data()
2568 if (!p_block->is_pf) in qed_init_cau_rt_data()
2572 p_block->function_id, 0, 0); in qed_init_cau_rt_data()
2637 struct qed_qm_info *qm_info = &p_hwfn->qm_info; in qed_hw_init_common()
2639 struct qed_dev *cdev = p_hwfn->cdev; in qed_hw_init_common()
2647 DP_NOTICE(p_hwfn->cdev, in qed_hw_init_common()
2650 return -ENOMEM; in qed_hw_init_common()
2658 if (p_hwfn->mcp_info) { in qed_hw_init_common()
2659 if (p_hwfn->mcp_info->func_info.bandwidth_max) in qed_hw_init_common()
2660 qm_info->pf_rl_en = true; in qed_hw_init_common()
2661 if (p_hwfn->mcp_info->func_info.bandwidth_min) in qed_hw_init_common()
2662 qm_info->pf_wfq_en = true; in qed_hw_init_common()
2665 params->max_ports_per_engine = p_hwfn->cdev->num_ports_in_engine; in qed_hw_init_common()
2666 params->max_phys_tcs_per_port = qm_info->max_phys_tcs_per_port; in qed_hw_init_common()
2667 params->pf_rl_en = qm_info->pf_rl_en; in qed_hw_init_common()
2668 params->pf_wfq_en = qm_info->pf_wfq_en; in qed_hw_init_common()
2669 params->global_rl_en = qm_info->vport_rl_en; in qed_hw_init_common()
2670 params->vport_wfq_en = qm_info->vport_wfq_en; in qed_hw_init_common()
2671 params->port_params = qm_info->qm_port_params; in qed_hw_init_common()
2686 if (QED_IS_BB(p_hwfn->cdev)) { in qed_hw_init_common()
2687 num_pfs = NUM_OF_ENG_PFS(p_hwfn->cdev); in qed_hw_init_common()
2694 qed_fid_pretend(p_hwfn, p_ptt, p_hwfn->rel_pf_id); in qed_hw_init_common()
2707 qed_fid_pretend(p_hwfn, p_ptt, p_hwfn->rel_pf_id); in qed_hw_init_common()
2726 dpi_page_size = (dpi_page_size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1); in qed_hw_init_dpi_size()
2730 min_dpis = p_hwfn->pf_params.rdma_pf_params.min_dpis; in qed_hw_init_dpi_size()
2733 p_hwfn->dpi_size = dpi_page_size; in qed_hw_init_dpi_size()
2734 p_hwfn->dpi_count = dpi_count; in qed_hw_init_dpi_size()
2739 return -EINVAL; in qed_hw_init_dpi_size()
2752 if (p_hwfn->dcbx_no_edpm || p_hwfn->db_bar_no_edpm) in qed_edpm_enabled()
2770 if (p_hwfn->cdev->num_hwfns > 1) in qed_hw_init_pf_doorbell_bar()
2781 pwm_regsize = db_bar_size - norm_regsize; in qed_hw_init_pf_doorbell_bar()
2785 DP_ERR(p_hwfn->cdev, in qed_hw_init_pf_doorbell_bar()
2788 return -EINVAL; in qed_hw_init_pf_doorbell_bar()
2792 DP_ERR(p_hwfn->cdev, in qed_hw_init_pf_doorbell_bar()
2796 return -EINVAL; in qed_hw_init_pf_doorbell_bar()
2800 roce_edpm_mode = p_hwfn->pf_params.rdma_pf_params.roce_edpm_mode; in qed_hw_init_pf_doorbell_bar()
2812 if (cond || p_hwfn->dcbx_no_edpm) { in qed_hw_init_pf_doorbell_bar()
2824 p_hwfn->wid_count = (u16)n_cpus; in qed_hw_init_pf_doorbell_bar()
2830 p_hwfn->dpi_size, in qed_hw_init_pf_doorbell_bar()
2831 p_hwfn->dpi_count, in qed_hw_init_pf_doorbell_bar()
2838 p_hwfn->dpi_count, in qed_hw_init_pf_doorbell_bar()
2839 p_hwfn->pf_params.rdma_pf_params.min_dpis); in qed_hw_init_pf_doorbell_bar()
2840 return -EINVAL; in qed_hw_init_pf_doorbell_bar()
2843 p_hwfn->dpi_start_offset = norm_regsize; in qed_hw_init_pf_doorbell_bar()
2859 if (!QED_IS_CMT(p_hwfn->cdev) || !IS_LEAD_HWFN(p_hwfn)) in qed_hw_init_port()
2862 rc = qed_init_run(p_hwfn, p_ptt, PHASE_PORT, p_hwfn->port_id, hw_mode); in qed_hw_init_port()
2879 u8 rel_pf_id = p_hwfn->rel_pf_id; in qed_hw_init_pf()
2882 if (p_hwfn->mcp_info) { in qed_hw_init_pf()
2885 p_info = &p_hwfn->mcp_info->func_info; in qed_hw_init_pf()
2886 if (p_info->bandwidth_min) in qed_hw_init_pf()
2887 p_hwfn->qm_info.pf_wfq = p_info->bandwidth_min; in qed_hw_init_pf()
2890 p_hwfn->qm_info.pf_rl = 100000; in qed_hw_init_pf()
2902 p_hwfn->hw_info.ovlan); in qed_hw_init_pf()
2920 ((p_hwfn->hw_info.personality == QED_PCI_ISCSI) || in qed_hw_init_pf()
2921 (p_hwfn->hw_info.personality == QED_PCI_NVMETCP)) ? 1 : 0); in qed_hw_init_pf()
2923 (p_hwfn->hw_info.personality == QED_PCI_FCOE) ? 1 : 0); in qed_hw_init_pf()
2941 qed_fw_overlay_init_ram(p_hwfn, p_ptt, p_hwfn->fw_overlay_mem); in qed_hw_init_pf()
2943 /* Pure runtime initializations - directly to the HW */ in qed_hw_init_pf()
2968 if (p_hwfn->hw_info.personality == QED_PCI_FCOE) { in qed_hw_init_pf()
2986 /* Wait until value is set - try for 1 second every 50us */ in qed_pglueb_set_pfid_enable()
2999 return -EAGAIN; in qed_pglueb_set_pfid_enable()
3010 memcpy(p_hwfn->mcp_info->mfw_mb_shadow, in qed_reset_mb_shadow()
3011 p_hwfn->mcp_info->mfw_mb_cur, p_hwfn->mcp_info->mfw_mb_length); in qed_reset_mb_shadow()
3020 p_load_req->drv_role = p_drv_load->is_crash_kernel ? in qed_fill_load_req_params()
3022 p_load_req->timeout_val = p_drv_load->mfw_timeout_val; in qed_fill_load_req_params()
3023 p_load_req->avoid_eng_reset = p_drv_load->avoid_eng_reset; in qed_fill_load_req_params()
3024 p_load_req->override_force_load = p_drv_load->override_force_load; in qed_fill_load_req_params()
3030 if (p_params->p_tunn) { in qed_vf_start()
3031 qed_vf_set_vf_start_tunn_update_param(p_params->p_tunn); in qed_vf_start()
3032 qed_vf_pf_tunnel_param_update(p_hwfn, p_params->p_tunn); in qed_vf_start()
3035 p_hwfn->b_int_enabled = true; in qed_vf_start()
3043 BIT(p_hwfn->abs_pf_id)); in qed_pglueb_clear_err()
3057 if ((p_params->int_mode == QED_INT_MODE_MSI) && (cdev->num_hwfns > 1)) { in qed_hw_init()
3059 return -EINVAL; in qed_hw_init()
3063 rc = qed_init_fw_data(cdev, p_params->bin_fw_data); in qed_hw_init()
3069 p_hwfn = &cdev->hwfns[i]; in qed_hw_init()
3072 if (!p_hwfn->hw_info.mtu) { in qed_hw_init()
3073 p_hwfn->hw_info.mtu = 1500; in qed_hw_init()
3083 p_hwfn->mcp_info->mcp_handling_status = 0; in qed_hw_init()
3090 &cdev->mf_bits) || in qed_hw_init()
3092 &cdev->mf_bits))) { in qed_hw_init()
3093 if (test_bit(QED_MF_8021Q_TAGGING, &cdev->mf_bits)) in qed_hw_init()
3108 p_params->p_drv_load_params); in qed_hw_init()
3109 rc = qed_mcp_load_req(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_init()
3124 cdev->recov_in_prog = false; in qed_hw_init()
3126 qed_mcp_set_capabilities(p_hwfn, p_hwfn->p_main_ptt); in qed_hw_init()
3128 qed_reset_mb_shadow(p_hwfn, p_hwfn->p_main_ptt); in qed_hw_init()
3135 rc = qed_final_cleanup(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_init()
3136 p_hwfn->rel_pf_id, false); in qed_hw_init()
3138 qed_hw_err_notify(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_init()
3146 qed_pglueb_rbc_attn_handler(p_hwfn, p_hwfn->p_main_ptt, true); in qed_hw_init()
3149 rc = qed_pglueb_set_pfid_enable(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_init()
3159 qed_pglueb_clear_err(p_hwfn, p_hwfn->p_main_ptt); in qed_hw_init()
3161 fw_overlays = cdev->fw_data->fw_overlays; in qed_hw_init()
3162 fw_overlays_len = cdev->fw_data->fw_overlays_len; in qed_hw_init()
3163 p_hwfn->fw_overlay_mem = in qed_hw_init()
3166 if (!p_hwfn->fw_overlay_mem) { in qed_hw_init()
3169 rc = -ENOMEM; in qed_hw_init()
3175 rc = qed_hw_init_common(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_init()
3176 p_hwfn->hw_info.hw_mode); in qed_hw_init()
3181 rc = qed_hw_init_port(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_init()
3182 p_hwfn->hw_info.hw_mode); in qed_hw_init()
3188 rc = qed_hw_init_pf(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_init()
3189 p_params->p_tunn, in qed_hw_init()
3190 p_hwfn->hw_info.hw_mode, in qed_hw_init()
3191 p_params->b_hw_start, in qed_hw_init()
3192 p_params->int_mode, in qed_hw_init()
3193 p_params->allow_npar_tx_switch); in qed_hw_init()
3198 rc = -EINVAL; in qed_hw_init()
3209 rc = qed_mcp_load_done(p_hwfn, p_hwfn->p_main_ptt); in qed_hw_init()
3217 rc = qed_mcp_cmd(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_init()
3227 p_hwfn->hw_init_done = true; in qed_hw_init()
3233 /* Get pre-negotiated values for stag, bandwidth etc. */ in qed_hw_init()
3238 rc = qed_mcp_cmd(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_init()
3246 rc = qed_mcp_cmd(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_init()
3253 rc = qed_mcp_ov_update_mtu(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_init()
3254 p_hwfn->hw_info.mtu); in qed_hw_init()
3261 p_hwfn->p_main_ptt, in qed_hw_init()
3266 rc = qed_mcp_ov_update_eswitch(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_init()
3277 qed_mcp_load_done(p_hwfn, p_hwfn->p_main_ptt); in qed_hw_init()
3291 if (cdev->recov_in_prog) in qed_hw_timers_stop()
3320 struct qed_hwfn *p_hwfn = &cdev->hwfns[j]; in qed_hw_timers_stop_all()
3321 struct qed_ptt *p_ptt = p_hwfn->p_main_ptt; in qed_hw_timers_stop_all()
3335 p_hwfn = &cdev->hwfns[j]; in qed_hw_stop()
3336 p_ptt = p_hwfn->p_main_ptt; in qed_hw_stop()
3347 rc2 = -EINVAL; in qed_hw_stop()
3353 p_hwfn->hw_init_done = false; in qed_hw_stop()
3356 if (!cdev->recov_in_prog) { in qed_hw_stop()
3362 rc2 = -EINVAL; in qed_hw_stop()
3376 rc2 = -EINVAL; in qed_hw_stop()
3406 test_bit(QED_MF_LLH_MAC_CLSS, &cdev->mf_bits) && in qed_hw_stop()
3409 p_hwfn->hw_info.hw_mac_addr); in qed_hw_stop()
3411 if (!cdev->recov_in_prog) { in qed_hw_stop()
3417 rc2 = -EINVAL; in qed_hw_stop()
3422 if (IS_PF(cdev) && !cdev->recov_in_prog) { in qed_hw_stop()
3424 p_ptt = QED_LEADING_HWFN(cdev)->p_main_ptt; in qed_hw_stop()
3427 * In CMT this should only be done for first hw-function, and in qed_hw_stop()
3429 * hw-functions. in qed_hw_stop()
3436 rc2 = -EINVAL; in qed_hw_stop()
3448 struct qed_hwfn *p_hwfn = &cdev->hwfns[j]; in qed_hw_stop_fastpath()
3457 return -EAGAIN; in qed_hw_stop_fastpath()
3485 if (IS_VF(p_hwfn->cdev)) in qed_hw_start_fastpath()
3490 return -EAGAIN; in qed_hw_start_fastpath()
3492 if (p_hwfn->p_rdma_info && in qed_hw_start_fastpath()
3493 p_hwfn->p_rdma_info->active && p_hwfn->b_rdma_enabled_in_prs) in qed_hw_start_fastpath()
3494 qed_wr(p_hwfn, p_ptt, p_hwfn->rdma_prs_search_reg, 0x1); in qed_hw_start_fastpath()
3496 /* Re-open incoming traffic */ in qed_hw_start_fastpath()
3507 kfree(p_hwfn->hw_info.p_igu_info); in qed_hw_hwfn_free()
3508 p_hwfn->hw_info.p_igu_info = NULL; in qed_hw_hwfn_free()
3515 if (QED_IS_AH(p_hwfn->cdev)) { in qed_hw_hwfn_prepare()
3516 qed_wr(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_hwfn_prepare()
3518 qed_wr(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_hwfn_prepare()
3520 qed_wr(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_hwfn_prepare()
3522 qed_wr(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_hwfn_prepare()
3525 qed_wr(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_hwfn_prepare()
3527 qed_wr(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_hwfn_prepare()
3529 qed_wr(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_hwfn_prepare()
3531 qed_wr(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_hwfn_prepare()
3536 qed_pglueb_clear_err(p_hwfn, p_hwfn->p_main_ptt); in qed_hw_hwfn_prepare()
3538 /* enable internal target-read */ in qed_hw_hwfn_prepare()
3539 qed_wr(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_hwfn_prepare()
3546 p_hwfn->hw_info.opaque_fid = (u16)REG_RD(p_hwfn, in get_function_id()
3549 p_hwfn->hw_info.concrete_fid = REG_RD(p_hwfn, PXP_PF_ME_CONCRETE_ADDR); in get_function_id()
3551 p_hwfn->abs_pf_id = (p_hwfn->hw_info.concrete_fid >> 16) & 0xf; in get_function_id()
3552 p_hwfn->rel_pf_id = GET_FIELD(p_hwfn->hw_info.concrete_fid, in get_function_id()
3554 p_hwfn->port_id = GET_FIELD(p_hwfn->hw_info.concrete_fid, in get_function_id()
3559 p_hwfn->hw_info.concrete_fid, p_hwfn->hw_info.opaque_fid); in get_function_id()
3564 u32 *feat_num = p_hwfn->hw_info.feat_num; in qed_hw_set_feat()
3589 sb_cnt.cnt - non_l2_sbs, in qed_hw_set_feat()
3591 QED_L2_QUEUE) - in qed_hw_set_feat()
3737 NUM_OF_RDMA_STATISTIC_COUNTERS(p_hwfn->cdev); in qed_hw_set_soft_resc_size()
3758 return -EINVAL; in qed_hw_set_soft_resc_size()
3769 u8 num_funcs = p_hwfn->num_funcs_on_engine; in qed_hw_get_dflt_resc()
3770 struct qed_dev *cdev = p_hwfn->cdev; in qed_hw_get_dflt_resc()
3812 if (p_hwfn->hw_info.personality != QED_PCI_ISCSI && in qed_hw_get_dflt_resc()
3813 p_hwfn->hw_info.personality != QED_PCI_FCOE && in qed_hw_get_dflt_resc()
3814 p_hwfn->hw_info.personality != QED_PCI_NVMETCP) in qed_hw_get_dflt_resc()
3826 return -EINVAL; in qed_hw_get_dflt_resc()
3833 else if (p_hwfn->cdev->num_ports_in_engine == 4) in qed_hw_get_dflt_resc()
3834 *p_resc_start = p_hwfn->port_id; in qed_hw_get_dflt_resc()
3835 else if (p_hwfn->hw_info.personality == QED_PCI_ISCSI || in qed_hw_get_dflt_resc()
3836 p_hwfn->hw_info.personality == QED_PCI_NVMETCP) in qed_hw_get_dflt_resc()
3837 *p_resc_start = p_hwfn->port_id; in qed_hw_get_dflt_resc()
3838 else if (p_hwfn->hw_info.personality == QED_PCI_FCOE) in qed_hw_get_dflt_resc()
3839 *p_resc_start = p_hwfn->port_id + 2; in qed_hw_get_dflt_resc()
3842 *p_resc_start = *p_resc_num * p_hwfn->enabled_func_idx; in qed_hw_get_dflt_resc()
3868 rc = qed_mcp_get_resc_info(p_hwfn, p_hwfn->p_main_ptt, res_id, in __qed_hw_set_resc_info()
3878 * - The resource allocation MB command is not supported by the MFW in __qed_hw_set_resc_info()
3879 * - There is an internal error in the MFW while processing the request in __qed_hw_set_resc_info()
3880 * - The resource ID is unknown to the MFW in __qed_hw_set_resc_info()
3899 "PQs need to align by 8; Number %08x --> %08x, Start %08x --> %08x\n", in __qed_hw_set_resc_info()
3927 struct qed_dev *cdev = p_hwfn->cdev; in qed_hw_get_ppfid_bitmap()
3933 native_ppfid_idx = p_hwfn->rel_pf_id; in qed_hw_get_ppfid_bitmap()
3935 native_ppfid_idx = p_hwfn->rel_pf_id / in qed_hw_get_ppfid_bitmap()
3936 cdev->num_ports_in_engine; in qed_hw_get_ppfid_bitmap()
3939 if (rc != 0 && rc != -EOPNOTSUPP) in qed_hw_get_ppfid_bitmap()
3941 else if (rc == -EOPNOTSUPP) in qed_hw_get_ppfid_bitmap()
3942 cdev->ppfid_bitmap = 0x1 << native_ppfid_idx; in qed_hw_get_ppfid_bitmap()
3944 if (!(cdev->ppfid_bitmap & (0x1 << native_ppfid_idx))) { in qed_hw_get_ppfid_bitmap()
3947 native_ppfid_idx, cdev->ppfid_bitmap); in qed_hw_get_ppfid_bitmap()
3948 cdev->ppfid_bitmap = 0x1 << native_ppfid_idx; in qed_hw_get_ppfid_bitmap()
3958 bool b_ah = QED_IS_AH(p_hwfn->cdev); in qed_hw_get_resc()
3964 * run in parallel - a resource lock is needed. in qed_hw_get_resc()
3966 * supported - skip the max values setting, release the lock if in qed_hw_get_resc()
3974 if (rc && rc != -EINVAL) { in qed_hw_get_resc()
3976 } else if (rc == -EINVAL) { in qed_hw_get_resc()
3982 return -EBUSY; in qed_hw_get_resc()
3985 if (rc && rc != -EINVAL) { in qed_hw_get_resc()
3989 } else if (rc == -EINVAL) { in qed_hw_get_resc()
4023 RESC_END(p_hwfn, QED_ILT) - 1); in qed_hw_get_resc()
4024 return -EINVAL; in qed_hw_get_resc()
4029 return -EINVAL; in qed_hw_get_resc()
4062 return -EINVAL; in qed_hw_get_nvm_info()
4099 link = &p_hwfn->mcp_info->link_input; in qed_hw_get_nvm_info()
4100 p_caps = &p_hwfn->mcp_info->link_capabilities; in qed_hw_get_nvm_info()
4107 link->speed.advertised_speeds = link_temp; in qed_hw_get_nvm_info()
4109 p_caps->speed_capabilities = link->speed.advertised_speeds; in qed_hw_get_nvm_info()
4117 link->speed.autoneg = true; in qed_hw_get_nvm_info()
4120 link->speed.forced_speed = 1000; in qed_hw_get_nvm_info()
4123 link->speed.forced_speed = 10000; in qed_hw_get_nvm_info()
4126 link->speed.forced_speed = 20000; in qed_hw_get_nvm_info()
4129 link->speed.forced_speed = 25000; in qed_hw_get_nvm_info()
4132 link->speed.forced_speed = 40000; in qed_hw_get_nvm_info()
4135 link->speed.forced_speed = 50000; in qed_hw_get_nvm_info()
4138 link->speed.forced_speed = 100000; in qed_hw_get_nvm_info()
4144 p_caps->default_speed_autoneg = link->speed.autoneg; in qed_hw_get_nvm_info()
4147 link->pause.autoneg = !!(fld & NVM_CFG1_PORT_DRV_FLOW_CONTROL_AUTONEG); in qed_hw_get_nvm_info()
4148 link->pause.forced_rx = !!(fld & NVM_CFG1_PORT_DRV_FLOW_CONTROL_RX); in qed_hw_get_nvm_info()
4149 link->pause.forced_tx = !!(fld & NVM_CFG1_PORT_DRV_FLOW_CONTROL_TX); in qed_hw_get_nvm_info()
4150 link->loopback_mode = 0; in qed_hw_get_nvm_info()
4152 if (p_hwfn->mcp_info->capabilities & in qed_hw_get_nvm_info()
4157 p_caps->fec_default |= QED_FEC_MODE_NONE; in qed_hw_get_nvm_info()
4160 p_caps->fec_default |= QED_FEC_MODE_FIRECODE; in qed_hw_get_nvm_info()
4163 p_caps->fec_default |= QED_FEC_MODE_RS; in qed_hw_get_nvm_info()
4166 p_caps->fec_default |= QED_FEC_MODE_AUTO; in qed_hw_get_nvm_info()
4173 p_caps->fec_default = QED_FEC_MODE_UNSUPPORTED; in qed_hw_get_nvm_info()
4176 link->fec = p_caps->fec_default; in qed_hw_get_nvm_info()
4178 if (p_hwfn->mcp_info->capabilities & FW_MB_PARAM_FEATURE_SUPPORT_EEE) { in qed_hw_get_nvm_info()
4183 p_caps->default_eee = QED_MCP_EEE_ENABLED; in qed_hw_get_nvm_info()
4184 link->eee.enable = true; in qed_hw_get_nvm_info()
4187 p_caps->default_eee = QED_MCP_EEE_DISABLED; in qed_hw_get_nvm_info()
4188 link->eee.enable = false; in qed_hw_get_nvm_info()
4191 p_caps->eee_lpi_timer = EEE_TX_TIMER_USEC_BALANCED_TIME; in qed_hw_get_nvm_info()
4194 p_caps->eee_lpi_timer = in qed_hw_get_nvm_info()
4198 p_caps->eee_lpi_timer = EEE_TX_TIMER_USEC_LATENCY_TIME; in qed_hw_get_nvm_info()
4202 link->eee.tx_lpi_timer = p_caps->eee_lpi_timer; in qed_hw_get_nvm_info()
4203 link->eee.tx_lpi_enable = link->eee.enable; in qed_hw_get_nvm_info()
4204 link->eee.adv_caps = QED_EEE_1G_ADV | QED_EEE_10G_ADV; in qed_hw_get_nvm_info()
4206 p_caps->default_eee = QED_MCP_EEE_UNSUPPORTED; in qed_hw_get_nvm_info()
4209 if (p_hwfn->mcp_info->capabilities & in qed_hw_get_nvm_info()
4211 ext_speed = &link->ext_speed; in qed_hw_get_nvm_info()
4220 ext_speed->autoneg = true; in qed_hw_get_nvm_info()
4222 ext_speed->forced_speed = 0; in qed_hw_get_nvm_info()
4224 ext_speed->forced_speed |= QED_EXT_SPEED_1G; in qed_hw_get_nvm_info()
4226 ext_speed->forced_speed |= QED_EXT_SPEED_10G; in qed_hw_get_nvm_info()
4228 ext_speed->forced_speed |= QED_EXT_SPEED_20G; in qed_hw_get_nvm_info()
4230 ext_speed->forced_speed |= QED_EXT_SPEED_25G; in qed_hw_get_nvm_info()
4232 ext_speed->forced_speed |= QED_EXT_SPEED_40G; in qed_hw_get_nvm_info()
4234 ext_speed->forced_speed |= QED_EXT_SPEED_50G_R; in qed_hw_get_nvm_info()
4236 ext_speed->forced_speed |= QED_EXT_SPEED_50G_R2; in qed_hw_get_nvm_info()
4238 ext_speed->forced_speed |= QED_EXT_SPEED_100G_R2; in qed_hw_get_nvm_info()
4240 ext_speed->forced_speed |= QED_EXT_SPEED_100G_R4; in qed_hw_get_nvm_info()
4242 ext_speed->forced_speed |= QED_EXT_SPEED_100G_P4; in qed_hw_get_nvm_info()
4247 ext_speed->advertised_speeds = 0; in qed_hw_get_nvm_info()
4249 ext_speed->advertised_speeds |= QED_EXT_SPEED_MASK_RES; in qed_hw_get_nvm_info()
4251 ext_speed->advertised_speeds |= QED_EXT_SPEED_MASK_1G; in qed_hw_get_nvm_info()
4253 ext_speed->advertised_speeds |= QED_EXT_SPEED_MASK_10G; in qed_hw_get_nvm_info()
4255 ext_speed->advertised_speeds |= QED_EXT_SPEED_MASK_20G; in qed_hw_get_nvm_info()
4257 ext_speed->advertised_speeds |= QED_EXT_SPEED_MASK_25G; in qed_hw_get_nvm_info()
4259 ext_speed->advertised_speeds |= QED_EXT_SPEED_MASK_40G; in qed_hw_get_nvm_info()
4261 ext_speed->advertised_speeds |= in qed_hw_get_nvm_info()
4264 ext_speed->advertised_speeds |= in qed_hw_get_nvm_info()
4267 ext_speed->advertised_speeds |= in qed_hw_get_nvm_info()
4270 ext_speed->advertised_speeds |= in qed_hw_get_nvm_info()
4273 ext_speed->advertised_speeds |= in qed_hw_get_nvm_info()
4280 link->ext_fec_mode = link_temp; in qed_hw_get_nvm_info()
4282 p_caps->default_ext_speed_caps = ext_speed->advertised_speeds; in qed_hw_get_nvm_info()
4283 p_caps->default_ext_speed = ext_speed->forced_speed; in qed_hw_get_nvm_info()
4284 p_caps->default_ext_autoneg = ext_speed->autoneg; in qed_hw_get_nvm_info()
4285 p_caps->default_ext_fec = link->ext_fec_mode; in qed_hw_get_nvm_info()
4289 ext_speed->forced_speed, in qed_hw_get_nvm_info()
4290 ext_speed->advertised_speeds, ext_speed->autoneg, in qed_hw_get_nvm_info()
4291 p_caps->default_ext_fec); in qed_hw_get_nvm_info()
4296 link->speed.forced_speed, link->speed.advertised_speeds, in qed_hw_get_nvm_info()
4297 link->speed.autoneg, link->pause.autoneg, in qed_hw_get_nvm_info()
4298 p_caps->default_eee, p_caps->eee_lpi_timer, in qed_hw_get_nvm_info()
4299 p_caps->fec_default); in qed_hw_get_nvm_info()
4302 struct qed_dev *cdev = p_hwfn->cdev; in qed_hw_get_nvm_info()
4304 /* Read Multi-function information from shmem */ in qed_hw_get_nvm_info()
4316 cdev->mf_bits = BIT(QED_MF_OVLAN_CLSS); in qed_hw_get_nvm_info()
4319 cdev->mf_bits = BIT(QED_MF_OVLAN_CLSS) | in qed_hw_get_nvm_info()
4326 cdev->mf_bits = BIT(QED_MF_OVLAN_CLSS) | in qed_hw_get_nvm_info()
4332 cdev->mf_bits = BIT(QED_MF_LLH_MAC_CLSS) | in qed_hw_get_nvm_info()
4339 cdev->mf_bits = BIT(QED_MF_LLH_MAC_CLSS) | in qed_hw_get_nvm_info()
4342 if (QED_IS_BB(p_hwfn->cdev)) in qed_hw_get_nvm_info()
4343 cdev->mf_bits |= BIT(QED_MF_NEED_DEF_PF); in qed_hw_get_nvm_info()
4348 cdev->mf_bits); in qed_hw_get_nvm_info()
4356 cdev->mf_bits |= BIT(QED_MF_DISABLE_ARFS); in qed_hw_get_nvm_info()
4360 p_hwfn->cdev->mf_bits); in qed_hw_get_nvm_info()
4370 &p_hwfn->hw_info.device_capabilities); in qed_hw_get_nvm_info()
4373 &p_hwfn->hw_info.device_capabilities); in qed_hw_get_nvm_info()
4376 &p_hwfn->hw_info.device_capabilities); in qed_hw_get_nvm_info()
4379 &p_hwfn->hw_info.device_capabilities); in qed_hw_get_nvm_info()
4387 p_hwfn->hw_info.part_num[i] = qed_rd(p_hwfn, p_ptt, addr + i * 4); in qed_hw_get_nvm_info()
4394 u8 num_funcs, enabled_func_idx = p_hwfn->rel_pf_id; in qed_get_num_funcs()
4396 struct qed_dev *cdev = p_hwfn->cdev; in qed_get_num_funcs()
4402 * Bits 1-15 are for functions 1-15, respectively, and their value is in qed_get_num_funcs()
4412 if (QED_PATH_ID(p_hwfn) && cdev->num_hwfns == 1) { in qed_get_num_funcs()
4433 low_pfs_mask = (0x1 << p_hwfn->abs_pf_id) - 1; in qed_get_num_funcs()
4437 enabled_func_idx--; in qed_get_num_funcs()
4442 p_hwfn->num_funcs_on_engine = num_funcs; in qed_get_num_funcs()
4443 p_hwfn->enabled_func_idx = enabled_func_idx; in qed_get_num_funcs()
4448 p_hwfn->rel_pf_id, in qed_get_num_funcs()
4449 p_hwfn->abs_pf_id, in qed_get_num_funcs()
4450 p_hwfn->enabled_func_idx, p_hwfn->num_funcs_on_engine); in qed_get_num_funcs()
4456 struct qed_dev *cdev = p_hwfn->cdev; in qed_hw_info_port_num()
4459 if (cdev->num_hwfns > 1) { in qed_hw_info_port_num()
4460 cdev->num_ports_in_engine = 1; in qed_hw_info_port_num()
4461 cdev->num_ports = 1; in qed_hw_info_port_num()
4469 cdev->num_ports_in_engine = 1; in qed_hw_info_port_num()
4472 cdev->num_ports_in_engine = 2; in qed_hw_info_port_num()
4475 cdev->num_ports_in_engine = 4; in qed_hw_info_port_num()
4479 cdev->num_ports_in_engine = 1; /* Default to something */ in qed_hw_info_port_num()
4484 addr = SECTION_OFFSIZE_ADDR(p_hwfn->mcp_info->public_base, in qed_hw_info_port_num()
4489 cdev->num_ports = (u8)qed_rd(p_hwfn, p_ptt, addr); in qed_hw_info_port_num()
4497 p_caps = &p_hwfn->mcp_info->link_capabilities; in qed_get_eee_caps()
4498 if (p_caps->default_eee == QED_MCP_EEE_UNSUPPORTED) in qed_get_eee_caps()
4501 p_caps->eee_speed_caps = 0; in qed_get_eee_caps()
4502 eee_status = qed_rd(p_hwfn, p_ptt, p_hwfn->mcp_info->port_addr + in qed_get_eee_caps()
4508 p_caps->eee_speed_caps |= QED_EEE_1G_ADV; in qed_get_eee_caps()
4510 p_caps->eee_speed_caps |= QED_EEE_10G_ADV; in qed_get_eee_caps()
4539 ether_addr_copy(p_hwfn->hw_info.hw_mac_addr, in qed_get_hw_info()
4540 p_hwfn->mcp_info->func_info.mac); in qed_get_hw_info()
4542 eth_random_addr(p_hwfn->hw_info.hw_mac_addr); in qed_get_hw_info()
4545 if (p_hwfn->mcp_info->func_info.ovlan != QED_MCP_VLAN_UNSET) in qed_get_hw_info()
4546 p_hwfn->hw_info.ovlan = in qed_get_hw_info()
4547 p_hwfn->mcp_info->func_info.ovlan; in qed_get_hw_info()
4559 protocol = p_hwfn->mcp_info->func_info.protocol; in qed_get_hw_info()
4560 p_hwfn->hw_info.personality = protocol; in qed_get_hw_info()
4564 p_hwfn->hw_info.multi_tc_roce_en = true; in qed_get_hw_info()
4566 p_hwfn->hw_info.num_hw_tc = NUM_PHYS_TCS_4PORT_K2; in qed_get_hw_info()
4567 p_hwfn->hw_info.num_active_tc = 1; in qed_get_hw_info()
4572 p_hwfn->hw_info.mtu = p_hwfn->mcp_info->func_info.mtu; in qed_get_hw_info()
4579 struct qed_dev *cdev = p_hwfn->cdev; in qed_get_dev_info()
4584 pci_read_config_word(cdev->pdev, PCI_VENDOR_ID, &cdev->vendor_id); in qed_get_dev_info()
4585 pci_read_config_word(cdev->pdev, PCI_DEVICE_ID, &cdev->device_id); in qed_get_dev_info()
4588 device_id_mask = cdev->device_id & QED_DEV_ID_MASK; in qed_get_dev_info()
4591 cdev->type = QED_DEV_TYPE_BB; in qed_get_dev_info()
4594 cdev->type = QED_DEV_TYPE_AH; in qed_get_dev_info()
4597 DP_NOTICE(p_hwfn, "Unknown device id 0x%x\n", cdev->device_id); in qed_get_dev_info()
4598 return -EBUSY; in qed_get_dev_info()
4601 cdev->chip_num = (u16)qed_rd(p_hwfn, p_ptt, MISCS_REG_CHIP_NUM); in qed_get_dev_info()
4602 cdev->chip_rev = (u16)qed_rd(p_hwfn, p_ptt, MISCS_REG_CHIP_REV); in qed_get_dev_info()
4604 MASK_FIELD(CHIP_REV, cdev->chip_rev); in qed_get_dev_info()
4606 /* Learn number of HW-functions */ in qed_get_dev_info()
4609 if (tmp & (1 << p_hwfn->rel_pf_id)) { in qed_get_dev_info()
4610 DP_NOTICE(cdev->hwfns, "device in CMT mode\n"); in qed_get_dev_info()
4611 cdev->num_hwfns = 2; in qed_get_dev_info()
4613 cdev->num_hwfns = 1; in qed_get_dev_info()
4616 cdev->chip_bond_id = qed_rd(p_hwfn, p_ptt, in qed_get_dev_info()
4618 MASK_FIELD(CHIP_BOND_ID, cdev->chip_bond_id); in qed_get_dev_info()
4619 cdev->chip_metal = (u16)qed_rd(p_hwfn, p_ptt, MISCS_REG_CHIP_METAL); in qed_get_dev_info()
4620 MASK_FIELD(CHIP_METAL, cdev->chip_metal); in qed_get_dev_info()
4622 DP_INFO(cdev->hwfns, in qed_get_dev_info()
4623 "Chip details - %s %c%d, Num: %04x Rev: %04x Bond id: %04x Metal: %04x\n", in qed_get_dev_info()
4625 'A' + cdev->chip_rev, in qed_get_dev_info()
4626 (int)cdev->chip_metal, in qed_get_dev_info()
4627 cdev->chip_num, cdev->chip_rev, in qed_get_dev_info()
4628 cdev->chip_bond_id, cdev->chip_metal); in qed_get_dev_info()
4639 struct qed_dev *cdev = p_hwfn->cdev; in qed_hw_prepare_single()
4643 p_hwfn->regview = p_regview; in qed_hw_prepare_single()
4644 p_hwfn->doorbells = p_doorbells; in qed_hw_prepare_single()
4645 p_hwfn->db_phys_addr = db_phys_addr; in qed_hw_prepare_single()
4647 if (IS_VF(p_hwfn->cdev)) in qed_hw_prepare_single()
4654 return -EINVAL; in qed_hw_prepare_single()
4665 p_hwfn->p_main_ptt = qed_get_reserved_ptt(p_hwfn, RESERVED_PTT_MAIN); in qed_hw_prepare_single()
4668 if (!p_hwfn->my_id) { in qed_hw_prepare_single()
4669 rc = qed_get_dev_info(p_hwfn, p_hwfn->p_main_ptt); in qed_hw_prepare_single()
4677 rc = qed_mcp_cmd_init(p_hwfn, p_hwfn->p_main_ptt); in qed_hw_prepare_single()
4684 rc = qed_get_hw_info(p_hwfn, p_hwfn->p_main_ptt, personality); in qed_hw_prepare_single()
4693 if (IS_LEAD_HWFN(p_hwfn) && !cdev->recov_in_prog) { in qed_hw_prepare_single()
4694 rc = qed_mcp_initiate_pf_flr(p_hwfn, p_hwfn->p_main_ptt); in qed_hw_prepare_single()
4709 /* Allocate the init RT array and initialize the init-ops engine */ in qed_hw_prepare_single()
4720 qed_iov_free_hw_info(p_hwfn->cdev); in qed_hw_prepare_single()
4738 /* Initialize the first hwfn - will learn number of hwfns */ in qed_hw_prepare()
4740 cdev->regview, in qed_hw_prepare()
4741 cdev->doorbells, in qed_hw_prepare()
4742 cdev->db_phys_addr, in qed_hw_prepare()
4747 personality = p_hwfn->hw_info.personality; in qed_hw_prepare()
4750 if (cdev->num_hwfns > 1) { in qed_hw_prepare()
4756 offset = qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_prepare()
4758 p_regview = cdev->regview + offset; in qed_hw_prepare()
4760 offset = qed_hw_bar_size(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_prepare()
4763 p_doorbell = cdev->doorbells + offset; in qed_hw_prepare()
4765 db_phys_addr = cdev->db_phys_addr + offset; in qed_hw_prepare()
4768 rc = qed_hw_prepare_single(&cdev->hwfns[1], p_regview, in qed_hw_prepare()
4794 qed_mcp_ov_update_driver_state(p_hwfn, p_hwfn->p_main_ptt, in qed_hw_remove()
4798 struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; in qed_hw_remove()
4823 "l2_queue id [%d] is not valid, available indices [%d - %d]\n", in qed_fw_l2_queue()
4826 return -EINVAL; in qed_fw_l2_queue()
4842 "vport id [%d] is not valid, available indices [%d - %d]\n", in qed_fw_vport()
4845 return -EINVAL; in qed_fw_vport()
4861 "rss_eng id [%d] is not valid, available indices [%d - %d]\n", in qed_fw_rss_eng()
4864 return -EINVAL; in qed_fw_rss_eng()
4878 if (p_hwfn->cdev->int_coalescing_mode != QED_COAL_MODE_ENABLE) { in qed_set_coalesce()
4880 return -EINVAL; in qed_set_coalesce()
4885 SET_FIELD(p_coal_timeset->value, COALESCING_TIMESET_TIMESET, timeset); in qed_set_coalesce()
4886 SET_FIELD(p_coal_timeset->value, COALESCING_TIMESET_VALID, 1); in qed_set_coalesce()
4899 p_hwfn = p_cid->p_owner; in qed_set_queue_coalesce()
4901 if (IS_VF(p_hwfn->cdev)) in qed_set_queue_coalesce()
4906 return -EAGAIN; in qed_set_queue_coalesce()
4912 p_hwfn->cdev->rx_coalesce_usecs = rx_coal; in qed_set_queue_coalesce()
4919 p_hwfn->cdev->tx_coalesce_usecs = tx_coal; in qed_set_queue_coalesce()
4935 /* Coalesce = (timeset << timer-resolution), timeset is 7bit wide */ in qed_set_rxq_coalesce()
4943 DP_ERR(p_hwfn, "Invalid coalesce value - %d\n", coalesce); in qed_set_rxq_coalesce()
4944 return -EINVAL; in qed_set_rxq_coalesce()
4949 p_cid->sb_igu_id, false); in qed_set_rxq_coalesce()
4954 USTORM_ETH_QUEUE_ZONE_GTT_OFFSET(p_cid->abs.queue_id); in qed_set_rxq_coalesce()
4974 /* Coalesce = (timeset << timer-resolution), timeset is 7bit wide */ in qed_set_txq_coalesce()
4982 DP_ERR(p_hwfn, "Invalid coalesce value - %d\n", coalesce); in qed_set_txq_coalesce()
4983 return -EINVAL; in qed_set_txq_coalesce()
4988 p_cid->sb_igu_id, true); in qed_set_txq_coalesce()
4993 XSTORM_ETH_QUEUE_ZONE_GTT_OFFSET(p_cid->abs.queue_id); in qed_set_txq_coalesce()
5012 vport_params = p_hwfn->qm_info.qm_vport_params; in qed_configure_wfq_for_all_vports()
5014 for (i = 0; i < p_hwfn->qm_info.num_vports; i++) { in qed_configure_wfq_for_all_vports()
5015 u32 wfq_speed = p_hwfn->qm_info.wfq_data[i].min_speed; in qed_configure_wfq_for_all_vports()
5031 for (i = 0; i < p_hwfn->qm_info.num_vports; i++) in qed_init_wfq_default_param()
5032 p_hwfn->qm_info.qm_vport_params[i].wfq = 1; in qed_init_wfq_default_param()
5042 vport_params = p_hwfn->qm_info.qm_vport_params; in qed_disable_wfq_for_all_vports()
5044 for (i = 0; i < p_hwfn->qm_info.num_vports; i++) { in qed_disable_wfq_for_all_vports()
5065 num_vports = p_hwfn->qm_info.num_vports; in qed_init_wfq_param()
5069 return -EINVAL; in qed_init_wfq_param()
5077 p_hwfn->qm_info.wfq_data[i].configured) { in qed_init_wfq_param()
5079 tmp_speed = p_hwfn->qm_info.wfq_data[i].min_speed; in qed_init_wfq_param()
5087 non_requested_count = num_vports - req_count; in qed_init_wfq_param()
5091 …"Vport [%d] - Requested rate[%d Mbps] is less than one percent of configured PF min rate[%d Mbps]\… in qed_init_wfq_param()
5093 return -EINVAL; in qed_init_wfq_param()
5100 return -EINVAL; in qed_init_wfq_param()
5107 return -EINVAL; in qed_init_wfq_param()
5110 total_left_rate = min_pf_rate - total_req_min_rate; in qed_init_wfq_param()
5117 return -EINVAL; in qed_init_wfq_param()
5120 p_hwfn->qm_info.wfq_data[vport_id].min_speed = req_rate; in qed_init_wfq_param()
5121 p_hwfn->qm_info.wfq_data[vport_id].configured = true; in qed_init_wfq_param()
5124 if (p_hwfn->qm_info.wfq_data[i].configured) in qed_init_wfq_param()
5127 p_hwfn->qm_info.wfq_data[i].min_speed = left_rate_per_vp; in qed_init_wfq_param()
5139 p_link = &p_hwfn->cdev->hwfns[0].mcp_info->link_output; in __qed_configure_vport_wfq()
5141 if (!p_link->min_pf_rate) { in __qed_configure_vport_wfq()
5142 p_hwfn->qm_info.wfq_data[vp_id].min_speed = rate; in __qed_configure_vport_wfq()
5143 p_hwfn->qm_info.wfq_data[vp_id].configured = true; in __qed_configure_vport_wfq()
5147 rc = qed_init_wfq_param(p_hwfn, vp_id, rate, p_link->min_pf_rate); in __qed_configure_vport_wfq()
5151 p_link->min_pf_rate); in __qed_configure_vport_wfq()
5168 for (i = 0; i < p_hwfn->qm_info.num_vports; i++) { in __qed_configure_vp_wfq_on_link_change()
5171 if (!p_hwfn->qm_info.wfq_data[i].configured) in __qed_configure_vp_wfq_on_link_change()
5174 rate = p_hwfn->qm_info.wfq_data[i].min_speed; in __qed_configure_vp_wfq_on_link_change()
5194 * vp_id - vport id in PF Range[0 - (total_num_vports_per_pf - 1)]
5195 * rate - Speed in Mbps needs to be assigned to a given vport.
5199 int i, rc = -EINVAL; in qed_configure_vport_wfq()
5202 if (cdev->num_hwfns > 1) { in qed_configure_vport_wfq()
5209 struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; in qed_configure_vport_wfq()
5214 return -EBUSY; in qed_configure_vport_wfq()
5235 if (cdev->num_hwfns > 1) { in qed_configure_vp_wfq_on_link_change()
5243 struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; in qed_configure_vp_wfq_on_link_change()
5257 p_hwfn->mcp_info->func_info.bandwidth_max = max_bw; in __qed_configure_pf_max_bandwidth()
5259 if (!p_link->line_speed && (max_bw != 100)) in __qed_configure_pf_max_bandwidth()
5262 p_link->speed = (p_link->line_speed * max_bw) / 100; in __qed_configure_pf_max_bandwidth()
5263 p_hwfn->qm_info.pf_rl = p_link->speed; in __qed_configure_pf_max_bandwidth()
5265 /* Since the limiter also affects Tx-switched traffic, we don't want it in __qed_configure_pf_max_bandwidth()
5270 p_hwfn->qm_info.pf_rl = 100000; in __qed_configure_pf_max_bandwidth()
5272 rc = qed_init_pf_rl(p_hwfn, p_ptt, p_hwfn->rel_pf_id, in __qed_configure_pf_max_bandwidth()
5273 p_hwfn->qm_info.pf_rl); in __qed_configure_pf_max_bandwidth()
5277 p_link->speed); in __qed_configure_pf_max_bandwidth()
5282 /* Main API to configure PF max bandwidth where bw range is [1 - 100] */
5285 int i, rc = -EINVAL; in qed_configure_pf_max_bandwidth()
5288 DP_NOTICE(cdev, "PF max bw valid range is [1-100]\n"); in qed_configure_pf_max_bandwidth()
5293 struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; in qed_configure_pf_max_bandwidth()
5298 p_link = &p_lead->mcp_info->link_output; in qed_configure_pf_max_bandwidth()
5302 return -EBUSY; in qed_configure_pf_max_bandwidth()
5323 p_hwfn->mcp_info->func_info.bandwidth_min = min_bw; in __qed_configure_pf_min_bandwidth()
5324 p_hwfn->qm_info.pf_wfq = min_bw; in __qed_configure_pf_min_bandwidth()
5326 if (!p_link->line_speed) in __qed_configure_pf_min_bandwidth()
5329 p_link->min_pf_rate = (p_link->line_speed * min_bw) / 100; in __qed_configure_pf_min_bandwidth()
5331 rc = qed_init_pf_wfq(p_hwfn, p_ptt, p_hwfn->rel_pf_id, min_bw); in __qed_configure_pf_min_bandwidth()
5335 p_link->min_pf_rate); in __qed_configure_pf_min_bandwidth()
5340 /* Main API to configure PF min bandwidth where bw range is [1-100] */
5343 int i, rc = -EINVAL; in qed_configure_pf_min_bandwidth()
5346 DP_NOTICE(cdev, "PF min bw valid range is [1-100]\n"); in qed_configure_pf_min_bandwidth()
5351 struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; in qed_configure_pf_min_bandwidth()
5356 p_link = &p_lead->mcp_info->link_output; in qed_configure_pf_min_bandwidth()
5360 return -EBUSY; in qed_configure_pf_min_bandwidth()
5369 if (p_link->min_pf_rate) { in qed_configure_pf_min_bandwidth()
5370 u32 min_rate = p_link->min_pf_rate; in qed_configure_pf_min_bandwidth()
5387 p_link = &p_hwfn->mcp_info->link_output; in qed_clean_wfq_db()
5389 if (p_link->min_pf_rate) in qed_clean_wfq_db()
5391 p_link->min_pf_rate); in qed_clean_wfq_db()
5393 memset(p_hwfn->qm_info.wfq_data, 0, in qed_clean_wfq_db()
5394 sizeof(*p_hwfn->qm_info.wfq_data) * p_hwfn->qm_info.num_vports); in qed_clean_wfq_db()
5399 return cdev->num_ports; in qed_device_num_ports()
5415 struct qed_llh_info *p_llh_info = cdev->p_llh_info; in qed_llh_shadow_remove_all_filters()
5423 p_filters = p_llh_info->pp_filters[ppfid]; in qed_llh_shadow_remove_all_filters()
5440 if (!test_bit(QED_MF_LLH_PROTO_CLSS, &cdev->mf_bits) && in qed_llh_clear_ppfid_filters()
5441 !test_bit(QED_MF_LLH_MAC_CLSS, &cdev->mf_bits)) in qed_llh_clear_ppfid_filters()
5495 if (!test_bit(QED_MF_LLH_PROTO_CLSS, &cdev->mf_bits) && in qed_llh_clear_all_filters()
5496 !test_bit(QED_MF_LLH_MAC_CLSS, &cdev->mf_bits)) in qed_llh_clear_all_filters()
5499 for (ppfid = 0; ppfid < cdev->p_llh_info->num_ppfid; ppfid++) in qed_llh_clear_all_filters()