Deleted Added
full compact
if_bge.c (219902) if_bge.c (220368)
1/*-
2 * Copyright (c) 2001 Wind River Systems
3 * Copyright (c) 1997, 1998, 1999, 2001
4 * Bill Paul <wpaul@windriver.com>. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 18 unchanged lines hidden (view full) ---

27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31 * THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 2001 Wind River Systems
3 * Copyright (c) 1997, 1998, 1999, 2001
4 * Bill Paul <wpaul@windriver.com>. All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:

--- 18 unchanged lines hidden (view full) ---

27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
31 * THE POSSIBILITY OF SUCH DAMAGE.
32 */
33
34#include <sys/cdefs.h>
35__FBSDID("$FreeBSD: head/sys/dev/bge/if_bge.c 219902 2011-03-23 13:10:15Z jhb $");
35__FBSDID("$FreeBSD: head/sys/dev/bge/if_bge.c 220368 2011-04-05 17:41:54Z yongari $");
36
37/*
38 * Broadcom BCM570x family gigabit ethernet driver for FreeBSD.
39 *
40 * The Broadcom BCM5700 is based on technology originally developed by
41 * Alteon Networks as part of the Tigon I and Tigon II gigabit ethernet
42 * MAC chips. The BCM5700, sometimes refered to as the Tigon III, has
43 * two on-board MIPS R4000 CPUs and can have as much as 16MB of external

--- 894 unchanged lines hidden (view full) ---

938bge_newbuf_std(struct bge_softc *sc, int i)
939{
940 struct mbuf *m;
941 struct bge_rx_bd *r;
942 bus_dma_segment_t segs[1];
943 bus_dmamap_t map;
944 int error, nsegs;
945
36
37/*
38 * Broadcom BCM570x family gigabit ethernet driver for FreeBSD.
39 *
40 * The Broadcom BCM5700 is based on technology originally developed by
41 * Alteon Networks as part of the Tigon I and Tigon II gigabit ethernet
42 * MAC chips. The BCM5700, sometimes refered to as the Tigon III, has
43 * two on-board MIPS R4000 CPUs and can have as much as 16MB of external

--- 894 unchanged lines hidden (view full) ---

938bge_newbuf_std(struct bge_softc *sc, int i)
939{
940 struct mbuf *m;
941 struct bge_rx_bd *r;
942 bus_dma_segment_t segs[1];
943 bus_dmamap_t map;
944 int error, nsegs;
945
946 m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
947 if (m == NULL)
948 return (ENOBUFS);
949 m->m_len = m->m_pkthdr.len = MCLBYTES;
946 if (sc->bge_flags & BGE_FLAG_JUMBO_STD &&
947 (sc->bge_ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN +
948 ETHER_VLAN_ENCAP_LEN > (MCLBYTES - ETHER_ALIGN))) {
949 m = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR, MJUM9BYTES);
950 if (m == NULL)
951 return (ENOBUFS);
952 m->m_len = m->m_pkthdr.len = MJUM9BYTES;
953 } else {
954 m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
955 if (m == NULL)
956 return (ENOBUFS);
957 m->m_len = m->m_pkthdr.len = MCLBYTES;
958 }
950 if ((sc->bge_flags & BGE_FLAG_RX_ALIGNBUG) == 0)
951 m_adj(m, ETHER_ALIGN);
952
953 error = bus_dmamap_load_mbuf_sg(sc->bge_cdata.bge_rx_mtag,
954 sc->bge_cdata.bge_rx_std_sparemap, m, segs, &nsegs, 0);
955 if (error != 0) {
956 m_freem(m);
957 return (error);

--- 1422 unchanged lines hidden (view full) ---

2380 }
2381 return (0);
2382}
2383
2384static int
2385bge_dma_alloc(struct bge_softc *sc)
2386{
2387 bus_addr_t lowaddr;
959 if ((sc->bge_flags & BGE_FLAG_RX_ALIGNBUG) == 0)
960 m_adj(m, ETHER_ALIGN);
961
962 error = bus_dmamap_load_mbuf_sg(sc->bge_cdata.bge_rx_mtag,
963 sc->bge_cdata.bge_rx_std_sparemap, m, segs, &nsegs, 0);
964 if (error != 0) {
965 m_freem(m);
966 return (error);

--- 1422 unchanged lines hidden (view full) ---

2389 }
2390 return (0);
2391}
2392
2393static int
2394bge_dma_alloc(struct bge_softc *sc)
2395{
2396 bus_addr_t lowaddr;
2388 bus_size_t boundary, sbsz, txsegsz, txmaxsegsz;
2397 bus_size_t boundary, sbsz, rxmaxsegsz, txsegsz, txmaxsegsz;
2389 int i, error;
2390
2391 lowaddr = BUS_SPACE_MAXADDR;
2392 if ((sc->bge_flags & BGE_FLAG_40BIT_BUG) != 0)
2393 lowaddr = BGE_DMA_MAXADDR;
2394 /*
2395 * Allocate the parent bus DMA tag appropriate for PCI.
2396 */

--- 111 unchanged lines hidden (view full) ---

2508 &sc->bge_cdata.bge_tx_mtag);
2509
2510 if (error) {
2511 device_printf(sc->bge_dev, "could not allocate TX dma tag\n");
2512 return (ENOMEM);
2513 }
2514
2515 /* Create tag for Rx mbufs. */
2398 int i, error;
2399
2400 lowaddr = BUS_SPACE_MAXADDR;
2401 if ((sc->bge_flags & BGE_FLAG_40BIT_BUG) != 0)
2402 lowaddr = BGE_DMA_MAXADDR;
2403 /*
2404 * Allocate the parent bus DMA tag appropriate for PCI.
2405 */

--- 111 unchanged lines hidden (view full) ---

2517 &sc->bge_cdata.bge_tx_mtag);
2518
2519 if (error) {
2520 device_printf(sc->bge_dev, "could not allocate TX dma tag\n");
2521 return (ENOMEM);
2522 }
2523
2524 /* Create tag for Rx mbufs. */
2525 if (sc->bge_flags & BGE_FLAG_JUMBO_STD)
2526 rxmaxsegsz = MJUM9BYTES;
2527 else
2528 rxmaxsegsz = MCLBYTES;
2516 error = bus_dma_tag_create(sc->bge_cdata.bge_buffer_tag, 1, 0,
2529 error = bus_dma_tag_create(sc->bge_cdata.bge_buffer_tag, 1, 0,
2517 BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES, 1,
2518 MCLBYTES, 0, NULL, NULL, &sc->bge_cdata.bge_rx_mtag);
2530 BUS_SPACE_MAXADDR, BUS_SPACE_MAXADDR, NULL, NULL, rxmaxsegsz, 1,
2531 rxmaxsegsz, 0, NULL, NULL, &sc->bge_cdata.bge_rx_mtag);
2519
2520 if (error) {
2521 device_printf(sc->bge_dev, "could not allocate RX dma tag\n");
2522 return (ENOMEM);
2523 }
2524
2525 /* Create DMA maps for RX buffers. */
2526 error = bus_dmamap_create(sc->bge_cdata.bge_rx_mtag, 0,

--- 227 unchanged lines hidden (view full) ---

2754 case BGE_ASICREV_BCM5701:
2755 case BGE_ASICREV_BCM5703:
2756 case BGE_ASICREV_BCM5704:
2757 sc->bge_flags |= BGE_FLAG_5700_FAMILY | BGE_FLAG_JUMBO;
2758 break;
2759 case BGE_ASICREV_BCM5714_A0:
2760 case BGE_ASICREV_BCM5780:
2761 case BGE_ASICREV_BCM5714:
2532
2533 if (error) {
2534 device_printf(sc->bge_dev, "could not allocate RX dma tag\n");
2535 return (ENOMEM);
2536 }
2537
2538 /* Create DMA maps for RX buffers. */
2539 error = bus_dmamap_create(sc->bge_cdata.bge_rx_mtag, 0,

--- 227 unchanged lines hidden (view full) ---

2767 case BGE_ASICREV_BCM5701:
2768 case BGE_ASICREV_BCM5703:
2769 case BGE_ASICREV_BCM5704:
2770 sc->bge_flags |= BGE_FLAG_5700_FAMILY | BGE_FLAG_JUMBO;
2771 break;
2772 case BGE_ASICREV_BCM5714_A0:
2773 case BGE_ASICREV_BCM5780:
2774 case BGE_ASICREV_BCM5714:
2762 sc->bge_flags |= BGE_FLAG_5714_FAMILY /* | BGE_FLAG_JUMBO */;
2775 sc->bge_flags |= BGE_FLAG_5714_FAMILY | BGE_FLAG_JUMBO_STD;
2763 /* FALLTHROUGH */
2764 case BGE_ASICREV_BCM5750:
2765 case BGE_ASICREV_BCM5752:
2766 case BGE_ASICREV_BCM5906:
2767 sc->bge_flags |= BGE_FLAG_575X_PLUS;
2768 if (sc->bge_asicrev == BGE_ASICREV_BCM5906)
2769 sc->bge_flags |= BGE_FLAG_SHORT_DMA_BUG;
2770 /* FALLTHROUGH */

--- 784 unchanged lines hidden (view full) ---

3555 return (rx_npkts);
3556
3557 ifp = sc->bge_ifp;
3558
3559 bus_dmamap_sync(sc->bge_cdata.bge_rx_return_ring_tag,
3560 sc->bge_cdata.bge_rx_return_ring_map, BUS_DMASYNC_POSTREAD);
3561 bus_dmamap_sync(sc->bge_cdata.bge_rx_std_ring_tag,
3562 sc->bge_cdata.bge_rx_std_ring_map, BUS_DMASYNC_POSTWRITE);
2776 /* FALLTHROUGH */
2777 case BGE_ASICREV_BCM5750:
2778 case BGE_ASICREV_BCM5752:
2779 case BGE_ASICREV_BCM5906:
2780 sc->bge_flags |= BGE_FLAG_575X_PLUS;
2781 if (sc->bge_asicrev == BGE_ASICREV_BCM5906)
2782 sc->bge_flags |= BGE_FLAG_SHORT_DMA_BUG;
2783 /* FALLTHROUGH */

--- 784 unchanged lines hidden (view full) ---

3568 return (rx_npkts);
3569
3570 ifp = sc->bge_ifp;
3571
3572 bus_dmamap_sync(sc->bge_cdata.bge_rx_return_ring_tag,
3573 sc->bge_cdata.bge_rx_return_ring_map, BUS_DMASYNC_POSTREAD);
3574 bus_dmamap_sync(sc->bge_cdata.bge_rx_std_ring_tag,
3575 sc->bge_cdata.bge_rx_std_ring_map, BUS_DMASYNC_POSTWRITE);
3563 if (ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN + ETHER_VLAN_ENCAP_LEN >
3576 if (BGE_IS_JUMBO_CAPABLE(sc) &&
3577 ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN + ETHER_VLAN_ENCAP_LEN >
3564 (MCLBYTES - ETHER_ALIGN))
3565 bus_dmamap_sync(sc->bge_cdata.bge_rx_jumbo_ring_tag,
3566 sc->bge_cdata.bge_rx_jumbo_ring_map, BUS_DMASYNC_POSTWRITE);
3567
3568 while (rx_cons != rx_prod) {
3569 struct bge_rx_bd *cur_rx;
3570 uint32_t rxidx;
3571 struct mbuf *m = NULL;

--- 1112 unchanged lines hidden (view full) ---

4684 break;
4685 }
4686 if (i == 10)
4687 device_printf (sc->bge_dev,
4688 "5705 A0 chip failed to load RX ring\n");
4689 }
4690
4691 /* Init jumbo RX ring. */
3578 (MCLBYTES - ETHER_ALIGN))
3579 bus_dmamap_sync(sc->bge_cdata.bge_rx_jumbo_ring_tag,
3580 sc->bge_cdata.bge_rx_jumbo_ring_map, BUS_DMASYNC_POSTWRITE);
3581
3582 while (rx_cons != rx_prod) {
3583 struct bge_rx_bd *cur_rx;
3584 uint32_t rxidx;
3585 struct mbuf *m = NULL;

--- 1112 unchanged lines hidden (view full) ---

4698 break;
4699 }
4700 if (i == 10)
4701 device_printf (sc->bge_dev,
4702 "5705 A0 chip failed to load RX ring\n");
4703 }
4704
4705 /* Init jumbo RX ring. */
4692 if (ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN + ETHER_VLAN_ENCAP_LEN >
4706 if (BGE_IS_JUMBO_CAPABLE(sc) &&
4707 ifp->if_mtu + ETHER_HDR_LEN + ETHER_CRC_LEN + ETHER_VLAN_ENCAP_LEN >
4693 (MCLBYTES - ETHER_ALIGN)) {
4694 if (bge_init_rx_ring_jumbo(sc) != 0) {
4695 device_printf(sc->bge_dev,
4696 "no memory for jumbo Rx buffers.\n");
4697 bge_stop(sc);
4698 return;
4699 }
4700 }

--- 208 unchanged lines hidden (view full) ---

4909{
4910 struct bge_softc *sc = ifp->if_softc;
4911 struct ifreq *ifr = (struct ifreq *) data;
4912 struct mii_data *mii;
4913 int flags, mask, error = 0;
4914
4915 switch (command) {
4916 case SIOCSIFMTU:
4708 (MCLBYTES - ETHER_ALIGN)) {
4709 if (bge_init_rx_ring_jumbo(sc) != 0) {
4710 device_printf(sc->bge_dev,
4711 "no memory for jumbo Rx buffers.\n");
4712 bge_stop(sc);
4713 return;
4714 }
4715 }

--- 208 unchanged lines hidden (view full) ---

4924{
4925 struct bge_softc *sc = ifp->if_softc;
4926 struct ifreq *ifr = (struct ifreq *) data;
4927 struct mii_data *mii;
4928 int flags, mask, error = 0;
4929
4930 switch (command) {
4931 case SIOCSIFMTU:
4932 if (BGE_IS_JUMBO_CAPABLE(sc) ||
4933 (sc->bge_flags & BGE_FLAG_JUMBO_STD)) {
4934 if (ifr->ifr_mtu < ETHERMIN ||
4935 ifr->ifr_mtu > BGE_JUMBO_MTU) {
4936 error = EINVAL;
4937 break;
4938 }
4939 } else if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > ETHERMTU) {
4940 error = EINVAL;
4941 break;
4942 }
4917 BGE_LOCK(sc);
4943 BGE_LOCK(sc);
4918 if (ifr->ifr_mtu < ETHERMIN ||
4919 ((BGE_IS_JUMBO_CAPABLE(sc)) &&
4920 ifr->ifr_mtu > BGE_JUMBO_MTU) ||
4921 ((!BGE_IS_JUMBO_CAPABLE(sc)) &&
4922 ifr->ifr_mtu > ETHERMTU))
4923 error = EINVAL;
4924 else if (ifp->if_mtu != ifr->ifr_mtu) {
4944 if (ifp->if_mtu != ifr->ifr_mtu) {
4925 ifp->if_mtu = ifr->ifr_mtu;
4926 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
4927 ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
4928 bge_init_locked(sc);
4929 }
4930 }
4931 BGE_UNLOCK(sc);
4932 break;

--- 912 unchanged lines hidden ---
4945 ifp->if_mtu = ifr->ifr_mtu;
4946 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
4947 ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
4948 bge_init_locked(sc);
4949 }
4950 }
4951 BGE_UNLOCK(sc);
4952 break;

--- 912 unchanged lines hidden ---