For RTL8139C+ controllers, have controller handle padding short
checksum offload frames. Software workaround used for broken controllers(RTL8169, RTL8168, RTL8168B) seem to cause watchdog timeouts on RTL8139C+. Introduce a new flag RL_FLAG_AUTOPAD to mark automatic padding feature of controller and set it for RTL8139C+ and controllers that use new descriptor format. This fixes watchdog timeouts seen on RTL8139C+. Reported by: Dimitri Rodis < DimitriR <> integritasystems dot com > Tested by: Dimitri Rodis < DimitriR <> integritasystems dot com >
This commit is contained in:
parent
53ec7b000f
commit
77dde87e61
@ -1250,7 +1250,8 @@ re_attach(device_t dev)
|
||||
|
||||
switch (hw_rev->rl_rev) {
|
||||
case RL_HWREV_8139CPLUS:
|
||||
sc->rl_flags |= RL_FLAG_NOJUMBO | RL_FLAG_FASTETHER;
|
||||
sc->rl_flags |= RL_FLAG_NOJUMBO | RL_FLAG_FASTETHER |
|
||||
RL_FLAG_AUTOPAD;
|
||||
break;
|
||||
case RL_HWREV_8100E:
|
||||
case RL_HWREV_8101E:
|
||||
@ -1261,7 +1262,7 @@ re_attach(device_t dev)
|
||||
case RL_HWREV_8102EL:
|
||||
sc->rl_flags |= RL_FLAG_NOJUMBO | RL_FLAG_PHYWAKE |
|
||||
RL_FLAG_PAR | RL_FLAG_DESCV2 | RL_FLAG_MACSTAT |
|
||||
RL_FLAG_FASTETHER | RL_FLAG_CMDSTOP;
|
||||
RL_FLAG_FASTETHER | RL_FLAG_CMDSTOP | RL_FLAG_AUTOPAD;
|
||||
break;
|
||||
case RL_HWREV_8168_SPIN1:
|
||||
case RL_HWREV_8168_SPIN2:
|
||||
@ -1280,7 +1281,8 @@ re_attach(device_t dev)
|
||||
case RL_HWREV_8168CP:
|
||||
case RL_HWREV_8168D:
|
||||
sc->rl_flags |= RL_FLAG_PHYWAKE | RL_FLAG_PAR |
|
||||
RL_FLAG_DESCV2 | RL_FLAG_MACSTAT | RL_FLAG_CMDSTOP;
|
||||
RL_FLAG_DESCV2 | RL_FLAG_MACSTAT | RL_FLAG_CMDSTOP |
|
||||
RL_FLAG_AUTOPAD;
|
||||
/*
|
||||
* These controllers support jumbo frame but it seems
|
||||
* that enabling it requires touching additional magic
|
||||
@ -2250,7 +2252,7 @@ re_encap(struct rl_softc *sc, struct mbuf **m_head)
|
||||
* offload is enabled, we always manually pad short frames out
|
||||
* to the minimum ethernet frame size.
|
||||
*/
|
||||
if ((sc->rl_flags & RL_FLAG_DESCV2) == 0 &&
|
||||
if ((sc->rl_flags & RL_FLAG_AUTOPAD) == 0 &&
|
||||
(*m_head)->m_pkthdr.len < RL_IP4CSUMTX_PADLEN &&
|
||||
((*m_head)->m_pkthdr.csum_flags & CSUM_IP) != 0) {
|
||||
padlen = RL_MIN_FRAMELEN - (*m_head)->m_pkthdr.len;
|
||||
|
@ -880,6 +880,7 @@ struct rl_softc {
|
||||
int rl_txstart;
|
||||
uint32_t rl_flags;
|
||||
#define RL_FLAG_MSI 0x0001
|
||||
#define RL_FLAG_AUTOPAD 0x0002
|
||||
#define RL_FLAG_PHYWAKE 0x0008
|
||||
#define RL_FLAG_NOJUMBO 0x0010
|
||||
#define RL_FLAG_PAR 0x0020
|
||||
|
Loading…
Reference in New Issue
Block a user