Author: yongari
Date: Fri Jan  6 18:18:25 2012
New Revision: 229713
URL: http://svn.freebsd.org/changeset/base/229713

Log:
  MFC r228291-228293,228297-228298:
  r228291:
    Remove NetBSD license. r199548 removed all bit macros that were
    derived from NetBSD.
  
  r228292:
    Implement suspend/resume methods.  Driver has no issue with
    suspend/resume.
  
  r228293:
    Fix alt(4) support.  Also add check for number of available TX
    descriptors before trying to send frames.  If we're not able to
    send a frame, make sure to prepend it to if_snd queue such that
    alt(4) should work.
  
    While I'm here prefer ETHER_BPF_MTAP to BPF_MTAP.  ETHER_BPF_MTAP
    should be used for controllers that support VLAN hardware tag
    insertion.  The controller supports VLAN tag insertion but lacks
    VLAN tag stripping in RX path though.
  
  r228297:
    et(4) supports VLAN oversized frame so correctly set header length.
    While I'm here remove initializing if_mtu, it is set by
    ether_ifattach(9).  Also move callout_init_mtx(9) to the right below
    driver lock initialization.
  
  r228298:
    Make et_probe() return BUS_PROBE_DEFAULT such that allow other
    driver that has high precedence for the controller override et(4).
    Add missing callout_drain(9) in device detach and rework detach
    routine.  While I'm here use rman_get_rid(9) instead of using
    cached resource id because bus methods are free to change the
    id.

Modified:
  stable/7/sys/dev/et/if_et.c
  stable/7/sys/dev/et/if_etreg.h
Directory Properties:
  stable/7/sys/   (props changed)
  stable/7/sys/cddl/contrib/opensolaris/   (props changed)
  stable/7/sys/contrib/dev/acpica/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)

Modified: stable/7/sys/dev/et/if_et.c
==============================================================================
--- stable/7/sys/dev/et/if_et.c Fri Jan  6 18:16:57 2012        (r229712)
+++ stable/7/sys/dev/et/if_et.c Fri Jan  6 18:18:25 2012        (r229713)
@@ -88,6 +88,8 @@ static int    et_probe(device_t);
 static int     et_attach(device_t);
 static int     et_detach(device_t);
 static int     et_shutdown(device_t);
+static int     et_suspend(device_t);
+static int     et_resume(device_t);
 
 static int     et_miibus_readreg(device_t, int, int);
 static int     et_miibus_writereg(device_t, int, int, int);
@@ -170,6 +172,8 @@ static device_method_t et_methods[] = {
        DEVMETHOD(device_attach,        et_attach),
        DEVMETHOD(device_detach,        et_detach),
        DEVMETHOD(device_shutdown,      et_shutdown),
+       DEVMETHOD(device_suspend,       et_suspend),
+       DEVMETHOD(device_resume,        et_resume),
 
        DEVMETHOD(bus_print_child,      bus_generic_print_child),
        DEVMETHOD(bus_driver_added,     bus_generic_driver_added),
@@ -226,7 +230,7 @@ et_probe(device_t dev)
        for (d = et_devices; d->desc != NULL; ++d) {
                if (vid == d->vid && did == d->did) {
                        device_set_desc(dev, d->desc);
-                       return (0);
+                       return (BUS_PROBE_DEFAULT);
                }
        }
        return (ENXIO);
@@ -244,6 +248,7 @@ et_attach(device_t dev)
        sc->dev = dev;
        mtx_init(&sc->sc_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK,
            MTX_DEF);
+       callout_init_mtx(&sc->sc_tick, &sc->sc_mtx, 0);
 
        ifp = sc->ifp = if_alloc(IFT_ETHER);
        if (ifp == NULL) {
@@ -335,10 +340,10 @@ et_attach(device_t dev)
        ifp->if_init = et_init;
        ifp->if_ioctl = et_ioctl;
        ifp->if_start = et_start;
-       ifp->if_mtu = ETHERMTU;
        ifp->if_capabilities = IFCAP_TXCSUM | IFCAP_VLAN_MTU;
        ifp->if_capenable = ifp->if_capabilities;
-       IFQ_SET_MAXLEN(&ifp->if_snd, ET_TX_NDESC);
+       ifp->if_snd.ifq_drv_maxlen = ET_TX_NDESC - 1;
+       IFQ_SET_MAXLEN(&ifp->if_snd, ET_TX_NDESC - 1);
        IFQ_SET_READY(&ifp->if_snd);
 
        et_chip_attach(sc);
@@ -351,7 +356,9 @@ et_attach(device_t dev)
        }
 
        ether_ifattach(ifp, eaddr);
-       callout_init_mtx(&sc->sc_tick, &sc->sc_mtx, 0);
+
+       /* Tell the upper layer(s) we support long frames. */
+       ifp->if_hdrlen = sizeof(struct ether_vlan_header);
 
        error = bus_setup_intr(dev, sc->sc_irq_res, INTR_TYPE_NET | INTR_MPSAFE,
            NULL, et_intr, sc, &sc->sc_irq_handle);
@@ -375,31 +382,27 @@ et_detach(device_t dev)
        struct et_softc *sc = device_get_softc(dev);
 
        if (device_is_attached(dev)) {
-               struct ifnet *ifp = sc->ifp;
-
+               ether_ifdetach(sc->ifp);
                ET_LOCK(sc);
                et_stop(sc);
-               bus_teardown_intr(dev, sc->sc_irq_res, sc->sc_irq_handle);
                ET_UNLOCK(sc);
-
-               ether_ifdetach(ifp);
+               callout_drain(&sc->sc_tick);
        }
 
        if (sc->sc_miibus != NULL)
                device_delete_child(dev, sc->sc_miibus);
        bus_generic_detach(dev);
 
-       if (sc->sc_irq_res != NULL) {
-               bus_release_resource(dev, SYS_RES_IRQ, sc->sc_irq_rid,
-                                    sc->sc_irq_res);
-       }
+       if (sc->sc_irq_handle != NULL)
+               bus_teardown_intr(dev, sc->sc_irq_res, sc->sc_irq_handle);
+       if (sc->sc_irq_res != NULL)
+               bus_release_resource(dev, SYS_RES_IRQ,
+                   rman_get_rid(sc->sc_irq_res), sc->sc_irq_res);
        if ((sc->sc_flags & ET_FLAG_MSI) != 0)
                pci_release_msi(dev);
-
-       if (sc->sc_mem_res != NULL) {
-               bus_release_resource(dev, SYS_RES_MEMORY, sc->sc_mem_rid,
-                                    sc->sc_mem_res);
-       }
+       if (sc->sc_mem_res != NULL)
+               bus_release_resource(dev, SYS_RES_MEMORY,
+                   rman_get_rid(sc->sc_mem_res), sc->sc_mem_res);
 
        if (sc->ifp != NULL)
                if_free(sc->ifp);
@@ -1257,12 +1260,13 @@ et_ioctl(struct ifnet *ifp, u_long cmd, 
 static void
 et_start_locked(struct ifnet *ifp)
 {
-       struct et_softc *sc = ifp->if_softc;
+       struct et_softc *sc;
+       struct mbuf *m_head = NULL;
        struct et_txbuf_data *tbd;
-       int trans;
+       int enq;
 
+       sc = ifp->if_softc;
        ET_LOCK_ASSERT(sc);
-       tbd = &sc->sc_tx_data;
 
        if ((sc->sc_flags & ET_FLAG_TXRX_ENABLED) == 0)
                return;
@@ -1270,30 +1274,32 @@ et_start_locked(struct ifnet *ifp)
        if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != 
IFF_DRV_RUNNING)
                return;
 
-       trans = 0;
-       for (;;) {
-               struct mbuf *m;
-
-               if ((tbd->tbd_used + ET_NSEG_SPARE) > ET_TX_NDESC) {
+       tbd = &sc->sc_tx_data;
+       for (enq = 0; !IFQ_DRV_IS_EMPTY(&ifp->if_snd); ) {
+               if (tbd->tbd_used + ET_NSEG_SPARE >= ET_TX_NDESC) {
                        ifp->if_drv_flags |= IFF_DRV_OACTIVE;
                        break;
                }
 
-               IFQ_DEQUEUE(&ifp->if_snd, m);
-               if (m == NULL)
+               IFQ_DRV_DEQUEUE(&ifp->if_snd, m_head);
+               if (m_head == NULL)
                        break;
 
-               if (et_encap(sc, &m)) {
-                       ifp->if_oerrors++;
-                       ifp->if_drv_flags |= IFF_DRV_OACTIVE;
+               if (et_encap(sc, &m_head)) {
+                       if (m_head == NULL) {
+                               ifp->if_oerrors++;
+                               break;
+                       }
+                       IFQ_DRV_PREPEND(&ifp->if_snd, m_head);
+                       if (tbd->tbd_used > 0)
+                               ifp->if_drv_flags |= IFF_DRV_OACTIVE;
                        break;
                }
-               trans = 1;
-
-               BPF_MTAP(ifp, m);
+               enq++;
+               ETHER_BPF_MTAP(ifp, m_head);
        }
 
-       if (trans)
+       if (enq > 0)
                sc->watchdog_timer = 5;
 }
 
@@ -2455,3 +2461,29 @@ et_setup_rxdesc(struct et_rxbuf_data *rb
        bus_dmamap_sync(rx_ring->rr_dtag, rx_ring->rr_dmap,
                        BUS_DMASYNC_PREWRITE);
 }
+
+static int
+et_suspend(device_t dev)
+{
+       struct et_softc *sc;
+
+       sc = device_get_softc(dev);
+       ET_LOCK(sc);
+       if ((sc->ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
+               et_stop(sc);
+       ET_UNLOCK(sc);
+       return (0);
+}
+
+static int
+et_resume(device_t dev)
+{
+       struct et_softc *sc;
+
+       sc = device_get_softc(dev);
+       ET_LOCK(sc);
+       if ((sc->ifp->if_flags & IFF_UP) != 0)
+               et_init_locked(sc);
+       ET_UNLOCK(sc);
+       return (0);
+}

Modified: stable/7/sys/dev/et/if_etreg.h
==============================================================================
--- stable/7/sys/dev/et/if_etreg.h      Fri Jan  6 18:16:57 2012        
(r229712)
+++ stable/7/sys/dev/et/if_etreg.h      Fri Jan  6 18:18:25 2012        
(r229713)
@@ -34,41 +34,6 @@
  * $DragonFly: src/sys/dev/netif/et/if_etreg.h,v 1.3 2007/10/23 14:28:42 sephe 
Exp $
  * $FreeBSD$
  */
-/*-
- * Portions of this code is derived from NetBSD which is covered by
- * the following license:
- *
- * Copyright (c) 2004, 2005 David Young.  All rights reserved.
- *
- * Programmed for NetBSD by David Young.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. The name of David Young may not be used to endorse or promote
- *    products derived from this software without specific prior
- *    written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY David Young ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
- * PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL David
- * Young BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
- * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
- * OF SUCH DAMAGE.
- *
- * $DragonFly: src/sys/sys/bitops.h,v 1.1 2007/10/14 04:15:17 sephe Exp $
- */
 
 #ifndef _IF_ETREG_H
 #define _IF_ETREG_H
_______________________________________________
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"

Reply via email to