Author: edavis Date: Mon Dec 30 23:02:26 2013 New Revision: 260113 URL: http://svnweb.freebsd.org/changeset/base/260113
Log: For TSO, when the first mbuf contains both the packet header and data, the header is split out into its own BD for processing by the firmware. When this split occurred the data length in the BD was not being set correctly resulting in packet corruption. Approved by: davidcd (mentor) Modified: head/sys/dev/bxe/bxe.c head/sys/dev/bxe/ecore_sp.c Modified: head/sys/dev/bxe/bxe.c ============================================================================== --- head/sys/dev/bxe/bxe.c Mon Dec 30 22:17:33 2013 (r260112) +++ head/sys/dev/bxe/bxe.c Mon Dec 30 23:02:26 2013 (r260113) @@ -34,7 +34,7 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); -#define BXE_DRIVER_VERSION "1.78.75" +#define BXE_DRIVER_VERSION "1.78.76" #include "bxe.h" #include "ecore_sp.h" @@ -5004,6 +5004,7 @@ bxe_dump_mbuf(struct bxe_softc *sc, uint8_t contents) { char * type; + int i = 0; if (!(sc->debug & DBG_MBUF)) { return; @@ -5016,28 +5017,21 @@ bxe_dump_mbuf(struct bxe_softc *sc, while (m) { BLOGD(sc, DBG_MBUF, - "mbuf=%p m_len=%d m_flags=0x%b m_data=%p\n", - m, m->m_len, m->m_flags, - "\20\1M_EXT\2M_PKTHDR\3M_EOR\4M_RDONLY", m->m_data); + "%02d: mbuf=%p m_len=%d m_flags=0x%b m_data=%p\n", + i, m, m->m_len, m->m_flags, M_FLAG_BITS, m->m_data); if (m->m_flags & M_PKTHDR) { BLOGD(sc, DBG_MBUF, - "- m_pkthdr: len=%d flags=0x%b csum_flags=%b\n", - m->m_pkthdr.len, m->m_flags, - "\20\12M_BCAST\13M_MCAST\14M_FRAG" - "\15M_FIRSTFRAG\16M_LASTFRAG\21M_VLANTAG" - "\22M_PROMISC\23M_NOFREE", - (int)m->m_pkthdr.csum_flags, - "\20\1CSUM_IP\2CSUM_TCP\3CSUM_UDP\4CSUM_IP_FRAGS" - "\5CSUM_FRAGMENT\6CSUM_TSO\11CSUM_IP_CHECKED" - "\12CSUM_IP_VALID\13CSUM_DATA_VALID" - "\14CSUM_PSEUDO_HDR"); + "%02d: - m_pkthdr: tot_len=%d flags=0x%b csum_flags=%b\n", + i, m->m_pkthdr.len, m->m_flags, M_FLAG_BITS, + (int)m->m_pkthdr.csum_flags, CSUM_BITS); } if (m->m_flags & M_EXT) { switch (m->m_ext.ext_type) { case EXT_CLUSTER: type = "EXT_CLUSTER"; break; case EXT_SFBUF: type = "EXT_SFBUF"; break; + case EXT_JUMBOP: type = "EXT_JUMBOP"; break; case EXT_JUMBO9: type = "EXT_JUMBO9"; break; case EXT_JUMBO16: type = "EXT_JUMBO16"; break; case EXT_PACKET: type = "EXT_PACKET"; break; @@ -5050,8 +5044,8 @@ bxe_dump_mbuf(struct bxe_softc *sc, } BLOGD(sc, DBG_MBUF, - "- m_ext: %p ext_size=%d, type=%s\n", - m->m_ext.ext_buf, m->m_ext.ext_size, type); + "%02d: - m_ext: %p ext_size=%d type=%s\n", + i, m->m_ext.ext_buf, m->m_ext.ext_size, type); } if (contents) { @@ -5059,6 +5053,7 @@ bxe_dump_mbuf(struct bxe_softc *sc, } m = m->m_next; + i++; } } @@ -5669,6 +5664,7 @@ bxe_tx_encap_continue: /* split the first BD into header/data making the fw job easy */ nbds++; tx_start_bd->nbd = htole16(nbds); + tx_start_bd->nbytes = htole16(hlen); bd_prod = TX_BD_NEXT(bd_prod); Modified: head/sys/dev/bxe/ecore_sp.c ============================================================================== --- head/sys/dev/bxe/ecore_sp.c Mon Dec 30 22:17:33 2013 (r260112) +++ head/sys/dev/bxe/ecore_sp.c Mon Dec 30 23:02:26 2013 (r260113) @@ -4264,7 +4264,7 @@ void ecore_init_mac_credit_pool(struct b if (!CHIP_REV_IS_SLOW(sc)) cam_sz = (MAX_MAC_CREDIT_E2 - GET_NUM_VFS_PER_PATH(sc)) - / func_num + / func_num + GET_NUM_VFS_PER_PF(sc); else cam_sz = ECORE_CAM_SIZE_EMUL; @@ -4443,8 +4443,11 @@ int ecore_config_rss(struct bxe_softc *s struct ecore_raw_obj *r = &o->raw; /* Do nothing if only driver cleanup was requested */ - if (ECORE_TEST_BIT(RAMROD_DRV_CLR_ONLY, &p->ramrod_flags)) + if (ECORE_TEST_BIT(RAMROD_DRV_CLR_ONLY, &p->ramrod_flags)) { + ECORE_MSG(sc, "Not configuring RSS ramrod_flags=%lx\n", + p->ramrod_flags); return ECORE_SUCCESS; + } r->set_pending(r); _______________________________________________ svn-src-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-src-all To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"