Lines Matching refs:oct

48 static int octep_alloc_ioq_vectors(struct octep_device *oct)  in octep_alloc_ioq_vectors()  argument
53 for (i = 0; i < oct->num_oqs; i++) { in octep_alloc_ioq_vectors()
54 oct->ioq_vector[i] = vzalloc(sizeof(*oct->ioq_vector[i])); in octep_alloc_ioq_vectors()
55 if (!oct->ioq_vector[i]) in octep_alloc_ioq_vectors()
58 ioq_vector = oct->ioq_vector[i]; in octep_alloc_ioq_vectors()
59 ioq_vector->iq = oct->iq[i]; in octep_alloc_ioq_vectors()
60 ioq_vector->oq = oct->oq[i]; in octep_alloc_ioq_vectors()
61 ioq_vector->octep_dev = oct; in octep_alloc_ioq_vectors()
64 dev_info(&oct->pdev->dev, "Allocated %d IOQ vectors\n", oct->num_oqs); in octep_alloc_ioq_vectors()
70 vfree(oct->ioq_vector[i]); in octep_alloc_ioq_vectors()
71 oct->ioq_vector[i] = NULL; in octep_alloc_ioq_vectors()
81 static void octep_free_ioq_vectors(struct octep_device *oct) in octep_free_ioq_vectors() argument
85 for (i = 0; i < oct->num_oqs; i++) { in octep_free_ioq_vectors()
86 if (oct->ioq_vector[i]) { in octep_free_ioq_vectors()
87 vfree(oct->ioq_vector[i]); in octep_free_ioq_vectors()
88 oct->ioq_vector[i] = NULL; in octep_free_ioq_vectors()
91 netdev_info(oct->netdev, "Freed IOQ Vectors\n"); in octep_free_ioq_vectors()
105 static int octep_enable_msix_range(struct octep_device *oct) in octep_enable_msix_range() argument
111 num_msix = oct->num_oqs + CFG_GET_NON_IOQ_MSIX(oct->conf); in octep_enable_msix_range()
112 oct->msix_entries = kcalloc(num_msix, in octep_enable_msix_range()
114 if (!oct->msix_entries) in octep_enable_msix_range()
118 oct->msix_entries[i].entry = i; in octep_enable_msix_range()
120 msix_allocated = pci_enable_msix_range(oct->pdev, oct->msix_entries, in octep_enable_msix_range()
123 dev_err(&oct->pdev->dev, in octep_enable_msix_range()
128 oct->num_irqs = msix_allocated; in octep_enable_msix_range()
129 dev_info(&oct->pdev->dev, "MSI-X enabled successfully\n"); in octep_enable_msix_range()
135 pci_disable_msix(oct->pdev); in octep_enable_msix_range()
136 kfree(oct->msix_entries); in octep_enable_msix_range()
137 oct->msix_entries = NULL; in octep_enable_msix_range()
149 static void octep_disable_msix(struct octep_device *oct) in octep_disable_msix() argument
151 pci_disable_msix(oct->pdev); in octep_disable_msix()
152 kfree(oct->msix_entries); in octep_disable_msix()
153 oct->msix_entries = NULL; in octep_disable_msix()
154 dev_info(&oct->pdev->dev, "Disabled MSI-X\n"); in octep_disable_msix()
167 struct octep_device *oct = data; in octep_non_ioq_intr_handler() local
169 return oct->hw_ops.non_ioq_intr_handler(oct); in octep_non_ioq_intr_handler()
184 struct octep_device *oct = ioq_vector->octep_dev; in octep_ioq_intr_handler() local
186 return oct->hw_ops.ioq_intr_handler(ioq_vector); in octep_ioq_intr_handler()
199 static int octep_request_irqs(struct octep_device *oct) in octep_request_irqs() argument
201 struct net_device *netdev = oct->netdev; in octep_request_irqs()
208 num_non_ioq_msix = CFG_GET_NON_IOQ_MSIX(oct->conf); in octep_request_irqs()
209 non_ioq_msix_names = CFG_GET_NON_IOQ_MSIX_NAMES(oct->conf); in octep_request_irqs()
211 oct->non_ioq_irq_names = kcalloc(num_non_ioq_msix, in octep_request_irqs()
213 if (!oct->non_ioq_irq_names) in octep_request_irqs()
220 irq_name = &oct->non_ioq_irq_names[i * OCTEP_MSIX_NAME_SIZE]; in octep_request_irqs()
221 msix_entry = &oct->msix_entries[i]; in octep_request_irqs()
227 irq_name, oct); in octep_request_irqs()
237 for (j = 0; j < oct->num_oqs; j++) { in octep_request_irqs()
238 ioq_vector = oct->ioq_vector[j]; in octep_request_irqs()
239 msix_entry = &oct->msix_entries[j + num_non_ioq_msix]; in octep_request_irqs()
263 ioq_vector = oct->ioq_vector[j]; in octep_request_irqs()
264 msix_entry = &oct->msix_entries[j + num_non_ioq_msix]; in octep_request_irqs()
272 free_irq(oct->msix_entries[i].vector, oct); in octep_request_irqs()
274 kfree(oct->non_ioq_irq_names); in octep_request_irqs()
275 oct->non_ioq_irq_names = NULL; in octep_request_irqs()
287 static void octep_free_irqs(struct octep_device *oct) in octep_free_irqs() argument
292 for (i = 0; i < CFG_GET_NON_IOQ_MSIX(oct->conf); i++) in octep_free_irqs()
293 free_irq(oct->msix_entries[i].vector, oct); in octep_free_irqs()
294 kfree(oct->non_ioq_irq_names); in octep_free_irqs()
297 for (i = CFG_GET_NON_IOQ_MSIX(oct->conf); i < oct->num_irqs; i++) { in octep_free_irqs()
298 irq_set_affinity_hint(oct->msix_entries[i].vector, NULL); in octep_free_irqs()
299 free_irq(oct->msix_entries[i].vector, in octep_free_irqs()
300 oct->ioq_vector[i - CFG_GET_NON_IOQ_MSIX(oct->conf)]); in octep_free_irqs()
302 netdev_info(oct->netdev, "IRQs freed\n"); in octep_free_irqs()
316 static int octep_setup_irqs(struct octep_device *oct) in octep_setup_irqs() argument
318 if (octep_alloc_ioq_vectors(oct)) in octep_setup_irqs()
321 if (octep_enable_msix_range(oct)) in octep_setup_irqs()
324 if (octep_request_irqs(oct)) in octep_setup_irqs()
330 octep_disable_msix(oct); in octep_setup_irqs()
332 octep_free_ioq_vectors(oct); in octep_setup_irqs()
342 static void octep_clean_irqs(struct octep_device *oct) in octep_clean_irqs() argument
344 octep_free_irqs(oct); in octep_clean_irqs()
345 octep_disable_msix(oct); in octep_clean_irqs()
346 octep_free_ioq_vectors(oct); in octep_clean_irqs()
407 static void octep_napi_add(struct octep_device *oct) in octep_napi_add() argument
411 for (i = 0; i < oct->num_oqs; i++) { in octep_napi_add()
412 netdev_dbg(oct->netdev, "Adding NAPI on Q-%d\n", i); in octep_napi_add()
413 netif_napi_add(oct->netdev, &oct->ioq_vector[i]->napi, in octep_napi_add()
415 oct->oq[i]->napi = &oct->ioq_vector[i]->napi; in octep_napi_add()
424 static void octep_napi_delete(struct octep_device *oct) in octep_napi_delete() argument
428 for (i = 0; i < oct->num_oqs; i++) { in octep_napi_delete()
429 netdev_dbg(oct->netdev, "Deleting NAPI on Q-%d\n", i); in octep_napi_delete()
430 netif_napi_del(&oct->ioq_vector[i]->napi); in octep_napi_delete()
431 oct->oq[i]->napi = NULL; in octep_napi_delete()
440 static void octep_napi_enable(struct octep_device *oct) in octep_napi_enable() argument
444 for (i = 0; i < oct->num_oqs; i++) { in octep_napi_enable()
445 netdev_dbg(oct->netdev, "Enabling NAPI on Q-%d\n", i); in octep_napi_enable()
446 napi_enable(&oct->ioq_vector[i]->napi); in octep_napi_enable()
455 static void octep_napi_disable(struct octep_device *oct) in octep_napi_disable() argument
459 for (i = 0; i < oct->num_oqs; i++) { in octep_napi_disable()
460 netdev_dbg(oct->netdev, "Disabling NAPI on Q-%d\n", i); in octep_napi_disable()
461 napi_disable(&oct->ioq_vector[i]->napi); in octep_napi_disable()
484 struct octep_device *oct = netdev_priv(netdev); in octep_open() local
490 oct->hw_ops.reset_io_queues(oct); in octep_open()
492 if (octep_setup_iqs(oct)) in octep_open()
494 if (octep_setup_oqs(oct)) in octep_open()
496 if (octep_setup_irqs(oct)) in octep_open()
499 err = netif_set_real_num_tx_queues(netdev, oct->num_oqs); in octep_open()
502 err = netif_set_real_num_rx_queues(netdev, oct->num_iqs); in octep_open()
506 octep_napi_add(oct); in octep_open()
507 octep_napi_enable(oct); in octep_open()
509 oct->link_info.admin_up = 1; in octep_open()
510 octep_set_rx_state(oct, true); in octep_open()
512 ret = octep_get_link_status(oct); in octep_open()
514 octep_set_link_status(oct, true); in octep_open()
517 oct->hw_ops.enable_io_queues(oct); in octep_open()
520 oct->hw_ops.enable_interrupts(oct); in octep_open()
522 octep_oq_dbell_init(oct); in octep_open()
524 ret = octep_get_link_status(oct); in octep_open()
531 octep_clean_irqs(oct); in octep_open()
533 octep_free_oqs(oct); in octep_open()
535 octep_free_iqs(oct); in octep_open()
550 struct octep_device *oct = netdev_priv(netdev); in octep_stop() local
559 octep_set_link_status(oct, false); in octep_stop()
560 octep_set_rx_state(oct, false); in octep_stop()
562 oct->link_info.admin_up = 0; in octep_stop()
563 oct->link_info.oper_up = 0; in octep_stop()
565 oct->hw_ops.disable_interrupts(oct); in octep_stop()
566 octep_napi_disable(oct); in octep_stop()
567 octep_napi_delete(oct); in octep_stop()
569 octep_clean_irqs(oct); in octep_stop()
570 octep_clean_iqs(oct); in octep_stop()
572 oct->hw_ops.disable_io_queues(oct); in octep_stop()
573 oct->hw_ops.reset_io_queues(oct); in octep_stop()
574 octep_free_oqs(oct); in octep_stop()
575 octep_free_iqs(oct); in octep_stop()
622 struct octep_device *oct = netdev_priv(netdev); in octep_start_xmit() local
634 if (q_no >= oct->num_iqs) { in octep_start_xmit()
636 q_no = q_no % oct->num_iqs; in octep_start_xmit()
639 iq = oct->iq[q_no]; in octep_start_xmit()
657 ih->pkind = oct->pkind; in octep_start_xmit()
755 struct octep_device *oct = netdev_priv(netdev); in octep_get_stats64() local
758 octep_get_if_stats(oct); in octep_get_stats64()
763 for (q = 0; q < oct->num_oqs; q++) { in octep_get_stats64()
764 struct octep_iq *iq = oct->iq[q]; in octep_get_stats64()
765 struct octep_oq *oq = oct->oq[q]; in octep_get_stats64()
776 stats->multicast = oct->iface_rx_stats.mcast_pkts; in octep_get_stats64()
777 stats->rx_errors = oct->iface_rx_stats.err_pkts; in octep_get_stats64()
778 stats->collisions = oct->iface_tx_stats.xscol; in octep_get_stats64()
779 stats->tx_fifo_errors = oct->iface_tx_stats.undflw; in octep_get_stats64()
793 struct octep_device *oct = container_of(work, struct octep_device, in octep_tx_timeout_task() local
795 struct net_device *netdev = oct->netdev; in octep_tx_timeout_task()
815 struct octep_device *oct = netdev_priv(netdev); in octep_tx_timeout() local
817 queue_work(octep_wq, &oct->tx_timeout_task); in octep_tx_timeout()
822 struct octep_device *oct = netdev_priv(netdev); in octep_set_mac() local
829 err = octep_set_mac_addr(oct, addr->sa_data); in octep_set_mac()
833 memcpy(oct->mac_addr, addr->sa_data, ETH_ALEN); in octep_set_mac()
841 struct octep_device *oct = netdev_priv(netdev); in octep_change_mtu() local
845 link_info = &oct->link_info; in octep_change_mtu()
849 err = octep_set_mtu(oct, new_mtu); in octep_change_mtu()
851 oct->link_info.mtu = new_mtu; in octep_change_mtu()
877 struct octep_device *oct = container_of(work, struct octep_device, in octep_ctrl_mbox_task() local
879 struct net_device *netdev = oct->netdev; in octep_ctrl_mbox_task()
886 ret = octep_ctrl_mbox_recv(&oct->ctrl_mbox, &msg); in octep_ctrl_mbox_task()
894 dev_info(&oct->pdev->dev, "netif_carrier_on\n"); in octep_ctrl_mbox_task()
897 dev_info(&oct->pdev->dev, "netif_carrier_off\n"); in octep_ctrl_mbox_task()
909 static const char *octep_devid_to_str(struct octep_device *oct) in octep_devid_to_str() argument
911 switch (oct->chip_id) { in octep_devid_to_str()
928 int octep_device_setup(struct octep_device *oct) in octep_device_setup() argument
931 struct pci_dev *pdev = oct->pdev; in octep_device_setup()
935 oct->conf = kzalloc(sizeof(*oct->conf), GFP_KERNEL); in octep_device_setup()
936 if (!oct->conf) in octep_device_setup()
941 oct->mmio[i].hw_addr = in octep_device_setup()
942 ioremap(pci_resource_start(oct->pdev, i * 2), in octep_device_setup()
943 pci_resource_len(oct->pdev, i * 2)); in octep_device_setup()
944 oct->mmio[i].mapped = 1; in octep_device_setup()
947 oct->chip_id = pdev->device; in octep_device_setup()
948 oct->rev_id = pdev->revision; in octep_device_setup()
951 switch (oct->chip_id) { in octep_device_setup()
955 octep_devid_to_str(oct), OCTEP_MAJOR_REV(oct), in octep_device_setup()
956 OCTEP_MINOR_REV(oct)); in octep_device_setup()
957 octep_device_setup_cn93_pf(oct); in octep_device_setup()
965 oct->pkind = CFG_GET_IQ_PKIND(oct->conf); in octep_device_setup()
968 ctrl_mbox = &oct->ctrl_mbox; in octep_device_setup()
969 ctrl_mbox->barmem = CFG_GET_CTRL_MBOX_MEM_ADDR(oct->conf); in octep_device_setup()
975 oct->ctrl_mbox_ifstats_offset = OCTEP_CTRL_MBOX_SZ(ctrl_mbox->h2fq.elem_sz, in octep_device_setup()
984 iounmap(oct->mmio[i].hw_addr); in octep_device_setup()
986 kfree(oct->conf); in octep_device_setup()
997 static void octep_device_cleanup(struct octep_device *oct) in octep_device_cleanup() argument
1001 dev_info(&oct->pdev->dev, "Cleaning up Octeon Device ...\n"); in octep_device_cleanup()
1004 vfree(oct->mbox[i]); in octep_device_cleanup()
1005 oct->mbox[i] = NULL; in octep_device_cleanup()
1008 octep_ctrl_mbox_uninit(&oct->ctrl_mbox); in octep_device_cleanup()
1010 oct->hw_ops.soft_reset(oct); in octep_device_cleanup()
1012 if (oct->mmio[i].mapped) in octep_device_cleanup()
1013 iounmap(oct->mmio[i].hw_addr); in octep_device_cleanup()
1016 kfree(oct->conf); in octep_device_cleanup()
1017 oct->conf = NULL; in octep_device_cleanup()
1127 struct octep_device *oct = pci_get_drvdata(pdev); in octep_remove() local
1130 if (!oct) in octep_remove()
1133 cancel_work_sync(&oct->tx_timeout_task); in octep_remove()
1134 cancel_work_sync(&oct->ctrl_mbox_task); in octep_remove()
1135 netdev = oct->netdev; in octep_remove()
1139 octep_device_cleanup(oct); in octep_remove()