pcnet: Add link state support
PATCH 1/1 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.
--- hw/lance.c | 1 + hw/pcnet-pci.c | 1 + hw/pcnet.c | 7 +++++++ hw/pcnet.h | 1 + 4 files changed, 10 insertions(+), 0 deletions(-)
hw/lance.c +1 -0
@@ -97,6 +97,7 @@ static NetClientInfo net_lance_info = { .size = sizeof(NICState), .can_receive = pcnet_can_receive, .receive = pcnet_receive, + .link_status_changed = pcnet_set_link_status, .cleanup = lance_cleanup, };
hw/pcnet-pci.c +1 -0
@@ -287,6 +287,7 @@ static NetClientInfo net_pci_pcnet_info = { .size = sizeof(NICState), .can_receive = pcnet_can_receive, .receive = pcnet_receive, + .link_status_changed = pcnet_set_link_status, .cleanup = pci_pcnet_cleanup, };
hw/pcnet.c +7 -0
@@ -1197,6 +1197,13 @@ ssize_t pcnet_receive(VLANClientState *nc, const uint8_t *buf, size_t size_)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 ;
hw/pcnet.h +1 -0
@@ -58,6 +58,7 @@ uint32_t pcnet_ioport_readl(void *opaque, uint32_t addr);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;
Signature · 1 line
1.7.3.4
Quoted 3 lines · Jan Kiszka
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.
Strike the second sentence: The older Am79C970A that QEMU emulated provided no PHY access, only newer Am79C973/Am79C979 did. So the patch is sufficient for our current level of support.
Jan
Signature · 2 lines
Siemens AG, Corporate Technology, CT T DE IT 1 Corporate Competence Center Embedded Linux
Anthony Liguori
AppliedQuoted 5 lines · Jan Kiszka
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<[email protected]>
Applied. Thanks.
Regards,
Anthony Liguori
Quoted 61 lines
--- hw/lance.c | 1 + hw/pcnet-pci.c | 1 + hw/pcnet.c | 7 +++++++ hw/pcnet.h | 1 + 4 files changed, 10 insertions(+), 0 deletions(-)hw/lance.c +1
-0@@ -97,6 +97,7 @@ static NetClientInfo net_lance_info = { .size = sizeof(NICState), .can_receive = pcnet_can_receive, .receive = pcnet_receive, + .link_status_changed = pcnet_set_link_status, .cleanup = lance_cleanup, };hw/pcnet-pci.c +1
-0@@ -287,6 +287,7 @@ static NetClientInfo net_pci_pcnet_info = { .size = sizeof(NICState), .can_receive = pcnet_can_receive, .receive = pcnet_receive, + .link_status_changed = pcnet_set_link_status, .cleanup = pci_pcnet_cleanup, };hw/pcnet.c +7
-0@@ -1197,6 +1197,13 @@ ssize_t pcnet_receive(VLANClientState *nc, const uint8_t *buf, size_t size_)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 ;hw/pcnet.h +1
-0@@ -58,6 +58,7 @@ uint32_t pcnet_ioport_readl(void *opaque, uint32_t addr);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;