On Thursday 30 July 2009 05:00:31 Brad wrote:
> The following diff rewrites parts of the code for promiscuous mode
> and multicast handling for the nfe(4) driver. Please test promisc
> mode and multicast mode of operation with any nfe(4) adapters.
>
> Please provide a dmesg.

I'm still looking for some testers..

>
> Index: if_nfe.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_nfe.c,v
> retrieving revision 1.89
> diff -u -p -r1.89 if_nfe.c
> --- if_nfe.c  18 Jun 2009 08:19:03 -0000      1.89
> +++ if_nfe.c  20 Jun 2009 02:52:31 -0000
> @@ -100,7 +100,7 @@ void      nfe_reset_tx_ring(struct nfe_softc
>  void nfe_free_tx_ring(struct nfe_softc *, struct nfe_tx_ring *);
>  int  nfe_ifmedia_upd(struct ifnet *);
>  void nfe_ifmedia_sts(struct ifnet *, struct ifmediareq *);
> -void nfe_setmulti(struct nfe_softc *);
> +void nfe_iff(struct nfe_softc *);
>  void nfe_get_macaddr(struct nfe_softc *, uint8_t *);
>  void nfe_set_macaddr(struct nfe_softc *, const uint8_t *);
>  void nfe_tick(void *);
> @@ -543,24 +543,14 @@ nfe_ioctl(struct ifnet *ifp, u_long cmd,
>
>       case SIOCSIFFLAGS:
>               if (ifp->if_flags & IFF_UP) {
> -                     /*
> -                      * If only the PROMISC or ALLMULTI flag changes, then
> -                      * don't do a full re-init of the chip, just update
> -                      * the Rx filter.
> -                      */
> -                     if ((ifp->if_flags & IFF_RUNNING) &&
> -                         ((ifp->if_flags ^ sc->sc_if_flags) &
> -                          (IFF_ALLMULTI | IFF_PROMISC)) != 0) {
> -                             nfe_setmulti(sc);
> -                     } else {
> -                             if (!(ifp->if_flags & IFF_RUNNING))
> -                                     nfe_init(ifp);
> -                     }
> +                     if (ifp->if_flags & IFF_RUNNING)
> +                             error = ENETRESET;
> +                     else
> +                             nfe_init(ifp);
>               } else {
>                       if (ifp->if_flags & IFF_RUNNING)
>                               nfe_stop(ifp, 1);
>               }
> -             sc->sc_if_flags = ifp->if_flags;
>               break;
>
>       case SIOCSIFMEDIA:
> @@ -574,7 +564,7 @@ nfe_ioctl(struct ifnet *ifp, u_long cmd,
>
>       if (error == ENETRESET) {
>               if (ifp->if_flags & IFF_RUNNING)
> -                     nfe_setmulti(sc);
> +                     nfe_iff(sc);
>               error = 0;
>       }
>
> @@ -1156,7 +1146,7 @@ nfe_init(struct ifnet *ifp)
>       NFE_WRITE(sc, NFE_RXTX_CTL, NFE_RXTX_BIT1 | sc->rxtxctl);
>
>       /* set Rx filter */
> -     nfe_setmulti(sc);
> +     nfe_iff(sc);
>
>       nfe_ifmedia_upd(ifp);
>
> @@ -1698,39 +1688,45 @@ nfe_ifmedia_sts(struct ifnet *ifp, struc
>  }
>
>  void
> -nfe_setmulti(struct nfe_softc *sc)
> +nfe_iff(struct nfe_softc *sc)
>  {
> +     struct ifnet *ifp = &sc->sc_arpcom.ac_if;
>       struct arpcom *ac = &sc->sc_arpcom;
> -     struct ifnet *ifp = &ac->ac_if;
>       struct ether_multi *enm;
>       struct ether_multistep step;
>       uint8_t addr[ETHER_ADDR_LEN], mask[ETHER_ADDR_LEN];
> -     uint32_t filter = NFE_RXFILTER_MAGIC;
> +     uint32_t filter;
>       int i;
>
> -     if ((ifp->if_flags & (IFF_ALLMULTI | IFF_PROMISC)) != 0) {
> +     filter = NFE_RXFILTER_MAGIC;
> +     ifp->if_flags &= ~IFF_ALLMULTI;
> +
> +     if (ifp->if_flags & IFF_PROMISC || ac->ac_multirangecnt > 0) {
> +             ifp->if_flags |= IFF_ALLMULTI;
> +             if (ifp->if_flags & IFF_PROMISC)
> +                     filter |= NFE_PROMISC;
> +             else
> +                     filter |= NFE_U2M;
>               bzero(addr, ETHER_ADDR_LEN);
>               bzero(mask, ETHER_ADDR_LEN);
>               goto done;
>       }
>
> +     filter |= NFE_U2M;
> +
>       bcopy(etherbroadcastaddr, addr, ETHER_ADDR_LEN);
>       bcopy(etherbroadcastaddr, mask, ETHER_ADDR_LEN);
>
>       ETHER_FIRST_MULTI(step, ac, enm);
>       while (enm != NULL) {
> -             if (bcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN)) {
> -                     ifp->if_flags |= IFF_ALLMULTI;
> -                     bzero(addr, ETHER_ADDR_LEN);
> -                     bzero(mask, ETHER_ADDR_LEN);
> -                     goto done;
> -             }
>               for (i = 0; i < ETHER_ADDR_LEN; i++) {
>                       addr[i] &=  enm->enm_addrlo[i];
>                       mask[i] &= ~enm->enm_addrlo[i];
>               }
> +
>               ETHER_NEXT_MULTI(step, enm);
>       }
> +
>       for (i = 0; i < ETHER_ADDR_LEN; i++)
>               mask[i] |= addr[i];
>
> @@ -1746,7 +1742,6 @@ done:
>       NFE_WRITE(sc, NFE_MULTIMASK_LO,
>           mask[5] <<  8 | mask[4]);
>
> -     filter |= (ifp->if_flags & IFF_PROMISC) ? NFE_PROMISC : NFE_U2M;
>       NFE_WRITE(sc, NFE_RXFILTER, filter);
>  }
>
> Index: if_nfevar.h
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_nfevar.h,v
> retrieving revision 1.13
> diff -u -p -r1.13 if_nfevar.h
> --- if_nfevar.h       5 Dec 2007 08:30:33 -0000       1.13
> +++ if_nfevar.h       20 Jun 2009 02:39:01 -0000
> @@ -75,7 +75,6 @@ struct nfe_softc {
>       struct timeout          sc_tick_ch;
>       void                    *sc_powerhook;
>
> -     int                     sc_if_flags;
>       u_int                   sc_flags;
>  #define NFE_JUMBO_SUP                0x01
>  #define NFE_40BIT_ADDR               0x02



-- 
This message has been scanned for viruses and
dangerous content by MailScanner, and is
believed to be clean.

Reply via email to