Lines Matching refs:oct

44  * @oct: Octeon device private data structure.
54 static int octep_alloc_ioq_vectors(struct octep_device *oct)
59 for (i = 0; i < oct->num_oqs; i++) {
60 oct->ioq_vector[i] = vzalloc(sizeof(*oct->ioq_vector[i]));
61 if (!oct->ioq_vector[i])
64 ioq_vector = oct->ioq_vector[i];
65 ioq_vector->iq = oct->iq[i];
66 ioq_vector->oq = oct->oq[i];
67 ioq_vector->octep_dev = oct;
70 dev_info(&oct->pdev->dev, "Allocated %d IOQ vectors\n", oct->num_oqs);
76 vfree(oct->ioq_vector[i]);
77 oct->ioq_vector[i] = NULL;
85 * @oct: Octeon device private data structure.
87 static void octep_free_ioq_vectors(struct octep_device *oct)
91 for (i = 0; i < oct->num_oqs; i++) {
92 if (oct->ioq_vector[i]) {
93 vfree(oct->ioq_vector[i]);
94 oct->ioq_vector[i] = NULL;
97 netdev_info(oct->netdev, "Freed IOQ Vectors\n");
103 * @oct: Octeon device private data structure.
111 static int octep_enable_msix_range(struct octep_device *oct)
117 num_msix = oct->num_oqs + CFG_GET_NON_IOQ_MSIX(oct->conf);
118 oct->msix_entries = kcalloc(num_msix,
120 if (!oct->msix_entries)
124 oct->msix_entries[i].entry = i;
126 msix_allocated = pci_enable_msix_range(oct->pdev, oct->msix_entries,
129 dev_err(&oct->pdev->dev,
134 oct->num_irqs = msix_allocated;
135 dev_info(&oct->pdev->dev, "MSI-X enabled successfully\n");
141 pci_disable_msix(oct->pdev);
142 kfree(oct->msix_entries);
143 oct->msix_entries = NULL;
151 * @oct: Octeon device private data structure.
155 static void octep_disable_msix(struct octep_device *oct)
157 pci_disable_msix(oct->pdev);
158 kfree(oct->msix_entries);
159 oct->msix_entries = NULL;
160 dev_info(&oct->pdev->dev, "Disabled MSI-X\n");
173 struct octep_device *oct = data;
175 return oct->hw_ops.mbox_intr_handler(oct);
188 struct octep_device *oct = data;
190 return oct->hw_ops.oei_intr_handler(oct);
203 struct octep_device *oct = data;
205 return oct->hw_ops.ire_intr_handler(oct);
218 struct octep_device *oct = data;
220 return oct->hw_ops.ore_intr_handler(oct);
233 struct octep_device *oct = data;
235 return oct->hw_ops.vfire_intr_handler(oct);
248 struct octep_device *oct = data;
250 return oct->hw_ops.vfore_intr_handler(oct);
263 struct octep_device *oct = data;
265 return oct->hw_ops.dma_intr_handler(oct);
278 struct octep_device *oct = data;
280 return oct->hw_ops.dma_vf_intr_handler(oct);
293 struct octep_device *oct = data;
295 return oct->hw_ops.pp_vf_intr_handler(oct);
308 struct octep_device *oct = data;
310 return oct->hw_ops.misc_intr_handler(oct);
323 struct octep_device *oct = data;
325 return oct->hw_ops.rsvd_intr_handler(oct);
340 struct octep_device *oct = ioq_vector->octep_dev;
342 return oct->hw_ops.ioq_intr_handler(ioq_vector);
348 * @oct: Octeon device private data structure.
355 static int octep_request_irqs(struct octep_device *oct)
357 struct net_device *netdev = oct->netdev;
364 num_non_ioq_msix = CFG_GET_NON_IOQ_MSIX(oct->conf);
365 non_ioq_msix_names = CFG_GET_NON_IOQ_MSIX_NAMES(oct->conf);
367 oct->non_ioq_irq_names = kcalloc(num_non_ioq_msix,
369 if (!oct->non_ioq_irq_names)
376 irq_name = &oct->non_ioq_irq_names[i * OCTEP_MSIX_NAME_SIZE];
377 msix_entry = &oct->msix_entries[i];
384 irq_name, oct);
389 irq_name, oct);
394 irq_name, oct);
399 irq_name, oct);
404 irq_name, oct);
409 irq_name, oct);
414 irq_name, oct);
419 irq_name, oct);
424 irq_name, oct);
429 irq_name, oct);
433 irq_name, oct);
445 for (j = 0; j < oct->num_oqs; j++) {
446 ioq_vector = oct->ioq_vector[j];
447 msix_entry = &oct->msix_entries[j + num_non_ioq_msix];
471 ioq_vector = oct->ioq_vector[j];
472 msix_entry = &oct->msix_entries[j + num_non_ioq_msix];
480 free_irq(oct->msix_entries[i].vector, oct);
482 kfree(oct->non_ioq_irq_names);
483 oct->non_ioq_irq_names = NULL;
491 * @oct: Octeon device private data structure.
495 static void octep_free_irqs(struct octep_device *oct)
500 for (i = 0; i < CFG_GET_NON_IOQ_MSIX(oct->conf); i++)
501 free_irq(oct->msix_entries[i].vector, oct);
502 kfree(oct->non_ioq_irq_names);
505 for (i = CFG_GET_NON_IOQ_MSIX(oct->conf); i < oct->num_irqs; i++) {
506 irq_set_affinity_hint(oct->msix_entries[i].vector, NULL);
507 free_irq(oct->msix_entries[i].vector,
508 oct->ioq_vector[i - CFG_GET_NON_IOQ_MSIX(oct->conf)]);
510 netdev_info(oct->netdev, "IRQs freed\n");
516 * @oct: Octeon device private data structure.
524 static int octep_setup_irqs(struct octep_device *oct)
526 if (octep_alloc_ioq_vectors(oct))
529 if (octep_enable_msix_range(oct))
532 if (octep_request_irqs(oct))
538 octep_disable_msix(oct);
540 octep_free_ioq_vectors(oct);
548 * @oct: Octeon device private data structure.
550 static void octep_clean_irqs(struct octep_device *oct)
552 octep_free_irqs(oct);
553 octep_disable_msix(oct);
554 octep_free_ioq_vectors(oct);
613 * @oct: Octeon device private data structure.
615 static void octep_napi_add(struct octep_device *oct)
619 for (i = 0; i < oct->num_oqs; i++) {
620 netdev_dbg(oct->netdev, "Adding NAPI on Q-%d\n", i);
621 netif_napi_add(oct->netdev, &oct->ioq_vector[i]->napi,
623 oct->oq[i]->napi = &oct->ioq_vector[i]->napi;
630 * @oct: Octeon device private data structure.
632 static void octep_napi_delete(struct octep_device *oct)
636 for (i = 0; i < oct->num_oqs; i++) {
637 netdev_dbg(oct->netdev, "Deleting NAPI on Q-%d\n", i);
638 netif_napi_del(&oct->ioq_vector[i]->napi);
639 oct->oq[i]->napi = NULL;
646 * @oct: Octeon device private data structure.
648 static void octep_napi_enable(struct octep_device *oct)
652 for (i = 0; i < oct->num_oqs; i++) {
653 netdev_dbg(oct->netdev, "Enabling NAPI on Q-%d\n", i);
654 napi_enable(&oct->ioq_vector[i]->napi);
661 * @oct: Octeon device private data structure.
663 static void octep_napi_disable(struct octep_device *oct)
667 for (i = 0; i < oct->num_oqs; i++) {
668 netdev_dbg(oct->netdev, "Disabling NAPI on Q-%d\n", i);
669 napi_disable(&oct->ioq_vector[i]->napi);
692 struct octep_device *oct = netdev_priv(netdev);
698 oct->hw_ops.reset_io_queues(oct);
700 if (octep_setup_iqs(oct))
702 if (octep_setup_oqs(oct))
704 if (octep_setup_irqs(oct))
707 err = netif_set_real_num_tx_queues(netdev, oct->num_oqs);
710 err = netif_set_real_num_rx_queues(netdev, oct->num_iqs);
714 octep_napi_add(oct);
715 octep_napi_enable(oct);
717 oct->link_info.admin_up = 1;
718 octep_ctrl_net_set_rx_state(oct, OCTEP_CTRL_NET_INVALID_VFID, true,
720 octep_ctrl_net_set_link_status(oct, OCTEP_CTRL_NET_INVALID_VFID, true,
722 oct->poll_non_ioq_intr = false;
725 oct->hw_ops.enable_io_queues(oct);
728 oct->hw_ops.enable_interrupts(oct);
730 octep_oq_dbell_init(oct);
732 ret = octep_ctrl_net_get_link_status(oct, OCTEP_CTRL_NET_INVALID_VFID);
739 octep_clean_irqs(oct);
741 octep_free_oqs(oct);
743 octep_free_iqs(oct);
758 struct octep_device *oct = netdev_priv(netdev);
762 octep_ctrl_net_set_link_status(oct, OCTEP_CTRL_NET_INVALID_VFID, false,
764 octep_ctrl_net_set_rx_state(oct, OCTEP_CTRL_NET_INVALID_VFID, false,
772 oct->link_info.admin_up = 0;
773 oct->link_info.oper_up = 0;
775 oct->hw_ops.disable_interrupts(oct);
776 octep_napi_disable(oct);
777 octep_napi_delete(oct);
779 octep_clean_irqs(oct);
780 octep_clean_iqs(oct);
782 oct->hw_ops.disable_io_queues(oct);
783 oct->hw_ops.reset_io_queues(oct);
784 octep_free_oqs(oct);
785 octep_free_iqs(oct);
787 oct->poll_non_ioq_intr = true;
788 queue_delayed_work(octep_wq, &oct->intr_poll_task,
844 struct octep_device *oct = netdev_priv(netdev);
861 if (q_no >= oct->num_iqs) {
863 q_no = q_no % oct->num_iqs;
866 iq = oct->iq[q_no];
879 ih->pkind = oct->conf->fw_info.pkind;
880 ih->fsz = oct->conf->fw_info.fsz;
928 if (oct->conf->fw_info.tx_ol_flags) {
995 struct octep_device *oct = netdev_priv(netdev);
999 octep_ctrl_net_get_if_stats(oct,
1001 &oct->iface_rx_stats,
1002 &oct->iface_tx_stats);
1008 for (q = 0; q < oct->num_oqs; q++) {
1009 struct octep_iq *iq = oct->iq[q];
1010 struct octep_oq *oq = oct->oq[q];
1021 stats->multicast = oct->iface_rx_stats.mcast_pkts;
1022 stats->rx_errors = oct->iface_rx_stats.err_pkts;
1023 stats->collisions = oct->iface_tx_stats.xscol;
1024 stats->tx_fifo_errors = oct->iface_tx_stats.undflw;
1038 struct octep_device *oct = container_of(work, struct octep_device,
1040 struct net_device *netdev = oct->netdev;
1060 struct octep_device *oct = netdev_priv(netdev);
1062 queue_work(octep_wq, &oct->tx_timeout_task);
1067 struct octep_device *oct = netdev_priv(netdev);
1074 err = octep_ctrl_net_set_mac_addr(oct, OCTEP_CTRL_NET_INVALID_VFID,
1079 memcpy(oct->mac_addr, addr->sa_data, ETH_ALEN);
1087 struct octep_device *oct = netdev_priv(netdev);
1091 link_info = &oct->link_info;
1095 err = octep_ctrl_net_set_mtu(oct, OCTEP_CTRL_NET_INVALID_VFID, new_mtu,
1098 oct->link_info.mtu = new_mtu;
1108 struct octep_device *oct = netdev_priv(dev);
1130 err = octep_ctrl_net_set_offloads(oct,
1160 struct octep_device *oct = container_of(work, struct octep_device,
1163 if (!oct->poll_non_ioq_intr) {
1164 dev_info(&oct->pdev->dev, "Interrupt poll task stopped.\n");
1168 oct->hw_ops.poll_non_ioq_interrupts(oct);
1169 queue_delayed_work(octep_wq, &oct->intr_poll_task,
1178 * Check for heartbeat miss count. Uninitialize oct device if miss count
1184 struct octep_device *oct = container_of(work, struct octep_device,
1189 miss_cnt = atomic_inc_return(&oct->hb_miss_cnt);
1190 if (miss_cnt < oct->conf->fw_info.hb_miss_count) {
1191 queue_delayed_work(octep_wq, &oct->hb_task,
1192 msecs_to_jiffies(oct->conf->fw_info.hb_interval));
1196 dev_err(&oct->pdev->dev, "Missed %u heartbeats. Uninitializing\n",
1199 if (netif_running(oct->netdev))
1200 octep_stop(oct->netdev);
1213 struct octep_device *oct = container_of(work, struct octep_device,
1216 octep_ctrl_net_recv_fw_messages(oct);
1219 static const char *octep_devid_to_str(struct octep_device *oct)
1221 switch (oct->chip_id) {
1244 * @oct: Octeon device private data structure.
1248 int octep_device_setup(struct octep_device *oct)
1250 struct pci_dev *pdev = oct->pdev;
1253 /* allocate memory for oct->conf */
1254 oct->conf = kzalloc(sizeof(*oct->conf), GFP_KERNEL);
1255 if (!oct->conf)
1260 oct->mmio[i].hw_addr =
1261 ioremap(pci_resource_start(oct->pdev, i * 2),
1262 pci_resource_len(oct->pdev, i * 2));
1263 if (!oct->mmio[i].hw_addr)
1266 oct->mmio[i].mapped = 1;
1269 oct->chip_id = pdev->device;
1270 oct->rev_id = pdev->revision;
1273 switch (oct->chip_id) {
1278 octep_devid_to_str(oct), OCTEP_MAJOR_REV(oct),
1279 OCTEP_MINOR_REV(oct));
1280 octep_device_setup_cn93_pf(oct);
1287 octep_devid_to_str(oct), OCTEP_MAJOR_REV(oct), OCTEP_MINOR_REV(oct));
1288 octep_device_setup_cnxk_pf(oct);
1297 ret = octep_ctrl_net_init(oct);
1301 INIT_WORK(&oct->tx_timeout_task, octep_tx_timeout_task);
1302 INIT_WORK(&oct->ctrl_mbox_task, octep_ctrl_mbox_task);
1303 INIT_DELAYED_WORK(&oct->intr_poll_task, octep_intr_poll_task);
1304 oct->poll_non_ioq_intr = true;
1305 queue_delayed_work(octep_wq, &oct->intr_poll_task,
1308 atomic_set(&oct->hb_miss_cnt, 0);
1309 INIT_DELAYED_WORK(&oct->hb_task, octep_hb_timeout_task);
1317 iounmap(oct->mmio[i].hw_addr);
1319 kfree(oct->conf);
1326 * @oct: Octeon device private data structure.
1330 static void octep_device_cleanup(struct octep_device *oct)
1334 oct->poll_non_ioq_intr = false;
1335 cancel_delayed_work_sync(&oct->intr_poll_task);
1336 cancel_work_sync(&oct->ctrl_mbox_task);
1338 dev_info(&oct->pdev->dev, "Cleaning up Octeon Device ...\n");
1341 vfree(oct->mbox[i]);
1342 oct->mbox[i] = NULL;
1345 octep_delete_pfvf_mbox(oct);
1346 octep_ctrl_net_uninit(oct);
1347 cancel_delayed_work_sync(&oct->hb_task);
1349 oct->hw_ops.soft_reset(oct);
1351 if (oct->mmio[i].mapped)
1352 iounmap(oct->mmio[i].hw_addr);
1355 kfree(oct->conf);
1356 oct->conf = NULL;
1517 static int octep_sriov_disable(struct octep_device *oct)
1519 struct pci_dev *pdev = oct->pdev;
1521 if (pci_vfs_assigned(oct->pdev)) {
1527 CFG_GET_ACTIVE_VFS(oct->conf) = 0;
1542 struct octep_device *oct = pci_get_drvdata(pdev);
1545 if (!oct)
1548 netdev = oct->netdev;
1549 octep_sriov_disable(oct);
1553 cancel_work_sync(&oct->tx_timeout_task);
1554 octep_device_cleanup(oct);
1560 static int octep_sriov_enable(struct octep_device *oct, int num_vfs)
1562 struct pci_dev *pdev = oct->pdev;
1565 CFG_GET_ACTIVE_VFS(oct->conf) = num_vfs;
1569 CFG_GET_ACTIVE_VFS(oct->conf) = 0;
1578 struct octep_device *oct = pci_get_drvdata(pdev);
1582 return octep_sriov_disable(oct);
1584 max_nvfs = CFG_GET_MAX_VFS(oct->conf);
1592 return octep_sriov_enable(oct, num_vfs);