Lines Matching full:oct

44  * @oct: Octeon device private data structure.
54 static int octep_alloc_ioq_vectors(struct octep_device *oct) in octep_alloc_ioq_vectors() argument
59 for (i = 0; i < oct->num_oqs; i++) { in octep_alloc_ioq_vectors()
60 oct->ioq_vector[i] = vzalloc(sizeof(*oct->ioq_vector[i])); in octep_alloc_ioq_vectors()
61 if (!oct->ioq_vector[i]) in octep_alloc_ioq_vectors()
64 ioq_vector = oct->ioq_vector[i]; in octep_alloc_ioq_vectors()
65 ioq_vector->iq = oct->iq[i]; in octep_alloc_ioq_vectors()
66 ioq_vector->oq = oct->oq[i]; in octep_alloc_ioq_vectors()
67 ioq_vector->octep_dev = oct; in octep_alloc_ioq_vectors()
70 dev_info(&oct->pdev->dev, "Allocated %d IOQ vectors\n", oct->num_oqs); in octep_alloc_ioq_vectors()
76 vfree(oct->ioq_vector[i]); in octep_alloc_ioq_vectors()
77 oct->ioq_vector[i] = NULL; in octep_alloc_ioq_vectors()
85 * @oct: Octeon device private data structure.
87 static void octep_free_ioq_vectors(struct octep_device *oct) in octep_free_ioq_vectors() argument
91 for (i = 0; i < oct->num_oqs; i++) { in octep_free_ioq_vectors()
92 if (oct->ioq_vector[i]) { in octep_free_ioq_vectors()
93 vfree(oct->ioq_vector[i]); in octep_free_ioq_vectors()
94 oct->ioq_vector[i] = NULL; in octep_free_ioq_vectors()
97 netdev_info(oct->netdev, "Freed IOQ Vectors\n"); in octep_free_ioq_vectors()
103 * @oct: Octeon device private data structure.
111 static int octep_enable_msix_range(struct octep_device *oct) in octep_enable_msix_range() argument
117 num_msix = oct->num_oqs + CFG_GET_NON_IOQ_MSIX(oct->conf); in octep_enable_msix_range()
118 oct->msix_entries = kcalloc(num_msix, in octep_enable_msix_range()
120 if (!oct->msix_entries) in octep_enable_msix_range()
124 oct->msix_entries[i].entry = i; in octep_enable_msix_range()
126 msix_allocated = pci_enable_msix_range(oct->pdev, oct->msix_entries, in octep_enable_msix_range()
129 dev_err(&oct->pdev->dev, in octep_enable_msix_range()
134 oct->num_irqs = msix_allocated; in octep_enable_msix_range()
135 dev_info(&oct->pdev->dev, "MSI-X enabled successfully\n"); in octep_enable_msix_range()
141 pci_disable_msix(oct->pdev); in octep_enable_msix_range()
142 kfree(oct->msix_entries); in octep_enable_msix_range()
143 oct->msix_entries = NULL; in octep_enable_msix_range()
151 * @oct: Octeon device private data structure.
155 static void octep_disable_msix(struct octep_device *oct) in octep_disable_msix() argument
157 pci_disable_msix(oct->pdev); in octep_disable_msix()
158 kfree(oct->msix_entries); in octep_disable_msix()
159 oct->msix_entries = NULL; in octep_disable_msix()
160 dev_info(&oct->pdev->dev, "Disabled MSI-X\n"); in octep_disable_msix()
173 struct octep_device *oct = data; in octep_mbox_intr_handler() local
175 return oct->hw_ops.mbox_intr_handler(oct); in octep_mbox_intr_handler()
188 struct octep_device *oct = data; in octep_oei_intr_handler() local
190 return oct->hw_ops.oei_intr_handler(oct); in octep_oei_intr_handler()
203 struct octep_device *oct = data; in octep_ire_intr_handler() local
205 return oct->hw_ops.ire_intr_handler(oct); in octep_ire_intr_handler()
218 struct octep_device *oct = data; in octep_ore_intr_handler() local
220 return oct->hw_ops.ore_intr_handler(oct); in octep_ore_intr_handler()
233 struct octep_device *oct = data; in octep_vfire_intr_handler() local
235 return oct->hw_ops.vfire_intr_handler(oct); in octep_vfire_intr_handler()
248 struct octep_device *oct = data; in octep_vfore_intr_handler() local
250 return oct->hw_ops.vfore_intr_handler(oct); in octep_vfore_intr_handler()
263 struct octep_device *oct = data; in octep_dma_intr_handler() local
265 return oct->hw_ops.dma_intr_handler(oct); in octep_dma_intr_handler()
278 struct octep_device *oct = data; in octep_dma_vf_intr_handler() local
280 return oct->hw_ops.dma_vf_intr_handler(oct); in octep_dma_vf_intr_handler()
293 struct octep_device *oct = data; in octep_pp_vf_intr_handler() local
295 return oct->hw_ops.pp_vf_intr_handler(oct); in octep_pp_vf_intr_handler()
308 struct octep_device *oct = data; in octep_misc_intr_handler() local
310 return oct->hw_ops.misc_intr_handler(oct); in octep_misc_intr_handler()
323 struct octep_device *oct = data; in octep_rsvd_intr_handler() local
325 return oct->hw_ops.rsvd_intr_handler(oct); in octep_rsvd_intr_handler()
340 struct octep_device *oct = ioq_vector->octep_dev; in octep_ioq_intr_handler() local
342 return oct->hw_ops.ioq_intr_handler(ioq_vector); in octep_ioq_intr_handler()
348 * @oct: Octeon device private data structure.
355 static int octep_request_irqs(struct octep_device *oct) in octep_request_irqs() argument
357 struct net_device *netdev = oct->netdev; in octep_request_irqs()
364 num_non_ioq_msix = CFG_GET_NON_IOQ_MSIX(oct->conf); in octep_request_irqs()
365 non_ioq_msix_names = CFG_GET_NON_IOQ_MSIX_NAMES(oct->conf); in octep_request_irqs()
367 oct->non_ioq_irq_names = kcalloc(num_non_ioq_msix, in octep_request_irqs()
369 if (!oct->non_ioq_irq_names) in octep_request_irqs()
376 irq_name = &oct->non_ioq_irq_names[i * OCTEP_MSIX_NAME_SIZE]; in octep_request_irqs()
377 msix_entry = &oct->msix_entries[i]; in octep_request_irqs()
384 irq_name, oct); in octep_request_irqs()
389 irq_name, oct); in octep_request_irqs()
394 irq_name, oct); in octep_request_irqs()
399 irq_name, oct); in octep_request_irqs()
404 irq_name, oct); in octep_request_irqs()
409 irq_name, oct); in octep_request_irqs()
414 irq_name, oct); in octep_request_irqs()
419 irq_name, oct); in octep_request_irqs()
424 irq_name, oct); in octep_request_irqs()
429 irq_name, oct); in octep_request_irqs()
433 irq_name, oct); in octep_request_irqs()
445 for (j = 0; j < oct->num_oqs; j++) { in octep_request_irqs()
446 ioq_vector = oct->ioq_vector[j]; in octep_request_irqs()
447 msix_entry = &oct->msix_entries[j + num_non_ioq_msix]; in octep_request_irqs()
471 ioq_vector = oct->ioq_vector[j]; in octep_request_irqs()
472 msix_entry = &oct->msix_entries[j + num_non_ioq_msix]; in octep_request_irqs()
480 free_irq(oct->msix_entries[i].vector, oct); in octep_request_irqs()
482 kfree(oct->non_ioq_irq_names); in octep_request_irqs()
483 oct->non_ioq_irq_names = NULL; in octep_request_irqs()
491 * @oct: Octeon device private data structure.
495 static void octep_free_irqs(struct octep_device *oct) in octep_free_irqs() argument
500 for (i = 0; i < CFG_GET_NON_IOQ_MSIX(oct->conf); i++) in octep_free_irqs()
501 free_irq(oct->msix_entries[i].vector, oct); in octep_free_irqs()
502 kfree(oct->non_ioq_irq_names); in octep_free_irqs()
505 for (i = CFG_GET_NON_IOQ_MSIX(oct->conf); i < oct->num_irqs; i++) { in octep_free_irqs()
506 irq_set_affinity_hint(oct->msix_entries[i].vector, NULL); in octep_free_irqs()
507 free_irq(oct->msix_entries[i].vector, in octep_free_irqs()
508 oct->ioq_vector[i - CFG_GET_NON_IOQ_MSIX(oct->conf)]); in octep_free_irqs()
510 netdev_info(oct->netdev, "IRQs freed\n"); in octep_free_irqs()
516 * @oct: Octeon device private data structure.
524 static int octep_setup_irqs(struct octep_device *oct) in octep_setup_irqs() argument
526 if (octep_alloc_ioq_vectors(oct)) in octep_setup_irqs()
529 if (octep_enable_msix_range(oct)) in octep_setup_irqs()
532 if (octep_request_irqs(oct)) in octep_setup_irqs()
538 octep_disable_msix(oct); in octep_setup_irqs()
540 octep_free_ioq_vectors(oct); in octep_setup_irqs()
548 * @oct: Octeon device private data structure.
550 static void octep_clean_irqs(struct octep_device *oct) in octep_clean_irqs() argument
552 octep_free_irqs(oct); in octep_clean_irqs()
553 octep_disable_msix(oct); in octep_clean_irqs()
554 octep_free_ioq_vectors(oct); in octep_clean_irqs()
613 * @oct: Octeon device private data structure.
615 static void octep_napi_add(struct octep_device *oct) in octep_napi_add() argument
619 for (i = 0; i < oct->num_oqs; i++) { in octep_napi_add()
620 netdev_dbg(oct->netdev, "Adding NAPI on Q-%d\n", i); in octep_napi_add()
621 netif_napi_add(oct->netdev, &oct->ioq_vector[i]->napi, in octep_napi_add()
623 oct->oq[i]->napi = &oct->ioq_vector[i]->napi; in octep_napi_add()
630 * @oct: Octeon device private data structure.
632 static void octep_napi_delete(struct octep_device *oct) in octep_napi_delete() argument
636 for (i = 0; i < oct->num_oqs; i++) { in octep_napi_delete()
637 netdev_dbg(oct->netdev, "Deleting NAPI on Q-%d\n", i); in octep_napi_delete()
638 netif_napi_del(&oct->ioq_vector[i]->napi); in octep_napi_delete()
639 oct->oq[i]->napi = NULL; in octep_napi_delete()
646 * @oct: Octeon device private data structure.
648 static void octep_napi_enable(struct octep_device *oct) in octep_napi_enable() argument
652 for (i = 0; i < oct->num_oqs; i++) { in octep_napi_enable()
653 netdev_dbg(oct->netdev, "Enabling NAPI on Q-%d\n", i); in octep_napi_enable()
654 napi_enable(&oct->ioq_vector[i]->napi); in octep_napi_enable()
661 * @oct: Octeon device private data structure.
663 static void octep_napi_disable(struct octep_device *oct) in octep_napi_disable() argument
667 for (i = 0; i < oct->num_oqs; i++) { in octep_napi_disable()
668 netdev_dbg(oct->netdev, "Disabling NAPI on Q-%d\n", i); in octep_napi_disable()
669 napi_disable(&oct->ioq_vector[i]->napi); in octep_napi_disable()
692 struct octep_device *oct = netdev_priv(netdev); in octep_open() local
698 oct->hw_ops.reset_io_queues(oct); in octep_open()
700 if (octep_setup_iqs(oct)) in octep_open()
702 if (octep_setup_oqs(oct)) in octep_open()
704 if (octep_setup_irqs(oct)) in octep_open()
707 err = netif_set_real_num_tx_queues(netdev, oct->num_oqs); in octep_open()
710 err = netif_set_real_num_rx_queues(netdev, oct->num_iqs); in octep_open()
714 octep_napi_add(oct); in octep_open()
715 octep_napi_enable(oct); in octep_open()
717 oct->link_info.admin_up = 1; in octep_open()
718 octep_ctrl_net_set_rx_state(oct, OCTEP_CTRL_NET_INVALID_VFID, true, in octep_open()
720 octep_ctrl_net_set_link_status(oct, OCTEP_CTRL_NET_INVALID_VFID, true, in octep_open()
722 oct->poll_non_ioq_intr = false; in octep_open()
725 oct->hw_ops.enable_io_queues(oct); in octep_open()
728 oct->hw_ops.enable_interrupts(oct); in octep_open()
730 octep_oq_dbell_init(oct); in octep_open()
732 ret = octep_ctrl_net_get_link_status(oct, OCTEP_CTRL_NET_INVALID_VFID); in octep_open()
739 octep_clean_irqs(oct); in octep_open()
741 octep_free_oqs(oct); in octep_open()
743 octep_free_iqs(oct); in octep_open()
758 struct octep_device *oct = netdev_priv(netdev); in octep_stop() local
762 octep_ctrl_net_set_link_status(oct, OCTEP_CTRL_NET_INVALID_VFID, false, in octep_stop()
764 octep_ctrl_net_set_rx_state(oct, OCTEP_CTRL_NET_INVALID_VFID, false, in octep_stop()
772 oct->link_info.admin_up = 0; in octep_stop()
773 oct->link_info.oper_up = 0; in octep_stop()
775 oct->hw_ops.disable_interrupts(oct); in octep_stop()
776 octep_napi_disable(oct); in octep_stop()
777 octep_napi_delete(oct); in octep_stop()
779 octep_clean_irqs(oct); in octep_stop()
780 octep_clean_iqs(oct); in octep_stop()
782 oct->hw_ops.disable_io_queues(oct); in octep_stop()
783 oct->hw_ops.reset_io_queues(oct); in octep_stop()
784 octep_free_oqs(oct); in octep_stop()
785 octep_free_iqs(oct); in octep_stop()
787 oct->poll_non_ioq_intr = true; in octep_stop()
788 queue_delayed_work(octep_wq, &oct->intr_poll_task, in octep_stop()
844 struct octep_device *oct = netdev_priv(netdev); in octep_start_xmit() local
861 if (q_no >= oct->num_iqs) { in octep_start_xmit()
863 q_no = q_no % oct->num_iqs; in octep_start_xmit()
866 iq = oct->iq[q_no]; in octep_start_xmit()
879 ih->pkind = oct->conf->fw_info.pkind; in octep_start_xmit()
880 ih->fsz = oct->conf->fw_info.fsz; in octep_start_xmit()
928 if (oct->conf->fw_info.tx_ol_flags) { in octep_start_xmit()
994 struct octep_device *oct = netdev_priv(netdev); in octep_get_stats64() local
1003 tx_packets += oct->stats_iq[q].instr_completed; in octep_get_stats64()
1004 tx_bytes += oct->stats_iq[q].bytes_sent; in octep_get_stats64()
1005 rx_packets += oct->stats_oq[q].packets; in octep_get_stats64()
1006 rx_bytes += oct->stats_oq[q].bytes; in octep_get_stats64()
1025 struct octep_device *oct = container_of(work, struct octep_device, in octep_tx_timeout_task() local
1027 struct net_device *netdev = oct->netdev; in octep_tx_timeout_task()
1047 struct octep_device *oct = netdev_priv(netdev); in octep_tx_timeout() local
1049 queue_work(octep_wq, &oct->tx_timeout_task); in octep_tx_timeout()
1054 struct octep_device *oct = netdev_priv(netdev); in octep_set_mac() local
1061 err = octep_ctrl_net_set_mac_addr(oct, OCTEP_CTRL_NET_INVALID_VFID, in octep_set_mac()
1066 memcpy(oct->mac_addr, addr->sa_data, ETH_ALEN); in octep_set_mac()
1074 struct octep_device *oct = netdev_priv(netdev); in octep_change_mtu() local
1078 link_info = &oct->link_info; in octep_change_mtu()
1082 err = octep_ctrl_net_set_mtu(oct, OCTEP_CTRL_NET_INVALID_VFID, new_mtu, in octep_change_mtu()
1085 oct->link_info.mtu = new_mtu; in octep_change_mtu()
1095 struct octep_device *oct = netdev_priv(dev); in octep_set_features() local
1117 err = octep_ctrl_net_set_offloads(oct, in octep_set_features()
1130 struct octep_device *oct = netdev_priv(dev); in octep_get_vf_config() local
1133 ether_addr_copy(ivi->mac, oct->vf_info[vf].mac_addr); in octep_get_vf_config()
1143 struct octep_device *oct = netdev_priv(dev); in octep_set_vf_mac() local
1147 dev_err(&oct->pdev->dev, "Invalid MAC Address %pM\n", mac); in octep_set_vf_mac()
1151 dev_dbg(&oct->pdev->dev, "set vf-%d mac to %pM\n", vf, mac); in octep_set_vf_mac()
1152 ether_addr_copy(oct->vf_info[vf].mac_addr, mac); in octep_set_vf_mac()
1153 oct->vf_info[vf].flags |= OCTEON_PFVF_FLAG_MAC_SET_BY_PF; in octep_set_vf_mac()
1155 err = octep_ctrl_net_set_mac_addr(oct, vf, mac, true); in octep_set_vf_mac()
1157 dev_err(&oct->pdev->dev, in octep_set_vf_mac()
1186 struct octep_device *oct = container_of(work, struct octep_device, in octep_intr_poll_task() local
1189 if (!oct->poll_non_ioq_intr) { in octep_intr_poll_task()
1190 dev_info(&oct->pdev->dev, "Interrupt poll task stopped.\n"); in octep_intr_poll_task()
1194 oct->hw_ops.poll_non_ioq_interrupts(oct); in octep_intr_poll_task()
1195 queue_delayed_work(octep_wq, &oct->intr_poll_task, in octep_intr_poll_task()
1204 * Check for heartbeat miss count. Uninitialize oct device if miss count
1210 struct octep_device *oct = container_of(work, struct octep_device, in octep_hb_timeout_task() local
1215 miss_cnt = atomic_inc_return(&oct->hb_miss_cnt); in octep_hb_timeout_task()
1216 if (miss_cnt < oct->conf->fw_info.hb_miss_count) { in octep_hb_timeout_task()
1217 queue_delayed_work(octep_wq, &oct->hb_task, in octep_hb_timeout_task()
1218 msecs_to_jiffies(oct->conf->fw_info.hb_interval)); in octep_hb_timeout_task()
1222 dev_err(&oct->pdev->dev, "Missed %u heartbeats. Uninitializing\n", in octep_hb_timeout_task()
1225 if (netif_running(oct->netdev)) in octep_hb_timeout_task()
1226 octep_stop(oct->netdev); in octep_hb_timeout_task()
1239 struct octep_device *oct = container_of(work, struct octep_device, in octep_ctrl_mbox_task() local
1242 octep_ctrl_net_recv_fw_messages(oct); in octep_ctrl_mbox_task()
1245 static const char *octep_devid_to_str(struct octep_device *oct) in octep_devid_to_str() argument
1247 switch (oct->chip_id) { in octep_devid_to_str()
1270 * @oct: Octeon device private data structure.
1274 int octep_device_setup(struct octep_device *oct) in octep_device_setup() argument
1276 struct pci_dev *pdev = oct->pdev; in octep_device_setup()
1279 /* allocate memory for oct->conf */ in octep_device_setup()
1280 oct->conf = kzalloc(sizeof(*oct->conf), GFP_KERNEL); in octep_device_setup()
1281 if (!oct->conf) in octep_device_setup()
1286 oct->mmio[i].hw_addr = in octep_device_setup()
1287 ioremap(pci_resource_start(oct->pdev, i * 2), in octep_device_setup()
1288 pci_resource_len(oct->pdev, i * 2)); in octep_device_setup()
1289 if (!oct->mmio[i].hw_addr) in octep_device_setup()
1292 oct->mmio[i].mapped = 1; in octep_device_setup()
1295 oct->chip_id = pdev->device; in octep_device_setup()
1296 oct->rev_id = pdev->revision; in octep_device_setup()
1299 switch (oct->chip_id) { in octep_device_setup()
1304 octep_devid_to_str(oct), OCTEP_MAJOR_REV(oct), in octep_device_setup()
1305 OCTEP_MINOR_REV(oct)); in octep_device_setup()
1306 octep_device_setup_cn93_pf(oct); in octep_device_setup()
1313 octep_devid_to_str(oct), OCTEP_MAJOR_REV(oct), OCTEP_MINOR_REV(oct)); in octep_device_setup()
1314 octep_device_setup_cnxk_pf(oct); in octep_device_setup()
1323 ret = octep_ctrl_net_init(oct); in octep_device_setup()
1327 INIT_WORK(&oct->tx_timeout_task, octep_tx_timeout_task); in octep_device_setup()
1328 INIT_WORK(&oct->ctrl_mbox_task, octep_ctrl_mbox_task); in octep_device_setup()
1329 INIT_DELAYED_WORK(&oct->intr_poll_task, octep_intr_poll_task); in octep_device_setup()
1330 oct->poll_non_ioq_intr = true; in octep_device_setup()
1331 queue_delayed_work(octep_wq, &oct->intr_poll_task, in octep_device_setup()
1334 atomic_set(&oct->hb_miss_cnt, 0); in octep_device_setup()
1335 INIT_DELAYED_WORK(&oct->hb_task, octep_hb_timeout_task); in octep_device_setup()
1343 iounmap(oct->mmio[i].hw_addr); in octep_device_setup()
1345 kfree(oct->conf); in octep_device_setup()
1352 * @oct: Octeon device private data structure.
1356 static void octep_device_cleanup(struct octep_device *oct) in octep_device_cleanup() argument
1360 oct->poll_non_ioq_intr = false; in octep_device_cleanup()
1361 cancel_delayed_work_sync(&oct->intr_poll_task); in octep_device_cleanup()
1362 cancel_work_sync(&oct->ctrl_mbox_task); in octep_device_cleanup()
1364 dev_info(&oct->pdev->dev, "Cleaning up Octeon Device ...\n"); in octep_device_cleanup()
1367 vfree(oct->mbox[i]); in octep_device_cleanup()
1368 oct->mbox[i] = NULL; in octep_device_cleanup()
1371 octep_delete_pfvf_mbox(oct); in octep_device_cleanup()
1372 octep_ctrl_net_uninit(oct); in octep_device_cleanup()
1373 cancel_delayed_work_sync(&oct->hb_task); in octep_device_cleanup()
1375 oct->hw_ops.soft_reset(oct); in octep_device_cleanup()
1377 if (oct->mmio[i].mapped) in octep_device_cleanup()
1378 iounmap(oct->mmio[i].hw_addr); in octep_device_cleanup()
1381 kfree(oct->conf); in octep_device_cleanup()
1382 oct->conf = NULL; in octep_device_cleanup()
1543 static int octep_sriov_disable(struct octep_device *oct) in octep_sriov_disable() argument
1545 struct pci_dev *pdev = oct->pdev; in octep_sriov_disable()
1547 if (pci_vfs_assigned(oct->pdev)) { in octep_sriov_disable()
1553 CFG_GET_ACTIVE_VFS(oct->conf) = 0; in octep_sriov_disable()
1568 struct octep_device *oct = pci_get_drvdata(pdev); in octep_remove() local
1571 if (!oct) in octep_remove()
1574 netdev = oct->netdev; in octep_remove()
1575 octep_sriov_disable(oct); in octep_remove()
1579 cancel_work_sync(&oct->tx_timeout_task); in octep_remove()
1580 octep_device_cleanup(oct); in octep_remove()
1586 static int octep_sriov_enable(struct octep_device *oct, int num_vfs) in octep_sriov_enable() argument
1588 struct pci_dev *pdev = oct->pdev; in octep_sriov_enable()
1591 CFG_GET_ACTIVE_VFS(oct->conf) = num_vfs; in octep_sriov_enable()
1595 CFG_GET_ACTIVE_VFS(oct->conf) = 0; in octep_sriov_enable()
1604 struct octep_device *oct = pci_get_drvdata(pdev); in octep_sriov_configure() local
1608 return octep_sriov_disable(oct); in octep_sriov_configure()
1610 max_nvfs = CFG_GET_MAX_VFS(oct->conf); in octep_sriov_configure()
1618 return octep_sriov_enable(oct, num_vfs); in octep_sriov_configure()