From f4b2f222a2d0b985deb43089aa8454bbaac3ce8d Mon Sep 17 00:00:00 2001 From: edavis Date: Tue, 7 Jan 2014 23:20:21 +0000 Subject: [PATCH] Merged r260415 from head. Approved by: davidcd git-svn-id: svn://svn.freebsd.org/base/stable/9@260425 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- sys/dev/bxe/bxe.c | 29 +++++++++++++++++++++++++---- sys/dev/bxe/ecore_hsi.h | 7 +++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/sys/dev/bxe/bxe.c b/sys/dev/bxe/bxe.c index 0e3b0db5e..0f31d4a0e 100644 --- a/sys/dev/bxe/bxe.c +++ b/sys/dev/bxe/bxe.c @@ -34,7 +34,7 @@ #include __FBSDID("$FreeBSD$"); -#define BXE_DRIVER_VERSION "1.78.76" +#define BXE_DRIVER_VERSION "1.78.77" #include "bxe.h" #include "ecore_sp.h" @@ -5509,10 +5509,31 @@ bxe_tx_encap(struct bxe_fastpath *fp, struct mbuf **m_head) fp->eth_q_stats.tx_window_violation_std++; } - /* XXX I don't like this, change to double copy packet */ + /* lets try to defragment this mbuf */ + fp->eth_q_stats.mbuf_defrag_attempts++; - /* no sense trying to defrag again, just drop the frame */ - rc = ENODEV; + m0 = m_defrag(*m_head, M_DONTWAIT); + if (m0 == NULL) { + fp->eth_q_stats.mbuf_defrag_failures++; + /* Ugh, just drop the frame... :( */ + rc = ENOBUFS; + } else { + /* defrag successful, try mapping again */ + *m_head = m0; + error = bus_dmamap_load_mbuf_sg(fp->tx_mbuf_tag, + tx_buf->m_map, m0, + segs, &nsegs, BUS_DMA_NOWAIT); + if (error) { + fp->eth_q_stats.tx_dma_mapping_failure++; + /* No sense in trying to defrag/copy chain, drop it. :( */ + rc = error; + } + + /* if the chain is still too long then drop it */ + if (__predict_false(nsegs > 12)) { + rc = ENODEV; + } + } } bxe_tx_encap_continue: diff --git a/sys/dev/bxe/ecore_hsi.h b/sys/dev/bxe/ecore_hsi.h index 1da8e381d..bfffcec34 100644 --- a/sys/dev/bxe/ecore_hsi.h +++ b/sys/dev/bxe/ecore_hsi.h @@ -1305,6 +1305,13 @@ struct extended_dev_info_shared_cfg { /* NVRAM OFFSET */ #define EXTENDED_DEV_INFO_SHARED_CFG_SRIOV_SHOW_MENU 0x00000000 #define EXTENDED_DEV_INFO_SHARED_CFG_SRIOV_HIDE_MENU 0x00000200 + /* Overide PCIE revision ID when enabled the, + revision ID will set to B1=='0x11' */ + #define EXTENDED_DEV_INFO_SHARED_CFG_OVR_REV_ID_MASK 0x00000400 + #define EXTENDED_DEV_INFO_SHARED_CFG_OVR_REV_ID_SHIFT 10 + #define EXTENDED_DEV_INFO_SHARED_CFG_OVR_REV_ID_DISABLED 0x00000000 + #define EXTENDED_DEV_INFO_SHARED_CFG_OVR_REV_ID_ENABLED 0x00000400 + /* Threshold in celcius for max continuous operation */ uint32_t temperature_report; /* 0x4014 */ #define EXTENDED_DEV_INFO_SHARED_CFG_TEMP_MCOT_MASK 0x0000007F -- 2.45.0