mirror of
https://git.proxmox.com/git/qemu
synced 2025-07-17 15:23:21 +00:00
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:
commit
c3dd94b129
12
hw/e1000.c
12
hw/e1000.c
@ -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 */
|
/* this is the size past which hardware will drop packets when setting LPE=0 */
|
||||||
#define MAXIMUM_ETHERNET_VLAN_SIZE 1522
|
#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:
|
* HW models:
|
||||||
@ -164,6 +166,11 @@ static void
|
|||||||
set_phy_ctrl(E1000State *s, int index, uint16_t val)
|
set_phy_ctrl(E1000State *s, int index, uint16_t val)
|
||||||
{
|
{
|
||||||
if ((val & MII_CR_AUTO_NEG_EN) && (val & MII_CR_RESTART_AUTO_NEG)) {
|
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;
|
s->nic->nc.link_down = true;
|
||||||
e1000_link_down(s);
|
e1000_link_down(s);
|
||||||
s->phy_reg[PHY_STATUS] &= ~MII_SR_AUTONEG_COMPLETE;
|
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. */
|
/* Discard oversized packets if !LPE and !SBP. */
|
||||||
if (size > MAXIMUM_ETHERNET_VLAN_SIZE
|
if ((size > MAXIMUM_ETHERNET_LPE_SIZE ||
|
||||||
&& !(s->mac_reg[RCTL] & E1000_RCTL_LPE)
|
(size > MAXIMUM_ETHERNET_VLAN_SIZE
|
||||||
|
&& !(s->mac_reg[RCTL] & E1000_RCTL_LPE)))
|
||||||
&& !(s->mac_reg[RCTL] & E1000_RCTL_SBP)) {
|
&& !(s->mac_reg[RCTL] & E1000_RCTL_SBP)) {
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
@ -1258,7 +1258,8 @@ static void rtl8139_reset(DeviceState *d)
|
|||||||
s->BasicModeStatus = 0x7809;
|
s->BasicModeStatus = 0x7809;
|
||||||
//s->BasicModeStatus |= 0x0040; /* UTP medium */
|
//s->BasicModeStatus |= 0x0040; /* UTP medium */
|
||||||
s->BasicModeStatus |= 0x0020; /* autonegotiation completed */
|
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->NWayAdvert = 0x05e1; /* all modes, full duplex */
|
||||||
s->NWayLPAR = 0x05e1; /* all modes, full duplex */
|
s->NWayLPAR = 0x05e1; /* all modes, full duplex */
|
||||||
|
4
vl.c
4
vl.c
@ -3762,6 +3762,9 @@ int main(int argc, char **argv, char **envp)
|
|||||||
}
|
}
|
||||||
configure_icount(icount_option);
|
configure_icount(icount_option);
|
||||||
|
|
||||||
|
/* clean up network at qemu process termination */
|
||||||
|
atexit(&net_cleanup);
|
||||||
|
|
||||||
if (net_init_clients() < 0) {
|
if (net_init_clients() < 0) {
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
@ -4014,7 +4017,6 @@ int main(int argc, char **argv, char **envp)
|
|||||||
main_loop();
|
main_loop();
|
||||||
bdrv_close_all();
|
bdrv_close_all();
|
||||||
pause_all_vcpus();
|
pause_all_vcpus();
|
||||||
net_cleanup();
|
|
||||||
res_free();
|
res_free();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user