On 07/08/2011 02:56 PM, Stefan Sperling wrote:
> On Mon, Jun 27, 2011 at 09:31:26AM +0000, Thomas Gerlach wrote:
>> Tobias Ulmer <tobiasu <at> tmux.org> writes:
>>
>>> I've lost track which patches need to be applied or not, but once a
>>> complete patch appears, I'm willing to test it on a machine that has
>>> three different xl's.
>>>
>>>
>>
>> hi tobias,
>>
>> sorry for any confusion. i think, the recent patches that should work are the
>> following:
> After spending some time with xl hardware, I fixed several issues and
> got WOL to work even without the tiny WOL cable I thought was required.
> It seems to send the signal via the PME pin on the PCI connector.
>
> This diff works fine for me, against -current. Testing and OKs welcome.
>
> Index: ic/xl.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/ic/xl.c,v
> retrieving revision 1.102
> diff -u -p -r1.102 xl.c
> --- ic/xl.c   21 Jun 2011 16:52:45 -0000      1.102
> +++ ic/xl.c   8 Jul 2011 12:46:21 -0000
> @@ -193,6 +193,7 @@ void xl_miibus_writereg(struct device *,
>  void xl_miibus_statchg(struct device *);
>  #ifndef SMALL_KERNEL
>  int xl_wol(struct ifnet *, int);
> +void xl_wol_power(struct xl_softc *);
>  #endif
>  
>  int
> @@ -204,6 +205,9 @@ xl_activate(struct device *self, int act
>  
>       switch (act) {
>       case DVACT_QUIESCE:
> +#ifndef SMALL_KERNEL
> +             xl_wol_power(sc);
> +#endif
>               rv = config_activate_children(self, act);
>               break;
>       case DVACT_SUSPEND:
> @@ -2371,11 +2375,22 @@ xl_stop(struct xl_softc *sc)
>       xl_freetxrx(sc);
>  
>  #ifndef SMALL_KERNEL
> -     /* Call upper layer WOL power routine if WOL is enabled. */
> -     if ((sc->xl_flags & XL_FLAG_WOL) && sc->wol_power)
> -             sc->wol_power(sc->wol_power_arg);
> +     xl_wol_power(sc);
>  #endif
>  }
> +
> +#ifndef SMALL_KERNEL
> +void
> +xl_wol_power(struct xl_softc *sc)
> +{
> +     /* Re-enable RX and call upper layer WOL power routine
> +      * if WOL is enabled. */
> +     if ((sc->xl_flags & XL_FLAG_WOL) && sc->wol_power) {
> +             CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_RX_ENABLE);
> +             sc->wol_power(sc->wol_power_arg);
> +     }
> +}
> +#endif
>  
>  void
>  xl_attach(struct xl_softc *sc)
> Index: pci/if_xl_pci.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_xl_pci.c,v
> retrieving revision 1.36
> diff -u -p -r1.36 if_xl_pci.c
> --- pci/if_xl_pci.c   17 Apr 2011 20:52:43 -0000      1.36
> +++ pci/if_xl_pci.c   8 Jul 2011 12:49:22 -0000
> @@ -273,7 +273,7 @@ xl_pci_attach(struct device *parent, str
>                * PCI power state for WOL. It will be invoked when the
>                * interface stops and WOL was enabled. */
>               command = pci_conf_read(pc, pa->pa_tag, XL_PCI_PWRMGMTCAP);
> -             if (command & XL_PME_CAP_D3_HOT) {
> +             if ((command >> 16) & XL_PME_CAP_D3_HOT) {
>                       sc->wol_power = xl_pci_wol_power;
>                       sc->wol_power_arg = psc; 
>               }
> @@ -365,13 +365,8 @@ xl_pci_intr_ack(struct xl_softc *sc)
>  void
>  xl_pci_wol_power(void *ppsc)
>  {
> -     u_int32_t       command;
>       struct xl_pci_softc *psc = (struct xl_pci_softc*)ppsc;
>  
> -     /* Make sure power management is enabled, and set the card into
> -      * D3hot power state so it stays active after system shutdown. */
> -     command = pci_conf_read(psc->psc_pc, psc->psc_tag, XL_PCI_PWRMGMTCTRL);
> -     command |= XL_PME_EN | XL_PSTATE_D3;
> -     pci_conf_write(psc->psc_pc, psc->psc_tag, XL_PCI_PWRMGMTCTRL, command);
> +     pci_set_powerstate(psc->psc_pc, psc->psc_tag, PCI_PMCSR_STATE_D3);
>  }
>  #endif
>
>

hi stefan,

nice work! i can confirm it working on my box. :)
haven't spend any thoughts on it for quite a time, since it also worked
with your previous patches. but this seems more like the linux way,
using "pci_set_powerstate".

however, there's still the following problem:
if wol is enabled via /etc/hostname.xl0 (by adding the wol keyword),
it's not possible to log into the system, since the error messages "xl0:
transmission error: ff" and "xl0: command never completed" are thrown
out all the time.

a workaround to enable wol during startup is using /etc/rc.local by
adding the line "ifconfig xl0 wol".

anyway, thanks again for this quite nice solution. :)


cheers,

thomas

Reply via email to