On Saturday 25 July 2009 07:14:42 Brad wrote:
> Please test the following diff which adds flow control support
> with any gem(4) adapter.
>
> Please provide a dmesg and "ifconfig gemX" output.

This should work with gem(4) using PHY such as brgphy(4), eephy(4), luphy(4),
and possibly bmtphy(4) or fibre adapters with gentbi(4). lxtphy(4) PHY and 
ukphy(4) with an OUI of 0010dd model 2 (Enable Semiconductor PHY) will not.


> Index: gem.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/ic/gem.c,v
> retrieving revision 1.92
> diff -u -p -r1.92 gem.c
> --- gem.c     18 Jul 2009 14:42:47 -0000      1.92
> +++ gem.c     25 Jul 2009 10:22:23 -0000
> @@ -134,7 +134,7 @@ gem_config(struct gem_softc *sc)
>       struct ifnet *ifp = &sc->sc_arpcom.ac_if;
>       struct mii_data *mii = &sc->sc_mii;
>       struct mii_softc *child;
> -     int i, error, phyad;
> +     int i, error, mii_flags, phyad;
>       struct ifmedia_entry *ifm;
>
>       /* Make sure the chip is stopped. */
> @@ -248,6 +248,8 @@ gem_config(struct gem_softc *sc)
>
>       gem_mifinit(sc);
>
> +     mii_flags = MIIF_DOPAUSE;
> +
>       /*
>        * Look for an external PHY.
>        */
> @@ -266,7 +268,7 @@ gem_config(struct gem_softc *sc)
>               }
>
>               mii_attach(&sc->sc_dev, mii, 0xffffffff, phyad,
> -                 MII_OFFSET_ANY, 0);
> +                 MII_OFFSET_ANY, mii_flags);
>       }
>
>       /*
> @@ -292,7 +294,7 @@ gem_config(struct gem_softc *sc)
>               }
>
>               mii_attach(&sc->sc_dev, mii, 0xffffffff, phyad,
> -                 MII_OFFSET_ANY, 0);
> +                 MII_OFFSET_ANY, mii_flags);
>       }
>
>       /*
> @@ -314,8 +316,10 @@ gem_config(struct gem_softc *sc)
>               mii->mii_readreg = gem_pcs_readreg;
>               mii->mii_writereg = gem_pcs_writereg;
>
> +             mii_flags |= MIIF_NOISOLATE;
> +
>               mii_attach(&sc->sc_dev, mii, 0xffffffff, MII_PHY_ANY,
> -                 MII_OFFSET_ANY, MIIF_NOISOLATE);
> +                 MII_OFFSET_ANY, mii_flags);
>       }
>
>       child = LIST_FIRST(&mii->mii_phys);
> @@ -873,8 +877,8 @@ gem_init_regs(struct gem_softc *sc)
>       bus_space_write_4(t, h, GEM_MAC_RX_CRC_ERR_CNT, 0);
>       bus_space_write_4(t, h, GEM_MAC_RX_CODE_VIOL, 0);
>
> -     /* Un-pause stuff */
> -     bus_space_write_4(t, h, GEM_MAC_SEND_PAUSE_CMD, 0);
> +     /* Set XOFF PAUSE time */
> +     bus_space_write_4(t, h, GEM_MAC_SEND_PAUSE_CMD, 0x1BF0);
>
>       /*
>        * Set the internal arbitration to "infinite" bursts of the
> @@ -1331,6 +1335,17 @@ gem_mii_statchg(struct device *dev)
>               v &= ~GEM_MAC_XIF_GMII_MODE;
>       }
>       bus_space_write_4(t, mac, GEM_MAC_XIF_CONFIG, v);
> +
> +     /*
> +      * 802.3x flow control
> +      */
> +     v = bus_space_read_4(t, mac, GEM_MAC_CONTROL_CONFIG);
> +     v &= ~(GEM_MAC_CC_RX_PAUSE | GEM_MAC_CC_TX_PAUSE);
> +     if ((IFM_OPTIONS(sc->sc_mii.mii_media_active) & IFM_ETH_RXPAUSE) != 0)
> +             v |= GEM_MAC_CC_RX_PAUSE;
> +     if ((IFM_OPTIONS(sc->sc_mii.mii_media_active) & IFM_ETH_TXPAUSE) != 0)
> +             v |= GEM_MAC_CC_TX_PAUSE;
> +     bus_space_write_4(t, mac, GEM_MAC_CONTROL_CONFIG, v);
>  }
>
>  int

-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.

Reply via email to