Skip to content
  • Bjørn Mork's avatar
    d4044c2a
    e1000: use MII status register for link up/down · d4044c2a
    Bjørn Mork authored
    
    
    Some guests will use the standard MII status register
    to verify link state.  They will not notice link changes
    unless this register is updated.
    
    Verified with Linux 3.0 and Windows XP guests.
    
    Without this patch, ethtool will report speed and duplex as
    unknown when the link is down, but still report the link as
    up.  This is because the Linux e1000 driver checks the
    mac_reg[STATUS] register link state before it checks speed
    and duplex, but uses the phy_reg[PHY_STATUS] register for
    the actual link state check.  Fix by updating both registers
    on link state changes.
    
    Linux guest before:
    
     (qemu) set_link e1000.0 off
    
     kvm-sid:~# ethtool eth0
     Settings for eth0:
            Supported ports: [ TP ]
            Supported link modes:   10baseT/Half 10baseT/Full
                                    100baseT/Half 100baseT/Full
                                    1000baseT/Full
            Supports auto-negotiation: Yes
            Advertised link modes:  10baseT/Half 10baseT/Full
                                    100baseT/Half 100baseT/Full
                                    1000baseT/Full
            Advertised pause frame use: No
            Advertised auto-negotiation: Yes
            Speed: Unknown!
            Duplex: Unknown! (255)
            Port: Twisted Pair
            PHYAD: 0
            Transceiver: internal
            Auto-negotiation: on
            MDI-X: Unknown
            Supports Wake-on: umbg
            Wake-on: d
            Current message level: 0x00000007 (7)
                                   drv probe link
            Link detected: yes
    
     (qemu) set_link e1000.0 on
    
    Linux guest after:
    
     (qemu) set_link e1000.0 off
     [   63.384221] e1000: eth0 NIC Link is Down
    
     kvm-sid:~# ethtool eth0
     Settings for eth0:
            Supported ports: [ TP ]
            Supported link modes:   10baseT/Half 10baseT/Full
                                    100baseT/Half 100baseT/Full
                                    1000baseT/Full
            Supports auto-negotiation: Yes
            Advertised link modes:  10baseT/Half 10baseT/Full
                                    100baseT/Half 100baseT/Full
                                    1000baseT/Full
            Advertised pause frame use: No
            Advertised auto-negotiation: Yes
            Speed: Unknown!
            Duplex: Unknown! (255)
            Port: Twisted Pair
            PHYAD: 0
            Transceiver: internal
            Auto-negotiation: on
            MDI-X: Unknown
            Supports Wake-on: umbg
            Wake-on: d
            Current message level: 0x00000007 (7)
                                   drv probe link
            Link detected: no
    
     (qemu) set_link e1000.0 on
     [   84.304582] e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
    
    Signed-off-by: default avatarBjørn Mork <bjorn@mork.no>
    Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
    d4044c2a
    e1000: use MII status register for link up/down
    Bjørn Mork authored
    
    
    Some guests will use the standard MII status register
    to verify link state.  They will not notice link changes
    unless this register is updated.
    
    Verified with Linux 3.0 and Windows XP guests.
    
    Without this patch, ethtool will report speed and duplex as
    unknown when the link is down, but still report the link as
    up.  This is because the Linux e1000 driver checks the
    mac_reg[STATUS] register link state before it checks speed
    and duplex, but uses the phy_reg[PHY_STATUS] register for
    the actual link state check.  Fix by updating both registers
    on link state changes.
    
    Linux guest before:
    
     (qemu) set_link e1000.0 off
    
     kvm-sid:~# ethtool eth0
     Settings for eth0:
            Supported ports: [ TP ]
            Supported link modes:   10baseT/Half 10baseT/Full
                                    100baseT/Half 100baseT/Full
                                    1000baseT/Full
            Supports auto-negotiation: Yes
            Advertised link modes:  10baseT/Half 10baseT/Full
                                    100baseT/Half 100baseT/Full
                                    1000baseT/Full
            Advertised pause frame use: No
            Advertised auto-negotiation: Yes
            Speed: Unknown!
            Duplex: Unknown! (255)
            Port: Twisted Pair
            PHYAD: 0
            Transceiver: internal
            Auto-negotiation: on
            MDI-X: Unknown
            Supports Wake-on: umbg
            Wake-on: d
            Current message level: 0x00000007 (7)
                                   drv probe link
            Link detected: yes
    
     (qemu) set_link e1000.0 on
    
    Linux guest after:
    
     (qemu) set_link e1000.0 off
     [   63.384221] e1000: eth0 NIC Link is Down
    
     kvm-sid:~# ethtool eth0
     Settings for eth0:
            Supported ports: [ TP ]
            Supported link modes:   10baseT/Half 10baseT/Full
                                    100baseT/Half 100baseT/Full
                                    1000baseT/Full
            Supports auto-negotiation: Yes
            Advertised link modes:  10baseT/Half 10baseT/Full
                                    100baseT/Half 100baseT/Full
                                    1000baseT/Full
            Advertised pause frame use: No
            Advertised auto-negotiation: Yes
            Speed: Unknown!
            Duplex: Unknown! (255)
            Port: Twisted Pair
            PHYAD: 0
            Transceiver: internal
            Auto-negotiation: on
            MDI-X: Unknown
            Supports Wake-on: umbg
            Wake-on: d
            Current message level: 0x00000007 (7)
                                   drv probe link
            Link detected: no
    
     (qemu) set_link e1000.0 on
     [   84.304582] e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX
    
    Signed-off-by: default avatarBjørn Mork <bjorn@mork.no>
    Signed-off-by: default avatarAnthony Liguori <aliguori@us.ibm.com>
Loading