Hello Bill,

* Bill Paul <[EMAIL PROTECTED]> wrote:
> > - Switching from and to promiscuous mode takes 7 seconds. All packets
> >   are dropped in the mean time.
> 
> The SIOCSIFFLAGS handler in re_ioctl() currently just takes a shortcut
> of calling re_init(). While this does eventually end up changing the RX
> filter settings accordingly, it takes a while because re_init() also shuts
> down and re-initializes the whole chip (including resetting the link).
> 
> This is relatively easy to fix though. The IFF_PROMISC flag can be
> singled out and handled separately. (A few other drivers already do this.)

I wrote a small patch that moves all rxcfg code in re_init_locked() to a
separate function. This way, we can just call that function instead of
re_init_locked when reaching SIOCSIFFLAGS. I tested it by reverting your
patch and ping6'ing the box. When I run tcpdump, the box doesn't freeze
and enters promiscuous mode (suddenly the ping6 starts to work then).

What do you think about this patch?

Yours,
-- 
 Ed Schouten <[EMAIL PROTECTED]>
 WWW: http://g-rave.nl/
--- sys/dev/re/if_re.c  Fri Dec  1 17:01:48 2006
+++ sys/dev/re/if_re.c  Fri Dec  1 17:02:35 2006
@@ -249,6 +249,7 @@
 static int re_ioctl            (struct ifnet *, u_long, caddr_t);
 static void re_init            (void *);
 static void re_init_locked     (struct rl_softc *);
+static void re_init_rxcfg      (struct rl_softc *);
 static void re_stop            (struct rl_softc *);
 static void re_watchdog                (struct ifnet *);
 static int re_suspend          (device_t);
@@ -2254,7 +2255,6 @@
 {
        struct ifnet            *ifp = sc->rl_ifp;
        struct mii_data         *mii;
-       u_int32_t               rxcfg = 0;
        union {
                uint32_t align_dummy;
                u_char eaddr[ETHER_ADDR_LEN];
@@ -2316,31 +2316,8 @@
        } else
                CSR_WRITE_4(sc, RL_TXCFG, RL_TXCFG_CONFIG);
        CSR_WRITE_4(sc, RL_RXCFG, RL_RXCFG_CONFIG);
-
-       /* Set the individual bit to receive frames for this host only. */
-       rxcfg = CSR_READ_4(sc, RL_RXCFG);
-       rxcfg |= RL_RXCFG_RX_INDIV;
-
-       /* If we want promiscuous mode, set the allframes bit. */
-       if (ifp->if_flags & IFF_PROMISC)
-               rxcfg |= RL_RXCFG_RX_ALLPHYS;
-       else
-               rxcfg &= ~RL_RXCFG_RX_ALLPHYS;
-       CSR_WRITE_4(sc, RL_RXCFG, rxcfg);
-
-       /*
-        * Set capture broadcast bit to capture broadcast frames.
-        */
-       if (ifp->if_flags & IFF_BROADCAST)
-               rxcfg |= RL_RXCFG_RX_BROAD;
-       else
-               rxcfg &= ~RL_RXCFG_RX_BROAD;
-       CSR_WRITE_4(sc, RL_RXCFG, rxcfg);
-
-       /*
-        * Program the multicast filter, if necessary.
-        */
-       re_setmulti(sc);
+       
+       re_init_rxcfg(sc);
 
 #ifdef DEVICE_POLLING
        /*
@@ -2422,6 +2399,39 @@
        callout_reset(&sc->rl_stat_callout, hz, re_tick, sc);
 }
 
+static void
+re_init_rxcfg(sc)
+       struct rl_softc         *sc;
+{
+       u_int32_t               rxcfg;
+       struct ifnet            *ifp = sc->rl_ifp;
+
+       /* Set the individual bit to receive frames for this host only. */
+       rxcfg = CSR_READ_4(sc, RL_RXCFG);
+       rxcfg |= RL_RXCFG_RX_INDIV;
+
+       /* If we want promiscuous mode, set the allframes bit. */
+       if (ifp->if_flags & IFF_PROMISC)
+               rxcfg |= RL_RXCFG_RX_ALLPHYS;
+       else
+               rxcfg &= ~RL_RXCFG_RX_ALLPHYS;
+       CSR_WRITE_4(sc, RL_RXCFG, rxcfg);
+
+       /*
+        * Set capture broadcast bit to capture broadcast frames.
+        */
+       if (ifp->if_flags & IFF_BROADCAST)
+               rxcfg |= RL_RXCFG_RX_BROAD;
+       else
+               rxcfg &= ~RL_RXCFG_RX_BROAD;
+       CSR_WRITE_4(sc, RL_RXCFG, rxcfg);
+
+       /*
+        * Program the multicast filter, if necessary.
+        */
+       re_setmulti(sc);
+}
+
 /*
  * Set media options.
  */
@@ -2484,7 +2494,7 @@
        case SIOCSIFFLAGS:
                RL_LOCK(sc);
                if (ifp->if_flags & IFF_UP)
-                       re_init_locked(sc);
+                       re_init_rxcfg(sc);
                else if (ifp->if_drv_flags & IFF_DRV_RUNNING)
                        re_stop(sc);
                RL_UNLOCK(sc);

Attachment: pgpGLmcHO3fTD.pgp
Description: PGP signature

Reply via email to