- Use ether_input_chain on RX path
[dragonfly.git] / sys / dev / netif / jme / if_jme.c
1 /*-
2  * Copyright (c) 2008, Pyun YongHyeon <yongari@FreeBSD.org>
3  * 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
9  *    notice unmodified, this list of conditions, and the following
10  *    disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  *
27  * $FreeBSD: src/sys/dev/jme/if_jme.c,v 1.2 2008/07/18 04:20:48 yongari Exp $
28  * $DragonFly: src/sys/dev/netif/jme/if_jme.c,v 1.12 2008/11/26 11:55:18 sephe Exp $
29  */
30
31 #include "opt_polling.h"
32
33 #include <sys/param.h>
34 #include <sys/endian.h>
35 #include <sys/kernel.h>
36 #include <sys/bus.h>
37 #include <sys/interrupt.h>
38 #include <sys/malloc.h>
39 #include <sys/proc.h>
40 #include <sys/rman.h>
41 #include <sys/serialize.h>
42 #include <sys/socket.h>
43 #include <sys/sockio.h>
44 #include <sys/sysctl.h>
45
46 #include <net/ethernet.h>
47 #include <net/if.h>
48 #include <net/bpf.h>
49 #include <net/if_arp.h>
50 #include <net/if_dl.h>
51 #include <net/if_media.h>
52 #include <net/ifq_var.h>
53 #include <net/vlan/if_vlan_var.h>
54 #include <net/vlan/if_vlan_ether.h>
55
56 #include <dev/netif/mii_layer/miivar.h>
57 #include <dev/netif/mii_layer/jmphyreg.h>
58
59 #include <bus/pci/pcireg.h>
60 #include <bus/pci/pcivar.h>
61 #include <bus/pci/pcidevs.h>
62
63 #include <dev/netif/jme/if_jmereg.h>
64 #include <dev/netif/jme/if_jmevar.h>
65
66 #include "miibus_if.h"
67
68 /* Define the following to disable printing Rx errors. */
69 #undef  JME_SHOW_ERRORS
70
71 #define JME_CSUM_FEATURES       (CSUM_IP | CSUM_TCP | CSUM_UDP)
72
73 static int      jme_probe(device_t);
74 static int      jme_attach(device_t);
75 static int      jme_detach(device_t);
76 static int      jme_shutdown(device_t);
77 static int      jme_suspend(device_t);
78 static int      jme_resume(device_t);
79
80 static int      jme_miibus_readreg(device_t, int, int);
81 static int      jme_miibus_writereg(device_t, int, int, int);
82 static void     jme_miibus_statchg(device_t);
83
84 static void     jme_init(void *);
85 static int      jme_ioctl(struct ifnet *, u_long, caddr_t, struct ucred *);
86 static void     jme_start(struct ifnet *);
87 static void     jme_watchdog(struct ifnet *);
88 static void     jme_mediastatus(struct ifnet *, struct ifmediareq *);
89 static int      jme_mediachange(struct ifnet *);
90 #ifdef DEVICE_POLLING
91 static void     jme_poll(struct ifnet *, enum poll_cmd, int);
92 #endif
93
94 static void     jme_intr(void *);
95 static void     jme_txeof(struct jme_softc *);
96 static void     jme_rxeof(struct jme_softc *, int);
97
98 static int      jme_dma_alloc(struct jme_softc *);
99 static void     jme_dma_free(struct jme_softc *, int);
100 static void     jme_dmamap_ring_cb(void *, bus_dma_segment_t *, int, int);
101 static void     jme_dmamap_buf_cb(void *, bus_dma_segment_t *, int,
102                                   bus_size_t, int);
103 static int      jme_init_rx_ring(struct jme_softc *);
104 static void     jme_init_tx_ring(struct jme_softc *);
105 static void     jme_init_ssb(struct jme_softc *);
106 static int      jme_newbuf(struct jme_softc *, struct jme_rxdesc *, int);
107 static int      jme_encap(struct jme_softc *, struct mbuf **);
108 static void     jme_rxpkt(struct jme_softc *, struct mbuf_chain *);
109
110 static void     jme_tick(void *);
111 static void     jme_stop(struct jme_softc *);
112 static void     jme_reset(struct jme_softc *);
113 static void     jme_set_vlan(struct jme_softc *);
114 static void     jme_set_filter(struct jme_softc *);
115 static void     jme_stop_tx(struct jme_softc *);
116 static void     jme_stop_rx(struct jme_softc *);
117 static void     jme_mac_config(struct jme_softc *);
118 static void     jme_reg_macaddr(struct jme_softc *, uint8_t[]);
119 static int      jme_eeprom_macaddr(struct jme_softc *, uint8_t[]);
120 static int      jme_eeprom_read_byte(struct jme_softc *, uint8_t, uint8_t *);
121 #ifdef notyet
122 static void     jme_setwol(struct jme_softc *);
123 static void     jme_setlinkspeed(struct jme_softc *);
124 #endif
125 static void     jme_set_tx_coal(struct jme_softc *);
126 static void     jme_set_rx_coal(struct jme_softc *);
127
128 static void     jme_sysctl_node(struct jme_softc *);
129 static int      jme_sysctl_tx_coal_to(SYSCTL_HANDLER_ARGS);
130 static int      jme_sysctl_tx_coal_pkt(SYSCTL_HANDLER_ARGS);
131 static int      jme_sysctl_rx_coal_to(SYSCTL_HANDLER_ARGS);
132 static int      jme_sysctl_rx_coal_pkt(SYSCTL_HANDLER_ARGS);
133
134 /*
135  * Devices supported by this driver.
136  */
137 static const struct jme_dev {
138         uint16_t        jme_vendorid;
139         uint16_t        jme_deviceid;
140         uint32_t        jme_caps;
141         const char      *jme_name;
142 } jme_devs[] = {
143         { PCI_VENDOR_JMICRON, PCI_PRODUCT_JMICRON_JMC250,
144             JME_CAP_JUMBO,
145             "JMicron Inc, JMC250 Gigabit Ethernet" },
146         { PCI_VENDOR_JMICRON, PCI_PRODUCT_JMICRON_JMC260,
147             JME_CAP_FASTETH,
148             "JMicron Inc, JMC260 Fast Ethernet" },
149         { 0, 0, 0, NULL }
150 };
151
152 static device_method_t jme_methods[] = {
153         /* Device interface. */
154         DEVMETHOD(device_probe,         jme_probe),
155         DEVMETHOD(device_attach,        jme_attach),
156         DEVMETHOD(device_detach,        jme_detach),
157         DEVMETHOD(device_shutdown,      jme_shutdown),
158         DEVMETHOD(device_suspend,       jme_suspend),
159         DEVMETHOD(device_resume,        jme_resume),
160
161         /* Bus interface. */
162         DEVMETHOD(bus_print_child,      bus_generic_print_child),
163         DEVMETHOD(bus_driver_added,     bus_generic_driver_added),
164
165         /* MII interface. */
166         DEVMETHOD(miibus_readreg,       jme_miibus_readreg),
167         DEVMETHOD(miibus_writereg,      jme_miibus_writereg),
168         DEVMETHOD(miibus_statchg,       jme_miibus_statchg),
169
170         { NULL, NULL }
171 };
172
173 static driver_t jme_driver = {
174         "jme",
175         jme_methods,
176         sizeof(struct jme_softc)
177 };
178
179 static devclass_t jme_devclass;
180
181 DECLARE_DUMMY_MODULE(if_jme);
182 MODULE_DEPEND(if_jme, miibus, 1, 1, 1);
183 DRIVER_MODULE(if_jme, pci, jme_driver, jme_devclass, 0, 0);
184 DRIVER_MODULE(miibus, jme, miibus_driver, miibus_devclass, 0, 0);
185
186 static int      jme_rx_desc_count = JME_RX_DESC_CNT_DEF;
187 static int      jme_tx_desc_count = JME_TX_DESC_CNT_DEF;
188
189 TUNABLE_INT("hw.jme.rx_desc_count", &jme_rx_desc_count);
190 TUNABLE_INT("hw.jme.tx_desc_count", &jme_tx_desc_count);
191
192 /*
193  *      Read a PHY register on the MII of the JMC250.
194  */
195 static int
196 jme_miibus_readreg(device_t dev, int phy, int reg)
197 {
198         struct jme_softc *sc = device_get_softc(dev);
199         uint32_t val;
200         int i;
201
202         /* For FPGA version, PHY address 0 should be ignored. */
203         if (sc->jme_caps & JME_CAP_FPGA) {
204                 if (phy == 0)
205                         return (0);
206         } else {
207                 if (sc->jme_phyaddr != phy)
208                         return (0);
209         }
210
211         CSR_WRITE_4(sc, JME_SMI, SMI_OP_READ | SMI_OP_EXECUTE |
212             SMI_PHY_ADDR(phy) | SMI_REG_ADDR(reg));
213
214         for (i = JME_PHY_TIMEOUT; i > 0; i--) {
215                 DELAY(1);
216                 if (((val = CSR_READ_4(sc, JME_SMI)) & SMI_OP_EXECUTE) == 0)
217                         break;
218         }
219         if (i == 0) {
220                 device_printf(sc->jme_dev, "phy read timeout: "
221                               "phy %d, reg %d\n", phy, reg);
222                 return (0);
223         }
224
225         return ((val & SMI_DATA_MASK) >> SMI_DATA_SHIFT);
226 }
227
228 /*
229  *      Write a PHY register on the MII of the JMC250.
230  */
231 static int
232 jme_miibus_writereg(device_t dev, int phy, int reg, int val)
233 {
234         struct jme_softc *sc = device_get_softc(dev);
235         int i;
236
237         /* For FPGA version, PHY address 0 should be ignored. */
238         if (sc->jme_caps & JME_CAP_FPGA) {
239                 if (phy == 0)
240                         return (0);
241         } else {
242                 if (sc->jme_phyaddr != phy)
243                         return (0);
244         }
245
246         CSR_WRITE_4(sc, JME_SMI, SMI_OP_WRITE | SMI_OP_EXECUTE |
247             ((val << SMI_DATA_SHIFT) & SMI_DATA_MASK) |
248             SMI_PHY_ADDR(phy) | SMI_REG_ADDR(reg));
249
250         for (i = JME_PHY_TIMEOUT; i > 0; i--) {
251                 DELAY(1);
252                 if (((val = CSR_READ_4(sc, JME_SMI)) & SMI_OP_EXECUTE) == 0)
253                         break;
254         }
255         if (i == 0) {
256                 device_printf(sc->jme_dev, "phy write timeout: "
257                               "phy %d, reg %d\n", phy, reg);
258         }
259
260         return (0);
261 }
262
263 /*
264  *      Callback from MII layer when media changes.
265  */
266 static void
267 jme_miibus_statchg(device_t dev)
268 {
269         struct jme_softc *sc = device_get_softc(dev);
270         struct ifnet *ifp = &sc->arpcom.ac_if;
271         struct mii_data *mii;
272         struct jme_txdesc *txd;
273         bus_addr_t paddr;
274         int i;
275
276         ASSERT_SERIALIZED(ifp->if_serializer);
277
278         if ((ifp->if_flags & IFF_RUNNING) == 0)
279                 return;
280
281         mii = device_get_softc(sc->jme_miibus);
282
283         sc->jme_flags &= ~JME_FLAG_LINK;
284         if ((mii->mii_media_status & IFM_AVALID) != 0) {
285                 switch (IFM_SUBTYPE(mii->mii_media_active)) {
286                 case IFM_10_T:
287                 case IFM_100_TX:
288                         sc->jme_flags |= JME_FLAG_LINK;
289                         break;
290                 case IFM_1000_T:
291                         if (sc->jme_caps & JME_CAP_FASTETH)
292                                 break;
293                         sc->jme_flags |= JME_FLAG_LINK;
294                         break;
295                 default:
296                         break;
297                 }
298         }
299
300         /*
301          * Disabling Rx/Tx MACs have a side-effect of resetting
302          * JME_TXNDA/JME_RXNDA register to the first address of
303          * Tx/Rx descriptor address. So driver should reset its
304          * internal procucer/consumer pointer and reclaim any
305          * allocated resources.  Note, just saving the value of
306          * JME_TXNDA and JME_RXNDA registers before stopping MAC
307          * and restoring JME_TXNDA/JME_RXNDA register is not
308          * sufficient to make sure correct MAC state because
309          * stopping MAC operation can take a while and hardware
310          * might have updated JME_TXNDA/JME_RXNDA registers
311          * during the stop operation.
312          */
313
314         /* Disable interrupts */
315         CSR_WRITE_4(sc, JME_INTR_MASK_CLR, JME_INTRS);
316
317         /* Stop driver */
318         ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
319         ifp->if_timer = 0;
320         callout_stop(&sc->jme_tick_ch);
321
322         /* Stop receiver/transmitter. */
323         jme_stop_rx(sc);
324         jme_stop_tx(sc);
325
326         jme_rxeof(sc, -1);
327         if (sc->jme_cdata.jme_rxhead != NULL)
328                 m_freem(sc->jme_cdata.jme_rxhead);
329         JME_RXCHAIN_RESET(sc);
330
331         jme_txeof(sc);
332         if (sc->jme_cdata.jme_tx_cnt != 0) {
333                 /* Remove queued packets for transmit. */
334                 for (i = 0; i < sc->jme_tx_desc_cnt; i++) {
335                         txd = &sc->jme_cdata.jme_txdesc[i];
336                         if (txd->tx_m != NULL) {
337                                 bus_dmamap_unload(
338                                     sc->jme_cdata.jme_tx_tag,
339                                     txd->tx_dmamap);
340                                 m_freem(txd->tx_m);
341                                 txd->tx_m = NULL;
342                                 txd->tx_ndesc = 0;
343                                 ifp->if_oerrors++;
344                         }
345                 }
346         }
347
348         /*
349          * Reuse configured Rx descriptors and reset
350          * procuder/consumer index.
351          */
352         sc->jme_cdata.jme_rx_cons = 0;
353
354         jme_init_tx_ring(sc);
355
356         /* Initialize shadow status block. */
357         jme_init_ssb(sc);
358
359         /* Program MAC with resolved speed/duplex/flow-control. */
360         if (sc->jme_flags & JME_FLAG_LINK) {
361                 jme_mac_config(sc);
362
363                 CSR_WRITE_4(sc, JME_RXCSR, sc->jme_rxcsr);
364                 CSR_WRITE_4(sc, JME_TXCSR, sc->jme_txcsr);
365
366                 /* Set Tx ring address to the hardware. */
367                 paddr = sc->jme_cdata.jme_tx_ring_paddr;
368                 CSR_WRITE_4(sc, JME_TXDBA_HI, JME_ADDR_HI(paddr));
369                 CSR_WRITE_4(sc, JME_TXDBA_LO, JME_ADDR_LO(paddr));
370
371                 /* Set Rx ring address to the hardware. */
372                 paddr = sc->jme_cdata.jme_rx_ring_paddr;
373                 CSR_WRITE_4(sc, JME_RXDBA_HI, JME_ADDR_HI(paddr));
374                 CSR_WRITE_4(sc, JME_RXDBA_LO, JME_ADDR_LO(paddr));
375
376                 /* Restart receiver/transmitter. */
377                 CSR_WRITE_4(sc, JME_RXCSR, sc->jme_rxcsr | RXCSR_RX_ENB |
378                     RXCSR_RXQ_START);
379                 CSR_WRITE_4(sc, JME_TXCSR, sc->jme_txcsr | TXCSR_TX_ENB);
380         }
381
382         ifp->if_flags |= IFF_RUNNING;
383         ifp->if_flags &= ~IFF_OACTIVE;
384         callout_reset(&sc->jme_tick_ch, hz, jme_tick, sc);
385
386 #ifdef DEVICE_POLLING
387         if (!(ifp->if_flags & IFF_POLLING))
388 #endif
389         /* Reenable interrupts. */
390         CSR_WRITE_4(sc, JME_INTR_MASK_SET, JME_INTRS);
391 }
392
393 /*
394  *      Get the current interface media status.
395  */
396 static void
397 jme_mediastatus(struct ifnet *ifp, struct ifmediareq *ifmr)
398 {
399         struct jme_softc *sc = ifp->if_softc;
400         struct mii_data *mii = device_get_softc(sc->jme_miibus);
401
402         ASSERT_SERIALIZED(ifp->if_serializer);
403
404         mii_pollstat(mii);
405         ifmr->ifm_status = mii->mii_media_status;
406         ifmr->ifm_active = mii->mii_media_active;
407 }
408
409 /*
410  *      Set hardware to newly-selected media.
411  */
412 static int
413 jme_mediachange(struct ifnet *ifp)
414 {
415         struct jme_softc *sc = ifp->if_softc;
416         struct mii_data *mii = device_get_softc(sc->jme_miibus);
417         int error;
418
419         ASSERT_SERIALIZED(ifp->if_serializer);
420
421         if (mii->mii_instance != 0) {
422                 struct mii_softc *miisc;
423
424                 LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
425                         mii_phy_reset(miisc);
426         }
427         error = mii_mediachg(mii);
428
429         return (error);
430 }
431
432 static int
433 jme_probe(device_t dev)
434 {
435         const struct jme_dev *sp;
436         uint16_t vid, did;
437
438         vid = pci_get_vendor(dev);
439         did = pci_get_device(dev);
440         for (sp = jme_devs; sp->jme_name != NULL; ++sp) {
441                 if (vid == sp->jme_vendorid && did == sp->jme_deviceid) {
442                         struct jme_softc *sc = device_get_softc(dev);
443
444                         sc->jme_caps = sp->jme_caps;
445                         device_set_desc(dev, sp->jme_name);
446                         return (0);
447                 }
448         }
449         return (ENXIO);
450 }
451
452 static int
453 jme_eeprom_read_byte(struct jme_softc *sc, uint8_t addr, uint8_t *val)
454 {
455         uint32_t reg;
456         int i;
457
458         *val = 0;
459         for (i = JME_TIMEOUT; i > 0; i--) {
460                 reg = CSR_READ_4(sc, JME_SMBCSR);
461                 if ((reg & SMBCSR_HW_BUSY_MASK) == SMBCSR_HW_IDLE)
462                         break;
463                 DELAY(1);
464         }
465
466         if (i == 0) {
467                 device_printf(sc->jme_dev, "EEPROM idle timeout!\n");
468                 return (ETIMEDOUT);
469         }
470
471         reg = ((uint32_t)addr << SMBINTF_ADDR_SHIFT) & SMBINTF_ADDR_MASK;
472         CSR_WRITE_4(sc, JME_SMBINTF, reg | SMBINTF_RD | SMBINTF_CMD_TRIGGER);
473         for (i = JME_TIMEOUT; i > 0; i--) {
474                 DELAY(1);
475                 reg = CSR_READ_4(sc, JME_SMBINTF);
476                 if ((reg & SMBINTF_CMD_TRIGGER) == 0)
477                         break;
478         }
479
480         if (i == 0) {
481                 device_printf(sc->jme_dev, "EEPROM read timeout!\n");
482                 return (ETIMEDOUT);
483         }
484
485         reg = CSR_READ_4(sc, JME_SMBINTF);
486         *val = (reg & SMBINTF_RD_DATA_MASK) >> SMBINTF_RD_DATA_SHIFT;
487
488         return (0);
489 }
490
491 static int
492 jme_eeprom_macaddr(struct jme_softc *sc, uint8_t eaddr[])
493 {
494         uint8_t fup, reg, val;
495         uint32_t offset;
496         int match;
497
498         offset = 0;
499         if (jme_eeprom_read_byte(sc, offset++, &fup) != 0 ||
500             fup != JME_EEPROM_SIG0)
501                 return (ENOENT);
502         if (jme_eeprom_read_byte(sc, offset++, &fup) != 0 ||
503             fup != JME_EEPROM_SIG1)
504                 return (ENOENT);
505         match = 0;
506         do {
507                 if (jme_eeprom_read_byte(sc, offset, &fup) != 0)
508                         break;
509                 /* Check for the end of EEPROM descriptor. */
510                 if ((fup & JME_EEPROM_DESC_END) == JME_EEPROM_DESC_END)
511                         break;
512                 if ((uint8_t)JME_EEPROM_MKDESC(JME_EEPROM_FUNC0,
513                     JME_EEPROM_PAGE_BAR1) == fup) {
514                         if (jme_eeprom_read_byte(sc, offset + 1, &reg) != 0)
515                                 break;
516                         if (reg >= JME_PAR0 &&
517                             reg < JME_PAR0 + ETHER_ADDR_LEN) {
518                                 if (jme_eeprom_read_byte(sc, offset + 2,
519                                     &val) != 0)
520                                         break;
521                                 eaddr[reg - JME_PAR0] = val;
522                                 match++;
523                         }
524                 }
525                 /* Try next eeprom descriptor. */
526                 offset += JME_EEPROM_DESC_BYTES;
527         } while (match != ETHER_ADDR_LEN && offset < JME_EEPROM_END);
528
529         if (match == ETHER_ADDR_LEN)
530                 return (0);
531
532         return (ENOENT);
533 }
534
535 static void
536 jme_reg_macaddr(struct jme_softc *sc, uint8_t eaddr[])
537 {
538         uint32_t par0, par1;
539
540         /* Read station address. */
541         par0 = CSR_READ_4(sc, JME_PAR0);
542         par1 = CSR_READ_4(sc, JME_PAR1);
543         par1 &= 0xFFFF;
544         if ((par0 == 0 && par1 == 0) || (par0 & 0x1)) {
545                 device_printf(sc->jme_dev,
546                     "generating fake ethernet address.\n");
547                 par0 = karc4random();
548                 /* Set OUI to JMicron. */
549                 eaddr[0] = 0x00;
550                 eaddr[1] = 0x1B;
551                 eaddr[2] = 0x8C;
552                 eaddr[3] = (par0 >> 16) & 0xff;
553                 eaddr[4] = (par0 >> 8) & 0xff;
554                 eaddr[5] = par0 & 0xff;
555         } else {
556                 eaddr[0] = (par0 >> 0) & 0xFF;
557                 eaddr[1] = (par0 >> 8) & 0xFF;
558                 eaddr[2] = (par0 >> 16) & 0xFF;
559                 eaddr[3] = (par0 >> 24) & 0xFF;
560                 eaddr[4] = (par1 >> 0) & 0xFF;
561                 eaddr[5] = (par1 >> 8) & 0xFF;
562         }
563 }
564
565 static int
566 jme_attach(device_t dev)
567 {
568         struct jme_softc *sc = device_get_softc(dev);
569         struct ifnet *ifp = &sc->arpcom.ac_if;
570         uint32_t reg;
571         uint16_t did;
572         uint8_t pcie_ptr, rev;
573         int error = 0;
574         uint8_t eaddr[ETHER_ADDR_LEN];
575
576         sc->jme_rx_desc_cnt = roundup(jme_rx_desc_count, JME_NDESC_ALIGN);
577         if (sc->jme_rx_desc_cnt > JME_NDESC_MAX)
578                 sc->jme_rx_desc_cnt = JME_NDESC_MAX;
579
580         sc->jme_tx_desc_cnt = roundup(jme_tx_desc_count, JME_NDESC_ALIGN);
581         if (sc->jme_tx_desc_cnt > JME_NDESC_MAX)
582                 sc->jme_tx_desc_cnt = JME_NDESC_MAX;
583
584         sc->jme_dev = dev;
585         sc->jme_lowaddr = BUS_SPACE_MAXADDR;
586
587         if_initname(ifp, device_get_name(dev), device_get_unit(dev));
588
589         callout_init(&sc->jme_tick_ch);
590
591 #ifndef BURN_BRIDGES
592         if (pci_get_powerstate(dev) != PCI_POWERSTATE_D0) {
593                 uint32_t irq, mem;
594
595                 irq = pci_read_config(dev, PCIR_INTLINE, 4);
596                 mem = pci_read_config(dev, JME_PCIR_BAR, 4);
597
598                 device_printf(dev, "chip is in D%d power mode "
599                     "-- setting to D0\n", pci_get_powerstate(dev));
600
601                 pci_set_powerstate(dev, PCI_POWERSTATE_D0);
602
603                 pci_write_config(dev, PCIR_INTLINE, irq, 4);
604                 pci_write_config(dev, JME_PCIR_BAR, mem, 4);
605         }
606 #endif  /* !BURN_BRIDGE */
607
608         /* Enable bus mastering */
609         pci_enable_busmaster(dev);
610
611         /*
612          * Allocate IO memory
613          *
614          * JMC250 supports both memory mapped and I/O register space
615          * access.  Because I/O register access should use different
616          * BARs to access registers it's waste of time to use I/O
617          * register spce access.  JMC250 uses 16K to map entire memory
618          * space.
619          */
620         sc->jme_mem_rid = JME_PCIR_BAR;
621         sc->jme_mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
622                                                  &sc->jme_mem_rid, RF_ACTIVE);
623         if (sc->jme_mem_res == NULL) {
624                 device_printf(dev, "can't allocate IO memory\n");
625                 return ENXIO;
626         }
627         sc->jme_mem_bt = rman_get_bustag(sc->jme_mem_res);
628         sc->jme_mem_bh = rman_get_bushandle(sc->jme_mem_res);
629
630         /*
631          * Allocate IRQ
632          */
633         sc->jme_irq_rid = 0;
634         sc->jme_irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ,
635                                                  &sc->jme_irq_rid,
636                                                  RF_SHAREABLE | RF_ACTIVE);
637         if (sc->jme_irq_res == NULL) {
638                 device_printf(dev, "can't allocate irq\n");
639                 error = ENXIO;
640                 goto fail;
641         }
642
643         /*
644          * Extract revisions
645          */
646         reg = CSR_READ_4(sc, JME_CHIPMODE);
647         if (((reg & CHIPMODE_FPGA_REV_MASK) >> CHIPMODE_FPGA_REV_SHIFT) !=
648             CHIPMODE_NOT_FPGA) {
649                 sc->jme_caps |= JME_CAP_FPGA;
650                 if (bootverbose) {
651                         device_printf(dev, "FPGA revision: 0x%04x\n",
652                                       (reg & CHIPMODE_FPGA_REV_MASK) >>
653                                       CHIPMODE_FPGA_REV_SHIFT);
654                 }
655         }
656
657         /* NOTE: FM revision is put in the upper 4 bits */
658         rev = ((reg & CHIPMODE_REVFM_MASK) >> CHIPMODE_REVFM_SHIFT) << 4;
659         rev |= (reg & CHIPMODE_REVECO_MASK) >> CHIPMODE_REVECO_SHIFT;
660         if (bootverbose)
661                 device_printf(dev, "Revision (FM/ECO): 0x%02x\n", rev);
662
663         did = pci_get_device(dev);
664         switch (did) {
665         case PCI_PRODUCT_JMICRON_JMC250:
666                 if (rev == JME_REV1_A2)
667                         sc->jme_workaround |= JME_WA_EXTFIFO | JME_WA_HDX;
668                 break;
669
670         case PCI_PRODUCT_JMICRON_JMC260:
671                 if (rev == JME_REV2)
672                         sc->jme_lowaddr = BUS_SPACE_MAXADDR_32BIT;
673                 break;
674
675         default:
676                 panic("unknown device id 0x%04x\n", did);
677         }
678         if (rev >= JME_REV2) {
679                 sc->jme_clksrc = GHC_TXOFL_CLKSRC | GHC_TXMAC_CLKSRC;
680                 sc->jme_clksrc_1000 = GHC_TXOFL_CLKSRC_1000 |
681                                       GHC_TXMAC_CLKSRC_1000;
682         }
683
684         /* Reset the ethernet controller. */
685         jme_reset(sc);
686
687         /* Get station address. */
688         reg = CSR_READ_4(sc, JME_SMBCSR);
689         if (reg & SMBCSR_EEPROM_PRESENT)
690                 error = jme_eeprom_macaddr(sc, eaddr);
691         if (error != 0 || (reg & SMBCSR_EEPROM_PRESENT) == 0) {
692                 if (error != 0 && (bootverbose)) {
693                         device_printf(dev, "ethernet hardware address "
694                                       "not found in EEPROM.\n");
695                 }
696                 jme_reg_macaddr(sc, eaddr);
697         }
698
699         /*
700          * Save PHY address.
701          * Integrated JR0211 has fixed PHY address whereas FPGA version
702          * requires PHY probing to get correct PHY address.
703          */
704         if ((sc->jme_caps & JME_CAP_FPGA) == 0) {
705                 sc->jme_phyaddr = CSR_READ_4(sc, JME_GPREG0) &
706                     GPREG0_PHY_ADDR_MASK;
707                 if (bootverbose) {
708                         device_printf(dev, "PHY is at address %d.\n",
709                             sc->jme_phyaddr);
710                 }
711         } else {
712                 sc->jme_phyaddr = 0;
713         }
714
715         /* Set max allowable DMA size. */
716         pcie_ptr = pci_get_pciecap_ptr(dev);
717         if (pcie_ptr != 0) {
718                 uint16_t ctrl;
719
720                 sc->jme_caps |= JME_CAP_PCIE;
721                 ctrl = pci_read_config(dev, pcie_ptr + PCIER_DEVCTRL, 2);
722                 if (bootverbose) {
723                         device_printf(dev, "Read request size : %d bytes.\n",
724                             128 << ((ctrl >> 12) & 0x07));
725                         device_printf(dev, "TLP payload size : %d bytes.\n",
726                             128 << ((ctrl >> 5) & 0x07));
727                 }
728                 switch (ctrl & PCIEM_DEVCTL_MAX_READRQ_MASK) {
729                 case PCIEM_DEVCTL_MAX_READRQ_128:
730                         sc->jme_tx_dma_size = TXCSR_DMA_SIZE_128;
731                         break;
732                 case PCIEM_DEVCTL_MAX_READRQ_256:
733                         sc->jme_tx_dma_size = TXCSR_DMA_SIZE_256;
734                         break;
735                 default:
736                         sc->jme_tx_dma_size = TXCSR_DMA_SIZE_512;
737                         break;
738                 }
739                 sc->jme_rx_dma_size = RXCSR_DMA_SIZE_128;
740         } else {
741                 sc->jme_tx_dma_size = TXCSR_DMA_SIZE_512;
742                 sc->jme_rx_dma_size = RXCSR_DMA_SIZE_128;
743         }
744
745 #ifdef notyet
746         if (pci_find_extcap(dev, PCIY_PMG, &pmc) == 0)
747                 sc->jme_caps |= JME_CAP_PMCAP;
748 #endif
749
750         /*
751          * Create sysctl tree
752          */
753         jme_sysctl_node(sc);
754
755         /* Allocate DMA stuffs */
756         error = jme_dma_alloc(sc);
757         if (error)
758                 goto fail;
759
760         ifp->if_softc = sc;
761         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
762         ifp->if_init = jme_init;
763         ifp->if_ioctl = jme_ioctl;
764         ifp->if_start = jme_start;
765 #ifdef DEVICE_POLLING
766         ifp->if_poll = jme_poll;
767 #endif
768         ifp->if_watchdog = jme_watchdog;
769         ifq_set_maxlen(&ifp->if_snd, sc->jme_tx_desc_cnt - JME_TXD_RSVD);
770         ifq_set_ready(&ifp->if_snd);
771
772         /* JMC250 supports Tx/Rx checksum offload and hardware vlan tagging. */
773         ifp->if_capabilities = IFCAP_HWCSUM |
774                                IFCAP_VLAN_MTU |
775                                IFCAP_VLAN_HWTAGGING;
776         ifp->if_hwassist = JME_CSUM_FEATURES;
777         ifp->if_capenable = ifp->if_capabilities;
778
779         /* Set up MII bus. */
780         error = mii_phy_probe(dev, &sc->jme_miibus,
781                               jme_mediachange, jme_mediastatus);
782         if (error) {
783                 device_printf(dev, "no PHY found!\n");
784                 goto fail;
785         }
786
787         /*
788          * Save PHYADDR for FPGA mode PHY.
789          */
790         if (sc->jme_caps & JME_CAP_FPGA) {
791                 struct mii_data *mii = device_get_softc(sc->jme_miibus);
792
793                 if (mii->mii_instance != 0) {
794                         struct mii_softc *miisc;
795
796                         LIST_FOREACH(miisc, &mii->mii_phys, mii_list) {
797                                 if (miisc->mii_phy != 0) {
798                                         sc->jme_phyaddr = miisc->mii_phy;
799                                         break;
800                                 }
801                         }
802                         if (sc->jme_phyaddr != 0) {
803                                 device_printf(sc->jme_dev,
804                                     "FPGA PHY is at %d\n", sc->jme_phyaddr);
805                                 /* vendor magic. */
806                                 jme_miibus_writereg(dev, sc->jme_phyaddr,
807                                     JMPHY_CONF, JMPHY_CONF_DEFFIFO);
808
809                                 /* XXX should we clear JME_WA_EXTFIFO */
810                         }
811                 }
812         }
813
814         ether_ifattach(ifp, eaddr, NULL);
815
816         /* Tell the upper layer(s) we support long frames. */
817         ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
818
819         error = bus_setup_intr(dev, sc->jme_irq_res, INTR_MPSAFE, jme_intr, sc,
820                                &sc->jme_irq_handle, ifp->if_serializer);
821         if (error) {
822                 device_printf(dev, "could not set up interrupt handler.\n");
823                 ether_ifdetach(ifp);
824                 goto fail;
825         }
826
827         ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->jme_irq_res));
828         KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
829         return 0;
830 fail:
831         jme_detach(dev);
832         return (error);
833 }
834
835 static int
836 jme_detach(device_t dev)
837 {
838         struct jme_softc *sc = device_get_softc(dev);
839
840         if (device_is_attached(dev)) {
841                 struct ifnet *ifp = &sc->arpcom.ac_if;
842
843                 lwkt_serialize_enter(ifp->if_serializer);
844                 jme_stop(sc);
845                 bus_teardown_intr(dev, sc->jme_irq_res, sc->jme_irq_handle);
846                 lwkt_serialize_exit(ifp->if_serializer);
847
848                 ether_ifdetach(ifp);
849         }
850
851         if (sc->jme_sysctl_tree != NULL)
852                 sysctl_ctx_free(&sc->jme_sysctl_ctx);
853
854         if (sc->jme_miibus != NULL)
855                 device_delete_child(dev, sc->jme_miibus);
856         bus_generic_detach(dev);
857
858         if (sc->jme_irq_res != NULL) {
859                 bus_release_resource(dev, SYS_RES_IRQ, sc->jme_irq_rid,
860                                      sc->jme_irq_res);
861         }
862
863         if (sc->jme_mem_res != NULL) {
864                 bus_release_resource(dev, SYS_RES_MEMORY, sc->jme_mem_rid,
865                                      sc->jme_mem_res);
866         }
867
868         jme_dma_free(sc, 1);
869
870         return (0);
871 }
872
873 static void
874 jme_sysctl_node(struct jme_softc *sc)
875 {
876         int coal_max;
877
878         sysctl_ctx_init(&sc->jme_sysctl_ctx);
879         sc->jme_sysctl_tree = SYSCTL_ADD_NODE(&sc->jme_sysctl_ctx,
880                                 SYSCTL_STATIC_CHILDREN(_hw), OID_AUTO,
881                                 device_get_nameunit(sc->jme_dev),
882                                 CTLFLAG_RD, 0, "");
883         if (sc->jme_sysctl_tree == NULL) {
884                 device_printf(sc->jme_dev, "can't add sysctl node\n");
885                 return;
886         }
887
888         SYSCTL_ADD_PROC(&sc->jme_sysctl_ctx,
889             SYSCTL_CHILDREN(sc->jme_sysctl_tree), OID_AUTO,
890             "tx_coal_to", CTLTYPE_INT | CTLFLAG_RW,
891             sc, 0, jme_sysctl_tx_coal_to, "I", "jme tx coalescing timeout");
892
893         SYSCTL_ADD_PROC(&sc->jme_sysctl_ctx,
894             SYSCTL_CHILDREN(sc->jme_sysctl_tree), OID_AUTO,
895             "tx_coal_pkt", CTLTYPE_INT | CTLFLAG_RW,
896             sc, 0, jme_sysctl_tx_coal_pkt, "I", "jme tx coalescing packet");
897
898         SYSCTL_ADD_PROC(&sc->jme_sysctl_ctx,
899             SYSCTL_CHILDREN(sc->jme_sysctl_tree), OID_AUTO,
900             "rx_coal_to", CTLTYPE_INT | CTLFLAG_RW,
901             sc, 0, jme_sysctl_rx_coal_to, "I", "jme rx coalescing timeout");
902
903         SYSCTL_ADD_PROC(&sc->jme_sysctl_ctx,
904             SYSCTL_CHILDREN(sc->jme_sysctl_tree), OID_AUTO,
905             "rx_coal_pkt", CTLTYPE_INT | CTLFLAG_RW,
906             sc, 0, jme_sysctl_rx_coal_pkt, "I", "jme rx coalescing packet");
907
908         SYSCTL_ADD_INT(&sc->jme_sysctl_ctx,
909                        SYSCTL_CHILDREN(sc->jme_sysctl_tree), OID_AUTO,
910                        "rx_desc_count", CTLFLAG_RD, &sc->jme_rx_desc_cnt,
911                        0, "RX desc count");
912         SYSCTL_ADD_INT(&sc->jme_sysctl_ctx,
913                        SYSCTL_CHILDREN(sc->jme_sysctl_tree), OID_AUTO,
914                        "tx_desc_count", CTLFLAG_RD, &sc->jme_tx_desc_cnt,
915                        0, "TX desc count");
916
917         /*
918          * Set default coalesce valves
919          */
920         sc->jme_tx_coal_to = PCCTX_COAL_TO_DEFAULT;
921         sc->jme_tx_coal_pkt = PCCTX_COAL_PKT_DEFAULT;
922         sc->jme_rx_coal_to = PCCRX_COAL_TO_DEFAULT;
923         sc->jme_rx_coal_pkt = PCCRX_COAL_PKT_DEFAULT;
924
925         /*
926          * Adjust coalesce valves, in case that the number of TX/RX
927          * descs are set to small values by users.
928          *
929          * NOTE: coal_max will not be zero, since number of descs
930          * must aligned by JME_NDESC_ALIGN (16 currently)
931          */
932         coal_max = sc->jme_tx_desc_cnt / 6;
933         if (coal_max < sc->jme_tx_coal_pkt)
934                 sc->jme_tx_coal_pkt = coal_max;
935
936         coal_max = sc->jme_rx_desc_cnt / 4;
937         if (coal_max < sc->jme_rx_coal_pkt)
938                 sc->jme_rx_coal_pkt = coal_max;
939 }
940
941 static void
942 jme_dmamap_ring_cb(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
943 {
944         if (error)
945                 return;
946
947         KASSERT(nsegs == 1, ("%s: %d segments returned!", __func__, nsegs));
948         *((bus_addr_t *)arg) = segs->ds_addr;
949 }
950
951 static void
952 jme_dmamap_buf_cb(void *xctx, bus_dma_segment_t *segs, int nsegs,
953                   bus_size_t mapsz __unused, int error)
954 {
955         struct jme_dmamap_ctx *ctx = xctx;
956         int i;
957
958         if (error)
959                 return;
960
961         if (nsegs > ctx->nsegs) {
962                 ctx->nsegs = 0;
963                 return;
964         }
965
966         ctx->nsegs = nsegs;
967         for (i = 0; i < nsegs; ++i)
968                 ctx->segs[i] = segs[i];
969 }
970
971 static int
972 jme_dma_alloc(struct jme_softc *sc)
973 {
974         struct jme_txdesc *txd;
975         struct jme_rxdesc *rxd;
976         bus_addr_t busaddr, lowaddr;
977         int error, i;
978
979         sc->jme_cdata.jme_txdesc =
980         kmalloc(sc->jme_tx_desc_cnt * sizeof(struct jme_txdesc),
981                 M_DEVBUF, M_WAITOK | M_ZERO);
982         sc->jme_cdata.jme_rxdesc =
983         kmalloc(sc->jme_rx_desc_cnt * sizeof(struct jme_rxdesc),
984                 M_DEVBUF, M_WAITOK | M_ZERO);
985
986         lowaddr = sc->jme_lowaddr;
987 again:
988         /* Create parent ring tag. */
989         error = bus_dma_tag_create(NULL,/* parent */
990             1, 0,                       /* algnmnt, boundary */
991             lowaddr,                    /* lowaddr */
992             BUS_SPACE_MAXADDR,          /* highaddr */
993             NULL, NULL,                 /* filter, filterarg */
994             BUS_SPACE_MAXSIZE_32BIT,    /* maxsize */
995             0,                          /* nsegments */
996             BUS_SPACE_MAXSIZE_32BIT,    /* maxsegsize */
997             0,                          /* flags */
998             &sc->jme_cdata.jme_ring_tag);
999         if (error) {
1000                 device_printf(sc->jme_dev,
1001                     "could not create parent ring DMA tag.\n");
1002                 return error;
1003         }
1004
1005         /*
1006          * Create DMA stuffs for TX ring
1007          */
1008
1009         /* Create tag for Tx ring. */
1010         error = bus_dma_tag_create(sc->jme_cdata.jme_ring_tag,/* parent */
1011             JME_TX_RING_ALIGN, 0,       /* algnmnt, boundary */
1012             lowaddr,                    /* lowaddr */
1013             BUS_SPACE_MAXADDR,          /* highaddr */
1014             NULL, NULL,                 /* filter, filterarg */
1015             JME_TX_RING_SIZE(sc),       /* maxsize */
1016             1,                          /* nsegments */
1017             JME_TX_RING_SIZE(sc),       /* maxsegsize */
1018             0,                          /* flags */
1019             &sc->jme_cdata.jme_tx_ring_tag);
1020         if (error) {
1021                 device_printf(sc->jme_dev,
1022                     "could not allocate Tx ring DMA tag.\n");
1023                 return error;
1024         }
1025
1026         /* Allocate DMA'able memory for TX ring */
1027         error = bus_dmamem_alloc(sc->jme_cdata.jme_tx_ring_tag,
1028             (void **)&sc->jme_cdata.jme_tx_ring,
1029             BUS_DMA_WAITOK | BUS_DMA_ZERO,
1030             &sc->jme_cdata.jme_tx_ring_map);
1031         if (error) {
1032                 device_printf(sc->jme_dev,
1033                     "could not allocate DMA'able memory for Tx ring.\n");
1034                 bus_dma_tag_destroy(sc->jme_cdata.jme_tx_ring_tag);
1035                 sc->jme_cdata.jme_tx_ring_tag = NULL;
1036                 return error;
1037         }
1038
1039         /*  Load the DMA map for Tx ring. */
1040         error = bus_dmamap_load(sc->jme_cdata.jme_tx_ring_tag,
1041             sc->jme_cdata.jme_tx_ring_map, sc->jme_cdata.jme_tx_ring,
1042             JME_TX_RING_SIZE(sc), jme_dmamap_ring_cb, &busaddr, BUS_DMA_NOWAIT);
1043         if (error) {
1044                 device_printf(sc->jme_dev,
1045                     "could not load DMA'able memory for Tx ring.\n");
1046                 bus_dmamem_free(sc->jme_cdata.jme_tx_ring_tag,
1047                                 sc->jme_cdata.jme_tx_ring,
1048                                 sc->jme_cdata.jme_tx_ring_map);
1049                 bus_dma_tag_destroy(sc->jme_cdata.jme_tx_ring_tag);
1050                 sc->jme_cdata.jme_tx_ring_tag = NULL;
1051                 return error;
1052         }
1053         sc->jme_cdata.jme_tx_ring_paddr = busaddr;
1054
1055         /*
1056          * Create DMA stuffs for RX ring
1057          */
1058
1059         /* Create tag for Rx ring. */
1060         error = bus_dma_tag_create(sc->jme_cdata.jme_ring_tag,/* parent */
1061             JME_RX_RING_ALIGN, 0,       /* algnmnt, boundary */
1062             lowaddr,                    /* lowaddr */
1063             BUS_SPACE_MAXADDR,          /* highaddr */
1064             NULL, NULL,                 /* filter, filterarg */
1065             JME_RX_RING_SIZE(sc),       /* maxsize */
1066             1,                          /* nsegments */
1067             JME_RX_RING_SIZE(sc),       /* maxsegsize */
1068             0,                          /* flags */
1069             &sc->jme_cdata.jme_rx_ring_tag);
1070         if (error) {
1071                 device_printf(sc->jme_dev,
1072                     "could not allocate Rx ring DMA tag.\n");
1073                 return error;
1074         }
1075
1076         /* Allocate DMA'able memory for RX ring */
1077         error = bus_dmamem_alloc(sc->jme_cdata.jme_rx_ring_tag,
1078             (void **)&sc->jme_cdata.jme_rx_ring,
1079             BUS_DMA_WAITOK | BUS_DMA_ZERO,
1080             &sc->jme_cdata.jme_rx_ring_map);
1081         if (error) {
1082                 device_printf(sc->jme_dev,
1083                     "could not allocate DMA'able memory for Rx ring.\n");
1084                 bus_dma_tag_destroy(sc->jme_cdata.jme_rx_ring_tag);
1085                 sc->jme_cdata.jme_rx_ring_tag = NULL;
1086                 return error;
1087         }
1088
1089         /* Load the DMA map for Rx ring. */
1090         error = bus_dmamap_load(sc->jme_cdata.jme_rx_ring_tag,
1091             sc->jme_cdata.jme_rx_ring_map, sc->jme_cdata.jme_rx_ring,
1092             JME_RX_RING_SIZE(sc), jme_dmamap_ring_cb, &busaddr, BUS_DMA_NOWAIT);
1093         if (error) {
1094                 device_printf(sc->jme_dev,
1095                     "could not load DMA'able memory for Rx ring.\n");
1096                 bus_dmamem_free(sc->jme_cdata.jme_rx_ring_tag,
1097                                 sc->jme_cdata.jme_rx_ring,
1098                                 sc->jme_cdata.jme_rx_ring_map);
1099                 bus_dma_tag_destroy(sc->jme_cdata.jme_rx_ring_tag);
1100                 sc->jme_cdata.jme_rx_ring_tag = NULL;
1101                 return error;
1102         }
1103         sc->jme_cdata.jme_rx_ring_paddr = busaddr;
1104
1105         if (lowaddr != BUS_SPACE_MAXADDR_32BIT) {
1106                 bus_addr_t rx_ring_end, tx_ring_end;
1107
1108                 /* Tx/Rx descriptor queue should reside within 4GB boundary. */
1109                 tx_ring_end = sc->jme_cdata.jme_tx_ring_paddr +
1110                               JME_TX_RING_SIZE(sc);
1111                 rx_ring_end = sc->jme_cdata.jme_rx_ring_paddr +
1112                               JME_RX_RING_SIZE(sc);
1113                 if ((JME_ADDR_HI(tx_ring_end) !=
1114                      JME_ADDR_HI(sc->jme_cdata.jme_tx_ring_paddr)) ||
1115                     (JME_ADDR_HI(rx_ring_end) !=
1116                      JME_ADDR_HI(sc->jme_cdata.jme_rx_ring_paddr))) {
1117                         device_printf(sc->jme_dev, "4GB boundary crossed, "
1118                             "switching to 32bit DMA address mode.\n");
1119                         jme_dma_free(sc, 0);
1120                         /* Limit DMA address space to 32bit and try again. */
1121                         lowaddr = BUS_SPACE_MAXADDR_32BIT;
1122                         goto again;
1123                 }
1124         }
1125
1126         /* Create parent buffer tag. */
1127         error = bus_dma_tag_create(NULL,/* parent */
1128             1, 0,                       /* algnmnt, boundary */
1129             sc->jme_lowaddr,            /* lowaddr */
1130             BUS_SPACE_MAXADDR,          /* highaddr */
1131             NULL, NULL,                 /* filter, filterarg */
1132             BUS_SPACE_MAXSIZE_32BIT,    /* maxsize */
1133             0,                          /* nsegments */
1134             BUS_SPACE_MAXSIZE_32BIT,    /* maxsegsize */
1135             0,                          /* flags */
1136             &sc->jme_cdata.jme_buffer_tag);
1137         if (error) {
1138                 device_printf(sc->jme_dev,
1139                     "could not create parent buffer DMA tag.\n");
1140                 return error;
1141         }
1142
1143         /*
1144          * Create DMA stuffs for shadow status block
1145          */
1146
1147         /* Create shadow status block tag. */
1148         error = bus_dma_tag_create(sc->jme_cdata.jme_buffer_tag,/* parent */
1149             JME_SSB_ALIGN, 0,           /* algnmnt, boundary */
1150             sc->jme_lowaddr,            /* lowaddr */
1151             BUS_SPACE_MAXADDR,          /* highaddr */
1152             NULL, NULL,                 /* filter, filterarg */
1153             JME_SSB_SIZE,               /* maxsize */
1154             1,                          /* nsegments */
1155             JME_SSB_SIZE,               /* maxsegsize */
1156             0,                          /* flags */
1157             &sc->jme_cdata.jme_ssb_tag);
1158         if (error) {
1159                 device_printf(sc->jme_dev,
1160                     "could not create shared status block DMA tag.\n");
1161                 return error;
1162         }
1163
1164         /* Allocate DMA'able memory for shared status block. */
1165         error = bus_dmamem_alloc(sc->jme_cdata.jme_ssb_tag,
1166             (void **)&sc->jme_cdata.jme_ssb_block,
1167             BUS_DMA_WAITOK | BUS_DMA_ZERO,
1168             &sc->jme_cdata.jme_ssb_map);
1169         if (error) {
1170                 device_printf(sc->jme_dev, "could not allocate DMA'able "
1171                     "memory for shared status block.\n");
1172                 bus_dma_tag_destroy(sc->jme_cdata.jme_ssb_tag);
1173                 sc->jme_cdata.jme_ssb_tag = NULL;
1174                 return error;
1175         }
1176
1177         /* Load the DMA map for shared status block */
1178         error = bus_dmamap_load(sc->jme_cdata.jme_ssb_tag,
1179             sc->jme_cdata.jme_ssb_map, sc->jme_cdata.jme_ssb_block,
1180             JME_SSB_SIZE, jme_dmamap_ring_cb, &busaddr, BUS_DMA_NOWAIT);
1181         if (error) {
1182                 device_printf(sc->jme_dev, "could not load DMA'able memory "
1183                     "for shared status block.\n");
1184                 bus_dmamem_free(sc->jme_cdata.jme_ssb_tag,
1185                                 sc->jme_cdata.jme_ssb_block,
1186                                 sc->jme_cdata.jme_ssb_map);
1187                 bus_dma_tag_destroy(sc->jme_cdata.jme_ssb_tag);
1188                 sc->jme_cdata.jme_ssb_tag = NULL;
1189                 return error;
1190         }
1191         sc->jme_cdata.jme_ssb_block_paddr = busaddr;
1192
1193         /*
1194          * Create DMA stuffs for TX buffers
1195          */
1196
1197         /* Create tag for Tx buffers. */
1198         error = bus_dma_tag_create(sc->jme_cdata.jme_buffer_tag,/* parent */
1199             1, 0,                       /* algnmnt, boundary */
1200             sc->jme_lowaddr,            /* lowaddr */
1201             BUS_SPACE_MAXADDR,          /* highaddr */
1202             NULL, NULL,                 /* filter, filterarg */
1203             JME_TSO_MAXSIZE,            /* maxsize */
1204             JME_MAXTXSEGS,              /* nsegments */
1205             JME_TSO_MAXSEGSIZE,         /* maxsegsize */
1206             0,                          /* flags */
1207             &sc->jme_cdata.jme_tx_tag);
1208         if (error != 0) {
1209                 device_printf(sc->jme_dev, "could not create Tx DMA tag.\n");
1210                 return error;
1211         }
1212
1213         /* Create DMA maps for Tx buffers. */
1214         for (i = 0; i < sc->jme_tx_desc_cnt; i++) {
1215                 txd = &sc->jme_cdata.jme_txdesc[i];
1216                 error = bus_dmamap_create(sc->jme_cdata.jme_tx_tag, 0,
1217                     &txd->tx_dmamap);
1218                 if (error) {
1219                         int j;
1220
1221                         device_printf(sc->jme_dev,
1222                             "could not create %dth Tx dmamap.\n", i);
1223
1224                         for (j = 0; j < i; ++j) {
1225                                 txd = &sc->jme_cdata.jme_txdesc[j];
1226                                 bus_dmamap_destroy(sc->jme_cdata.jme_tx_tag,
1227                                                    txd->tx_dmamap);
1228                         }
1229                         bus_dma_tag_destroy(sc->jme_cdata.jme_tx_tag);
1230                         sc->jme_cdata.jme_tx_tag = NULL;
1231                         return error;
1232                 }
1233         }
1234
1235         /*
1236          * Create DMA stuffs for RX buffers
1237          */
1238
1239         /* Create tag for Rx buffers. */
1240         error = bus_dma_tag_create(sc->jme_cdata.jme_buffer_tag,/* parent */
1241             JME_RX_BUF_ALIGN, 0,        /* algnmnt, boundary */
1242             sc->jme_lowaddr,            /* lowaddr */
1243             BUS_SPACE_MAXADDR,          /* highaddr */
1244             NULL, NULL,                 /* filter, filterarg */
1245             MCLBYTES,                   /* maxsize */
1246             1,                          /* nsegments */
1247             MCLBYTES,                   /* maxsegsize */
1248             0,                          /* flags */
1249             &sc->jme_cdata.jme_rx_tag);
1250         if (error) {
1251                 device_printf(sc->jme_dev, "could not create Rx DMA tag.\n");
1252                 return error;
1253         }
1254
1255         /* Create DMA maps for Rx buffers. */
1256         error = bus_dmamap_create(sc->jme_cdata.jme_rx_tag, 0,
1257                                   &sc->jme_cdata.jme_rx_sparemap);
1258         if (error) {
1259                 device_printf(sc->jme_dev,
1260                     "could not create spare Rx dmamap.\n");
1261                 bus_dma_tag_destroy(sc->jme_cdata.jme_rx_tag);
1262                 sc->jme_cdata.jme_rx_tag = NULL;
1263                 return error;
1264         }
1265         for (i = 0; i < sc->jme_rx_desc_cnt; i++) {
1266                 rxd = &sc->jme_cdata.jme_rxdesc[i];
1267                 error = bus_dmamap_create(sc->jme_cdata.jme_rx_tag, 0,
1268                     &rxd->rx_dmamap);
1269                 if (error) {
1270                         int j;
1271
1272                         device_printf(sc->jme_dev,
1273                             "could not create %dth Rx dmamap.\n", i);
1274
1275                         for (j = 0; j < i; ++j) {
1276                                 rxd = &sc->jme_cdata.jme_rxdesc[j];
1277                                 bus_dmamap_destroy(sc->jme_cdata.jme_rx_tag,
1278                                                    rxd->rx_dmamap);
1279                         }
1280                         bus_dmamap_destroy(sc->jme_cdata.jme_rx_tag,
1281                             sc->jme_cdata.jme_rx_sparemap);
1282                         bus_dma_tag_destroy(sc->jme_cdata.jme_rx_tag);
1283                         sc->jme_cdata.jme_rx_tag = NULL;
1284                         return error;
1285                 }
1286         }
1287         return 0;
1288 }
1289
1290 static void
1291 jme_dma_free(struct jme_softc *sc, int detach)
1292 {
1293         struct jme_txdesc *txd;
1294         struct jme_rxdesc *rxd;
1295         int i;
1296
1297         /* Tx ring */
1298         if (sc->jme_cdata.jme_tx_ring_tag != NULL) {
1299                 bus_dmamap_unload(sc->jme_cdata.jme_tx_ring_tag,
1300                     sc->jme_cdata.jme_tx_ring_map);
1301                 bus_dmamem_free(sc->jme_cdata.jme_tx_ring_tag,
1302                     sc->jme_cdata.jme_tx_ring,
1303                     sc->jme_cdata.jme_tx_ring_map);
1304                 bus_dma_tag_destroy(sc->jme_cdata.jme_tx_ring_tag);
1305                 sc->jme_cdata.jme_tx_ring_tag = NULL;
1306         }
1307
1308         /* Rx ring */
1309         if (sc->jme_cdata.jme_rx_ring_tag != NULL) {
1310                 bus_dmamap_unload(sc->jme_cdata.jme_rx_ring_tag,
1311                     sc->jme_cdata.jme_rx_ring_map);
1312                 bus_dmamem_free(sc->jme_cdata.jme_rx_ring_tag,
1313                     sc->jme_cdata.jme_rx_ring,
1314                     sc->jme_cdata.jme_rx_ring_map);
1315                 bus_dma_tag_destroy(sc->jme_cdata.jme_rx_ring_tag);
1316                 sc->jme_cdata.jme_rx_ring_tag = NULL;
1317         }
1318
1319         /* Tx buffers */
1320         if (sc->jme_cdata.jme_tx_tag != NULL) {
1321                 for (i = 0; i < sc->jme_tx_desc_cnt; i++) {
1322                         txd = &sc->jme_cdata.jme_txdesc[i];
1323                         bus_dmamap_destroy(sc->jme_cdata.jme_tx_tag,
1324                             txd->tx_dmamap);
1325                 }
1326                 bus_dma_tag_destroy(sc->jme_cdata.jme_tx_tag);
1327                 sc->jme_cdata.jme_tx_tag = NULL;
1328         }
1329
1330         /* Rx buffers */
1331         if (sc->jme_cdata.jme_rx_tag != NULL) {
1332                 for (i = 0; i < sc->jme_rx_desc_cnt; i++) {
1333                         rxd = &sc->jme_cdata.jme_rxdesc[i];
1334                         bus_dmamap_destroy(sc->jme_cdata.jme_rx_tag,
1335                             rxd->rx_dmamap);
1336                 }
1337                 bus_dmamap_destroy(sc->jme_cdata.jme_rx_tag,
1338                     sc->jme_cdata.jme_rx_sparemap);
1339                 bus_dma_tag_destroy(sc->jme_cdata.jme_rx_tag);
1340                 sc->jme_cdata.jme_rx_tag = NULL;
1341         }
1342
1343         /* Shadow status block. */
1344         if (sc->jme_cdata.jme_ssb_tag != NULL) {
1345                 bus_dmamap_unload(sc->jme_cdata.jme_ssb_tag,
1346                     sc->jme_cdata.jme_ssb_map);
1347                 bus_dmamem_free(sc->jme_cdata.jme_ssb_tag,
1348                     sc->jme_cdata.jme_ssb_block,
1349                     sc->jme_cdata.jme_ssb_map);
1350                 bus_dma_tag_destroy(sc->jme_cdata.jme_ssb_tag);
1351                 sc->jme_cdata.jme_ssb_tag = NULL;
1352         }
1353
1354         if (sc->jme_cdata.jme_buffer_tag != NULL) {
1355                 bus_dma_tag_destroy(sc->jme_cdata.jme_buffer_tag);
1356                 sc->jme_cdata.jme_buffer_tag = NULL;
1357         }
1358         if (sc->jme_cdata.jme_ring_tag != NULL) {
1359                 bus_dma_tag_destroy(sc->jme_cdata.jme_ring_tag);
1360                 sc->jme_cdata.jme_ring_tag = NULL;
1361         }
1362
1363         if (detach) {
1364                 if (sc->jme_cdata.jme_txdesc != NULL) {
1365                         kfree(sc->jme_cdata.jme_txdesc, M_DEVBUF);
1366                         sc->jme_cdata.jme_txdesc = NULL;
1367                 }
1368                 if (sc->jme_cdata.jme_rxdesc != NULL) {
1369                         kfree(sc->jme_cdata.jme_rxdesc, M_DEVBUF);
1370                         sc->jme_cdata.jme_rxdesc = NULL;
1371                 }
1372         }
1373 }
1374
1375 /*
1376  *      Make sure the interface is stopped at reboot time.
1377  */
1378 static int
1379 jme_shutdown(device_t dev)
1380 {
1381         return jme_suspend(dev);
1382 }
1383
1384 #ifdef notyet
1385 /*
1386  * Unlike other ethernet controllers, JMC250 requires
1387  * explicit resetting link speed to 10/100Mbps as gigabit
1388  * link will cunsume more power than 375mA.
1389  * Note, we reset the link speed to 10/100Mbps with
1390  * auto-negotiation but we don't know whether that operation
1391  * would succeed or not as we have no control after powering
1392  * off. If the renegotiation fail WOL may not work. Running
1393  * at 1Gbps draws more power than 375mA at 3.3V which is
1394  * specified in PCI specification and that would result in
1395  * complete shutdowning power to ethernet controller.
1396  *
1397  * TODO
1398  *  Save current negotiated media speed/duplex/flow-control
1399  *  to softc and restore the same link again after resuming.
1400  *  PHY handling such as power down/resetting to 100Mbps
1401  *  may be better handled in suspend method in phy driver.
1402  */
1403 static void
1404 jme_setlinkspeed(struct jme_softc *sc)
1405 {
1406         struct mii_data *mii;
1407         int aneg, i;
1408
1409         JME_LOCK_ASSERT(sc);
1410
1411         mii = device_get_softc(sc->jme_miibus);
1412         mii_pollstat(mii);
1413         aneg = 0;
1414         if ((mii->mii_media_status & IFM_AVALID) != 0) {
1415                 switch IFM_SUBTYPE(mii->mii_media_active) {
1416                 case IFM_10_T:
1417                 case IFM_100_TX:
1418                         return;
1419                 case IFM_1000_T:
1420                         aneg++;
1421                 default:
1422                         break;
1423                 }
1424         }
1425         jme_miibus_writereg(sc->jme_dev, sc->jme_phyaddr, MII_100T2CR, 0);
1426         jme_miibus_writereg(sc->jme_dev, sc->jme_phyaddr, MII_ANAR,
1427             ANAR_TX_FD | ANAR_TX | ANAR_10_FD | ANAR_10 | ANAR_CSMA);
1428         jme_miibus_writereg(sc->jme_dev, sc->jme_phyaddr, MII_BMCR,
1429             BMCR_AUTOEN | BMCR_STARTNEG);
1430         DELAY(1000);
1431         if (aneg != 0) {
1432                 /* Poll link state until jme(4) get a 10/100 link. */
1433                 for (i = 0; i < MII_ANEGTICKS_GIGE; i++) {
1434                         mii_pollstat(mii);
1435                         if ((mii->mii_media_status & IFM_AVALID) != 0) {
1436                                 switch (IFM_SUBTYPE(mii->mii_media_active)) {
1437                                 case IFM_10_T:
1438                                 case IFM_100_TX:
1439                                         jme_mac_config(sc);
1440                                         return;
1441                                 default:
1442                                         break;
1443                                 }
1444                         }
1445                         JME_UNLOCK(sc);
1446                         pause("jmelnk", hz);
1447                         JME_LOCK(sc);
1448                 }
1449                 if (i == MII_ANEGTICKS_GIGE)
1450                         device_printf(sc->jme_dev, "establishing link failed, "
1451                             "WOL may not work!");
1452         }
1453         /*
1454          * No link, force MAC to have 100Mbps, full-duplex link.
1455          * This is the last resort and may/may not work.
1456          */
1457         mii->mii_media_status = IFM_AVALID | IFM_ACTIVE;
1458         mii->mii_media_active = IFM_ETHER | IFM_100_TX | IFM_FDX;
1459         jme_mac_config(sc);
1460 }
1461
1462 static void
1463 jme_setwol(struct jme_softc *sc)
1464 {
1465         struct ifnet *ifp = &sc->arpcom.ac_if;
1466         uint32_t gpr, pmcs;
1467         uint16_t pmstat;
1468         int pmc;
1469
1470         if (pci_find_extcap(sc->jme_dev, PCIY_PMG, &pmc) != 0) {
1471                 /* No PME capability, PHY power down. */
1472                 jme_miibus_writereg(sc->jme_dev, sc->jme_phyaddr,
1473                     MII_BMCR, BMCR_PDOWN);
1474                 return;
1475         }
1476
1477         gpr = CSR_READ_4(sc, JME_GPREG0) & ~GPREG0_PME_ENB;
1478         pmcs = CSR_READ_4(sc, JME_PMCS);
1479         pmcs &= ~PMCS_WOL_ENB_MASK;
1480         if ((ifp->if_capenable & IFCAP_WOL_MAGIC) != 0) {
1481                 pmcs |= PMCS_MAGIC_FRAME | PMCS_MAGIC_FRAME_ENB;
1482                 /* Enable PME message. */
1483                 gpr |= GPREG0_PME_ENB;
1484                 /* For gigabit controllers, reset link speed to 10/100. */
1485                 if ((sc->jme_caps & JME_CAP_FASTETH) == 0)
1486                         jme_setlinkspeed(sc);
1487         }
1488
1489         CSR_WRITE_4(sc, JME_PMCS, pmcs);
1490         CSR_WRITE_4(sc, JME_GPREG0, gpr);
1491
1492         /* Request PME. */
1493         pmstat = pci_read_config(sc->jme_dev, pmc + PCIR_POWER_STATUS, 2);
1494         pmstat &= ~(PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE);
1495         if ((ifp->if_capenable & IFCAP_WOL) != 0)
1496                 pmstat |= PCIM_PSTAT_PME | PCIM_PSTAT_PMEENABLE;
1497         pci_write_config(sc->jme_dev, pmc + PCIR_POWER_STATUS, pmstat, 2);
1498         if ((ifp->if_capenable & IFCAP_WOL) == 0) {
1499                 /* No WOL, PHY power down. */
1500                 jme_miibus_writereg(sc->jme_dev, sc->jme_phyaddr,
1501                     MII_BMCR, BMCR_PDOWN);
1502         }
1503 }
1504 #endif
1505
1506 static int
1507 jme_suspend(device_t dev)
1508 {
1509         struct jme_softc *sc = device_get_softc(dev);
1510         struct ifnet *ifp = &sc->arpcom.ac_if;
1511
1512         lwkt_serialize_enter(ifp->if_serializer);
1513         jme_stop(sc);
1514 #ifdef notyet
1515         jme_setwol(sc);
1516 #endif
1517         lwkt_serialize_exit(ifp->if_serializer);
1518
1519         return (0);
1520 }
1521
1522 static int
1523 jme_resume(device_t dev)
1524 {
1525         struct jme_softc *sc = device_get_softc(dev);
1526         struct ifnet *ifp = &sc->arpcom.ac_if;
1527 #ifdef notyet
1528         int pmc;
1529 #endif
1530
1531         lwkt_serialize_enter(ifp->if_serializer);
1532
1533 #ifdef notyet
1534         if (pci_find_extcap(sc->jme_dev, PCIY_PMG, &pmc) != 0) {
1535                 uint16_t pmstat;
1536
1537                 pmstat = pci_read_config(sc->jme_dev,
1538                     pmc + PCIR_POWER_STATUS, 2);
1539                 /* Disable PME clear PME status. */
1540                 pmstat &= ~PCIM_PSTAT_PMEENABLE;
1541                 pci_write_config(sc->jme_dev,
1542                     pmc + PCIR_POWER_STATUS, pmstat, 2);
1543         }
1544 #endif
1545
1546         if (ifp->if_flags & IFF_UP)
1547                 jme_init(sc);
1548
1549         lwkt_serialize_exit(ifp->if_serializer);
1550
1551         return (0);
1552 }
1553
1554 static int
1555 jme_encap(struct jme_softc *sc, struct mbuf **m_head)
1556 {
1557         struct jme_txdesc *txd;
1558         struct jme_desc *desc;
1559         struct mbuf *m;
1560         struct jme_dmamap_ctx ctx;
1561         bus_dma_segment_t txsegs[JME_MAXTXSEGS];
1562         int maxsegs;
1563         int error, i, prod, symbol_desc;
1564         uint32_t cflags, flag64;
1565
1566         M_ASSERTPKTHDR((*m_head));
1567
1568         prod = sc->jme_cdata.jme_tx_prod;
1569         txd = &sc->jme_cdata.jme_txdesc[prod];
1570
1571         if (sc->jme_lowaddr != BUS_SPACE_MAXADDR_32BIT)
1572                 symbol_desc = 1;
1573         else
1574                 symbol_desc = 0;
1575
1576         maxsegs = (sc->jme_tx_desc_cnt - sc->jme_cdata.jme_tx_cnt) -
1577                   (JME_TXD_RSVD + symbol_desc);
1578         if (maxsegs > JME_MAXTXSEGS)
1579                 maxsegs = JME_MAXTXSEGS;
1580         KASSERT(maxsegs >= (sc->jme_txd_spare - symbol_desc),
1581                 ("not enough segments %d\n", maxsegs));
1582
1583         ctx.nsegs = maxsegs;
1584         ctx.segs = txsegs;
1585         error = bus_dmamap_load_mbuf(sc->jme_cdata.jme_tx_tag, txd->tx_dmamap,
1586                                      *m_head, jme_dmamap_buf_cb, &ctx,
1587                                      BUS_DMA_NOWAIT);
1588         if (!error && ctx.nsegs == 0) {
1589                 bus_dmamap_unload(sc->jme_cdata.jme_tx_tag, txd->tx_dmamap);
1590                 error = EFBIG;
1591         }
1592         if (error == EFBIG) {
1593                 m = m_defrag(*m_head, MB_DONTWAIT);
1594                 if (m == NULL) {
1595                         if_printf(&sc->arpcom.ac_if,
1596                                   "could not defrag TX mbuf\n");
1597                         error = ENOBUFS;
1598                         goto fail;
1599                 }
1600                 *m_head = m;
1601
1602                 ctx.nsegs = maxsegs;
1603                 ctx.segs = txsegs;
1604                 error = bus_dmamap_load_mbuf(sc->jme_cdata.jme_tx_tag,
1605                                              txd->tx_dmamap, *m_head,
1606                                              jme_dmamap_buf_cb, &ctx,
1607                                              BUS_DMA_NOWAIT);
1608                 if (error || ctx.nsegs == 0) {
1609                         if_printf(&sc->arpcom.ac_if,
1610                                   "could not load defragged TX mbuf\n");
1611                         if (!error) {
1612                                 bus_dmamap_unload(sc->jme_cdata.jme_tx_tag,
1613                                                   txd->tx_dmamap);
1614                                 error = EFBIG;
1615                         }
1616                         goto fail;
1617                 }
1618         } else if (error) {
1619                 if_printf(&sc->arpcom.ac_if, "could not load TX mbuf\n");
1620                 goto fail;
1621         }
1622
1623         m = *m_head;
1624         cflags = 0;
1625
1626         /* Configure checksum offload. */
1627         if (m->m_pkthdr.csum_flags & CSUM_IP)
1628                 cflags |= JME_TD_IPCSUM;
1629         if (m->m_pkthdr.csum_flags & CSUM_TCP)
1630                 cflags |= JME_TD_TCPCSUM;
1631         if (m->m_pkthdr.csum_flags & CSUM_UDP)
1632                 cflags |= JME_TD_UDPCSUM;
1633
1634         /* Configure VLAN. */
1635         if (m->m_flags & M_VLANTAG) {
1636                 cflags |= (m->m_pkthdr.ether_vlantag & JME_TD_VLAN_MASK);
1637                 cflags |= JME_TD_VLAN_TAG;
1638         }
1639
1640         desc = &sc->jme_cdata.jme_tx_ring[prod];
1641         desc->flags = htole32(cflags);
1642         desc->addr_hi = htole32(m->m_pkthdr.len);
1643         if (sc->jme_lowaddr != BUS_SPACE_MAXADDR_32BIT) {
1644                 /*
1645                  * Use 64bits TX desc chain format.
1646                  *
1647                  * The first TX desc of the chain, which is setup here,
1648                  * is just a symbol TX desc carrying no payload.
1649                  */
1650                 flag64 = JME_TD_64BIT;
1651                 desc->buflen = 0;
1652                 desc->addr_lo = 0;
1653
1654                 /* No effective TX desc is consumed */
1655                 i = 0;
1656         } else {
1657                 /*
1658                  * Use 32bits TX desc chain format.
1659                  *
1660                  * The first TX desc of the chain, which is setup here,
1661                  * is an effective TX desc carrying the first segment of
1662                  * the mbuf chain.
1663                  */
1664                 flag64 = 0;
1665                 desc->buflen = htole32(txsegs[0].ds_len);
1666                 desc->addr_lo = htole32(JME_ADDR_LO(txsegs[0].ds_addr));
1667
1668                 /* One effective TX desc is consumed */
1669                 i = 1;
1670         }
1671         sc->jme_cdata.jme_tx_cnt++;
1672         KKASSERT(sc->jme_cdata.jme_tx_cnt - i <
1673                  sc->jme_tx_desc_cnt - JME_TXD_RSVD);
1674         JME_DESC_INC(prod, sc->jme_tx_desc_cnt);
1675
1676         txd->tx_ndesc = 1 - i;
1677         for (; i < ctx.nsegs; i++) {
1678                 desc = &sc->jme_cdata.jme_tx_ring[prod];
1679                 desc->flags = htole32(JME_TD_OWN | flag64);
1680                 desc->buflen = htole32(txsegs[i].ds_len);
1681                 desc->addr_hi = htole32(JME_ADDR_HI(txsegs[i].ds_addr));
1682                 desc->addr_lo = htole32(JME_ADDR_LO(txsegs[i].ds_addr));
1683
1684                 sc->jme_cdata.jme_tx_cnt++;
1685                 KKASSERT(sc->jme_cdata.jme_tx_cnt <=
1686                          sc->jme_tx_desc_cnt - JME_TXD_RSVD);
1687                 JME_DESC_INC(prod, sc->jme_tx_desc_cnt);
1688         }
1689
1690         /* Update producer index. */
1691         sc->jme_cdata.jme_tx_prod = prod;
1692         /*
1693          * Finally request interrupt and give the first descriptor
1694          * owenership to hardware.
1695          */
1696         desc = txd->tx_desc;
1697         desc->flags |= htole32(JME_TD_OWN | JME_TD_INTR);
1698
1699         txd->tx_m = m;
1700         txd->tx_ndesc += ctx.nsegs;
1701
1702         /* Sync descriptors. */
1703         bus_dmamap_sync(sc->jme_cdata.jme_tx_tag, txd->tx_dmamap,
1704                         BUS_DMASYNC_PREWRITE);
1705         bus_dmamap_sync(sc->jme_cdata.jme_tx_ring_tag,
1706                         sc->jme_cdata.jme_tx_ring_map, BUS_DMASYNC_PREWRITE);
1707         return 0;
1708 fail:
1709         m_freem(*m_head);
1710         *m_head = NULL;
1711         return error;
1712 }
1713
1714 static void
1715 jme_start(struct ifnet *ifp)
1716 {
1717         struct jme_softc *sc = ifp->if_softc;
1718         struct mbuf *m_head;
1719         int enq = 0;
1720
1721         ASSERT_SERIALIZED(ifp->if_serializer);
1722
1723         if ((sc->jme_flags & JME_FLAG_LINK) == 0) {
1724                 ifq_purge(&ifp->if_snd);
1725                 return;
1726         }
1727
1728         if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
1729                 return;
1730
1731         if (sc->jme_cdata.jme_tx_cnt >= JME_TX_DESC_HIWAT(sc))
1732                 jme_txeof(sc);
1733
1734         while (!ifq_is_empty(&ifp->if_snd)) {
1735                 /*
1736                  * Check number of available TX descs, always
1737                  * leave JME_TXD_RSVD free TX descs.
1738                  */
1739                 if (sc->jme_cdata.jme_tx_cnt + sc->jme_txd_spare >
1740                     sc->jme_tx_desc_cnt - JME_TXD_RSVD) {
1741                         ifp->if_flags |= IFF_OACTIVE;
1742                         break;
1743                 }
1744
1745                 m_head = ifq_dequeue(&ifp->if_snd, NULL);
1746                 if (m_head == NULL)
1747                         break;
1748
1749                 /*
1750                  * Pack the data into the transmit ring. If we
1751                  * don't have room, set the OACTIVE flag and wait
1752                  * for the NIC to drain the ring.
1753                  */
1754                 if (jme_encap(sc, &m_head)) {
1755                         KKASSERT(m_head == NULL);
1756                         ifp->if_oerrors++;
1757                         ifp->if_flags |= IFF_OACTIVE;
1758                         break;
1759                 }
1760                 enq++;
1761
1762                 /*
1763                  * If there's a BPF listener, bounce a copy of this frame
1764                  * to him.
1765                  */
1766                 ETHER_BPF_MTAP(ifp, m_head);
1767         }
1768
1769         if (enq > 0) {
1770                 /*
1771                  * Reading TXCSR takes very long time under heavy load
1772                  * so cache TXCSR value and writes the ORed value with
1773                  * the kick command to the TXCSR. This saves one register
1774                  * access cycle.
1775                  */
1776                 CSR_WRITE_4(sc, JME_TXCSR, sc->jme_txcsr | TXCSR_TX_ENB |
1777                     TXCSR_TXQ_N_START(TXCSR_TXQ0));
1778                 /* Set a timeout in case the chip goes out to lunch. */
1779                 ifp->if_timer = JME_TX_TIMEOUT;
1780         }
1781 }
1782
1783 static void
1784 jme_watchdog(struct ifnet *ifp)
1785 {
1786         struct jme_softc *sc = ifp->if_softc;
1787
1788         ASSERT_SERIALIZED(ifp->if_serializer);
1789
1790         if ((sc->jme_flags & JME_FLAG_LINK) == 0) {
1791                 if_printf(ifp, "watchdog timeout (missed link)\n");
1792                 ifp->if_oerrors++;
1793                 jme_init(sc);
1794                 return;
1795         }
1796
1797         jme_txeof(sc);
1798         if (sc->jme_cdata.jme_tx_cnt == 0) {
1799                 if_printf(ifp, "watchdog timeout (missed Tx interrupts) "
1800                           "-- recovering\n");
1801                 if (!ifq_is_empty(&ifp->if_snd))
1802                         if_devstart(ifp);
1803                 return;
1804         }
1805
1806         if_printf(ifp, "watchdog timeout\n");
1807         ifp->if_oerrors++;
1808         jme_init(sc);
1809         if (!ifq_is_empty(&ifp->if_snd))
1810                 if_devstart(ifp);
1811 }
1812
1813 static int
1814 jme_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr)
1815 {
1816         struct jme_softc *sc = ifp->if_softc;
1817         struct mii_data *mii = device_get_softc(sc->jme_miibus);
1818         struct ifreq *ifr = (struct ifreq *)data;
1819         int error = 0, mask;
1820
1821         ASSERT_SERIALIZED(ifp->if_serializer);
1822
1823         switch (cmd) {
1824         case SIOCSIFMTU:
1825                 if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > JME_JUMBO_MTU ||
1826                     (!(sc->jme_caps & JME_CAP_JUMBO) &&
1827                      ifr->ifr_mtu > JME_MAX_MTU)) {
1828                         error = EINVAL;
1829                         break;
1830                 }
1831
1832                 if (ifp->if_mtu != ifr->ifr_mtu) {
1833                         /*
1834                          * No special configuration is required when interface
1835                          * MTU is changed but availability of Tx checksum
1836                          * offload should be chcked against new MTU size as
1837                          * FIFO size is just 2K.
1838                          */
1839                         if (ifr->ifr_mtu >= JME_TX_FIFO_SIZE) {
1840                                 ifp->if_capenable &= ~IFCAP_TXCSUM;
1841                                 ifp->if_hwassist &= ~JME_CSUM_FEATURES;
1842                         }
1843                         ifp->if_mtu = ifr->ifr_mtu;
1844                         if (ifp->if_flags & IFF_RUNNING)
1845                                 jme_init(sc);
1846                 }
1847                 break;
1848
1849         case SIOCSIFFLAGS:
1850                 if (ifp->if_flags & IFF_UP) {
1851                         if (ifp->if_flags & IFF_RUNNING) {
1852                                 if ((ifp->if_flags ^ sc->jme_if_flags) &
1853                                     (IFF_PROMISC | IFF_ALLMULTI))
1854                                         jme_set_filter(sc);
1855                         } else {
1856                                 jme_init(sc);
1857                         }
1858                 } else {
1859                         if (ifp->if_flags & IFF_RUNNING)
1860                                 jme_stop(sc);
1861                 }
1862                 sc->jme_if_flags = ifp->if_flags;
1863                 break;
1864
1865         case SIOCADDMULTI:
1866         case SIOCDELMULTI:
1867                 if (ifp->if_flags & IFF_RUNNING)
1868                         jme_set_filter(sc);
1869                 break;
1870
1871         case SIOCSIFMEDIA:
1872         case SIOCGIFMEDIA:
1873                 error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, cmd);
1874                 break;
1875
1876         case SIOCSIFCAP:
1877                 mask = ifr->ifr_reqcap ^ ifp->if_capenable;
1878
1879                 if ((mask & IFCAP_TXCSUM) && ifp->if_mtu < JME_TX_FIFO_SIZE) {
1880                         if (IFCAP_TXCSUM & ifp->if_capabilities) {
1881                                 ifp->if_capenable ^= IFCAP_TXCSUM;
1882                                 if (IFCAP_TXCSUM & ifp->if_capenable)
1883                                         ifp->if_hwassist |= JME_CSUM_FEATURES;
1884                                 else
1885                                         ifp->if_hwassist &= ~JME_CSUM_FEATURES;
1886                         }
1887                 }
1888                 if ((mask & IFCAP_RXCSUM) &&
1889                     (IFCAP_RXCSUM & ifp->if_capabilities)) {
1890                         uint32_t reg;
1891
1892                         ifp->if_capenable ^= IFCAP_RXCSUM;
1893                         reg = CSR_READ_4(sc, JME_RXMAC);
1894                         reg &= ~RXMAC_CSUM_ENB;
1895                         if (ifp->if_capenable & IFCAP_RXCSUM)
1896                                 reg |= RXMAC_CSUM_ENB;
1897                         CSR_WRITE_4(sc, JME_RXMAC, reg);
1898                 }
1899
1900                 if ((mask & IFCAP_VLAN_HWTAGGING) &&
1901                     (IFCAP_VLAN_HWTAGGING & ifp->if_capabilities)) {
1902                         ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
1903                         jme_set_vlan(sc);
1904                 }
1905                 break;
1906
1907         default:
1908                 error = ether_ioctl(ifp, cmd, data);
1909                 break;
1910         }
1911         return (error);
1912 }
1913
1914 static void
1915 jme_mac_config(struct jme_softc *sc)
1916 {
1917         struct mii_data *mii;
1918         uint32_t ghc, rxmac, txmac, txpause, gp1;
1919         int phyconf = JMPHY_CONF_DEFFIFO, hdx = 0;
1920
1921         mii = device_get_softc(sc->jme_miibus);
1922
1923         CSR_WRITE_4(sc, JME_GHC, GHC_RESET);
1924         DELAY(10);
1925         CSR_WRITE_4(sc, JME_GHC, 0);
1926         ghc = 0;
1927         rxmac = CSR_READ_4(sc, JME_RXMAC);
1928         rxmac &= ~RXMAC_FC_ENB;
1929         txmac = CSR_READ_4(sc, JME_TXMAC);
1930         txmac &= ~(TXMAC_CARRIER_EXT | TXMAC_FRAME_BURST);
1931         txpause = CSR_READ_4(sc, JME_TXPFC);
1932         txpause &= ~TXPFC_PAUSE_ENB;
1933         if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0) {
1934                 ghc |= GHC_FULL_DUPLEX;
1935                 rxmac &= ~RXMAC_COLL_DET_ENB;
1936                 txmac &= ~(TXMAC_COLL_ENB | TXMAC_CARRIER_SENSE |
1937                     TXMAC_BACKOFF | TXMAC_CARRIER_EXT |
1938                     TXMAC_FRAME_BURST);
1939 #ifdef notyet
1940                 if ((IFM_OPTIONS(mii->mii_media_active) & IFM_ETH_TXPAUSE) != 0)
1941                         txpause |= TXPFC_PAUSE_ENB;
1942                 if ((IFM_OPTIONS(mii->mii_media_active) & IFM_ETH_RXPAUSE) != 0)
1943                         rxmac |= RXMAC_FC_ENB;
1944 #endif
1945                 /* Disable retry transmit timer/retry limit. */
1946                 CSR_WRITE_4(sc, JME_TXTRHD, CSR_READ_4(sc, JME_TXTRHD) &
1947                     ~(TXTRHD_RT_PERIOD_ENB | TXTRHD_RT_LIMIT_ENB));
1948         } else {
1949                 rxmac |= RXMAC_COLL_DET_ENB;
1950                 txmac |= TXMAC_COLL_ENB | TXMAC_CARRIER_SENSE | TXMAC_BACKOFF;
1951                 /* Enable retry transmit timer/retry limit. */
1952                 CSR_WRITE_4(sc, JME_TXTRHD, CSR_READ_4(sc, JME_TXTRHD) |
1953                     TXTRHD_RT_PERIOD_ENB | TXTRHD_RT_LIMIT_ENB);
1954         }
1955
1956         /*
1957          * Reprogram Tx/Rx MACs with resolved speed/duplex.
1958          */
1959         gp1 = CSR_READ_4(sc, JME_GPREG1);
1960         gp1 &= ~GPREG1_WA_HDX;
1961
1962         if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) == 0)
1963                 hdx = 1;
1964
1965         switch (IFM_SUBTYPE(mii->mii_media_active)) {
1966         case IFM_10_T:
1967                 ghc |= GHC_SPEED_10 | sc->jme_clksrc;
1968                 if (hdx)
1969                         gp1 |= GPREG1_WA_HDX;
1970                 break;
1971
1972         case IFM_100_TX:
1973                 ghc |= GHC_SPEED_100 | sc->jme_clksrc;
1974                 if (hdx)
1975                         gp1 |= GPREG1_WA_HDX;
1976
1977                 /*
1978                  * Use extended FIFO depth to workaround CRC errors
1979                  * emitted by chips before JMC250B
1980                  */
1981                 phyconf = JMPHY_CONF_EXTFIFO;
1982                 break;
1983
1984         case IFM_1000_T:
1985                 if (sc->jme_caps & JME_CAP_FASTETH)
1986                         break;
1987
1988                 ghc |= GHC_SPEED_1000 | sc->jme_clksrc_1000;
1989                 if (hdx)
1990                         txmac |= TXMAC_CARRIER_EXT | TXMAC_FRAME_BURST;
1991                 break;
1992
1993         default:
1994                 break;
1995         }
1996         CSR_WRITE_4(sc, JME_GHC, ghc);
1997         CSR_WRITE_4(sc, JME_RXMAC, rxmac);
1998         CSR_WRITE_4(sc, JME_TXMAC, txmac);
1999         CSR_WRITE_4(sc, JME_TXPFC, txpause);
2000
2001         if (sc->jme_workaround & JME_WA_EXTFIFO) {
2002                 jme_miibus_writereg(sc->jme_dev, sc->jme_phyaddr,
2003                                     JMPHY_CONF, phyconf);
2004         }
2005         if (sc->jme_workaround & JME_WA_HDX)
2006                 CSR_WRITE_4(sc, JME_GPREG1, gp1);
2007 }
2008
2009 static void
2010 jme_intr(void *xsc)
2011 {
2012         struct jme_softc *sc = xsc;
2013         struct ifnet *ifp = &sc->arpcom.ac_if;
2014         uint32_t status;
2015
2016         ASSERT_SERIALIZED(ifp->if_serializer);
2017
2018         status = CSR_READ_4(sc, JME_INTR_REQ_STATUS);
2019         if (status == 0 || status == 0xFFFFFFFF)
2020                 return;
2021
2022         /* Disable interrupts. */
2023         CSR_WRITE_4(sc, JME_INTR_MASK_CLR, JME_INTRS);
2024
2025         status = CSR_READ_4(sc, JME_INTR_STATUS);
2026         if ((status & JME_INTRS) == 0 || status == 0xFFFFFFFF)
2027                 goto back;
2028
2029         /* Reset PCC counter/timer and Ack interrupts. */
2030         status &= ~(INTR_TXQ_COMP | INTR_RXQ_COMP);
2031         if (status & (INTR_TXQ_COAL | INTR_TXQ_COAL_TO))
2032                 status |= INTR_TXQ_COAL | INTR_TXQ_COAL_TO | INTR_TXQ_COMP;
2033         if (status & (INTR_RXQ_COAL | INTR_RXQ_COAL_TO))
2034                 status |= INTR_RXQ_COAL | INTR_RXQ_COAL_TO | INTR_RXQ_COMP;
2035         CSR_WRITE_4(sc, JME_INTR_STATUS, status);
2036
2037         if (ifp->if_flags & IFF_RUNNING) {
2038                 if (status & (INTR_RXQ_COAL | INTR_RXQ_COAL_TO))
2039                         jme_rxeof(sc, -1);
2040
2041                 if (status & INTR_RXQ_DESC_EMPTY) {
2042                         /*
2043                          * Notify hardware availability of new Rx buffers.
2044                          * Reading RXCSR takes very long time under heavy
2045                          * load so cache RXCSR value and writes the ORed
2046                          * value with the kick command to the RXCSR. This
2047                          * saves one register access cycle.
2048                          */
2049                         CSR_WRITE_4(sc, JME_RXCSR, sc->jme_rxcsr |
2050                             RXCSR_RX_ENB | RXCSR_RXQ_START);
2051                 }
2052
2053                 if (status & (INTR_TXQ_COAL | INTR_TXQ_COAL_TO)) {
2054                         jme_txeof(sc);
2055                         if (!ifq_is_empty(&ifp->if_snd))
2056                                 if_devstart(ifp);
2057                 }
2058         }
2059 back:
2060         /* Reenable interrupts. */
2061         CSR_WRITE_4(sc, JME_INTR_MASK_SET, JME_INTRS);
2062 }
2063
2064 static void
2065 jme_txeof(struct jme_softc *sc)
2066 {
2067         struct ifnet *ifp = &sc->arpcom.ac_if;
2068         struct jme_txdesc *txd;
2069         uint32_t status;
2070         int cons, nsegs;
2071
2072         cons = sc->jme_cdata.jme_tx_cons;
2073         if (cons == sc->jme_cdata.jme_tx_prod)
2074                 return;
2075
2076         bus_dmamap_sync(sc->jme_cdata.jme_tx_ring_tag,
2077                         sc->jme_cdata.jme_tx_ring_map,
2078                         BUS_DMASYNC_POSTREAD);
2079
2080         /*
2081          * Go through our Tx list and free mbufs for those
2082          * frames which have been transmitted.
2083          */
2084         while (cons != sc->jme_cdata.jme_tx_prod) {
2085                 txd = &sc->jme_cdata.jme_txdesc[cons];
2086                 KASSERT(txd->tx_m != NULL,
2087                         ("%s: freeing NULL mbuf!\n", __func__));
2088
2089                 status = le32toh(txd->tx_desc->flags);
2090                 if ((status & JME_TD_OWN) == JME_TD_OWN)
2091                         break;
2092
2093                 if (status & (JME_TD_TMOUT | JME_TD_RETRY_EXP)) {
2094                         ifp->if_oerrors++;
2095                 } else {
2096                         ifp->if_opackets++;
2097                         if (status & JME_TD_COLLISION) {
2098                                 ifp->if_collisions +=
2099                                     le32toh(txd->tx_desc->buflen) &
2100                                     JME_TD_BUF_LEN_MASK;
2101                         }
2102                 }
2103
2104                 /*
2105                  * Only the first descriptor of multi-descriptor
2106                  * transmission is updated so driver have to skip entire
2107                  * chained buffers for the transmiited frame. In other
2108                  * words, JME_TD_OWN bit is valid only at the first
2109                  * descriptor of a multi-descriptor transmission.
2110                  */
2111                 for (nsegs = 0; nsegs < txd->tx_ndesc; nsegs++) {
2112                         sc->jme_cdata.jme_tx_ring[cons].flags = 0;
2113                         JME_DESC_INC(cons, sc->jme_tx_desc_cnt);
2114                 }
2115
2116                 /* Reclaim transferred mbufs. */
2117                 bus_dmamap_unload(sc->jme_cdata.jme_tx_tag, txd->tx_dmamap);
2118                 m_freem(txd->tx_m);
2119                 txd->tx_m = NULL;
2120                 sc->jme_cdata.jme_tx_cnt -= txd->tx_ndesc;
2121                 KASSERT(sc->jme_cdata.jme_tx_cnt >= 0,
2122                         ("%s: Active Tx desc counter was garbled\n", __func__));
2123                 txd->tx_ndesc = 0;
2124         }
2125         sc->jme_cdata.jme_tx_cons = cons;
2126
2127         if (sc->jme_cdata.jme_tx_cnt == 0)
2128                 ifp->if_timer = 0;
2129
2130         if (sc->jme_cdata.jme_tx_cnt + sc->jme_txd_spare <=
2131             sc->jme_tx_desc_cnt - JME_TXD_RSVD)
2132                 ifp->if_flags &= ~IFF_OACTIVE;
2133
2134         bus_dmamap_sync(sc->jme_cdata.jme_tx_ring_tag,
2135                         sc->jme_cdata.jme_tx_ring_map,
2136                         BUS_DMASYNC_PREWRITE);
2137 }
2138
2139 static __inline void
2140 jme_discard_rxbufs(struct jme_softc *sc, int cons, int count)
2141 {
2142         int i;
2143
2144         for (i = 0; i < count; ++i) {
2145                 struct jme_desc *desc = &sc->jme_cdata.jme_rx_ring[cons];
2146
2147                 desc->flags = htole32(JME_RD_OWN | JME_RD_INTR | JME_RD_64BIT);
2148                 desc->buflen = htole32(MCLBYTES);
2149                 JME_DESC_INC(cons, sc->jme_rx_desc_cnt);
2150         }
2151 }
2152
2153 /* Receive a frame. */
2154 static void
2155 jme_rxpkt(struct jme_softc *sc, struct mbuf_chain *chain)
2156 {
2157         struct ifnet *ifp = &sc->arpcom.ac_if;
2158         struct jme_desc *desc;
2159         struct jme_rxdesc *rxd;
2160         struct mbuf *mp, *m;
2161         uint32_t flags, status;
2162         int cons, count, nsegs;
2163
2164         cons = sc->jme_cdata.jme_rx_cons;
2165         desc = &sc->jme_cdata.jme_rx_ring[cons];
2166         flags = le32toh(desc->flags);
2167         status = le32toh(desc->buflen);
2168         nsegs = JME_RX_NSEGS(status);
2169
2170         if (status & JME_RX_ERR_STAT) {
2171                 ifp->if_ierrors++;
2172                 jme_discard_rxbufs(sc, cons, nsegs);
2173 #ifdef JME_SHOW_ERRORS
2174                 device_printf(sc->jme_dev, "%s : receive error = 0x%b\n",
2175                     __func__, JME_RX_ERR(status), JME_RX_ERR_BITS);
2176 #endif
2177                 sc->jme_cdata.jme_rx_cons += nsegs;
2178                 sc->jme_cdata.jme_rx_cons %= sc->jme_rx_desc_cnt;
2179                 return;
2180         }
2181
2182         sc->jme_cdata.jme_rxlen = JME_RX_BYTES(status) - JME_RX_PAD_BYTES;
2183         for (count = 0; count < nsegs; count++,
2184              JME_DESC_INC(cons, sc->jme_rx_desc_cnt)) {
2185                 rxd = &sc->jme_cdata.jme_rxdesc[cons];
2186                 mp = rxd->rx_m;
2187
2188                 /* Add a new receive buffer to the ring. */
2189                 if (jme_newbuf(sc, rxd, 0) != 0) {
2190                         ifp->if_iqdrops++;
2191                         /* Reuse buffer. */
2192                         jme_discard_rxbufs(sc, cons, nsegs - count);
2193                         if (sc->jme_cdata.jme_rxhead != NULL) {
2194                                 m_freem(sc->jme_cdata.jme_rxhead);
2195                                 JME_RXCHAIN_RESET(sc);
2196                         }
2197                         break;
2198                 }
2199
2200                 /*
2201                  * Assume we've received a full sized frame.
2202                  * Actual size is fixed when we encounter the end of
2203                  * multi-segmented frame.
2204                  */
2205                 mp->m_len = MCLBYTES;
2206
2207                 /* Chain received mbufs. */
2208                 if (sc->jme_cdata.jme_rxhead == NULL) {
2209                         sc->jme_cdata.jme_rxhead = mp;
2210                         sc->jme_cdata.jme_rxtail = mp;
2211                 } else {
2212                         /*
2213                          * Receive processor can receive a maximum frame
2214                          * size of 65535 bytes.
2215                          */
2216                         mp->m_flags &= ~M_PKTHDR;
2217                         sc->jme_cdata.jme_rxtail->m_next = mp;
2218                         sc->jme_cdata.jme_rxtail = mp;
2219                 }
2220
2221                 if (count == nsegs - 1) {
2222                         /* Last desc. for this frame. */
2223                         m = sc->jme_cdata.jme_rxhead;
2224                         /* XXX assert PKTHDR? */
2225                         m->m_flags |= M_PKTHDR;
2226                         m->m_pkthdr.len = sc->jme_cdata.jme_rxlen;
2227                         if (nsegs > 1) {
2228                                 /* Set first mbuf size. */
2229                                 m->m_len = MCLBYTES - JME_RX_PAD_BYTES;
2230                                 /* Set last mbuf size. */
2231                                 mp->m_len = sc->jme_cdata.jme_rxlen -
2232                                     ((MCLBYTES - JME_RX_PAD_BYTES) +
2233                                     (MCLBYTES * (nsegs - 2)));
2234                         } else {
2235                                 m->m_len = sc->jme_cdata.jme_rxlen;
2236                         }
2237                         m->m_pkthdr.rcvif = ifp;
2238
2239                         /*
2240                          * Account for 10bytes auto padding which is used
2241                          * to align IP header on 32bit boundary. Also note,
2242                          * CRC bytes is automatically removed by the
2243                          * hardware.
2244                          */
2245                         m->m_data += JME_RX_PAD_BYTES;
2246
2247                         /* Set checksum information. */
2248                         if ((ifp->if_capenable & IFCAP_RXCSUM) &&
2249                             (flags & JME_RD_IPV4)) {
2250                                 m->m_pkthdr.csum_flags |= CSUM_IP_CHECKED;
2251                                 if (flags & JME_RD_IPCSUM)
2252                                         m->m_pkthdr.csum_flags |= CSUM_IP_VALID;
2253                                 if ((flags & JME_RD_MORE_FRAG) == 0 &&
2254                                     ((flags & (JME_RD_TCP | JME_RD_TCPCSUM)) ==
2255                                      (JME_RD_TCP | JME_RD_TCPCSUM) ||
2256                                      (flags & (JME_RD_UDP | JME_RD_UDPCSUM)) ==
2257                                      (JME_RD_UDP | JME_RD_UDPCSUM))) {
2258                                         m->m_pkthdr.csum_flags |=
2259                                             CSUM_DATA_VALID | CSUM_PSEUDO_HDR;
2260                                         m->m_pkthdr.csum_data = 0xffff;
2261                                 }
2262                         }
2263
2264                         /* Check for VLAN tagged packets. */
2265                         if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) &&
2266                             (flags & JME_RD_VLAN_TAG)) {
2267                                 m->m_pkthdr.ether_vlantag =
2268                                     flags & JME_RD_VLAN_MASK;
2269                                 m->m_flags |= M_VLANTAG;
2270                         }
2271
2272                         ifp->if_ipackets++;
2273                         /* Pass it on. */
2274                         ether_input_chain(ifp, m, chain);
2275
2276                         /* Reset mbuf chains. */
2277                         JME_RXCHAIN_RESET(sc);
2278                 }
2279         }
2280
2281         sc->jme_cdata.jme_rx_cons += nsegs;
2282         sc->jme_cdata.jme_rx_cons %= sc->jme_rx_desc_cnt;
2283 }
2284
2285 static void
2286 jme_rxeof(struct jme_softc *sc, int count)
2287 {
2288         struct jme_desc *desc;
2289         int nsegs, prog, pktlen;
2290         struct mbuf_chain chain[MAXCPU];
2291
2292         ether_input_chain_init(chain);
2293
2294         bus_dmamap_sync(sc->jme_cdata.jme_rx_ring_tag,
2295                         sc->jme_cdata.jme_rx_ring_map,
2296                         BUS_DMASYNC_POSTREAD);
2297
2298         prog = 0;
2299         for (;;) {
2300 #ifdef DEVICE_POLLING
2301                 if (count >= 0 && count-- == 0)
2302                         break;
2303 #endif
2304                 desc = &sc->jme_cdata.jme_rx_ring[sc->jme_cdata.jme_rx_cons];
2305                 if ((le32toh(desc->flags) & JME_RD_OWN) == JME_RD_OWN)
2306                         break;
2307                 if ((le32toh(desc->buflen) & JME_RD_VALID) == 0)
2308                         break;
2309
2310                 /*
2311                  * Check number of segments against received bytes.
2312                  * Non-matching value would indicate that hardware
2313                  * is still trying to update Rx descriptors. I'm not
2314                  * sure whether this check is needed.
2315                  */
2316                 nsegs = JME_RX_NSEGS(le32toh(desc->buflen));
2317                 pktlen = JME_RX_BYTES(le32toh(desc->buflen));
2318                 if (nsegs != howmany(pktlen, MCLBYTES)) {
2319                         if_printf(&sc->arpcom.ac_if, "RX fragment count(%d) "
2320                                   "and packet size(%d) mismach\n",
2321                                   nsegs, pktlen);
2322                         break;
2323                 }
2324
2325                 /* Received a frame. */
2326                 jme_rxpkt(sc, chain);
2327                 prog++;
2328         }
2329
2330         if (prog > 0) {
2331                 bus_dmamap_sync(sc->jme_cdata.jme_rx_ring_tag,
2332                                 sc->jme_cdata.jme_rx_ring_map,
2333                                 BUS_DMASYNC_PREWRITE);
2334                 ether_input_dispatch(chain);
2335         }
2336 }
2337
2338 static void
2339 jme_tick(void *xsc)
2340 {
2341         struct jme_softc *sc = xsc;
2342         struct ifnet *ifp = &sc->arpcom.ac_if;
2343         struct mii_data *mii = device_get_softc(sc->jme_miibus);
2344
2345         lwkt_serialize_enter(ifp->if_serializer);
2346
2347         mii_tick(mii);
2348         callout_reset(&sc->jme_tick_ch, hz, jme_tick, sc);
2349
2350         lwkt_serialize_exit(ifp->if_serializer);
2351 }
2352
2353 static void
2354 jme_reset(struct jme_softc *sc)
2355 {
2356 #ifdef foo
2357         /* Stop receiver, transmitter. */
2358         jme_stop_rx(sc);
2359         jme_stop_tx(sc);
2360 #endif
2361         CSR_WRITE_4(sc, JME_GHC, GHC_RESET);
2362         DELAY(10);
2363         CSR_WRITE_4(sc, JME_GHC, 0);
2364 }
2365
2366 static void
2367 jme_init(void *xsc)
2368 {
2369         struct jme_softc *sc = xsc;
2370         struct ifnet *ifp = &sc->arpcom.ac_if;
2371         struct mii_data *mii;
2372         uint8_t eaddr[ETHER_ADDR_LEN];
2373         bus_addr_t paddr;
2374         uint32_t reg;
2375         int error;
2376
2377         ASSERT_SERIALIZED(ifp->if_serializer);
2378
2379         /*
2380          * Cancel any pending I/O.
2381          */
2382         jme_stop(sc);
2383
2384         /*
2385          * Reset the chip to a known state.
2386          */
2387         jme_reset(sc);
2388
2389         sc->jme_txd_spare =
2390         howmany(ifp->if_mtu + sizeof(struct ether_vlan_header), MCLBYTES);
2391         KKASSERT(sc->jme_txd_spare >= 1);
2392
2393         /*
2394          * If we use 64bit address mode for transmitting, each Tx request
2395          * needs one more symbol descriptor.
2396          */
2397         if (sc->jme_lowaddr != BUS_SPACE_MAXADDR_32BIT)
2398                 sc->jme_txd_spare += 1;
2399
2400         /* Init descriptors. */
2401         error = jme_init_rx_ring(sc);
2402         if (error != 0) {
2403                 device_printf(sc->jme_dev,
2404                     "%s: initialization failed: no memory for Rx buffers.\n",
2405                     __func__);
2406                 jme_stop(sc);
2407                 return;
2408         }
2409         jme_init_tx_ring(sc);
2410
2411         /* Initialize shadow status block. */
2412         jme_init_ssb(sc);
2413
2414         /* Reprogram the station address. */
2415         bcopy(IF_LLADDR(ifp), eaddr, ETHER_ADDR_LEN);
2416         CSR_WRITE_4(sc, JME_PAR0,
2417             eaddr[3] << 24 | eaddr[2] << 16 | eaddr[1] << 8 | eaddr[0]);
2418         CSR_WRITE_4(sc, JME_PAR1, eaddr[5] << 8 | eaddr[4]);
2419
2420         /*
2421          * Configure Tx queue.
2422          *  Tx priority queue weight value : 0
2423          *  Tx FIFO threshold for processing next packet : 16QW
2424          *  Maximum Tx DMA length : 512
2425          *  Allow Tx DMA burst.
2426          */
2427         sc->jme_txcsr = TXCSR_TXQ_N_SEL(TXCSR_TXQ0);
2428         sc->jme_txcsr |= TXCSR_TXQ_WEIGHT(TXCSR_TXQ_WEIGHT_MIN);
2429         sc->jme_txcsr |= TXCSR_FIFO_THRESH_16QW;
2430         sc->jme_txcsr |= sc->jme_tx_dma_size;
2431         sc->jme_txcsr |= TXCSR_DMA_BURST;
2432         CSR_WRITE_4(sc, JME_TXCSR, sc->jme_txcsr);
2433
2434         /* Set Tx descriptor counter. */
2435         CSR_WRITE_4(sc, JME_TXQDC, sc->jme_tx_desc_cnt);
2436
2437         /* Set Tx ring address to the hardware. */
2438         paddr = sc->jme_cdata.jme_tx_ring_paddr;
2439         CSR_WRITE_4(sc, JME_TXDBA_HI, JME_ADDR_HI(paddr));
2440         CSR_WRITE_4(sc, JME_TXDBA_LO, JME_ADDR_LO(paddr));
2441
2442         /* Configure TxMAC parameters. */
2443         reg = TXMAC_IFG1_DEFAULT | TXMAC_IFG2_DEFAULT | TXMAC_IFG_ENB;
2444         reg |= TXMAC_THRESH_1_PKT;
2445         reg |= TXMAC_CRC_ENB | TXMAC_PAD_ENB;
2446         CSR_WRITE_4(sc, JME_TXMAC, reg);
2447
2448         /*
2449          * Configure Rx queue.
2450          *  FIFO full threshold for transmitting Tx pause packet : 128T
2451          *  FIFO threshold for processing next packet : 128QW
2452          *  Rx queue 0 select
2453          *  Max Rx DMA length : 128
2454          *  Rx descriptor retry : 32
2455          *  Rx descriptor retry time gap : 256ns
2456          *  Don't receive runt/bad frame.
2457          */
2458         sc->jme_rxcsr = RXCSR_FIFO_FTHRESH_128T;
2459         /*
2460          * Since Rx FIFO size is 4K bytes, receiving frames larger
2461          * than 4K bytes will suffer from Rx FIFO overruns. So
2462          * decrease FIFO threshold to reduce the FIFO overruns for
2463          * frames larger than 4000 bytes.
2464          * For best performance of standard MTU sized frames use
2465          * maximum allowable FIFO threshold, 128QW.
2466          */
2467         if ((ifp->if_mtu + ETHER_HDR_LEN + EVL_ENCAPLEN + ETHER_CRC_LEN) >
2468             JME_RX_FIFO_SIZE)
2469                 sc->jme_rxcsr |= RXCSR_FIFO_THRESH_16QW;
2470         else
2471                 sc->jme_rxcsr |= RXCSR_FIFO_THRESH_128QW;
2472         sc->jme_rxcsr |= sc->jme_rx_dma_size | RXCSR_RXQ_N_SEL(RXCSR_RXQ0);
2473         sc->jme_rxcsr |= RXCSR_DESC_RT_CNT(RXCSR_DESC_RT_CNT_DEFAULT);
2474         sc->jme_rxcsr |= RXCSR_DESC_RT_GAP_256 & RXCSR_DESC_RT_GAP_MASK;
2475         /* XXX TODO DROP_BAD */
2476         CSR_WRITE_4(sc, JME_RXCSR, sc->jme_rxcsr);
2477
2478         /* Set Rx descriptor counter. */
2479         CSR_WRITE_4(sc, JME_RXQDC, sc->jme_rx_desc_cnt);
2480
2481         /* Set Rx ring address to the hardware. */
2482         paddr = sc->jme_cdata.jme_rx_ring_paddr;
2483         CSR_WRITE_4(sc, JME_RXDBA_HI, JME_ADDR_HI(paddr));
2484         CSR_WRITE_4(sc, JME_RXDBA_LO, JME_ADDR_LO(paddr));
2485
2486         /* Clear receive filter. */
2487         CSR_WRITE_4(sc, JME_RXMAC, 0);
2488
2489         /* Set up the receive filter. */
2490         jme_set_filter(sc);
2491         jme_set_vlan(sc);
2492
2493         /*
2494          * Disable all WOL bits as WOL can interfere normal Rx
2495          * operation. Also clear WOL detection status bits.
2496          */
2497         reg = CSR_READ_4(sc, JME_PMCS);
2498         reg &= ~PMCS_WOL_ENB_MASK;
2499         CSR_WRITE_4(sc, JME_PMCS, reg);
2500
2501         /*
2502          * Pad 10bytes right before received frame. This will greatly
2503          * help Rx performance on strict-alignment architectures as
2504          * it does not need to copy the frame to align the payload.
2505          */
2506         reg = CSR_READ_4(sc, JME_RXMAC);
2507         reg |= RXMAC_PAD_10BYTES;
2508
2509         if (ifp->if_capenable & IFCAP_RXCSUM)
2510                 reg |= RXMAC_CSUM_ENB;
2511         CSR_WRITE_4(sc, JME_RXMAC, reg);
2512
2513         /* Configure general purpose reg0 */
2514         reg = CSR_READ_4(sc, JME_GPREG0);
2515         reg &= ~GPREG0_PCC_UNIT_MASK;
2516         /* Set PCC timer resolution to micro-seconds unit. */
2517         reg |= GPREG0_PCC_UNIT_US;
2518         /*
2519          * Disable all shadow register posting as we have to read
2520          * JME_INTR_STATUS register in jme_intr. Also it seems
2521          * that it's hard to synchronize interrupt status between
2522          * hardware and software with shadow posting due to
2523          * requirements of bus_dmamap_sync(9).
2524          */
2525         reg |= GPREG0_SH_POST_DW7_DIS | GPREG0_SH_POST_DW6_DIS |
2526             GPREG0_SH_POST_DW5_DIS | GPREG0_SH_POST_DW4_DIS |
2527             GPREG0_SH_POST_DW3_DIS | GPREG0_SH_POST_DW2_DIS |
2528             GPREG0_SH_POST_DW1_DIS | GPREG0_SH_POST_DW0_DIS;
2529         /* Disable posting of DW0. */
2530         reg &= ~GPREG0_POST_DW0_ENB;
2531         /* Clear PME message. */
2532         reg &= ~GPREG0_PME_ENB;
2533         /* Set PHY address. */
2534         reg &= ~GPREG0_PHY_ADDR_MASK;
2535         reg |= sc->jme_phyaddr;
2536         CSR_WRITE_4(sc, JME_GPREG0, reg);
2537
2538         /* Configure Tx queue 0 packet completion coalescing. */
2539         jme_set_tx_coal(sc);
2540
2541         /* Configure Rx queue 0 packet completion coalescing. */
2542         jme_set_rx_coal(sc);
2543
2544         /* Configure shadow status block but don't enable posting. */
2545         paddr = sc->jme_cdata.jme_ssb_block_paddr;
2546         CSR_WRITE_4(sc, JME_SHBASE_ADDR_HI, JME_ADDR_HI(paddr));
2547         CSR_WRITE_4(sc, JME_SHBASE_ADDR_LO, JME_ADDR_LO(paddr));
2548
2549         /* Disable Timer 1 and Timer 2. */
2550         CSR_WRITE_4(sc, JME_TIMER1, 0);
2551         CSR_WRITE_4(sc, JME_TIMER2, 0);
2552
2553         /* Configure retry transmit period, retry limit value. */
2554         CSR_WRITE_4(sc, JME_TXTRHD,
2555             ((TXTRHD_RT_PERIOD_DEFAULT << TXTRHD_RT_PERIOD_SHIFT) &
2556             TXTRHD_RT_PERIOD_MASK) |
2557             ((TXTRHD_RT_LIMIT_DEFAULT << TXTRHD_RT_LIMIT_SHIFT) &
2558             TXTRHD_RT_LIMIT_SHIFT));
2559
2560         /* Disable RSS. */
2561         CSR_WRITE_4(sc, JME_RSSC, RSSC_DIS_RSS);
2562
2563 #ifdef DEVICE_POLLING
2564         if (!(ifp->if_flags & IFF_POLLING))
2565 #endif
2566         /* Initialize the interrupt mask. */
2567         CSR_WRITE_4(sc, JME_INTR_MASK_SET, JME_INTRS);
2568         CSR_WRITE_4(sc, JME_INTR_STATUS, 0xFFFFFFFF);
2569
2570         /*
2571          * Enabling Tx/Rx DMA engines and Rx queue processing is
2572          * done after detection of valid link in jme_miibus_statchg.
2573          */
2574         sc->jme_flags &= ~JME_FLAG_LINK;
2575
2576         /* Set the current media. */
2577         mii = device_get_softc(sc->jme_miibus);
2578         mii_mediachg(mii);
2579
2580         callout_reset(&sc->jme_tick_ch, hz, jme_tick, sc);
2581
2582         ifp->if_flags |= IFF_RUNNING;
2583         ifp->if_flags &= ~IFF_OACTIVE;
2584 }
2585
2586 static void
2587 jme_stop(struct jme_softc *sc)
2588 {
2589         struct ifnet *ifp = &sc->arpcom.ac_if;
2590         struct jme_txdesc *txd;
2591         struct jme_rxdesc *rxd;
2592         int i;
2593
2594         ASSERT_SERIALIZED(ifp->if_serializer);
2595
2596         /*
2597          * Mark the interface down and cancel the watchdog timer.
2598          */
2599         ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
2600         ifp->if_timer = 0;
2601
2602         callout_stop(&sc->jme_tick_ch);
2603         sc->jme_flags &= ~JME_FLAG_LINK;
2604
2605         /*
2606          * Disable interrupts.
2607          */
2608         CSR_WRITE_4(sc, JME_INTR_MASK_CLR, JME_INTRS);
2609         CSR_WRITE_4(sc, JME_INTR_STATUS, 0xFFFFFFFF);
2610
2611         /* Disable updating shadow status block. */
2612         CSR_WRITE_4(sc, JME_SHBASE_ADDR_LO,
2613             CSR_READ_4(sc, JME_SHBASE_ADDR_LO) & ~SHBASE_POST_ENB);
2614
2615         /* Stop receiver, transmitter. */
2616         jme_stop_rx(sc);
2617         jme_stop_tx(sc);
2618
2619 #ifdef foo
2620          /* Reclaim Rx/Tx buffers that have been completed. */
2621         jme_rxeof(sc);
2622         if (sc->jme_cdata.jme_rxhead != NULL)
2623                 m_freem(sc->jme_cdata.jme_rxhead);
2624         JME_RXCHAIN_RESET(sc);
2625         jme_txeof(sc);
2626 #endif
2627
2628         /*
2629          * Free partial finished RX segments
2630          */
2631         if (sc->jme_cdata.jme_rxhead != NULL)
2632                 m_freem(sc->jme_cdata.jme_rxhead);
2633         JME_RXCHAIN_RESET(sc);
2634
2635         /*
2636          * Free RX and TX mbufs still in the queues.
2637          */
2638         for (i = 0; i < sc->jme_rx_desc_cnt; i++) {
2639                 rxd = &sc->jme_cdata.jme_rxdesc[i];
2640                 if (rxd->rx_m != NULL) {
2641                         bus_dmamap_unload(sc->jme_cdata.jme_rx_tag,
2642                             rxd->rx_dmamap);
2643                         m_freem(rxd->rx_m);
2644                         rxd->rx_m = NULL;
2645                 }
2646         }
2647         for (i = 0; i < sc->jme_tx_desc_cnt; i++) {
2648                 txd = &sc->jme_cdata.jme_txdesc[i];
2649                 if (txd->tx_m != NULL) {
2650                         bus_dmamap_unload(sc->jme_cdata.jme_tx_tag,
2651                             txd->tx_dmamap);
2652                         m_freem(txd->tx_m);
2653                         txd->tx_m = NULL;
2654                         txd->tx_ndesc = 0;
2655                 }
2656         }
2657 }
2658
2659 static void
2660 jme_stop_tx(struct jme_softc *sc)
2661 {
2662         uint32_t reg;
2663         int i;
2664
2665         reg = CSR_READ_4(sc, JME_TXCSR);
2666         if ((reg & TXCSR_TX_ENB) == 0)
2667                 return;
2668         reg &= ~TXCSR_TX_ENB;
2669         CSR_WRITE_4(sc, JME_TXCSR, reg);
2670         for (i = JME_TIMEOUT; i > 0; i--) {
2671                 DELAY(1);
2672                 if ((CSR_READ_4(sc, JME_TXCSR) & TXCSR_TX_ENB) == 0)
2673                         break;
2674         }
2675         if (i == 0)
2676                 device_printf(sc->jme_dev, "stopping transmitter timeout!\n");
2677 }
2678
2679 static void
2680 jme_stop_rx(struct jme_softc *sc)
2681 {
2682         uint32_t reg;
2683         int i;
2684
2685         reg = CSR_READ_4(sc, JME_RXCSR);
2686         if ((reg & RXCSR_RX_ENB) == 0)
2687                 return;
2688         reg &= ~RXCSR_RX_ENB;
2689         CSR_WRITE_4(sc, JME_RXCSR, reg);
2690         for (i = JME_TIMEOUT; i > 0; i--) {
2691                 DELAY(1);
2692                 if ((CSR_READ_4(sc, JME_RXCSR) & RXCSR_RX_ENB) == 0)
2693                         break;
2694         }
2695         if (i == 0)
2696                 device_printf(sc->jme_dev, "stopping recevier timeout!\n");
2697 }
2698
2699 static void
2700 jme_init_tx_ring(struct jme_softc *sc)
2701 {
2702         struct jme_chain_data *cd;
2703         struct jme_txdesc *txd;
2704         int i;
2705
2706         sc->jme_cdata.jme_tx_prod = 0;
2707         sc->jme_cdata.jme_tx_cons = 0;
2708         sc->jme_cdata.jme_tx_cnt = 0;
2709
2710         cd = &sc->jme_cdata;
2711         bzero(cd->jme_tx_ring, JME_TX_RING_SIZE(sc));
2712         for (i = 0; i < sc->jme_tx_desc_cnt; i++) {
2713                 txd = &sc->jme_cdata.jme_txdesc[i];
2714                 txd->tx_m = NULL;
2715                 txd->tx_desc = &cd->jme_tx_ring[i];
2716                 txd->tx_ndesc = 0;
2717         }
2718
2719         bus_dmamap_sync(sc->jme_cdata.jme_tx_ring_tag,
2720                         sc->jme_cdata.jme_tx_ring_map,
2721                         BUS_DMASYNC_PREWRITE);
2722 }
2723
2724 static void
2725 jme_init_ssb(struct jme_softc *sc)
2726 {
2727         struct jme_chain_data *cd;
2728
2729         cd = &sc->jme_cdata;
2730         bzero(cd->jme_ssb_block, JME_SSB_SIZE);
2731         bus_dmamap_sync(sc->jme_cdata.jme_ssb_tag, sc->jme_cdata.jme_ssb_map,
2732                         BUS_DMASYNC_PREWRITE);
2733 }
2734
2735 static int
2736 jme_init_rx_ring(struct jme_softc *sc)
2737 {
2738         struct jme_chain_data *cd;
2739         struct jme_rxdesc *rxd;
2740         int i;
2741
2742         KKASSERT(sc->jme_cdata.jme_rxhead == NULL &&
2743                  sc->jme_cdata.jme_rxtail == NULL &&
2744                  sc->jme_cdata.jme_rxlen == 0);
2745         sc->jme_cdata.jme_rx_cons = 0;
2746
2747         cd = &sc->jme_cdata;
2748         bzero(cd->jme_rx_ring, JME_RX_RING_SIZE(sc));
2749         for (i = 0; i < sc->jme_rx_desc_cnt; i++) {
2750                 int error;
2751
2752                 rxd = &sc->jme_cdata.jme_rxdesc[i];
2753                 rxd->rx_m = NULL;
2754                 rxd->rx_desc = &cd->jme_rx_ring[i];
2755                 error = jme_newbuf(sc, rxd, 1);
2756                 if (error)
2757                         return (error);
2758         }
2759
2760         bus_dmamap_sync(sc->jme_cdata.jme_rx_ring_tag,
2761                         sc->jme_cdata.jme_rx_ring_map,
2762                         BUS_DMASYNC_PREWRITE);
2763         return (0);
2764 }
2765
2766 static int
2767 jme_newbuf(struct jme_softc *sc, struct jme_rxdesc *rxd, int init)
2768 {
2769         struct jme_desc *desc;
2770         struct mbuf *m;
2771         struct jme_dmamap_ctx ctx;
2772         bus_dma_segment_t segs;
2773         bus_dmamap_t map;
2774         int error;
2775
2776         m = m_getcl(init ? MB_WAIT : MB_DONTWAIT, MT_DATA, M_PKTHDR);
2777         if (m == NULL)
2778                 return (ENOBUFS);
2779         /*
2780          * JMC250 has 64bit boundary alignment limitation so jme(4)
2781          * takes advantage of 10 bytes padding feature of hardware
2782          * in order not to copy entire frame to align IP header on
2783          * 32bit boundary.
2784          */
2785         m->m_len = m->m_pkthdr.len = MCLBYTES;
2786
2787         ctx.nsegs = 1;
2788         ctx.segs = &segs;
2789         error = bus_dmamap_load_mbuf(sc->jme_cdata.jme_rx_tag,
2790                                      sc->jme_cdata.jme_rx_sparemap,
2791                                      m, jme_dmamap_buf_cb, &ctx,
2792                                      BUS_DMA_NOWAIT);
2793         if (error || ctx.nsegs == 0) {
2794                 if (!error) {
2795                         bus_dmamap_unload(sc->jme_cdata.jme_rx_tag,
2796                                           sc->jme_cdata.jme_rx_sparemap);
2797                         error = EFBIG;
2798                         if_printf(&sc->arpcom.ac_if, "too many segments?!\n");
2799                 }
2800                 m_freem(m);
2801
2802                 if (init)
2803                         if_printf(&sc->arpcom.ac_if, "can't load RX mbuf\n");
2804                 return (error);
2805         }
2806
2807         if (rxd->rx_m != NULL) {
2808                 bus_dmamap_sync(sc->jme_cdata.jme_rx_tag, rxd->rx_dmamap,
2809                                 BUS_DMASYNC_POSTREAD);
2810                 bus_dmamap_unload(sc->jme_cdata.jme_rx_tag, rxd->rx_dmamap);
2811         }
2812         map = rxd->rx_dmamap;
2813         rxd->rx_dmamap = sc->jme_cdata.jme_rx_sparemap;
2814         sc->jme_cdata.jme_rx_sparemap = map;
2815         rxd->rx_m = m;
2816
2817         desc = rxd->rx_desc;
2818         desc->buflen = htole32(segs.ds_len);
2819         desc->addr_lo = htole32(JME_ADDR_LO(segs.ds_addr));
2820         desc->addr_hi = htole32(JME_ADDR_HI(segs.ds_addr));
2821         desc->flags = htole32(JME_RD_OWN | JME_RD_INTR | JME_RD_64BIT);
2822
2823         return (0);
2824 }
2825
2826 static void
2827 jme_set_vlan(struct jme_softc *sc)
2828 {
2829         struct ifnet *ifp = &sc->arpcom.ac_if;
2830         uint32_t reg;
2831
2832         ASSERT_SERIALIZED(ifp->if_serializer);
2833
2834         reg = CSR_READ_4(sc, JME_RXMAC);
2835         reg &= ~RXMAC_VLAN_ENB;
2836         if (ifp->if_capenable & IFCAP_VLAN_HWTAGGING)
2837                 reg |= RXMAC_VLAN_ENB;
2838         CSR_WRITE_4(sc, JME_RXMAC, reg);
2839 }
2840
2841 static void
2842 jme_set_filter(struct jme_softc *sc)
2843 {
2844         struct ifnet *ifp = &sc->arpcom.ac_if;
2845         struct ifmultiaddr *ifma;
2846         uint32_t crc;
2847         uint32_t mchash[2];
2848         uint32_t rxcfg;
2849
2850         ASSERT_SERIALIZED(ifp->if_serializer);
2851
2852         rxcfg = CSR_READ_4(sc, JME_RXMAC);
2853         rxcfg &= ~(RXMAC_BROADCAST | RXMAC_PROMISC | RXMAC_MULTICAST |
2854             RXMAC_ALLMULTI);
2855
2856         /*
2857          * Always accept frames destined to our station address.
2858          * Always accept broadcast frames.
2859          */
2860         rxcfg |= RXMAC_UNICAST | RXMAC_BROADCAST;
2861
2862         if (ifp->if_flags & (IFF_PROMISC | IFF_ALLMULTI)) {
2863                 if (ifp->if_flags & IFF_PROMISC)
2864                         rxcfg |= RXMAC_PROMISC;
2865                 if (ifp->if_flags & IFF_ALLMULTI)
2866                         rxcfg |= RXMAC_ALLMULTI;
2867                 CSR_WRITE_4(sc, JME_MAR0, 0xFFFFFFFF);
2868                 CSR_WRITE_4(sc, JME_MAR1, 0xFFFFFFFF);
2869                 CSR_WRITE_4(sc, JME_RXMAC, rxcfg);
2870                 return;
2871         }
2872
2873         /*
2874          * Set up the multicast address filter by passing all multicast
2875          * addresses through a CRC generator, and then using the low-order
2876          * 6 bits as an index into the 64 bit multicast hash table.  The
2877          * high order bits select the register, while the rest of the bits
2878          * select the bit within the register.
2879          */
2880         rxcfg |= RXMAC_MULTICAST;
2881         bzero(mchash, sizeof(mchash));
2882
2883         LIST_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
2884                 if (ifma->ifma_addr->sa_family != AF_LINK)
2885                         continue;
2886                 crc = ether_crc32_be(LLADDR((struct sockaddr_dl *)
2887                     ifma->ifma_addr), ETHER_ADDR_LEN);
2888
2889                 /* Just want the 6 least significant bits. */
2890                 crc &= 0x3f;
2891
2892                 /* Set the corresponding bit in the hash table. */
2893                 mchash[crc >> 5] |= 1 << (crc & 0x1f);
2894         }
2895
2896         CSR_WRITE_4(sc, JME_MAR0, mchash[0]);
2897         CSR_WRITE_4(sc, JME_MAR1, mchash[1]);
2898         CSR_WRITE_4(sc, JME_RXMAC, rxcfg);
2899 }
2900
2901 static int
2902 jme_sysctl_tx_coal_to(SYSCTL_HANDLER_ARGS)
2903 {
2904         struct jme_softc *sc = arg1;
2905         struct ifnet *ifp = &sc->arpcom.ac_if;
2906         int error, v;
2907
2908         lwkt_serialize_enter(ifp->if_serializer);
2909
2910         v = sc->jme_tx_coal_to;
2911         error = sysctl_handle_int(oidp, &v, 0, req);
2912         if (error || req->newptr == NULL)
2913                 goto back;
2914
2915         if (v < PCCTX_COAL_TO_MIN || v > PCCTX_COAL_TO_MAX) {
2916                 error = EINVAL;
2917                 goto back;
2918         }
2919
2920         if (v != sc->jme_tx_coal_to) {
2921                 sc->jme_tx_coal_to = v;
2922                 if (ifp->if_flags & IFF_RUNNING)
2923                         jme_set_tx_coal(sc);
2924         }
2925 back:
2926         lwkt_serialize_exit(ifp->if_serializer);
2927         return error;
2928 }
2929
2930 static int
2931 jme_sysctl_tx_coal_pkt(SYSCTL_HANDLER_ARGS)
2932 {
2933         struct jme_softc *sc = arg1;
2934         struct ifnet *ifp = &sc->arpcom.ac_if;
2935         int error, v;
2936
2937         lwkt_serialize_enter(ifp->if_serializer);
2938
2939         v = sc->jme_tx_coal_pkt;
2940         error = sysctl_handle_int(oidp, &v, 0, req);
2941         if (error || req->newptr == NULL)
2942                 goto back;
2943
2944         if (v < PCCTX_COAL_PKT_MIN || v > PCCTX_COAL_PKT_MAX) {
2945                 error = EINVAL;
2946                 goto back;
2947         }
2948
2949         if (v != sc->jme_tx_coal_pkt) {
2950                 sc->jme_tx_coal_pkt = v;
2951                 if (ifp->if_flags & IFF_RUNNING)
2952                         jme_set_tx_coal(sc);
2953         }
2954 back:
2955         lwkt_serialize_exit(ifp->if_serializer);
2956         return error;
2957 }
2958
2959 static int
2960 jme_sysctl_rx_coal_to(SYSCTL_HANDLER_ARGS)
2961 {
2962         struct jme_softc *sc = arg1;
2963         struct ifnet *ifp = &sc->arpcom.ac_if;
2964         int error, v;
2965
2966         lwkt_serialize_enter(ifp->if_serializer);
2967
2968         v = sc->jme_rx_coal_to;
2969         error = sysctl_handle_int(oidp, &v, 0, req);
2970         if (error || req->newptr == NULL)
2971                 goto back;
2972
2973         if (v < PCCRX_COAL_TO_MIN || v > PCCRX_COAL_TO_MAX) {
2974                 error = EINVAL;
2975                 goto back;
2976         }
2977
2978         if (v != sc->jme_rx_coal_to) {
2979                 sc->jme_rx_coal_to = v;
2980                 if (ifp->if_flags & IFF_RUNNING)
2981                         jme_set_rx_coal(sc);
2982         }
2983 back:
2984         lwkt_serialize_exit(ifp->if_serializer);
2985         return error;
2986 }
2987
2988 static int
2989 jme_sysctl_rx_coal_pkt(SYSCTL_HANDLER_ARGS)
2990 {
2991         struct jme_softc *sc = arg1;
2992         struct ifnet *ifp = &sc->arpcom.ac_if;
2993         int error, v;
2994
2995         lwkt_serialize_enter(ifp->if_serializer);
2996
2997         v = sc->jme_rx_coal_pkt;
2998         error = sysctl_handle_int(oidp, &v, 0, req);
2999         if (error || req->newptr == NULL)
3000                 goto back;
3001
3002         if (v < PCCRX_COAL_PKT_MIN || v > PCCRX_COAL_PKT_MAX) {
3003                 error = EINVAL;
3004                 goto back;
3005         }
3006
3007         if (v != sc->jme_rx_coal_pkt) {
3008                 sc->jme_rx_coal_pkt = v;
3009                 if (ifp->if_flags & IFF_RUNNING)
3010                         jme_set_rx_coal(sc);
3011         }
3012 back:
3013         lwkt_serialize_exit(ifp->if_serializer);
3014         return error;
3015 }
3016
3017 static void
3018 jme_set_tx_coal(struct jme_softc *sc)
3019 {
3020         uint32_t reg;
3021
3022         reg = (sc->jme_tx_coal_to << PCCTX_COAL_TO_SHIFT) &
3023             PCCTX_COAL_TO_MASK;
3024         reg |= (sc->jme_tx_coal_pkt << PCCTX_COAL_PKT_SHIFT) &
3025             PCCTX_COAL_PKT_MASK;
3026         reg |= PCCTX_COAL_TXQ0;
3027         CSR_WRITE_4(sc, JME_PCCTX, reg);
3028 }
3029
3030 static void
3031 jme_set_rx_coal(struct jme_softc *sc)
3032 {
3033         uint32_t reg;
3034
3035         reg = (sc->jme_rx_coal_to << PCCRX_COAL_TO_SHIFT) &
3036             PCCRX_COAL_TO_MASK;
3037         reg |= (sc->jme_rx_coal_pkt << PCCRX_COAL_PKT_SHIFT) &
3038             PCCRX_COAL_PKT_MASK;
3039         CSR_WRITE_4(sc, JME_PCCRX0, reg);
3040 }
3041
3042 #ifdef DEVICE_POLLING
3043
3044 static void
3045 jme_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
3046 {
3047         struct jme_softc *sc = ifp->if_softc;
3048         uint32_t status;
3049
3050         ASSERT_SERIALIZED(ifp->if_serializer);
3051
3052         switch (cmd) {
3053         case POLL_REGISTER:
3054                 CSR_WRITE_4(sc, JME_INTR_MASK_CLR, JME_INTRS);
3055                 break;
3056
3057         case POLL_DEREGISTER:
3058                 CSR_WRITE_4(sc, JME_INTR_MASK_SET, JME_INTRS);
3059                 break;
3060
3061         case POLL_AND_CHECK_STATUS:
3062         case POLL_ONLY:
3063                 status = CSR_READ_4(sc, JME_INTR_STATUS);
3064                 jme_rxeof(sc, count);
3065
3066                 if (status & INTR_RXQ_DESC_EMPTY) {
3067                         CSR_WRITE_4(sc, JME_INTR_STATUS, status);
3068                         CSR_WRITE_4(sc, JME_RXCSR, sc->jme_rxcsr |
3069                             RXCSR_RX_ENB | RXCSR_RXQ_START);
3070                 }
3071
3072                 jme_txeof(sc);
3073                 if (!ifq_is_empty(&ifp->if_snd))
3074                         if_devstart(ifp);
3075                 break;
3076         }
3077 }
3078
3079 #endif  /* DEVICE_POLLING */