Lines Matching refs:cdev

261 static int qed_set_coherency_mask(struct qed_dev *cdev)  in qed_set_coherency_mask()  argument
263 struct device *dev = &cdev->pdev->dev; in qed_set_coherency_mask()
267 DP_NOTICE(cdev, in qed_set_coherency_mask()
272 DP_NOTICE(cdev, "Can't request 64b/32b DMA addresses\n"); in qed_set_coherency_mask()
279 static void qed_free_pci(struct qed_dev *cdev) in qed_free_pci() argument
281 struct pci_dev *pdev = cdev->pdev; in qed_free_pci()
285 if (cdev->doorbells && cdev->db_size) in qed_free_pci()
286 iounmap(cdev->doorbells); in qed_free_pci()
287 if (cdev->regview) in qed_free_pci()
288 iounmap(cdev->regview); in qed_free_pci()
300 static int qed_init_pci(struct qed_dev *cdev, struct pci_dev *pdev) in qed_init_pci() argument
305 cdev->pdev = pdev; in qed_init_pci()
309 DP_NOTICE(cdev, "Cannot enable PCI device\n"); in qed_init_pci()
314 DP_NOTICE(cdev, "No memory region found in bar #0\n"); in qed_init_pci()
319 if (IS_PF(cdev) && !(pci_resource_flags(pdev, 2) & IORESOURCE_MEM)) { in qed_init_pci()
320 DP_NOTICE(cdev, "No memory region found in bar #2\n"); in qed_init_pci()
328 DP_NOTICE(cdev, in qed_init_pci()
338 DP_NOTICE(cdev, in qed_init_pci()
345 DP_NOTICE(cdev, "The bus is not PCI Express\n"); in qed_init_pci()
350 cdev->pci_params.pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM); in qed_init_pci()
351 if (IS_PF(cdev) && !cdev->pci_params.pm_cap) in qed_init_pci()
352 DP_NOTICE(cdev, "Cannot find power management capability\n"); in qed_init_pci()
354 rc = qed_set_coherency_mask(cdev); in qed_init_pci()
358 cdev->pci_params.mem_start = pci_resource_start(pdev, 0); in qed_init_pci()
359 cdev->pci_params.mem_end = pci_resource_end(pdev, 0); in qed_init_pci()
360 cdev->pci_params.irq = pdev->irq; in qed_init_pci()
362 cdev->regview = pci_ioremap_bar(pdev, 0); in qed_init_pci()
363 if (!cdev->regview) { in qed_init_pci()
364 DP_NOTICE(cdev, "Cannot map register space, aborting\n"); in qed_init_pci()
369 cdev->db_phys_addr = pci_resource_start(cdev->pdev, 2); in qed_init_pci()
370 cdev->db_size = pci_resource_len(cdev->pdev, 2); in qed_init_pci()
371 if (!cdev->db_size) { in qed_init_pci()
372 if (IS_PF(cdev)) { in qed_init_pci()
373 DP_NOTICE(cdev, "No Doorbell bar available\n"); in qed_init_pci()
380 cdev->doorbells = ioremap_wc(cdev->db_phys_addr, cdev->db_size); in qed_init_pci()
382 if (!cdev->doorbells) { in qed_init_pci()
383 DP_NOTICE(cdev, "Cannot map doorbell space\n"); in qed_init_pci()
390 DP_VERBOSE(cdev, NETIF_MSG_DRV, in qed_init_pci()
403 int qed_fill_dev_info(struct qed_dev *cdev, in qed_fill_dev_info() argument
406 struct qed_hwfn *p_hwfn = QED_LEADING_HWFN(cdev); in qed_fill_dev_info()
408 struct qed_tunnel_info *tun = &cdev->tunnel; in qed_fill_dev_info()
427 dev_info->num_hwfns = cdev->num_hwfns; in qed_fill_dev_info()
428 dev_info->pci_mem_start = cdev->pci_params.mem_start; in qed_fill_dev_info()
429 dev_info->pci_mem_end = cdev->pci_params.mem_end; in qed_fill_dev_info()
430 dev_info->pci_irq = cdev->pci_params.irq; in qed_fill_dev_info()
432 dev_info->dev_type = cdev->type; in qed_fill_dev_info()
435 if (IS_PF(cdev)) { in qed_fill_dev_info()
441 &cdev->mf_bits); in qed_fill_dev_info()
442 if (!test_bit(QED_MF_DISABLE_ARFS, &cdev->mf_bits)) in qed_fill_dev_info()
451 dev_info->abs_pf_id = QED_LEADING_HWFN(cdev)->abs_pf_id; in qed_fill_dev_info()
453 qed_vf_get_fw_version(&cdev->hwfns[0], &dev_info->fw_major, in qed_fill_dev_info()
458 if (IS_PF(cdev)) { in qed_fill_dev_info()
459 ptt = qed_ptt_acquire(QED_LEADING_HWFN(cdev)); in qed_fill_dev_info()
461 qed_mcp_get_mfw_ver(QED_LEADING_HWFN(cdev), ptt, in qed_fill_dev_info()
464 qed_mcp_get_mbi_ver(QED_LEADING_HWFN(cdev), ptt, in qed_fill_dev_info()
467 qed_mcp_get_flash_size(QED_LEADING_HWFN(cdev), ptt, in qed_fill_dev_info()
470 qed_ptt_release(QED_LEADING_HWFN(cdev), ptt); in qed_fill_dev_info()
473 qed_mcp_get_mfw_ver(QED_LEADING_HWFN(cdev), NULL, in qed_fill_dev_info()
478 cdev->common_dev_info = *dev_info; in qed_fill_dev_info()
483 static void qed_free_cdev(struct qed_dev *cdev) in qed_free_cdev() argument
485 kfree((void *)cdev); in qed_free_cdev()
490 struct qed_dev *cdev; in qed_alloc_cdev() local
492 cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); in qed_alloc_cdev()
493 if (!cdev) in qed_alloc_cdev()
494 return cdev; in qed_alloc_cdev()
496 qed_init_struct(cdev); in qed_alloc_cdev()
498 return cdev; in qed_alloc_cdev()
502 static int qed_set_power_state(struct qed_dev *cdev, pci_power_t state) in qed_set_power_state() argument
504 if (!cdev) in qed_set_power_state()
507 DP_VERBOSE(cdev, NETIF_MSG_DRV, "Omitting Power state change\n"); in qed_set_power_state()
515 struct qed_dev *cdev; in qed_probe() local
518 cdev = qed_alloc_cdev(pdev); in qed_probe()
519 if (!cdev) in qed_probe()
522 cdev->drv_type = DRV_ID_DRV_TYPE_LINUX; in qed_probe()
523 cdev->protocol = params->protocol; in qed_probe()
526 cdev->b_is_vf = true; in qed_probe()
528 qed_init_dp(cdev, params->dp_module, params->dp_level); in qed_probe()
530 cdev->recov_in_prog = params->recov_in_prog; in qed_probe()
532 rc = qed_init_pci(cdev, pdev); in qed_probe()
534 DP_ERR(cdev, "init pci failed\n"); in qed_probe()
537 DP_INFO(cdev, "PCI init completed successfully\n"); in qed_probe()
539 rc = qed_hw_prepare(cdev, QED_PCI_DEFAULT); in qed_probe()
541 DP_ERR(cdev, "hw prepare failed\n"); in qed_probe()
545 DP_INFO(cdev, "%s completed successfully\n", __func__); in qed_probe()
547 return cdev; in qed_probe()
550 qed_free_pci(cdev); in qed_probe()
552 qed_free_cdev(cdev); in qed_probe()
557 static void qed_remove(struct qed_dev *cdev) in qed_remove() argument
559 if (!cdev) in qed_remove()
562 qed_hw_remove(cdev); in qed_remove()
564 qed_free_pci(cdev); in qed_remove()
566 qed_set_power_state(cdev, PCI_D3hot); in qed_remove()
568 qed_free_cdev(cdev); in qed_remove()
571 static void qed_disable_msix(struct qed_dev *cdev) in qed_disable_msix() argument
573 if (cdev->int_params.out.int_mode == QED_INT_MODE_MSIX) { in qed_disable_msix()
574 pci_disable_msix(cdev->pdev); in qed_disable_msix()
575 kfree(cdev->int_params.msix_table); in qed_disable_msix()
576 } else if (cdev->int_params.out.int_mode == QED_INT_MODE_MSI) { in qed_disable_msix()
577 pci_disable_msi(cdev->pdev); in qed_disable_msix()
580 memset(&cdev->int_params.out, 0, sizeof(struct qed_int_param)); in qed_disable_msix()
583 static int qed_enable_msix(struct qed_dev *cdev, in qed_enable_msix() argument
593 rc = pci_enable_msix_range(cdev->pdev, int_params->msix_table, in qed_enable_msix()
596 (rc % cdev->num_hwfns)) { in qed_enable_msix()
597 pci_disable_msix(cdev->pdev); in qed_enable_msix()
603 cnt = (rc / cdev->num_hwfns) * cdev->num_hwfns; in qed_enable_msix()
604 DP_NOTICE(cdev, in qed_enable_msix()
607 rc = pci_enable_msix_exact(cdev->pdev, int_params->msix_table, in qed_enable_msix()
618 if ((IS_PF(cdev) && rc > 0) || (IS_VF(cdev) && rc == cnt)) { in qed_enable_msix()
624 DP_NOTICE(cdev, in qed_enable_msix()
633 static int qed_set_int_mode(struct qed_dev *cdev, bool force_mode) in qed_set_int_mode() argument
635 struct qed_int_params *int_params = &cdev->int_params; in qed_set_int_mode()
650 rc = qed_enable_msix(cdev, int_params); in qed_set_int_mode()
654 DP_NOTICE(cdev, "Failed to enable MSI-X\n"); in qed_set_int_mode()
661 if (cdev->num_hwfns == 1) { in qed_set_int_mode()
662 rc = pci_enable_msi(cdev->pdev); in qed_set_int_mode()
668 DP_NOTICE(cdev, "Failed to enable MSI\n"); in qed_set_int_mode()
679 DP_NOTICE(cdev, "Unknown int_mode value %d\n", in qed_set_int_mode()
686 DP_INFO(cdev, "Using %s interrupts\n", in qed_set_int_mode()
690 cdev->int_coalescing_mode = QED_COAL_MODE_ENABLE; in qed_set_int_mode()
695 static void qed_simd_handler_config(struct qed_dev *cdev, void *token, in qed_simd_handler_config() argument
698 struct qed_hwfn *hwfn = &cdev->hwfns[index % cdev->num_hwfns]; in qed_simd_handler_config()
699 int relative_idx = index / cdev->num_hwfns; in qed_simd_handler_config()
705 static void qed_simd_handler_clean(struct qed_dev *cdev, int index) in qed_simd_handler_clean() argument
707 struct qed_hwfn *hwfn = &cdev->hwfns[index % cdev->num_hwfns]; in qed_simd_handler_clean()
708 int relative_idx = index / cdev->num_hwfns; in qed_simd_handler_clean()
722 struct qed_dev *cdev = (struct qed_dev *)dev_instance; in qed_single_int() local
728 for (i = 0; i < cdev->num_hwfns; i++) { in qed_single_int()
729 status = qed_int_igu_read_sisr_reg(&cdev->hwfns[i]); in qed_single_int()
734 hwfn = &cdev->hwfns[i]; in qed_single_int()
772 struct qed_dev *cdev = hwfn->cdev; in qed_slowpath_irq_req() local
777 int_mode = cdev->int_params.out.int_mode; in qed_slowpath_irq_req()
781 id, cdev->pdev->bus->number, in qed_slowpath_irq_req()
782 PCI_SLOT(cdev->pdev->devfn), hwfn->abs_pf_id); in qed_slowpath_irq_req()
783 rc = request_irq(cdev->int_params.msix_table[id].vector, in qed_slowpath_irq_req()
788 snprintf(cdev->name, NAME_SIZE, "%02x:%02x.%02x", in qed_slowpath_irq_req()
789 cdev->pdev->bus->number, PCI_SLOT(cdev->pdev->devfn), in qed_slowpath_irq_req()
790 PCI_FUNC(cdev->pdev->devfn)); in qed_slowpath_irq_req()
792 if (cdev->int_params.out.int_mode == QED_INT_MODE_INTA) in qed_slowpath_irq_req()
795 rc = request_irq(cdev->pdev->irq, qed_single_int, in qed_slowpath_irq_req()
796 flags, cdev->name, cdev); in qed_slowpath_irq_req()
800 DP_NOTICE(cdev, "request_irq failed, rc = %d\n", rc); in qed_slowpath_irq_req()
823 struct qed_dev *cdev = p_hwfn->cdev; in qed_slowpath_irq_sync() local
827 int_mode = cdev->int_params.out.int_mode; in qed_slowpath_irq_sync()
829 synchronize_irq(cdev->int_params.msix_table[id].vector); in qed_slowpath_irq_sync()
831 synchronize_irq(cdev->pdev->irq); in qed_slowpath_irq_sync()
836 static void qed_slowpath_irq_free(struct qed_dev *cdev) in qed_slowpath_irq_free() argument
840 if (cdev->int_params.out.int_mode == QED_INT_MODE_MSIX) { in qed_slowpath_irq_free()
841 for_each_hwfn(cdev, i) { in qed_slowpath_irq_free()
842 if (!cdev->hwfns[i].b_int_requested) in qed_slowpath_irq_free()
844 synchronize_irq(cdev->int_params.msix_table[i].vector); in qed_slowpath_irq_free()
845 free_irq(cdev->int_params.msix_table[i].vector, in qed_slowpath_irq_free()
846 &cdev->hwfns[i].sp_dpc); in qed_slowpath_irq_free()
849 if (QED_LEADING_HWFN(cdev)->b_int_requested) in qed_slowpath_irq_free()
850 free_irq(cdev->pdev->irq, cdev); in qed_slowpath_irq_free()
852 qed_int_disable_post_isr_release(cdev); in qed_slowpath_irq_free()
855 static int qed_nic_stop(struct qed_dev *cdev) in qed_nic_stop() argument
859 rc = qed_hw_stop(cdev); in qed_nic_stop()
861 for (i = 0; i < cdev->num_hwfns; i++) { in qed_nic_stop()
862 struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; in qed_nic_stop()
867 DP_VERBOSE(cdev, NETIF_MSG_IFDOWN, in qed_nic_stop()
873 qed_dbg_pf_exit(cdev); in qed_nic_stop()
878 static int qed_nic_setup(struct qed_dev *cdev) in qed_nic_setup() argument
883 if (QED_LEADING_HWFN(cdev)->hw_info.personality != QED_PCI_ETH) { in qed_nic_setup()
884 for (i = 0; i < cdev->num_hwfns; i++) { in qed_nic_setup()
885 struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; in qed_nic_setup()
891 rc = qed_resc_alloc(cdev); in qed_nic_setup()
895 DP_INFO(cdev, "Allocated qed resources\n"); in qed_nic_setup()
897 qed_resc_setup(cdev); in qed_nic_setup()
902 static int qed_set_int_fp(struct qed_dev *cdev, u16 cnt) in qed_set_int_fp() argument
907 cdev->int_params.fp_initialized = cnt ? true : false; in qed_set_int_fp()
909 if (cdev->int_params.out.int_mode != QED_INT_MODE_MSIX) in qed_set_int_fp()
910 limit = cdev->num_hwfns * 63; in qed_set_int_fp()
911 else if (cdev->int_params.fp_msix_cnt) in qed_set_int_fp()
912 limit = cdev->int_params.fp_msix_cnt; in qed_set_int_fp()
920 static int qed_get_int_fp(struct qed_dev *cdev, struct qed_int_info *info) in qed_get_int_fp() argument
924 if (!cdev->int_params.fp_initialized) { in qed_get_int_fp()
925 DP_INFO(cdev, in qed_get_int_fp()
933 if (cdev->int_params.out.int_mode == QED_INT_MODE_MSIX) { in qed_get_int_fp()
934 int msix_base = cdev->int_params.fp_msix_base; in qed_get_int_fp()
936 info->msix_cnt = cdev->int_params.fp_msix_cnt; in qed_get_int_fp()
937 info->msix = &cdev->int_params.msix_table[msix_base]; in qed_get_int_fp()
943 static int qed_slowpath_setup_int(struct qed_dev *cdev, in qed_slowpath_setup_int() argument
951 if ((int_mode == QED_INT_MODE_MSI) && (cdev->num_hwfns > 1)) { in qed_slowpath_setup_int()
952 DP_NOTICE(cdev, "MSI mode is not supported for CMT devices\n"); in qed_slowpath_setup_int()
956 memset(&cdev->int_params, 0, sizeof(struct qed_int_params)); in qed_slowpath_setup_int()
957 cdev->int_params.in.int_mode = int_mode; in qed_slowpath_setup_int()
958 for_each_hwfn(cdev, i) { in qed_slowpath_setup_int()
960 qed_int_get_num_sbs(&cdev->hwfns[i], &sb_cnt_info); in qed_slowpath_setup_int()
961 cdev->int_params.in.num_vectors += sb_cnt_info.cnt; in qed_slowpath_setup_int()
962 cdev->int_params.in.num_vectors++; /* slowpath */ in qed_slowpath_setup_int()
966 cdev->int_params.in.min_msix_cnt = cdev->num_hwfns * 2; in qed_slowpath_setup_int()
969 DP_INFO(cdev, in qed_slowpath_setup_int()
971 cdev->int_params.in.min_msix_cnt); in qed_slowpath_setup_int()
972 cdev->int_params.in.num_vectors = in qed_slowpath_setup_int()
973 cdev->int_params.in.min_msix_cnt; in qed_slowpath_setup_int()
976 rc = qed_set_int_mode(cdev, false); in qed_slowpath_setup_int()
978 DP_ERR(cdev, "%s ERR\n", __func__); in qed_slowpath_setup_int()
982 cdev->int_params.fp_msix_base = cdev->num_hwfns; in qed_slowpath_setup_int()
983 cdev->int_params.fp_msix_cnt = cdev->int_params.out.num_vectors - in qed_slowpath_setup_int()
984 cdev->num_hwfns; in qed_slowpath_setup_int()
987 !QED_IS_RDMA_PERSONALITY(QED_LEADING_HWFN(cdev))) in qed_slowpath_setup_int()
990 for_each_hwfn(cdev, i) in qed_slowpath_setup_int()
991 num_l2_queues += FEAT_NUM(&cdev->hwfns[i], QED_PF_L2_QUE); in qed_slowpath_setup_int()
993 DP_VERBOSE(cdev, QED_MSG_RDMA, in qed_slowpath_setup_int()
995 cdev->int_params.fp_msix_cnt, num_l2_queues); in qed_slowpath_setup_int()
997 if (cdev->int_params.fp_msix_cnt > num_l2_queues) { in qed_slowpath_setup_int()
998 cdev->int_params.rdma_msix_cnt = in qed_slowpath_setup_int()
999 (cdev->int_params.fp_msix_cnt - num_l2_queues) in qed_slowpath_setup_int()
1000 / cdev->num_hwfns; in qed_slowpath_setup_int()
1001 cdev->int_params.rdma_msix_base = in qed_slowpath_setup_int()
1002 cdev->int_params.fp_msix_base + num_l2_queues; in qed_slowpath_setup_int()
1003 cdev->int_params.fp_msix_cnt = num_l2_queues; in qed_slowpath_setup_int()
1005 cdev->int_params.rdma_msix_cnt = 0; in qed_slowpath_setup_int()
1008 DP_VERBOSE(cdev, QED_MSG_RDMA, "roce_msix_cnt=%d roce_msix_base=%d\n", in qed_slowpath_setup_int()
1009 cdev->int_params.rdma_msix_cnt, in qed_slowpath_setup_int()
1010 cdev->int_params.rdma_msix_base); in qed_slowpath_setup_int()
1015 static int qed_slowpath_vf_setup_int(struct qed_dev *cdev) in qed_slowpath_vf_setup_int() argument
1019 memset(&cdev->int_params, 0, sizeof(struct qed_int_params)); in qed_slowpath_vf_setup_int()
1020 cdev->int_params.in.int_mode = QED_INT_MODE_MSIX; in qed_slowpath_vf_setup_int()
1022 qed_vf_get_num_rxqs(QED_LEADING_HWFN(cdev), in qed_slowpath_vf_setup_int()
1023 &cdev->int_params.in.num_vectors); in qed_slowpath_vf_setup_int()
1024 if (cdev->num_hwfns > 1) { in qed_slowpath_vf_setup_int()
1027 qed_vf_get_num_rxqs(&cdev->hwfns[1], &vectors); in qed_slowpath_vf_setup_int()
1028 cdev->int_params.in.num_vectors += vectors; in qed_slowpath_vf_setup_int()
1032 cdev->int_params.in.min_msix_cnt = cdev->num_hwfns; in qed_slowpath_vf_setup_int()
1034 rc = qed_set_int_mode(cdev, true); in qed_slowpath_vf_setup_int()
1038 cdev->int_params.fp_msix_base = 0; in qed_slowpath_vf_setup_int()
1039 cdev->int_params.fp_msix_cnt = cdev->int_params.out.num_vectors; in qed_slowpath_vf_setup_int()
1074 static int qed_alloc_stream_mem(struct qed_dev *cdev) in qed_alloc_stream_mem() argument
1079 for_each_hwfn(cdev, i) { in qed_alloc_stream_mem()
1080 struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; in qed_alloc_stream_mem()
1095 static void qed_free_stream_mem(struct qed_dev *cdev) in qed_free_stream_mem() argument
1099 for_each_hwfn(cdev, i) { in qed_free_stream_mem()
1100 struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; in qed_free_stream_mem()
1110 static void qed_update_pf_params(struct qed_dev *cdev, in qed_update_pf_params() argument
1123 if (cdev->num_hwfns > 1 || IS_VF(cdev)) in qed_update_pf_params()
1130 if (QED_IS_RDMA_PERSONALITY(QED_LEADING_HWFN(cdev))) { in qed_update_pf_params()
1137 for (i = 0; i < cdev->num_hwfns; i++) { in qed_update_pf_params()
1138 struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; in qed_update_pf_params()
1180 static void qed_slowpath_wq_stop(struct qed_dev *cdev) in qed_slowpath_wq_stop() argument
1184 if (IS_VF(cdev)) in qed_slowpath_wq_stop()
1187 for_each_hwfn(cdev, i) { in qed_slowpath_wq_stop()
1188 if (!cdev->hwfns[i].slowpath_wq) in qed_slowpath_wq_stop()
1192 cdev->hwfns[i].slowpath_wq_active = false; in qed_slowpath_wq_stop()
1194 cancel_delayed_work(&cdev->hwfns[i].slowpath_task); in qed_slowpath_wq_stop()
1195 destroy_workqueue(cdev->hwfns[i].slowpath_wq); in qed_slowpath_wq_stop()
1220 if (hwfn->cdev->recov_in_prog || !hwfn->slowpath_wq_active) in qed_slowpath_task()
1234 static int qed_slowpath_wq_start(struct qed_dev *cdev) in qed_slowpath_wq_start() argument
1240 if (IS_VF(cdev)) in qed_slowpath_wq_start()
1243 for_each_hwfn(cdev, i) { in qed_slowpath_wq_start()
1244 hwfn = &cdev->hwfns[i]; in qed_slowpath_wq_start()
1247 cdev->pdev->bus->number, in qed_slowpath_wq_start()
1248 PCI_SLOT(cdev->pdev->devfn), hwfn->abs_pf_id); in qed_slowpath_wq_start()
1263 static int qed_slowpath_start(struct qed_dev *cdev, in qed_slowpath_start() argument
1275 if (qed_iov_wq_start(cdev)) in qed_slowpath_start()
1278 if (qed_slowpath_wq_start(cdev)) in qed_slowpath_start()
1281 if (IS_PF(cdev)) { in qed_slowpath_start()
1282 rc = request_firmware(&cdev->firmware, QED_FW_FILE_NAME, in qed_slowpath_start()
1283 &cdev->pdev->dev); in qed_slowpath_start()
1285 DP_NOTICE(cdev, in qed_slowpath_start()
1291 if (cdev->num_hwfns == 1) { in qed_slowpath_start()
1292 p_ptt = qed_ptt_acquire(QED_LEADING_HWFN(cdev)); in qed_slowpath_start()
1294 QED_LEADING_HWFN(cdev)->p_arfs_ptt = p_ptt; in qed_slowpath_start()
1296 DP_NOTICE(cdev, in qed_slowpath_start()
1304 cdev->rx_coalesce_usecs = QED_DEFAULT_RX_USECS; in qed_slowpath_start()
1305 rc = qed_nic_setup(cdev); in qed_slowpath_start()
1309 if (IS_PF(cdev)) in qed_slowpath_start()
1310 rc = qed_slowpath_setup_int(cdev, params->int_mode); in qed_slowpath_start()
1312 rc = qed_slowpath_vf_setup_int(cdev); in qed_slowpath_start()
1316 if (IS_PF(cdev)) { in qed_slowpath_start()
1318 rc = qed_alloc_stream_mem(cdev); in qed_slowpath_start()
1323 data = cdev->firmware->data + sizeof(u32); in qed_slowpath_start()
1325 qed_dbg_pf_init(cdev); in qed_slowpath_start()
1343 hw_init_params.int_mode = cdev->int_params.out.int_mode; in qed_slowpath_start()
1354 rc = qed_hw_init(cdev, &hw_init_params); in qed_slowpath_start()
1358 DP_INFO(cdev, in qed_slowpath_start()
1361 if (IS_PF(cdev)) { in qed_slowpath_start()
1362 cdev->tunn_feature_mask = (BIT(QED_MODE_VXLAN_TUNN) | in qed_slowpath_start()
1370 if (QED_LEADING_HWFN(cdev)->using_ll2) { in qed_slowpath_start()
1371 rc = qed_ll2_alloc_if(cdev); in qed_slowpath_start()
1375 if (IS_PF(cdev)) { in qed_slowpath_start()
1376 hwfn = QED_LEADING_HWFN(cdev); in qed_slowpath_start()
1386 DP_NOTICE(cdev, "Failed sending drv version command\n"); in qed_slowpath_start()
1391 qed_reset_vport_stats(cdev); in qed_slowpath_start()
1396 qed_ll2_dealloc_if(cdev); in qed_slowpath_start()
1398 qed_hw_stop(cdev); in qed_slowpath_start()
1400 qed_hw_timers_stop_all(cdev); in qed_slowpath_start()
1401 if (IS_PF(cdev)) in qed_slowpath_start()
1402 qed_slowpath_irq_free(cdev); in qed_slowpath_start()
1403 qed_free_stream_mem(cdev); in qed_slowpath_start()
1404 qed_disable_msix(cdev); in qed_slowpath_start()
1406 qed_resc_free(cdev); in qed_slowpath_start()
1408 if (IS_PF(cdev)) in qed_slowpath_start()
1409 release_firmware(cdev->firmware); in qed_slowpath_start()
1411 if (IS_PF(cdev) && (cdev->num_hwfns == 1) && in qed_slowpath_start()
1412 QED_LEADING_HWFN(cdev)->p_arfs_ptt) in qed_slowpath_start()
1413 qed_ptt_release(QED_LEADING_HWFN(cdev), in qed_slowpath_start()
1414 QED_LEADING_HWFN(cdev)->p_arfs_ptt); in qed_slowpath_start()
1416 qed_iov_wq_stop(cdev, false); in qed_slowpath_start()
1418 qed_slowpath_wq_stop(cdev); in qed_slowpath_start()
1423 static int qed_slowpath_stop(struct qed_dev *cdev) in qed_slowpath_stop() argument
1425 if (!cdev) in qed_slowpath_stop()
1428 qed_slowpath_wq_stop(cdev); in qed_slowpath_stop()
1430 qed_ll2_dealloc_if(cdev); in qed_slowpath_stop()
1432 if (IS_PF(cdev)) { in qed_slowpath_stop()
1433 if (cdev->num_hwfns == 1) in qed_slowpath_stop()
1434 qed_ptt_release(QED_LEADING_HWFN(cdev), in qed_slowpath_stop()
1435 QED_LEADING_HWFN(cdev)->p_arfs_ptt); in qed_slowpath_stop()
1436 qed_free_stream_mem(cdev); in qed_slowpath_stop()
1437 if (IS_QED_ETH_IF(cdev)) in qed_slowpath_stop()
1438 qed_sriov_disable(cdev, true); in qed_slowpath_stop()
1441 qed_nic_stop(cdev); in qed_slowpath_stop()
1443 if (IS_PF(cdev)) in qed_slowpath_stop()
1444 qed_slowpath_irq_free(cdev); in qed_slowpath_stop()
1446 qed_disable_msix(cdev); in qed_slowpath_stop()
1448 qed_resc_free(cdev); in qed_slowpath_stop()
1450 qed_iov_wq_stop(cdev, true); in qed_slowpath_stop()
1452 if (IS_PF(cdev)) in qed_slowpath_stop()
1453 release_firmware(cdev->firmware); in qed_slowpath_stop()
1458 static void qed_set_name(struct qed_dev *cdev, char name[NAME_SIZE]) in qed_set_name() argument
1462 memcpy(cdev->name, name, NAME_SIZE); in qed_set_name()
1463 for_each_hwfn(cdev, i) in qed_set_name()
1464 snprintf(cdev->hwfns[i].name, NAME_SIZE, "%s-%d", name, i); in qed_set_name()
1467 static u32 qed_sb_init(struct qed_dev *cdev, in qed_sb_init() argument
1480 p_hwfn = &cdev->hwfns[sb_id % cdev->num_hwfns]; in qed_sb_init()
1481 rel_sb_id = sb_id / cdev->num_hwfns; in qed_sb_init()
1483 p_hwfn = QED_AFFIN_HWFN(cdev); in qed_sb_init()
1487 DP_VERBOSE(cdev, NETIF_MSG_INTR, in qed_sb_init()
1491 if (IS_PF(p_hwfn->cdev)) { in qed_sb_init()
1507 static u32 qed_sb_release(struct qed_dev *cdev, in qed_sb_release() argument
1518 p_hwfn = &cdev->hwfns[sb_id % cdev->num_hwfns]; in qed_sb_release()
1519 rel_sb_id = sb_id / cdev->num_hwfns; in qed_sb_release()
1521 p_hwfn = QED_AFFIN_HWFN(cdev); in qed_sb_release()
1525 DP_VERBOSE(cdev, NETIF_MSG_INTR, in qed_sb_release()
1534 static bool qed_can_link_change(struct qed_dev *cdev) in qed_can_link_change() argument
1680 static int qed_set_link(struct qed_dev *cdev, struct qed_link_params *params) in qed_set_link() argument
1690 if (!cdev) in qed_set_link()
1694 hwfn = &cdev->hwfns[0]; in qed_set_link()
1700 if (IS_VF(cdev)) { in qed_set_link()
1839 if (!IS_PF(hwfn->cdev)) { in qed_get_link_data()
1884 DP_VERBOSE(hwfn->cdev, NETIF_MSG_DRV, in qed_fill_link_capability()
2072 DP_VERBOSE(hwfn->cdev, QED_MSG_DEBUG, in qed_fill_link_capability()
2112 dev_warn(&hwfn->cdev->pdev->dev, "no link data available\n"); in qed_fill_link()
2120 if (IS_PF(hwfn->cdev) && qed_mcp_is_ext_speed_supported(hwfn)) { in qed_fill_link()
2209 static void qed_get_current_link(struct qed_dev *cdev, in qed_get_current_link() argument
2216 hwfn = &cdev->hwfns[0]; in qed_get_current_link()
2217 if (IS_PF(cdev)) { in qed_get_current_link()
2229 for_each_hwfn(cdev, i) in qed_get_current_link()
2230 qed_inform_vf_link_state(&cdev->hwfns[i]); in qed_get_current_link()
2235 void *cookie = hwfn->cdev->ops_cookie; in qed_link_update()
2236 struct qed_common_cb_ops *op = hwfn->cdev->protocol_ops.common; in qed_link_update()
2248 void *cookie = hwfn->cdev->ops_cookie; in qed_bw_update()
2249 struct qed_common_cb_ops *op = hwfn->cdev->protocol_ops.common; in qed_bw_update()
2255 static int qed_drain(struct qed_dev *cdev) in qed_drain() argument
2261 if (IS_VF(cdev)) in qed_drain()
2264 for_each_hwfn(cdev, i) { in qed_drain()
2265 hwfn = &cdev->hwfns[i]; in qed_drain()
2280 static u32 qed_nvm_flash_image_access_crc(struct qed_dev *cdev, in qed_nvm_flash_image_access_crc() argument
2293 rc = qed_mcp_nvm_read(cdev, nvm_image->start_addr, in qed_nvm_flash_image_access_crc()
2296 DP_ERR(cdev, "Failed reading image from nvm\n"); in qed_nvm_flash_image_access_crc()
2329 static int qed_nvm_flash_image_access(struct qed_dev *cdev, const u8 **data, in qed_nvm_flash_image_access() argument
2341 p_hwfn = QED_LEADING_HWFN(cdev); in qed_nvm_flash_image_access()
2346 DP_ERR(cdev, "Failed to find nvram image of type %08x\n", in qed_nvm_flash_image_access()
2354 DP_VERBOSE(cdev, NETIF_MSG_DRV, in qed_nvm_flash_image_access()
2366 rc = qed_nvm_flash_image_access_crc(cdev, &nvm_image, &crc); in qed_nvm_flash_image_access()
2368 DP_ERR(cdev, "Failed calculating CRC, rc = %d\n", rc); in qed_nvm_flash_image_access()
2372 rc = qed_mcp_nvm_write(cdev, QED_NVM_WRITE_NVRAM, in qed_nvm_flash_image_access()
2376 DP_ERR(cdev, "Failed writing to %08x, rc = %d\n", in qed_nvm_flash_image_access()
2393 rc = qed_mcp_nvm_read(cdev, nvm_image.start_addr + offset, buf, in qed_nvm_flash_image_access()
2396 DP_ERR(cdev, "Failed reading from %08x\n", in qed_nvm_flash_image_access()
2402 DP_VERBOSE(cdev, NETIF_MSG_DRV, in qed_nvm_flash_image_access()
2407 rc = qed_mcp_nvm_write(cdev, QED_NVM_WRITE_NVRAM, in qed_nvm_flash_image_access()
2411 DP_ERR(cdev, "Failed writing to %08x\n", in qed_nvm_flash_image_access()
2431 static int qed_nvm_flash_image_file_start(struct qed_dev *cdev, in qed_nvm_flash_image_file_start() argument
2442 DP_VERBOSE(cdev, NETIF_MSG_DRV, in qed_nvm_flash_image_file_start()
2449 rc = qed_mcp_nvm_write(cdev, QED_PUT_FILE_BEGIN, file_type, in qed_nvm_flash_image_file_start()
2467 static int qed_nvm_flash_image_file_data(struct qed_dev *cdev, in qed_nvm_flash_image_file_data() argument
2481 DP_VERBOSE(cdev, NETIF_MSG_DRV, in qed_nvm_flash_image_file_data()
2485 rc = qed_mcp_nvm_write(cdev, QED_PUT_FILE_DATA, offset, in qed_nvm_flash_image_file_data()
2499 static int qed_nvm_flash_image_validate(struct qed_dev *cdev, in qed_nvm_flash_image_validate() argument
2507 DP_ERR(cdev, "Image is too short [%08x]\n", (u32)image->size); in qed_nvm_flash_image_validate()
2514 DP_ERR(cdev, "Wrong signature '%08x'\n", signature); in qed_nvm_flash_image_validate()
2522 DP_ERR(cdev, "Size mismatch: internal = %08x image = %08x\n", in qed_nvm_flash_image_validate()
2530 DP_ERR(cdev, "File contains unsupported commands [Need %04x]\n", in qed_nvm_flash_image_validate()
2554 static int qed_nvm_flash_cfg_write(struct qed_dev *cdev, const u8 **data) in qed_nvm_flash_cfg_write() argument
2556 struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); in qed_nvm_flash_cfg_write()
2573 DP_VERBOSE(cdev, NETIF_MSG_DRV, in qed_nvm_flash_cfg_write()
2604 DP_VERBOSE(cdev, NETIF_MSG_DRV, in qed_nvm_flash_cfg_write()
2610 DP_ERR(cdev, "Error %d configuring %d\n", rc, cfg_id); in qed_nvm_flash_cfg_write()
2621 static int qed_nvm_flash_cfg_len(struct qed_dev *cdev, u32 cmd) in qed_nvm_flash_cfg_len() argument
2623 struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); in qed_nvm_flash_cfg_len()
2636 DP_ERR(cdev, "Error %d reading %d\n", rc, cmd); in qed_nvm_flash_cfg_len()
2645 static int qed_nvm_flash_cfg_read(struct qed_dev *cdev, u8 **data, in qed_nvm_flash_cfg_read() argument
2648 struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); in qed_nvm_flash_cfg_read()
2657 DP_VERBOSE(cdev, NETIF_MSG_DRV, in qed_nvm_flash_cfg_read()
2662 DP_ERR(cdev, "Error %d reading %d\n", rc, cmd); in qed_nvm_flash_cfg_read()
2669 static int qed_nvm_flash(struct qed_dev *cdev, const char *name) in qed_nvm_flash() argument
2676 rc = request_firmware(&image, name, &cdev->pdev->dev); in qed_nvm_flash()
2678 DP_ERR(cdev, "Failed to find '%s'\n", name); in qed_nvm_flash()
2682 DP_VERBOSE(cdev, NETIF_MSG_DRV, in qed_nvm_flash()
2688 rc = qed_nvm_flash_image_validate(cdev, image, &data); in qed_nvm_flash()
2699 rc = qed_nvm_flash_image_file_data(cdev, &data, in qed_nvm_flash()
2703 rc = qed_nvm_flash_image_file_start(cdev, &data, in qed_nvm_flash()
2707 rc = qed_nvm_flash_image_access(cdev, &data, in qed_nvm_flash()
2711 rc = qed_nvm_flash_cfg_write(cdev, &data); in qed_nvm_flash()
2714 DP_ERR(cdev, "Unknown command %08x\n", cmd_type); in qed_nvm_flash()
2720 DP_ERR(cdev, "Command %08x failed\n", cmd_type); in qed_nvm_flash()
2728 if (qed_mcp_nvm_resp(cdev, (u8 *)&mcp_response)) { in qed_nvm_flash()
2729 DP_ERR(cdev, "Failed getting MCP response\n"); in qed_nvm_flash()
2741 DP_ERR(cdev, "MFW returns error: %08x\n", in qed_nvm_flash()
2755 static int qed_nvm_get_image(struct qed_dev *cdev, enum qed_nvm_images type, in qed_nvm_get_image() argument
2758 struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); in qed_nvm_get_image()
2765 struct qed_common_cb_ops *ops = p_hwfn->cdev->protocol_ops.common; in qed_schedule_recovery_handler()
2766 void *cookie = p_hwfn->cdev->ops_cookie; in qed_schedule_recovery_handler()
2785 struct qed_common_cb_ops *ops = p_hwfn->cdev->protocol_ops.common; in qed_hw_error_occurred()
2786 void *cookie = p_hwfn->cdev->ops_cookie; in qed_hw_error_occurred()
2802 qed_int_attn_clr_enable(p_hwfn->cdev, true); in qed_hw_error_occurred()
2805 static int qed_set_coalesce(struct qed_dev *cdev, u16 rx_coal, u16 tx_coal, in qed_set_coalesce() argument
2811 static int qed_set_led(struct qed_dev *cdev, enum qed_led_mode mode) in qed_set_led() argument
2813 struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); in qed_set_led()
2828 int qed_recovery_process(struct qed_dev *cdev) in qed_recovery_process() argument
2830 struct qed_hwfn *p_hwfn = QED_LEADING_HWFN(cdev); in qed_recovery_process()
2845 static int qed_update_wol(struct qed_dev *cdev, bool enabled) in qed_update_wol() argument
2847 struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); in qed_update_wol()
2851 if (IS_VF(cdev)) in qed_update_wol()
2869 static int qed_update_drv_state(struct qed_dev *cdev, bool active) in qed_update_drv_state() argument
2871 struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); in qed_update_drv_state()
2875 if (IS_VF(cdev)) in qed_update_drv_state()
2891 static int qed_update_mac(struct qed_dev *cdev, const u8 *mac) in qed_update_mac() argument
2893 struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); in qed_update_mac()
2897 if (IS_VF(cdev)) in qed_update_mac()
2915 static int qed_update_mtu(struct qed_dev *cdev, u16 mtu) in qed_update_mtu() argument
2917 struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); in qed_update_mtu()
2921 if (IS_VF(cdev)) in qed_update_mtu()
2939 static int qed_read_module_eeprom(struct qed_dev *cdev, char *buf, in qed_read_module_eeprom() argument
2942 struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); in qed_read_module_eeprom()
2946 if (IS_VF(cdev)) in qed_read_module_eeprom()
2961 static int qed_set_grc_config(struct qed_dev *cdev, u32 cfg_id, u32 val) in qed_set_grc_config() argument
2963 struct qed_hwfn *hwfn = QED_LEADING_HWFN(cdev); in qed_set_grc_config()
2967 if (IS_VF(cdev)) in qed_set_grc_config()
2981 static u8 qed_get_affin_hwfn_idx(struct qed_dev *cdev) in qed_get_affin_hwfn_idx() argument
2983 return QED_AFFIN_HWFN_IDX(cdev); in qed_get_affin_hwfn_idx()
3043 void qed_get_protocol_stats(struct qed_dev *cdev, in qed_get_protocol_stats() argument
3053 qed_get_vport_stats(cdev, &eth_stats); in qed_get_protocol_stats()
3061 qed_get_protocol_stats_fcoe(cdev, &stats->fcoe_stats); in qed_get_protocol_stats()
3064 qed_get_protocol_stats_iscsi(cdev, &stats->iscsi_stats); in qed_get_protocol_stats()
3067 DP_VERBOSE(cdev, QED_MSG_SP, in qed_get_protocol_stats()
3075 DP_VERBOSE(hwfn->cdev, NETIF_MSG_DRV, in qed_mfw_tlv_req()
3089 qed_fill_generic_tlv_data(struct qed_dev *cdev, struct qed_mfw_tlv_generic *tlv) in qed_fill_generic_tlv_data() argument
3091 struct qed_common_cb_ops *op = cdev->protocol_ops.common; in qed_fill_generic_tlv_data()
3098 op->get_generic_tlv_data(cdev->ops_cookie, &gen_tlvs); in qed_fill_generic_tlv_data()
3113 qed_get_vport_stats(cdev, &stats); in qed_fill_generic_tlv_data()
3132 struct qed_dev *cdev = hwfn->cdev; in qed_mfw_fill_tlv_data() local
3135 ops = cdev->protocol_ops.common; in qed_mfw_fill_tlv_data()
3143 qed_fill_generic_tlv_data(hwfn->cdev, &tlv_buf->generic); in qed_mfw_fill_tlv_data()
3146 ops->get_protocol_tlv_data(cdev->ops_cookie, &tlv_buf->eth); in qed_mfw_fill_tlv_data()
3149 ops->get_protocol_tlv_data(cdev->ops_cookie, &tlv_buf->fcoe); in qed_mfw_fill_tlv_data()
3152 ops->get_protocol_tlv_data(cdev->ops_cookie, &tlv_buf->iscsi); in qed_mfw_fill_tlv_data()