svn commit: r207257 - user/jmallett/octeon/sys/mips/cavium/octe

Juli Mallett jmallett at FreeBSD.org
Tue Apr 27 02:14:42 UTC 2010


Author: jmallett
Date: Tue Apr 27 02:14:42 2010
New Revision: 207257
URL: http://svn.freebsd.org/changeset/base/207257

Log:
  o) Remove the enabling of cvm_oct_common_set_multicast_list().  It's not quite
     ready and seems to basically not work.
  o) Avoid some gratuitous link state renegotiations since those are very, very
     slow.  (Inspired in part by em(4).)

Modified:
  user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.c
  user/jmallett/octeon/sys/mips/cavium/octe/octe.c

Modified: user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.c
==============================================================================
--- user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.c	Tue Apr 27 01:00:22 2010	(r207256)
+++ user/jmallett/octeon/sys/mips/cavium/octe/ethernet-common.c	Tue Apr 27 02:14:42 2010	(r207257)
@@ -100,6 +100,7 @@ static struct ifnet_stats *cvm_oct_commo
  */
 void cvm_oct_common_set_multicast_list(struct ifnet *ifp)
 {
+#if 0
 	cvmx_gmxx_prtx_cfg_t gmx_cfg;
 	cvm_oct_private_t *priv = (cvm_oct_private_t *)ifp->if_softc;
 	int interface = INTERFACE(priv->port);
@@ -132,6 +133,7 @@ void cvm_oct_common_set_multicast_list(s
 
 		cvmx_write_csr(CVMX_GMXX_PRTX_CFG(index, interface), gmx_cfg.u64);
 	}
+#endif
 }
 
 

Modified: user/jmallett/octeon/sys/mips/cavium/octe/octe.c
==============================================================================
--- user/jmallett/octeon/sys/mips/cavium/octe/octe.c	Tue Apr 27 01:00:22 2010	(r207256)
+++ user/jmallett/octeon/sys/mips/cavium/octe/octe.c	Tue Apr 27 02:14:42 2010	(r207257)
@@ -38,6 +38,8 @@
  *     attach the specific PHY for each interface without an miibus in between.
  */
 
+#include "opt_inet.h"
+
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/bus.h>
@@ -58,6 +60,11 @@
 #include <net/if_media.h>
 #include <net/if_types.h>
 
+#ifdef INET
+#include <netinet/in.h>
+#include <netinet/if_ether.h>
+#endif
+
 #include <dev/mii/mii.h>
 #include <dev/mii/miivar.h>
 
@@ -230,7 +237,8 @@ octe_init(void *arg)
 	priv = arg;
 	ifp = priv->ifp;
 
-	octe_stop(priv);
+	if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0)
+		octe_stop(priv);
 
 	if (priv->open != NULL)
 		priv->open(ifp);
@@ -238,8 +246,6 @@ octe_init(void *arg)
 	if (priv->miibus != NULL)
 		mii_mediachg(device_get_softc(priv->miibus));
 
-	cvm_oct_common_set_multicast_list(ifp);
-
 	ifp->if_drv_flags |= IFF_DRV_RUNNING;
 	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
 }
@@ -253,6 +259,9 @@ octe_stop(void *arg)
 	priv = arg;
 	ifp = priv->ifp;
 
+	if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
+		return;
+
 	if (priv->stop != NULL)
 		priv->stop(ifp);
 
@@ -394,12 +403,37 @@ octe_ioctl(struct ifnet *ifp, u_long cmd
 	cvm_oct_private_t *priv;
 	struct mii_data *mii;
 	struct ifreq *ifr;
+#ifdef INET
+	struct ifaddr *ifa;
+#endif
 	int error;
 
 	priv = ifp->if_softc;
 	ifr = (struct ifreq *)data;
+#ifdef INET
+	ifa = (struct ifaddr *)data;
+#endif
 
 	switch (cmd) {
+	case SIOCSIFADDR:
+#ifdef INET
+		/*
+		 * Avoid reinitialization unless it's necessary.
+		 */
+		if (ifa->ifa_addr->sa_family == AF_INET) {
+			ifp->if_flags |= IFF_UP;
+			if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
+				octe_init(priv);
+			arp_ifinit(ifp, ifa);
+
+			return (0);
+		}
+#endif
+		error = ether_ioctl(ifp, cmd, data);
+		if (error != 0)
+			return (error);
+		return (0);
+
 	case SIOCSIFFLAGS:
 		if ((ifp->if_flags & IFF_UP) != 0) {
 			if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)


More information about the svn-src-user mailing list