|
@@ -1906,6 +1906,24 @@ static void virtnet_init_settings(struct net_device *dev)
|
|
vi->duplex = DUPLEX_UNKNOWN;
|
|
vi->duplex = DUPLEX_UNKNOWN;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void virtnet_update_settings(struct virtnet_info *vi)
|
|
|
|
+{
|
|
|
|
+ u32 speed;
|
|
|
|
+ u8 duplex;
|
|
|
|
+
|
|
|
|
+ if (!virtio_has_feature(vi->vdev, VIRTIO_NET_F_SPEED_DUPLEX))
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+ speed = virtio_cread32(vi->vdev, offsetof(struct virtio_net_config,
|
|
|
|
+ speed));
|
|
|
|
+ if (ethtool_validate_speed(speed))
|
|
|
|
+ vi->speed = speed;
|
|
|
|
+ duplex = virtio_cread8(vi->vdev, offsetof(struct virtio_net_config,
|
|
|
|
+ duplex));
|
|
|
|
+ if (ethtool_validate_duplex(duplex))
|
|
|
|
+ vi->duplex = duplex;
|
|
|
|
+}
|
|
|
|
+
|
|
static const struct ethtool_ops virtnet_ethtool_ops = {
|
|
static const struct ethtool_ops virtnet_ethtool_ops = {
|
|
.get_drvinfo = virtnet_get_drvinfo,
|
|
.get_drvinfo = virtnet_get_drvinfo,
|
|
.get_link = ethtool_op_get_link,
|
|
.get_link = ethtool_op_get_link,
|
|
@@ -2159,6 +2177,7 @@ static void virtnet_config_changed_work(struct work_struct *work)
|
|
vi->status = v;
|
|
vi->status = v;
|
|
|
|
|
|
if (vi->status & VIRTIO_NET_S_LINK_UP) {
|
|
if (vi->status & VIRTIO_NET_S_LINK_UP) {
|
|
|
|
+ virtnet_update_settings(vi);
|
|
netif_carrier_on(vi->dev);
|
|
netif_carrier_on(vi->dev);
|
|
netif_tx_wake_all_queues(vi->dev);
|
|
netif_tx_wake_all_queues(vi->dev);
|
|
} else {
|
|
} else {
|
|
@@ -2707,6 +2726,7 @@ static int virtnet_probe(struct virtio_device *vdev)
|
|
schedule_work(&vi->config_work);
|
|
schedule_work(&vi->config_work);
|
|
} else {
|
|
} else {
|
|
vi->status = VIRTIO_NET_S_LINK_UP;
|
|
vi->status = VIRTIO_NET_S_LINK_UP;
|
|
|
|
+ virtnet_update_settings(vi);
|
|
netif_carrier_on(dev);
|
|
netif_carrier_on(dev);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2808,7 +2828,8 @@ static struct virtio_device_id id_table[] = {
|
|
VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, \
|
|
VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, \
|
|
VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ, \
|
|
VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ, \
|
|
VIRTIO_NET_F_CTRL_MAC_ADDR, \
|
|
VIRTIO_NET_F_CTRL_MAC_ADDR, \
|
|
- VIRTIO_NET_F_MTU, VIRTIO_NET_F_CTRL_GUEST_OFFLOADS
|
|
|
|
|
|
+ VIRTIO_NET_F_MTU, VIRTIO_NET_F_CTRL_GUEST_OFFLOADS, \
|
|
|
|
+ VIRTIO_NET_F_SPEED_DUPLEX
|
|
|
|
|
|
static unsigned int features[] = {
|
|
static unsigned int features[] = {
|
|
VIRTNET_FEATURES,
|
|
VIRTNET_FEATURES,
|