@@ -2054,7 +2054,7 @@ static void virtnet_freeze_down(struct virtio_device *vdev)
netif_device_detach(vi->dev);
netif_tx_unlock_bh(vi->dev);
if (netif_running(vi->dev))
- virtnet_close(vi->dev);
+ virtnet_get_netdev()->ndo_stop(vi->dev);
}
static int init_vqs(struct virtnet_info *vi);
@@ -2073,7 +2073,7 @@ static int virtnet_restore_up(struct virtio_device *vdev)
enable_delayed_refill(vi);
if (netif_running(vi->dev)) {
- err = virtnet_open(vi->dev);
+ err = virtnet_get_netdev()->ndo_open(vi->dev);
if (err)
return err;
}
@@ -2319,6 +2319,11 @@ static const struct net_device_ops virtnet_netdev = {
.ndo_tx_timeout = virtnet_tx_timeout,
};
+const struct net_device_ops *virtnet_get_netdev(void)
+{
+ return &virtnet_netdev;
+}
+
static void virtnet_config_changed_work(struct work_struct *work)
{
struct virtnet_info *vi =
@@ -2796,7 +2801,7 @@ static int virtnet_probe(struct virtio_device *vdev)
/* Set up network device as normal. */
dev->priv_flags |= IFF_UNICAST_FLT | IFF_LIVE_ADDR_CHANGE |
IFF_TX_SKB_NO_LINEAR;
- dev->netdev_ops = &virtnet_netdev;
+ dev->netdev_ops = virtnet_get_netdev();
dev->features = NETIF_F_HIGHDMA;
dev->ethtool_ops = virtnet_get_ethtool_ops();
@@ -185,4 +185,5 @@ int virtnet_rx_resize(struct virtnet_info *vi, struct virtnet_rq *rq, u32 ring_n
int virtnet_tx_resize(struct virtnet_info *vi, struct virtnet_sq *sq, u32 ring_num);
int _virtnet_set_queues(struct virtnet_info *vi, u16 queue_pairs);
void virtnet_dev_rx_queue_group(struct virtnet_info *vi, struct net_device *dev);
+const struct net_device_ops *virtnet_get_netdev(void);
#endif
Adding an API to get netdev_ops. Avoid to use the netdev_ops directly. This is prepare for separating the virtio-related funcs. Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> --- drivers/net/virtio/virtnet.c | 11 ++++++++--- drivers/net/virtio/virtnet.h | 1 + 2 files changed, 9 insertions(+), 3 deletions(-)