A diff for the ne(4) NE2000 driver to clean up the ioctl handler code
a bit and eliminate unnecessary resets when reconfiguring IP addresses.
Please test and provide a dmesg.
Index: dp8390.c
===================================================================
RCS file: /cvs/src/sys/dev/ic/dp8390.c,v
retrieving revision 1.41
diff -u -p -r1.41 dp8390.c
--- dp8390.c 28 Nov 2008 02:44:17 -0000 1.41
+++ dp8390.c 13 Dec 2009 18:36:10 -0000
@@ -807,9 +807,6 @@ dp8390_intr(void *arg)
}
}
-/*
- * Process an ioctl request. This code needs some work - it looks pretty ugly.
- */
int
dp8390_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
{
@@ -825,46 +822,29 @@ dp8390_ioctl(struct ifnet *ifp, u_long c
if ((error = dp8390_enable(sc)) != 0)
break;
ifp->if_flags |= IFF_UP;
-
- switch (ifa->ifa_addr->sa_family) {
-#ifdef INET
- case AF_INET:
+ if (!(ifp->if_flags & IFF_RUNNING))
dp8390_init(sc);
+#ifdef INET
+ if (ifa->ifa_addr->sa_family == AF_INET)
arp_ifinit(&sc->sc_arpcom, ifa);
- break;
#endif
- default:
- dp8390_init(sc);
- break;
- }
break;
case SIOCSIFFLAGS:
- if ((ifp->if_flags & IFF_UP) == 0 &&
- (ifp->if_flags & IFF_RUNNING) != 0) {
- /*
- * If interface is marked down and it is running, then
- * stop it.
- */
- dp8390_stop(sc);
- ifp->if_flags &= ~IFF_RUNNING;
- dp8390_disable(sc);
- } else if ((ifp->if_flags & IFF_UP) != 0 &&
- (ifp->if_flags & IFF_RUNNING) == 0) {
- /*
- * If interface is marked up and it is stopped, then
- * start it.
- */
- if ((error = dp8390_enable(sc)) != 0)
- break;
- dp8390_init(sc);
- } else if ((ifp->if_flags & IFF_UP) != 0) {
- /*
- * Reset the interface to pick up changes in any other
- * flags that affect hardware registers.
- */
- dp8390_stop(sc);
- dp8390_init(sc);
+ if (ifp->if_flags & IFF_UP) {
+ if (ifp->if_flags & IFF_RUNNING)
+ error = ENETRESET;
+ else {
+ if ((error = dp8390_enable(sc)) != 0)
+ break;
+ dp8390_init(sc);
+ }
+ } else {
+ if (ifp->if_flags & IFF_RUNNING) {
+ dp8390_stop(sc);
+ ifp->if_flags &= ~IFF_RUNNING;
+ dp8390_disable(sc);
+ }
}
break;
--
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.