svn commit: r229711 - stable/9/sys/dev/et
Pyun YongHyeon
yongari at FreeBSD.org
Fri Jan 6 18:15:27 UTC 2012
Author: yongari
Date: Fri Jan 6 18:15:27 2012
New Revision: 229711
URL: http://svn.freebsd.org/changeset/base/229711
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/9/sys/dev/et/if_et.c
stable/9/sys/dev/et/if_etreg.h
Directory Properties:
stable/9/sys/ (props changed)
stable/9/sys/amd64/include/xen/ (props changed)
stable/9/sys/boot/ (props changed)
stable/9/sys/boot/i386/efi/ (props changed)
stable/9/sys/boot/ia64/efi/ (props changed)
stable/9/sys/boot/ia64/ski/ (props changed)
stable/9/sys/boot/powerpc/boot1.chrp/ (props changed)
stable/9/sys/boot/powerpc/ofw/ (props changed)
stable/9/sys/cddl/contrib/opensolaris/ (props changed)
stable/9/sys/conf/ (props changed)
stable/9/sys/contrib/dev/acpica/ (props changed)
stable/9/sys/contrib/octeon-sdk/ (props changed)
stable/9/sys/contrib/pf/ (props changed)
stable/9/sys/contrib/x86emu/ (props changed)
Modified: stable/9/sys/dev/et/if_et.c
==============================================================================
--- stable/9/sys/dev/et/if_et.c Fri Jan 6 16:57:56 2012 (r229710)
+++ stable/9/sys/dev/et/if_et.c Fri Jan 6 18:15:27 2012 (r229711)
@@ -87,6 +87,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);
@@ -169,6 +171,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(miibus_readreg, et_miibus_readreg),
DEVMETHOD(miibus_writereg, et_miibus_writereg),
@@ -222,7 +226,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);
@@ -240,6 +244,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) {
@@ -331,10 +336,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);
@@ -347,7 +352,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);
@@ -371,31 +378,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);
@@ -1253,12 +1256,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;
@@ -1266,30 +1270,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;
}
@@ -2451,3 +2457,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/9/sys/dev/et/if_etreg.h
==============================================================================
--- stable/9/sys/dev/et/if_etreg.h Fri Jan 6 16:57:56 2012 (r229710)
+++ stable/9/sys/dev/et/if_etreg.h Fri Jan 6 18:15:27 2012 (r229711)
@@ -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
More information about the svn-src-all
mailing list