if_sis.c (193096) | if_sis.c (195049) |
---|---|
1/*- 2 * Copyright (c) 2005 Poul-Henning Kamp <phk@FreeBSD.org> 3 * Copyright (c) 1997, 1998, 1999 4 * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 18 unchanged lines hidden (view full) --- 27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 31 * THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2005 Poul-Henning Kamp <phk@FreeBSD.org> 3 * Copyright (c) 1997, 1998, 1999 4 * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 18 unchanged lines hidden (view full) --- 27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 31 * THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34#include <sys/cdefs.h> |
35__FBSDID("$FreeBSD: head/sys/dev/sis/if_sis.c 193096 2009-05-30 15:14:44Z attilio $"); | 35__FBSDID("$FreeBSD: head/sys/dev/sis/if_sis.c 195049 2009-06-26 11:45:06Z rwatson $"); |
36 37/* 38 * SiS 900/SiS 7016 fast ethernet PCI NIC driver. Datasheets are 39 * available from http://www.sis.com.tw. 40 * 41 * This driver also supports the NatSemi DP83815. Datasheets are 42 * available from http://www.national.com. 43 * --- 724 unchanged lines hidden (view full) --- 768 filtsave = CSR_READ_4(sc, SIS_RXFILT_CTL); 769 770 /* first, zot all the existing hash bits */ 771 for (i = 0; i < 32; i++) { 772 CSR_WRITE_4(sc, SIS_RXFILT_CTL, NS_FILTADDR_FMEM_LO + (i*2)); 773 CSR_WRITE_4(sc, SIS_RXFILT_DATA, 0); 774 } 775 | 36 37/* 38 * SiS 900/SiS 7016 fast ethernet PCI NIC driver. Datasheets are 39 * available from http://www.sis.com.tw. 40 * 41 * This driver also supports the NatSemi DP83815. Datasheets are 42 * available from http://www.national.com. 43 * --- 724 unchanged lines hidden (view full) --- 768 filtsave = CSR_READ_4(sc, SIS_RXFILT_CTL); 769 770 /* first, zot all the existing hash bits */ 771 for (i = 0; i < 32; i++) { 772 CSR_WRITE_4(sc, SIS_RXFILT_CTL, NS_FILTADDR_FMEM_LO + (i*2)); 773 CSR_WRITE_4(sc, SIS_RXFILT_DATA, 0); 774 } 775 |
776 IF_ADDR_LOCK(ifp); | 776 if_maddr_rlock(ifp); |
777 TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { 778 if (ifma->ifma_addr->sa_family != AF_LINK) 779 continue; 780 h = sis_mchash(sc, 781 LLADDR((struct sockaddr_dl *)ifma->ifma_addr)); 782 index = h >> 3; 783 bit = h & 0x1F; 784 CSR_WRITE_4(sc, SIS_RXFILT_CTL, NS_FILTADDR_FMEM_LO + index); 785 if (bit > 0xF) 786 bit -= 0x10; 787 SIS_SETBIT(sc, SIS_RXFILT_DATA, (1 << bit)); 788 } | 777 TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { 778 if (ifma->ifma_addr->sa_family != AF_LINK) 779 continue; 780 h = sis_mchash(sc, 781 LLADDR((struct sockaddr_dl *)ifma->ifma_addr)); 782 index = h >> 3; 783 bit = h & 0x1F; 784 CSR_WRITE_4(sc, SIS_RXFILT_CTL, NS_FILTADDR_FMEM_LO + index); 785 if (bit > 0xF) 786 bit -= 0x10; 787 SIS_SETBIT(sc, SIS_RXFILT_DATA, (1 << bit)); 788 } |
789 IF_ADDR_UNLOCK(ifp); | 789 if_maddr_runlock(ifp); |
790 791 CSR_WRITE_4(sc, SIS_RXFILT_CTL, filtsave); 792 793 return; 794} 795 796static void 797sis_setmulti_sis(struct sis_softc *sc) --- 22 unchanged lines hidden (view full) --- 820 if (ifp->if_flags & IFF_PROMISC) 821 ctl |= SIS_RXFILTCTL_BROAD|SIS_RXFILTCTL_ALLPHYS; 822 for (i = 0; i < n; i++) 823 hashes[i] = ~0; 824 } else { 825 for (i = 0; i < n; i++) 826 hashes[i] = 0; 827 i = 0; | 790 791 CSR_WRITE_4(sc, SIS_RXFILT_CTL, filtsave); 792 793 return; 794} 795 796static void 797sis_setmulti_sis(struct sis_softc *sc) --- 22 unchanged lines hidden (view full) --- 820 if (ifp->if_flags & IFF_PROMISC) 821 ctl |= SIS_RXFILTCTL_BROAD|SIS_RXFILTCTL_ALLPHYS; 822 for (i = 0; i < n; i++) 823 hashes[i] = ~0; 824 } else { 825 for (i = 0; i < n; i++) 826 hashes[i] = 0; 827 i = 0; |
828 IF_ADDR_LOCK(ifp); | 828 if_maddr_rlock(ifp); |
829 TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { 830 if (ifma->ifma_addr->sa_family != AF_LINK) 831 continue; 832 h = sis_mchash(sc, 833 LLADDR((struct sockaddr_dl *)ifma->ifma_addr)); 834 hashes[h >> 4] |= 1 << (h & 0xf); 835 i++; 836 } | 829 TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { 830 if (ifma->ifma_addr->sa_family != AF_LINK) 831 continue; 832 h = sis_mchash(sc, 833 LLADDR((struct sockaddr_dl *)ifma->ifma_addr)); 834 hashes[h >> 4] |= 1 << (h & 0xf); 835 i++; 836 } |
837 IF_ADDR_UNLOCK(ifp); | 837 if_maddr_runlock(ifp); |
838 if (i > n) { 839 ctl |= SIS_RXFILTCTL_ALLMULTI; 840 for (i = 0; i < n; i++) 841 hashes[i] = ~0; 842 } 843 } 844 845 for (i = 0; i < n; i++) { --- 1461 unchanged lines hidden --- | 838 if (i > n) { 839 ctl |= SIS_RXFILTCTL_ALLMULTI; 840 for (i = 0; i < n; i++) 841 hashes[i] = ~0; 842 } 843 } 844 845 for (i = 0; i < n; i++) { --- 1461 unchanged lines hidden --- |