net/cxgbe: avoid polling link status before device start
authorRahul Lakkireddy <rahul.lakkireddy@chelsio.com>
Fri, 27 Sep 2019 20:30:06 +0000 (02:00 +0530)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 7 Oct 2019 13:00:57 +0000 (15:00 +0200)
Link updates come in firmware event queue, which is only created
when device starts. So, don't poll for link status if firmware
event queue is not yet created.

This fixes NULL dereference when accessing non existent firmware
event queue.

Fixes: 265af08e75ba ("net/cxgbe: add link up and down ops")
Cc: stable@dpdk.org
Signed-off-by: Rahul Lakkireddy <rahul.lakkireddy@chelsio.com>
drivers/net/cxgbe/cxgbe_ethdev.c

index 5d74f8b..5df8d74 100644 (file)
@@ -206,6 +206,9 @@ int cxgbe_dev_link_update(struct rte_eth_dev *eth_dev,
        u8 old_link = pi->link_cfg.link_ok;
 
        for (i = 0; i < CXGBE_LINK_STATUS_POLL_CNT; i++) {
+               if (!s->fw_evtq.desc)
+                       break;
+
                cxgbe_poll(&s->fw_evtq, NULL, budget, &work_done);
 
                /* Exit if link status changed or always forced up */
@@ -239,6 +242,9 @@ int cxgbe_dev_set_link_up(struct rte_eth_dev *dev)
        struct sge *s = &adapter->sge;
        int ret;
 
+       if (!s->fw_evtq.desc)
+               return -ENOMEM;
+
        /* Flush all link events */
        cxgbe_poll(&s->fw_evtq, NULL, budget, &work_done);
 
@@ -265,6 +271,9 @@ int cxgbe_dev_set_link_down(struct rte_eth_dev *dev)
        struct sge *s = &adapter->sge;
        int ret;
 
+       if (!s->fw_evtq.desc)
+               return -ENOMEM;
+
        /* Flush all link events */
        cxgbe_poll(&s->fw_evtq, NULL, budget, &work_done);