Module Name: src Committed By: riastradh Date: Mon Oct 9 17:42:09 UTC 2023
Modified Files: src/sys/dev/usb: usbnet.c Log Message: usbnet(9): Fix sense of conditional in usbnet_ifflags_cb. This appears to have been mistranscribed in revision 1.1 of usbnet.c. PR kern/57645 XXX pullup-10 To generate a diff of this commit: cvs rdiff -u -r1.115 -r1.116 src/sys/dev/usb/usbnet.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/usb/usbnet.c diff -u src/sys/dev/usb/usbnet.c:1.115 src/sys/dev/usb/usbnet.c:1.116 --- src/sys/dev/usb/usbnet.c:1.115 Mon Oct 9 17:42:00 2023 +++ src/sys/dev/usb/usbnet.c Mon Oct 9 17:42:09 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: usbnet.c,v 1.115 2023/10/09 17:42:00 riastradh Exp $ */ +/* $NetBSD: usbnet.c,v 1.116 2023/10/09 17:42:09 riastradh Exp $ */ /* * Copyright (c) 2019 Matthew R. Green @@ -31,7 +31,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: usbnet.c,v 1.115 2023/10/09 17:42:00 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: usbnet.c,v 1.116 2023/10/09 17:42:09 riastradh Exp $"); #include <sys/param.h> #include <sys/kernel.h> @@ -1016,34 +1016,43 @@ usbnet_ifflags_cb(struct ethercom *ec) struct ifnet *ifp = &ec->ec_if; struct usbnet *un = ifp->if_softc; struct usbnet_private * const unp = un->un_pri; - int rv = 0; KASSERTMSG(IFNET_LOCKED(ifp), "%s", ifp->if_xname); const u_short changed = ifp->if_flags ^ unp->unp_if_flags; - if ((changed & ~(IFF_CANTCHANGE | IFF_DEBUG)) == 0) { - mutex_enter(&unp->unp_mcastlock); - unp->unp_if_flags = ifp->if_flags; - mutex_exit(&unp->unp_mcastlock); - /* - * XXX Can we just do uno_mcast synchronously here - * instead of resetting the whole interface? - * - * Not yet, because some usbnet drivers (e.g., aue(4)) - * initialize the hardware differently in uno_init - * depending on IFF_PROMISC. But some (again, aue(4)) - * _also_ need to know whether IFF_PROMISC is set in - * uno_mcast and do something different with it there. - * Maybe the logic can be unified, but it will require - * an audit and testing of all the usbnet drivers. - */ - if (changed & IFF_PROMISC) - rv = ENETRESET; - } else { - rv = ENETRESET; - } - return rv; + /* + * If any user-settable flags have changed other than + * IFF_DEBUG, just reset the interface. + */ + if ((changed & ~(IFF_CANTCHANGE | IFF_DEBUG)) != 0) + return ENETRESET; + + /* + * Otherwise, cache the flags change so we can read the flags + * under uno_mcastlock for multicast updates in SIOCADDMULTI or + * SIOCDELMULTI without IFNET_LOCK. + */ + mutex_enter(&unp->unp_mcastlock); + unp->unp_if_flags = ifp->if_flags; + mutex_exit(&unp->unp_mcastlock); + + /* + * If we're switching on or off promiscuous mode, reprogram the + * hardware multicast filter now. + * + * XXX Actually, reset the interface, because some usbnet + * drivers (e.g., aue(4)) initialize the hardware differently + * in uno_init depending on IFF_PROMISC. But some (again, + * aue(4)) _also_ need to know whether IFF_PROMISC is set in + * uno_mcast and do something different with it there. Maybe + * the logic can be unified, but it will require an audit and + * testing of all the usbnet drivers. + */ + if (changed & IFF_PROMISC) + return ENETRESET; + + return 0; } bool