pcnet: Add link state support Update lnkst on link state changes so that guests can obtain this information via reading back the LED output pin. Works for Linux but not for guests that depend on the missing PHY. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
diff --git a/hw/lance.c b/hw/lance.c index d83e7f5..93d5fda 100644 --- a/hw/lance.c +++ b/hw/lance.c
@@ -97,6 +97,7 @@ .size = sizeof(NICState), .can_receive = pcnet_can_receive, .receive = pcnet_receive, + .link_status_changed = pcnet_set_link_status, .cleanup = lance_cleanup, };
diff --git a/hw/pcnet-pci.c b/hw/pcnet-pci.c index ea5dfde..4e164da 100644 --- a/hw/pcnet-pci.c +++ b/hw/pcnet-pci.c
@@ -288,6 +288,7 @@ .size = sizeof(NICState), .can_receive = pcnet_can_receive, .receive = pcnet_receive, + .link_status_changed = pcnet_set_link_status, .cleanup = pci_pcnet_cleanup, };
diff --git a/hw/pcnet.c b/hw/pcnet.c index add3ec2..cba253b 100644 --- a/hw/pcnet.c +++ b/hw/pcnet.c
@@ -1197,6 +1197,13 @@ return size_; } +void pcnet_set_link_status(VLANClientState *nc) +{ + PCNetState *d = DO_UPCAST(NICState, nc, nc)->opaque; + + d->lnkst = nc->link_down ? 0 : 0x40; +} + static void pcnet_transmit(PCNetState *s) { target_phys_addr_t xmit_cxda = 0;
diff --git a/hw/pcnet.h b/hw/pcnet.h index 52cc52e..edc81c9 100644 --- a/hw/pcnet.h +++ b/hw/pcnet.h
@@ -58,6 +58,7 @@ uint32_t pcnet_bcr_readw(PCNetState *s, uint32_t rap); int pcnet_can_receive(VLANClientState *nc); ssize_t pcnet_receive(VLANClientState *nc, const uint8_t *buf, size_t size_); +void pcnet_set_link_status(VLANClientState *nc); void pcnet_common_cleanup(PCNetState *d); int pcnet_common_init(DeviceState *dev, PCNetState *s, NetClientInfo *info); extern const VMStateDescription vmstate_pcnet;