Date: Tue, 31 Mar 2009 01:01:02 +0000 (UTC) From: Xin LI <delphij@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org Subject: svn commit: r190582 - in stable/7/sys: . contrib/pf dev/ath/ath_hal dev/bce dev/cxgb Message-ID: <200903310101.n2V112iw083269@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: delphij Date: Tue Mar 31 01:01:01 2009 New Revision: 190582 URL: http://svn.freebsd.org/changeset/base/190582 Log: Update bce(4) to latest -CURRENT version: - Add several HP OEM parts' PCI IDs (187133+187317) - Remove intermediate variable busaddr and have bus_* operate directly on softc members upon initialization. (187204) - Only enable split header operation when ZERO_COPY_SOCKETS is enabled in the kernel. (189117) - Updated firmware to latest 4.6.X release. (189325) - Added missing firmware for 5709 A1 controllers. (189325) - Changed some debug statistic variable names to be more consistent. (189325) Approved by: re (kensmith) Modified: stable/7/sys/ (props changed) stable/7/sys/contrib/pf/ (props changed) stable/7/sys/dev/ath/ath_hal/ (props changed) stable/7/sys/dev/bce/if_bce.c stable/7/sys/dev/bce/if_bcefw.h stable/7/sys/dev/bce/if_bcereg.h stable/7/sys/dev/cxgb/ (props changed) Modified: stable/7/sys/dev/bce/if_bce.c ============================================================================== --- stable/7/sys/dev/bce/if_bce.c Mon Mar 30 22:18:38 2009 (r190581) +++ stable/7/sys/dev/bce/if_bce.c Tue Mar 31 01:01:01 2009 (r190582) @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2006-2008 Broadcom Corporation + * Copyright (c) 2006-2009 Broadcom Corporation * David Christensen <davidch@broadcom.com>. All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -38,7 +38,7 @@ __FBSDID("$FreeBSD$"); * BCM5708C B1, B2 * BCM5708S B1, B2 * BCM5709C A1, C0 - * BCM5716 C0 + * BCM5716C C0 * * The following controllers are not supported by this driver: * BCM5706C A0, A1 (pre-production) @@ -71,25 +71,24 @@ __FBSDID("$FreeBSD$"); /* 1073741824 = 1 in 2 */ /* Controls how often the l2_fhdr frame error check will fail. */ - int bce_debug_l2fhdr_status_check = 0; + int l2fhdr_error_sim_control = 0; /* Controls how often the unexpected attention check will fail. */ - int bce_debug_unexpected_attention = 0; + int unexpected_attention_sim_control = 0; /* Controls how often to simulate an mbuf allocation failure. */ - int bce_debug_mbuf_allocation_failure = 0; + int mbuf_alloc_failed_sim_control = 0; /* Controls how often to simulate a DMA mapping failure. */ - int bce_debug_dma_map_addr_failure = 0; + int dma_map_addr_failed_sim_control = 0; /* Controls how often to simulate a bootcode failure. */ - int bce_debug_bootcode_running_failure = 0; + int bootcode_running_failure_sim_control = 0; #endif /****************************************************************************/ /* BCE Build Time Options */ /****************************************************************************/ -#define BCE_USE_SPLIT_HEADER 1 /* #define BCE_NVRAM_WRITE_SUPPORT 1 */ @@ -106,6 +105,10 @@ static struct bce_type bce_devs[] = { "HP NC370T Multifunction Gigabit Server Adapter" }, { BRCM_VENDORID, BRCM_DEVICEID_BCM5706, HP_VENDORID, 0x3106, "HP NC370i Multifunction Gigabit Server Adapter" }, + { BRCM_VENDORID, BRCM_DEVICEID_BCM5706, HP_VENDORID, 0x3070, + "HP NC380T PCIe DP Multifunc Gig Server Adapter" }, + { BRCM_VENDORID, BRCM_DEVICEID_BCM5706, HP_VENDORID, 0x1709, + "HP NC371i Multifunction Gigabit Server Adapter" }, { BRCM_VENDORID, BRCM_DEVICEID_BCM5706, PCI_ANY_ID, PCI_ANY_ID, "Broadcom NetXtreme II BCM5706 1000Base-T" }, @@ -116,18 +119,38 @@ static struct bce_type bce_devs[] = { "Broadcom NetXtreme II BCM5706 1000Base-SX" }, /* BCM5708C controllers and OEM boards. */ + { BRCM_VENDORID, BRCM_DEVICEID_BCM5708, HP_VENDORID, 0x7037, + "HP NC373T PCIe Multifunction Gig Server Adapter" }, + { BRCM_VENDORID, BRCM_DEVICEID_BCM5708, HP_VENDORID, 0x7038, + "HP NC373i Multifunction Gigabit Server Adapter" }, + { BRCM_VENDORID, BRCM_DEVICEID_BCM5708, HP_VENDORID, 0x7045, + "HP NC374m PCIe Multifunction Adapter" }, { BRCM_VENDORID, BRCM_DEVICEID_BCM5708, PCI_ANY_ID, PCI_ANY_ID, "Broadcom NetXtreme II BCM5708 1000Base-T" }, /* BCM5708S controllers and OEM boards. */ + { BRCM_VENDORID, BRCM_DEVICEID_BCM5708S, HP_VENDORID, 0x1706, + "HP NC373m Multifunction Gigabit Server Adapter" }, + { BRCM_VENDORID, BRCM_DEVICEID_BCM5708S, HP_VENDORID, 0x703b, + "HP NC373i Multifunction Gigabit Server Adapter" }, + { BRCM_VENDORID, BRCM_DEVICEID_BCM5708S, HP_VENDORID, 0x703d, + "HP NC373F PCIe Multifunc Giga Server Adapter" }, { BRCM_VENDORID, BRCM_DEVICEID_BCM5708S, PCI_ANY_ID, PCI_ANY_ID, "Broadcom NetXtreme II BCM5708 1000Base-SX" }, /* BCM5709C controllers and OEM boards. */ + { BRCM_VENDORID, BRCM_DEVICEID_BCM5709, HP_VENDORID, 0x7055, + "HP NC382i DP Multifunction Gigabit Server Adapter" }, + { BRCM_VENDORID, BRCM_DEVICEID_BCM5709, HP_VENDORID, 0x7059, + "HP NC382T PCIe DP Multifunction Gigabit Server Adapter" }, { BRCM_VENDORID, BRCM_DEVICEID_BCM5709, PCI_ANY_ID, PCI_ANY_ID, "Broadcom NetXtreme II BCM5709 1000Base-T" }, /* BCM5709S controllers and OEM boards. */ + { BRCM_VENDORID, BRCM_DEVICEID_BCM5709S, HP_VENDORID, 0x171d, + "HP NC382m DP 1GbE Multifunction BL-c Adapter" }, + { BRCM_VENDORID, BRCM_DEVICEID_BCM5709S, HP_VENDORID, 0x7056, + "HP NC382i DP Multifunction Gigabit Server Adapter" }, { BRCM_VENDORID, BRCM_DEVICEID_BCM5709S, PCI_ANY_ID, PCI_ANY_ID, "Broadcom NetXtreme II BCM5709 1000Base-SX" }, @@ -270,12 +293,12 @@ static void bce_dump_enet (str static void bce_dump_mbuf (struct bce_softc *, struct mbuf *); static void bce_dump_tx_mbuf_chain (struct bce_softc *, u16, int); static void bce_dump_rx_mbuf_chain (struct bce_softc *, u16, int); -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS static void bce_dump_pg_mbuf_chain (struct bce_softc *, u16, int); #endif static void bce_dump_txbd (struct bce_softc *, int, struct tx_bd *); static void bce_dump_rxbd (struct bce_softc *, int, struct rx_bd *); -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS static void bce_dump_pgbd (struct bce_softc *, int, struct rx_bd *); #endif static void bce_dump_l2fhdr (struct bce_softc *, int, struct l2_fhdr *); @@ -283,7 +306,7 @@ static void bce_dump_ctx (struct bce_s static void bce_dump_ftqs (struct bce_softc *); static void bce_dump_tx_chain (struct bce_softc *, u16, int); static void bce_dump_rx_chain (struct bce_softc *, u16, int); -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS static void bce_dump_pg_chain (struct bce_softc *, u16, int); #endif static void bce_dump_status_block (struct bce_softc *); @@ -368,7 +391,7 @@ static int bce_init_rx_chain (struct b static void bce_fill_rx_chain (struct bce_softc *); static void bce_free_rx_chain (struct bce_softc *); -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS static int bce_get_pg_buf (struct bce_softc *, struct mbuf *, u16 *, u16 *); static int bce_init_pg_chain (struct bce_softc *); static void bce_fill_pg_chain (struct bce_softc *); @@ -472,7 +495,8 @@ SYSCTL_UINT(_hw_bce, OID_AUTO, msi_enabl /* ToDo: Add tunable to enable/disable strict MTU handling. */ /* Currently allows "loose" RX MTU checking (i.e. sets the */ /* H/W RX MTU to the size of the largest receive buffer, or */ -/* 2048 bytes). */ +/* 2048 bytes). This will cause a UNH failure but is more */ +/* desireable from a functional perspective. */ /****************************************************************************/ @@ -572,8 +596,8 @@ bce_print_adapter_info(struct bce_softc } /* Firmware version and device features. */ - printf("F/W (0x%08X); Flags( ", sc->bce_fw_ver); -#ifdef BCE_USE_SPLIT_HEADER + printf("B/C (0x%08X); Flags( ", sc->bce_bc_ver); +#ifdef ZERO_COPY_SOCKETS printf("SPLT "); #endif if (sc->bce_flags & BCE_MFW_ENABLE_FLAG) @@ -823,7 +847,7 @@ bce_attach(device_t dev) __FUNCTION__, sc->bce_shmem_base); /* Fetch the bootcode revision. */ - sc->bce_fw_ver = REG_RD_IND(sc, sc->bce_shmem_base + + sc->bce_bc_ver = REG_RD_IND(sc, sc->bce_shmem_base + BCE_DEV_INFO_BC_REV); /* Check if any management firmware is running. */ @@ -989,7 +1013,7 @@ bce_attach(device_t dev) * This may change later if the MTU size is set to * something other than 1500. */ -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS sc->rx_bd_mbuf_alloc_size = MHLEN; /* Make sure offset is 16 byte aligned for hardware. */ sc->rx_bd_mbuf_align_pad = roundup2((MSIZE - MHLEN), 16) - @@ -2729,7 +2753,7 @@ bce_dma_free(struct bce_softc *sc) } -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS /* Free, unmap and destroy all page buffer descriptor chain pages. */ for (i = 0; i < PG_PAGES; i++ ) { if (sc->pg_bd_chain[i] != NULL) { @@ -2793,7 +2817,7 @@ bce_dma_free(struct bce_softc *sc) sc->rx_mbuf_tag = NULL; } -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS /* Unload and destroy the page mbuf maps. */ for (i = 0; i < TOTAL_PG_BD; i++) { if (sc->pg_mbuf_map[i] != NULL) { @@ -2840,20 +2864,16 @@ bce_dma_map_addr(void *arg, bus_dma_segm bus_addr_t *busaddr = arg; /* Simulate a mapping failure. */ - DBRUNIF(DB_RANDOMTRUE(bce_debug_dma_map_addr_failure), - printf("bce: %s(%d): Simulating DMA mapping error.\n", - __FILE__, __LINE__); + DBRUNIF(DB_RANDOMTRUE(dma_map_addr_failed_sim_control), error = ENOMEM); /* Check for an error and signal the caller that an error occurred. */ if (error) { - printf("bce %s(%d): DMA mapping error! error = %d, " - "nseg = %d\n", __FILE__, __LINE__, error, nseg); *busaddr = 0; - return; + } else { + *busaddr = segs->ds_addr; } - *busaddr = segs->ds_addr; return; } @@ -2886,7 +2906,6 @@ bce_dma_alloc(device_t dev) { struct bce_softc *sc; int i, error, rc = 0; - bus_addr_t busaddr; bus_size_t max_size, max_seg_size; int max_segments; @@ -2955,7 +2974,7 @@ bce_dma_alloc(device_t dev) sc->status_block, BCE_STATUS_BLK_SZ, bce_dma_map_addr, - &busaddr, + &sc->status_block_paddr, BUS_DMA_NOWAIT); if (error) { @@ -2965,7 +2984,6 @@ bce_dma_alloc(device_t dev) goto bce_dma_alloc_exit; } - sc->status_block_paddr = busaddr; DBPRINT(sc, BCE_INFO, "%s(): status_block_paddr = 0x%jX\n", __FUNCTION__, (uintmax_t) sc->status_block_paddr); @@ -3009,7 +3027,7 @@ bce_dma_alloc(device_t dev) sc->stats_block, BCE_STATS_BLK_SZ, bce_dma_map_addr, - &busaddr, + &sc->stats_block_paddr, BUS_DMA_NOWAIT); if(error) { @@ -3019,7 +3037,6 @@ bce_dma_alloc(device_t dev) goto bce_dma_alloc_exit; } - sc->stats_block_paddr = busaddr; DBPRINT(sc, BCE_INFO, "%s(): stats_block_paddr = 0x%jX\n", __FUNCTION__, (uintmax_t) sc->stats_block_paddr); @@ -3077,7 +3094,7 @@ bce_dma_alloc(device_t dev) sc->ctx_block[i], BCM_PAGE_SIZE, bce_dma_map_addr, - &busaddr, + &sc->ctx_paddr[i], BUS_DMA_NOWAIT); if (error) { @@ -3087,7 +3104,6 @@ bce_dma_alloc(device_t dev) goto bce_dma_alloc_exit; } - sc->ctx_paddr[i] = busaddr; DBPRINT(sc, BCE_INFO, "%s(): ctx_paddr[%d] = 0x%jX\n", __FUNCTION__, i, (uintmax_t) sc->ctx_paddr[i]); } @@ -3133,7 +3149,7 @@ bce_dma_alloc(device_t dev) sc->tx_bd_chain[i], BCE_TX_CHAIN_PAGE_SZ, bce_dma_map_addr, - &busaddr, + &sc->tx_bd_chain_paddr[i], BUS_DMA_NOWAIT); if (error) { @@ -3143,7 +3159,6 @@ bce_dma_alloc(device_t dev) goto bce_dma_alloc_exit; } - sc->tx_bd_chain_paddr[i] = busaddr; DBPRINT(sc, BCE_INFO, "%s(): tx_bd_chain_paddr[%d] = 0x%jX\n", __FUNCTION__, i, (uintmax_t) sc->tx_bd_chain_paddr[i]); } @@ -3231,7 +3246,7 @@ bce_dma_alloc(device_t dev) sc->rx_bd_chain[i], BCE_RX_CHAIN_PAGE_SZ, bce_dma_map_addr, - &busaddr, + &sc->rx_bd_chain_paddr[i], BUS_DMA_NOWAIT); if (error) { @@ -3241,7 +3256,6 @@ bce_dma_alloc(device_t dev) goto bce_dma_alloc_exit; } - sc->rx_bd_chain_paddr[i] = busaddr; DBPRINT(sc, BCE_INFO, "%s(): rx_bd_chain_paddr[%d] = 0x%jX\n", __FUNCTION__, i, (uintmax_t) sc->rx_bd_chain_paddr[i]); } @@ -3249,12 +3263,17 @@ bce_dma_alloc(device_t dev) /* * Create a DMA tag for RX mbufs. */ -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS max_size = max_seg_size = ((sc->rx_bd_mbuf_alloc_size < MCLBYTES) ? MCLBYTES : sc->rx_bd_mbuf_alloc_size); #else max_size = max_seg_size = MJUM9BYTES; #endif + max_segments = 1; + + DBPRINT(sc, BCE_INFO, "%s(): Creating rx_mbuf_tag (max size = 0x%jX " + "max segments = %d, max segment size = 0x%jX)\n", __FUNCTION__, + (uintmax_t) max_size, max_segments, (uintmax_t) max_seg_size); if (bus_dma_tag_create(sc->parent_tag, 1, @@ -3263,7 +3282,7 @@ bce_dma_alloc(device_t dev) BUS_SPACE_MAXADDR, NULL, NULL, max_size, - 1, + max_segments, max_seg_size, 0, NULL, NULL, @@ -3285,7 +3304,7 @@ bce_dma_alloc(device_t dev) } } -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS /* * Create a DMA tag for the page buffer descriptor chain, * allocate and clear the memory, and fetch the physical @@ -3328,7 +3347,7 @@ bce_dma_alloc(device_t dev) sc->pg_bd_chain[i], BCE_PG_CHAIN_PAGE_SZ, bce_dma_map_addr, - &busaddr, + &sc->pg_bd_chain_paddr[i], BUS_DMA_NOWAIT); if (error) { @@ -3338,7 +3357,6 @@ bce_dma_alloc(device_t dev) goto bce_dma_alloc_exit; } - sc->pg_bd_chain_paddr[i] = busaddr; DBPRINT(sc, BCE_INFO, "%s(): pg_bd_chain_paddr[%d] = 0x%jX\n", __FUNCTION__, i, (uintmax_t) sc->pg_bd_chain_paddr[i]); } @@ -4140,15 +4158,24 @@ bce_init_cpus(struct bce_softc *sc) if ((BCE_CHIP_NUM(sc) == BCE_CHIP_NUM_5709) || (BCE_CHIP_NUM(sc) == BCE_CHIP_NUM_5716)) { - bce_load_rv2p_fw(sc, bce_xi_rv2p_proc1, sizeof(bce_xi_rv2p_proc1), - RV2P_PROC1); - bce_load_rv2p_fw(sc, bce_xi_rv2p_proc2, sizeof(bce_xi_rv2p_proc2), - RV2P_PROC2); + + if ((BCE_CHIP_REV(sc) == BCE_CHIP_REV_Ax)) { + bce_load_rv2p_fw(sc, bce_xi90_rv2p_proc1, + sizeof(bce_xi90_rv2p_proc1), RV2P_PROC1); + bce_load_rv2p_fw(sc, bce_xi90_rv2p_proc2, + sizeof(bce_xi90_rv2p_proc2), RV2P_PROC2); + } else { + bce_load_rv2p_fw(sc, bce_xi_rv2p_proc1, + sizeof(bce_xi_rv2p_proc1), RV2P_PROC1); + bce_load_rv2p_fw(sc, bce_xi_rv2p_proc2, + sizeof(bce_xi_rv2p_proc2), RV2P_PROC2); + } + } else { - bce_load_rv2p_fw(sc, bce_rv2p_proc1, sizeof(bce_rv2p_proc1), - RV2P_PROC1); - bce_load_rv2p_fw(sc, bce_rv2p_proc2, sizeof(bce_rv2p_proc2), - RV2P_PROC2); + bce_load_rv2p_fw(sc, bce_rv2p_proc1, + sizeof(bce_rv2p_proc1), RV2P_PROC1); + bce_load_rv2p_fw(sc, bce_rv2p_proc2, + sizeof(bce_rv2p_proc2), RV2P_PROC2); } bce_init_rxp_cpu(sc); @@ -4367,7 +4394,7 @@ bce_stop(struct bce_softc *sc) bce_disable_intr(sc); /* Free RX buffers. */ -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS bce_free_pg_chain(sc); #endif bce_free_rx_chain(sc); @@ -4711,7 +4738,7 @@ bce_blockinit(struct bce_softc *sc) /* Verify that bootcode is running. */ reg = REG_RD_IND(sc, sc->bce_shmem_base + BCE_DEV_INFO_SIGNATURE); - DBRUNIF(DB_RANDOMTRUE(bce_debug_bootcode_running_failure), + DBRUNIF(DB_RANDOMTRUE(bootcode_running_failure_sim_control), BCE_PRINTF("%s(%d): Simulating bootcode failure.\n", __FILE__, __LINE__); reg = 0); @@ -4798,14 +4825,14 @@ bce_get_rx_buf(struct bce_softc *sc, str if (m == NULL) { /* Simulate an mbuf allocation failure. */ - DBRUNIF(DB_RANDOMTRUE(bce_debug_mbuf_allocation_failure), - sc->mbuf_alloc_failed++; - sc->debug_mbuf_sim_alloc_failed++; + DBRUNIF(DB_RANDOMTRUE(mbuf_alloc_failed_sim_control), + sc->mbuf_alloc_failed_count++; + sc->mbuf_alloc_failed_sim_count++; rc = ENOBUFS; goto bce_get_rx_buf_exit); /* This is a new mbuf allocation. */ -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS MGETHDR(m_new, M_DONTWAIT, MT_DATA); #else if (sc->rx_bd_mbuf_alloc_size <= MCLBYTES) @@ -4815,7 +4842,7 @@ bce_get_rx_buf(struct bce_softc *sc, str #endif if (m_new == NULL) { - sc->mbuf_alloc_failed++; + sc->mbuf_alloc_failed_count++; rc = ENOBUFS; goto bce_get_rx_buf_exit; } @@ -4845,7 +4872,9 @@ bce_get_rx_buf(struct bce_softc *sc, str BCE_PRINTF("%s(%d): Error mapping mbuf into RX chain (%d)!\n", __FILE__, __LINE__, error); + sc->dma_map_addr_rx_failed_count++; m_freem(m_new); + DBRUN(sc->debug_rx_mbuf_alloc--); rc = ENOBUFS; @@ -4884,7 +4913,7 @@ bce_get_rx_buf_exit: } -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS /****************************************************************************/ /* Encapsulate an mbuf cluster into the page chain. */ /* */ @@ -4923,16 +4952,16 @@ bce_get_pg_buf(struct bce_softc *sc, str if (m == NULL) { /* Simulate an mbuf allocation failure. */ - DBRUNIF(DB_RANDOMTRUE(bce_debug_mbuf_allocation_failure), - sc->mbuf_alloc_failed++; - sc->debug_mbuf_sim_alloc_failed++; + DBRUNIF(DB_RANDOMTRUE(mbuf_alloc_failed_sim_control), + sc->mbuf_alloc_failed_count++; + sc->mbuf_alloc_failed_sim_count++; rc = ENOBUFS; goto bce_get_pg_buf_exit); /* This is a new mbuf allocation. */ m_new = m_getcl(M_DONTWAIT, MT_DATA, 0); if (m_new == NULL) { - sc->mbuf_alloc_failed++; + sc->mbuf_alloc_failed_count++; rc = ENOBUFS; goto bce_get_pg_buf_exit; } @@ -4993,7 +5022,7 @@ bce_get_pg_buf_exit: return(rc); } -#endif /* BCE_USE_SPLIT_HEADER */ +#endif /* ZERO_COPY_SOCKETS */ /****************************************************************************/ /* Initialize the TX context memory. */ @@ -5351,7 +5380,7 @@ bce_free_rx_chain(struct bce_softc *sc) } -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS /****************************************************************************/ /* Allocate memory and initialize the page data structures. */ /* Assumes that bce_init_rx_chain() has not already been called. */ @@ -5517,7 +5546,7 @@ bce_free_pg_chain(struct bce_softc *sc) DBEXIT(BCE_VERBOSE_RESET | BCE_VERBOSE_RECV | BCE_VERBOSE_UNLOAD); } -#endif /* BCE_USE_SPLIT_HEADER */ +#endif /* ZERO_COPY_SOCKETS */ /****************************************************************************/ @@ -5690,7 +5719,7 @@ bce_rx_intr(struct bce_softc *sc) unsigned int pkt_len; u16 sw_rx_cons, sw_rx_cons_idx, hw_rx_cons; u32 status; -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS unsigned int rem_len; u16 sw_pg_cons, sw_pg_cons_idx; #endif @@ -5706,7 +5735,7 @@ bce_rx_intr(struct bce_softc *sc) bus_dmamap_sync(sc->rx_bd_chain_tag, sc->rx_bd_chain_map[i], BUS_DMASYNC_POSTWRITE); -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS /* Prepare the page chain pages to be accessed by the host CPU. */ for (int i = 0; i < PG_PAGES; i++) bus_dmamap_sync(sc->pg_bd_chain_tag, @@ -5718,7 +5747,7 @@ bce_rx_intr(struct bce_softc *sc) /* Get working copies of the driver's view of the consumer indices. */ sw_rx_cons = sc->rx_cons; -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS sw_pg_cons = sc->pg_cons; #endif @@ -5750,20 +5779,20 @@ bce_rx_intr(struct bce_softc *sc) sc->free_rx_bd++; /* - * Frames received on the NetXteme II are prepended - * with an l2_fhdr structure which provides status - * information about the received frame (including - * VLAN tags and checksum info). The frames are also - * automatically adjusted to align the IP header - * (i.e. two null bytes are inserted before the - * Ethernet header). As a result the data DMA'd by - * the controller into the mbuf is as follows: + * Frames received on the NetXteme II are prepended with an + * l2_fhdr structure which provides status information about + * the received frame (including VLAN tags and checksum info). + * The frames are also automatically adjusted to align the IP + * header (i.e. two null bytes are inserted before the Ethernet + * header). As a result the data DMA'd by the controller into + * the mbuf is as follows: + * * +---------+-----+---------------------+-----+ * | l2_fhdr | pad | packet data | FCS | * +---------+-----+---------------------+-----+ - * The l2_fhdr needs to be checked and skipped and - * the FCS needs to be stripped before sending the - * packet up the stack. + * + * The l2_fhdr needs to be checked and skipped and the FCS needs + * to be stripped before sending the packet up the stack. */ l2fhdr = mtod(m0, struct l2_fhdr *); @@ -5780,7 +5809,7 @@ bce_rx_intr(struct bce_softc *sc) */ m_adj(m0, sizeof(struct l2_fhdr) + ETHER_ALIGN); -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS /* * Check whether the received frame fits in a single * mbuf or not (i.e. packet data + FCS <= @@ -5878,8 +5907,9 @@ bce_rx_intr(struct bce_softc *sc) BCE_PRINTF("Invalid Ethernet frame size!\n"); m_print(m0, 128)); - DBRUNIF(DB_RANDOMTRUE(bce_debug_l2fhdr_status_check), + DBRUNIF(DB_RANDOMTRUE(l2fhdr_error_sim_control), BCE_PRINTF("Simulating l2_fhdr status error.\n"); + sc->l2fhdr_error_sim_count++; status = status | L2_FHDR_ERRORS_PHY_DECODE); /* Check the received frame for errors. */ @@ -5889,7 +5919,7 @@ bce_rx_intr(struct bce_softc *sc) /* Log the error and release the mbuf. */ ifp->if_ierrors++; - DBRUN(sc->l2fhdr_status_errors++); + sc->l2fhdr_error_count++; m_freem(m0); m0 = NULL; @@ -5930,10 +5960,7 @@ bce_rx_intr(struct bce_softc *sc) } } - /* - * If we received a packet with a vlan tag, - * attach that information to the packet. - */ + /* Attach the VLAN tag. */ if (status & L2_FHDR_STATUS_L2_VLAN_TAG) { #if __FreeBSD_version < 700000 VLAN_INPUT_TAG(ifp, m0, l2fhdr->l2_fhdr_vlan_tag, continue); @@ -5943,7 +5970,7 @@ bce_rx_intr(struct bce_softc *sc) #endif } - /* Pass the mbuf off to the upper layers. */ + /* Increment received packet statistics. */ ifp->if_ipackets++; bce_rx_int_next_rx: @@ -5953,7 +5980,7 @@ bce_rx_int_next_rx: if (m0) { /* Make sure we don't lose our place when we release the lock. */ sc->rx_cons = sw_rx_cons; -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS sc->pg_cons = sw_pg_cons; #endif @@ -5963,7 +5990,7 @@ bce_rx_int_next_rx: /* Recover our place. */ sw_rx_cons = sc->rx_cons; -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS sw_pg_cons = sc->pg_cons; #endif } @@ -5974,7 +6001,7 @@ bce_rx_int_next_rx: } /* No new packets to process. Refill the RX and page chains and exit. */ -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS sc->pg_cons = sw_pg_cons; bce_fill_pg_chain(sc); #endif @@ -5986,7 +6013,7 @@ bce_rx_int_next_rx: bus_dmamap_sync(sc->rx_bd_chain_tag, sc->rx_bd_chain_map[i], BUS_DMASYNC_PREWRITE); -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS for (int i = 0; i < PG_PAGES; i++) bus_dmamap_sync(sc->pg_bd_chain_tag, sc->pg_bd_chain_map[i], BUS_DMASYNC_PREWRITE); @@ -6232,7 +6259,7 @@ bce_init_locked(struct bce_softc *sc) * Calculate and program the hardware Ethernet MTU * size. Be generous on the receive if we have room. */ -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS if (ifp->if_mtu <= (sc->rx_bd_mbuf_data_len + sc->pg_bd_mbuf_alloc_size)) ether_mtu = sc->rx_bd_mbuf_data_len + sc->pg_bd_mbuf_alloc_size; #else @@ -6257,14 +6284,17 @@ bce_init_locked(struct bce_softc *sc) DBPRINT(sc, BCE_INFO_LOAD, "%s(): rx_bd_mbuf_alloc_size = %d, rx_bce_mbuf_data_len = %d, " - "rx_bd_mbuf_align_pad = %d, pg_bd_mbuf_alloc_size = %d\n", - __FUNCTION__, sc->rx_bd_mbuf_alloc_size, sc->rx_bd_mbuf_data_len, - sc->rx_bd_mbuf_align_pad, sc->pg_bd_mbuf_alloc_size); + "rx_bd_mbuf_align_pad = %d\n", __FUNCTION__, + sc->rx_bd_mbuf_alloc_size, sc->rx_bd_mbuf_data_len, + sc->rx_bd_mbuf_align_pad); /* Program appropriate promiscuous/multicast filtering. */ bce_set_rx_mode(sc); -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS + DBPRINT(sc, BCE_INFO_LOAD, "%s(): pg_bd_mbuf_alloc_size = %d\n", + __FUNCTION__, sc->pg_bd_mbuf_alloc_size); + /* Init page buffer descriptor chain. */ bce_init_pg_chain(sc); #endif @@ -6473,10 +6503,7 @@ bce_tx_encap_skip_tso: /* Check if the DMA mapping was successful */ if (error == EFBIG) { - /* The mbuf is too fragmented for our DMA mapping. */ - DBPRINT(sc, BCE_WARN, "%s(): fragmented mbuf (%d pieces)\n", - __FUNCTION__, nsegs); - DBRUN(bce_dump_mbuf(sc, m0);); + sc->fragmented_mbuf_count++; /* Try to defrag the mbuf. */ m0 = m_defrag(*m_head, M_DONTWAIT); @@ -6484,7 +6511,7 @@ bce_tx_encap_skip_tso: /* Defrag was unsuccessful */ m_freem(*m_head); *m_head = NULL; - sc->mbuf_alloc_failed++; + sc->mbuf_alloc_failed_count++; rc = ENOBUFS; goto bce_tx_encap_exit; } @@ -6497,7 +6524,7 @@ bce_tx_encap_skip_tso: /* Still getting an error after a defrag. */ if (error == ENOMEM) { /* Insufficient DMA buffers available. */ - sc->tx_dma_map_failures++; + sc->dma_map_addr_tx_failed_count++; rc = error; goto bce_tx_encap_exit; } else if (error != 0) { @@ -6507,19 +6534,19 @@ bce_tx_encap_skip_tso: __FILE__, __LINE__); m_freem(m0); *m_head = NULL; - sc->tx_dma_map_failures++; + sc->dma_map_addr_tx_failed_count++; rc = ENOBUFS; goto bce_tx_encap_exit; } } else if (error == ENOMEM) { /* Insufficient DMA buffers available. */ - sc->tx_dma_map_failures++; + sc->dma_map_addr_tx_failed_count++; rc = error; goto bce_tx_encap_exit; } else if (error != 0) { m_freem(m0); *m_head = NULL; - sc->tx_dma_map_failures++; + sc->dma_map_addr_tx_failed_count++; rc = error; goto bce_tx_encap_exit; } @@ -6777,7 +6804,7 @@ bce_ioctl(struct ifnet *ifp, u_long comm BCE_LOCK(sc); ifp->if_mtu = ifr->ifr_mtu; ifp->if_drv_flags &= ~IFF_DRV_RUNNING; -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS /* No buffer allocation size changes are necessary. */ #else /* Recalculate our buffer allocation sizes. */ @@ -7024,9 +7051,10 @@ bce_intr(void *xsc) status_attn_bits = sc->status_block->status_attn_bits; - DBRUNIF(DB_RANDOMTRUE(bce_debug_unexpected_attention), - BCE_PRINTF("Simulating unexpected status attention bit set."); - status_attn_bits = status_attn_bits | STATUS_ATTN_BITS_PARITY_ERROR); + DBRUNIF(DB_RANDOMTRUE(unexpected_attention_sim_control), + BCE_PRINTF("Simulating unexpected status attention bit set."); + sc->unexpected_attention_sim_count++; + status_attn_bits = status_attn_bits | STATUS_ATTN_BITS_PARITY_ERROR); /* Was it a link change interrupt? */ if ((status_attn_bits & STATUS_ATTN_BITS_LINK_STATE) != @@ -7044,13 +7072,13 @@ bce_intr(void *xsc) (sc->status_block->status_attn_bits_ack & ~STATUS_ATTN_BITS_LINK_STATE))) { - DBRUN(sc->unexpected_attentions++); + sc->unexpected_attention_count++; BCE_PRINTF("%s(%d): Fatal attention detected: 0x%08X\n", __FILE__, __LINE__, sc->status_block->status_attn_bits); DBRUNMSG(BCE_FATAL, - if (bce_debug_unexpected_attention == 0) + if (unexpected_attention_sim_control == 0) bce_breakpoint(sc)); bce_init_locked(sc); @@ -7299,8 +7327,8 @@ bce_stats_update(struct bce_softc *sc) sc->stat_EtherStatsUndersizePkts = stats->stat_EtherStatsUndersizePkts; - sc->stat_EtherStatsOverrsizePkts = - stats->stat_EtherStatsOverrsizePkts; + sc->stat_EtherStatsOversizePkts = + stats->stat_EtherStatsOversizePkts; sc->stat_EtherStatsPktsRx64Octets = stats->stat_EtherStatsPktsRx64Octets; @@ -7404,7 +7432,7 @@ bce_stats_update(struct bce_softc *sc) /* ToDo: This method loses soft errors. */ ifp->if_ierrors = (u_long) sc->stat_EtherStatsUndersizePkts + - (u_long) sc->stat_EtherStatsOverrsizePkts + + (u_long) sc->stat_EtherStatsOversizePkts + (u_long) sc->stat_IfInMBUFDiscards + (u_long) sc->stat_Dot3StatsAlignmentErrors + (u_long) sc->stat_Dot3StatsFCSErrors + @@ -7478,7 +7506,7 @@ bce_tick(void *xsc) bce_stats_update(sc); /* Top off the receive and page chains. */ -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS bce_fill_pg_chain(sc); #endif bce_fill_rx_chain(sc); @@ -7658,7 +7686,7 @@ bce_sysctl_dump_tx_chain(SYSCTL_HANDLER_ } -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS /****************************************************************************/ /* Provides a sysctl interface to allow dumping the page chain. */ /* */ @@ -7855,6 +7883,91 @@ bce_add_sysctls(struct bce_softc *sc) #ifdef BCE_DEBUG SYSCTL_ADD_INT(ctx, children, OID_AUTO, + "l2fhdr_error_sim_control", + CTLFLAG_RW, &l2fhdr_error_sim_control, + 0, "Debug control to force l2fhdr errors"); + + SYSCTL_ADD_INT(ctx, children, OID_AUTO, + "l2fhdr_error_sim_count", + CTLFLAG_RD, &sc->l2fhdr_error_sim_count, + 0, "Number of simulated l2_fhdr errors"); +#endif + + SYSCTL_ADD_INT(ctx, children, OID_AUTO, + "l2fhdr_error_count", + CTLFLAG_RD, &sc->l2fhdr_error_count, + 0, "Number of l2_fhdr errors"); + +#ifdef BCE_DEBUG + SYSCTL_ADD_INT(ctx, children, OID_AUTO, + "mbuf_alloc_failed_sim_control", + CTLFLAG_RW, &mbuf_alloc_failed_sim_control, + 0, "Debug control to force mbuf allocation failures"); + + SYSCTL_ADD_INT(ctx, children, OID_AUTO, + "mbuf_alloc_failed_sim_count", + CTLFLAG_RD, &sc->mbuf_alloc_failed_sim_count, + 0, "Number of simulated mbuf cluster allocation failures"); +#endif + + SYSCTL_ADD_INT(ctx, children, OID_AUTO, + "mbuf_alloc_failed_count", + CTLFLAG_RD, &sc->mbuf_alloc_failed_count, + 0, "Number of mbuf allocation failures"); + + SYSCTL_ADD_INT(ctx, children, OID_AUTO, + "fragmented_mbuf_count", + CTLFLAG_RD, &sc->fragmented_mbuf_count, + 0, "Number of fragmented mbufs"); + +#ifdef BCE_DEBUG + SYSCTL_ADD_INT(ctx, children, OID_AUTO, + "dma_map_addr_failed_sim_control", + CTLFLAG_RW, &dma_map_addr_failed_sim_control, + 0, "Debug control to force DMA mapping failures"); + + /* ToDo: Figure out how to update this value in bce_dma_map_addr(). */ + SYSCTL_ADD_INT(ctx, children, OID_AUTO, + "dma_map_addr_failed_sim_count", + CTLFLAG_RD, &sc->dma_map_addr_failed_sim_count, + 0, "Number of simulated DMA mapping failures"); + +#endif + + SYSCTL_ADD_INT(ctx, children, OID_AUTO, + "dma_map_addr_rx_failed_count", + CTLFLAG_RD, &sc->dma_map_addr_rx_failed_count, + 0, "Number of RX DMA mapping failures"); + + SYSCTL_ADD_INT(ctx, children, OID_AUTO, + "dma_map_addr_tx_failed_count", + CTLFLAG_RD, &sc->dma_map_addr_tx_failed_count, + 0, "Number of TX DMA mapping failures"); + +#ifdef BCE_DEBUG + SYSCTL_ADD_INT(ctx, children, OID_AUTO, + "unexpected_attention_sim_control", + CTLFLAG_RW, &unexpected_attention_sim_control, + 0, "Debug control to simulate unexpected attentions"); + + SYSCTL_ADD_INT(ctx, children, OID_AUTO, + "unexpected_attention_sim_count", + CTLFLAG_RW, &sc->unexpected_attention_sim_count, + 0, "Number of simulated unexpected attentions"); +#endif + + SYSCTL_ADD_INT(ctx, children, OID_AUTO, + "unexpected_attention_count", + CTLFLAG_RW, &sc->unexpected_attention_count, + 0, "Number of unexpected attentions"); + +#ifdef BCE_DEBUG + SYSCTL_ADD_INT(ctx, children, OID_AUTO, + "debug_bootcode_running_failure", + CTLFLAG_RW, &bootcode_running_failure_sim_control, + 0, "Debug control to force bootcode running failures"); + + SYSCTL_ADD_INT(ctx, children, OID_AUTO, "rx_low_watermark", CTLFLAG_RD, &sc->rx_low_watermark, 0, "Lowest level of free rx_bd's"); @@ -7875,26 +7988,6 @@ bce_add_sysctls(struct bce_softc *sc) 0, "Number of times the TX chain was full"); SYSCTL_ADD_INT(ctx, children, OID_AUTO, - "l2fhdr_status_errors", - CTLFLAG_RD, &sc->l2fhdr_status_errors, - 0, "l2_fhdr status errors"); - - SYSCTL_ADD_INT(ctx, children, OID_AUTO, - "unexpected_attentions", - CTLFLAG_RD, &sc->unexpected_attentions, - 0, "Unexpected attentions"); - - SYSCTL_ADD_INT(ctx, children, OID_AUTO, - "lost_status_block_updates", - CTLFLAG_RD, &sc->lost_status_block_updates, - 0, "Lost status block updates"); - - SYSCTL_ADD_INT(ctx, children, OID_AUTO, - "debug_mbuf_sim_alloc_failed", - CTLFLAG_RD, &sc->debug_mbuf_sim_alloc_failed, - 0, "Simulated mbuf cluster allocation failures"); - - SYSCTL_ADD_INT(ctx, children, OID_AUTO, "requested_tso_frames", CTLFLAG_RD, &sc->requested_tso_frames, 0, "Number of TSO frames received"); @@ -7920,16 +8013,6 @@ bce_add_sysctls(struct bce_softc *sc) "TX interrupt time"); #endif - SYSCTL_ADD_INT(ctx, children, OID_AUTO, - "mbuf_alloc_failed", - CTLFLAG_RD, &sc->mbuf_alloc_failed, - 0, "mbuf cluster allocation failures"); - - SYSCTL_ADD_INT(ctx, children, OID_AUTO, - "tx_dma_map_failures", - CTLFLAG_RD, &sc->tx_dma_map_failures, - 0, "tx dma mapping failures"); - SYSCTL_ADD_ULONG(ctx, children, OID_AUTO, "stat_IfHcInOctets", CTLFLAG_RD, &sc->stat_IfHCInOctets, @@ -8046,9 +8129,9 @@ bce_add_sysctls(struct bce_softc *sc) 0, "Undersize packets"); SYSCTL_ADD_UINT(ctx, children, OID_AUTO, - "stat_EtherStatsOverrsizePkts", - CTLFLAG_RD, &sc->stat_EtherStatsOverrsizePkts, - 0, "stat_EtherStatsOverrsizePkts"); + "stat_EtherStatsOversizePkts", + CTLFLAG_RD, &sc->stat_EtherStatsOversizePkts, + 0, "stat_EtherStatsOversizePkts"); SYSCTL_ADD_UINT(ctx, children, OID_AUTO, "stat_EtherStatsPktsRx64Octets", @@ -8231,7 +8314,7 @@ bce_add_sysctls(struct bce_softc *sc) (void *)sc, 0, bce_sysctl_dump_tx_chain, "I", "Dump tx_bd chain"); -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "dump_pg_chain", CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, @@ -8526,7 +8609,7 @@ bce_dump_rx_mbuf_chain(struct bce_softc } -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS /****************************************************************************/ /* Prints out the mbufs in the mbuf page chain. */ /* */ @@ -8650,7 +8733,7 @@ bce_dump_rxbd(struct bce_softc *sc, int } -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS /****************************************************************************/ /* Prints out a rx_bd structure in the page chain. */ /* */ @@ -9137,7 +9220,7 @@ bce_dump_rx_chain(struct bce_softc *sc, } -#ifdef BCE_USE_SPLIT_HEADER +#ifdef ZERO_COPY_SOCKETS /****************************************************************************/ /* Prints out the page chain. */ /* */ @@ -9439,9 +9522,9 @@ bce_dump_stats_block(struct bce_softc *s BCE_PRINTF(" 0x%08X : EtherStatsUndersizePkts\n", sblk->stat_EtherStatsUndersizePkts); *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200903310101.n2V112iw083269>