summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authoryongari <yongari@FreeBSD.org>2008-03-31 04:03:14 +0000
committeryongari <yongari@FreeBSD.org>2008-03-31 04:03:14 +0000
commit55186b0e3685bd19b93b14cf66c501fc38f93de8 (patch)
tree4334bd2b69e160956c1861614d964d3ee270fead /sys
parent220584ad617584465109eaf92dc3be4fc99a9bda (diff)
downloadFreeBSD-src-55186b0e3685bd19b93b14cf66c501fc38f93de8.zip
FreeBSD-src-55186b0e3685bd19b93b14cf66c501fc38f93de8.tar.gz
Padding more bytes than necessary one broke another variants of
PCIe RealTek chips. Only pad IP packets if the payload is less than 28 bytes. Obtained from: NetBSD PR: kern/122221
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/re/if_re.c2
-rw-r--r--sys/pci/if_rlreg.h6
2 files changed, 7 insertions, 1 deletions
diff --git a/sys/dev/re/if_re.c b/sys/dev/re/if_re.c
index a4527a6..d81e4d6 100644
--- a/sys/dev/re/if_re.c
+++ b/sys/dev/re/if_re.c
@@ -2171,7 +2171,7 @@ re_encap(sc, m_head)
* offload is enabled, we always manually pad short frames out
* to the minimum ethernet frame size.
*/
- if ((*m_head)->m_pkthdr.len < RL_MIN_FRAMELEN &&
+ if ((*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;
if (M_WRITABLE(*m_head) == 0) {
diff --git a/sys/pci/if_rlreg.h b/sys/pci/if_rlreg.h
index 7e86689..5038666 100644
--- a/sys/pci/if_rlreg.h
+++ b/sys/pci/if_rlreg.h
@@ -497,6 +497,12 @@
#define RL_ETHER_ALIGN 2
+/*
+ * re(4) hardware ip4csum-tx could be mangled with 28 bytes or less IP packets.
+ */
+#define RL_IP4CSUMTX_MINLEN 28
+#define RL_IP4CSUMTX_PADLEN (ETHER_HDR_LEN + RL_IP4CSUMTX_MINLEN)
+
struct rl_chain_data {
uint16_t cur_rx;
uint8_t *rl_rx_buf;
OpenPOWER on IntegriCloud