On Tue, Sep 02, 2014 at 07:20:30AM -0400, Brad Smith wrote:
> On Tue, Sep 02, 2014 at 06:28:48AM -0400, Brad Smith wrote:
> > Add some feature flags and store in the softc the various max Jumbo frame
> > sizes
> > for the different generations of chips. No behavioral change.
> >
> > Tested with..
> >
> > re0 at pci2 dev 0 function 0 "Realtek 8168" rev 0x03: RTL8168D/8111D
> > (0x2800)
> > re0 at pci2 dev 0 function 0 "Realtek 8168" rev 0x0c: RTL8168G/8111G
> > (0x4c00)
> >
> > OK?
>
> Fix a typo with RL_FLAG_HWIM.
Why not leave the assignment of sc_hwrev in re.c and stash the product
as sc_product or some such?
> case RL_HWREV_8168C:
> case RL_HWREV_8168CP:
> - case RL_HWREV_8168DP:
> - sc->rl_flags |= RL_FLAG_INVMAR | RL_FLAG_PHYWAKE |
> - RL_FLAG_PAR | RL_FLAG_DESCV2 | RL_FLAG_MACSTAT |
> - RL_FLAG_HWIM | RL_FLAG_CMDSTOP | RL_FLAG_AUTOPAD;
> - /*
> - * These controllers support jumbo frame but it seems
> - * that enabling it requires touching additional magic
> - * registers. Depending on MAC revisions some
> - * controllers need to disable checksum offload. So
> - * disable jumbo frame until I have better idea what
> - * it really requires to make it support.
> - * RTL8168C/CP : supports up to 6KB jumbo frame.
> - * RTL8111C/CP : supports up to 9KB jumbo frame.
> - */
> - sc->rl_flags |= RL_FLAG_NOJUMBO;
> + sc->rl_flags |= RL_FLAG_PHYWAKE | RL_FLAG_PAR |
> + RL_FLAG_DESCV2 | RL_FLAG_MACSTAT | RL_FLAG_CMDSTOP |
> + RL_FLAG_AUTOPAD | RL_FLAG_JUMBOV2 | RL_FLAG_WOL_MANLINK;
> + sc->rl_max_mtu = RL_JUMBO_MTU_6K;
> break;
Assuming the goal is the sync these flags with the FreeBSD driver this
misses:
case RL_HWREV_8168C:
if (sc->rl_macrev == 0x00200000)
sc->rl_flags |= RL_FLAG_MACSLEEP;
/* FALLTHROUGH */
case RL_HWREV_8168CP:
macrev is not sc_hwrev but is read from the same RL_TXCFG register
with a different mask (0x00700000).
The other flags and jumbo values all seem to match FreeBSD
from a quick comparison.
> @@ -957,8 +981,8 @@ re_attach(struct rl_softc *sc, const cha
> ifp->if_ioctl = re_ioctl;
> ifp->if_start = re_start;
> ifp->if_watchdog = re_watchdog;
> - if ((sc->rl_flags & RL_FLAG_NOJUMBO) == 0)
> - ifp->if_hardmtu = RL_JUMBO_MTU;
> + if ((sc->rl_flags & RL_FLAG_JUMBOV2) == 0)
> + ifp->if_hardmtu = sc->rl_max_mtu;
> IFQ_SET_MAXLEN(&ifp->if_snd, RL_TX_QLEN);
> IFQ_SET_READY(&ifp->if_snd);
>
Anything with RL_FLAG_JUMBOV2 won't do jumbos, because
the relevant code for this isn't there at the moment?