qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v1] e1000: initial link negotiation on mac osx


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH v1] e1000: initial link negotiation on mac osx
Date: Thu, 07 Nov 2013 20:28:47 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:17.0) Gecko/20130923 Thunderbird/17.0.9

Il 07/11/2013 19:04, Gabriel L. Somlo ha scritto:
> Some guest operating systems' drivers (particularly Mac OS X)
> expect the link state to be pre-initialized by an earlier
> component such as a proprietary BIOS. This patch injects an
> additional LSC event upon PHY reset, allowing the OS X driver
> to successfully complete initial link negotiation. This is a
> follow-up to commit 372254c6e5c078fb13b236bb648d2b9b2b0c70f1,
> which works around the OS X driver's failure to properly set
> up the MAC address.
> 
> Signed-off-by: Gabriel Somlo <address@hidden>
> ---
> 
> I studied the Intel 8254xxx manual and the various earlier
> suggestions, and came up with the following, which both works
> (at least for me, using SnowLeopard) and also appears to make
> sense from a "code flow" point of view. Please let me know
> what you all think.
> 
> Thanks,
>   Gabriel
> 
>  hw/net/e1000.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
> 
> diff --git a/hw/net/e1000.c b/hw/net/e1000.c
> index ec8ecd7..2f2fc3a 100644
> --- a/hw/net/e1000.c
> +++ b/hw/net/e1000.c
> @@ -186,6 +186,9 @@ e1000_link_up(E1000State *s)
>      s->phy_reg[PHY_STATUS] |= MII_SR_LINK_STATUS;
>  }
>  
> +/* Forward decl. for use in set_phy_ctrl() (OS X link nego. workaround) */
> +static void set_ics(E1000State *s, int index, uint32_t val);
> +
>  static void
>  set_phy_ctrl(E1000State *s, int index, uint16_t val)
>  {
> @@ -197,6 +200,15 @@ set_phy_ctrl(E1000State *s, int index, uint16_t val)
>      if (!(s->compat_flags & E1000_FLAG_AUTONEG)) {
>          return;
>      }
> +    /*
> +     * The Mac OS X driver expects a pre-initialized network card; injecting
> +     * an extra LSC event here allows initial link negotiation to succeed in
> +     * the absence of the Apple EFI BIOS.
> +     */
> +    if ((val & MII_CR_RESET)) {
> +        set_ics(s, 0, E1000_ICR_LSC);
> +        return;
> +    }
>      if ((val & MII_CR_AUTO_NEG_EN) && (val & MII_CR_RESTART_AUTO_NEG)) {
>          e1000_link_down(s);
>          s->phy_reg[PHY_STATUS] &= ~MII_SR_AUTONEG_COMPLETE;
> 

Is there any way to work around this in the guest?  Such as using a UEFI
driver for e1000 or something like that.

Paolo



reply via email to

[Prev in Thread] Current Thread [Next in Thread]