]> git.dujemihanovic.xyz Git - linux.git/commitdiff
octeon_ep: initialise control mbox tasks before using APIs
authorShinas Rasheed <srasheed@marvell.com>
Wed, 6 Dec 2023 13:52:27 +0000 (05:52 -0800)
committerJakub Kicinski <kuba@kernel.org>
Sat, 9 Dec 2023 00:09:07 +0000 (16:09 -0800)
Initialise various workqueue tasks and queue interrupt poll task
before the first invocation of any control net APIs. Since
octep_ctrl_net_get_info was called before the control net receive
work task was initialised or even the interrupt poll task was
queued, the function call wasn't returning actual firmware
info queried from Octeon.

Fixes: 8d6198a14e2b ("octeon_ep: support to fetch firmware info")
Signed-off-by: Shinas Rasheed <srasheed@marvell.com>
Reviewed-by: Michal Schmidt <mschmidt@redhat.com>
Link: https://lore.kernel.org/r/20231206135228.2591659-1-srasheed@marvell.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/marvell/octeon_ep/octep_main.c

index 552970c7dec09715ece049a737ee32e2712e6b41..a2b5a3f8df93c0c78108cc163f423676ebff80d2 100644 (file)
@@ -1193,6 +1193,13 @@ int octep_device_setup(struct octep_device *oct)
        if (ret)
                return ret;
 
+       INIT_WORK(&oct->tx_timeout_task, octep_tx_timeout_task);
+       INIT_WORK(&oct->ctrl_mbox_task, octep_ctrl_mbox_task);
+       INIT_DELAYED_WORK(&oct->intr_poll_task, octep_intr_poll_task);
+       oct->poll_non_ioq_intr = true;
+       queue_delayed_work(octep_wq, &oct->intr_poll_task,
+                          msecs_to_jiffies(OCTEP_INTR_POLL_TIME_MSECS));
+
        atomic_set(&oct->hb_miss_cnt, 0);
        INIT_DELAYED_WORK(&oct->hb_task, octep_hb_timeout_task);
 
@@ -1325,21 +1332,18 @@ static int octep_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                goto err_octep_config;
        }
 
-       octep_ctrl_net_get_info(octep_dev, OCTEP_CTRL_NET_INVALID_VFID,
-                               &octep_dev->conf->fw_info);
+       err = octep_ctrl_net_get_info(octep_dev, OCTEP_CTRL_NET_INVALID_VFID,
+                                     &octep_dev->conf->fw_info);
+       if (err) {
+               dev_err(&pdev->dev, "Failed to get firmware info\n");
+               goto register_dev_err;
+       }
        dev_info(&octep_dev->pdev->dev, "Heartbeat interval %u msecs Heartbeat miss count %u\n",
                 octep_dev->conf->fw_info.hb_interval,
                 octep_dev->conf->fw_info.hb_miss_count);
        queue_delayed_work(octep_wq, &octep_dev->hb_task,
                           msecs_to_jiffies(octep_dev->conf->fw_info.hb_interval));
 
-       INIT_WORK(&octep_dev->tx_timeout_task, octep_tx_timeout_task);
-       INIT_WORK(&octep_dev->ctrl_mbox_task, octep_ctrl_mbox_task);
-       INIT_DELAYED_WORK(&octep_dev->intr_poll_task, octep_intr_poll_task);
-       octep_dev->poll_non_ioq_intr = true;
-       queue_delayed_work(octep_wq, &octep_dev->intr_poll_task,
-                          msecs_to_jiffies(OCTEP_INTR_POLL_TIME_MSECS));
-
        netdev->netdev_ops = &octep_netdev_ops;
        octep_set_ethtool_ops(netdev);
        netif_carrier_off(netdev);