Except "rewriting parts of the code", what does this diff do?
Does it fix an existing bug?
Or is it just rewriting for the sake of rewriting?

Damien


| 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.
| 
| 
| 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