net/virtio: fix guest announce support
authorTiwei Bie <tiwei.bie@intel.com>
Mon, 29 Oct 2018 05:28:08 +0000 (13:28 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 5 Nov 2018 14:01:25 +0000 (15:01 +0100)
We need to check the status field in virtio net config structure
instead of the bits read from ISR register to know whether we need
to do guest announce.

Fixes: 7365504f77e3 ("net/virtio: support guest announce")
Cc: stable@dpdk.org
Signed-off-by: Tiwei Bie <tiwei.bie@intel.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
drivers/net/virtio/virtio_ethdev.c

index da87177..cb6248e 100644 (file)
@@ -1288,6 +1288,7 @@ virtio_interrupt_handler(void *param)
        struct rte_eth_dev *dev = param;
        struct virtio_hw *hw = dev->data->dev_private;
        uint8_t isr;
+       uint16_t status;
 
        /* Read interrupt status which clears interrupt */
        isr = vtpci_isr(hw);
@@ -1301,12 +1302,17 @@ virtio_interrupt_handler(void *param)
                        _rte_eth_dev_callback_process(dev,
                                                      RTE_ETH_EVENT_INTR_LSC,
                                                      NULL);
-       }
 
-       if (isr & VIRTIO_NET_S_ANNOUNCE) {
-               virtio_notify_peers(dev);
-               if (hw->cvq)
-                       virtio_ack_link_announce(dev);
+               if (vtpci_with_feature(hw, VIRTIO_NET_F_STATUS)) {
+                       vtpci_read_dev_config(hw,
+                               offsetof(struct virtio_net_config, status),
+                               &status, sizeof(status));
+                       if (status & VIRTIO_NET_S_ANNOUNCE) {
+                               virtio_notify_peers(dev);
+                               if (hw->cvq)
+                                       virtio_ack_link_announce(dev);
+                       }
+               }
        }
 }