Commit c3dd94b1 authored by Anthony Liguori's avatar Anthony Liguori
Browse files

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: default avatarAnthony Liguori <aliguori@us.ibm.com>
parents da1a4cef 83f58e57
Loading
Loading
Loading
Loading
+10 −2
Original line number Original line Diff line number Diff line
@@ -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;
    }
    }
+2 −1
Original line number Original line Diff line number Diff line
@@ -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 */
+3 −1
Original line number Original line Diff line number Diff line
@@ -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;