aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPyun YongHyeon <yongari@FreeBSD.org>2011-01-20 17:42:42 +0000
committerPyun YongHyeon <yongari@FreeBSD.org>2011-01-20 17:42:42 +0000
commit189a84e4fc7128c593e6a243c718e6d4dff7b1aa (patch)
tree24098156b2672c84244f2512670cc9f457b8404f
parentda25f0a64cf9f1551aef2a4a4075cee3b3065464 (diff)
downloadsrc-189a84e4fc7128c593e6a243c718e6d4dff7b1aa.tar.gz
src-189a84e4fc7128c593e6a243c718e6d4dff7b1aa.zip
MFC r217296:
For re(4) controllers that uses new jumbo frame scheme(RTL8168C/D/E), limit maximum RX buffer size to RE_RX_DESC_BUFLEN instead of blindly configuring it to 16KB. Due to lack of documentation, re(4) didn't allow jumbo frame on these controllers. However it seems controller is confused with jumbo frame such that it can DMA the received frame to wrong address instead of splitting it into multiple RX buffers. Of course, this caused panic. Since re(4) does not support jumbo frames on these controllers, make controller drop frame that is longer than RE_RX_DESC_BUFLEN sized frame. Fortunately RTL810x controllers, which do not support jumbo frame, have no such issues but this change also limited maximum RX buffer size allowed to RTL810x controllers. Allowing 16KB RX buffer for controllers that have no such capability is meaningless. Approved by: re (bz)
Notes
Notes: svn path=/releng/7.4/; revision=217648
-rw-r--r--sys/dev/re/if_re.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/sys/dev/re/if_re.c b/sys/dev/re/if_re.c
index 327dfc088e00..a6ebda10b041 100644
--- a/sys/dev/re/if_re.c
+++ b/sys/dev/re/if_re.c
@@ -2773,8 +2773,13 @@ re_init_locked(struct rl_softc *sc)
* For 8169 gigE NICs, set the max allowed RX packet
* size so we can receive jumbo frames.
*/
- if (sc->rl_type == RL_8169)
- CSR_WRITE_2(sc, RL_MAXRXPKTLEN, 16383);
+ if (sc->rl_type == RL_8169) {
+ if ((sc->rl_flags & (RL_FLAG_PCIE | RL_FLAG_NOJUMBO)) ==
+ (RL_FLAG_PCIE | RL_FLAG_NOJUMBO))
+ CSR_WRITE_2(sc, RL_MAXRXPKTLEN, RE_RX_DESC_BUFLEN);
+ else
+ CSR_WRITE_2(sc, RL_MAXRXPKTLEN, 16383);
+ }
if (sc->rl_testmode)
return;