svn commit: r215957 - head/sys/mips/cavium/octe

Juli Mallett jmallett at FreeBSD.org
Sat Nov 27 22:42:42 UTC 2010


Author: jmallett
Date: Sat Nov 27 22:42:41 2010
New Revision: 215957
URL: http://svn.freebsd.org/changeset/base/215957

Log:
  Use if_transmit to avoid ifq locking in transmit path.

Modified:
  head/sys/mips/cavium/octe/octe.c

Modified: head/sys/mips/cavium/octe/octe.c
==============================================================================
--- head/sys/mips/cavium/octe/octe.c	Sat Nov 27 21:51:39 2010	(r215956)
+++ head/sys/mips/cavium/octe/octe.c	Sat Nov 27 22:42:41 2010	(r215957)
@@ -90,7 +90,7 @@ static int		octe_miibus_writereg(device_
 
 static void		octe_init(void *);
 static void		octe_stop(void *);
-static void		octe_start(struct ifnet *);
+static int		octe_transmit(struct ifnet *, struct mbuf *);
 
 static int		octe_mii_medchange(struct ifnet *);
 static void		octe_mii_medstat(struct ifnet *, struct ifmediareq *);
@@ -185,7 +185,6 @@ octe_attach(device_t dev)
 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST | IFF_ALLMULTI;
 	ifp->if_init = octe_init;
 	ifp->if_ioctl = octe_ioctl;
-	ifp->if_start = octe_start;
 
 	priv->if_flags = ifp->if_flags;
 
@@ -198,6 +197,8 @@ octe_attach(device_t dev)
 
 	ether_ifattach(ifp, priv->mac);
 
+	ifp->if_transmit = octe_transmit;
+
 	ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
 	ifp->if_capabilities = IFCAP_VLAN_MTU | IFCAP_HWCSUM;
 	ifp->if_capenable = ifp->if_capabilities;
@@ -317,38 +318,26 @@ octe_stop(void *arg)
 	ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
 }
 
-static void
-octe_start(struct ifnet *ifp)
+static int
+octe_transmit(struct ifnet *ifp, struct mbuf *m)
 {
 	cvm_oct_private_t *priv;
-	struct mbuf *m;
 	int error;
 
 	priv = ifp->if_softc;
 
-	if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != IFF_DRV_RUNNING)
-		return;
-
-	OCTE_TX_LOCK(priv);
-	while (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) {
-		IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
-
-		OCTE_TX_UNLOCK(priv);
-
-		if (priv->queue != -1) {
-			error = cvm_oct_xmit(m, ifp);
-		} else {
-			error = cvm_oct_xmit_pow(m, ifp);
-		}
-
-		if (error != 0) {
-			ifp->if_drv_flags |= IFF_DRV_OACTIVE;
-			return;
-		}
+	if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
+	    IFF_DRV_RUNNING) {
+		m_freem(m);
+		return (0);
+	}
 
-		OCTE_TX_LOCK(priv);
+	if (priv->queue != -1) {
+		error = cvm_oct_xmit(m, ifp);
+	} else {
+		error = cvm_oct_xmit_pow(m, ifp);
 	}
-	OCTE_TX_UNLOCK(priv);
+	return (error);
 }
 
 static int


More information about the svn-src-head mailing list