Date: Thu, 31 Mar 2011 20:46:50 +0000 (UTC) From: David Christensen <davidch@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r220223 - head/sys/dev/bxe Message-ID: <201103312046.p2VKkoMJ022040@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: davidch Date: Thu Mar 31 20:46:50 2011 New Revision: 220223 URL: http://svn.freebsd.org/changeset/base/220223 Log: - Fixed a problem where the stack passed a TSO frame larger than the 64K size allowed by the DMA descriptor for TSO frames. MFC after: One week Modified: head/sys/dev/bxe/if_bxe.c head/sys/dev/bxe/if_bxe.h Modified: head/sys/dev/bxe/if_bxe.c ============================================================================== --- head/sys/dev/bxe/if_bxe.c Thu Mar 31 19:22:11 2011 (r220222) +++ head/sys/dev/bxe/if_bxe.c Thu Mar 31 20:46:50 2011 (r220223) @@ -68,7 +68,7 @@ __FBSDID("$FreeBSD$"); /* BXE Debug Options */ #ifdef BXE_DEBUG - uint32_t bxe_debug = BXE_WARN; + uint32_t bxe_debug = BXE_INFO; /* 0 = Never */ /* 1 = 1 in 2,147,483,648 */ @@ -382,7 +382,7 @@ static void bxe_breakpoint(struct bxe_so #endif -#define BXE_DRIVER_VERSION "1.5.52_preliminary" +#define BXE_DRIVER_VERSION "1.5.52" static void bxe_init_e1_firmware(struct bxe_softc *sc); static void bxe_init_e1h_firmware(struct bxe_softc *sc); @@ -13042,10 +13042,20 @@ bxe_dma_alloc(device_t dev) * address of the block. */ - if (bus_dma_tag_create(sc->parent_tag, BCM_PAGE_SIZE, - BXE_DMA_BOUNDARY, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, - NULL, NULL, BXE_STATUS_BLK_SZ, 1, BXE_STATUS_BLK_SZ, - 0, NULL, NULL, &fp->status_block_tag)) { + if (bus_dma_tag_create(sc->parent_tag, + BCM_PAGE_SIZE, /* alignment for segs */ + BXE_DMA_BOUNDARY, /* cannot cross */ + BUS_SPACE_MAXADDR, /* restricted low */ + BUS_SPACE_MAXADDR, /* restricted hi */ + NULL, /* filter f() */ + NULL, /* filter f() arg */ + BXE_STATUS_BLK_SZ, /* max map for this tag */ + 1, /* # of discontinuities */ + BXE_STATUS_BLK_SZ, /* max seg size */ + 0, /* flags */ + NULL, /* lock f() */ + NULL, /* lock f() arg */ + &fp->status_block_tag)) { BXE_PRINTF("%s(%d): Could not allocate fp[%d] " "status block DMA tag!\n", __FILE__, __LINE__, i); rc = ENOMEM; @@ -13086,10 +13096,20 @@ bxe_dma_alloc(device_t dev) * allocate and clear the memory, and fetch the * physical address of the block. */ - if (bus_dma_tag_create(sc->parent_tag, BCM_PAGE_SIZE, - BXE_DMA_BOUNDARY, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, - NULL, NULL, BXE_TX_CHAIN_PAGE_SZ, 1, BXE_TX_CHAIN_PAGE_SZ, - 0, NULL, NULL, &fp->tx_bd_chain_tag)) { + if (bus_dma_tag_create(sc->parent_tag, + BCM_PAGE_SIZE, /* alignment for segs */ + BXE_DMA_BOUNDARY, /* cannot cross */ + BUS_SPACE_MAXADDR, /* restricted low */ + BUS_SPACE_MAXADDR, /* restricted hi */ + NULL, /* filter f() */ + NULL, /* filter f() arg */ + BXE_TX_CHAIN_PAGE_SZ,/* max map for this tag */ + 1, /* # of discontinuities */ + BXE_TX_CHAIN_PAGE_SZ,/* max seg size */ + 0, /* flags */ + NULL, /* lock f() */ + NULL, /* lock f() arg */ + &fp->tx_bd_chain_tag)) { BXE_PRINTF( "%s(%d): Could not allocate fp[%d] TX descriptor " "chain DMA tag!\n", __FILE__, __LINE__, i); @@ -13132,23 +13152,33 @@ bxe_dma_alloc(device_t dev) } /* - * Check the required size before mapping to conserve resources. + * Check required size before mapping to conserve resources. */ if (bxe_tso_enable) { - max_size = BXE_TSO_MAX_SIZE; - max_segments = 32; /* BXE_MAX_SEGMENTS; */ + max_size = BXE_TSO_MAX_SIZE; + max_segments = BXE_TSO_MAX_SEGMENTS; max_seg_size = BXE_TSO_MAX_SEG_SIZE; } else { - max_size = MCLBYTES * BXE_MAX_SEGMENTS; + max_size = MCLBYTES * BXE_MAX_SEGMENTS; max_segments = BXE_MAX_SEGMENTS; max_seg_size = MCLBYTES; } /* Create a DMA tag for TX mbufs. */ - if (bus_dma_tag_create(sc->parent_tag, 1, BXE_DMA_BOUNDARY, - BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, - max_size, max_segments, max_seg_size, - 0, NULL, NULL, &fp->tx_mbuf_tag)) { + if (bus_dma_tag_create(sc->parent_tag, + 1, /* alignment for segs */ + BXE_DMA_BOUNDARY, /* cannot cross */ + BUS_SPACE_MAXADDR, /* restricted low */ + BUS_SPACE_MAXADDR, /* restricted hi */ + NULL, /* filter f() */ + NULL, /* filter f() arg */ + max_size, /* max map for this tag */ + max_segments, /* # of discontinuities */ + max_seg_size, /* max seg size */ + 0, /* flags */ + NULL, /* lock f() */ + NULL, /* lock f() arg */ + &fp->tx_mbuf_tag)) { BXE_PRINTF( "%s(%d): Could not allocate fp[%d] TX mbuf DMA tag!\n", __FILE__, __LINE__, i); @@ -13174,12 +13204,22 @@ bxe_dma_alloc(device_t dev) * the memory, and fetch the physical * address of the blocks. */ - if (bus_dma_tag_create(sc->parent_tag, BCM_PAGE_SIZE, - BXE_DMA_BOUNDARY, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, - NULL, NULL, BXE_RX_CHAIN_PAGE_SZ, 1, BXE_RX_CHAIN_PAGE_SZ, - 0, NULL, NULL, &fp->rx_bd_chain_tag)) { - BXE_PRINTF( - "%s(%d): Could not allocate fp[%d] RX BD chain DMA tag!\n", + if (bus_dma_tag_create(sc->parent_tag, + BCM_PAGE_SIZE, /* alignment for segs */ + BXE_DMA_BOUNDARY, /* cannot cross */ + BUS_SPACE_MAXADDR, /* restricted low */ + BUS_SPACE_MAXADDR, /* restricted hi */ + NULL, /* filter f() */ + NULL, /* filter f() arg */ + BXE_RX_CHAIN_PAGE_SZ,/* max map for this tag */ + 1, /* # of discontinuities */ + BXE_RX_CHAIN_PAGE_SZ,/* max seg size */ + 0, /* flags */ + NULL, /* lock f() */ + NULL, /* lock f() arg */ + &fp->rx_bd_chain_tag)) { + BXE_PRINTF("%s(%d): Could not allocate fp[%d] " + "RX BD chain DMA tag!\n", __FILE__, __LINE__, i); rc = ENOMEM; goto bxe_dma_alloc_exit; @@ -13222,9 +13262,19 @@ bxe_dma_alloc(device_t dev) /* * Create a DMA tag for RX mbufs. */ - if (bus_dma_tag_create(sc->parent_tag, 1, BXE_DMA_BOUNDARY, - BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, - MJUM9BYTES, 1, MJUM9BYTES, 0, NULL, NULL, + if (bus_dma_tag_create(sc->parent_tag, + 1, /* alignment for segs */ + BXE_DMA_BOUNDARY, /* cannot cross */ + BUS_SPACE_MAXADDR, /* restricted low */ + BUS_SPACE_MAXADDR, /* restricted hi */ + NULL, /* filter f() */ + NULL, /* filter f() arg */ + MJUM9BYTES, /* max map for this tag */ + 1, /* # of discontinuities */ + MJUM9BYTES, /* max seg size */ + 0, /* flags */ + NULL, /* lock f() */ + NULL, /* lock f() arg */ &fp->rx_mbuf_tag)) { BXE_PRINTF( "%s(%d): Could not allocate fp[%d] RX mbuf DMA tag!\n", @@ -13251,10 +13301,20 @@ bxe_dma_alloc(device_t dev) * map the memory into DMA space, and fetch * the physical address of the block. */ - if (bus_dma_tag_create(sc->parent_tag, BCM_PAGE_SIZE, - BXE_DMA_BOUNDARY, BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, - NULL, NULL, BXE_RX_CHAIN_PAGE_SZ, 1, BXE_RX_CHAIN_PAGE_SZ, - 0, NULL, NULL, &fp->rx_comp_chain_tag)) { + if (bus_dma_tag_create(sc->parent_tag, + BCM_PAGE_SIZE, /* alignment for segs */ + BXE_DMA_BOUNDARY, /* cannot cross */ + BUS_SPACE_MAXADDR, /* restricted low */ + BUS_SPACE_MAXADDR, /* restricted hi */ + NULL, /* filter f() */ + NULL, /* filter f() arg */ + BXE_RX_CHAIN_PAGE_SZ,/* max map for this tag */ + 1, /* # of discontinuities */ + BXE_RX_CHAIN_PAGE_SZ,/* max seg size */ + 0, /* flags */ + NULL, /* lock f() */ + NULL, /* lock f() arg */ + &fp->rx_comp_chain_tag)) { BXE_PRINTF( "%s(%d): Could not allocate fp[%d] RX Completion Queue DMA tag!\n", __FILE__, __LINE__, i); @@ -13311,10 +13371,19 @@ bxe_dma_alloc(device_t dev) * memory into DMA space, and fetch the * physical address of the block. */ - if (bus_dma_tag_create(sc->parent_tag, BCM_PAGE_SIZE, - BXE_DMA_BOUNDARY, BUS_SPACE_MAXADDR, - BUS_SPACE_MAXADDR, NULL, NULL, BXE_RX_CHAIN_PAGE_SZ, - 1, BXE_RX_CHAIN_PAGE_SZ, 0, NULL, NULL, + if (bus_dma_tag_create(sc->parent_tag, + BCM_PAGE_SIZE, /* alignment for segs */ + BXE_DMA_BOUNDARY, /* cannot cross */ + BUS_SPACE_MAXADDR, /* restricted low */ + BUS_SPACE_MAXADDR, /* restricted hi */ + NULL, /* filter f() */ + NULL, /* filter f() arg */ + BXE_RX_CHAIN_PAGE_SZ,/* max map for this tag */ + 1, /* # of discontinuities */ + BXE_RX_CHAIN_PAGE_SZ,/* max seg size */ + 0, /* flags */ + NULL, /* lock f() */ + NULL, /* lock f() arg */ &fp->rx_sge_chain_tag)) { BXE_PRINTF( "%s(%d): Could not allocate fp[%d] RX SGE descriptor chain DMA tag!\n", Modified: head/sys/dev/bxe/if_bxe.h ============================================================================== --- head/sys/dev/bxe/if_bxe.h Thu Mar 31 19:22:11 2011 (r220222) +++ head/sys/dev/bxe/if_bxe.h Thu Mar 31 20:46:50 2011 (r220223) @@ -388,8 +388,9 @@ struct bxe_type { /* Reduce from 13 to leave room for the parsing buffer. */ #define BXE_MAX_SEGMENTS 12 -#define BXE_TSO_MAX_SIZE 65536 -#define BXE_TSO_MAX_SEG_SIZE 4096 +#define BXE_TSO_MAX_SEGMENTS 32 +#define BXE_TSO_MAX_SIZE (65535 + sizeof(struct ether_vlan_header)) +#define BXE_TSO_MAX_SEG_SIZE 4096 /* * Hardware Support For IP and TCP checksum.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201103312046.p2VKkoMJ022040>