The number of bits reserved for MSS in RealTek controllers is

11bits. This limits the maximum interface MTU size in TSO case
as upper stack should not generate TCP segments with MSS greater
than the limit. Armed with this information, disable TSO if
interface MTU is greater than the limit.
This commit is contained in:
Pyun YongHyeon 2008-08-04 02:05:09 +00:00
parent f9bcf9cabf
commit ae64408754
2 changed files with 26 additions and 0 deletions

View File

@ -2543,6 +2543,14 @@ re_init_locked(sc)
} else
cfg |= RL_CPLUSCMD_RXENB | RL_CPLUSCMD_TXENB;
CSR_WRITE_2(sc, RL_CPLUS_CMD, cfg);
/*
* Disable TSO if interface MTU size is greater than MSS
* allowed in controller.
*/
if (ifp->if_mtu > RL_TSO_MTU && (ifp->if_capenable & IFCAP_TSO4) != 0) {
ifp->if_capenable &= ~IFCAP_TSO4;
ifp->if_hwassist &= ~CSUM_TSO;
}
/*
* Init our MAC address. Even though the chipset
@ -2754,6 +2762,11 @@ re_ioctl(ifp, command, data)
RL_LOCK(sc);
if (ifp->if_mtu != ifr->ifr_mtu)
ifp->if_mtu = ifr->ifr_mtu;
if (ifp->if_mtu > RL_TSO_MTU &&
(ifp->if_capenable & IFCAP_TSO4) != 0) {
ifp->if_capenable &= ~IFCAP_TSO4;
ifp->if_hwassist &= ~CSUM_TSO;
}
RL_UNLOCK(sc);
break;
case SIOCSIFFLAGS:
@ -2829,6 +2842,11 @@ re_ioctl(ifp, command, data)
ifp->if_hwassist |= CSUM_TSO;
else
ifp->if_hwassist &= ~CSUM_TSO;
if (ifp->if_mtu > RL_TSO_MTU &&
(ifp->if_capenable & IFCAP_TSO4) != 0) {
ifp->if_capenable &= ~IFCAP_TSO4;
ifp->if_hwassist &= ~CSUM_TSO;
}
}
if ((mask & IFCAP_WOL) != 0 &&
(ifp->if_capabilities & IFCAP_WOL) != 0) {

View File

@ -750,6 +750,14 @@ struct rl_stats {
#define RL_ADDR_LO(y) ((uint64_t) (y) & 0xFFFFFFFF)
#define RL_ADDR_HI(y) ((uint64_t) (y) >> 32)
/*
* The number of bits reserved for MSS in RealTek controllers is
* 11bits. This limits the maximum interface MTU size in TSO case
* as upper stack should not generate TCP segments with MSS greater
* than the limit.
*/
#define RL_TSO_MTU (2047 - ETHER_HDR_LEN - ETHER_CRC_LEN)
/* see comment in dev/re/if_re.c */
#define RL_JUMBO_FRAMELEN 7440
#define RL_JUMBO_MTU (RL_JUMBO_FRAMELEN-ETHER_HDR_LEN-ETHER_CRC_LEN)