From 93e37d769074bebfd04c6704b7a7ae92736876e3 Mon Sep 17 00:00:00 2001 From: Jason Wang Date: Thu, 22 Mar 2012 18:01:59 +0800 Subject: [PATCH] e1000: PHY loopback mode support The missing of loopback mode prevent the running of self diagnosis program in guest. This patch adds this support. After this patch, loopback test of ethtool were passed in guest. Signed-off-by: Jason Wang Signed-off-by: Michael S. Tsirkin --- hw/e1000.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/hw/e1000.c b/hw/e1000.c index 4e787bc2cf..4a09e39975 100644 --- a/hw/e1000.c +++ b/hw/e1000.c @@ -391,6 +391,16 @@ fcs_len(E1000State *s) return (s->mac_reg[RCTL] & E1000_RCTL_SECRC) ? 0 : 4; } +static void +e1000_send_packet(E1000State *s, const uint8_t *buf, int size) +{ + if (s->phy_reg[PHY_CTRL] & MII_CR_LOOPBACK) { + s->nic->nc.info->receive(&s->nic->nc, buf, size); + } else { + qemu_send_packet(&s->nic->nc, buf, size); + } +} + static void xmit_seg(E1000State *s) { @@ -440,9 +450,9 @@ xmit_seg(E1000State *s) memmove(tp->vlan, tp->data, 4); memmove(tp->data, tp->data + 4, 8); memcpy(tp->data + 8, tp->vlan_header, 4); - qemu_send_packet(&s->nic->nc, tp->vlan, tp->size + 4); + e1000_send_packet(s, tp->vlan, tp->size + 4); } else - qemu_send_packet(&s->nic->nc, tp->data, tp->size); + e1000_send_packet(s, tp->data, tp->size); s->mac_reg[TPT]++; s->mac_reg[GPTC]++; n = s->mac_reg[TOTL]; -- GitLab