The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/ic/mb86960.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*      $NetBSD: mb86960.c,v 1.60 2005/02/27 00:27:02 perry Exp $       */
    2 
    3 /*
    4  * All Rights Reserved, Copyright (C) Fujitsu Limited 1995
    5  *
    6  * This software may be used, modified, copied, distributed, and sold, in
    7  * both source and binary form provided that the above copyright, these
    8  * terms and the following disclaimer are retained.  The name of the author
    9  * and/or the contributor may not be used to endorse or promote products
   10  * derived from this software without specific prior written permission.
   11  *
   12  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND THE CONTRIBUTOR ``AS IS'' AND
   13  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   14  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   15  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR THE CONTRIBUTOR BE LIABLE
   16  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   17  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   18  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION.
   19  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   20  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   21  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   22  * SUCH DAMAGE.
   23  */
   24 
   25 /*
   26  * Portions copyright (C) 1993, David Greenman.  This software may be used,
   27  * modified, copied, distributed, and sold, in both source and binary form
   28  * provided that the above copyright and these terms are retained.  Under no
   29  * circumstances is the author responsible for the proper functioning of this
   30  * software, nor does the author assume any responsibility for damages
   31  * incurred with its use.
   32  */
   33 
   34 #include <sys/cdefs.h>
   35 __KERNEL_RCSID(0, "$NetBSD: mb86960.c,v 1.60 2005/02/27 00:27:02 perry Exp $");
   36 
   37 /*
   38  * Device driver for Fujitsu MB86960A/MB86965A based Ethernet cards.
   39  * Contributed by M.S. <seki@sysrap.cs.fujitsu.co.jp>
   40  *
   41  * This version is intended to be a generic template for various
   42  * MB86960A/MB86965A based Ethernet cards.  It currently supports
   43  * Fujitsu FMV-180 series (i.e., FMV-181 and FMV-182) and Allied-
   44  * Telesis AT1700 series and RE2000 series.  There are some
   45  * unnecessary hooks embedded, which are primarily intended to support
   46  * other types of Ethernet cards, but the author is not sure whether
   47  * they are useful.
   48  */
   49 
   50 #include "opt_inet.h"
   51 #include "opt_ns.h"
   52 #include "bpfilter.h"
   53 #include "rnd.h"
   54 
   55 #include <sys/param.h>
   56 #include <sys/systm.h>
   57 #include <sys/errno.h>
   58 #include <sys/ioctl.h>
   59 #include <sys/mbuf.h>
   60 #include <sys/socket.h>
   61 #include <sys/syslog.h>
   62 #include <sys/device.h>
   63 #if NRND > 0
   64 #include <sys/rnd.h>
   65 #endif
   66 
   67 #include <net/if.h>
   68 #include <net/if_dl.h>
   69 #include <net/if_types.h>
   70 #include <net/if_media.h>
   71 #include <net/if_ether.h>
   72 
   73 #ifdef INET
   74 #include <netinet/in.h>
   75 #include <netinet/in_systm.h>
   76 #include <netinet/in_var.h>
   77 #include <netinet/ip.h>
   78 #include <netinet/if_inarp.h>
   79 #endif
   80 
   81 #ifdef NS
   82 #include <netns/ns.h>
   83 #include <netns/ns_if.h>
   84 #endif
   85 
   86 #if NBPFILTER > 0
   87 #include <net/bpf.h>
   88 #include <net/bpfdesc.h>
   89 #endif
   90 
   91 #include <machine/bus.h>
   92 
   93 #include <dev/ic/mb86960reg.h>
   94 #include <dev/ic/mb86960var.h>
   95 
   96 #ifndef __BUS_SPACE_HAS_STREAM_METHODS
   97 #define bus_space_write_stream_2        bus_space_write_2
   98 #define bus_space_write_multi_stream_2  bus_space_write_multi_2
   99 #define bus_space_read_multi_stream_2   bus_space_read_multi_2
  100 #endif /* __BUS_SPACE_HAS_STREAM_METHODS */
  101 
  102 /* Standard driver entry points.  These can be static. */
  103 void    mb86960_init(struct mb86960_softc *);
  104 int     mb86960_ioctl(struct ifnet *, u_long, caddr_t);
  105 void    mb86960_start(struct ifnet *);
  106 void    mb86960_reset(struct mb86960_softc *);
  107 void    mb86960_watchdog(struct ifnet *);
  108 
  109 /* Local functions.  Order of declaration is confused.  FIXME. */
  110 int     mb86960_get_packet(struct mb86960_softc *, u_int);
  111 void    mb86960_stop(struct mb86960_softc *);
  112 void    mb86960_tint(struct mb86960_softc *, uint8_t);
  113 void    mb86960_rint(struct mb86960_softc *, uint8_t);
  114 static __inline__
  115 void    mb86960_xmit(struct mb86960_softc *);
  116 void    mb86960_write_mbufs(struct mb86960_softc *, struct mbuf *);
  117 static __inline__
  118 void    mb86960_droppacket(struct mb86960_softc *);
  119 void    mb86960_getmcaf(struct ethercom *, uint8_t *);
  120 void    mb86960_setmode(struct mb86960_softc *);
  121 void    mb86960_loadmar(struct mb86960_softc *);
  122 
  123 int     mb86960_mediachange(struct ifnet *);
  124 void    mb86960_mediastatus(struct ifnet *, struct ifmediareq *);
  125 
  126 #if FE_DEBUG >= 1
  127 void    mb86960_dump(int, struct mb86960_softc *);
  128 #endif
  129 
  130 void
  131 mb86960_attach(struct mb86960_softc *sc, uint8_t *myea)
  132 {
  133         bus_space_tag_t bst = sc->sc_bst;
  134         bus_space_handle_t bsh = sc->sc_bsh;
  135 
  136         /* Register values which depend on board design. */
  137         sc->proto_dlcr4 = FE_D4_LBC_DISABLE | FE_D4_CNTRL;
  138         sc->proto_dlcr5 = 0;
  139         sc->proto_dlcr7 = FE_D7_BYTSWP_LH;
  140         if ((sc->sc_flags & FE_FLAGS_MB86960) != 0)
  141                 sc->proto_dlcr7 |= FE_D7_ED_TEST; /* XXX */
  142         sc->proto_bmpr13 = FE_B13_TPTYPE_UTP | FE_B13_PORT_AUTO;
  143 
  144         /*
  145          * Program the 86960 as following defaults:
  146          *      SRAM: 32KB, 100ns, byte-wide access.
  147          *      Transmission buffer: 4KB x 2.
  148          *      System bus interface: 16 bits.
  149          * These values except TXBSIZE should be modified as per
  150          * sc_flags which is set in MD attachments, because they
  151          * are hard-wired on the board. Modifying TXBSIZE will affect
  152          * the driver performance.
  153          */
  154         sc->proto_dlcr6 = FE_D6_BUFSIZ_32KB | FE_D6_TXBSIZ_2x4KB |
  155             FE_D6_BBW_BYTE | FE_D6_SRAM_100ns;
  156         if (sc->sc_flags & FE_FLAGS_SBW_BYTE)
  157                 sc->proto_dlcr6 |= FE_D6_SBW_BYTE;
  158         if (sc->sc_flags & FE_FLAGS_SRAM_150ns)
  159                 sc->proto_dlcr6 &= ~FE_D6_SRAM_100ns;
  160 
  161         /*
  162          * Minimum initialization of the hardware.
  163          * We write into registers; hope I/O ports have no
  164          * overlap with other boards.
  165          */
  166 
  167         /* Initialize 86960. */
  168         bus_space_write_1(bst, bsh, FE_DLCR6,
  169             sc->proto_dlcr6 | FE_D6_DLC_DISABLE);
  170         delay(200);
  171 
  172 #ifdef DIAGNOSTIC
  173         if (myea == NULL) {
  174                 printf("%s: ethernet address shouldn't be NULL\n",
  175                     sc->sc_dev.dv_xname);
  176                 panic("NULL ethernet address");
  177         }
  178 #endif
  179         memcpy(sc->sc_enaddr, myea, sizeof(sc->sc_enaddr));
  180 
  181         /* Disable all interrupts. */
  182         bus_space_write_1(bst, bsh, FE_DLCR2, 0);
  183         bus_space_write_1(bst, bsh, FE_DLCR3, 0);
  184 }
  185 
  186 /*
  187  * Install interface into kernel networking data structures
  188  */
  189 void
  190 mb86960_config(struct mb86960_softc *sc, int *media, int nmedia, int defmedia)
  191 {
  192         struct cfdata *cf = sc->sc_dev.dv_cfdata;
  193         struct ifnet *ifp = &sc->sc_ec.ec_if;
  194         int i;
  195 
  196         /* Stop the 86960. */
  197         mb86960_stop(sc);
  198 
  199         /* Initialize ifnet structure. */
  200         strcpy(ifp->if_xname, sc->sc_dev.dv_xname);
  201         ifp->if_softc = sc;
  202         ifp->if_start = mb86960_start;
  203         ifp->if_ioctl = mb86960_ioctl;
  204         ifp->if_watchdog = mb86960_watchdog;
  205         ifp->if_flags =
  206             IFF_BROADCAST | IFF_SIMPLEX | IFF_NOTRAILERS | IFF_MULTICAST;
  207         IFQ_SET_READY(&ifp->if_snd);
  208 
  209 #if FE_DEBUG >= 3
  210         log(LOG_INFO, "%s: mb86960_config()\n", sc->sc_dev.dv_xname);
  211         mb86960_dump(LOG_INFO, sc);
  212 #endif
  213 
  214 #if FE_SINGLE_TRANSMISSION
  215         /* Override txb config to allocate minimum. */
  216         sc->proto_dlcr6 &= ~FE_D6_TXBSIZ;
  217         sc->proto_dlcr6 |=  FE_D6_TXBSIZ_2x2KB;
  218 #endif
  219 
  220         /* Modify hardware config if it is requested. */
  221         if ((cf->cf_flags & FE_FLAGS_OVERRIDE_DLCR6) != 0)
  222                 sc->proto_dlcr6 = cf->cf_flags & FE_FLAGS_DLCR6_VALUE;
  223 
  224         /* Find TX buffer size, based on the hardware dependent proto. */
  225         switch (sc->proto_dlcr6 & FE_D6_TXBSIZ) {
  226         case FE_D6_TXBSIZ_2x2KB:
  227                 sc->txb_size = 2048;
  228                 break;
  229         case FE_D6_TXBSIZ_2x4KB:
  230                 sc->txb_size = 4096;
  231                 break;
  232         case FE_D6_TXBSIZ_2x8KB:
  233                 sc->txb_size = 8192;
  234                 break;
  235         default:
  236                 /* Oops, we can't work with single buffer configuration. */
  237 #if FE_DEBUG >= 2
  238                 log(LOG_WARNING, "%s: strange TXBSIZ config; fixing\n",
  239                     sc->sc_dev.dv_xname);
  240 #endif
  241                 sc->proto_dlcr6 &= ~FE_D6_TXBSIZ;
  242                 sc->proto_dlcr6 |=  FE_D6_TXBSIZ_2x2KB;
  243                 sc->txb_size = 2048;
  244                 break;
  245         }
  246 
  247         /* Initialize media goo. */
  248         ifmedia_init(&sc->sc_media, 0, mb86960_mediachange,
  249             mb86960_mediastatus);
  250         if (media != NULL) {
  251                 for (i = 0; i < nmedia; i++)
  252                         ifmedia_add(&sc->sc_media, media[i], 0, NULL);
  253                 ifmedia_set(&sc->sc_media, defmedia);
  254         } else {
  255                 ifmedia_add(&sc->sc_media, IFM_ETHER|IFM_MANUAL, 0, NULL);
  256                 ifmedia_set(&sc->sc_media, IFM_ETHER|IFM_MANUAL);
  257         }
  258 
  259         /* Attach the interface. */
  260         if_attach(ifp);
  261         ether_ifattach(ifp, sc->sc_enaddr);
  262 
  263 #if NRND > 0
  264         rnd_attach_source(&sc->rnd_source, sc->sc_dev.dv_xname,
  265             RND_TYPE_NET, 0);
  266 #endif
  267         /* Print additional info when attached. */
  268         printf("%s: Ethernet address %s\n", sc->sc_dev.dv_xname,
  269             ether_sprintf(sc->sc_enaddr));
  270 
  271 #if FE_DEBUG >= 3
  272         {
  273                 int buf, txb, bbw, sbw, ram;
  274 
  275                 buf = txb = bbw = sbw = ram = -1;
  276                 switch (sc->proto_dlcr6 & FE_D6_BUFSIZ) {
  277                 case FE_D6_BUFSIZ_8KB:
  278                         buf = 8;
  279                         break;
  280                 case FE_D6_BUFSIZ_16KB:
  281                         buf = 16;
  282                         break;
  283                 case FE_D6_BUFSIZ_32KB:
  284                         buf = 32;
  285                         break;
  286                 case FE_D6_BUFSIZ_64KB:
  287                         buf = 64;
  288                         break;
  289                 }
  290                 switch (sc->proto_dlcr6 & FE_D6_TXBSIZ) {
  291                 case FE_D6_TXBSIZ_2x2KB:
  292                         txb = 2;
  293                         break;
  294                 case FE_D6_TXBSIZ_2x4KB:
  295                         txb = 4;
  296                         break;
  297                 case FE_D6_TXBSIZ_2x8KB:
  298                         txb = 8;
  299                         break;
  300                 }
  301                 switch (sc->proto_dlcr6 & FE_D6_BBW) {
  302                 case FE_D6_BBW_BYTE:
  303                         bbw = 8;
  304                         break;
  305                 case FE_D6_BBW_WORD:
  306                         bbw = 16;
  307                         break;
  308                 }
  309                 switch (sc->proto_dlcr6 & FE_D6_SBW) {
  310                 case FE_D6_SBW_BYTE:
  311                         sbw = 8;
  312                         break;
  313                 case FE_D6_SBW_WORD:
  314                         sbw = 16;
  315                         break;
  316                 }
  317                 switch (sc->proto_dlcr6 & FE_D6_SRAM) {
  318                 case FE_D6_SRAM_100ns:
  319                         ram = 100;
  320                         break;
  321                 case FE_D6_SRAM_150ns:
  322                         ram = 150;
  323                         break;
  324                 }
  325                 printf("%s: SRAM %dKB %dbit %dns, TXB %dKBx2, %dbit I/O\n",
  326                     sc->sc_dev.dv_xname, buf, bbw, ram, txb, sbw);
  327         }
  328 #endif
  329 
  330         /* The attach is successful. */
  331         sc->sc_stat |= FE_STAT_ATTACHED;
  332 }
  333 
  334 /*
  335  * Media change callback.
  336  */
  337 int
  338 mb86960_mediachange(struct ifnet *ifp)
  339 {
  340         struct mb86960_softc *sc = ifp->if_softc;
  341 
  342         if (sc->sc_mediachange)
  343                 return ((*sc->sc_mediachange)(sc));
  344         return (0);
  345 }
  346 
  347 /*
  348  * Media status callback.
  349  */
  350 void
  351 mb86960_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
  352 {
  353         struct mb86960_softc *sc = ifp->if_softc;
  354 
  355         if ((sc->sc_stat & FE_STAT_ENABLED) == 0) {
  356                 ifmr->ifm_active = IFM_ETHER | IFM_NONE;
  357                 ifmr->ifm_status = 0;
  358                 return;
  359         }
  360 
  361         if (sc->sc_mediastatus)
  362                 (*sc->sc_mediastatus)(sc, ifmr);
  363 }
  364 
  365 /*
  366  * Reset interface.
  367  */
  368 void
  369 mb86960_reset(struct mb86960_softc *sc)
  370 {
  371         int s;
  372 
  373         s = splnet();
  374         mb86960_stop(sc);
  375         mb86960_init(sc);
  376         splx(s);
  377 }
  378 
  379 /*
  380  * Stop everything on the interface.
  381  *
  382  * All buffered packets, both transmitting and receiving,
  383  * if any, will be lost by stopping the interface.
  384  */
  385 void
  386 mb86960_stop(struct mb86960_softc *sc)
  387 {
  388         bus_space_tag_t bst = sc->sc_bst;
  389         bus_space_handle_t bsh = sc->sc_bsh;
  390 
  391 #if FE_DEBUG >= 3
  392         log(LOG_INFO, "%s: top of mb86960_stop()\n", sc->sc_dev.dv_xname);
  393         mb86960_dump(LOG_INFO, sc);
  394 #endif
  395 
  396         /* Disable interrupts. */
  397         bus_space_write_1(bst, bsh, FE_DLCR2, 0x00);
  398         bus_space_write_1(bst, bsh, FE_DLCR3, 0x00);
  399 
  400         /* Stop interface hardware. */
  401         delay(200);
  402         bus_space_write_1(bst, bsh, FE_DLCR6,
  403             sc->proto_dlcr6 | FE_D6_DLC_DISABLE);
  404         delay(200);
  405 
  406         /* Clear all interrupt status. */
  407         bus_space_write_1(bst, bsh, FE_DLCR0, 0xFF);
  408         bus_space_write_1(bst, bsh, FE_DLCR1, 0xFF);
  409 
  410         /* Put the chip in stand-by mode. */
  411         delay(200);
  412         bus_space_write_1(bst, bsh, FE_DLCR7,
  413             sc->proto_dlcr7 | FE_D7_POWER_DOWN);
  414         delay(200);
  415 
  416         /* MAR loading can be delayed. */
  417         sc->filter_change = 0;
  418 
  419         /* Call a hook. */
  420         if (sc->stop_card)
  421                 (*sc->stop_card)(sc);
  422 
  423 #if FE_DEBUG >= 3
  424         log(LOG_INFO, "%s: end of mb86960_stop()\n", sc->sc_dev.dv_xname);
  425         mb86960_dump(LOG_INFO, sc);
  426 #endif
  427 }
  428 
  429 /*
  430  * Device timeout/watchdog routine. Entered if the device neglects to
  431  * generate an interrupt after a transmit has been started on it.
  432  */
  433 void
  434 mb86960_watchdog(struct ifnet *ifp)
  435 {
  436         struct mb86960_softc *sc = ifp->if_softc;
  437 
  438         log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
  439 #if FE_DEBUG >= 3
  440         mb86960_dump(LOG_INFO, sc);
  441 #endif
  442 
  443         /* Record how many packets are lost by this accident. */
  444         sc->sc_ec.ec_if.if_oerrors += sc->txb_sched + sc->txb_count;
  445 
  446         mb86960_reset(sc);
  447 }
  448 
  449 /*
  450  * Drop (skip) a packet from receive buffer in 86960 memory.
  451  */
  452 static __inline__ void
  453 mb86960_droppacket(struct mb86960_softc *sc)
  454 {
  455         bus_space_tag_t bst = sc->sc_bst;
  456         bus_space_handle_t bsh = sc->sc_bsh;
  457 
  458         bus_space_write_1(bst, bsh, FE_BMPR14, FE_B14_FILTER | FE_B14_SKIP);
  459 }
  460 
  461 /*
  462  * Initialize device.
  463  */
  464 void
  465 mb86960_init(struct mb86960_softc *sc)
  466 {
  467         bus_space_tag_t bst = sc->sc_bst;
  468         bus_space_handle_t bsh = sc->sc_bsh;
  469         struct ifnet *ifp = &sc->sc_ec.ec_if;
  470         int i;
  471 
  472 #if FE_DEBUG >= 3
  473         log(LOG_INFO, "%s: top of mb86960_init()\n", sc->sc_dev.dv_xname);
  474         mb86960_dump(LOG_INFO, sc);
  475 #endif
  476 
  477         /* Reset transmitter flags. */
  478         ifp->if_flags &= ~IFF_OACTIVE;
  479         ifp->if_timer = 0;
  480 
  481         sc->txb_free = sc->txb_size;
  482         sc->txb_count = 0;
  483         sc->txb_sched = 0;
  484 
  485         /* Do any card-specific initialization, if applicable. */
  486         if (sc->init_card)
  487                 (*sc->init_card)(sc);
  488 
  489 #if FE_DEBUG >= 3
  490         log(LOG_INFO, "%s: after init hook\n", sc->sc_dev.dv_xname);
  491         mb86960_dump(LOG_INFO, sc);
  492 #endif
  493 
  494         /*
  495          * Make sure to disable the chip, also.
  496          * This may also help re-programming the chip after
  497          * hot insertion of PCMCIAs.
  498          */
  499         bus_space_write_1(bst, bsh, FE_DLCR6,
  500             sc->proto_dlcr6 | FE_D6_DLC_DISABLE);
  501         delay(200);
  502 
  503         /* Power up the chip and select register bank for DLCRs. */
  504         bus_space_write_1(bst, bsh, FE_DLCR7,
  505             sc->proto_dlcr7 | FE_D7_RBS_DLCR | FE_D7_POWER_UP);
  506         delay(200);
  507 
  508         /* Feed the station address. */
  509         bus_space_write_region_1(bst, bsh, FE_DLCR8,
  510             sc->sc_enaddr, ETHER_ADDR_LEN);
  511 
  512         /* Select the BMPR bank for runtime register access. */
  513         bus_space_write_1(bst, bsh, FE_DLCR7,
  514             sc->proto_dlcr7 | FE_D7_RBS_BMPR | FE_D7_POWER_UP);
  515 
  516         /* Initialize registers. */
  517         bus_space_write_1(bst, bsh, FE_DLCR0, 0xFF);    /* Clear all bits. */
  518         bus_space_write_1(bst, bsh, FE_DLCR1, 0xFF);    /* ditto. */
  519         bus_space_write_1(bst, bsh, FE_DLCR2, 0x00);
  520         bus_space_write_1(bst, bsh, FE_DLCR3, 0x00);
  521         bus_space_write_1(bst, bsh, FE_DLCR4, sc->proto_dlcr4);
  522         bus_space_write_1(bst, bsh, FE_DLCR5, sc->proto_dlcr5);
  523         bus_space_write_1(bst, bsh, FE_BMPR10, 0x00);
  524         bus_space_write_1(bst, bsh, FE_BMPR11, FE_B11_CTRL_SKIP);
  525         bus_space_write_1(bst, bsh, FE_BMPR12, 0x00);
  526         bus_space_write_1(bst, bsh, FE_BMPR13, sc->proto_bmpr13);
  527         bus_space_write_1(bst, bsh, FE_BMPR14, FE_B14_FILTER);
  528         bus_space_write_1(bst, bsh, FE_BMPR15, 0x00);
  529 
  530 #if FE_DEBUG >= 3
  531         log(LOG_INFO, "%s: just before enabling DLC\n", sc->sc_dev.dv_xname);
  532         mb86960_dump(LOG_INFO, sc);
  533 #endif
  534 
  535         /* Enable interrupts. */
  536         bus_space_write_1(bst, bsh, FE_DLCR2, FE_TMASK);
  537         bus_space_write_1(bst, bsh, FE_DLCR3, FE_RMASK);
  538 
  539         /* Enable transmitter and receiver. */
  540         delay(200);
  541         bus_space_write_1(bst, bsh, FE_DLCR6,
  542             sc->proto_dlcr6 | FE_D6_DLC_ENABLE);
  543         delay(200);
  544 
  545 #if FE_DEBUG >= 3
  546         log(LOG_INFO, "%s: just after enabling DLC\n", sc->sc_dev.dv_xname);
  547         mb86960_dump(LOG_INFO, sc);
  548 #endif
  549 
  550         /*
  551          * Make sure to empty the receive buffer.
  552          *
  553          * This may be redundant, but *if* the receive buffer were full
  554          * at this point, the driver would hang.  I have experienced
  555          * some strange hangups just after UP.  I hope the following
  556          * code solve the problem.
  557          *
  558          * I have changed the order of hardware initialization.
  559          * I think the receive buffer cannot have any packets at this
  560          * point in this version.  The following code *must* be
  561          * redundant now.  FIXME.
  562          */
  563         for (i = 0; i < FE_MAX_RECV_COUNT; i++) {
  564                 if (bus_space_read_1(bst, bsh, FE_DLCR5) & FE_D5_BUFEMP)
  565                         break;
  566                 mb86960_droppacket(sc);
  567         }
  568 #if FE_DEBUG >= 1
  569         if (i >= FE_MAX_RECV_COUNT)
  570                 log(LOG_ERR, "%s: cannot empty receive buffer\n",
  571                     sc->sc_dev.dv_xname);
  572 #endif
  573 #if FE_DEBUG >= 3
  574         if (i < FE_MAX_RECV_COUNT)
  575                 log(LOG_INFO, "%s: receive buffer emptied (%d)\n",
  576                     sc->sc_dev.dv_xname, i);
  577 #endif
  578 
  579 #if FE_DEBUG >= 3
  580         log(LOG_INFO, "%s: after ERB loop\n", sc->sc_dev.dv_xname);
  581         mb86960_dump(LOG_INFO, sc);
  582 #endif
  583 
  584         /* Do we need this here? */
  585         bus_space_write_1(bst, bsh, FE_DLCR0, 0xFF);    /* Clear all bits. */
  586         bus_space_write_1(bst, bsh, FE_DLCR1, 0xFF);    /* ditto. */
  587 
  588 #if FE_DEBUG >= 3
  589         log(LOG_INFO, "%s: after FIXME\n", sc->sc_dev.dv_xname);
  590         mb86960_dump(LOG_INFO, sc);
  591 #endif
  592 
  593         /* Set 'running' flag. */
  594         ifp->if_flags |= IFF_RUNNING;
  595 
  596         /*
  597          * At this point, the interface is runnung properly,
  598          * except that it receives *no* packets.  we then call
  599          * mb86960_setmode() to tell the chip what packets to be
  600          * received, based on the if_flags and multicast group
  601          * list.  It completes the initialization process.
  602          */
  603         mb86960_setmode(sc);
  604 
  605 #if FE_DEBUG >= 3
  606         log(LOG_INFO, "%s: after setmode\n", sc->sc_dev.dv_xname);
  607         mb86960_dump(LOG_INFO, sc);
  608 #endif
  609 
  610         /* ...and attempt to start output. */
  611         mb86960_start(ifp);
  612 
  613 #if FE_DEBUG >= 3
  614         log(LOG_INFO, "%s: end of mb86960_init()\n", sc->sc_dev.dv_xname);
  615         mb86960_dump(LOG_INFO, sc);
  616 #endif
  617 }
  618 
  619 /*
  620  * This routine actually starts the transmission on the interface
  621  */
  622 static __inline__ void
  623 mb86960_xmit(struct mb86960_softc *sc)
  624 {
  625         bus_space_tag_t bst = sc->sc_bst;
  626         bus_space_handle_t bsh = sc->sc_bsh;
  627 
  628         /*
  629          * Set a timer just in case we never hear from the board again.
  630          * We use longer timeout for multiple packet transmission.
  631          * I'm not sure this timer value is appropriate.  FIXME.
  632          */
  633         sc->sc_ec.ec_if.if_timer = 1 + sc->txb_count;
  634 
  635         /* Update txb variables. */
  636         sc->txb_sched = sc->txb_count;
  637         sc->txb_count = 0;
  638         sc->txb_free = sc->txb_size;
  639 
  640 #if FE_DELAYED_PADDING
  641         /* Omit the postponed padding process. */
  642         sc->txb_padding = 0;
  643 #endif
  644 
  645         /* Start transmitter, passing packets in TX buffer. */
  646         bus_space_write_1(bst, bsh, FE_BMPR10, sc->txb_sched | FE_B10_START);
  647 }
  648 
  649 /*
  650  * Start output on interface.
  651  * We make two assumptions here:
  652  *  1) that the current priority is set to splnet _before_ this code
  653  *     is called *and* is returned to the appropriate priority after
  654  *     return
  655  *  2) that the IFF_OACTIVE flag is checked before this code is called
  656  *     (i.e. that the output part of the interface is idle)
  657  */
  658 void
  659 mb86960_start(struct ifnet *ifp)
  660 {
  661         struct mb86960_softc *sc = ifp->if_softc;
  662         struct mbuf *m;
  663 
  664 #if FE_DEBUG >= 1
  665         /* Just a sanity check. */
  666         if ((sc->txb_count == 0) != (sc->txb_free == sc->txb_size)) {
  667                 /*
  668                  * Txb_count and txb_free co-works to manage the
  669                  * transmission buffer.  Txb_count keeps track of the
  670                  * used potion of the buffer, while txb_free does unused
  671                  * potion.  So, as long as the driver runs properly,
  672                  * txb_count is zero if and only if txb_free is same
  673                  * as txb_size (which represents whole buffer.)
  674                  */
  675                 log(LOG_ERR, "%s: inconsistent txb variables (%d, %d)\n",
  676                     sc->sc_dev.dv_xname, sc->txb_count, sc->txb_free);
  677                 /*
  678                  * So, what should I do, then?
  679                  *
  680                  * We now know txb_count and txb_free contradicts.  We
  681                  * cannot, however, tell which is wrong.  More
  682                  * over, we cannot peek 86960 transmission buffer or
  683                  * reset the transmission buffer.  (In fact, we can
  684                  * reset the entire interface.  I don't want to do it.)
  685                  *
  686                  * If txb_count is incorrect, leaving it as is will cause
  687                  * sending of gabages after next interrupt.  We have to
  688                  * avoid it.  Hence, we reset the txb_count here.  If
  689                  * txb_free was incorrect, resetting txb_count just loose
  690                  * some packets.  We can live with it.
  691                  */
  692                 sc->txb_count = 0;
  693         }
  694 #endif
  695 
  696 #if FE_DEBUG >= 1
  697         /*
  698          * First, see if there are buffered packets and an idle
  699          * transmitter - should never happen at this point.
  700          */
  701         if ((sc->txb_count > 0) && (sc->txb_sched == 0)) {
  702                 log(LOG_ERR, "%s: transmitter idle with %d buffered packets\n",
  703                     sc->sc_dev.dv_xname, sc->txb_count);
  704                 mb86960_xmit(sc);
  705         }
  706 #endif
  707 
  708         /*
  709          * Stop accepting more transmission packets temporarily, when
  710          * a filter change request is delayed.  Updating the MARs on
  711          * 86960 flushes the transmisstion buffer, so it is delayed
  712          * until all buffered transmission packets have been sent
  713          * out.
  714          */
  715         if (sc->filter_change) {
  716                 /*
  717                  * Filter change request is delayed only when the DLC is
  718                  * working.  DLC soon raise an interrupt after finishing
  719                  * the work.
  720                  */
  721                 goto indicate_active;
  722         }
  723 
  724         for (;;) {
  725                 /*
  726                  * See if there is room to put another packet in the buffer.
  727                  * We *could* do better job by peeking the send queue to
  728                  * know the length of the next packet.  Current version just
  729                  * tests against the worst case (i.e., longest packet).  FIXME.
  730                  *
  731                  * When adding the packet-peek feature, don't forget adding a
  732                  * test on txb_count against QUEUEING_MAX.
  733                  * There is a little chance the packet count exceeds
  734                  * the limit.  Assume transmission buffer is 8KB (2x8KB
  735                  * configuration) and an application sends a bunch of small
  736                  * (i.e., minimum packet sized) packets rapidly.  An 8KB
  737                  * buffer can hold 130 blocks of 62 bytes long...
  738                  */
  739                 if (sc->txb_free <
  740                     (ETHER_MAX_LEN - ETHER_CRC_LEN) + FE_TXLEN_SIZE) {
  741                         /* No room. */
  742                         goto indicate_active;
  743                 }
  744 
  745 #if FE_SINGLE_TRANSMISSION
  746                 if (sc->txb_count > 0) {
  747                         /* Just one packet per a transmission buffer. */
  748                         goto indicate_active;
  749                 }
  750 #endif
  751 
  752                 /*
  753                  * Get the next mbuf chain for a packet to send.
  754                  */
  755                 IFQ_DEQUEUE(&ifp->if_snd, m);
  756                 if (m == 0) {
  757                         /* No more packets to send. */
  758                         goto indicate_inactive;
  759                 }
  760 
  761 #if NBPFILTER > 0
  762                 /* Tap off here if there is a BPF listener. */
  763                 if (ifp->if_bpf)
  764                         bpf_mtap(ifp->if_bpf, m);
  765 #endif
  766 
  767                 /*
  768                  * Copy the mbuf chain into the transmission buffer.
  769                  * txb_* variables are updated as necessary.
  770                  */
  771                 mb86960_write_mbufs(sc, m);
  772 
  773                 m_freem(m);
  774 
  775                 /* Start transmitter if it's idle. */
  776                 if (sc->txb_sched == 0)
  777                         mb86960_xmit(sc);
  778         }
  779 
  780 indicate_inactive:
  781         /*
  782          * We are using the !OACTIVE flag to indicate to
  783          * the outside world that we can accept an
  784          * additional packet rather than that the
  785          * transmitter is _actually_ active.  Indeed, the
  786          * transmitter may be active, but if we haven't
  787          * filled all the buffers with data then we still
  788          * want to accept more.
  789          */
  790         ifp->if_flags &= ~IFF_OACTIVE;
  791         return;
  792 
  793 indicate_active:
  794         /*
  795          * The transmitter is active, and there are no room for
  796          * more outgoing packets in the transmission buffer.
  797          */
  798         ifp->if_flags |= IFF_OACTIVE;
  799         return;
  800 }
  801 
  802 /*
  803  * Transmission interrupt handler
  804  * The control flow of this function looks silly.  FIXME.
  805  */
  806 void
  807 mb86960_tint(struct mb86960_softc *sc, uint8_t tstat)
  808 {
  809         bus_space_tag_t bst = sc->sc_bst;
  810         bus_space_handle_t bsh = sc->sc_bsh;
  811         struct ifnet *ifp = &sc->sc_ec.ec_if;
  812         int left;
  813         int col;
  814 
  815         /*
  816          * Handle "excessive collision" interrupt.
  817          */
  818         if (tstat & FE_D0_COLL16) {
  819                 /*
  820                  * Find how many packets (including this collided one)
  821                  * are left unsent in transmission buffer.
  822                  */
  823                 left = bus_space_read_1(bst, bsh, FE_BMPR10);
  824 
  825 #if FE_DEBUG >= 2
  826                 log(LOG_WARNING, "%s: excessive collision (%d/%d)\n",
  827                     sc->sc_dev.dv_xname, left, sc->txb_sched);
  828 #endif
  829 #if FE_DEBUG >= 3
  830                 mb86960_dump(LOG_INFO, sc);
  831 #endif
  832 
  833                 /*
  834                  * Update statistics.
  835                  */
  836                 ifp->if_collisions += 16;
  837                 ifp->if_oerrors++;
  838                 ifp->if_opackets += sc->txb_sched - left;
  839 
  840                 /*
  841                  * Collision statistics has been updated.
  842                  * Clear the collision flag on 86960 now to avoid confusion.
  843                  */
  844                 bus_space_write_1(bst, bsh, FE_DLCR0, FE_D0_COLLID);
  845 
  846                 /*
  847                  * Restart transmitter, skipping the
  848                  * collided packet.
  849                  *
  850                  * We *must* skip the packet to keep network running
  851                  * properly.  Excessive collision error is an
  852                  * indication of the network overload.  If we
  853                  * tried sending the same packet after excessive
  854                  * collision, the network would be filled with
  855                  * out-of-time packets.  Packets belonging
  856                  * to reliable transport (such as TCP) are resent
  857                  * by some upper layer.
  858                  */
  859                 bus_space_write_1(bst, bsh, FE_BMPR11,
  860                     FE_B11_CTRL_SKIP | FE_B11_MODE1);
  861                 sc->txb_sched = left - 1;
  862         }
  863 
  864         /*
  865          * Handle "transmission complete" interrupt.
  866          */
  867         if (tstat & FE_D0_TXDONE) {
  868                 /*
  869                  * Add in total number of collisions on last
  870                  * transmission.  We also clear "collision occurred" flag
  871                  * here.
  872                  *
  873                  * 86960 has a design flow on collision count on multiple
  874                  * packet transmission.  When we send two or more packets
  875                  * with one start command (that's what we do when the
  876                  * transmission queue is clauded), 86960 informs us number
  877                  * of collisions occurred on the last packet on the
  878                  * transmission only.  Number of collisions on previous
  879                  * packets are lost.  I have told that the fact is clearly
  880                  * stated in the Fujitsu document.
  881                  *
  882                  * I considered not to mind it seriously.  Collision
  883                  * count is not so important, anyway.  Any comments?  FIXME.
  884                  */
  885 
  886                 if (bus_space_read_1(bst, bsh, FE_DLCR0) & FE_D0_COLLID) {
  887                         /* Clear collision flag. */
  888                         bus_space_write_1(bst, bsh, FE_DLCR0, FE_D0_COLLID);
  889 
  890                         /* Extract collision count from 86960. */
  891                         col = bus_space_read_1(bst, bsh, FE_DLCR4) & FE_D4_COL;
  892                         if (col == 0) {
  893                                 /*
  894                                  * Status register indicates collisions,
  895                                  * while the collision count is zero.
  896                                  * This can happen after multiple packet
  897                                  * transmission, indicating that one or more
  898                                  * previous packet(s) had been collided.
  899                                  *
  900                                  * Since the accurate number of collisions
  901                                  * has been lost, we just guess it as 1;
  902                                  * Am I too optimistic?  FIXME.
  903                                  */
  904                                 col = 1;
  905                         } else
  906                                 col >>= FE_D4_COL_SHIFT;
  907                         ifp->if_collisions += col;
  908 #if FE_DEBUG >= 4
  909                         log(LOG_WARNING, "%s: %d collision%s (%d)\n",
  910                             sc->sc_dev.dv_xname, col, col == 1 ? "" : "s",
  911                             sc->txb_sched);
  912 #endif
  913                 }
  914 
  915                 /*
  916                  * Update total number of successfully
  917                  * transmitted packets.
  918                  */
  919                 ifp->if_opackets += sc->txb_sched;
  920                 sc->txb_sched = 0;
  921         }
  922 
  923         if (sc->txb_sched == 0) {
  924                 /*
  925                  * The transmitter is no more active.
  926                  * Reset output active flag and watchdog timer.
  927                  */
  928                 ifp->if_flags &= ~IFF_OACTIVE;
  929                 ifp->if_timer = 0;
  930 
  931                 /*
  932                  * If more data is ready to transmit in the buffer, start
  933                  * transmitting them.  Otherwise keep transmitter idle,
  934                  * even if more data is queued.  This gives receive
  935                  * process a slight priority.
  936                  */
  937                 if (sc->txb_count > 0)
  938                         mb86960_xmit(sc);
  939         }
  940 }
  941 
  942 /*
  943  * Ethernet interface receiver interrupt.
  944  */
  945 void
  946 mb86960_rint(struct mb86960_softc *sc, uint8_t rstat)
  947 {
  948         bus_space_tag_t bst = sc->sc_bst;
  949         bus_space_handle_t bsh = sc->sc_bsh;
  950         struct ifnet *ifp = &sc->sc_ec.ec_if;
  951         u_int status, len;
  952         int i;
  953 
  954         /*
  955          * Update statistics if this interrupt is caused by an error.
  956          */
  957         if (rstat & (FE_D1_OVRFLO | FE_D1_CRCERR | FE_D1_ALGERR |
  958             FE_D1_SRTPKT)) {
  959 #if FE_DEBUG >= 3
  960                 char sbuf[sizeof(FE_D1_ERRBITS) + 64];
  961 
  962                 bitmask_snprintf(rstat, FE_D1_ERRBITS, sbuf, sizeof(sbuf));
  963                 log(LOG_WARNING, "%s: receive error: %s\n",
  964                     sc->sc_dev.dv_xname, sbuf);
  965 #endif
  966                 ifp->if_ierrors++;
  967         }
  968 
  969         /*
  970          * MB86960 has a flag indicating "receive queue empty."
  971          * We just loop checking the flag to pull out all received
  972          * packets.
  973          *
  974          * We limit the number of iterrations to avoid infinite loop.
  975          * It can be caused by a very slow CPU (some broken
  976          * peripheral may insert incredible number of wait cycles)
  977          * or, worse, by a broken MB86960 chip.
  978          */
  979         for (i = 0; i < FE_MAX_RECV_COUNT; i++) {
  980                 /* Stop the iterration if 86960 indicates no packets. */
  981                 if (bus_space_read_1(bst, bsh, FE_DLCR5) & FE_D5_BUFEMP)
  982                         break;
  983 
  984                 /*
  985                  * Extract receive packet status from the receive
  986                  * packet header.
  987                  */
  988                 if (sc->sc_flags & FE_FLAGS_SBW_BYTE) {
  989                         status = bus_space_read_1(bst, bsh, FE_BMPR8);
  990                         (void)bus_space_read_1(bst, bsh, FE_BMPR8);
  991                 } else
  992                         status = bus_space_read_2(bst, bsh, FE_BMPR8);
  993 
  994 #if FE_DEBUG >= 4
  995                 log(LOG_INFO, "%s: receive status = %02x\n",
  996                     sc->sc_dev.dv_xname, status);
  997 #endif
  998 
  999                 /*
 1000                  * If there was an error, update statistics and drop
 1001                  * the packet, unless the interface is in promiscuous
 1002                  * mode.
 1003                  */
 1004                 if ((status & FE_RXSTAT_GOODPKT) == 0) {
 1005                         if ((ifp->if_flags & IFF_PROMISC) == 0) {
 1006                                 ifp->if_ierrors++;
 1007                                 mb86960_droppacket(sc);
 1008                                 continue;
 1009                         }
 1010                 }
 1011 
 1012                 /*
 1013                  * Extract the packet length from the receive packet header.
 1014                  * It is a sum of a header (14 bytes) and a payload.
 1015                  * CRC has been stripped off by the 86960.
 1016                  */
 1017                 if (sc->sc_flags & FE_FLAGS_SBW_BYTE) {
 1018                         len  = bus_space_read_1(bst, bsh, FE_BMPR8);
 1019                         len |= bus_space_read_1(bst, bsh, FE_BMPR8) << 8;
 1020                 } else
 1021                         len = bus_space_read_2(bst, bsh, FE_BMPR8);
 1022 
 1023                 /*
 1024                  * MB86965 checks the packet length and drop big packet
 1025                  * before passing it to us.  There are no chance we can
 1026                  * get [crufty] packets.  Hence, if the length exceeds
 1027                  * the specified limit, it means some serious failure,
 1028                  * such as out-of-sync on receive buffer management.
 1029                  *
 1030                  * Is this statement true?  FIXME.
 1031                  */
 1032                 if (len > (ETHER_MAX_LEN - ETHER_CRC_LEN) ||
 1033                     len < ETHER_HDR_LEN) {
 1034 #if FE_DEBUG >= 2
 1035                         log(LOG_WARNING,
 1036                             "%s: received a %s packet? (%u bytes)\n",
 1037                             sc->sc_dev.dv_xname,
 1038                             len < ETHER_HDR_LEN ? "partial" : "big", len);
 1039 #endif
 1040                         ifp->if_ierrors++;
 1041                         mb86960_droppacket(sc);
 1042                         continue;
 1043                 }
 1044 
 1045                 /*
 1046                  * Check for a short (RUNT) packet.  We *do* check
 1047                  * but do nothing other than print a message.
 1048                  * Short packets are illegal, but does nothing bad
 1049                  * if it carries data for upper layer.
 1050                  */
 1051 #if FE_DEBUG >= 2
 1052                 if (len < (ETHER_MIN_LEN - ETHER_CRC_LEN)) {
 1053                         log(LOG_WARNING,
 1054                             "%s: received a short packet? (%u bytes)\n",
 1055                             sc->sc_dev.dv_xname, len);
 1056                 }
 1057 #endif
 1058 
 1059                 /*
 1060                  * Go get a packet.
 1061                  */
 1062                 if (mb86960_get_packet(sc, len) == 0) {
 1063                         /* Skip a packet, updating statistics. */
 1064 #if FE_DEBUG >= 2
 1065                         log(LOG_WARNING,
 1066                             "%s: out of mbufs; dropping packet (%u bytes)\n",
 1067                             sc->sc_dev.dv_xname, len);
 1068 #endif
 1069                         ifp->if_ierrors++;
 1070                         mb86960_droppacket(sc);
 1071 
 1072                         /*
 1073                          * We stop receiving packets, even if there are
 1074                          * more in the buffer.  We hope we can get more
 1075                          * mbufs next time.
 1076                          */
 1077                         return;
 1078                 }
 1079 
 1080                 /* Successfully received a packet.  Update stat. */
 1081                 ifp->if_ipackets++;
 1082         }
 1083 }
 1084 
 1085 /*
 1086  * Ethernet interface interrupt processor
 1087  */
 1088 int
 1089 mb86960_intr(void *arg)
 1090 {
 1091         struct mb86960_softc *sc = arg;
 1092         bus_space_tag_t bst = sc->sc_bst;
 1093         bus_space_handle_t bsh = sc->sc_bsh;
 1094         struct ifnet *ifp = &sc->sc_ec.ec_if;
 1095         uint8_t tstat, rstat;
 1096 
 1097         if ((sc->sc_stat & FE_STAT_ENABLED) == 0 ||
 1098             (sc->sc_dev.dv_flags & DVF_ACTIVE) == 0)
 1099                 return (0);
 1100 
 1101 #if FE_DEBUG >= 4
 1102         log(LOG_INFO, "%s: mb86960_intr()\n", sc->sc_dev.dv_xname);
 1103         mb86960_dump(LOG_INFO, sc);
 1104 #endif
 1105 
 1106         /*
 1107          * Get interrupt conditions, masking unneeded flags.
 1108          */
 1109         tstat = bus_space_read_1(bst, bsh, FE_DLCR0) & FE_TMASK;
 1110         rstat = bus_space_read_1(bst, bsh, FE_DLCR1) & FE_RMASK;
 1111         if (tstat == 0 && rstat == 0)
 1112                 return (0);
 1113 
 1114         /*
 1115          * Loop until there are no more new interrupt conditions.
 1116          */
 1117         for (;;) {
 1118                 /*
 1119                  * Reset the conditions we are acknowledging.
 1120                  */
 1121                 bus_space_write_1(bst, bsh, FE_DLCR0, tstat);
 1122                 bus_space_write_1(bst, bsh, FE_DLCR1, rstat);
 1123 
 1124                 /*
 1125                  * Handle transmitter interrupts. Handle these first because
 1126                  * the receiver will reset the board under some conditions.
 1127                  */
 1128                 if (tstat != 0)
 1129                         mb86960_tint(sc, tstat);
 1130 
 1131                 /*
 1132                  * Handle receiver interrupts.
 1133                  */
 1134                 if (rstat != 0)
 1135                         mb86960_rint(sc, rstat);
 1136 
 1137                 /*
 1138                  * Update the multicast address filter if it is
 1139                  * needed and possible.  We do it now, because
 1140                  * we can make sure the transmission buffer is empty,
 1141                  * and there is a good chance that the receive queue
 1142                  * is empty.  It will minimize the possibility of
 1143                  * packet lossage.
 1144                  */
 1145                 if (sc->filter_change &&
 1146                     sc->txb_count == 0 && sc->txb_sched == 0) {
 1147                         mb86960_loadmar(sc);
 1148                         ifp->if_flags &= ~IFF_OACTIVE;
 1149                 }
 1150 
 1151                 /*
 1152                  * If it looks like the transmitter can take more data,
 1153                  * attempt to start output on the interface. This is done
 1154                  * after handling the receiver interrupt to give the
 1155                  * receive operation priority.
 1156                  */
 1157                 if ((ifp->if_flags & IFF_OACTIVE) == 0)
 1158                         mb86960_start(ifp);
 1159 
 1160 #if NRND > 0
 1161                 if (rstat != 0 || tstat != 0)
 1162                         rnd_add_uint32(&sc->rnd_source, rstat + tstat);
 1163 #endif
 1164 
 1165                 /*
 1166                  * Get interrupt conditions, masking unneeded flags.
 1167                  */
 1168                 tstat = bus_space_read_1(bst, bsh, FE_DLCR0) & FE_TMASK;
 1169                 rstat = bus_space_read_1(bst, bsh, FE_DLCR1) & FE_RMASK;
 1170                 if (tstat == 0 && rstat == 0)
 1171                         return (1);
 1172         }
 1173 }
 1174 
 1175 /*
 1176  * Process an ioctl request.  This code needs some work - it looks pretty ugly.
 1177  */
 1178 int
 1179 mb86960_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
 1180 {
 1181         struct mb86960_softc *sc = ifp->if_softc;
 1182         struct ifaddr *ifa = (struct ifaddr *)data;
 1183         struct ifreq *ifr = (struct ifreq *)data;
 1184         int s, error = 0;
 1185 
 1186 #if FE_DEBUG >= 3
 1187         log(LOG_INFO, "%s: ioctl(%lx)\n", sc->sc_dev.dv_xname, cmd);
 1188 #endif
 1189 
 1190         s = splnet();
 1191 
 1192         switch (cmd) {
 1193         case SIOCSIFADDR:
 1194                 if ((error = mb86960_enable(sc)) != 0)
 1195                         break;
 1196                 ifp->if_flags |= IFF_UP;
 1197 
 1198                 switch (ifa->ifa_addr->sa_family) {
 1199 #ifdef INET
 1200                 case AF_INET:
 1201                         mb86960_init(sc);
 1202                         arp_ifinit(ifp, ifa);
 1203                         break;
 1204 #endif
 1205 #ifdef NS
 1206                 case AF_NS:
 1207                     {
 1208                         struct ns_addr *ina = &IA_SNS(ifa)->sns_addr;
 1209 
 1210                         if (ns_nullhost(*ina))
 1211                                 ina->x_host =
 1212                                     *(union ns_host *)LLADDR(ifp->if_sadl);
 1213                         else {
 1214                                 memcpy(LLADDR(ifp->if_sadl),
 1215                                     ina->x_host.c_host, ETHER_ADDR_LEN);
 1216                         }
 1217                         /* Set new address. */
 1218                         mb86960_init(sc);
 1219                         break;
 1220                     }
 1221 #endif
 1222                 default:
 1223                         mb86960_init(sc);
 1224                         break;
 1225                 }
 1226                 break;
 1227 
 1228         case SIOCSIFFLAGS:
 1229                 if ((ifp->if_flags & IFF_UP) == 0 &&
 1230                     (ifp->if_flags & IFF_RUNNING) != 0) {
 1231                         /*
 1232                          * If interface is marked down and it is running, then
 1233                          * stop it.
 1234                          */
 1235                         mb86960_stop(sc);
 1236                         ifp->if_flags &= ~IFF_RUNNING;
 1237                         mb86960_disable(sc);
 1238                 } else if ((ifp->if_flags & IFF_UP) != 0 &&
 1239                     (ifp->if_flags & IFF_RUNNING) == 0) {
 1240                         /*
 1241                          * If interface is marked up and it is stopped, then
 1242                          * start it.
 1243                          */
 1244                         if ((error = mb86960_enable(sc)) != 0)
 1245                                 break;
 1246                         mb86960_init(sc);
 1247                 } else if ((ifp->if_flags & IFF_UP) != 0) {
 1248                         /*
 1249                          * Reset the interface to pick up changes in any other
 1250                          * flags that affect hardware registers.
 1251                          */
 1252                         mb86960_setmode(sc);
 1253                 }
 1254 #if FE_DEBUG >= 1
 1255                 /* "ifconfig fe0 debug" to print register dump. */
 1256                 if (ifp->if_flags & IFF_DEBUG) {
 1257                         log(LOG_INFO, "%s: SIOCSIFFLAGS(DEBUG)\n",
 1258                             sc->sc_dev.dv_xname);
 1259                         mb86960_dump(LOG_DEBUG, sc);
 1260                 }
 1261 #endif
 1262                 break;
 1263 
 1264         case SIOCADDMULTI:
 1265         case SIOCDELMULTI:
 1266                 if ((sc->sc_stat & FE_STAT_ENABLED) == 0) {
 1267                         error = EIO;
 1268                         break;
 1269                 }
 1270 
 1271                 /* Update our multicast list. */
 1272                 error = (cmd == SIOCADDMULTI) ?
 1273                     ether_addmulti(ifr, &sc->sc_ec) :
 1274                     ether_delmulti(ifr, &sc->sc_ec);
 1275 
 1276                 if (error == ENETRESET) {
 1277                         /*
 1278                          * Multicast list has changed; set the hardware filter
 1279                          * accordingly.
 1280                          */
 1281                         if (ifp->if_flags & IFF_RUNNING)
 1282                                 mb86960_setmode(sc);
 1283                         error = 0;
 1284                 }
 1285                 break;
 1286 
 1287         case SIOCGIFMEDIA:
 1288         case SIOCSIFMEDIA:
 1289                 error = ifmedia_ioctl(ifp, ifr, &sc->sc_media, cmd);
 1290                 break;
 1291 
 1292         default:
 1293                 error = EINVAL;
 1294                 break;
 1295         }
 1296 
 1297         splx(s);
 1298         return (error);
 1299 }
 1300 
 1301 /*
 1302  * Retrieve packet from receive buffer and send to the next level up via
 1303  * ether_input(). If there is a BPF listener, give a copy to BPF, too.
 1304  * Returns 0 if success, -1 if error (i.e., mbuf allocation failure).
 1305  */
 1306 int
 1307 mb86960_get_packet(struct mb86960_softc *sc, u_int len)
 1308 {
 1309         bus_space_tag_t bst = sc->sc_bst;
 1310         bus_space_handle_t bsh = sc->sc_bsh;
 1311         struct ifnet *ifp = &sc->sc_ec.ec_if;
 1312         struct mbuf *m;
 1313 
 1314         /* Allocate a header mbuf. */
 1315         MGETHDR(m, M_DONTWAIT, MT_DATA);
 1316         if (m == 0)
 1317                 return (0);
 1318         m->m_pkthdr.rcvif = ifp;
 1319         m->m_pkthdr.len = len;
 1320 
 1321         /* The following silliness is to make NFS happy. */
 1322 #define EROUND  ((sizeof(struct ether_header) + 3) & ~3)
 1323 #define EOFF    (EROUND - sizeof(struct ether_header))
 1324 
 1325         /*
 1326          * Our strategy has one more problem.  There is a policy on
 1327          * mbuf cluster allocation.  It says that we must have at
 1328          * least MINCLSIZE (208 bytes) to allocate a cluster.  For a
 1329          * packet of a size between (MHLEN - 2) to (MINCLSIZE - 2),
 1330          * our code violates the rule...
 1331          * On the other hand, the current code is short, simple,
 1332          * and fast, however.  It does no harmful thing, just waists
 1333          * some memory.  Any comments?  FIXME.
 1334          */
 1335 
 1336         /* Attach a cluster if this packet doesn't fit in a normal mbuf. */
 1337         if (len > MHLEN - EOFF) {
 1338                 MCLGET(m, M_DONTWAIT);
 1339                 if ((m->m_flags & M_EXT) == 0) {
 1340                         m_freem(m);
 1341                         return (0);
 1342                 }
 1343         }
 1344 
 1345         /*
 1346          * The following assumes there is room for the ether header in the
 1347          * header mbuf.
 1348          */
 1349         m->m_data += EOFF;
 1350 
 1351         /* Set the length of this packet. */
 1352         m->m_len = len;
 1353 
 1354         /* Get a packet. */
 1355         if (sc->sc_flags & FE_FLAGS_SBW_BYTE)
 1356                 bus_space_read_multi_1(bst, bsh, FE_BMPR8,
 1357                     mtod(m, uint8_t *), len);
 1358         else
 1359                 bus_space_read_multi_stream_2(bst, bsh, FE_BMPR8,
 1360                     mtod(m, uint16_t *), (len + 1) >> 1);
 1361 
 1362 #if NBPFILTER > 0
 1363         /*
 1364          * Check if there's a BPF listener on this interface.  If so, hand off
 1365          * the raw packet to bpf.
 1366          */
 1367         if (ifp->if_bpf)
 1368                 bpf_mtap(ifp->if_bpf, m);
 1369 #endif
 1370 
 1371         (*ifp->if_input)(ifp, m);
 1372         return (1);
 1373 }
 1374 
 1375 /*
 1376  * Write an mbuf chain to the transmission buffer memory using 16 bit PIO.
 1377  * Returns number of bytes actually written, including length word.
 1378  *
 1379  * If an mbuf chain is too long for an Ethernet frame, it is not sent.
 1380  * Packets shorter than Ethernet minimum are legal, and we pad them
 1381  * before sending out.  An exception is "partial" packets which are
 1382  * shorter than mandatory Ethernet header.
 1383  *
 1384  * I wrote a code for an experimental "delayed padding" technique.
 1385  * When employed, it postpones the padding process for short packets.
 1386  * If xmit() occurred at the moment, the padding process is omitted, and
 1387  * garbages are sent as pad data.  If next packet is stored in the
 1388  * transmission buffer before xmit(), write_mbuf() pads the previous
 1389  * packet before transmitting new packet.  This *may* gain the
 1390  * system performance (slightly).
 1391  */
 1392 void
 1393 mb86960_write_mbufs(struct mb86960_softc *sc, struct mbuf *m)
 1394 {
 1395         bus_space_tag_t bst = sc->sc_bst;
 1396         bus_space_handle_t bsh = sc->sc_bsh;
 1397         int totlen, len;
 1398 #if FE_DEBUG >= 2
 1399         struct mbuf *mp;
 1400 #endif
 1401 
 1402 #if FE_DELAYED_PADDING
 1403         /* Do the "delayed padding." */
 1404         if (sc->txb_padding > 0) {
 1405                 if (sc->sc_flags & FE_FLAGS_SBW_BYTE) {
 1406                         for (len = sc->txb_padding; len > 0; len--)
 1407                                 bus_space_write_1(bst, bsh, FE_BMPR8, 0);
 1408                 } else {
 1409                         for (len = sc->txb_padding >> 1; len > 0; len--)
 1410                                 bus_space_write_2(bst, bsh, FE_BMPR8, 0);
 1411                 }
 1412                 sc->txb_padding = 0;
 1413         }
 1414 #endif
 1415 
 1416         /* We need to use m->m_pkthdr.len, so require the header */
 1417         if ((m->m_flags & M_PKTHDR) == 0)
 1418                 panic("mb86960_write_mbufs: no header mbuf");
 1419 
 1420 #if FE_DEBUG >= 2
 1421         /* First, count up the total number of bytes to copy. */
 1422         for (totlen = 0, mp = m; mp != 0; mp = mp->m_next)
 1423                 totlen += mp->m_len;
 1424         /* Check if this matches the one in the packet header. */
 1425         if (totlen != m->m_pkthdr.len)
 1426                 log(LOG_WARNING, "%s: packet length mismatch? (%d/%d)\n",
 1427                     sc->sc_dev.dv_xname, totlen, m->m_pkthdr.len);
 1428 #else
 1429         /* Just use the length value in the packet header. */
 1430         totlen = m->m_pkthdr.len;
 1431 #endif
 1432 
 1433 #if FE_DEBUG >= 1
 1434         /*
 1435          * Should never send big packets.  If such a packet is passed,
 1436          * it should be a bug of upper layer.  We just ignore it.
 1437          * ... Partial (too short) packets, neither.
 1438          */
 1439         if (totlen > (ETHER_MAX_LEN - ETHER_CRC_LEN) ||
 1440             totlen < ETHER_HDR_LEN) {
 1441                 log(LOG_ERR, "%s: got a %s packet (%u bytes) to send\n",
 1442                     sc->sc_dev.dv_xname,
 1443                     totlen < ETHER_HDR_LEN ? "partial" : "big", totlen);
 1444                 sc->sc_ec.ec_if.if_oerrors++;
 1445                 return;
 1446         }
 1447 #endif
 1448 
 1449         /*
 1450          * Put the length word for this frame.
 1451          * Does 86960 accept odd length?  -- Yes.
 1452          * Do we need to pad the length to minimum size by ourselves?
 1453          * -- Generally yes.  But for (or will be) the last
 1454          * packet in the transmission buffer, we can skip the
 1455          * padding process.  It may gain performance slightly.  FIXME.
 1456          */
 1457         len = max(totlen, (ETHER_MIN_LEN - ETHER_CRC_LEN));
 1458         if (sc->sc_flags & FE_FLAGS_SBW_BYTE) {
 1459                 bus_space_write_1(bst, bsh, FE_BMPR8, len);
 1460                 bus_space_write_1(bst, bsh, FE_BMPR8, len >> 8);
 1461         } else {
 1462                 bus_space_write_2(bst, bsh, FE_BMPR8, len);
 1463                 /* roundup packet length since we will use word access */
 1464                 totlen = (totlen + 1) & ~1;
 1465         }
 1466 
 1467         /*
 1468          * Update buffer status now.
 1469          * Truncate the length up to an even number
 1470          * if the chip is set in SBW_WORD mode.
 1471          */
 1472         sc->txb_free -= FE_TXLEN_SIZE +
 1473             max(totlen, (ETHER_MIN_LEN - ETHER_CRC_LEN));
 1474         sc->txb_count++;
 1475 
 1476 #if FE_DELAYED_PADDING
 1477         /* Postpone the packet padding if necessary. */
 1478         if (totlen < (ETHER_MIN_LEN - ETHER_CRC_LEN))
 1479                 sc->txb_padding = (ETHER_MIN_LEN - ETHER_CRC_LEN) - totlen;
 1480 #endif
 1481 
 1482         /*
 1483          * Transfer the data from mbuf chain to the transmission buffer.
 1484          * If the MB86960 is configured in word mode, data needs to be
 1485          * transferred as words, and only words.
 1486          * So that we require some extra code to patch over odd-length
 1487          * or unaligned mbufs.
 1488          */
 1489         if (sc->sc_flags & FE_FLAGS_SBW_BYTE) {
 1490                 /* It's simple in byte mode. */
 1491                 for (; m != NULL; m = m->m_next) {
 1492                         if (m->m_len) {
 1493                                 bus_space_write_multi_1(bst, bsh, FE_BMPR8,
 1494                                     mtod(m, uint8_t *), m->m_len);
 1495                         }
 1496                 }
 1497         } else {
 1498                 /* a bit trickier in word mode. */
 1499                 uint8_t *data, savebyte[2];
 1500                 int leftover;
 1501 
 1502                 leftover = 0;
 1503                 savebyte[0] = savebyte[1] = 0;
 1504 
 1505                 for (; m != NULL; m = m->m_next) {
 1506                         len = m->m_len;
 1507                         if (len == 0)
 1508                                 continue;
 1509                         data = mtod(m, uint8_t *);
 1510                         while (len > 0) {
 1511                                 if (leftover) {
 1512                                         /*
 1513                                          * Data left over (from mbuf or
 1514                                          * realignment). Buffer the next
 1515                                          * byte, and write it and the
 1516                                          * leftover data out.
 1517                                          */
 1518                                         savebyte[1] = *data++;
 1519                                         len--;
 1520                                         bus_space_write_stream_2(bst, bsh,
 1521                                            FE_BMPR8, *(uint16_t *)savebyte);
 1522                                         leftover = 0;
 1523                                 } else if (BUS_SPACE_ALIGNED_POINTER(data,
 1524                                     uint16_t) == 0) {
 1525                                         /*
 1526                                          * Unaligned data; buffer the next byte.
 1527                                          */
 1528                                         savebyte[0] = *data++;
 1529                                         len--;
 1530                                         leftover = 1;
 1531                                 } else {
 1532                                         /*
 1533                                          * Aligned data; output contiguous
 1534                                          * words as much as we can, then
 1535                                          * buffer the remaining byte, if any.
 1536                                          */
 1537                                         leftover = len & 1;
 1538                                         len &= ~1;
 1539                                         bus_space_write_multi_stream_2(bst, bsh,
 1540                                             FE_BMPR8, (uint16_t *)data,
 1541                                             len >> 1);
 1542                                         data += len;
 1543                                         if (leftover)
 1544                                                 savebyte[0] = *data++;
 1545                                         len = 0;
 1546                                 }
 1547                         }
 1548                         if (len < 0)
 1549                                 panic("mb86960_write_mbufs: negative len");
 1550                 }
 1551                 if (leftover) {
 1552                         savebyte[1] = 0;
 1553                         bus_space_write_stream_2(bst, bsh, FE_BMPR8,
 1554                             *(uint16_t *)savebyte);
 1555                 }
 1556         }
 1557 #if FE_DELAYED_PADDING == 0
 1558         /*
 1559          * Pad the packet to the minimum length if necessary.
 1560          */
 1561         len = (ETHER_MIN_LEN - ETHER_CRC_LEN) - totlen;
 1562         if (len > 0) {
 1563                 if (sc->sc_flags & FE_FLAGS_SBW_BYTE) {
 1564                         while (len-- > 0)
 1565                                 bus_space_write_1(bst, bsh, FE_BMPR8, 0);
 1566                 } else {
 1567                         len >>= 1;
 1568                         while (len-- > 0)
 1569                                 bus_space_write_2(bst, bsh, FE_BMPR8, 0);
 1570                 }
 1571         }
 1572 #endif
 1573 }
 1574 
 1575 /*
 1576  * Compute the multicast address filter from the
 1577  * list of multicast addresses we need to listen to.
 1578  */
 1579 void
 1580 mb86960_getmcaf(struct ethercom *ec, uint8_t *af)
 1581 {
 1582         struct ifnet *ifp = &ec->ec_if;
 1583         struct ether_multi *enm;
 1584         uint32_t crc;
 1585         struct ether_multistep step;
 1586 
 1587         /*
 1588          * Set up multicast address filter by passing all multicast addresses
 1589          * through a crc generator, and then using the high order 6 bits as an
 1590          * index into the 64 bit logical address filter.  The high order bit
 1591          * selects the word, while the rest of the bits select the bit within
 1592          * the word.
 1593          */
 1594 
 1595         if ((ifp->if_flags & IFF_PROMISC) != 0)
 1596                 goto allmulti;
 1597 
 1598         memset(af, 0, FE_FILTER_LEN);
 1599         ETHER_FIRST_MULTI(step, ec, enm);
 1600         while (enm != NULL) {
 1601                 if (memcmp(enm->enm_addrlo, enm->enm_addrhi,
 1602                     sizeof(enm->enm_addrlo)) != 0) {
 1603                         /*
 1604                          * We must listen to a range of multicast addresses.
 1605                          * For now, just accept all multicasts, rather than
 1606                          * trying to set only those filter bits needed to match
 1607                          * the range.  (At this time, the only use of address
 1608                          * ranges is for IP multicast routing, for which the
 1609                          * range is big enough to require all bits set.)
 1610                          */
 1611                         goto allmulti;
 1612                 }
 1613 
 1614                 crc = ether_crc32_le(enm->enm_addrlo, ETHER_ADDR_LEN);
 1615 
 1616                 /* Just want the 6 most significant bits. */
 1617                 crc >>= 26;
 1618 
 1619                 /* Turn on the corresponding bit in the filter. */
 1620                 af[crc >> 3] |= 1 << (crc & 7);
 1621 
 1622                 ETHER_NEXT_MULTI(step, enm);
 1623         }
 1624         ifp->if_flags &= ~IFF_ALLMULTI;
 1625         return;
 1626 
 1627 allmulti:
 1628         ifp->if_flags |= IFF_ALLMULTI;
 1629         memset(af, 0xff, FE_FILTER_LEN);
 1630 }
 1631 
 1632 /*
 1633  * Calculate a new "multicast packet filter" and put the 86960
 1634  * receiver in appropriate mode.
 1635  */
 1636 void
 1637 mb86960_setmode(struct mb86960_softc *sc)
 1638 {
 1639         bus_space_tag_t bst = sc->sc_bst;
 1640         bus_space_handle_t bsh = sc->sc_bsh;
 1641         int flags = sc->sc_ec.ec_if.if_flags;
 1642 
 1643         /*
 1644          * If the interface is not running, we postpone the update
 1645          * process for receive modes and multicast address filter
 1646          * until the interface is restarted.  It reduces some
 1647          * complicated job on maintaining chip states.  (Earlier versions
 1648          * of this driver had a bug on that point...)
 1649          *
 1650          * To complete the trick, mb86960_init() calls mb86960_setmode() after
 1651          * restarting the interface.
 1652          */
 1653         if ((flags & IFF_RUNNING) == 0)
 1654                 return;
 1655 
 1656         /*
 1657          * Promiscuous mode is handled separately.
 1658          */
 1659         if ((flags & IFF_PROMISC) != 0) {
 1660                 /*
 1661                  * Program 86960 to receive all packets on the segment
 1662                  * including those directed to other stations.
 1663                  * Multicast filter stored in MARs are ignored
 1664                  * under this setting, so we don't need to update it.
 1665                  *
 1666                  * Promiscuous mode is used solely by BPF, and BPF only
 1667                  * listens to valid (no error) packets.  So, we ignore
 1668                  * errornous ones even in this mode.
 1669                  */
 1670                 bus_space_write_1(bst, bsh, FE_DLCR5,
 1671                     sc->proto_dlcr5 | FE_D5_AFM0 | FE_D5_AFM1);
 1672                 sc->filter_change = 0;
 1673 
 1674 #if FE_DEBUG >= 3
 1675                 log(LOG_INFO, "%s: promiscuous mode\n", sc->sc_dev.dv_xname);
 1676 #endif
 1677                 return;
 1678         }
 1679 
 1680         /*
 1681          * Turn the chip to the normal (non-promiscuous) mode.
 1682          */
 1683         bus_space_write_1(bst, bsh, FE_DLCR5, sc->proto_dlcr5 | FE_D5_AFM1);
 1684 
 1685         /*
 1686          * Find the new multicast filter value.
 1687          */
 1688         mb86960_getmcaf(&sc->sc_ec, sc->filter);
 1689         sc->filter_change = 1;
 1690 
 1691 #if FE_DEBUG >= 3
 1692         log(LOG_INFO,
 1693             "%s: address filter: [%02x %02x %02x %02x %02x %02x %02x %02x]\n",
 1694             sc->sc_dev.dv_xname,
 1695             sc->filter[0], sc->filter[1], sc->filter[2], sc->filter[3],
 1696             sc->filter[4], sc->filter[5], sc->filter[6], sc->filter[7]);
 1697 #endif
 1698 
 1699         /*
 1700          * We have to update the multicast filter in the 86960, A.S.A.P.
 1701          *
 1702          * Note that the DLC (Data Linc Control unit, i.e. transmitter
 1703          * and receiver) must be stopped when feeding the filter, and
 1704          * DLC trashes all packets in both transmission and receive
 1705          * buffers when stopped.
 1706          *
 1707          * ... Are the above sentenses correct?  I have to check the
 1708          *     manual of the MB86960A.  FIXME.
 1709          *
 1710          * To reduce the packet lossage, we delay the filter update
 1711          * process until buffers are empty.
 1712          */
 1713         if (sc->txb_sched == 0 && sc->txb_count == 0 &&
 1714             (bus_space_read_1(bst, bsh, FE_DLCR1) & FE_D1_PKTRDY) == 0) {
 1715                 /*
 1716                  * Buffers are (apparently) empty.  Load
 1717                  * the new filter value into MARs now.
 1718                  */
 1719                 mb86960_loadmar(sc);
 1720         } else {
 1721                 /*
 1722                  * Buffers are not empty.  Mark that we have to update
 1723                  * the MARs.  The new filter will be loaded by mb86960_intr()
 1724                  * later.
 1725                  */
 1726 #if FE_DEBUG >= 4
 1727                 log(LOG_INFO, "%s: filter change delayed\n",
 1728                     sc->sc_dev.dv_xname);
 1729 #endif
 1730         }
 1731 }
 1732 
 1733 /*
 1734  * Load a new multicast address filter into MARs.
 1735  *
 1736  * The caller must have splnet'ed befor mb86960_loadmar.
 1737  * This function starts the DLC upon return.  So it can be called only
 1738  * when the chip is working, i.e., from the driver's point of view, when
 1739  * a device is RUNNING.  (I mistook the point in previous versions.)
 1740  */
 1741 void
 1742 mb86960_loadmar(struct mb86960_softc *sc)
 1743 {
 1744         bus_space_tag_t bst = sc->sc_bst;
 1745         bus_space_handle_t bsh = sc->sc_bsh;
 1746 
 1747         /* Stop the DLC (transmitter and receiver). */
 1748         bus_space_write_1(bst, bsh, FE_DLCR6,
 1749             sc->proto_dlcr6 | FE_D6_DLC_DISABLE);
 1750 
 1751         /* Select register bank 1 for MARs. */
 1752         bus_space_write_1(bst, bsh, FE_DLCR7,
 1753             sc->proto_dlcr7 | FE_D7_RBS_MAR | FE_D7_POWER_UP);
 1754 
 1755         /* Copy filter value into the registers. */
 1756         bus_space_write_region_1(bst, bsh, FE_MAR8, sc->filter, FE_FILTER_LEN);
 1757 
 1758         /* Restore the bank selection for BMPRs (i.e., runtime registers). */
 1759         bus_space_write_1(bst, bsh, FE_DLCR7,
 1760             sc->proto_dlcr7 | FE_D7_RBS_BMPR | FE_D7_POWER_UP);
 1761 
 1762         /* Restart the DLC. */
 1763         bus_space_write_1(bst, bsh, FE_DLCR6,
 1764             sc->proto_dlcr6 | FE_D6_DLC_ENABLE);
 1765 
 1766         /* We have just updated the filter. */
 1767         sc->filter_change = 0;
 1768 
 1769 #if FE_DEBUG >= 3
 1770         log(LOG_INFO, "%s: address filter changed\n", sc->sc_dev.dv_xname);
 1771 #endif
 1772 }
 1773 
 1774 /*
 1775  * Enable power on the interface.
 1776  */
 1777 int
 1778 mb86960_enable(struct mb86960_softc *sc)
 1779 {
 1780 
 1781 #if FE_DEBUG >= 3
 1782         log(LOG_INFO, "%s: mb86960_enable()\n", sc->sc_dev.dv_xname);
 1783 #endif
 1784 
 1785         if ((sc->sc_stat & FE_STAT_ENABLED) == 0 && sc->sc_enable != NULL) {
 1786                 if ((*sc->sc_enable)(sc) != 0) {
 1787                         printf("%s: device enable failed\n",
 1788                             sc->sc_dev.dv_xname);
 1789                         return (EIO);
 1790                 }
 1791         }
 1792 
 1793         sc->sc_stat |= FE_STAT_ENABLED;
 1794         return (0);
 1795 }
 1796 
 1797 /*
 1798  * Disable power on the interface.
 1799  */
 1800 void
 1801 mb86960_disable(struct mb86960_softc *sc)
 1802 {
 1803 
 1804 #if FE_DEBUG >= 3
 1805         log(LOG_INFO, "%s: mb86960_disable()\n", sc->sc_dev.dv_xname);
 1806 #endif
 1807 
 1808         if ((sc->sc_stat & FE_STAT_ENABLED) != 0 && sc->sc_disable != NULL) {
 1809                 (*sc->sc_disable)(sc);
 1810                 sc->sc_stat &= ~FE_STAT_ENABLED;
 1811         }
 1812 }
 1813 
 1814 /*
 1815  * mbe_activate:
 1816  *
 1817  *      Handle device activation/deactivation requests.
 1818  */
 1819 int
 1820 mb86960_activate(struct device *self, enum devact act)
 1821 {
 1822         struct mb86960_softc *sc = (struct mb86960_softc *)self;
 1823         int rv, s;
 1824 
 1825         rv = 0;
 1826         s = splnet();
 1827         switch (act) {
 1828         case DVACT_ACTIVATE:
 1829                 rv = EOPNOTSUPP;
 1830                 break;
 1831 
 1832         case DVACT_DEACTIVATE:
 1833                 if_deactivate(&sc->sc_ec.ec_if);
 1834                 break;
 1835         }
 1836         splx(s);
 1837         return (rv);
 1838 }
 1839 
 1840 /*
 1841  * mb86960_detach:
 1842  *
 1843  *      Detach a MB86960 interface.
 1844  */
 1845 int
 1846 mb86960_detach(struct mb86960_softc *sc)
 1847 {
 1848         struct ifnet *ifp = &sc->sc_ec.ec_if;
 1849 
 1850         /* Succeed now if there's no work to do. */
 1851         if ((sc->sc_stat & FE_STAT_ATTACHED) == 0)
 1852                 return (0);
 1853 
 1854         /* Delete all media. */
 1855         ifmedia_delete_instance(&sc->sc_media, IFM_INST_ANY);
 1856 
 1857 #if NRND > 0
 1858         /* Unhook the entropy source. */
 1859         rnd_detach_source(&sc->rnd_source);
 1860 #endif
 1861         ether_ifdetach(ifp);
 1862         if_detach(ifp);
 1863 
 1864         mb86960_disable(sc);
 1865         return (0);
 1866 }
 1867 
 1868 /*
 1869  * Routines to read all bytes from the config EEPROM (93C06) through MB86965A.
 1870  */
 1871 void
 1872 mb86965_read_eeprom(bus_space_tag_t iot, bus_space_handle_t ioh, uint8_t *data)
 1873 {
 1874         int addr, op, bit;
 1875         uint16_t val;
 1876 
 1877         /* Read bytes from EEPROM; two bytes per an iteration. */
 1878         for (addr = 0; addr < FE_EEPROM_SIZE / 2; addr++) {
 1879                 /* Reset the EEPROM interface. */
 1880                 bus_space_write_1(iot, ioh, FE_BMPR16, 0x00);
 1881                 bus_space_write_1(iot, ioh, FE_BMPR17, 0x00);
 1882                 bus_space_write_1(iot, ioh, FE_BMPR16, FE_B16_SELECT);
 1883 
 1884                 /* Send start bit. */
 1885                 bus_space_write_1(iot, ioh, FE_BMPR17, FE_B17_DATA);
 1886                 FE_EEPROM_DELAY();
 1887                 bus_space_write_1(iot, ioh,
 1888                     FE_BMPR16, FE_B16_SELECT | FE_B16_CLOCK);
 1889                 FE_EEPROM_DELAY();
 1890                 bus_space_write_1(iot, ioh, FE_BMPR16, FE_B16_SELECT);
 1891 
 1892                 /* Send read command and read address. */
 1893                 op = 0x80 | addr;       /* READ instruction */
 1894                 for (bit = 8; bit > 0; bit--) {
 1895                         bus_space_write_1(iot, ioh, FE_BMPR17,
 1896                             (op & (1 << (bit - 1))) ? FE_B17_DATA : 0);
 1897                         FE_EEPROM_DELAY();
 1898                         bus_space_write_1(iot, ioh,
 1899                             FE_BMPR16, FE_B16_SELECT | FE_B16_CLOCK);
 1900                         FE_EEPROM_DELAY();
 1901                         bus_space_write_1(iot, ioh, FE_BMPR16, FE_B16_SELECT);
 1902                 }
 1903                 bus_space_write_1(iot, ioh, FE_BMPR17, 0x00);
 1904 
 1905                 /* Read two bytes in each address */
 1906                 val = 0;
 1907                 for (bit = 16; bit > 0; bit--) {
 1908                         FE_EEPROM_DELAY();
 1909                         bus_space_write_1(iot, ioh,
 1910                             FE_BMPR16, FE_B16_SELECT | FE_B16_CLOCK);
 1911                         FE_EEPROM_DELAY();
 1912                         if (bus_space_read_1(iot, ioh, FE_BMPR17) &
 1913                             FE_B17_DATA)
 1914                                 val |= 1 << (bit - 1);
 1915                         bus_space_write_1(iot, ioh,
 1916                             FE_BMPR16, FE_B16_SELECT);
 1917                 }
 1918                 data[addr * 2]     = val >> 8;
 1919                 data[addr * 2 + 1] = val & 0xff;
 1920         }
 1921 
 1922         /* Make sure the EEPROM is turned off. */
 1923         bus_space_write_1(iot, ioh, FE_BMPR16, 0);
 1924         bus_space_write_1(iot, ioh, FE_BMPR17, 0);
 1925 
 1926 #if FE_DEBUG >= 3
 1927         /* Report what we got. */
 1928         log(LOG_INFO, "mb86965_read_eeprom: "
 1929             " %02x%02x%02x%02x %02x%02x%02x%02x -"
 1930             " %02x%02x%02x%02x %02x%02x%02x%02x -"
 1931             " %02x%02x%02x%02x %02x%02x%02x%02x -"
 1932             " %02x%02x%02x%02x %02x%02x%02x%02x\n",
 1933             data[ 0], data[ 1], data[ 2], data[ 3],
 1934             data[ 4], data[ 5], data[ 6], data[ 7],
 1935             data[ 8], data[ 9], data[10], data[11],
 1936             data[12], data[13], data[14], data[15],
 1937             data[16], data[17], data[18], data[19],
 1938             data[20], data[21], data[22], data[23],
 1939             data[24], data[25], data[26], data[27],
 1940             data[28], data[29], data[30], data[31]);
 1941 #endif
 1942 }
 1943 
 1944 #if FE_DEBUG >= 1
 1945 void
 1946 mb86960_dump(int level, struct mb86960_softc *sc)
 1947 {
 1948         bus_space_tag_t bst = sc->sc_bst;
 1949         bus_space_handle_t bsh = sc->sc_bsh;
 1950         uint8_t save_dlcr7;
 1951 
 1952         save_dlcr7 = bus_space_read_1(bst, bsh, FE_DLCR7);
 1953 
 1954         log(level, "\tDLCR = %02x %02x %02x %02x %02x %02x %02x %02x\n",
 1955             bus_space_read_1(bst, bsh, FE_DLCR0),
 1956             bus_space_read_1(bst, bsh, FE_DLCR1),
 1957             bus_space_read_1(bst, bsh, FE_DLCR2),
 1958             bus_space_read_1(bst, bsh, FE_DLCR3),
 1959             bus_space_read_1(bst, bsh, FE_DLCR4),
 1960             bus_space_read_1(bst, bsh, FE_DLCR5),
 1961             bus_space_read_1(bst, bsh, FE_DLCR6),
 1962             bus_space_read_1(bst, bsh, FE_DLCR7));
 1963 
 1964         bus_space_write_1(bst, bsh, FE_DLCR7,
 1965             (save_dlcr7 & ~FE_D7_RBS) | FE_D7_RBS_DLCR);
 1966         log(level, "\t       %02x %02x %02x %02x %02x %02x %02x %02x\n",
 1967             bus_space_read_1(bst, bsh, FE_DLCR8),
 1968             bus_space_read_1(bst, bsh, FE_DLCR9),
 1969             bus_space_read_1(bst, bsh, FE_DLCR10),
 1970             bus_space_read_1(bst, bsh, FE_DLCR11),
 1971             bus_space_read_1(bst, bsh, FE_DLCR12),
 1972             bus_space_read_1(bst, bsh, FE_DLCR13),
 1973             bus_space_read_1(bst, bsh, FE_DLCR14),
 1974             bus_space_read_1(bst, bsh, FE_DLCR15));
 1975 
 1976         bus_space_write_1(bst, bsh, FE_DLCR7,
 1977             (save_dlcr7 & ~FE_D7_RBS) | FE_D7_RBS_MAR);
 1978         log(level, "\tMAR  = %02x %02x %02x %02x %02x %02x %02x %02x\n",
 1979             bus_space_read_1(bst, bsh, FE_MAR8),
 1980             bus_space_read_1(bst, bsh, FE_MAR9),
 1981             bus_space_read_1(bst, bsh, FE_MAR10),
 1982             bus_space_read_1(bst, bsh, FE_MAR11),
 1983             bus_space_read_1(bst, bsh, FE_MAR12),
 1984             bus_space_read_1(bst, bsh, FE_MAR13),
 1985             bus_space_read_1(bst, bsh, FE_MAR14),
 1986             bus_space_read_1(bst, bsh, FE_MAR15));
 1987 
 1988         bus_space_write_1(bst, bsh, FE_DLCR7,
 1989             (save_dlcr7 & ~FE_D7_RBS) | FE_D7_RBS_BMPR);
 1990         log(level,
 1991             "\tBMPR = xx xx %02x %02x %02x %02x %02x %02x %02x %02x xx %02x\n",
 1992             bus_space_read_1(bst, bsh, FE_BMPR10),
 1993             bus_space_read_1(bst, bsh, FE_BMPR11),
 1994             bus_space_read_1(bst, bsh, FE_BMPR12),
 1995             bus_space_read_1(bst, bsh, FE_BMPR13),
 1996             bus_space_read_1(bst, bsh, FE_BMPR14),
 1997             bus_space_read_1(bst, bsh, FE_BMPR15),
 1998             bus_space_read_1(bst, bsh, FE_BMPR16),
 1999             bus_space_read_1(bst, bsh, FE_BMPR17),
 2000             bus_space_read_1(bst, bsh, FE_BMPR19));
 2001 
 2002         bus_space_write_1(bst, bsh, FE_DLCR7, save_dlcr7);
 2003 }
 2004 #endif
 2005 

Cache object: 184ef20aa071c5160abbf65edc180088


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.