summaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorScott Feldman <sfeldma@gmail.com>2015-06-10 18:21:20 -0700
committerStefan Hajnoczi <stefanha@redhat.com>2015-06-12 13:26:27 +0100
commit5ff1547b756a820bc7b695fe393b25d82467d1fe (patch)
tree86aa10e8028eff1032e73bdc3fffff5ee182abcf /hw
parent73da0232098a69d06ce0d49ad8751b7c5e8b9448 (diff)
downloadqemu-5ff1547b756a820bc7b695fe393b25d82467d1fe.tar.gz
qemu-5ff1547b756a820bc7b695fe393b25d82467d1fe.tar.bz2
qemu-5ff1547b756a820bc7b695fe393b25d82467d1fe.zip
rocker: bring link up/down on PHY enable/disable
When the OS driver enables/disables the port, go ahead and set the port's link status to up/down in response to the change. This more closely emulates real hardware when the PHY for the port is brought up/down and the PHY negotiates carrier (link status) with link partner. In the case of qemu, the virtual rocker device can't really do link negotiation with the link partner as that requires signally over a physical medium (the wire), so just pretend the negotiation was successful and bring the link up when the port is enabled. Signed-off-by: Scott Feldman <sfeldma@gmail.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Message-id: 1433985681-56138-4-git-send-email-sfeldma@gmail.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Diffstat (limited to 'hw')
-rw-r--r--hw/net/rocker/rocker_fp.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/hw/net/rocker/rocker_fp.c b/hw/net/rocker/rocker_fp.c
index 393e9e74f9..29a2b681cd 100644
--- a/hw/net/rocker/rocker_fp.c
+++ b/hw/net/rocker/rocker_fp.c
@@ -178,8 +178,19 @@ bool fp_port_enabled(FpPort *port)
return port->enabled;
}
+static void fp_port_set_link(FpPort *port, bool up)
+{
+ NetClientState *nc = qemu_get_queue(port->nic);
+
+ if (up == nc->link_down) {
+ nc->link_down = !up;
+ nc->info->link_status_changed(nc);
+ }
+}
+
void fp_port_enable(FpPort *port)
{
+ fp_port_set_link(port, true);
port->enabled = true;
DPRINTF("port %d enabled\n", port->index);
}
@@ -187,6 +198,7 @@ void fp_port_enable(FpPort *port)
void fp_port_disable(FpPort *port)
{
port->enabled = false;
+ fp_port_set_link(port, false);
DPRINTF("port %d disabled\n", port->index);
}