if_sf.c (146734) | if_sf.c (147256) |
---|---|
1/*- 2 * Copyright (c) 1997, 1998, 1999 3 * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 17 unchanged lines hidden (view full) --- 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 30 * THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 1997, 1998, 1999 3 * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 17 unchanged lines hidden (view full) --- 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 30 * THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33#include <sys/cdefs.h> |
34__FBSDID("$FreeBSD: head/sys/dev/sf/if_sf.c 146734 2005-05-29 04:42:30Z nyan $"); | 34__FBSDID("$FreeBSD: head/sys/dev/sf/if_sf.c 147256 2005-06-10 16:49:24Z brooks $"); |
35 36/* 37 * Adaptec AIC-6915 "Starfire" PCI fast ethernet driver for FreeBSD. 38 * Programming manual is available from: 39 * http://download.adaptec.com/pdfs/user_guides/aic6915_pg.pdf. 40 * 41 * Written by Bill Paul <wpaul@ctr.columbia.edu> 42 * Department of Electical Engineering --- 45 unchanged lines hidden (view full) --- 88#include <sys/module.h> 89#include <sys/socket.h> 90 91#include <net/if.h> 92#include <net/if_arp.h> 93#include <net/ethernet.h> 94#include <net/if_dl.h> 95#include <net/if_media.h> | 35 36/* 37 * Adaptec AIC-6915 "Starfire" PCI fast ethernet driver for FreeBSD. 38 * Programming manual is available from: 39 * http://download.adaptec.com/pdfs/user_guides/aic6915_pg.pdf. 40 * 41 * Written by Bill Paul <wpaul@ctr.columbia.edu> 42 * Department of Electical Engineering --- 45 unchanged lines hidden (view full) --- 88#include <sys/module.h> 89#include <sys/socket.h> 90 91#include <net/if.h> 92#include <net/if_arp.h> 93#include <net/ethernet.h> 94#include <net/if_dl.h> 95#include <net/if_media.h> |
96#include <net/if_types.h> |
|
96 97#include <net/bpf.h> 98 99#include <vm/vm.h> /* for vtophys */ 100#include <vm/pmap.h> /* for vtophys */ 101#include <machine/bus.h> 102#include <machine/resource.h> 103#include <sys/bus.h> --- 306 unchanged lines hidden (view full) --- 410sf_setmulti(sc) 411 struct sf_softc *sc; 412{ 413 struct ifnet *ifp; 414 int i; 415 struct ifmultiaddr *ifma; 416 u_int8_t dummy[] = { 0, 0, 0, 0, 0, 0 }; 417 | 97 98#include <net/bpf.h> 99 100#include <vm/vm.h> /* for vtophys */ 101#include <vm/pmap.h> /* for vtophys */ 102#include <machine/bus.h> 103#include <machine/resource.h> 104#include <sys/bus.h> --- 306 unchanged lines hidden (view full) --- 411sf_setmulti(sc) 412 struct sf_softc *sc; 413{ 414 struct ifnet *ifp; 415 int i; 416 struct ifmultiaddr *ifma; 417 u_int8_t dummy[] = { 0, 0, 0, 0, 0, 0 }; 418 |
418 ifp = &sc->arpcom.ac_if; | 419 ifp = sc->sf_ifp; |
419 420 /* First zot all the existing filters. */ 421 for (i = 1; i < SF_RXFILT_PERFECT_CNT; i++) 422 sf_setperf(sc, i, (char *)&dummy); 423 for (i = SF_RXFILT_HASH_BASE; 424 i < (SF_RXFILT_HASH_MAX + 1); i += 4) 425 csr_write_4(sc, i, 0); 426 SF_CLRBIT(sc, SF_RXFILT, SF_RXFILT_ALLMULTI); --- 209 unchanged lines hidden (view full) --- 636static int 637sf_attach(dev) 638 device_t dev; 639{ 640 int i; 641 struct sf_softc *sc; 642 struct ifnet *ifp; 643 int unit, rid, error = 0; | 420 421 /* First zot all the existing filters. */ 422 for (i = 1; i < SF_RXFILT_PERFECT_CNT; i++) 423 sf_setperf(sc, i, (char *)&dummy); 424 for (i = SF_RXFILT_HASH_BASE; 425 i < (SF_RXFILT_HASH_MAX + 1); i += 4) 426 csr_write_4(sc, i, 0); 427 SF_CLRBIT(sc, SF_RXFILT, SF_RXFILT_ALLMULTI); --- 209 unchanged lines hidden (view full) --- 637static int 638sf_attach(dev) 639 device_t dev; 640{ 641 int i; 642 struct sf_softc *sc; 643 struct ifnet *ifp; 644 int unit, rid, error = 0; |
645 u_char eaddr[6]; |
|
644 645 sc = device_get_softc(dev); 646 unit = device_get_unit(dev); 647 648 mtx_init(&sc->sf_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, 649 MTX_DEF | MTX_RECURSE); 650 /* 651 * Map control/status registers. --- 26 unchanged lines hidden (view full) --- 678 callout_handle_init(&sc->sf_stat_ch); 679 /* Reset the adapter. */ 680 sf_reset(sc); 681 682 /* 683 * Get station address from the EEPROM. 684 */ 685 for (i = 0; i < ETHER_ADDR_LEN; i++) | 646 647 sc = device_get_softc(dev); 648 unit = device_get_unit(dev); 649 650 mtx_init(&sc->sf_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, 651 MTX_DEF | MTX_RECURSE); 652 /* 653 * Map control/status registers. --- 26 unchanged lines hidden (view full) --- 680 callout_handle_init(&sc->sf_stat_ch); 681 /* Reset the adapter. */ 682 sf_reset(sc); 683 684 /* 685 * Get station address from the EEPROM. 686 */ 687 for (i = 0; i < ETHER_ADDR_LEN; i++) |
686 sc->arpcom.ac_enaddr[i] = | 688 eaddr[i] = |
687 sf_read_eeprom(sc, SF_EE_NODEADDR + ETHER_ADDR_LEN - i); 688 689 sc->sf_unit = unit; 690 691 /* Allocate the descriptor queues. */ 692 sc->sf_ldata = contigmalloc(sizeof(struct sf_list_data), M_DEVBUF, 693 M_NOWAIT, 0, 0xffffffff, PAGE_SIZE, 0); 694 --- 8 unchanged lines hidden (view full) --- 703 /* Do MII setup. */ 704 if (mii_phy_probe(dev, &sc->sf_miibus, 705 sf_ifmedia_upd, sf_ifmedia_sts)) { 706 printf("sf%d: MII without any phy!\n", sc->sf_unit); 707 error = ENXIO; 708 goto fail; 709 } 710 | 689 sf_read_eeprom(sc, SF_EE_NODEADDR + ETHER_ADDR_LEN - i); 690 691 sc->sf_unit = unit; 692 693 /* Allocate the descriptor queues. */ 694 sc->sf_ldata = contigmalloc(sizeof(struct sf_list_data), M_DEVBUF, 695 M_NOWAIT, 0, 0xffffffff, PAGE_SIZE, 0); 696 --- 8 unchanged lines hidden (view full) --- 705 /* Do MII setup. */ 706 if (mii_phy_probe(dev, &sc->sf_miibus, 707 sf_ifmedia_upd, sf_ifmedia_sts)) { 708 printf("sf%d: MII without any phy!\n", sc->sf_unit); 709 error = ENXIO; 710 goto fail; 711 } 712 |
711 ifp = &sc->arpcom.ac_if; | 713 ifp = sc->sf_ifp = if_alloc(IFT_ETHER); 714 if (ifp == NULL) { 715 printf("sf%d: can not if_alloc()\n", sc->sf_unit); 716 error = ENOSPC; 717 goto fail; 718 } |
712 ifp->if_softc = sc; 713 if_initname(ifp, device_get_name(dev), device_get_unit(dev)); 714 ifp->if_mtu = ETHERMTU; 715 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST | 716 IFF_NEEDSGIANT; 717 ifp->if_ioctl = sf_ioctl; 718 ifp->if_start = sf_start; 719 ifp->if_watchdog = sf_watchdog; --- 5 unchanged lines hidden (view full) --- 725#ifdef DEVICE_POLLING 726 ifp->if_capabilities |= IFCAP_POLLING; 727#endif /* DEVICE_POLLING */ 728 ifp->if_capenable = ifp->if_capabilities; 729 730 /* 731 * Call MI attach routine. 732 */ | 719 ifp->if_softc = sc; 720 if_initname(ifp, device_get_name(dev), device_get_unit(dev)); 721 ifp->if_mtu = ETHERMTU; 722 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST | 723 IFF_NEEDSGIANT; 724 ifp->if_ioctl = sf_ioctl; 725 ifp->if_start = sf_start; 726 ifp->if_watchdog = sf_watchdog; --- 5 unchanged lines hidden (view full) --- 732#ifdef DEVICE_POLLING 733 ifp->if_capabilities |= IFCAP_POLLING; 734#endif /* DEVICE_POLLING */ 735 ifp->if_capenable = ifp->if_capabilities; 736 737 /* 738 * Call MI attach routine. 739 */ |
733 ether_ifattach(ifp, sc->arpcom.ac_enaddr); | 740 ether_ifattach(ifp, eaddr); |
734 735 /* Hook interrupt last to avoid having to lock softc */ 736 error = bus_setup_intr(dev, sc->sf_irq, INTR_TYPE_NET, 737 sf_intr, sc, &sc->sf_intrhand); 738 739 if (error) { 740 printf("sf%d: couldn't set up irq\n", unit); 741 ether_ifdetach(ifp); | 741 742 /* Hook interrupt last to avoid having to lock softc */ 743 error = bus_setup_intr(dev, sc->sf_irq, INTR_TYPE_NET, 744 sf_intr, sc, &sc->sf_intrhand); 745 746 if (error) { 747 printf("sf%d: couldn't set up irq\n", unit); 748 ether_ifdetach(ifp); |
749 if_free(ifp); |
|
742 goto fail; 743 } 744 745fail: 746 if (error) 747 sf_detach(dev); 748 749 return(error); --- 11 unchanged lines hidden (view full) --- 761 device_t dev; 762{ 763 struct sf_softc *sc; 764 struct ifnet *ifp; 765 766 sc = device_get_softc(dev); 767 KASSERT(mtx_initialized(&sc->sf_mtx), ("sf mutex not initialized")); 768 SF_LOCK(sc); | 750 goto fail; 751 } 752 753fail: 754 if (error) 755 sf_detach(dev); 756 757 return(error); --- 11 unchanged lines hidden (view full) --- 769 device_t dev; 770{ 771 struct sf_softc *sc; 772 struct ifnet *ifp; 773 774 sc = device_get_softc(dev); 775 KASSERT(mtx_initialized(&sc->sf_mtx), ("sf mutex not initialized")); 776 SF_LOCK(sc); |
769 ifp = &sc->arpcom.ac_if; | 777 ifp = sc->sf_ifp; |
770 771 /* These should only be active if attach succeeded */ 772 if (device_is_attached(dev)) { 773 sf_stop(sc); 774 ether_ifdetach(ifp); | 778 779 /* These should only be active if attach succeeded */ 780 if (device_is_attached(dev)) { 781 sf_stop(sc); 782 ether_ifdetach(ifp); |
783 if_free(ifp); |
|
775 } 776 if (sc->sf_miibus) 777 device_delete_child(dev, sc->sf_miibus); 778 bus_generic_detach(dev); 779 780 if (sc->sf_intrhand) 781 bus_teardown_intr(dev, sc->sf_irq, sc->sf_intrhand); 782 if (sc->sf_irq) --- 116 unchanged lines hidden (view full) --- 899 struct ifnet *ifp; 900 struct sf_rx_bufdesc_type0 *desc; 901 struct sf_rx_cmpdesc_type3 *cur_rx; 902 u_int32_t rxcons, rxprod; 903 int cmpprodidx, cmpconsidx, bufprodidx; 904 905 SF_LOCK_ASSERT(sc); 906 | 784 } 785 if (sc->sf_miibus) 786 device_delete_child(dev, sc->sf_miibus); 787 bus_generic_detach(dev); 788 789 if (sc->sf_intrhand) 790 bus_teardown_intr(dev, sc->sf_irq, sc->sf_intrhand); 791 if (sc->sf_irq) --- 116 unchanged lines hidden (view full) --- 908 struct ifnet *ifp; 909 struct sf_rx_bufdesc_type0 *desc; 910 struct sf_rx_cmpdesc_type3 *cur_rx; 911 u_int32_t rxcons, rxprod; 912 int cmpprodidx, cmpconsidx, bufprodidx; 913 914 SF_LOCK_ASSERT(sc); 915 |
907 ifp = &sc->arpcom.ac_if; | 916 ifp = sc->sf_ifp; |
908 909 rxcons = csr_read_4(sc, SF_CQ_CONSIDX); 910 rxprod = csr_read_4(sc, SF_RXDQ_PTR_Q1); 911 cmpprodidx = SF_IDX_LO(csr_read_4(sc, SF_CQ_PRODIDX)); 912 cmpconsidx = SF_IDX_LO(rxcons); 913 bufprodidx = SF_IDX_LO(rxprod); 914 915 while (cmpconsidx != cmpprodidx) { --- 52 unchanged lines hidden (view full) --- 968sf_txeof(sc) 969 struct sf_softc *sc; 970{ 971 int txcons, cmpprodidx, cmpconsidx; 972 struct sf_tx_cmpdesc_type1 *cur_cmp; 973 struct sf_tx_bufdesc_type0 *cur_tx; 974 struct ifnet *ifp; 975 | 917 918 rxcons = csr_read_4(sc, SF_CQ_CONSIDX); 919 rxprod = csr_read_4(sc, SF_RXDQ_PTR_Q1); 920 cmpprodidx = SF_IDX_LO(csr_read_4(sc, SF_CQ_PRODIDX)); 921 cmpconsidx = SF_IDX_LO(rxcons); 922 bufprodidx = SF_IDX_LO(rxprod); 923 924 while (cmpconsidx != cmpprodidx) { --- 52 unchanged lines hidden (view full) --- 977sf_txeof(sc) 978 struct sf_softc *sc; 979{ 980 int txcons, cmpprodidx, cmpconsidx; 981 struct sf_tx_cmpdesc_type1 *cur_cmp; 982 struct sf_tx_bufdesc_type0 *cur_tx; 983 struct ifnet *ifp; 984 |
976 ifp = &sc->arpcom.ac_if; | 985 ifp = sc->sf_ifp; |
977 978 txcons = csr_read_4(sc, SF_CQ_CONSIDX); 979 cmpprodidx = SF_IDX_HI(csr_read_4(sc, SF_CQ_PRODIDX)); 980 cmpconsidx = SF_IDX_HI(txcons); 981 982 while (cmpconsidx != cmpprodidx) { 983 cur_cmp = &sc->sf_ldata->sf_tx_clist[cmpconsidx]; 984 cur_tx = &sc->sf_ldata->sf_tx_dlist[cur_cmp->sf_index >> 7]; --- 108 unchanged lines hidden (view full) --- 1093{ 1094 struct sf_softc *sc; 1095 struct ifnet *ifp; 1096 u_int32_t status; 1097 1098 sc = arg; 1099 SF_LOCK(sc); 1100 | 986 987 txcons = csr_read_4(sc, SF_CQ_CONSIDX); 988 cmpprodidx = SF_IDX_HI(csr_read_4(sc, SF_CQ_PRODIDX)); 989 cmpconsidx = SF_IDX_HI(txcons); 990 991 while (cmpconsidx != cmpprodidx) { 992 cur_cmp = &sc->sf_ldata->sf_tx_clist[cmpconsidx]; 993 cur_tx = &sc->sf_ldata->sf_tx_dlist[cur_cmp->sf_index >> 7]; --- 108 unchanged lines hidden (view full) --- 1102{ 1103 struct sf_softc *sc; 1104 struct ifnet *ifp; 1105 u_int32_t status; 1106 1107 sc = arg; 1108 SF_LOCK(sc); 1109 |
1101 ifp = &sc->arpcom.ac_if; | 1110 ifp = sc->sf_ifp; |
1102 1103#ifdef DEVICE_POLLING 1104 if (ifp->if_flags & IFF_POLLING) 1105 goto done_locked; 1106 1107 if ((ifp->if_capenable & IFCAP_POLLING) && 1108 ether_poll_register(sf_poll, ifp)) { 1109 /* OK, disable interrupts. */ --- 58 unchanged lines hidden (view full) --- 1168{ 1169 struct sf_softc *sc; 1170 struct ifnet *ifp; 1171 struct mii_data *mii; 1172 int i; 1173 1174 sc = xsc; 1175 SF_LOCK(sc); | 1111 1112#ifdef DEVICE_POLLING 1113 if (ifp->if_flags & IFF_POLLING) 1114 goto done_locked; 1115 1116 if ((ifp->if_capenable & IFCAP_POLLING) && 1117 ether_poll_register(sf_poll, ifp)) { 1118 /* OK, disable interrupts. */ --- 58 unchanged lines hidden (view full) --- 1177{ 1178 struct sf_softc *sc; 1179 struct ifnet *ifp; 1180 struct mii_data *mii; 1181 int i; 1182 1183 sc = xsc; 1184 SF_LOCK(sc); |
1176 ifp = &sc->arpcom.ac_if; | 1185 ifp = sc->sf_ifp; |
1177 mii = device_get_softc(sc->sf_miibus); 1178 1179 sf_stop(sc); 1180 sf_reset(sc); 1181 1182 /* Init all the receive filter registers */ 1183 for (i = SF_RXFILT_PERFECT_BASE; 1184 i < (SF_RXFILT_HASH_MAX + 1); i += 4) 1185 csr_write_4(sc, i, 0); 1186 1187 /* Empty stats counter registers. */ 1188 for (i = 0; i < sizeof(struct sf_stats)/sizeof(u_int32_t); i++) 1189 csr_write_4(sc, SF_STATS_BASE + 1190 (i + sizeof(u_int32_t)), 0); 1191 1192 /* Init our MAC address */ | 1186 mii = device_get_softc(sc->sf_miibus); 1187 1188 sf_stop(sc); 1189 sf_reset(sc); 1190 1191 /* Init all the receive filter registers */ 1192 for (i = SF_RXFILT_PERFECT_BASE; 1193 i < (SF_RXFILT_HASH_MAX + 1); i += 4) 1194 csr_write_4(sc, i, 0); 1195 1196 /* Empty stats counter registers. */ 1197 for (i = 0; i < sizeof(struct sf_stats)/sizeof(u_int32_t); i++) 1198 csr_write_4(sc, SF_STATS_BASE + 1199 (i + sizeof(u_int32_t)), 0); 1200 1201 /* Init our MAC address */ |
1193 csr_write_4(sc, SF_PAR0, *(u_int32_t *)(&sc->arpcom.ac_enaddr[0])); 1194 csr_write_4(sc, SF_PAR1, *(u_int32_t *)(&sc->arpcom.ac_enaddr[4])); 1195 sf_setperf(sc, 0, (caddr_t)&sc->arpcom.ac_enaddr); | 1202 csr_write_4(sc, SF_PAR0, *(u_int32_t *)(&IFP2ENADDR(sc->sf_ifp)[0])); 1203 csr_write_4(sc, SF_PAR1, *(u_int32_t *)(&IFP2ENADDR(sc->sf_ifp)[4])); 1204 sf_setperf(sc, 0, (caddr_t)&IFP2ENADDR(sc->sf_ifp)); |
1196 1197 if (sf_init_rx_ring(sc) == ENOBUFS) { 1198 printf("sf%d: initialization failed: no " 1199 "memory for rx buffers\n", sc->sf_unit); 1200 SF_UNLOCK(sc); 1201 return; 1202 } 1203 --- 226 unchanged lines hidden (view full) --- 1430sf_stop(sc) 1431 struct sf_softc *sc; 1432{ 1433 int i; 1434 struct ifnet *ifp; 1435 1436 SF_LOCK(sc); 1437 | 1205 1206 if (sf_init_rx_ring(sc) == ENOBUFS) { 1207 printf("sf%d: initialization failed: no " 1208 "memory for rx buffers\n", sc->sf_unit); 1209 SF_UNLOCK(sc); 1210 return; 1211 } 1212 --- 226 unchanged lines hidden (view full) --- 1439sf_stop(sc) 1440 struct sf_softc *sc; 1441{ 1442 int i; 1443 struct ifnet *ifp; 1444 1445 SF_LOCK(sc); 1446 |
1438 ifp = &sc->arpcom.ac_if; | 1447 ifp = sc->sf_ifp; |
1439 1440 untimeout(sf_stats_update, sc, sc->sf_stat_ch); 1441 1442#ifdef DEVICE_POLLING 1443 ether_poll_deregister(ifp); 1444#endif /* DEVICE_POLLING */ 1445 1446 csr_write_4(sc, SF_GEN_ETH_CTL, 0); --- 42 unchanged lines hidden (view full) --- 1489 struct ifnet *ifp; 1490 struct mii_data *mii; 1491 struct sf_stats stats; 1492 u_int32_t *ptr; 1493 int i; 1494 1495 sc = xsc; 1496 SF_LOCK(sc); | 1448 1449 untimeout(sf_stats_update, sc, sc->sf_stat_ch); 1450 1451#ifdef DEVICE_POLLING 1452 ether_poll_deregister(ifp); 1453#endif /* DEVICE_POLLING */ 1454 1455 csr_write_4(sc, SF_GEN_ETH_CTL, 0); --- 42 unchanged lines hidden (view full) --- 1498 struct ifnet *ifp; 1499 struct mii_data *mii; 1500 struct sf_stats stats; 1501 u_int32_t *ptr; 1502 int i; 1503 1504 sc = xsc; 1505 SF_LOCK(sc); |
1497 ifp = &sc->arpcom.ac_if; | 1506 ifp = sc->sf_ifp; |
1498 mii = device_get_softc(sc->sf_miibus); 1499 1500 ptr = (u_int32_t *)&stats; 1501 for (i = 0; i < sizeof(stats)/sizeof(u_int32_t); i++) 1502 ptr[i] = csr_read_4(sc, SF_STATS_BASE + 1503 (i + sizeof(u_int32_t))); 1504 1505 for (i = 0; i < sizeof(stats)/sizeof(u_int32_t); i++) --- 53 unchanged lines hidden --- | 1507 mii = device_get_softc(sc->sf_miibus); 1508 1509 ptr = (u_int32_t *)&stats; 1510 for (i = 0; i < sizeof(stats)/sizeof(u_int32_t); i++) 1511 ptr[i] = csr_read_4(sc, SF_STATS_BASE + 1512 (i + sizeof(u_int32_t))); 1513 1514 for (i = 0; i < sizeof(stats)/sizeof(u_int32_t); i++) --- 53 unchanged lines hidden --- |