Deleted Added
full compact
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 ---