Lines Matching refs:cdev
68 static int qed_set_coherency_mask(struct qed_dev *cdev) in qed_set_coherency_mask() argument
70 struct device *dev = &cdev->pdev->dev; in qed_set_coherency_mask()
74 DP_NOTICE(cdev, in qed_set_coherency_mask()
79 DP_NOTICE(cdev, "Can't request 64b/32b DMA addresses\n"); in qed_set_coherency_mask()
86 static void qed_free_pci(struct qed_dev *cdev) in qed_free_pci() argument
88 struct pci_dev *pdev = cdev->pdev; in qed_free_pci()
90 if (cdev->doorbells) in qed_free_pci()
91 iounmap(cdev->doorbells); in qed_free_pci()
92 if (cdev->regview) in qed_free_pci()
93 iounmap(cdev->regview); in qed_free_pci()
103 static int qed_init_pci(struct qed_dev *cdev, in qed_init_pci() argument
108 cdev->pdev = pdev; in qed_init_pci()
112 DP_NOTICE(cdev, "Cannot enable PCI device\n"); in qed_init_pci()
117 DP_NOTICE(cdev, "No memory region found in bar #0\n"); in qed_init_pci()
123 DP_NOTICE(cdev, "No memory region found in bar #2\n"); in qed_init_pci()
131 DP_NOTICE(cdev, in qed_init_pci()
140 DP_NOTICE(cdev, "The bus is not PCI Express\n"); in qed_init_pci()
145 cdev->pci_params.pm_cap = pci_find_capability(pdev, PCI_CAP_ID_PM); in qed_init_pci()
146 if (cdev->pci_params.pm_cap == 0) in qed_init_pci()
147 DP_NOTICE(cdev, "Cannot find power management capability\n"); in qed_init_pci()
149 rc = qed_set_coherency_mask(cdev); in qed_init_pci()
153 cdev->pci_params.mem_start = pci_resource_start(pdev, 0); in qed_init_pci()
154 cdev->pci_params.mem_end = pci_resource_end(pdev, 0); in qed_init_pci()
155 cdev->pci_params.irq = pdev->irq; in qed_init_pci()
157 cdev->regview = pci_ioremap_bar(pdev, 0); in qed_init_pci()
158 if (!cdev->regview) { in qed_init_pci()
159 DP_NOTICE(cdev, "Cannot map register space, aborting\n"); in qed_init_pci()
164 cdev->db_phys_addr = pci_resource_start(cdev->pdev, 2); in qed_init_pci()
165 cdev->db_size = pci_resource_len(cdev->pdev, 2); in qed_init_pci()
166 cdev->doorbells = ioremap_wc(cdev->db_phys_addr, cdev->db_size); in qed_init_pci()
167 if (!cdev->doorbells) { in qed_init_pci()
168 DP_NOTICE(cdev, "Cannot map doorbell space\n"); in qed_init_pci()
182 int qed_fill_dev_info(struct qed_dev *cdev, in qed_fill_dev_info() argument
189 dev_info->num_hwfns = cdev->num_hwfns; in qed_fill_dev_info()
190 dev_info->pci_mem_start = cdev->pci_params.mem_start; in qed_fill_dev_info()
191 dev_info->pci_mem_end = cdev->pci_params.mem_end; in qed_fill_dev_info()
192 dev_info->pci_irq = cdev->pci_params.irq; in qed_fill_dev_info()
193 dev_info->is_mf = IS_MF(&cdev->hwfns[0]); in qed_fill_dev_info()
194 ether_addr_copy(dev_info->hw_mac, cdev->hwfns[0].hw_info.hw_mac_addr); in qed_fill_dev_info()
200 dev_info->mf_mode = cdev->mf_mode; in qed_fill_dev_info()
202 qed_mcp_get_mfw_ver(cdev, &dev_info->mfw_rev); in qed_fill_dev_info()
204 ptt = qed_ptt_acquire(QED_LEADING_HWFN(cdev)); in qed_fill_dev_info()
206 qed_mcp_get_flash_size(QED_LEADING_HWFN(cdev), ptt, in qed_fill_dev_info()
209 qed_ptt_release(QED_LEADING_HWFN(cdev), ptt); in qed_fill_dev_info()
215 static void qed_free_cdev(struct qed_dev *cdev) in qed_free_cdev() argument
217 kfree((void *)cdev); in qed_free_cdev()
222 struct qed_dev *cdev; in qed_alloc_cdev() local
224 cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); in qed_alloc_cdev()
225 if (!cdev) in qed_alloc_cdev()
226 return cdev; in qed_alloc_cdev()
228 qed_init_struct(cdev); in qed_alloc_cdev()
230 return cdev; in qed_alloc_cdev()
234 static int qed_set_power_state(struct qed_dev *cdev, in qed_set_power_state() argument
237 if (!cdev) in qed_set_power_state()
240 DP_VERBOSE(cdev, NETIF_MSG_DRV, "Omitting Power state change\n"); in qed_set_power_state()
250 struct qed_dev *cdev; in qed_probe() local
253 cdev = qed_alloc_cdev(pdev); in qed_probe()
254 if (!cdev) in qed_probe()
257 cdev->protocol = protocol; in qed_probe()
259 qed_init_dp(cdev, dp_module, dp_level); in qed_probe()
261 rc = qed_init_pci(cdev, pdev); in qed_probe()
263 DP_ERR(cdev, "init pci failed\n"); in qed_probe()
266 DP_INFO(cdev, "PCI init completed successfully\n"); in qed_probe()
268 rc = qed_hw_prepare(cdev, QED_PCI_DEFAULT); in qed_probe()
270 DP_ERR(cdev, "hw prepare failed\n"); in qed_probe()
274 DP_INFO(cdev, "qed_probe completed successffuly\n"); in qed_probe()
276 return cdev; in qed_probe()
279 qed_free_pci(cdev); in qed_probe()
281 qed_free_cdev(cdev); in qed_probe()
286 static void qed_remove(struct qed_dev *cdev) in qed_remove() argument
288 if (!cdev) in qed_remove()
291 qed_hw_remove(cdev); in qed_remove()
293 qed_free_pci(cdev); in qed_remove()
295 qed_set_power_state(cdev, PCI_D3hot); in qed_remove()
297 qed_free_cdev(cdev); in qed_remove()
300 static void qed_disable_msix(struct qed_dev *cdev) in qed_disable_msix() argument
302 if (cdev->int_params.out.int_mode == QED_INT_MODE_MSIX) { in qed_disable_msix()
303 pci_disable_msix(cdev->pdev); in qed_disable_msix()
304 kfree(cdev->int_params.msix_table); in qed_disable_msix()
305 } else if (cdev->int_params.out.int_mode == QED_INT_MODE_MSI) { in qed_disable_msix()
306 pci_disable_msi(cdev->pdev); in qed_disable_msix()
309 memset(&cdev->int_params.out, 0, sizeof(struct qed_int_param)); in qed_disable_msix()
312 static int qed_enable_msix(struct qed_dev *cdev, in qed_enable_msix() argument
322 rc = pci_enable_msix_range(cdev->pdev, int_params->msix_table, in qed_enable_msix()
325 (rc % cdev->num_hwfns)) { in qed_enable_msix()
326 pci_disable_msix(cdev->pdev); in qed_enable_msix()
332 cnt = (rc / cdev->num_hwfns) * cdev->num_hwfns; in qed_enable_msix()
333 DP_NOTICE(cdev, in qed_enable_msix()
336 rc = pci_enable_msix_exact(cdev->pdev, in qed_enable_msix()
348 DP_NOTICE(cdev, in qed_enable_msix()
357 static int qed_set_int_mode(struct qed_dev *cdev, bool force_mode) in qed_set_int_mode() argument
359 struct qed_int_params *int_params = &cdev->int_params; in qed_set_int_mode()
374 rc = qed_enable_msix(cdev, int_params); in qed_set_int_mode()
378 DP_NOTICE(cdev, "Failed to enable MSI-X\n"); in qed_set_int_mode()
385 rc = pci_enable_msi(cdev->pdev); in qed_set_int_mode()
391 DP_NOTICE(cdev, "Failed to enable MSI\n"); in qed_set_int_mode()
401 DP_NOTICE(cdev, "Unknown int_mode value %d\n", in qed_set_int_mode()
407 cdev->int_coalescing_mode = QED_COAL_MODE_ENABLE; in qed_set_int_mode()
412 static void qed_simd_handler_config(struct qed_dev *cdev, void *token, in qed_simd_handler_config() argument
415 struct qed_hwfn *hwfn = &cdev->hwfns[index % cdev->num_hwfns]; in qed_simd_handler_config()
416 int relative_idx = index / cdev->num_hwfns; in qed_simd_handler_config()
422 static void qed_simd_handler_clean(struct qed_dev *cdev, int index) in qed_simd_handler_clean() argument
424 struct qed_hwfn *hwfn = &cdev->hwfns[index % cdev->num_hwfns]; in qed_simd_handler_clean()
425 int relative_idx = index / cdev->num_hwfns; in qed_simd_handler_clean()
439 struct qed_dev *cdev = (struct qed_dev *)dev_instance; in qed_single_int() local
445 for (i = 0; i < cdev->num_hwfns; i++) { in qed_single_int()
446 status = qed_int_igu_read_sisr_reg(&cdev->hwfns[i]); in qed_single_int()
451 hwfn = &cdev->hwfns[i]; in qed_single_int()
481 struct qed_dev *cdev = hwfn->cdev; in qed_slowpath_irq_req() local
485 if (cdev->int_params.out.int_mode == QED_INT_MODE_MSIX) { in qed_slowpath_irq_req()
488 id, cdev->pdev->bus->number, in qed_slowpath_irq_req()
489 PCI_SLOT(cdev->pdev->devfn), hwfn->abs_pf_id); in qed_slowpath_irq_req()
490 rc = request_irq(cdev->int_params.msix_table[id].vector, in qed_slowpath_irq_req()
498 snprintf(cdev->name, NAME_SIZE, "%02x:%02x.%02x", in qed_slowpath_irq_req()
499 cdev->pdev->bus->number, PCI_SLOT(cdev->pdev->devfn), in qed_slowpath_irq_req()
500 PCI_FUNC(cdev->pdev->devfn)); in qed_slowpath_irq_req()
502 if (cdev->int_params.out.int_mode == QED_INT_MODE_INTA) in qed_slowpath_irq_req()
505 rc = request_irq(cdev->pdev->irq, qed_single_int, in qed_slowpath_irq_req()
506 flags, cdev->name, cdev); in qed_slowpath_irq_req()
512 static void qed_slowpath_irq_free(struct qed_dev *cdev) in qed_slowpath_irq_free() argument
516 if (cdev->int_params.out.int_mode == QED_INT_MODE_MSIX) { in qed_slowpath_irq_free()
517 for_each_hwfn(cdev, i) { in qed_slowpath_irq_free()
518 if (!cdev->hwfns[i].b_int_requested) in qed_slowpath_irq_free()
520 synchronize_irq(cdev->int_params.msix_table[i].vector); in qed_slowpath_irq_free()
521 free_irq(cdev->int_params.msix_table[i].vector, in qed_slowpath_irq_free()
522 cdev->hwfns[i].sp_dpc); in qed_slowpath_irq_free()
525 if (QED_LEADING_HWFN(cdev)->b_int_requested) in qed_slowpath_irq_free()
526 free_irq(cdev->pdev->irq, cdev); in qed_slowpath_irq_free()
528 qed_int_disable_post_isr_release(cdev); in qed_slowpath_irq_free()
531 static int qed_nic_stop(struct qed_dev *cdev) in qed_nic_stop() argument
535 rc = qed_hw_stop(cdev); in qed_nic_stop()
537 for (i = 0; i < cdev->num_hwfns; i++) { in qed_nic_stop()
538 struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; in qed_nic_stop()
543 DP_VERBOSE(cdev, NETIF_MSG_IFDOWN, in qed_nic_stop()
552 static int qed_nic_reset(struct qed_dev *cdev) in qed_nic_reset() argument
556 rc = qed_hw_reset(cdev); in qed_nic_reset()
560 qed_resc_free(cdev); in qed_nic_reset()
565 static int qed_nic_setup(struct qed_dev *cdev) in qed_nic_setup() argument
569 rc = qed_resc_alloc(cdev); in qed_nic_setup()
573 DP_INFO(cdev, "Allocated qed resources\n"); in qed_nic_setup()
575 qed_resc_setup(cdev); in qed_nic_setup()
580 static int qed_set_int_fp(struct qed_dev *cdev, u16 cnt) in qed_set_int_fp() argument
585 cdev->int_params.fp_initialized = cnt ? true : false; in qed_set_int_fp()
587 if (cdev->int_params.out.int_mode != QED_INT_MODE_MSIX) in qed_set_int_fp()
588 limit = cdev->num_hwfns * 63; in qed_set_int_fp()
589 else if (cdev->int_params.fp_msix_cnt) in qed_set_int_fp()
590 limit = cdev->int_params.fp_msix_cnt; in qed_set_int_fp()
598 static int qed_get_int_fp(struct qed_dev *cdev, struct qed_int_info *info) in qed_get_int_fp() argument
602 if (!cdev->int_params.fp_initialized) { in qed_get_int_fp()
603 DP_INFO(cdev, in qed_get_int_fp()
611 if (cdev->int_params.out.int_mode == QED_INT_MODE_MSIX) { in qed_get_int_fp()
612 int msix_base = cdev->int_params.fp_msix_base; in qed_get_int_fp()
614 info->msix_cnt = cdev->int_params.fp_msix_cnt; in qed_get_int_fp()
615 info->msix = &cdev->int_params.msix_table[msix_base]; in qed_get_int_fp()
621 static int qed_slowpath_setup_int(struct qed_dev *cdev, in qed_slowpath_setup_int() argument
627 memset(&cdev->int_params, 0, sizeof(struct qed_int_params)); in qed_slowpath_setup_int()
629 cdev->int_params.in.int_mode = int_mode; in qed_slowpath_setup_int()
630 for_each_hwfn(cdev, i) in qed_slowpath_setup_int()
631 num_vectors += qed_int_get_num_sbs(&cdev->hwfns[i], NULL) + 1; in qed_slowpath_setup_int()
632 cdev->int_params.in.num_vectors = num_vectors; in qed_slowpath_setup_int()
635 cdev->int_params.in.min_msix_cnt = cdev->num_hwfns * 2; in qed_slowpath_setup_int()
637 rc = qed_set_int_mode(cdev, false); in qed_slowpath_setup_int()
639 DP_ERR(cdev, "qed_slowpath_setup_int ERR\n"); in qed_slowpath_setup_int()
643 cdev->int_params.fp_msix_base = cdev->num_hwfns; in qed_slowpath_setup_int()
644 cdev->int_params.fp_msix_cnt = cdev->int_params.out.num_vectors - in qed_slowpath_setup_int()
645 cdev->num_hwfns; in qed_slowpath_setup_int()
680 static int qed_alloc_stream_mem(struct qed_dev *cdev) in qed_alloc_stream_mem() argument
685 for_each_hwfn(cdev, i) { in qed_alloc_stream_mem()
686 struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; in qed_alloc_stream_mem()
701 static void qed_free_stream_mem(struct qed_dev *cdev) in qed_free_stream_mem() argument
705 for_each_hwfn(cdev, i) { in qed_free_stream_mem()
706 struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; in qed_free_stream_mem()
716 static void qed_update_pf_params(struct qed_dev *cdev, in qed_update_pf_params() argument
721 for (i = 0; i < cdev->num_hwfns; i++) { in qed_update_pf_params()
722 struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; in qed_update_pf_params()
728 static int qed_slowpath_start(struct qed_dev *cdev, in qed_slowpath_start() argument
736 rc = request_firmware(&cdev->firmware, QED_FW_FILE_NAME, in qed_slowpath_start()
737 &cdev->pdev->dev); in qed_slowpath_start()
739 DP_NOTICE(cdev, in qed_slowpath_start()
745 rc = qed_nic_setup(cdev); in qed_slowpath_start()
749 rc = qed_slowpath_setup_int(cdev, params->int_mode); in qed_slowpath_start()
754 rc = qed_alloc_stream_mem(cdev); in qed_slowpath_start()
756 DP_NOTICE(cdev, "Failed to allocate stream memory\n"); in qed_slowpath_start()
761 data = cdev->firmware->data; in qed_slowpath_start()
763 rc = qed_hw_init(cdev, true, cdev->int_params.out.int_mode, in qed_slowpath_start()
768 DP_INFO(cdev, in qed_slowpath_start()
771 hwfn = QED_LEADING_HWFN(cdev); in qed_slowpath_start()
781 DP_NOTICE(cdev, "Failed sending drv version command\n"); in qed_slowpath_start()
788 qed_free_stream_mem(cdev); in qed_slowpath_start()
789 qed_slowpath_irq_free(cdev); in qed_slowpath_start()
791 qed_disable_msix(cdev); in qed_slowpath_start()
793 qed_resc_free(cdev); in qed_slowpath_start()
795 release_firmware(cdev->firmware); in qed_slowpath_start()
800 static int qed_slowpath_stop(struct qed_dev *cdev) in qed_slowpath_stop() argument
802 if (!cdev) in qed_slowpath_stop()
805 qed_free_stream_mem(cdev); in qed_slowpath_stop()
807 qed_nic_stop(cdev); in qed_slowpath_stop()
808 qed_slowpath_irq_free(cdev); in qed_slowpath_stop()
810 qed_disable_msix(cdev); in qed_slowpath_stop()
811 qed_nic_reset(cdev); in qed_slowpath_stop()
813 release_firmware(cdev->firmware); in qed_slowpath_stop()
818 static void qed_set_id(struct qed_dev *cdev, char name[NAME_SIZE], in qed_set_id() argument
823 memcpy(cdev->name, name, NAME_SIZE); in qed_set_id()
824 for_each_hwfn(cdev, i) in qed_set_id()
825 snprintf(cdev->hwfns[i].name, NAME_SIZE, "%s-%d", name, i); in qed_set_id()
827 memcpy(cdev->ver_str, ver_str, VER_SIZE); in qed_set_id()
828 cdev->drv_type = DRV_ID_DRV_TYPE_LINUX; in qed_set_id()
831 static u32 qed_sb_init(struct qed_dev *cdev, in qed_sb_init() argument
847 n_hwfns = cdev->num_hwfns; in qed_sb_init()
852 p_hwfn = &cdev->hwfns[hwfn_index]; in qed_sb_init()
855 DP_VERBOSE(cdev, NETIF_MSG_INTR, in qed_sb_init()
865 static u32 qed_sb_release(struct qed_dev *cdev, in qed_sb_release() argument
874 hwfn_index = sb_id % cdev->num_hwfns; in qed_sb_release()
875 p_hwfn = &cdev->hwfns[hwfn_index]; in qed_sb_release()
876 rel_sb_id = sb_id / cdev->num_hwfns; in qed_sb_release()
878 DP_VERBOSE(cdev, NETIF_MSG_INTR, in qed_sb_release()
887 static int qed_set_link(struct qed_dev *cdev, in qed_set_link() argument
895 if (!cdev) in qed_set_link()
899 hwfn = &cdev->hwfns[0]; in qed_set_link()
1036 qed_mcp_get_media_type(hwfn->cdev, &media_type); in qed_fill_link()
1078 static void qed_get_current_link(struct qed_dev *cdev, in qed_get_current_link() argument
1081 qed_fill_link(&cdev->hwfns[0], if_link); in qed_get_current_link()
1086 void *cookie = hwfn->cdev->ops_cookie; in qed_link_update()
1087 struct qed_common_cb_ops *op = hwfn->cdev->protocol_ops.common; in qed_link_update()
1096 static int qed_drain(struct qed_dev *cdev) in qed_drain() argument
1102 for_each_hwfn(cdev, i) { in qed_drain()
1103 hwfn = &cdev->hwfns[i]; in qed_drain()