Merge remote-tracking branch 'stefanha/net' into staging

* stefanha/net:
  rtl8139: preserve link state across device reset
  e1000: no need auto-negotiation if link was down
  net: clean up network at qemu process termination
  e1000: Discard oversized packets based on SBP|LPE

Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
Anthony Liguori 2013-01-08 10:36:13 -06:00
commit c3dd94b129
3 changed files with 15 additions and 4 deletions

View file

@ -61,6 +61,8 @@ static int debugflags = DBGBIT(TXERR) | DBGBIT(GENERAL);
/* this is the size past which hardware will drop packets when setting LPE=0 */
#define MAXIMUM_ETHERNET_VLAN_SIZE 1522
/* this is the size past which hardware will drop packets when setting LPE=1 */
#define MAXIMUM_ETHERNET_LPE_SIZE 16384
/*
* HW models:
@ -164,6 +166,11 @@ static void
set_phy_ctrl(E1000State *s, int index, uint16_t val)
{
if ((val & MII_CR_AUTO_NEG_EN) && (val & MII_CR_RESTART_AUTO_NEG)) {
/* no need auto-negotiation if link was down */
if (s->nic->nc.link_down) {
s->phy_reg[PHY_STATUS] |= MII_SR_AUTONEG_COMPLETE;
return;
}
s->nic->nc.link_down = true;
e1000_link_down(s);
s->phy_reg[PHY_STATUS] &= ~MII_SR_AUTONEG_COMPLETE;
@ -809,8 +816,9 @@ e1000_receive(NetClientState *nc, const uint8_t *buf, size_t size)
}
/* Discard oversized packets if !LPE and !SBP. */
if (size > MAXIMUM_ETHERNET_VLAN_SIZE
&& !(s->mac_reg[RCTL] & E1000_RCTL_LPE)
if ((size > MAXIMUM_ETHERNET_LPE_SIZE ||
(size > MAXIMUM_ETHERNET_VLAN_SIZE
&& !(s->mac_reg[RCTL] & E1000_RCTL_LPE)))
&& !(s->mac_reg[RCTL] & E1000_RCTL_SBP)) {
return size;
}

View file

@ -1258,7 +1258,8 @@ static void rtl8139_reset(DeviceState *d)
s->BasicModeStatus = 0x7809;
//s->BasicModeStatus |= 0x0040; /* UTP medium */
s->BasicModeStatus |= 0x0020; /* autonegotiation completed */
s->BasicModeStatus |= 0x0004; /* link is up */
/* preserve link state */
s->BasicModeStatus |= s->nic->nc.link_down ? 0 : 0x04;
s->NWayAdvert = 0x05e1; /* all modes, full duplex */
s->NWayLPAR = 0x05e1; /* all modes, full duplex */

4
vl.c
View file

@ -3762,6 +3762,9 @@ int main(int argc, char **argv, char **envp)
}
configure_icount(icount_option);
/* clean up network at qemu process termination */
atexit(&net_cleanup);
if (net_init_clients() < 0) {
exit(1);
}
@ -4014,7 +4017,6 @@ int main(int argc, char **argv, char **envp)
main_loop();
bdrv_close_all();
pause_all_vcpus();
net_cleanup();
res_free();
return 0;