Revert "rename amd64 architecture to x86_64"
[dragonfly.git] / sys / dev / netif / mxge / if_mxge.c
1 /******************************************************************************
2
3 Copyright (c) 2006-2009, Myricom Inc.
4 All rights reserved.
5
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
8
9  1. Redistributions of source code must retain the above copyright notice,
10     this list of conditions and the following disclaimer.
11
12  2. Neither the name of the Myricom Inc, nor the names of its
13     contributors may be used to endorse or promote products derived from
14     this software without specific prior written permission.
15
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 POSSIBILITY OF SUCH DAMAGE.
27
28 ***************************************************************************/
29
30 #include <sys/cdefs.h>
31 /*__FBSDID("$FreeBSD: src/sys/dev/mxge/if_mxge.c,v 1.63 2009/06/26 11:45:06 rwatson Exp $");*/
32
33 #include <sys/param.h>
34 #include <sys/systm.h>
35 #include <sys/linker.h>
36 #include <sys/firmware.h>
37 #include <sys/endian.h>
38 #include <sys/in_cksum.h>
39 #include <sys/sockio.h>
40 #include <sys/mbuf.h>
41 #include <sys/malloc.h>
42 #include <sys/kernel.h>
43 #include <sys/module.h>
44 #include <sys/serialize.h>
45 #include <sys/socket.h>
46 #include <sys/sysctl.h>
47
48 /* count xmits ourselves, rather than via drbr */
49 #define NO_SLOW_STATS
50 #include <net/if.h>
51 #include <net/if_arp.h>
52 #include <net/ifq_var.h>
53 #include <net/ethernet.h>
54 #include <net/if_dl.h>
55 #include <net/if_media.h>
56
57 #include <net/bpf.h>
58
59 #include <net/if_types.h>
60 #include <net/vlan/if_vlan_var.h>
61 #include <net/zlib.h>
62
63 #include <netinet/in_systm.h>
64 #include <netinet/in.h>
65 #include <netinet/ip.h>
66 #include <netinet/tcp.h>
67
68 #include <sys/bus.h>
69 #include <sys/rman.h>
70
71 #include <bus/pci/pcireg.h>
72 #include <bus/pci/pcivar.h>
73 #include <bus/pci/pci_private.h> /* XXX for pci_cfg_restore */
74
75 #include <vm/vm.h>              /* for pmap_mapdev() */
76 #include <vm/pmap.h>
77
78 #if defined(__i386) || defined(__amd64)
79 #include <machine/specialreg.h>
80 #endif
81
82 #include <dev/netif/mxge/mxge_mcp.h>
83 #include <dev/netif/mxge/mcp_gen_header.h>
84 /*#define MXGE_FAKE_IFP*/
85 #include <dev/netif/mxge/if_mxge_var.h>
86 #ifdef IFNET_BUF_RING
87 #include <sys/buf_ring.h>
88 #endif
89
90 #include "opt_inet.h"
91
92 /* tunable params */
93 static int mxge_nvidia_ecrc_enable = 1;
94 static int mxge_force_firmware = 0;
95 static int mxge_intr_coal_delay = 30;
96 static int mxge_deassert_wait = 1;
97 static int mxge_flow_control = 1;
98 static int mxge_verbose = 0;
99 static int mxge_lro_cnt = 8;
100 static int mxge_ticks;
101 static int mxge_max_slices = 1;
102 static int mxge_rss_hash_type = MXGEFW_RSS_HASH_TYPE_SRC_PORT;
103 static int mxge_always_promisc = 0;
104 /* XXX: not yet */
105 /* static int mxge_initial_mtu = ETHERMTU_JUMBO; */
106 static int mxge_initial_mtu = ETHERMTU;
107 static char *mxge_fw_unaligned = "mxge_ethp_z8e";
108 static char *mxge_fw_aligned = "mxge_eth_z8e";
109 static char *mxge_fw_rss_aligned = "mxge_rss_eth_z8e";
110 static char *mxge_fw_rss_unaligned = "mxge_rss_ethp_z8e";
111
112 static int mxge_probe(device_t dev);
113 static int mxge_attach(device_t dev);
114 static int mxge_detach(device_t dev);
115 static int mxge_shutdown(device_t dev);
116 static void mxge_intr(void *arg);
117
118 static device_method_t mxge_methods[] =
119 {
120   /* Device interface */
121   DEVMETHOD(device_probe, mxge_probe),
122   DEVMETHOD(device_attach, mxge_attach),
123   DEVMETHOD(device_detach, mxge_detach),
124   DEVMETHOD(device_shutdown, mxge_shutdown),
125   {0, 0}
126 };
127
128 static driver_t mxge_driver =
129 {
130   "mxge",
131   mxge_methods,
132   sizeof(mxge_softc_t),
133 };
134
135 static devclass_t mxge_devclass;
136
137 /* Declare ourselves to be a child of the PCI bus.*/
138 DRIVER_MODULE(mxge, pci, mxge_driver, mxge_devclass, 0, 0);
139 MODULE_DEPEND(mxge, firmware, 1, 1, 1);
140 MODULE_DEPEND(mxge, zlib, 1, 1, 1);
141
142 static int mxge_load_firmware(mxge_softc_t *sc, int adopt);
143 static int mxge_send_cmd(mxge_softc_t *sc, uint32_t cmd, mxge_cmd_t *data);
144 static int mxge_close(mxge_softc_t *sc);
145 static int mxge_open(mxge_softc_t *sc);
146 static void mxge_tick(void *arg);
147
148 /* XXX: we don't have Large Receive Offload support yet */
149  inline int
150 mxge_lro_rx(struct mxge_slice_state *ss, struct mbuf *m_head, uint32_t csum)
151 {
152         (void)ss;
153         (void)m_head;
154         (void)csum;
155         return 1;
156 }
157
158  inline void
159 mxge_lro_flush(struct mxge_slice_state *ss, struct lro_entry *lro)
160 {
161         (void)ss;
162         (void)lro;
163 }
164
165 static int
166 mxge_probe(device_t dev)
167 {
168         int rev;
169
170
171         if ((pci_get_vendor(dev) == MXGE_PCI_VENDOR_MYRICOM) &&
172             ((pci_get_device(dev) == MXGE_PCI_DEVICE_Z8E) ||
173              (pci_get_device(dev) == MXGE_PCI_DEVICE_Z8E_9))) {
174                 rev = pci_get_revid(dev);
175                 switch (rev) {
176                 case MXGE_PCI_REV_Z8E:
177                         device_set_desc(dev, "Myri10G-PCIE-8A");
178                         break;
179                 case MXGE_PCI_REV_Z8ES:
180                         device_set_desc(dev, "Myri10G-PCIE-8B");
181                         break;
182                 default:
183                         device_set_desc(dev, "Myri10G-PCIE-8??");
184                         device_printf(dev, "Unrecognized rev %d NIC\n",
185                                       rev);
186                         break;  
187                 }
188                 return 0;
189         }
190         return ENXIO;
191 }
192
193 static void
194 mxge_enable_wc(mxge_softc_t *sc)
195 {
196 #if 0
197 #if defined(__i386) || defined(__amd64)
198         vm_offset_t len;
199         int err;
200
201         sc->wc = 1;
202         len = rman_get_size(sc->mem_res);
203         err = pmap_change_attr((vm_offset_t) sc->sram,
204                                len, PAT_WRITE_COMBINING);
205         if (err != 0) {
206                 device_printf(sc->dev, "pmap_change_attr failed, %d\n",
207                               err);
208                 sc->wc = 0;
209         }
210 #endif
211 #else
212         sc->wc = 0;     /* TBD: PAT support */
213 #endif
214 }
215
216
217 /* callback to get our DMA address */
218 static void
219 mxge_dmamap_callback(void *arg, bus_dma_segment_t *segs, int nsegs,
220                          int error)
221 {
222         if (error == 0) {
223                 *(bus_addr_t *) arg = segs->ds_addr;
224         }
225 }
226
227 static int
228 mxge_dma_alloc(mxge_softc_t *sc, mxge_dma_t *dma, size_t bytes, 
229                    bus_size_t alignment)
230 {
231         int err;
232         device_t dev = sc->dev;
233         bus_size_t boundary, maxsegsize;
234
235         if (bytes > 4096 && alignment == 4096) {
236                 boundary = 0;
237                 maxsegsize = bytes;
238         } else {
239                 boundary = 4096;
240                 maxsegsize = 4096;
241         }
242
243         /* allocate DMAable memory tags */
244         err = bus_dma_tag_create(sc->parent_dmat,       /* parent */
245                                  alignment,             /* alignment */
246                                  boundary,              /* boundary */
247                                  BUS_SPACE_MAXADDR,     /* low */
248                                  BUS_SPACE_MAXADDR,     /* high */
249                                  NULL, NULL,            /* filter */
250                                  bytes,                 /* maxsize */
251                                  1,                     /* num segs */
252                                  maxsegsize,            /* maxsegsize */
253                                  BUS_DMA_COHERENT,      /* flags */
254                                  &dma->dmat);           /* tag */
255         if (err != 0) {
256                 device_printf(dev, "couldn't alloc tag (err = %d)\n", err);
257                 return err;
258         }
259
260         /* allocate DMAable memory & map */
261         err = bus_dmamem_alloc(dma->dmat, &dma->addr, 
262                                (BUS_DMA_WAITOK | BUS_DMA_COHERENT 
263                                 | BUS_DMA_ZERO),  &dma->map);
264         if (err != 0) {
265                 device_printf(dev, "couldn't alloc mem (err = %d)\n", err);
266                 goto abort_with_dmat;
267         }
268
269         /* load the memory */
270         err = bus_dmamap_load(dma->dmat, dma->map, dma->addr, bytes,
271                               mxge_dmamap_callback,
272                               (void *)&dma->bus_addr, 0);
273         if (err != 0) {
274                 device_printf(dev, "couldn't load map (err = %d)\n", err);
275                 goto abort_with_mem;
276         }
277         return 0;
278
279 abort_with_mem:
280         bus_dmamem_free(dma->dmat, dma->addr, dma->map);
281 abort_with_dmat:
282         (void)bus_dma_tag_destroy(dma->dmat);
283         return err;
284 }
285
286
287 static void
288 mxge_dma_free(mxge_dma_t *dma)
289 {
290         bus_dmamap_unload(dma->dmat, dma->map);
291         bus_dmamem_free(dma->dmat, dma->addr, dma->map);
292         (void)bus_dma_tag_destroy(dma->dmat);
293 }
294
295 /*
296  * The eeprom strings on the lanaiX have the format
297  * SN=x\0
298  * MAC=x:x:x:x:x:x\0
299  * PC=text\0
300  */
301
302 static int
303 mxge_parse_strings(mxge_softc_t *sc)
304 {
305 #define MXGE_NEXT_STRING(p) while(ptr < limit && *ptr++)
306
307         char *ptr, *limit;
308         int i, found_mac;
309
310         ptr = sc->eeprom_strings;
311         limit = sc->eeprom_strings + MXGE_EEPROM_STRINGS_SIZE;
312         found_mac = 0;
313         while (ptr < limit && *ptr != '\0') {
314                 if (memcmp(ptr, "MAC=", 4) == 0) {
315                         ptr += 1;
316                         sc->mac_addr_string = ptr;
317                         for (i = 0; i < 6; i++) {
318                                 ptr += 3;
319                                 if ((ptr + 2) > limit)
320                                         goto abort;
321                                 sc->mac_addr[i] = strtoul(ptr, NULL, 16);
322                                 found_mac = 1;
323                         }
324                 } else if (memcmp(ptr, "PC=", 3) == 0) {
325                         ptr += 3;
326                         strncpy(sc->product_code_string, ptr,
327                                 sizeof (sc->product_code_string) - 1);
328                 } else if (memcmp(ptr, "SN=", 3) == 0) {
329                         ptr += 3;
330                         strncpy(sc->serial_number_string, ptr,
331                                 sizeof (sc->serial_number_string) - 1);
332                 }
333                 MXGE_NEXT_STRING(ptr);
334         }
335
336         if (found_mac)
337                 return 0;
338
339  abort:
340         device_printf(sc->dev, "failed to parse eeprom_strings\n");
341
342         return ENXIO;
343 }
344
345 #if defined __i386 || defined i386 || defined __i386__ || defined __x86_64__
346 static void
347 mxge_enable_nvidia_ecrc(mxge_softc_t *sc)
348 {
349         uint32_t val;
350         unsigned long base, off;
351         char *va, *cfgptr;
352         device_t pdev, mcp55;
353         uint16_t vendor_id, device_id, word;
354         uintptr_t bus, slot, func, ivend, idev;
355         uint32_t *ptr32;
356
357
358         if (!mxge_nvidia_ecrc_enable)
359                 return;
360
361         pdev = device_get_parent(device_get_parent(sc->dev));
362         if (pdev == NULL) {
363                 device_printf(sc->dev, "could not find parent?\n");
364                 return;
365         }
366         vendor_id = pci_read_config(pdev, PCIR_VENDOR, 2);
367         device_id = pci_read_config(pdev, PCIR_DEVICE, 2);
368
369         if (vendor_id != 0x10de)
370                 return;
371
372         base = 0;
373
374         if (device_id == 0x005d) {
375                 /* ck804, base address is magic */
376                 base = 0xe0000000UL;
377         } else if (device_id >= 0x0374 && device_id <= 0x378) {
378                 /* mcp55, base address stored in chipset */
379                 mcp55 = pci_find_bsf(0, 0, 0);
380                 if (mcp55 &&
381                     0x10de == pci_read_config(mcp55, PCIR_VENDOR, 2) &&
382                     0x0369 == pci_read_config(mcp55, PCIR_DEVICE, 2)) {
383                         word = pci_read_config(mcp55, 0x90, 2);
384                         base = ((unsigned long)word & 0x7ffeU) << 25;
385                 }
386         }
387         if (!base)
388                 return;
389
390         /* XXXX
391            Test below is commented because it is believed that doing
392            config read/write beyond 0xff will access the config space
393            for the next larger function.  Uncomment this and remove 
394            the hacky pmap_mapdev() way of accessing config space when
395            FreeBSD grows support for extended pcie config space access
396         */
397 #if 0   
398         /* See if we can, by some miracle, access the extended
399            config space */
400         val = pci_read_config(pdev, 0x178, 4);
401         if (val != 0xffffffff) {
402                 val |= 0x40;
403                 pci_write_config(pdev, 0x178, val, 4);
404                 return;
405         }
406 #endif
407         /* Rather than using normal pci config space writes, we must
408          * map the Nvidia config space ourselves.  This is because on
409          * opteron/nvidia class machine the 0xe000000 mapping is
410          * handled by the nvidia chipset, that means the internal PCI
411          * device (the on-chip northbridge), or the amd-8131 bridge
412          * and things behind them are not visible by this method.
413          */
414
415         BUS_READ_IVAR(device_get_parent(pdev), pdev,
416                       PCI_IVAR_BUS, &bus);
417         BUS_READ_IVAR(device_get_parent(pdev), pdev,
418                       PCI_IVAR_SLOT, &slot);
419         BUS_READ_IVAR(device_get_parent(pdev), pdev,
420                       PCI_IVAR_FUNCTION, &func);
421         BUS_READ_IVAR(device_get_parent(pdev), pdev,
422                       PCI_IVAR_VENDOR, &ivend);
423         BUS_READ_IVAR(device_get_parent(pdev), pdev,
424                       PCI_IVAR_DEVICE, &idev);
425                                         
426         off =  base
427                 + 0x00100000UL * (unsigned long)bus
428                 + 0x00001000UL * (unsigned long)(func
429                                                  + 8 * slot);
430
431         /* map it into the kernel */
432         va = pmap_mapdev(trunc_page((vm_paddr_t)off), PAGE_SIZE);
433         
434
435         if (va == NULL) {
436                 device_printf(sc->dev, "pmap_kenter_temporary didn't\n");
437                 return;
438         }
439         /* get a pointer to the config space mapped into the kernel */
440         cfgptr = va + (off & PAGE_MASK);
441
442         /* make sure that we can really access it */
443         vendor_id = *(uint16_t *)(cfgptr + PCIR_VENDOR);
444         device_id = *(uint16_t *)(cfgptr + PCIR_DEVICE);
445         if (! (vendor_id == ivend && device_id == idev)) {
446                 device_printf(sc->dev, "mapping failed: 0x%x:0x%x\n",
447                               vendor_id, device_id);
448                 pmap_unmapdev((vm_offset_t)va, PAGE_SIZE);
449                 return;
450         }
451
452         ptr32 = (uint32_t*)(cfgptr + 0x178);
453         val = *ptr32;
454
455         if (val == 0xffffffff) {
456                 device_printf(sc->dev, "extended mapping failed\n");
457                 pmap_unmapdev((vm_offset_t)va, PAGE_SIZE);
458                 return;
459         }
460         *ptr32 = val | 0x40;
461         pmap_unmapdev((vm_offset_t)va, PAGE_SIZE);
462         if (mxge_verbose) 
463                 device_printf(sc->dev,
464                               "Enabled ECRC on upstream Nvidia bridge "
465                               "at %d:%d:%d\n",
466                               (int)bus, (int)slot, (int)func);
467         return;
468 }
469 #else
470 static void
471 mxge_enable_nvidia_ecrc(mxge_softc_t *sc)
472 {
473         device_printf(sc->dev,
474                       "Nforce 4 chipset on non-x86/amd64!?!?!\n");
475         return;
476 }
477 #endif
478
479
480 static int
481 mxge_dma_test(mxge_softc_t *sc, int test_type)
482 {
483         mxge_cmd_t cmd;
484         bus_addr_t dmatest_bus = sc->dmabench_dma.bus_addr;
485         int status;
486         uint32_t len;
487         char *test = " ";
488
489
490         /* Run a small DMA test.
491          * The magic multipliers to the length tell the firmware
492          * to do DMA read, write, or read+write tests.  The
493          * results are returned in cmd.data0.  The upper 16
494          * bits of the return is the number of transfers completed.
495          * The lower 16 bits is the time in 0.5us ticks that the
496          * transfers took to complete.
497          */
498
499         len = sc->tx_boundary;
500
501         cmd.data0 = MXGE_LOWPART_TO_U32(dmatest_bus);
502         cmd.data1 = MXGE_HIGHPART_TO_U32(dmatest_bus);
503         cmd.data2 = len * 0x10000;
504         status = mxge_send_cmd(sc, test_type, &cmd);
505         if (status != 0) {
506                 test = "read";
507                 goto abort;
508         }
509         sc->read_dma = ((cmd.data0>>16) * len * 2) /
510                 (cmd.data0 & 0xffff);
511         cmd.data0 = MXGE_LOWPART_TO_U32(dmatest_bus);
512         cmd.data1 = MXGE_HIGHPART_TO_U32(dmatest_bus);
513         cmd.data2 = len * 0x1;
514         status = mxge_send_cmd(sc, test_type, &cmd);
515         if (status != 0) {
516                 test = "write";
517                 goto abort;
518         }
519         sc->write_dma = ((cmd.data0>>16) * len * 2) /
520                 (cmd.data0 & 0xffff);
521
522         cmd.data0 = MXGE_LOWPART_TO_U32(dmatest_bus);
523         cmd.data1 = MXGE_HIGHPART_TO_U32(dmatest_bus);
524         cmd.data2 = len * 0x10001;
525         status = mxge_send_cmd(sc, test_type, &cmd);
526         if (status != 0) {
527                 test = "read/write";
528                 goto abort;
529         }
530         sc->read_write_dma = ((cmd.data0>>16) * len * 2 * 2) /
531                 (cmd.data0 & 0xffff);
532
533 abort:
534         if (status != 0 && test_type != MXGEFW_CMD_UNALIGNED_TEST)
535                 device_printf(sc->dev, "DMA %s benchmark failed: %d\n",
536                               test, status);
537
538         return status;
539 }
540
541 /*
542  * The Lanai Z8E PCI-E interface achieves higher Read-DMA throughput
543  * when the PCI-E Completion packets are aligned on an 8-byte
544  * boundary.  Some PCI-E chip sets always align Completion packets; on
545  * the ones that do not, the alignment can be enforced by enabling
546  * ECRC generation (if supported).
547  *
548  * When PCI-E Completion packets are not aligned, it is actually more
549  * efficient to limit Read-DMA transactions to 2KB, rather than 4KB.
550  *
551  * If the driver can neither enable ECRC nor verify that it has
552  * already been enabled, then it must use a firmware image which works
553  * around unaligned completion packets (ethp_z8e.dat), and it should
554  * also ensure that it never gives the device a Read-DMA which is
555  * larger than 2KB by setting the tx_boundary to 2KB.  If ECRC is
556  * enabled, then the driver should use the aligned (eth_z8e.dat)
557  * firmware image, and set tx_boundary to 4KB.
558  */
559
560 static int
561 mxge_firmware_probe(mxge_softc_t *sc)
562 {
563         device_t dev = sc->dev;
564         int reg, status;
565         uint16_t pectl;
566
567         sc->tx_boundary = 4096;
568         /*
569          * Verify the max read request size was set to 4KB
570          * before trying the test with 4KB.
571          */
572         if (pci_find_extcap(dev, PCIY_EXPRESS, &reg) == 0) {
573                 pectl = pci_read_config(dev, reg + 0x8, 2);
574                 if ((pectl & (5 << 12)) != (5 << 12)) {
575                         device_printf(dev, "Max Read Req. size != 4k (0x%x\n",
576                                       pectl);
577                         sc->tx_boundary = 2048;
578                 }
579         }
580
581         /* 
582          * load the optimized firmware (which assumes aligned PCIe
583          * completions) in order to see if it works on this host.
584          */
585         sc->fw_name = mxge_fw_aligned;
586         status = mxge_load_firmware(sc, 1);
587         if (status != 0) {
588                 return status;
589         }
590
591         /* 
592          * Enable ECRC if possible
593          */
594         mxge_enable_nvidia_ecrc(sc);
595
596         /* 
597          * Run a DMA test which watches for unaligned completions and
598          * aborts on the first one seen.
599          */
600
601         status = mxge_dma_test(sc, MXGEFW_CMD_UNALIGNED_TEST);
602         if (status == 0)
603                 return 0; /* keep the aligned firmware */
604
605         if (status != E2BIG)
606                 device_printf(dev, "DMA test failed: %d\n", status);
607         if (status == ENOSYS)
608                 device_printf(dev, "Falling back to ethp! "
609                               "Please install up to date fw\n");
610         return status;
611 }
612
613 static int
614 mxge_select_firmware(mxge_softc_t *sc)
615 {
616         int aligned = 0;
617
618
619         if (mxge_force_firmware != 0) {
620                 if (mxge_force_firmware == 1)
621                         aligned = 1;
622                 else
623                         aligned = 0;
624                 if (mxge_verbose)
625                         device_printf(sc->dev,
626                                       "Assuming %s completions (forced)\n",
627                                       aligned ? "aligned" : "unaligned");
628                 goto abort;
629         }
630
631         /* if the PCIe link width is 4 or less, we can use the aligned
632            firmware and skip any checks */
633         if (sc->link_width != 0 && sc->link_width <= 4) {
634                 device_printf(sc->dev,
635                               "PCIe x%d Link, expect reduced performance\n",
636                               sc->link_width);
637                 aligned = 1;
638                 goto abort;
639         }
640
641         if (0 == mxge_firmware_probe(sc))
642                 return 0;
643
644 abort:
645         if (aligned) {
646                 sc->fw_name = mxge_fw_aligned;
647                 sc->tx_boundary = 4096;
648         } else {
649                 sc->fw_name = mxge_fw_unaligned;
650                 sc->tx_boundary = 2048;
651         }
652         return (mxge_load_firmware(sc, 0));
653 }
654
655 union qualhack
656 {
657         const char *ro_char;
658         char *rw_char;
659 };
660
661 static int
662 mxge_validate_firmware(mxge_softc_t *sc, const mcp_gen_header_t *hdr)
663 {
664
665
666         if (be32toh(hdr->mcp_type) != MCP_TYPE_ETH) {
667                 device_printf(sc->dev, "Bad firmware type: 0x%x\n", 
668                               be32toh(hdr->mcp_type));
669                 return EIO;
670         }
671
672         /* save firmware version for sysctl */
673         strncpy(sc->fw_version, hdr->version, sizeof (sc->fw_version));
674         if (mxge_verbose)
675                 device_printf(sc->dev, "firmware id: %s\n", hdr->version);
676
677         ksscanf(sc->fw_version, "%d.%d.%d", &sc->fw_ver_major,
678                &sc->fw_ver_minor, &sc->fw_ver_tiny);
679
680         if (!(sc->fw_ver_major == MXGEFW_VERSION_MAJOR
681               && sc->fw_ver_minor == MXGEFW_VERSION_MINOR)) {
682                 device_printf(sc->dev, "Found firmware version %s\n",
683                               sc->fw_version);
684                 device_printf(sc->dev, "Driver needs %d.%d\n",
685                               MXGEFW_VERSION_MAJOR, MXGEFW_VERSION_MINOR);
686                 return EINVAL;
687         }
688         return 0;
689
690 }
691
692 #if 0
693 static void *
694 z_alloc(void *nil, u_int items, u_int size)
695 {
696         void *ptr;
697
698         ptr = kmalloc(items * size, M_TEMP, M_NOWAIT);
699         return ptr;
700 }
701
702 static void
703 z_free(void *nil, void *ptr)
704 {
705         kfree(ptr, M_TEMP);
706 }
707 #endif
708
709 static int
710 mxge_load_firmware_helper(mxge_softc_t *sc, uint32_t *limit)
711 {
712         struct fw_image *fw;
713         const mcp_gen_header_t *hdr;
714         unsigned hdr_offset;
715         int status;
716         unsigned int i;
717         char dummy;
718         size_t fw_len;
719
720         fw = firmware_image_load(sc->fw_name, NULL);
721         if (fw == NULL) {
722                 device_printf(sc->dev, "Could not find firmware image %s\n",
723                               sc->fw_name);
724                 return ENOENT;
725         }
726 #if 0
727         /* setup zlib and decompress f/w */
728         bzero(&zs, sizeof (zs));
729         zs.zalloc = z_alloc;
730         zs.zfree = z_free;
731         status = inflateInit(&zs);
732         if (status != Z_OK) {
733                 status = EIO;
734                 goto abort_with_fw;
735         }
736
737         /* the uncompressed size is stored as the firmware version,
738            which would otherwise go unused */
739         fw_len = (size_t) fw->version; 
740         inflate_buffer = kmalloc(fw_len, M_TEMP, M_NOWAIT);
741         if (inflate_buffer == NULL)
742                 goto abort_with_zs;
743         zs.avail_in = fw->datasize;
744         zs.next_in = __DECONST(char *, fw->data);
745         zs.avail_out = fw_len;
746         zs.next_out = inflate_buffer;
747         status = inflate(&zs, Z_FINISH);
748         if (status != Z_STREAM_END) {
749                 device_printf(sc->dev, "zlib %d\n", status);
750                 status = EIO;
751                 goto abort_with_buffer;
752         }
753 #endif
754         fw_len = fw->fw_imglen;
755         /* check id */
756         hdr_offset = htobe32(*(const uint32_t *)
757                              (fw->fw_image + MCP_HEADER_PTR_OFFSET));
758         if ((hdr_offset & 3) || hdr_offset + sizeof(*hdr) > fw_len) {
759                 device_printf(sc->dev, "Bad firmware file");
760                 status = EIO;
761                 goto abort_with_fw;
762         }
763         hdr = (const void*)(fw->fw_image + hdr_offset); 
764
765         status = mxge_validate_firmware(sc, hdr);
766         if (status != 0)
767                 goto abort_with_fw;
768
769         /* Copy the inflated firmware to NIC SRAM. */
770         for (i = 0; i < fw_len; i += 256) {
771                 mxge_pio_copy(sc->sram + MXGE_FW_OFFSET + i,
772                               fw->fw_image + i,
773                               min(256U, (unsigned)(fw_len - i)));
774                 wmb();
775                 dummy = *sc->sram;
776                 wmb();
777         }
778
779         *limit = fw_len;
780         status = 0;
781 #if 0
782 abort_with_buffer:
783         kfree(inflate_buffer, M_TEMP);
784 abort_with_zs:
785         inflateEnd(&zs);
786 #endif
787 abort_with_fw:
788         firmware_image_unload(fw);
789         return status;
790 }
791
792 /*
793  * Enable or disable periodic RDMAs from the host to make certain
794  * chipsets resend dropped PCIe messages
795  */
796
797 static void
798 mxge_dummy_rdma(mxge_softc_t *sc, int enable)
799 {
800         char buf_bytes[72];
801         volatile uint32_t *confirm;
802         volatile char *submit;
803         uint32_t *buf, dma_low, dma_high;
804         int i;
805
806         buf = (uint32_t *)((unsigned long)(buf_bytes + 7) & ~7UL);
807
808         /* clear confirmation addr */
809         confirm = (volatile uint32_t *)sc->cmd;
810         *confirm = 0;
811         wmb();
812
813         /* send an rdma command to the PCIe engine, and wait for the
814            response in the confirmation address.  The firmware should
815            write a -1 there to indicate it is alive and well
816         */
817
818         dma_low = MXGE_LOWPART_TO_U32(sc->cmd_dma.bus_addr);
819         dma_high = MXGE_HIGHPART_TO_U32(sc->cmd_dma.bus_addr);
820         buf[0] = htobe32(dma_high);             /* confirm addr MSW */
821         buf[1] = htobe32(dma_low);              /* confirm addr LSW */
822         buf[2] = htobe32(0xffffffff);           /* confirm data */
823         dma_low = MXGE_LOWPART_TO_U32(sc->zeropad_dma.bus_addr);
824         dma_high = MXGE_HIGHPART_TO_U32(sc->zeropad_dma.bus_addr);
825         buf[3] = htobe32(dma_high);             /* dummy addr MSW */
826         buf[4] = htobe32(dma_low);              /* dummy addr LSW */
827         buf[5] = htobe32(enable);                       /* enable? */
828
829
830         submit = (volatile char *)(sc->sram + MXGEFW_BOOT_DUMMY_RDMA);
831
832         mxge_pio_copy(submit, buf, 64);
833         wmb();
834         DELAY(1000);
835         wmb();
836         i = 0;
837         while (*confirm != 0xffffffff && i < 20) {
838                 DELAY(1000);
839                 i++;
840         }
841         if (*confirm != 0xffffffff) {
842                 device_printf(sc->dev, "dummy rdma %s failed (%p = 0x%x)", 
843                               (enable ? "enable" : "disable"), confirm, 
844                               *confirm);
845         }
846         return;
847 }
848
849 static int 
850 mxge_send_cmd(mxge_softc_t *sc, uint32_t cmd, mxge_cmd_t *data)
851 {
852         mcp_cmd_t *buf;
853         char buf_bytes[sizeof(*buf) + 8];
854         volatile mcp_cmd_response_t *response = sc->cmd;
855         volatile char *cmd_addr = sc->sram + MXGEFW_ETH_CMD;
856         uint32_t dma_low, dma_high;
857         int err, sleep_total = 0;
858
859         /*
860          * We may be called during attach, before if_serializer is available.
861          * This is not a fast path, just check for NULL
862          */
863
864         if (sc->ifp->if_serializer)
865                 ASSERT_SERIALIZED(sc->ifp->if_serializer);
866
867         /* ensure buf is aligned to 8 bytes */
868         buf = (mcp_cmd_t *)((unsigned long)(buf_bytes + 7) & ~7UL);
869
870         buf->data0 = htobe32(data->data0);
871         buf->data1 = htobe32(data->data1);
872         buf->data2 = htobe32(data->data2);
873         buf->cmd = htobe32(cmd);
874         dma_low = MXGE_LOWPART_TO_U32(sc->cmd_dma.bus_addr);
875         dma_high = MXGE_HIGHPART_TO_U32(sc->cmd_dma.bus_addr);
876
877         buf->response_addr.low = htobe32(dma_low);
878         buf->response_addr.high = htobe32(dma_high);
879
880
881         response->result = 0xffffffff;
882         wmb();
883         mxge_pio_copy((volatile void *)cmd_addr, buf, sizeof (*buf));
884
885         /* wait up to 20ms */
886         err = EAGAIN;
887         for (sleep_total = 0; sleep_total <  20; sleep_total++) {
888                 bus_dmamap_sync(sc->cmd_dma.dmat, 
889                                 sc->cmd_dma.map, BUS_DMASYNC_POSTREAD);
890                 wmb();
891                 switch (be32toh(response->result)) {
892                 case 0:
893                         data->data0 = be32toh(response->data);
894                         err = 0;
895                         break;
896                 case 0xffffffff:
897                         DELAY(1000);
898                         break;
899                 case MXGEFW_CMD_UNKNOWN:
900                         err = ENOSYS;
901                         break;
902                 case MXGEFW_CMD_ERROR_UNALIGNED:
903                         err = E2BIG;
904                         break;
905                 case MXGEFW_CMD_ERROR_BUSY:
906                         err = EBUSY;
907                         break;
908                 default:
909                         device_printf(sc->dev, 
910                                       "mxge: command %d "
911                                       "failed, result = %d\n",
912                                       cmd, be32toh(response->result));
913                         err = ENXIO;
914                         break;
915                 }
916                 if (err != EAGAIN)
917                         break;
918         }
919         if (err == EAGAIN)
920                 device_printf(sc->dev, "mxge: command %d timed out"
921                               "result = %d\n",
922                               cmd, be32toh(response->result));
923         return err;
924 }
925
926 static int
927 mxge_adopt_running_firmware(mxge_softc_t *sc)
928 {
929         struct mcp_gen_header *hdr;
930         const size_t bytes = sizeof (struct mcp_gen_header);
931         size_t hdr_offset;
932         int status;
933
934         /* find running firmware header */
935         hdr_offset = htobe32(*(volatile uint32_t *)
936                              (sc->sram + MCP_HEADER_PTR_OFFSET));
937
938         if ((hdr_offset & 3) || hdr_offset + sizeof(*hdr) > sc->sram_size) {
939                 device_printf(sc->dev, 
940                               "Running firmware has bad header offset (%d)\n",
941                               (int)hdr_offset);
942                 return EIO;
943         }
944
945         /* copy header of running firmware from SRAM to host memory to
946          * validate firmware */
947         hdr = kmalloc(bytes, M_DEVBUF, M_NOWAIT);
948         if (hdr == NULL) {
949                 device_printf(sc->dev, "could not kmalloc firmware hdr\n");
950                 return ENOMEM;
951         }
952         bus_space_read_region_1(rman_get_bustag(sc->mem_res),
953                                 rman_get_bushandle(sc->mem_res),
954                                 hdr_offset, (char *)hdr, bytes);
955         status = mxge_validate_firmware(sc, hdr);
956         kfree(hdr, M_DEVBUF);
957
958         /* 
959          * check to see if adopted firmware has bug where adopting
960          * it will cause broadcasts to be filtered unless the NIC
961          * is kept in ALLMULTI mode
962          */
963         if (sc->fw_ver_major == 1 && sc->fw_ver_minor == 4 &&
964             sc->fw_ver_tiny >= 4 && sc->fw_ver_tiny <= 11) {
965                 sc->adopted_rx_filter_bug = 1;
966                 device_printf(sc->dev, "Adopting fw %d.%d.%d: "
967                               "working around rx filter bug\n",
968                               sc->fw_ver_major, sc->fw_ver_minor,
969                               sc->fw_ver_tiny);
970         }
971
972         return status;
973 }
974
975
976 static int
977 mxge_load_firmware(mxge_softc_t *sc, int adopt)
978 {
979         volatile uint32_t *confirm;
980         volatile char *submit;
981         char buf_bytes[72];
982         uint32_t *buf, size, dma_low, dma_high;
983         int status, i;
984
985         buf = (uint32_t *)((unsigned long)(buf_bytes + 7) & ~7UL);
986
987         size = sc->sram_size;
988         status = mxge_load_firmware_helper(sc, &size);
989         if (status) {
990                 if (!adopt)
991                         return status;
992                 /* Try to use the currently running firmware, if
993                    it is new enough */
994                 status = mxge_adopt_running_firmware(sc);
995                 if (status) {
996                         device_printf(sc->dev,
997                                       "failed to adopt running firmware\n");
998                         return status;
999                 }
1000                 device_printf(sc->dev,
1001                               "Successfully adopted running firmware\n");
1002                 if (sc->tx_boundary == 4096) {
1003                         device_printf(sc->dev,
1004                                 "Using firmware currently running on NIC"
1005                                  ".  For optimal\n");
1006                         device_printf(sc->dev,
1007                                  "performance consider loading optimized "
1008                                  "firmware\n");
1009                 }
1010                 sc->fw_name = mxge_fw_unaligned;
1011                 sc->tx_boundary = 2048;
1012                 return 0;
1013         }
1014         /* clear confirmation addr */
1015         confirm = (volatile uint32_t *)sc->cmd;
1016         *confirm = 0;
1017         wmb();
1018         /* send a reload command to the bootstrap MCP, and wait for the
1019            response in the confirmation address.  The firmware should
1020            write a -1 there to indicate it is alive and well
1021         */
1022
1023         dma_low = MXGE_LOWPART_TO_U32(sc->cmd_dma.bus_addr);
1024         dma_high = MXGE_HIGHPART_TO_U32(sc->cmd_dma.bus_addr);
1025
1026         buf[0] = htobe32(dma_high);     /* confirm addr MSW */
1027         buf[1] = htobe32(dma_low);      /* confirm addr LSW */
1028         buf[2] = htobe32(0xffffffff);   /* confirm data */
1029
1030         /* FIX: All newest firmware should un-protect the bottom of
1031            the sram before handoff. However, the very first interfaces
1032            do not. Therefore the handoff copy must skip the first 8 bytes
1033         */
1034                                         /* where the code starts*/
1035         buf[3] = htobe32(MXGE_FW_OFFSET + 8);
1036         buf[4] = htobe32(size - 8);     /* length of code */
1037         buf[5] = htobe32(8);            /* where to copy to */
1038         buf[6] = htobe32(0);            /* where to jump to */
1039
1040         submit = (volatile char *)(sc->sram + MXGEFW_BOOT_HANDOFF);
1041         mxge_pio_copy(submit, buf, 64);
1042         wmb();
1043         DELAY(1000);
1044         wmb();
1045         i = 0;
1046         while (*confirm != 0xffffffff && i < 20) {
1047                 DELAY(1000*10);
1048                 i++;
1049                 bus_dmamap_sync(sc->cmd_dma.dmat, 
1050                                 sc->cmd_dma.map, BUS_DMASYNC_POSTREAD);
1051         }
1052         if (*confirm != 0xffffffff) {
1053                 device_printf(sc->dev,"handoff failed (%p = 0x%x)", 
1054                         confirm, *confirm);
1055                 
1056                 return ENXIO;
1057         }
1058         return 0;
1059 }
1060
1061 static int
1062 mxge_update_mac_address(mxge_softc_t *sc)
1063 {
1064         mxge_cmd_t cmd;
1065         uint8_t *addr = sc->mac_addr;
1066         int status;
1067
1068         
1069         cmd.data0 = ((addr[0] << 24) | (addr[1] << 16) 
1070                      | (addr[2] << 8) | addr[3]);
1071
1072         cmd.data1 = ((addr[4] << 8) | (addr[5]));
1073
1074         status = mxge_send_cmd(sc, MXGEFW_SET_MAC_ADDRESS, &cmd);
1075         return status;
1076 }
1077
1078 static int
1079 mxge_change_pause(mxge_softc_t *sc, int pause)
1080 {       
1081         mxge_cmd_t cmd;
1082         int status;
1083
1084         if (pause)
1085                 status = mxge_send_cmd(sc, MXGEFW_ENABLE_FLOW_CONTROL,
1086                                        &cmd);
1087         else
1088                 status = mxge_send_cmd(sc, MXGEFW_DISABLE_FLOW_CONTROL,
1089                                        &cmd);
1090
1091         if (status) {
1092                 device_printf(sc->dev, "Failed to set flow control mode\n");
1093                 return ENXIO;
1094         }
1095         sc->pause = pause;
1096         return 0;
1097 }
1098
1099 static void
1100 mxge_change_promisc(mxge_softc_t *sc, int promisc)
1101 {       
1102         mxge_cmd_t cmd;
1103         int status;
1104
1105         if( sc->ifp->if_serializer)
1106                 ASSERT_SERIALIZED(sc->ifp->if_serializer);
1107         if (mxge_always_promisc)
1108                 promisc = 1;
1109
1110         if (promisc)
1111                 status = mxge_send_cmd(sc, MXGEFW_ENABLE_PROMISC,
1112                                        &cmd);
1113         else
1114                 status = mxge_send_cmd(sc, MXGEFW_DISABLE_PROMISC,
1115                                        &cmd);
1116
1117         if (status) {
1118                 device_printf(sc->dev, "Failed to set promisc mode\n");
1119         }
1120 }
1121
1122 static void
1123 mxge_set_multicast_list(mxge_softc_t *sc)
1124 {
1125         mxge_cmd_t cmd;
1126         struct ifmultiaddr *ifma;
1127         struct ifnet *ifp = sc->ifp;
1128         int err;
1129
1130         if (ifp->if_serializer)
1131                 ASSERT_SERIALIZED(ifp->if_serializer);
1132
1133         /* This firmware is known to not support multicast */
1134         if (!sc->fw_multicast_support)
1135                 return;
1136
1137         /* Disable multicast filtering while we play with the lists*/
1138         err = mxge_send_cmd(sc, MXGEFW_ENABLE_ALLMULTI, &cmd);
1139         if (err != 0) {
1140                 device_printf(sc->dev, "Failed MXGEFW_ENABLE_ALLMULTI,"
1141                        " error status: %d\n", err);
1142                 return;
1143         }
1144         
1145         if (sc->adopted_rx_filter_bug)
1146                 return;
1147         
1148         if (ifp->if_flags & IFF_ALLMULTI)
1149                 /* request to disable multicast filtering, so quit here */
1150                 return;
1151
1152         /* Flush all the filters */
1153
1154         err = mxge_send_cmd(sc, MXGEFW_LEAVE_ALL_MULTICAST_GROUPS, &cmd);
1155         if (err != 0) {
1156                 device_printf(sc->dev, 
1157                               "Failed MXGEFW_LEAVE_ALL_MULTICAST_GROUPS"
1158                               ", error status: %d\n", err);
1159                 return;
1160         }
1161
1162         /* Walk the multicast list, and add each address */
1163
1164         LIST_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
1165                 if (ifma->ifma_addr->sa_family != AF_LINK)
1166                         continue;
1167                 bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr),
1168                       &cmd.data0, 4);
1169                 bcopy(LLADDR((struct sockaddr_dl *)ifma->ifma_addr) + 4,
1170                       &cmd.data1, 2);
1171                 cmd.data0 = htonl(cmd.data0);
1172                 cmd.data1 = htonl(cmd.data1);
1173                 err = mxge_send_cmd(sc, MXGEFW_JOIN_MULTICAST_GROUP, &cmd);
1174                 if (err != 0) {
1175                         device_printf(sc->dev, "Failed "
1176                                "MXGEFW_JOIN_MULTICAST_GROUP, error status:"
1177                                "%d\t", err);
1178                         /* abort, leaving multicast filtering off */
1179                         return;
1180                 }
1181         }
1182         /* Enable multicast filtering */
1183         err = mxge_send_cmd(sc, MXGEFW_DISABLE_ALLMULTI, &cmd);
1184         if (err != 0) {
1185                 device_printf(sc->dev, "Failed MXGEFW_DISABLE_ALLMULTI"
1186                        ", error status: %d\n", err);
1187         }
1188 }
1189
1190 static int
1191 mxge_max_mtu(mxge_softc_t *sc)
1192 {
1193         mxge_cmd_t cmd;
1194         int status;
1195
1196         if (MJUMPAGESIZE - MXGEFW_PAD >  MXGEFW_MAX_MTU)
1197                 return  MXGEFW_MAX_MTU - MXGEFW_PAD;
1198
1199         /* try to set nbufs to see if it we can
1200            use virtually contiguous jumbos */
1201         cmd.data0 = 0;
1202         status = mxge_send_cmd(sc, MXGEFW_CMD_ALWAYS_USE_N_BIG_BUFFERS,
1203                                &cmd);
1204         if (status == 0)
1205                 return  MXGEFW_MAX_MTU - MXGEFW_PAD;
1206
1207         /* otherwise, we're limited to MJUMPAGESIZE */
1208         return MJUMPAGESIZE - MXGEFW_PAD;
1209 }
1210
1211 static int
1212 mxge_reset(mxge_softc_t *sc, int interrupts_setup)
1213 {
1214         struct mxge_slice_state *ss;
1215         mxge_rx_done_t *rx_done;
1216         volatile uint32_t *irq_claim;
1217         mxge_cmd_t cmd;
1218         int slice, status;
1219
1220         /* try to send a reset command to the card to see if it
1221            is alive */
1222         memset(&cmd, 0, sizeof (cmd));
1223         status = mxge_send_cmd(sc, MXGEFW_CMD_RESET, &cmd);
1224         if (status != 0) {
1225                 device_printf(sc->dev, "failed reset\n");
1226                 return ENXIO;
1227         }
1228
1229         mxge_dummy_rdma(sc, 1);
1230
1231
1232         /* set the intrq size */
1233         cmd.data0 = sc->rx_ring_size;
1234         status = mxge_send_cmd(sc, MXGEFW_CMD_SET_INTRQ_SIZE, &cmd);
1235
1236         /* 
1237          * Even though we already know how many slices are supported
1238          * via mxge_slice_probe(), MXGEFW_CMD_GET_MAX_RSS_QUEUES
1239          * has magic side effects, and must be called after a reset.
1240          * It must be called prior to calling any RSS related cmds,
1241          * including assigning an interrupt queue for anything but
1242          * slice 0.  It must also be called *after*
1243          * MXGEFW_CMD_SET_INTRQ_SIZE, since the intrq size is used by
1244          * the firmware to compute offsets.
1245          */
1246          
1247         if (sc->num_slices > 1) {
1248                 /* ask the maximum number of slices it supports */
1249                 status = mxge_send_cmd(sc, MXGEFW_CMD_GET_MAX_RSS_QUEUES,
1250                                            &cmd);
1251                 if (status != 0) {
1252                         device_printf(sc->dev, 
1253                                       "failed to get number of slices\n");
1254                         return status;
1255                 }
1256                 /* 
1257                  * MXGEFW_CMD_ENABLE_RSS_QUEUES must be called prior
1258                  * to setting up the interrupt queue DMA
1259                  */
1260                 cmd.data0 = sc->num_slices;
1261                 cmd.data1 = MXGEFW_SLICE_INTR_MODE_ONE_PER_SLICE;
1262 #ifdef IFNET_BUF_RING
1263                 cmd.data1 |= MXGEFW_SLICE_ENABLE_MULTIPLE_TX_QUEUES;
1264 #endif
1265                 status = mxge_send_cmd(sc, MXGEFW_CMD_ENABLE_RSS_QUEUES,
1266                                            &cmd);
1267                 if (status != 0) {
1268                         device_printf(sc->dev,
1269                                       "failed to set number of slices\n");
1270                         return status;
1271                 }
1272         }
1273
1274
1275         if (interrupts_setup) {
1276                 /* Now exchange information about interrupts  */
1277                 for (slice = 0; slice < sc->num_slices; slice++) {
1278                         rx_done = &sc->ss[slice].rx_done;
1279                         memset(rx_done->entry, 0, sc->rx_ring_size);
1280                         cmd.data0 = MXGE_LOWPART_TO_U32(rx_done->dma.bus_addr);
1281                         cmd.data1 = MXGE_HIGHPART_TO_U32(rx_done->dma.bus_addr);
1282                         cmd.data2 = slice;
1283                         status |= mxge_send_cmd(sc,
1284                                                 MXGEFW_CMD_SET_INTRQ_DMA,
1285                                                 &cmd);
1286                 }
1287         }
1288
1289         status |= mxge_send_cmd(sc, 
1290                                 MXGEFW_CMD_GET_INTR_COAL_DELAY_OFFSET, &cmd);
1291         
1292
1293         sc->intr_coal_delay_ptr = (volatile uint32_t *)(sc->sram + cmd.data0);
1294
1295         status |= mxge_send_cmd(sc, MXGEFW_CMD_GET_IRQ_ACK_OFFSET, &cmd);
1296         irq_claim = (volatile uint32_t *)(sc->sram + cmd.data0);
1297
1298
1299         status |= mxge_send_cmd(sc,  MXGEFW_CMD_GET_IRQ_DEASSERT_OFFSET, 
1300                                 &cmd);
1301         sc->irq_deassert = (volatile uint32_t *)(sc->sram + cmd.data0);
1302         if (status != 0) {
1303                 device_printf(sc->dev, "failed set interrupt parameters\n");
1304                 return status;
1305         }
1306         
1307
1308         *sc->intr_coal_delay_ptr = htobe32(sc->intr_coal_delay);
1309
1310         
1311         /* run a DMA benchmark */
1312         (void) mxge_dma_test(sc, MXGEFW_DMA_TEST);
1313
1314         for (slice = 0; slice < sc->num_slices; slice++) {
1315                 ss = &sc->ss[slice];
1316
1317                 ss->irq_claim = irq_claim + (2 * slice);
1318                 /* reset mcp/driver shared state back to 0 */
1319                 ss->rx_done.idx = 0;
1320                 ss->rx_done.cnt = 0;
1321                 ss->tx.req = 0;
1322                 ss->tx.done = 0;
1323                 ss->tx.pkt_done = 0;
1324                 ss->tx.queue_active = 0;
1325                 ss->tx.activate = 0;
1326                 ss->tx.deactivate = 0;
1327                 ss->tx.wake = 0;
1328                 ss->tx.defrag = 0;
1329                 ss->tx.stall = 0;
1330                 ss->rx_big.cnt = 0;
1331                 ss->rx_small.cnt = 0;
1332                 ss->lro_bad_csum = 0;
1333                 ss->lro_queued = 0;
1334                 ss->lro_flushed = 0;
1335                 if (ss->fw_stats != NULL) {
1336                         ss->fw_stats->valid = 0;
1337                         ss->fw_stats->send_done_count = 0;
1338                 }
1339         }
1340         sc->rdma_tags_available = 15;
1341         status = mxge_update_mac_address(sc);
1342         mxge_change_promisc(sc, sc->ifp->if_flags & IFF_PROMISC);
1343         mxge_change_pause(sc, sc->pause);
1344         mxge_set_multicast_list(sc);
1345         return status;
1346 }
1347
1348 static int
1349 mxge_change_intr_coal(SYSCTL_HANDLER_ARGS)
1350 {
1351         mxge_softc_t *sc;
1352         unsigned int intr_coal_delay;
1353         int err;
1354
1355         sc = arg1;
1356         intr_coal_delay = sc->intr_coal_delay;
1357         err = sysctl_handle_int(oidp, &intr_coal_delay, arg2, req);
1358         if (err != 0) {
1359                 return err;
1360         }
1361         if (intr_coal_delay == sc->intr_coal_delay)
1362                 return 0;
1363
1364         if (intr_coal_delay == 0 || intr_coal_delay > 1000*1000)
1365                 return EINVAL;
1366
1367         lwkt_serialize_enter(sc->ifp->if_serializer);
1368         *sc->intr_coal_delay_ptr = htobe32(intr_coal_delay);
1369         sc->intr_coal_delay = intr_coal_delay;
1370
1371         lwkt_serialize_exit(sc->ifp->if_serializer);
1372         return err;
1373 }
1374
1375 static int
1376 mxge_change_flow_control(SYSCTL_HANDLER_ARGS)
1377 {
1378         mxge_softc_t *sc;
1379         unsigned int enabled;
1380         int err;
1381
1382         sc = arg1;
1383         enabled = sc->pause;
1384         err = sysctl_handle_int(oidp, &enabled, arg2, req);
1385         if (err != 0) {
1386                 return err;
1387         }
1388         if (enabled == sc->pause)
1389                 return 0;
1390
1391         lwkt_serialize_enter(sc->ifp->if_serializer);
1392         err = mxge_change_pause(sc, enabled);
1393         lwkt_serialize_exit(sc->ifp->if_serializer);
1394         return err;
1395 }
1396
1397 static int
1398 mxge_change_lro_locked(mxge_softc_t *sc, int lro_cnt)
1399 {
1400         struct ifnet *ifp;
1401         int err = 0;
1402
1403         ifp = sc->ifp;
1404         if (lro_cnt == 0) 
1405                 ifp->if_capenable &= ~IFCAP_LRO;
1406         else
1407                 ifp->if_capenable |= IFCAP_LRO;
1408         sc->lro_cnt = lro_cnt;
1409         if (ifp->if_flags & IFF_RUNNING) {
1410                 mxge_close(sc);
1411                 err = mxge_open(sc);
1412         }
1413         return err;
1414 }
1415
1416 static int
1417 mxge_change_lro(SYSCTL_HANDLER_ARGS)
1418 {
1419         mxge_softc_t *sc;
1420         unsigned int lro_cnt;
1421         int err;
1422
1423         sc = arg1;
1424         lro_cnt = sc->lro_cnt;
1425         err = sysctl_handle_int(oidp, &lro_cnt, arg2, req);
1426         if (err != 0)
1427                 return err;
1428
1429         if (lro_cnt == sc->lro_cnt)
1430                 return 0;
1431
1432         if (lro_cnt > 128)
1433                 return EINVAL;
1434
1435         lwkt_serialize_enter(sc->ifp->if_serializer);
1436         err = mxge_change_lro_locked(sc, lro_cnt);
1437         lwkt_serialize_exit(sc->ifp->if_serializer);
1438         return err;
1439 }
1440
1441 static int
1442 mxge_handle_be32(SYSCTL_HANDLER_ARGS)
1443 {
1444         int err;
1445
1446         if (arg1 == NULL)
1447                 return EFAULT;
1448         arg2 = be32toh(*(int *)arg1);
1449         arg1 = NULL;
1450         err = sysctl_handle_int(oidp, arg1, arg2, req);
1451
1452         return err;
1453 }
1454
1455 static void
1456 mxge_rem_sysctls(mxge_softc_t *sc)
1457 {
1458         struct mxge_slice_state *ss;
1459         int slice;
1460
1461         if (sc->slice_sysctl_tree == NULL)
1462                 return;
1463
1464         for (slice = 0; slice < sc->num_slices; slice++) {
1465                 ss = &sc->ss[slice];
1466                 if (ss == NULL || ss->sysctl_tree == NULL)
1467                         continue;
1468                 sysctl_ctx_free(&ss->sysctl_ctx);
1469                 ss->sysctl_tree = NULL;
1470         }
1471         sysctl_ctx_free(&sc->slice_sysctl_ctx);
1472         sc->slice_sysctl_tree = NULL;
1473         sysctl_ctx_free(&sc->sysctl_ctx);
1474         sc->sysctl_tree = NULL;
1475
1476 }
1477
1478 static void
1479 mxge_add_sysctls(mxge_softc_t *sc)
1480 {
1481         struct sysctl_ctx_list *ctx;
1482         struct sysctl_oid_list *children;
1483         mcp_irq_data_t *fw;
1484         struct mxge_slice_state *ss;
1485         int slice;
1486         char slice_num[8];
1487
1488         ctx = &sc->sysctl_ctx;
1489         sysctl_ctx_init(ctx);
1490         sc->sysctl_tree = SYSCTL_ADD_NODE(ctx, SYSCTL_STATIC_CHILDREN(_hw),
1491                                           OID_AUTO,
1492                                           device_get_nameunit(sc->dev),
1493                                           CTLFLAG_RD, 0, "");
1494         if (sc->sysctl_tree == NULL) {
1495                 device_printf(sc->dev, "can't add sysctl node\n");
1496                 return;
1497         }
1498
1499         children = SYSCTL_CHILDREN(sc->sysctl_tree);
1500         fw = sc->ss[0].fw_stats;
1501
1502         /* random information */
1503         SYSCTL_ADD_STRING(ctx, children, OID_AUTO, 
1504                        "firmware_version",
1505                        CTLFLAG_RD, &sc->fw_version,
1506                        0, "firmware version");
1507         SYSCTL_ADD_STRING(ctx, children, OID_AUTO, 
1508                        "serial_number",
1509                        CTLFLAG_RD, &sc->serial_number_string,
1510                        0, "serial number");
1511         SYSCTL_ADD_STRING(ctx, children, OID_AUTO, 
1512                        "product_code",
1513                        CTLFLAG_RD, &sc->product_code_string,
1514                        0, "product_code");
1515         SYSCTL_ADD_INT(ctx, children, OID_AUTO, 
1516                        "pcie_link_width",
1517                        CTLFLAG_RD, &sc->link_width,
1518                        0, "tx_boundary");
1519         SYSCTL_ADD_INT(ctx, children, OID_AUTO, 
1520                        "tx_boundary",
1521                        CTLFLAG_RD, &sc->tx_boundary,
1522                        0, "tx_boundary");
1523         SYSCTL_ADD_INT(ctx, children, OID_AUTO, 
1524                        "write_combine",
1525                        CTLFLAG_RD, &sc->wc,
1526                        0, "write combining PIO?");
1527         SYSCTL_ADD_INT(ctx, children, OID_AUTO, 
1528                        "read_dma_MBs",
1529                        CTLFLAG_RD, &sc->read_dma,
1530                        0, "DMA Read speed in MB/s");
1531         SYSCTL_ADD_INT(ctx, children, OID_AUTO, 
1532                        "write_dma_MBs",
1533                        CTLFLAG_RD, &sc->write_dma,
1534                        0, "DMA Write speed in MB/s");
1535         SYSCTL_ADD_INT(ctx, children, OID_AUTO, 
1536                        "read_write_dma_MBs",
1537                        CTLFLAG_RD, &sc->read_write_dma,
1538                        0, "DMA concurrent Read/Write speed in MB/s");
1539
1540
1541         /* performance related tunables */
1542         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 
1543                         "intr_coal_delay",
1544                         CTLTYPE_INT|CTLFLAG_RW, sc,
1545                         0, mxge_change_intr_coal, 
1546                         "I", "interrupt coalescing delay in usecs");
1547
1548         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 
1549                         "flow_control_enabled",
1550                         CTLTYPE_INT|CTLFLAG_RW, sc,
1551                         0, mxge_change_flow_control,
1552                         "I", "interrupt coalescing delay in usecs");
1553
1554         SYSCTL_ADD_INT(ctx, children, OID_AUTO, 
1555                        "deassert_wait",
1556                        CTLFLAG_RW, &mxge_deassert_wait,
1557                        0, "Wait for IRQ line to go low in ihandler");
1558
1559         /* stats block from firmware is in network byte order.  
1560            Need to swap it */
1561         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 
1562                         "link_up",
1563                         CTLTYPE_INT|CTLFLAG_RD, &fw->link_up,
1564                         0, mxge_handle_be32,
1565                         "I", "link up");
1566         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 
1567                         "rdma_tags_available",
1568                         CTLTYPE_INT|CTLFLAG_RD, &fw->rdma_tags_available,
1569                         0, mxge_handle_be32,
1570                         "I", "rdma_tags_available");
1571         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 
1572                         "dropped_bad_crc32",
1573                         CTLTYPE_INT|CTLFLAG_RD, 
1574                         &fw->dropped_bad_crc32,
1575                         0, mxge_handle_be32,
1576                         "I", "dropped_bad_crc32");
1577         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 
1578                         "dropped_bad_phy",
1579                         CTLTYPE_INT|CTLFLAG_RD, 
1580                         &fw->dropped_bad_phy,
1581                         0, mxge_handle_be32,
1582                         "I", "dropped_bad_phy");
1583         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 
1584                         "dropped_link_error_or_filtered",
1585                         CTLTYPE_INT|CTLFLAG_RD, 
1586                         &fw->dropped_link_error_or_filtered,
1587                         0, mxge_handle_be32,
1588                         "I", "dropped_link_error_or_filtered");
1589         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 
1590                         "dropped_link_overflow",
1591                         CTLTYPE_INT|CTLFLAG_RD, &fw->dropped_link_overflow,
1592                         0, mxge_handle_be32,
1593                         "I", "dropped_link_overflow");
1594         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 
1595                         "dropped_multicast_filtered",
1596                         CTLTYPE_INT|CTLFLAG_RD, 
1597                         &fw->dropped_multicast_filtered,
1598                         0, mxge_handle_be32,
1599                         "I", "dropped_multicast_filtered");
1600         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 
1601                         "dropped_no_big_buffer",
1602                         CTLTYPE_INT|CTLFLAG_RD, &fw->dropped_no_big_buffer,
1603                         0, mxge_handle_be32,
1604                         "I", "dropped_no_big_buffer");
1605         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 
1606                         "dropped_no_small_buffer",
1607                         CTLTYPE_INT|CTLFLAG_RD, 
1608                         &fw->dropped_no_small_buffer,
1609                         0, mxge_handle_be32,
1610                         "I", "dropped_no_small_buffer");
1611         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 
1612                         "dropped_overrun",
1613                         CTLTYPE_INT|CTLFLAG_RD, &fw->dropped_overrun,
1614                         0, mxge_handle_be32,
1615                         "I", "dropped_overrun");
1616         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 
1617                         "dropped_pause",
1618                         CTLTYPE_INT|CTLFLAG_RD, 
1619                         &fw->dropped_pause,
1620                         0, mxge_handle_be32,
1621                         "I", "dropped_pause");
1622         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 
1623                         "dropped_runt",
1624                         CTLTYPE_INT|CTLFLAG_RD, &fw->dropped_runt,
1625                         0, mxge_handle_be32,
1626                         "I", "dropped_runt");
1627
1628         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 
1629                         "dropped_unicast_filtered",
1630                         CTLTYPE_INT|CTLFLAG_RD, &fw->dropped_unicast_filtered,
1631                         0, mxge_handle_be32,
1632                         "I", "dropped_unicast_filtered");
1633
1634         /* verbose printing? */
1635         SYSCTL_ADD_INT(ctx, children, OID_AUTO, 
1636                        "verbose",
1637                        CTLFLAG_RW, &mxge_verbose,
1638                        0, "verbose printing");
1639
1640         /* lro */
1641         SYSCTL_ADD_PROC(ctx, children, OID_AUTO, 
1642                         "lro_cnt",
1643                         CTLTYPE_INT|CTLFLAG_RW, sc,
1644                         0, mxge_change_lro,
1645                         "I", "number of lro merge queues");
1646
1647
1648         /* add counters exported for debugging from all slices */
1649         sysctl_ctx_init(&sc->slice_sysctl_ctx);
1650         sc->slice_sysctl_tree = 
1651                 SYSCTL_ADD_NODE(&sc->slice_sysctl_ctx, children, OID_AUTO,
1652                                 "slice", CTLFLAG_RD, 0, "");
1653
1654         for (slice = 0; slice < sc->num_slices; slice++) {
1655                 ss = &sc->ss[slice];
1656                 sysctl_ctx_init(&ss->sysctl_ctx);
1657                 ctx = &ss->sysctl_ctx;
1658                 children = SYSCTL_CHILDREN(sc->slice_sysctl_tree);
1659                 ksprintf(slice_num, "%d", slice);
1660                 ss->sysctl_tree = 
1661                         SYSCTL_ADD_NODE(ctx, children, OID_AUTO, slice_num,
1662                                         CTLFLAG_RD, 0, "");
1663                 children = SYSCTL_CHILDREN(ss->sysctl_tree);
1664                 SYSCTL_ADD_INT(ctx, children, OID_AUTO, 
1665                                "rx_small_cnt",
1666                                CTLFLAG_RD, &ss->rx_small.cnt,
1667                                0, "rx_small_cnt");
1668                 SYSCTL_ADD_INT(ctx, children, OID_AUTO, 
1669                                "rx_big_cnt",
1670                                CTLFLAG_RD, &ss->rx_big.cnt,
1671                                0, "rx_small_cnt");
1672                 SYSCTL_ADD_INT(ctx, children, OID_AUTO,
1673                                "lro_flushed", CTLFLAG_RD, &ss->lro_flushed,
1674                                0, "number of lro merge queues flushed");
1675
1676                 SYSCTL_ADD_INT(ctx, children, OID_AUTO,
1677                                "lro_queued", CTLFLAG_RD, &ss->lro_queued,
1678                                0, "number of frames appended to lro merge"
1679                                "queues");
1680
1681 #ifndef IFNET_BUF_RING
1682                 /* only transmit from slice 0 for now */
1683                 if (slice > 0)
1684                         continue;
1685 #endif
1686                 SYSCTL_ADD_INT(ctx, children, OID_AUTO, 
1687                                "tx_req",
1688                                CTLFLAG_RD, &ss->tx.req,
1689                                0, "tx_req");
1690
1691                 SYSCTL_ADD_INT(ctx, children, OID_AUTO, 
1692                                "tx_done",
1693                                CTLFLAG_RD, &ss->tx.done,
1694                                0, "tx_done");
1695                 SYSCTL_ADD_INT(ctx, children, OID_AUTO, 
1696                                "tx_pkt_done",
1697                                CTLFLAG_RD, &ss->tx.pkt_done,
1698                                0, "tx_done");
1699                 SYSCTL_ADD_INT(ctx, children, OID_AUTO, 
1700                                "tx_stall",
1701                                CTLFLAG_RD, &ss->tx.stall,
1702                                0, "tx_stall");
1703                 SYSCTL_ADD_INT(ctx, children, OID_AUTO, 
1704                                "tx_wake",
1705                                CTLFLAG_RD, &ss->tx.wake,
1706                                0, "tx_wake");
1707                 SYSCTL_ADD_INT(ctx, children, OID_AUTO, 
1708                                "tx_defrag",
1709                                CTLFLAG_RD, &ss->tx.defrag,
1710                                0, "tx_defrag");
1711                 SYSCTL_ADD_INT(ctx, children, OID_AUTO, 
1712                                "tx_queue_active",
1713                                CTLFLAG_RD, &ss->tx.queue_active,
1714                                0, "tx_queue_active");
1715                 SYSCTL_ADD_INT(ctx, children, OID_AUTO, 
1716                                "tx_activate",
1717                                CTLFLAG_RD, &ss->tx.activate,
1718                                0, "tx_activate");
1719                 SYSCTL_ADD_INT(ctx, children, OID_AUTO, 
1720                                "tx_deactivate",
1721                                CTLFLAG_RD, &ss->tx.deactivate,
1722                                0, "tx_deactivate");
1723         }
1724 }
1725
1726 /* copy an array of mcp_kreq_ether_send_t's to the mcp.  Copy 
1727    backwards one at a time and handle ring wraps */
1728
1729 static inline void 
1730 mxge_submit_req_backwards(mxge_tx_ring_t *tx, 
1731                             mcp_kreq_ether_send_t *src, int cnt)
1732 {
1733         int idx, starting_slot;
1734         starting_slot = tx->req;
1735         while (cnt > 1) {
1736                 cnt--;
1737                 idx = (starting_slot + cnt) & tx->mask;
1738                 mxge_pio_copy(&tx->lanai[idx],
1739                               &src[cnt], sizeof(*src));
1740                 wmb();
1741         }
1742 }
1743
1744 /*
1745  * copy an array of mcp_kreq_ether_send_t's to the mcp.  Copy
1746  * at most 32 bytes at a time, so as to avoid involving the software
1747  * pio handler in the nic.   We re-write the first segment's flags
1748  * to mark them valid only after writing the entire chain 
1749  */
1750
1751 static inline void 
1752 mxge_submit_req(mxge_tx_ring_t *tx, mcp_kreq_ether_send_t *src, 
1753                   int cnt)
1754 {
1755         int idx, i;
1756         uint32_t *src_ints;
1757         volatile uint32_t *dst_ints;
1758         mcp_kreq_ether_send_t *srcp;
1759         volatile mcp_kreq_ether_send_t *dstp, *dst;
1760         uint8_t last_flags;
1761         
1762         idx = tx->req & tx->mask;
1763
1764         last_flags = src->flags;
1765         src->flags = 0;
1766         wmb();
1767         dst = dstp = &tx->lanai[idx];
1768         srcp = src;
1769
1770         if ((idx + cnt) < tx->mask) {
1771                 for (i = 0; i < (cnt - 1); i += 2) {
1772                         mxge_pio_copy(dstp, srcp, 2 * sizeof(*src));
1773                         wmb(); /* force write every 32 bytes */
1774                         srcp += 2;
1775                         dstp += 2;
1776                 }
1777         } else {
1778                 /* submit all but the first request, and ensure 
1779                    that it is submitted below */
1780                 mxge_submit_req_backwards(tx, src, cnt);
1781                 i = 0;
1782         }
1783         if (i < cnt) {
1784                 /* submit the first request */
1785                 mxge_pio_copy(dstp, srcp, sizeof(*src));
1786                 wmb(); /* barrier before setting valid flag */
1787         }
1788
1789         /* re-write the last 32-bits with the valid flags */
1790         src->flags = last_flags;
1791         src_ints = (uint32_t *)src;
1792         src_ints+=3;
1793         dst_ints = (volatile uint32_t *)dst;
1794         dst_ints+=3;
1795         *dst_ints =  *src_ints;
1796         tx->req += cnt;
1797         wmb();
1798 }
1799
1800 #if IFCAP_TSO4
1801
1802 static void
1803 mxge_encap_tso(struct mxge_slice_state *ss, struct mbuf *m,
1804                int busdma_seg_cnt, int ip_off)
1805 {
1806         mxge_tx_ring_t *tx;
1807         mcp_kreq_ether_send_t *req;
1808         bus_dma_segment_t *seg;
1809         struct ip *ip;
1810         struct tcphdr *tcp;
1811         uint32_t low, high_swapped;
1812         int len, seglen, cum_len, cum_len_next;
1813         int next_is_first, chop, cnt, rdma_count, small;
1814         uint16_t pseudo_hdr_offset, cksum_offset, mss;
1815         uint8_t flags, flags_next;
1816         static int once;
1817
1818         mss = m->m_pkthdr.tso_segsz;
1819
1820         /* negative cum_len signifies to the
1821          * send loop that we are still in the
1822          * header portion of the TSO packet.
1823          */
1824
1825         /* ensure we have the ethernet, IP and TCP
1826            header together in the first mbuf, copy
1827            it to a scratch buffer if not */
1828         if (__predict_false(m->m_len < ip_off + sizeof (*ip))) {
1829                 m_copydata(m, 0, ip_off + sizeof (*ip),
1830                            ss->scratch);
1831                 ip = (struct ip *)(ss->scratch + ip_off);
1832         } else {
1833                 ip = (struct ip *)(mtod(m, char *) + ip_off);
1834         }
1835         if (__predict_false(m->m_len < ip_off + (ip->ip_hl << 2)
1836                             + sizeof (*tcp))) {
1837                 m_copydata(m, 0, ip_off + (ip->ip_hl << 2)
1838                            + sizeof (*tcp),  ss->scratch);
1839                 ip = (struct ip *)(mtod(m, char *) + ip_off);
1840         } 
1841
1842         tcp = (struct tcphdr *)((char *)ip + (ip->ip_hl << 2));
1843         cum_len = -(ip_off + ((ip->ip_hl + tcp->th_off) << 2));
1844
1845         /* TSO implies checksum offload on this hardware */
1846         cksum_offset = ip_off + (ip->ip_hl << 2);
1847         flags = MXGEFW_FLAGS_TSO_HDR | MXGEFW_FLAGS_FIRST;
1848
1849         
1850         /* for TSO, pseudo_hdr_offset holds mss.
1851          * The firmware figures out where to put
1852          * the checksum by parsing the header. */
1853         pseudo_hdr_offset = htobe16(mss);
1854
1855         tx = &ss->tx;
1856         req = tx->req_list;
1857         seg = tx->seg_list;
1858         cnt = 0;
1859         rdma_count = 0;
1860         /* "rdma_count" is the number of RDMAs belonging to the
1861          * current packet BEFORE the current send request. For
1862          * non-TSO packets, this is equal to "count".
1863          * For TSO packets, rdma_count needs to be reset
1864          * to 0 after a segment cut.
1865          *
1866          * The rdma_count field of the send request is
1867          * the number of RDMAs of the packet starting at
1868          * that request. For TSO send requests with one ore more cuts
1869          * in the middle, this is the number of RDMAs starting
1870          * after the last cut in the request. All previous
1871          * segments before the last cut implicitly have 1 RDMA.
1872          *
1873          * Since the number of RDMAs is not known beforehand,
1874          * it must be filled-in retroactively - after each
1875          * segmentation cut or at the end of the entire packet.
1876          */
1877
1878         while (busdma_seg_cnt) {
1879                 /* Break the busdma segment up into pieces*/
1880                 low = MXGE_LOWPART_TO_U32(seg->ds_addr);
1881                 high_swapped =  htobe32(MXGE_HIGHPART_TO_U32(seg->ds_addr));
1882                 len = seg->ds_len;
1883
1884                 while (len) {
1885                         flags_next = flags & ~MXGEFW_FLAGS_FIRST;
1886                         seglen = len;
1887                         cum_len_next = cum_len + seglen;
1888                         (req-rdma_count)->rdma_count = rdma_count + 1;
1889                         if (__predict_true(cum_len >= 0)) {
1890                                 /* payload */
1891                                 chop = (cum_len_next > mss);
1892                                 cum_len_next = cum_len_next % mss;
1893                                 next_is_first = (cum_len_next == 0);
1894                                 flags |= chop * MXGEFW_FLAGS_TSO_CHOP;
1895                                 flags_next |= next_is_first *
1896                                         MXGEFW_FLAGS_FIRST;
1897                                 rdma_count |= -(chop | next_is_first);
1898                                 rdma_count += chop & !next_is_first;
1899                         } else if (cum_len_next >= 0) {
1900                                 /* header ends */
1901                                 rdma_count = -1;
1902                                 cum_len_next = 0;
1903                                 seglen = -cum_len;
1904                                 small = (mss <= MXGEFW_SEND_SMALL_SIZE);
1905                                 flags_next = MXGEFW_FLAGS_TSO_PLD |
1906                                         MXGEFW_FLAGS_FIRST | 
1907                                         (small * MXGEFW_FLAGS_SMALL);
1908                             }
1909                         
1910                         req->addr_high = high_swapped;
1911                         req->addr_low = htobe32(low);
1912                         req->pseudo_hdr_offset = pseudo_hdr_offset;
1913                         req->pad = 0;
1914                         req->rdma_count = 1;
1915                         req->length = htobe16(seglen);
1916                         req->cksum_offset = cksum_offset;
1917                         req->flags = flags | ((cum_len & 1) *
1918                                               MXGEFW_FLAGS_ALIGN_ODD);
1919                         low += seglen;
1920                         len -= seglen;
1921                         cum_len = cum_len_next;
1922                         flags = flags_next;
1923                         req++;
1924                         cnt++;
1925                         rdma_count++;
1926                         if (__predict_false(cksum_offset > seglen))
1927                                 cksum_offset -= seglen;
1928                         else
1929                                 cksum_offset = 0;
1930                         if (__predict_false(cnt > tx->max_desc))
1931                                 goto drop;
1932                 }
1933                 busdma_seg_cnt--;
1934                 seg++;
1935         }
1936         (req-rdma_count)->rdma_count = rdma_count;
1937
1938         do {
1939                 req--;
1940                 req->flags |= MXGEFW_FLAGS_TSO_LAST;
1941         } while (!(req->flags & (MXGEFW_FLAGS_TSO_CHOP | MXGEFW_FLAGS_FIRST)));
1942
1943         tx->info[((cnt - 1) + tx->req) & tx->mask].flag = 1;
1944         mxge_submit_req(tx, tx->req_list, cnt);
1945 #ifdef IFNET_BUF_RING
1946         if ((ss->sc->num_slices > 1) && tx->queue_active == 0) {
1947                 /* tell the NIC to start polling this slice */
1948                 *tx->send_go = 1;
1949                 tx->queue_active = 1;
1950                 tx->activate++;
1951                 wmb();
1952         }
1953 #endif
1954         return;
1955
1956 drop:
1957         bus_dmamap_unload(tx->dmat, tx->info[tx->req & tx->mask].map);
1958         m_freem(m);
1959         ss->oerrors++;
1960         if (!once) {
1961                 kprintf("tx->max_desc exceeded via TSO!\n");
1962                 kprintf("mss = %d, %ld, %d!\n", mss,
1963                        (long)seg - (long)tx->seg_list, tx->max_desc);
1964                 once = 1;
1965         }
1966         return;
1967
1968 }
1969
1970 #endif /* IFCAP_TSO4 */
1971
1972 #ifdef MXGE_NEW_VLAN_API
1973 /* 
1974  * We reproduce the software vlan tag insertion from
1975  * net/if_vlan.c:vlan_start() here so that we can advertise "hardware"
1976  * vlan tag insertion. We need to advertise this in order to have the
1977  * vlan interface respect our csum offload flags.
1978  */
1979 static struct mbuf *
1980 mxge_vlan_tag_insert(struct mbuf *m)
1981 {
1982         struct ether_vlan_header *evl;
1983
1984         M_PREPEND(m, EVL_ENCAPLEN, MB_DONTWAIT);
1985         if (__predict_false(m == NULL))
1986                 return NULL;
1987         if (m->m_len < sizeof(*evl)) {
1988                 m = m_pullup(m, sizeof(*evl));
1989                 if (__predict_false(m == NULL))
1990                         return NULL;
1991         }
1992         /*
1993          * Transform the Ethernet header into an Ethernet header
1994          * with 802.1Q encapsulation.
1995          */
1996         evl = mtod(m, struct ether_vlan_header *);
1997         bcopy((char *)evl + EVL_ENCAPLEN,
1998               (char *)evl, ETHER_HDR_LEN - ETHER_TYPE_LEN);
1999         evl->evl_encap_proto = htons(ETHERTYPE_VLAN);
2000         evl->evl_tag = htons(m->m_pkthdr.ether_vlantag);
2001         m->m_flags &= ~M_VLANTAG;
2002         return m;
2003 }
2004 #endif /* MXGE_NEW_VLAN_API */
2005
2006 static void
2007 mxge_encap(struct mxge_slice_state *ss, struct mbuf *m)
2008 {
2009         mxge_softc_t *sc;
2010         mcp_kreq_ether_send_t *req;
2011         bus_dma_segment_t *seg;
2012         struct mbuf *m_tmp;
2013         struct ifnet *ifp;
2014         mxge_tx_ring_t *tx;
2015         struct ip *ip;
2016         int cnt, cum_len, err, i, idx, odd_flag, ip_off;
2017         uint16_t pseudo_hdr_offset;
2018         uint8_t flags, cksum_offset;
2019
2020
2021         sc = ss->sc;
2022         ifp = sc->ifp;
2023         tx = &ss->tx;
2024
2025         ip_off = sizeof (struct ether_header);
2026 #ifdef MXGE_NEW_VLAN_API
2027         if (m->m_flags & M_VLANTAG) {
2028                 m = mxge_vlan_tag_insert(m);
2029                 if (__predict_false(m == NULL))
2030                         goto drop;
2031                 ip_off += EVL_ENCAPLEN;
2032         }
2033 #endif
2034         /* (try to) map the frame for DMA */
2035         idx = tx->req & tx->mask;
2036         err = bus_dmamap_load_mbuf_segment(tx->dmat, tx->info[idx].map,
2037                                            m, tx->seg_list, 1, &cnt, 
2038                                            BUS_DMA_NOWAIT);
2039         if (__predict_false(err == EFBIG)) {
2040                 /* Too many segments in the chain.  Try
2041                    to defrag */
2042                 m_tmp = m_defrag(m, M_NOWAIT);
2043                 if (m_tmp == NULL) {
2044                         goto drop;
2045                 }
2046                 ss->tx.defrag++;
2047                 m = m_tmp;
2048                 err = bus_dmamap_load_mbuf_segment(tx->dmat, 
2049                                               tx->info[idx].map,
2050                                               m, tx->seg_list, 1, &cnt, 
2051                                               BUS_DMA_NOWAIT);
2052         }
2053         if (__predict_false(err != 0)) {
2054                 device_printf(sc->dev, "bus_dmamap_load_mbuf_segment returned %d"
2055                               " packet len = %d\n", err, m->m_pkthdr.len);
2056                 goto drop;
2057         }
2058         bus_dmamap_sync(tx->dmat, tx->info[idx].map,
2059                         BUS_DMASYNC_PREWRITE);
2060         tx->info[idx].m = m;
2061
2062 #if IFCAP_TSO4
2063         /* TSO is different enough, we handle it in another routine */
2064         if (m->m_pkthdr.csum_flags & (CSUM_TSO)) {
2065                 mxge_encap_tso(ss, m, cnt, ip_off);
2066                 return;
2067         }
2068 #endif
2069
2070         req = tx->req_list;
2071         cksum_offset = 0;
2072         pseudo_hdr_offset = 0;
2073         flags = MXGEFW_FLAGS_NO_TSO;
2074
2075         /* checksum offloading? */
2076         if (m->m_pkthdr.csum_flags & (CSUM_DELAY_DATA)) {
2077                 /* ensure ip header is in first mbuf, copy
2078                    it to a scratch buffer if not */
2079                 if (__predict_false(m->m_len < ip_off + sizeof (*ip))) {
2080                         m_copydata(m, 0, ip_off + sizeof (*ip),
2081                                    ss->scratch);
2082                         ip = (struct ip *)(ss->scratch + ip_off);
2083                 } else {
2084                         ip = (struct ip *)(mtod(m, char *) + ip_off);
2085                 }
2086                 cksum_offset = ip_off + (ip->ip_hl << 2);
2087                 pseudo_hdr_offset = cksum_offset +  m->m_pkthdr.csum_data;
2088                 pseudo_hdr_offset = htobe16(pseudo_hdr_offset);
2089                 req->cksum_offset = cksum_offset;
2090                 flags |= MXGEFW_FLAGS_CKSUM;
2091                 odd_flag = MXGEFW_FLAGS_ALIGN_ODD;
2092         } else {
2093                 odd_flag = 0;
2094         }
2095         if (m->m_pkthdr.len < MXGEFW_SEND_SMALL_SIZE)
2096                 flags |= MXGEFW_FLAGS_SMALL;
2097
2098         /* convert segments into a request list */
2099         cum_len = 0;
2100         seg = tx->seg_list;
2101         req->flags = MXGEFW_FLAGS_FIRST;
2102         for (i = 0; i < cnt; i++) {
2103                 req->addr_low = 
2104                         htobe32(MXGE_LOWPART_TO_U32(seg->ds_addr));
2105                 req->addr_high = 
2106                         htobe32(MXGE_HIGHPART_TO_U32(seg->ds_addr));
2107                 req->length = htobe16(seg->ds_len);
2108                 req->cksum_offset = cksum_offset;
2109                 if (cksum_offset > seg->ds_len)
2110                         cksum_offset -= seg->ds_len;
2111                 else
2112                         cksum_offset = 0;
2113                 req->pseudo_hdr_offset = pseudo_hdr_offset;
2114                 req->pad = 0; /* complete solid 16-byte block */
2115                 req->rdma_count = 1;
2116                 req->flags |= flags | ((cum_len & 1) * odd_flag);
2117                 cum_len += seg->ds_len;
2118                 seg++;
2119                 req++;
2120                 req->flags = 0;
2121         }
2122         req--;
2123         /* pad runts to 60 bytes */
2124         if (cum_len < 60) {
2125                 req++;
2126                 req->addr_low = 
2127                         htobe32(MXGE_LOWPART_TO_U32(sc->zeropad_dma.bus_addr));
2128                 req->addr_high = 
2129                         htobe32(MXGE_HIGHPART_TO_U32(sc->zeropad_dma.bus_addr));
2130                 req->length = htobe16(60 - cum_len);
2131                 req->cksum_offset = 0;
2132                 req->pseudo_hdr_offset = pseudo_hdr_offset;
2133                 req->pad = 0; /* complete solid 16-byte block */
2134                 req->rdma_count = 1;
2135                 req->flags |= flags | ((cum_len & 1) * odd_flag);
2136                 cnt++;
2137         }
2138
2139         tx->req_list[0].rdma_count = cnt;
2140 #if 0
2141         /* print what the firmware will see */
2142         for (i = 0; i < cnt; i++) {
2143                 kprintf("%d: addr: 0x%x 0x%x len:%d pso%d,"
2144                     "cso:%d, flags:0x%x, rdma:%d\n",
2145                     i, (int)ntohl(tx->req_list[i].addr_high),
2146                     (int)ntohl(tx->req_list[i].addr_low),
2147                     (int)ntohs(tx->req_list[i].length),
2148                     (int)ntohs(tx->req_list[i].pseudo_hdr_offset),
2149                     tx->req_list[i].cksum_offset, tx->req_list[i].flags,
2150                     tx->req_list[i].rdma_count);
2151         }
2152         kprintf("--------------\n");
2153 #endif
2154         tx->info[((cnt - 1) + tx->req) & tx->mask].flag = 1;
2155         mxge_submit_req(tx, tx->req_list, cnt);
2156 #ifdef IFNET_BUF_RING
2157         if ((ss->sc->num_slices > 1) && tx->queue_active == 0) {
2158                 /* tell the NIC to start polling this slice */
2159                 *tx->send_go = 1;
2160                 tx->queue_active = 1;
2161                 tx->activate++;
2162                 wmb();
2163         }
2164 #endif
2165         return;
2166
2167 drop:
2168         m_freem(m);
2169         ss->oerrors++;
2170         return;
2171 }
2172
2173 #ifdef IFNET_BUF_RING
2174 static void
2175 mxge_qflush(struct ifnet *ifp)
2176 {
2177         mxge_softc_t *sc = ifp->if_softc;
2178         mxge_tx_ring_t *tx;
2179         struct mbuf *m;
2180         int slice;
2181
2182         for (slice = 0; slice < sc->num_slices; slice++) {
2183                 tx = &sc->ss[slice].tx;
2184                 lwkt_serialize_enter(sc->ifp->if_serializer);
2185                 while ((m = buf_ring_dequeue_sc(tx->br)) != NULL)
2186                         m_freem(m);
2187                 lwkt_serialize_exit(sc->ifp->if_serializer);
2188         }
2189         if_qflush(ifp);
2190 }
2191
2192 static inline void
2193 mxge_start_locked(struct mxge_slice_state *ss)
2194 {
2195         mxge_softc_t *sc;
2196         struct mbuf *m;
2197         struct ifnet *ifp;
2198         mxge_tx_ring_t *tx;
2199
2200         sc = ss->sc;
2201         ifp = sc->ifp;
2202         tx = &ss->tx;
2203
2204         while ((tx->mask - (tx->req - tx->done)) > tx->max_desc) {
2205                 m = drbr_dequeue(ifp, tx->br);
2206                 if (m == NULL) {
2207                         return;
2208                 }
2209                 /* let BPF see it */
2210                 BPF_MTAP(ifp, m);
2211
2212                 /* give it to the nic */
2213                 mxge_encap(ss, m);
2214         }
2215         /* ran out of transmit slots */
2216         if (((ss->if_flags & IFF_OACTIVE) == 0)
2217             && (!drbr_empty(ifp, tx->br))) {
2218                 ss->if_flags |= IFF_OACTIVE;
2219                 tx->stall++;
2220         }
2221 }
2222
2223 static int
2224 mxge_transmit_locked(struct mxge_slice_state *ss, struct mbuf *m)
2225 {
2226         mxge_softc_t *sc;
2227         struct ifnet *ifp;
2228         mxge_tx_ring_t *tx;
2229         int err;
2230
2231         sc = ss->sc;
2232         ifp = sc->ifp;
2233         tx = &ss->tx;
2234
2235         if ((ss->if_flags & (IFF_RUNNING|IFF_OACTIVE)) !=
2236             IFF_RUNNING) {
2237                 err = drbr_enqueue(ifp, tx->br, m);
2238                 return (err);
2239         }
2240
2241         if (drbr_empty(ifp, tx->br) &&
2242             ((tx->mask - (tx->req - tx->done)) > tx->max_desc)) {
2243                 /* let BPF see it */
2244                 BPF_MTAP(ifp, m);
2245                 /* give it to the nic */
2246                 mxge_encap(ss, m);
2247         } else if ((err = drbr_enqueue(ifp, tx->br, m)) != 0) {
2248                 return (err);
2249         }
2250         if (!drbr_empty(ifp, tx->br))
2251                 mxge_start_locked(ss);
2252         return (0);
2253 }
2254
2255 static int
2256 mxge_transmit(struct ifnet *ifp, struct mbuf *m)
2257 {
2258         mxge_softc_t *sc = ifp->if_softc;
2259         struct mxge_slice_state *ss;
2260         mxge_tx_ring_t *tx;
2261         int err = 0;
2262         int slice;
2263
2264 #if 0
2265         slice = m->m_pkthdr.flowid;
2266 #endif
2267         slice &= (sc->num_slices - 1);  /* num_slices always power of 2 */
2268
2269         ss = &sc->ss[slice];
2270         tx = &ss->tx;
2271
2272         if(lwkt_serialize_try(ifp->if_serializer)) {
2273                 err = mxge_transmit_locked(ss, m);
2274                 lwkt_serialize_exit(ifp->if_serializer);
2275         } else {
2276                 err = drbr_enqueue(ifp, tx->br, m);
2277         }
2278
2279         return (err);
2280 }
2281
2282 #else
2283
2284 static inline void
2285 mxge_start_locked(struct mxge_slice_state *ss)
2286 {
2287         mxge_softc_t *sc;
2288         struct mbuf *m;
2289         struct ifnet *ifp;
2290         mxge_tx_ring_t *tx;
2291
2292         sc = ss->sc;
2293         ifp = sc->ifp;
2294         tx = &ss->tx;
2295         while ((tx->mask - (tx->req - tx->done)) > tx->max_desc) {
2296                 m = ifq_dequeue(&ifp->if_snd, NULL);
2297                 if (m == NULL) {
2298                         return;
2299                 }
2300                 /* let BPF see it */
2301                 BPF_MTAP(ifp, m);
2302
2303                 /* give it to the nic */
2304                 mxge_encap(ss, m);
2305         }
2306         /* ran out of transmit slots */
2307         if ((sc->ifp->if_flags & IFF_OACTIVE) == 0) {
2308                 sc->ifp->if_flags |= IFF_OACTIVE;
2309                 tx->stall++;
2310         }
2311 }
2312 #endif
2313 static void
2314 mxge_start(struct ifnet *ifp)
2315 {
2316         mxge_softc_t *sc = ifp->if_softc;
2317         struct mxge_slice_state *ss;
2318
2319         ASSERT_SERIALIZED(sc->ifp->if_serializer);
2320         /* only use the first slice for now */
2321         ss = &sc->ss[0];
2322         mxge_start_locked(ss);
2323 }
2324
2325 /*
2326  * copy an array of mcp_kreq_ether_recv_t's to the mcp.  Copy
2327  * at most 32 bytes at a time, so as to avoid involving the software
2328  * pio handler in the nic.   We re-write the first segment's low
2329  * DMA address to mark it valid only after we write the entire chunk
2330  * in a burst
2331  */
2332 static inline void
2333 mxge_submit_8rx(volatile mcp_kreq_ether_recv_t *dst,
2334                 mcp_kreq_ether_recv_t *src)
2335 {
2336         uint32_t low;
2337
2338         low = src->addr_low;
2339         src->addr_low = 0xffffffff;
2340         mxge_pio_copy(dst, src, 4 * sizeof (*src));
2341         wmb();
2342         mxge_pio_copy(dst + 4, src + 4, 4 * sizeof (*src));
2343         wmb();
2344         src->addr_low = low;
2345         dst->addr_low = low;
2346         wmb();
2347 }
2348
2349 static int
2350 mxge_get_buf_small(struct mxge_slice_state *ss, bus_dmamap_t map, int idx)
2351 {
2352         bus_dma_segment_t seg;
2353         struct mbuf *m;
2354         mxge_rx_ring_t *rx = &ss->rx_small;
2355         int cnt, err;
2356
2357         m = m_gethdr(MB_DONTWAIT, MT_DATA);
2358         if (m == NULL) {
2359                 rx->alloc_fail++;
2360                 err = ENOBUFS;
2361                 goto done;
2362         }
2363         m->m_len = m->m_pkthdr.len = MHLEN;
2364         err = bus_dmamap_load_mbuf_segment(rx->dmat, map, m, 
2365                                       &seg, 1, &cnt, BUS_DMA_NOWAIT);
2366         if (err != 0) {
2367                 kprintf("can't dmamap small (%d)\n", err);
2368                 m_free(m);
2369                 goto done;
2370         }
2371         rx->info[idx].m = m;
2372         rx->shadow[idx].addr_low = 
2373                 htobe32(MXGE_LOWPART_TO_U32(seg.ds_addr));
2374         rx->shadow[idx].addr_high = 
2375                 htobe32(MXGE_HIGHPART_TO_U32(seg.ds_addr));
2376
2377 done:
2378         if ((idx & 7) == 7)
2379                 mxge_submit_8rx(&rx->lanai[idx - 7], &rx->shadow[idx - 7]);
2380         return err;
2381 }
2382
2383
2384 static int
2385 mxge_get_buf_big(struct mxge_slice_state *ss, bus_dmamap_t map, int idx)
2386 {
2387         bus_dma_segment_t seg[3];
2388         struct mbuf *m;
2389         mxge_rx_ring_t *rx = &ss->rx_big;
2390         int cnt, err, i;
2391
2392         if (rx->cl_size == MCLBYTES)
2393                 m = m_getcl(MB_DONTWAIT, MT_DATA, M_PKTHDR);
2394         else {
2395 #if 0
2396                 m = m_getjcl(MB_DONTWAIT, MT_DATA, M_PKTHDR, rx->cl_size);
2397 #else
2398                 /*
2399                  * XXX: allocate normal sized buffers for big buffers.
2400                  * We should be fine as long as we don't get any jumbo frames
2401                  */
2402                 m = m_getcl(MB_DONTWAIT, MT_DATA, M_PKTHDR);
2403 #endif
2404         }
2405         if (m == NULL) {
2406                 rx->alloc_fail++;
2407                 err = ENOBUFS;
2408                 goto done;
2409         }
2410         m->m_pkthdr.len = 0;
2411         m->m_len = m->m_pkthdr.len = rx->mlen;
2412         err = bus_dmamap_load_mbuf_segment(rx->dmat, map, m, 
2413                                       seg, 1, &cnt, BUS_DMA_NOWAIT);
2414         if (err != 0) {
2415                 kprintf("can't dmamap big (%d)\n", err);
2416                 m_free(m);
2417                 goto done;
2418         }
2419         rx->info[idx].m = m;
2420         rx->shadow[idx].addr_low = 
2421                 htobe32(MXGE_LOWPART_TO_U32(seg->ds_addr));
2422         rx->shadow[idx].addr_high = 
2423                 htobe32(MXGE_HIGHPART_TO_U32(seg->ds_addr));
2424
2425 #if MXGE_VIRT_JUMBOS
2426         for (i = 1; i < cnt; i++) {
2427                 rx->shadow[idx + i].addr_low = 
2428                         htobe32(MXGE_LOWPART_TO_U32(seg[i].ds_addr));
2429                 rx->shadow[idx + i].addr_high = 
2430                         htobe32(MXGE_HIGHPART_TO_U32(seg[i].ds_addr));
2431        }
2432 #endif
2433
2434 done:
2435        for (i = 0; i < rx->nbufs; i++) {
2436                 if ((idx & 7) == 7) {
2437                         mxge_submit_8rx(&rx->lanai[idx - 7],
2438                                         &rx->shadow[idx - 7]);
2439                 }
2440                 idx++;
2441         }
2442         return err;
2443 }
2444
2445 /* 
2446  *  Myri10GE hardware checksums are not valid if the sender
2447  *  padded the frame with non-zero padding.  This is because
2448  *  the firmware just does a simple 16-bit 1s complement
2449  *  checksum across the entire frame, excluding the first 14
2450  *  bytes.  It is best to simply to check the checksum and
2451  *  tell the stack about it only if the checksum is good
2452  */
2453
2454 static inline uint16_t
2455 mxge_rx_csum(struct mbuf *m, int csum)
2456 {
2457         struct ether_header *eh;
2458         struct ip *ip;
2459         uint16_t c;
2460
2461         eh = mtod(m, struct ether_header *);
2462
2463         /* only deal with IPv4 TCP & UDP for now */
2464         if (__predict_false(eh->ether_type != htons(ETHERTYPE_IP)))
2465                 return 1;
2466         ip = (struct ip *)(eh + 1);
2467         if (__predict_false(ip->ip_p != IPPROTO_TCP &&
2468                             ip->ip_p != IPPROTO_UDP))
2469                 return 1;
2470 #ifdef INET
2471         c = in_pseudo(ip->ip_src.s_addr, ip->ip_dst.s_addr,
2472                       htonl(ntohs(csum) + ntohs(ip->ip_len) +
2473                             - (ip->ip_hl << 2) + ip->ip_p));
2474 #else
2475         c = 1;
2476 #endif
2477         c ^= 0xffff;
2478         return (c);
2479 }
2480
2481 static void
2482 mxge_vlan_tag_remove(struct mbuf *m, uint32_t *csum)
2483 {
2484         struct ether_vlan_header *evl;
2485         struct ether_header *eh;
2486         uint32_t partial;
2487
2488         evl = mtod(m, struct ether_vlan_header *);
2489         eh = mtod(m, struct ether_header *);
2490
2491         /*
2492          * fix checksum by subtracting EVL_ENCAPLEN bytes
2493          * after what the firmware thought was the end of the ethernet
2494          * header.
2495          */
2496
2497         /* put checksum into host byte order */
2498         *csum = ntohs(*csum); 
2499         partial = ntohl(*(uint32_t *)(mtod(m, char *) + ETHER_HDR_LEN));
2500         (*csum) += ~partial;
2501         (*csum) +=  ((*csum) < ~partial);
2502         (*csum) = ((*csum) >> 16) + ((*csum) & 0xFFFF);
2503         (*csum) = ((*csum) >> 16) + ((*csum) & 0xFFFF);
2504
2505         /* restore checksum to network byte order; 
2506            later consumers expect this */
2507         *csum = htons(*csum);
2508
2509         /* save the tag */
2510 #ifdef MXGE_NEW_VLAN_API        
2511         m->m_pkthdr.ether_vlantag = ntohs(evl->evl_tag);
2512 #else
2513         {
2514                 struct m_tag *mtag;
2515                 mtag = m_tag_alloc(MTAG_VLAN, MTAG_VLAN_TAG, sizeof(u_int),
2516                                    MB_DONTWAIT);
2517                 if (mtag == NULL)
2518                         return;
2519                 VLAN_TAG_VALUE(mtag) = ntohs(evl->evl_tag);
2520                 m_tag_prepend(m, mtag);
2521         }
2522
2523 #endif
2524         m->m_flags |= M_VLANTAG;
2525
2526         /*
2527          * Remove the 802.1q header by copying the Ethernet
2528          * addresses over it and adjusting the beginning of
2529          * the data in the mbuf.  The encapsulated Ethernet
2530          * type field is already in place.
2531          */
2532         bcopy((char *)evl, (char *)evl + EVL_ENCAPLEN,
2533               ETHER_HDR_LEN - ETHER_TYPE_LEN);
2534         m_adj(m, EVL_ENCAPLEN);
2535 }
2536
2537
2538 static inline void
2539 mxge_rx_done_big(struct mxge_slice_state *ss, uint32_t len, uint32_t csum,
2540                    struct mbuf_chain *chain)
2541 {
2542         mxge_softc_t *sc;
2543         struct ifnet *ifp;
2544         struct mbuf *m;
2545         struct ether_header *eh;
2546         mxge_rx_ring_t *rx;
2547         bus_dmamap_t old_map;
2548         int idx;
2549         uint16_t tcpudp_csum;
2550
2551         sc = ss->sc;
2552         ifp = sc->ifp;
2553         rx = &ss->rx_big;
2554         idx = rx->cnt & rx->mask;
2555         rx->cnt += rx->nbufs;
2556         /* save a pointer to the received mbuf */
2557         m = rx->info[idx].m;
2558         /* try to replace the received mbuf */
2559         if (mxge_get_buf_big(ss, rx->extra_map, idx)) {
2560                 /* drop the frame -- the old mbuf is re-cycled */
2561                 ifp->if_ierrors++;
2562                 return;
2563         }
2564
2565         /* unmap the received buffer */
2566         old_map = rx->info[idx].map;
2567         bus_dmamap_sync(rx->dmat, old_map, BUS_DMASYNC_POSTREAD);
2568         bus_dmamap_unload(rx->dmat, old_map);
2569
2570         /* swap the bus_dmamap_t's */
2571         rx->info[idx].map = rx->extra_map;
2572         rx->extra_map = old_map;
2573
2574         /* mcp implicitly skips 1st 2 bytes so that packet is properly
2575          * aligned */
2576         m->m_data += MXGEFW_PAD;
2577
2578         m->m_pkthdr.rcvif = ifp;
2579         m->m_len = m->m_pkthdr.len = len;
2580         ss->ipackets++;
2581         eh = mtod(m, struct ether_header *);
2582         if (eh->ether_type == htons(ETHERTYPE_VLAN)) {
2583                 mxge_vlan_tag_remove(m, &csum);
2584         }
2585         /* if the checksum is valid, mark it in the mbuf header */
2586         if (sc->csum_flag && (0 == (tcpudp_csum = mxge_rx_csum(m, csum)))) {
2587                 if (sc->lro_cnt && (0 == mxge_lro_rx(ss, m, csum)))
2588                         return;
2589                 /* otherwise, it was a UDP frame, or a TCP frame which
2590                    we could not do LRO on.  Tell the stack that the
2591                    checksum is good */
2592                 m->m_pkthdr.csum_data = 0xffff;
2593                 m->m_pkthdr.csum_flags = CSUM_PSEUDO_HDR | CSUM_DATA_VALID;
2594         }
2595 #if 0
2596         /* flowid only valid if RSS hashing is enabled */
2597         if (sc->num_slices > 1) {
2598                 m->m_pkthdr.flowid = (ss - sc->ss);
2599                 m->m_flags |= M_FLOWID;
2600         }
2601 #endif
2602         ether_input_chain(ifp, m, NULL, chain);
2603 }
2604
2605 static inline void
2606 mxge_rx_done_small(struct mxge_slice_state *ss, uint32_t len, uint32_t csum,
2607                    struct mbuf_chain *chain)
2608 {
2609         mxge_softc_t *sc;
2610         struct ifnet *ifp;
2611         struct ether_header *eh;
2612         struct mbuf *m;
2613         mxge_rx_ring_t *rx;
2614         bus_dmamap_t old_map;
2615         int idx;
2616         uint16_t tcpudp_csum;
2617
2618         sc = ss->sc;
2619         ifp = sc->ifp;
2620         rx = &ss->rx_small;
2621         idx = rx->cnt & rx->mask;
2622         rx->cnt++;
2623         /* save a pointer to the received mbuf */
2624         m = rx->info[idx].m;
2625         /* try to replace the received mbuf */
2626         if (mxge_get_buf_small(ss, rx->extra_map, idx)) {
2627                 /* drop the frame -- the old mbuf is re-cycled */
2628                 ifp->if_ierrors++;
2629                 return;
2630         }
2631
2632         /* unmap the received buffer */
2633         old_map = rx->info[idx].map;
2634         bus_dmamap_sync(rx->dmat, old_map, BUS_DMASYNC_POSTREAD);
2635         bus_dmamap_unload(rx->dmat, old_map);
2636
2637         /* swap the bus_dmamap_t's */
2638         rx->info[idx].map = rx->extra_map;
2639         rx->extra_map = old_map;
2640
2641         /* mcp implicitly skips 1st 2 bytes so that packet is properly
2642          * aligned */
2643         m->m_data += MXGEFW_PAD;
2644
2645         m->m_pkthdr.rcvif = ifp;
2646         m->m_len = m->m_pkthdr.len = len;
2647         ss->ipackets++;
2648         eh = mtod(m, struct ether_header *);
2649         if (eh->ether_type == htons(ETHERTYPE_VLAN)) {
2650                 mxge_vlan_tag_remove(m, &csum);
2651         }
2652         /* if the checksum is valid, mark it in the mbuf header */
2653         if (sc->csum_flag && (0 == (tcpudp_csum = mxge_rx_csum(m, csum)))) {
2654                 if (sc->lro_cnt && (0 == mxge_lro_rx(ss, m, csum)))
2655                         return;
2656                 /* otherwise, it was a UDP frame, or a TCP frame which
2657                    we could not do LRO on.  Tell the stack that the
2658                    checksum is good */
2659                 m->m_pkthdr.csum_data = 0xffff;
2660                 m->m_pkthdr.csum_flags = CSUM_PSEUDO_HDR | CSUM_DATA_VALID;
2661         }
2662 #if 0
2663         /* flowid only valid if RSS hashing is enabled */
2664         if (sc->num_slices > 1) {
2665                 m->m_pkthdr.flowid = (ss - sc->ss);
2666                 m->m_flags |= M_FLOWID;
2667         }
2668 #endif
2669         ether_input_chain(ifp, m, NULL, chain);
2670 }
2671
2672 static inline void
2673 mxge_clean_rx_done(struct mxge_slice_state *ss)
2674 {
2675         mxge_rx_done_t *rx_done = &ss->rx_done;
2676         int limit = 0;
2677         uint16_t length;
2678         uint16_t checksum;
2679         struct mbuf_chain chain[MAXCPU];
2680
2681         ether_input_chain_init(chain);
2682         while (rx_done->entry[rx_done->idx].length != 0) {
2683                 length = ntohs(rx_done->entry[rx_done->idx].length);
2684                 rx_done->entry[rx_done->idx].length = 0;
2685                 checksum = rx_done->entry[rx_done->idx].checksum;
2686                 if (length <= (MHLEN - MXGEFW_PAD))
2687                         mxge_rx_done_small(ss, length, checksum, chain);
2688                 else
2689                         mxge_rx_done_big(ss, length, checksum, chain);
2690                 rx_done->cnt++;
2691                 rx_done->idx = rx_done->cnt & rx_done->mask;
2692
2693                 /* limit potential for livelock */
2694                 if (__predict_false(++limit > rx_done->mask / 2))
2695                         break;
2696         }
2697         ether_input_dispatch(chain);
2698 #ifdef INET
2699         while (!SLIST_EMPTY(&ss->lro_active)) {
2700                 struct lro_entry *lro = SLIST_FIRST(&ss->lro_active);
2701                 SLIST_REMOVE_HEAD(&ss->lro_active, next);
2702                 mxge_lro_flush(ss, lro);
2703         }
2704 #endif
2705 }
2706
2707
2708 static inline void
2709 mxge_tx_done(struct mxge_slice_state *ss, uint32_t mcp_idx)
2710 {
2711         struct ifnet *ifp;
2712         mxge_tx_ring_t *tx;
2713         struct mbuf *m;
2714         bus_dmamap_t map;
2715         int idx;
2716         int *flags;
2717
2718         tx = &ss->tx;
2719         ifp = ss->sc->ifp;
2720         ASSERT_SERIALIZED(ifp->if_serializer);
2721         while (tx->pkt_done != mcp_idx) {
2722                 idx = tx->done & tx->mask;
2723                 tx->done++;
2724                 m = tx->info[idx].m;
2725                 /* mbuf and DMA map only attached to the first
2726                    segment per-mbuf */
2727                 if (m != NULL) {
2728                         ss->obytes += m->m_pkthdr.len;
2729                         if (m->m_flags & M_MCAST)
2730                                 ss->omcasts++;
2731                         ss->opackets++;
2732                         tx->info[idx].m = NULL;
2733                         map = tx->info[idx].map;
2734                         bus_dmamap_unload(tx->dmat, map);
2735                         m_freem(m);
2736                 }
2737                 if (tx->info[idx].flag) {
2738                         tx->info[idx].flag = 0;
2739                         tx->pkt_done++;
2740                 }
2741         }
2742         
2743         /* If we have space, clear IFF_OACTIVE to tell the stack that
2744            its OK to send packets */
2745 #ifdef IFNET_BUF_RING
2746         flags = &ss->if_flags;
2747 #else
2748         flags = &ifp->if_flags;
2749 #endif
2750         if ((*flags) & IFF_OACTIVE &&
2751             tx->req - tx->done < (tx->mask + 1)/4) {
2752                 *(flags) &= ~IFF_OACTIVE;
2753                 ss->tx.wake++;
2754                 mxge_start_locked(ss);
2755         }
2756 #ifdef IFNET_BUF_RING
2757         if ((ss->sc->num_slices > 1) && (tx->req == tx->done)) {
2758                 /* let the NIC stop polling this queue, since there
2759                  * are no more transmits pending */
2760                 if (tx->req == tx->done) {
2761                         *tx->send_stop = 1;
2762                         tx->queue_active = 0;
2763                         tx->deactivate++;
2764                         wmb();
2765                 }
2766         }
2767 #endif
2768
2769 }
2770
2771 static struct mxge_media_type mxge_xfp_media_types[] =
2772 {
2773         {IFM_10G_CX4,   0x7f,           "10GBASE-CX4 (module)"},
2774         {IFM_10G_SR,    (1 << 7),       "10GBASE-SR"},
2775         {IFM_10G_LR,    (1 << 6),       "10GBASE-LR"},
2776         {0,             (1 << 5),       "10GBASE-ER"},
2777         {IFM_10G_LRM,   (1 << 4),       "10GBASE-LRM"},
2778         {0,             (1 << 3),       "10GBASE-SW"},
2779         {0,             (1 << 2),       "10GBASE-LW"},
2780         {0,             (1 << 1),       "10GBASE-EW"},
2781         {0,             (1 << 0),       "Reserved"}
2782 };
2783 static struct mxge_media_type mxge_sfp_media_types[] =
2784 {
2785         {0,             (1 << 7),       "Reserved"},
2786         {IFM_10G_LRM,   (1 << 6),       "10GBASE-LRM"},
2787         {IFM_10G_LR,    (1 << 5),       "10GBASE-LR"},
2788         {IFM_10G_SR,    (1 << 4),       "10GBASE-SR"}
2789 };
2790
2791 static void
2792 mxge_set_media(mxge_softc_t *sc, int type)
2793 {
2794         sc->media_flags |= type;
2795         ifmedia_add(&sc->media, sc->media_flags, 0, NULL);
2796         ifmedia_set(&sc->media, sc->media_flags);
2797 }
2798
2799
2800 /*
2801  * Determine the media type for a NIC.  Some XFPs will identify
2802  * themselves only when their link is up, so this is initiated via a
2803  * link up interrupt.  However, this can potentially take up to
2804  * several milliseconds, so it is run via the watchdog routine, rather
2805  * than in the interrupt handler itself.   This need only be done
2806  * once, not each time the link is up.
2807  */
2808 static void
2809 mxge_media_probe(mxge_softc_t *sc)
2810 {
2811         mxge_cmd_t cmd;
2812         char *cage_type;
2813         char *ptr;
2814         struct mxge_media_type *mxge_media_types = NULL;
2815         int i, err, ms, mxge_media_type_entries;
2816         uint32_t byte;
2817
2818         sc->need_media_probe = 0;
2819
2820         /* if we've already set a media type, we're done */
2821         if (sc->media_flags  != (IFM_ETHER | IFM_AUTO))
2822                 return;
2823
2824         /* 
2825          * parse the product code to deterimine the interface type
2826          * (CX4, XFP, Quad Ribbon Fiber) by looking at the character
2827          * after the 3rd dash in the driver's cached copy of the
2828          * EEPROM's product code string.
2829          */
2830         ptr = sc->product_code_string;
2831         if (ptr == NULL) {
2832                 device_printf(sc->dev, "Missing product code\n");
2833         }
2834
2835         for (i = 0; i < 3; i++, ptr++) {
2836                 ptr = index(ptr, '-');
2837                 if (ptr == NULL) {
2838                         device_printf(sc->dev,
2839                                       "only %d dashes in PC?!?\n", i);
2840                         return;
2841                 }
2842         }
2843         if (*ptr == 'C') {
2844                 /* -C is CX4 */
2845                 mxge_set_media(sc, IFM_10G_CX4);
2846                 return;
2847         }
2848         else if (*ptr == 'Q') {
2849                 /* -Q is Quad Ribbon Fiber */
2850                 device_printf(sc->dev, "Quad Ribbon Fiber Media\n");
2851                 /* FreeBSD has no media type for Quad ribbon fiber */
2852                 return;
2853         }
2854
2855         if (*ptr == 'R') {
2856                 /* -R is XFP */
2857                 mxge_media_types = mxge_xfp_media_types;
2858                 mxge_media_type_entries = 
2859                         sizeof (mxge_xfp_media_types) /
2860                         sizeof (mxge_xfp_media_types[0]);
2861                 byte = MXGE_XFP_COMPLIANCE_BYTE;
2862                 cage_type = "XFP";
2863         }
2864
2865         if (*ptr == 'S' || *(ptr +1) == 'S') {
2866                 /* -S or -2S is SFP+ */
2867                 mxge_media_types = mxge_sfp_media_types;
2868                 mxge_media_type_entries = 
2869                         sizeof (mxge_sfp_media_types) /
2870                         sizeof (mxge_sfp_media_types[0]);
2871                 cage_type = "SFP+";
2872                 byte = 3;
2873         }
2874
2875         if (mxge_media_types == NULL) {
2876                 device_printf(sc->dev, "Unknown media type: %c\n", *ptr);
2877                 return;
2878         }
2879
2880         /*
2881          * At this point we know the NIC has an XFP cage, so now we
2882          * try to determine what is in the cage by using the
2883          * firmware's XFP I2C commands to read the XFP 10GbE compilance
2884          * register.  We read just one byte, which may take over
2885          * a millisecond
2886          */
2887
2888         cmd.data0 = 0;   /* just fetch 1 byte, not all 256 */
2889         cmd.data1 = byte;
2890         err = mxge_send_cmd(sc, MXGEFW_CMD_I2C_READ, &cmd);
2891         if (err == MXGEFW_CMD_ERROR_I2C_FAILURE) {
2892                 device_printf(sc->dev, "failed to read XFP\n");
2893         }
2894         if (err == MXGEFW_CMD_ERROR_I2C_ABSENT) {
2895                 device_printf(sc->dev, "Type R/S with no XFP!?!?\n");
2896         }
2897         if (err != MXGEFW_CMD_OK) {
2898                 return;
2899         }
2900
2901         /* now we wait for the data to be cached */
2902         cmd.data0 = byte;
2903         err = mxge_send_cmd(sc, MXGEFW_CMD_I2C_BYTE, &cmd);
2904         for (ms = 0; (err == EBUSY) && (ms < 50); ms++) {
2905                 DELAY(1000);
2906                 cmd.data0 = byte;
2907                 err = mxge_send_cmd(sc, MXGEFW_CMD_I2C_BYTE, &cmd);
2908         }
2909         if (err != MXGEFW_CMD_OK) {
2910                 device_printf(sc->dev, "failed to read %s (%d, %dms)\n",
2911                               cage_type, err, ms);
2912                 return;
2913         }
2914                 
2915         if (cmd.data0 == mxge_media_types[0].bitmask) {
2916                 if (mxge_verbose)
2917                         device_printf(sc->dev, "%s:%s\n", cage_type,
2918                                       mxge_media_types[0].name);
2919                 mxge_set_media(sc, IFM_10G_CX4);
2920                 return;
2921         }
2922         for (i = 1; i < mxge_media_type_entries; i++) {
2923                 if (cmd.data0 & mxge_media_types[i].bitmask) {
2924                         if (mxge_verbose)
2925                                 device_printf(sc->dev, "%s:%s\n",
2926                                               cage_type,
2927                                               mxge_media_types[i].name);
2928
2929                         mxge_set_media(sc, mxge_media_types[i].flag);
2930                         return;
2931                 }
2932         }
2933         device_printf(sc->dev, "%s media 0x%x unknown\n", cage_type,
2934                       cmd.data0);
2935
2936         return;
2937 }
2938
2939 static void
2940 mxge_intr(void *arg)
2941 {
2942         struct mxge_slice_state *ss = arg;
2943         mxge_softc_t *sc = ss->sc;
2944         mcp_irq_data_t *stats = ss->fw_stats;
2945         mxge_tx_ring_t *tx = &ss->tx;
2946         mxge_rx_done_t *rx_done = &ss->rx_done;
2947         uint32_t send_done_count;
2948         uint8_t valid;
2949
2950
2951 #ifndef IFNET_BUF_RING
2952         /* an interrupt on a non-zero slice is implicitly valid
2953            since MSI-X irqs are not shared */
2954         if (ss != sc->ss) {
2955                 mxge_clean_rx_done(ss);
2956                 *ss->irq_claim = be32toh(3);
2957                 return;
2958         }
2959 #endif
2960
2961         /* make sure the DMA has finished */
2962         if (!stats->valid) {
2963                 return;
2964         }
2965         valid = stats->valid;
2966
2967         if (sc->legacy_irq) {
2968                 /* lower legacy IRQ  */
2969                 *sc->irq_deassert = 0;
2970                 if (!mxge_deassert_wait)
2971                         /* don't wait for conf. that irq is low */
2972                         stats->valid = 0;
2973         } else {
2974                 stats->valid = 0;
2975         }
2976
2977         /* loop while waiting for legacy irq deassertion */
2978         do {
2979                 /* check for transmit completes and receives */
2980                 send_done_count = be32toh(stats->send_done_count);
2981                 while ((send_done_count != tx->pkt_done) ||
2982                        (rx_done->entry[rx_done->idx].length != 0)) {
2983                         if (send_done_count != tx->pkt_done)
2984                                 mxge_tx_done(ss, (int)send_done_count);
2985                         mxge_clean_rx_done(ss);
2986                         send_done_count = be32toh(stats->send_done_count);
2987                 }
2988                 if (sc->legacy_irq && mxge_deassert_wait)
2989                         wmb();
2990         } while (*((volatile uint8_t *) &stats->valid));
2991
2992         /* fw link & error stats meaningful only on the first slice */
2993         if (__predict_false((ss == sc->ss) && stats->stats_updated)) {
2994                 if (sc->link_state != stats->link_up) {
2995                         sc->link_state = stats->link_up;
2996                         if (sc->link_state) {
2997                                 sc->ifp->if_link_state = LINK_STATE_UP;
2998                                 if_link_state_change(sc->ifp);
2999                                 if (mxge_verbose)
3000                                         device_printf(sc->dev, "link up\n");
3001                         } else {
3002                                 sc->ifp->if_link_state = LINK_STATE_DOWN;
3003                                 if_link_state_change(sc->ifp);
3004                                 if (mxge_verbose)
3005                                         device_printf(sc->dev, "link down\n");
3006                         }
3007                         sc->need_media_probe = 1;
3008                 }
3009                 if (sc->rdma_tags_available !=
3010                     be32toh(stats->rdma_tags_available)) {
3011                         sc->rdma_tags_available = 
3012                                 be32toh(stats->rdma_tags_available);
3013                         device_printf(sc->dev, "RDMA timed out! %d tags "
3014                                       "left\n", sc->rdma_tags_available);
3015                 }
3016
3017                 if (stats->link_down) {
3018                         sc->down_cnt += stats->link_down;
3019                         sc->link_state = 0;
3020                         sc->ifp->if_link_state = LINK_STATE_DOWN;
3021                         if_link_state_change(sc->ifp);
3022                 }
3023         }
3024
3025         /* check to see if we have rx token to pass back */
3026         if (valid & 0x1)
3027             *ss->irq_claim = be32toh(3);
3028         *(ss->irq_claim + 1) = be32toh(3);
3029 }
3030
3031 static void
3032 mxge_init(void *arg)
3033 {
3034 }
3035
3036
3037
3038 static void
3039 mxge_free_slice_mbufs(struct mxge_slice_state *ss)
3040 {
3041         struct lro_entry *lro_entry;
3042         int i;
3043
3044         while (!SLIST_EMPTY(&ss->lro_free)) {
3045                 lro_entry = SLIST_FIRST(&ss->lro_free);
3046                 SLIST_REMOVE_HEAD(&ss->lro_free, next);
3047                 kfree(lro_entry, M_DEVBUF);
3048         }
3049
3050         for (i = 0; i <= ss->rx_big.mask; i++) {
3051                 if (ss->rx_big.info[i].m == NULL)
3052                         continue;
3053                 bus_dmamap_unload(ss->rx_big.dmat,
3054                                   ss->rx_big.info[i].map);
3055                 m_freem(ss->rx_big.info[i].m);
3056                 ss->rx_big.info[i].m = NULL;
3057         }
3058
3059         for (i = 0; i <= ss->rx_small.mask; i++) {
3060                 if (ss->rx_small.info[i].m == NULL)
3061                         continue;
3062                 bus_dmamap_unload(ss->rx_small.dmat,
3063                                   ss->rx_small.info[i].map);
3064                 m_freem(ss->rx_small.info[i].m);
3065                 ss->rx_small.info[i].m = NULL;
3066         }
3067
3068         /* transmit ring used only on the first slice */
3069         if (ss->tx.info == NULL)
3070                 return;
3071
3072         for (i = 0; i <= ss->tx.mask; i++) {
3073                 ss->tx.info[i].flag = 0;
3074                 if (ss->tx.info[i].m == NULL)
3075                         continue;
3076                 bus_dmamap_unload(ss->tx.dmat,
3077                                   ss->tx.info[i].map);
3078                 m_freem(ss->tx.info[i].m);
3079                 ss->tx.info[i].m = NULL;
3080         }
3081 }
3082
3083 static void
3084 mxge_free_mbufs(mxge_softc_t *sc)
3085 {
3086         int slice;
3087
3088         for (slice = 0; slice < sc->num_slices; slice++)
3089                 mxge_free_slice_mbufs(&sc->ss[slice]);
3090 }
3091
3092 static void
3093 mxge_free_slice_rings(struct mxge_slice_state *ss)
3094 {
3095         int i;
3096
3097
3098         if (ss->rx_done.entry != NULL)
3099                 mxge_dma_free(&ss->rx_done.dma);
3100         ss->rx_done.entry = NULL;
3101
3102         if (ss->tx.req_bytes != NULL)
3103                 kfree(ss->tx.req_bytes, M_DEVBUF);
3104         ss->tx.req_bytes = NULL;
3105
3106         if (ss->tx.seg_list != NULL)
3107                 kfree(ss->tx.seg_list, M_DEVBUF);
3108         ss->tx.seg_list = NULL;
3109
3110         if (ss->rx_small.shadow != NULL)
3111                 kfree(ss->rx_small.shadow, M_DEVBUF);
3112         ss->rx_small.shadow = NULL;
3113
3114         if (ss->rx_big.shadow != NULL)
3115                 kfree(ss->rx_big.shadow, M_DEVBUF);
3116         ss->rx_big.shadow = NULL;
3117
3118         if (ss->tx.info != NULL) {
3119                 if (ss->tx.dmat != NULL) {
3120                         for (i = 0; i <= ss->tx.mask; i++) {
3121                                 bus_dmamap_destroy(ss->tx.dmat,
3122                                                    ss->tx.info[i].map);
3123                         }
3124                         bus_dma_tag_destroy(ss->tx.dmat);
3125                 }
3126                 kfree(ss->tx.info, M_DEVBUF);
3127         }
3128         ss->tx.info = NULL;
3129
3130         if (ss->rx_small.info != NULL) {
3131                 if (ss->rx_small.dmat != NULL) {
3132                         for (i = 0; i <= ss->rx_small.mask; i++) {
3133                                 bus_dmamap_destroy(ss->rx_small.dmat,
3134                                                    ss->rx_small.info[i].map);
3135                         }
3136                         bus_dmamap_destroy(ss->rx_small.dmat,
3137                                            ss->rx_small.extra_map);
3138                         bus_dma_tag_destroy(ss->rx_small.dmat);
3139                 }
3140                 kfree(ss->rx_small.info, M_DEVBUF);
3141         }
3142         ss->rx_small.info = NULL;
3143
3144         if (ss->rx_big.info != NULL) {
3145                 if (ss->rx_big.dmat != NULL) {
3146                         for (i = 0; i <= ss->rx_big.mask; i++) {
3147                                 bus_dmamap_destroy(ss->rx_big.dmat,
3148                                                    ss->rx_big.info[i].map);
3149                         }
3150                         bus_dmamap_destroy(ss->rx_big.dmat,
3151                                            ss->rx_big.extra_map);
3152                         bus_dma_tag_destroy(ss->rx_big.dmat);
3153                 }
3154                 kfree(ss->rx_big.info, M_DEVBUF);
3155         }
3156         ss->rx_big.info = NULL;
3157 }
3158
3159 static void
3160 mxge_free_rings(mxge_softc_t *sc)
3161 {
3162         int slice;
3163
3164         for (slice = 0; slice < sc->num_slices; slice++)
3165                 mxge_free_slice_rings(&sc->ss[slice]);
3166 }
3167
3168 static int
3169 mxge_alloc_slice_rings(struct mxge_slice_state *ss, int rx_ring_entries,
3170                        int tx_ring_entries)
3171 {
3172         mxge_softc_t *sc = ss->sc;
3173         size_t bytes;
3174         int err, i;
3175
3176         err = ENOMEM;
3177
3178         /* allocate per-slice receive resources */
3179
3180         ss->rx_small.mask = ss->rx_big.mask = rx_ring_entries - 1;
3181         ss->rx_done.mask = (2 * rx_ring_entries) - 1;
3182
3183         /* allocate the rx shadow rings */
3184         bytes = rx_ring_entries * sizeof (*ss->rx_small.shadow);
3185         ss->rx_small.shadow = kmalloc(bytes, M_DEVBUF, M_ZERO|M_WAITOK);
3186         if (ss->rx_small.shadow == NULL)
3187                 return err;;
3188
3189         bytes = rx_ring_entries * sizeof (*ss->rx_big.shadow);
3190         ss->rx_big.shadow = kmalloc(bytes, M_DEVBUF, M_ZERO|M_WAITOK);
3191         if (ss->rx_big.shadow == NULL)
3192                 return err;;
3193
3194         /* allocate the rx host info rings */
3195         bytes = rx_ring_entries * sizeof (*ss->rx_small.info);
3196         ss->rx_small.info = kmalloc(bytes, M_DEVBUF, M_ZERO|M_WAITOK);
3197         if (ss->rx_small.info == NULL)
3198                 return err;;
3199
3200         bytes = rx_ring_entries * sizeof (*ss->rx_big.info);
3201         ss->rx_big.info = kmalloc(bytes, M_DEVBUF, M_ZERO|M_WAITOK);
3202         if (ss->rx_big.info == NULL)
3203                 return err;;
3204
3205         /* allocate the rx busdma resources */
3206         err = bus_dma_tag_create(sc->parent_dmat,       /* parent */
3207                                  1,                     /* alignment */
3208                                  4096,                  /* boundary */
3209                                  BUS_SPACE_MAXADDR,     /* low */
3210                                  BUS_SPACE_MAXADDR,     /* high */
3211                                  NULL, NULL,            /* filter */
3212                                  MHLEN,                 /* maxsize */
3213                                  1,                     /* num segs */
3214                                  MHLEN,                 /* maxsegsize */
3215                                  BUS_DMA_ALLOCNOW,      /* flags */
3216                                  &ss->rx_small.dmat);   /* tag */
3217         if (err != 0) {
3218                 device_printf(sc->dev, "Err %d allocating rx_small dmat\n",
3219                               err);
3220                 return err;;
3221         }
3222
3223         err = bus_dma_tag_create(sc->parent_dmat,       /* parent */
3224                                  1,                     /* alignment */
3225 #if MXGE_VIRT_JUMBOS
3226                                  4096,                  /* boundary */
3227 #else
3228                                  0,                     /* boundary */
3229 #endif
3230                                  BUS_SPACE_MAXADDR,     /* low */
3231                                  BUS_SPACE_MAXADDR,     /* high */
3232                                  NULL, NULL,            /* filter */
3233                                  3*4096,                /* maxsize */
3234 #if MXGE_VIRT_JUMBOS
3235                                  3,                     /* num segs */
3236                                  4096,                  /* maxsegsize*/
3237 #else
3238                                  1,                     /* num segs */
3239                                  MJUM9BYTES,            /* maxsegsize*/
3240 #endif
3241                                  BUS_DMA_ALLOCNOW,      /* flags */
3242                                  &ss->rx_big.dmat);     /* tag */
3243         if (err != 0) {
3244                 device_printf(sc->dev, "Err %d allocating rx_big dmat\n",
3245                               err);
3246                 return err;;
3247         }
3248         for (i = 0; i <= ss->rx_small.mask; i++) {
3249                 err = bus_dmamap_create(ss->rx_small.dmat, 0, 
3250                                         &ss->rx_small.info[i].map);
3251                 if (err != 0) {
3252                         device_printf(sc->dev, "Err %d  rx_small dmamap\n",
3253                                       err);
3254                         return err;;
3255                 }
3256         }
3257         err = bus_dmamap_create(ss->rx_small.dmat, 0, 
3258                                 &ss->rx_small.extra_map);
3259         if (err != 0) {
3260                 device_printf(sc->dev, "Err %d extra rx_small dmamap\n",
3261                               err);
3262                 return err;;
3263         }
3264
3265         for (i = 0; i <= ss->rx_big.mask; i++) {
3266                 err = bus_dmamap_create(ss->rx_big.dmat, 0, 
3267                                         &ss->rx_big.info[i].map);
3268                 if (err != 0) {
3269                         device_printf(sc->dev, "Err %d  rx_big dmamap\n",
3270                                       err);
3271                         return err;;
3272                 }
3273         }
3274         err = bus_dmamap_create(ss->rx_big.dmat, 0, 
3275                                 &ss->rx_big.extra_map);
3276         if (err != 0) {
3277                 device_printf(sc->dev, "Err %d extra rx_big dmamap\n",
3278                               err);
3279                 return err;;
3280         }
3281
3282         /* now allocate TX resouces */
3283
3284 #ifndef IFNET_BUF_RING
3285         /* only use a single TX ring for now */
3286         if (ss != ss->sc->ss)
3287                 return 0;
3288 #endif
3289
3290         ss->tx.mask = tx_ring_entries - 1;
3291         ss->tx.max_desc = MIN(MXGE_MAX_SEND_DESC, tx_ring_entries / 4);
3292
3293         
3294         /* allocate the tx request copy block */
3295         bytes = 8 + 
3296                 sizeof (*ss->tx.req_list) * (ss->tx.max_desc + 4);
3297         ss->tx.req_bytes = kmalloc(bytes, M_DEVBUF, M_WAITOK);
3298         if (ss->tx.req_bytes == NULL)
3299                 return err;;
3300         /* ensure req_list entries are aligned to 8 bytes */
3301         ss->tx.req_list = (mcp_kreq_ether_send_t *)
3302                 ((unsigned long)(ss->tx.req_bytes + 7) & ~7UL);
3303
3304         /* allocate the tx busdma segment list */
3305         bytes = sizeof (*ss->tx.seg_list) * ss->tx.max_desc;
3306         ss->tx.seg_list = (bus_dma_segment_t *) 
3307                 kmalloc(bytes, M_DEVBUF, M_WAITOK);
3308         if (ss->tx.seg_list == NULL)
3309                 return err;;
3310
3311         /* allocate the tx host info ring */
3312         bytes = tx_ring_entries * sizeof (*ss->tx.info);
3313         ss->tx.info = kmalloc(bytes, M_DEVBUF, M_ZERO|M_WAITOK);
3314         if (ss->tx.info == NULL)
3315                 return err;;
3316         
3317         /* allocate the tx busdma resources */
3318         err = bus_dma_tag_create(sc->parent_dmat,       /* parent */
3319                                  1,                     /* alignment */
3320                                  sc->tx_boundary,       /* boundary */
3321                                  BUS_SPACE_MAXADDR,     /* low */
3322                                  BUS_SPACE_MAXADDR,     /* high */
3323                                  NULL, NULL,            /* filter */
3324                                  65536 + 256,           /* maxsize */
3325                                  ss->tx.max_desc - 2,   /* num segs */
3326                                  sc->tx_boundary,       /* maxsegsz */
3327                                  BUS_DMA_ALLOCNOW,      /* flags */
3328                                  &ss->tx.dmat);         /* tag */
3329         
3330         if (err != 0) {
3331                 device_printf(sc->dev, "Err %d allocating tx dmat\n",
3332                               err);
3333                 return err;;
3334         }
3335
3336         /* now use these tags to setup dmamaps for each slot
3337            in the ring */
3338         for (i = 0; i <= ss->tx.mask; i++) {
3339                 err = bus_dmamap_create(ss->tx.dmat, 0, 
3340                                         &ss->tx.info[i].map);
3341                 if (err != 0) {
3342                         device_printf(sc->dev, "Err %d  tx dmamap\n",
3343                                       err);
3344                         return err;;
3345                 }
3346         }
3347         return 0;
3348
3349 }
3350
3351 static int
3352 mxge_alloc_rings(mxge_softc_t *sc)
3353 {
3354         mxge_cmd_t cmd;
3355         int tx_ring_size;
3356         int tx_ring_entries, rx_ring_entries;
3357         int err, slice;
3358         
3359         /* get ring sizes */
3360         err = mxge_send_cmd(sc, MXGEFW_CMD_GET_SEND_RING_SIZE, &cmd);
3361         tx_ring_size = cmd.data0;
3362         if (err != 0) {
3363                 device_printf(sc->dev, "Cannot determine tx ring sizes\n");
3364                 goto abort;
3365         }
3366
3367         tx_ring_entries = tx_ring_size / sizeof (mcp_kreq_ether_send_t);
3368         rx_ring_entries = sc->rx_ring_size / sizeof (mcp_dma_addr_t);
3369         ifq_set_maxlen(&sc->ifp->if_snd, tx_ring_entries - 1);
3370         ifq_set_ready(&sc->ifp->if_snd);
3371
3372         for (slice = 0; slice < sc->num_slices; slice++) {
3373                 err = mxge_alloc_slice_rings(&sc->ss[slice],
3374                                              rx_ring_entries,
3375                                              tx_ring_entries);
3376                 if (err != 0)
3377                         goto abort;
3378         }
3379         return 0;
3380
3381 abort:
3382         mxge_free_rings(sc);
3383         return err;
3384
3385 }
3386
3387
3388 static void
3389 mxge_choose_params(int mtu, int *big_buf_size, int *cl_size, int *nbufs)
3390 {
3391         int bufsize = mtu + ETHER_HDR_LEN + EVL_ENCAPLEN + MXGEFW_PAD;
3392
3393         if (bufsize < MCLBYTES) {
3394                 /* easy, everything fits in a single buffer */
3395                 *big_buf_size = MCLBYTES;
3396                 *cl_size = MCLBYTES;
3397                 *nbufs = 1;
3398                 return;
3399         }
3400
3401         if (bufsize < MJUMPAGESIZE) {
3402                 /* still easy, everything still fits in a single buffer */
3403                 *big_buf_size = MJUMPAGESIZE;
3404                 *cl_size = MJUMPAGESIZE;
3405                 *nbufs = 1;
3406                 return;
3407         }
3408 #if MXGE_VIRT_JUMBOS
3409         /* now we need to use virtually contiguous buffers */
3410         *cl_size = MJUM9BYTES;
3411         *big_buf_size = 4096;
3412         *nbufs = mtu / 4096 + 1;
3413         /* needs to be a power of two, so round up */
3414         if (*nbufs == 3)
3415                 *nbufs = 4;
3416 #else
3417         *cl_size = MJUM9BYTES;
3418         *big_buf_size = MJUM9BYTES;
3419         *nbufs = 1;
3420 #endif
3421 }
3422
3423 static int
3424 mxge_slice_open(struct mxge_slice_state *ss, int nbufs, int cl_size)
3425 {
3426         mxge_softc_t *sc;
3427         mxge_cmd_t cmd;
3428         bus_dmamap_t map;
3429         struct lro_entry *lro_entry;    
3430         int err, i, slice;
3431
3432
3433         sc = ss->sc;
3434         slice = ss - sc->ss;
3435
3436         SLIST_INIT(&ss->lro_free);
3437         SLIST_INIT(&ss->lro_active);
3438
3439         for (i = 0; i < sc->lro_cnt; i++) {
3440                 lro_entry = (struct lro_entry *)
3441                         kmalloc(sizeof (*lro_entry), M_DEVBUF,
3442                                M_NOWAIT | M_ZERO);
3443                 if (lro_entry == NULL) {
3444                         sc->lro_cnt = i;
3445                         break;
3446                 }
3447                 SLIST_INSERT_HEAD(&ss->lro_free, lro_entry, next);
3448         }
3449         /* get the lanai pointers to the send and receive rings */
3450
3451         err = 0;
3452 #ifndef IFNET_BUF_RING
3453         /* We currently only send from the first slice */
3454         if (slice == 0) {
3455 #endif
3456                 cmd.data0 = slice;
3457                 err = mxge_send_cmd(sc, MXGEFW_CMD_GET_SEND_OFFSET, &cmd);
3458                 ss->tx.lanai = 
3459                         (volatile mcp_kreq_ether_send_t *)(sc->sram + cmd.data0);
3460                 ss->tx.send_go = (volatile uint32_t *)
3461                         (sc->sram + MXGEFW_ETH_SEND_GO + 64 * slice);
3462                 ss->tx.send_stop = (volatile uint32_t *)
3463                 (sc->sram + MXGEFW_ETH_SEND_STOP + 64 * slice);
3464 #ifndef IFNET_BUF_RING
3465         }
3466 #endif
3467         cmd.data0 = slice;
3468         err |= mxge_send_cmd(sc, 
3469                              MXGEFW_CMD_GET_SMALL_RX_OFFSET, &cmd);
3470         ss->rx_small.lanai = 
3471                 (volatile mcp_kreq_ether_recv_t *)(sc->sram + cmd.data0);
3472         cmd.data0 = slice;
3473         err |= mxge_send_cmd(sc, MXGEFW_CMD_GET_BIG_RX_OFFSET, &cmd);
3474         ss->rx_big.lanai = 
3475                 (volatile mcp_kreq_ether_recv_t *)(sc->sram + cmd.data0);
3476
3477         if (err != 0) {
3478                 device_printf(sc->dev, 
3479                               "failed to get ring sizes or locations\n");
3480                 return EIO;
3481         }
3482
3483         /* stock receive rings */
3484         for (i = 0; i <= ss->rx_small.mask; i++) {
3485                 map = ss->rx_small.info[i].map;
3486                 err = mxge_get_buf_small(ss, map, i);
3487                 if (err) {
3488                         device_printf(sc->dev, "alloced %d/%d smalls\n",
3489                                       i, ss->rx_small.mask + 1);
3490                         return ENOMEM;
3491                 }
3492         }
3493         for (i = 0; i <= ss->rx_big.mask; i++) {
3494                 ss->rx_big.shadow[i].addr_low = 0xffffffff;
3495                 ss->rx_big.shadow[i].addr_high = 0xffffffff;
3496         }
3497         ss->rx_big.nbufs = nbufs;
3498         ss->rx_big.cl_size = cl_size;
3499         ss->rx_big.mlen = ss->sc->ifp->if_mtu + ETHER_HDR_LEN +
3500                 EVL_ENCAPLEN + MXGEFW_PAD;
3501         for (i = 0; i <= ss->rx_big.mask; i += ss->rx_big.nbufs) {
3502                 map = ss->rx_big.info[i].map;
3503                 err = mxge_get_buf_big(ss, map, i);
3504                 if (err) {
3505                         device_printf(sc->dev, "alloced %d/%d bigs\n",
3506                                       i, ss->rx_big.mask + 1);
3507                         return ENOMEM;
3508                 }
3509         }
3510         return 0;
3511 }
3512
3513 static int 
3514 mxge_open(mxge_softc_t *sc)
3515 {
3516         mxge_cmd_t cmd;
3517         int err, big_bytes, nbufs, slice, cl_size, i;
3518         bus_addr_t bus;
3519         volatile uint8_t *itable;
3520         struct mxge_slice_state *ss;
3521
3522         ASSERT_SERIALIZED(sc->ifp->if_serializer);
3523         /* Copy the MAC address in case it was overridden */
3524         bcopy(IF_LLADDR(sc->ifp), sc->mac_addr, ETHER_ADDR_LEN);
3525
3526         err = mxge_reset(sc, 1);
3527         if (err != 0) {
3528                 device_printf(sc->dev, "failed to reset\n");
3529                 return EIO;
3530         }
3531
3532         if (sc->num_slices > 1) {
3533                 /* setup the indirection table */
3534                 cmd.data0 = sc->num_slices;
3535                 err = mxge_send_cmd(sc, MXGEFW_CMD_SET_RSS_TABLE_SIZE,
3536                                     &cmd);
3537
3538                 err |= mxge_send_cmd(sc, MXGEFW_CMD_GET_RSS_TABLE_OFFSET,
3539                                      &cmd);
3540                 if (err != 0) {
3541                         device_printf(sc->dev,
3542                                       "failed to setup rss tables\n");
3543                         return err;
3544                 }
3545
3546                 /* just enable an identity mapping */
3547                 itable = sc->sram + cmd.data0;
3548                 for (i = 0; i < sc->num_slices; i++)
3549                         itable[i] = (uint8_t)i;
3550
3551                 cmd.data0 = 1;
3552                 cmd.data1 = mxge_rss_hash_type;
3553                 err = mxge_send_cmd(sc, MXGEFW_CMD_SET_RSS_ENABLE, &cmd);
3554                 if (err != 0) {
3555                         device_printf(sc->dev, "failed to enable slices\n");
3556                         return err;
3557                 }
3558         }
3559
3560
3561         mxge_choose_params(sc->ifp->if_mtu, &big_bytes, &cl_size, &nbufs);
3562
3563         cmd.data0 = nbufs;
3564         err = mxge_send_cmd(sc, MXGEFW_CMD_ALWAYS_USE_N_BIG_BUFFERS,
3565                             &cmd);
3566         /* error is only meaningful if we're trying to set 
3567            MXGEFW_CMD_ALWAYS_USE_N_BIG_BUFFERS > 1 */
3568         if (err && nbufs > 1) {
3569                 device_printf(sc->dev,
3570                               "Failed to set alway-use-n to %d\n",
3571                               nbufs);
3572                 return EIO;
3573         }
3574         /* Give the firmware the mtu and the big and small buffer
3575            sizes.  The firmware wants the big buf size to be a power
3576            of two. Luckily, FreeBSD's clusters are powers of two */
3577         cmd.data0 = sc->ifp->if_mtu + ETHER_HDR_LEN + EVL_ENCAPLEN;
3578         err = mxge_send_cmd(sc, MXGEFW_CMD_SET_MTU, &cmd);
3579         cmd.data0 = MHLEN - MXGEFW_PAD;
3580         err |= mxge_send_cmd(sc, MXGEFW_CMD_SET_SMALL_BUFFER_SIZE,
3581                              &cmd);
3582         cmd.data0 = big_bytes;
3583         err |= mxge_send_cmd(sc, MXGEFW_CMD_SET_BIG_BUFFER_SIZE, &cmd);
3584
3585         if (err != 0) {
3586                 device_printf(sc->dev, "failed to setup params\n");
3587                 goto abort;
3588         }
3589
3590         /* Now give him the pointer to the stats block */
3591         for (slice = 0; 
3592 #ifdef IFNET_BUF_RING
3593              slice < sc->num_slices;
3594 #else
3595              slice < 1;
3596 #endif
3597              slice++) {
3598                 ss = &sc->ss[slice];
3599                 cmd.data0 =
3600                         MXGE_LOWPART_TO_U32(ss->fw_stats_dma.bus_addr);
3601                 cmd.data1 =
3602                         MXGE_HIGHPART_TO_U32(ss->fw_stats_dma.bus_addr);
3603                 cmd.data2 = sizeof(struct mcp_irq_data);
3604                 cmd.data2 |= (slice << 16);
3605                 err |= mxge_send_cmd(sc, MXGEFW_CMD_SET_STATS_DMA_V2, &cmd);
3606         }
3607
3608         if (err != 0) {
3609                 bus = sc->ss->fw_stats_dma.bus_addr;
3610                 bus += offsetof(struct mcp_irq_data, send_done_count);
3611                 cmd.data0 = MXGE_LOWPART_TO_U32(bus);
3612                 cmd.data1 = MXGE_HIGHPART_TO_U32(bus);
3613                 err = mxge_send_cmd(sc,
3614                                     MXGEFW_CMD_SET_STATS_DMA_OBSOLETE,
3615                                     &cmd);
3616                 /* Firmware cannot support multicast without STATS_DMA_V2 */
3617                 sc->fw_multicast_support = 0;
3618         } else {
3619                 sc->fw_multicast_support = 1;
3620         }
3621
3622         if (err != 0) {
3623                 device_printf(sc->dev, "failed to setup params\n");
3624                 goto abort;
3625         }
3626
3627         for (slice = 0; slice < sc->num_slices; slice++) {
3628                 err = mxge_slice_open(&sc->ss[slice], nbufs, cl_size);
3629                 if (err != 0) {
3630                         device_printf(sc->dev, "couldn't open slice %d\n",
3631                                       slice);
3632                         goto abort;
3633                 }
3634         }
3635
3636         /* Finally, start the firmware running */
3637         err = mxge_send_cmd(sc, MXGEFW_CMD_ETHERNET_UP, &cmd);
3638         if (err) {
3639                 device_printf(sc->dev, "Couldn't bring up link\n");
3640                 goto abort;
3641         }
3642 #ifdef IFNET_BUF_RING
3643         for (slice = 0; slice < sc->num_slices; slice++) {
3644                 ss = &sc->ss[slice];
3645                 ss->if_flags |= IFF_RUNNING;
3646                 ss->if_flags &= ~IFF_OACTIVE;
3647         }
3648 #endif
3649         sc->ifp->if_flags |= IFF_RUNNING;
3650         sc->ifp->if_flags &= ~IFF_OACTIVE;
3651         callout_reset(&sc->co_hdl, mxge_ticks, mxge_tick, sc);
3652
3653         return 0;
3654
3655
3656 abort:
3657         mxge_free_mbufs(sc);
3658
3659         return err;
3660 }
3661
3662 static int
3663 mxge_close(mxge_softc_t *sc)
3664 {
3665         mxge_cmd_t cmd;
3666         int err, old_down_cnt;
3667 #ifdef IFNET_BUF_RING
3668         struct mxge_slice_state *ss;    
3669         int slice;
3670 #endif
3671
3672         ASSERT_SERIALIZED(sc->ifp->if_serializer);
3673         callout_stop(&sc->co_hdl);
3674 #ifdef IFNET_BUF_RING
3675         for (slice = 0; slice < sc->num_slices; slice++) {
3676                 ss = &sc->ss[slice];
3677                 ss->if_flags &= ~IFF_RUNNING;
3678         }
3679 #endif
3680         sc->ifp->if_flags &= ~IFF_RUNNING;
3681         old_down_cnt = sc->down_cnt;
3682         wmb();
3683         err = mxge_send_cmd(sc, MXGEFW_CMD_ETHERNET_DOWN, &cmd);
3684         if (err) {
3685                 device_printf(sc->dev, "Couldn't bring down link\n");
3686         }
3687         if (old_down_cnt == sc->down_cnt) {
3688                 /* wait for down irq */
3689                 DELAY(10 * sc->intr_coal_delay);
3690         }
3691         wmb();
3692         if (old_down_cnt == sc->down_cnt) {
3693                 device_printf(sc->dev, "never got down irq\n");
3694         }
3695
3696         mxge_free_mbufs(sc);
3697
3698         return 0;
3699 }
3700
3701 static void
3702 mxge_setup_cfg_space(mxge_softc_t *sc)
3703 {
3704         device_t dev = sc->dev;
3705         int reg;
3706         uint16_t cmd, lnk, pectl;
3707
3708         /* find the PCIe link width and set max read request to 4KB*/
3709         if (pci_find_extcap(dev, PCIY_EXPRESS, &reg) == 0) {
3710                 lnk = pci_read_config(dev, reg + 0x12, 2);
3711                 sc->link_width = (lnk >> 4) & 0x3f;
3712                 
3713                 pectl = pci_read_config(dev, reg + 0x8, 2);
3714                 pectl = (pectl & ~0x7000) | (5 << 12);
3715                 pci_write_config(dev, reg + 0x8, pectl, 2);
3716         }
3717
3718         /* Enable DMA and Memory space access */
3719         pci_enable_busmaster(dev);
3720         cmd = pci_read_config(dev, PCIR_COMMAND, 2);
3721         cmd |= PCIM_CMD_MEMEN;
3722         pci_write_config(dev, PCIR_COMMAND, cmd, 2);
3723 }
3724
3725 static uint32_t
3726 mxge_read_reboot(mxge_softc_t *sc)
3727 {
3728         device_t dev = sc->dev;
3729         uint32_t vs;
3730
3731         /* find the vendor specific offset */
3732         if (pci_find_extcap(dev, PCIY_VENDOR, &vs) != 0) {
3733                 device_printf(sc->dev,
3734                               "could not find vendor specific offset\n");
3735                 return (uint32_t)-1;
3736         }
3737         /* enable read32 mode */
3738         pci_write_config(dev, vs + 0x10, 0x3, 1);
3739         /* tell NIC which register to read */
3740         pci_write_config(dev, vs + 0x18, 0xfffffff0, 4);
3741         return (pci_read_config(dev, vs + 0x14, 4));
3742 }
3743
3744 static int
3745 mxge_watchdog_reset(mxge_softc_t *sc, int slice)
3746 {
3747         struct pci_devinfo *dinfo;
3748         mxge_tx_ring_t *tx;
3749         int err;
3750         uint32_t reboot;
3751         uint16_t cmd;
3752
3753         err = ENXIO;
3754
3755         device_printf(sc->dev, "Watchdog reset!\n");
3756
3757         /* 
3758          * check to see if the NIC rebooted.  If it did, then all of
3759          * PCI config space has been reset, and things like the
3760          * busmaster bit will be zero.  If this is the case, then we
3761          * must restore PCI config space before the NIC can be used
3762          * again
3763          */
3764         cmd = pci_read_config(sc->dev, PCIR_COMMAND, 2);
3765         if (cmd == 0xffff) {
3766                 /* 
3767                  * maybe the watchdog caught the NIC rebooting; wait
3768                  * up to 100ms for it to finish.  If it does not come
3769                  * back, then give up 
3770                  */
3771                 DELAY(1000*100);
3772                 cmd = pci_read_config(sc->dev, PCIR_COMMAND, 2);
3773                 if (cmd == 0xffff) {
3774                         device_printf(sc->dev, "NIC disappeared!\n");
3775                         return (err);
3776                 }
3777         }
3778         if ((cmd & PCIM_CMD_BUSMASTEREN) == 0) {
3779                 /* print the reboot status */
3780                 reboot = mxge_read_reboot(sc);
3781                 device_printf(sc->dev, "NIC rebooted, status = 0x%x\n",
3782                               reboot);
3783                 /* restore PCI configuration space */
3784                 dinfo = device_get_ivars(sc->dev);
3785                 pci_cfg_restore(sc->dev, dinfo);
3786
3787                 /* and redo any changes we made to our config space */
3788                 mxge_setup_cfg_space(sc);
3789
3790                 if (sc->ifp->if_flags & IFF_RUNNING) {
3791                         mxge_close(sc);
3792                         err = mxge_open(sc);
3793                 }
3794         } else {
3795                 tx = &sc->ss[slice].tx;
3796                 device_printf(sc->dev,
3797                               "NIC did not reboot, slice %d ring state:\n",
3798                               slice);
3799                 device_printf(sc->dev,
3800                               "tx.req=%d tx.done=%d, tx.queue_active=%d\n",
3801                               tx->req, tx->done, tx->queue_active);
3802                 device_printf(sc->dev, "tx.activate=%d tx.deactivate=%d\n",
3803                               tx->activate, tx->deactivate);
3804                 device_printf(sc->dev, "pkt_done=%d fw=%d\n",
3805                               tx->pkt_done,
3806                               be32toh(sc->ss->fw_stats->send_done_count));
3807                 device_printf(sc->dev, "not resetting\n");
3808         }
3809         return (err);
3810 }
3811
3812 static int
3813 mxge_watchdog(mxge_softc_t *sc)
3814 {
3815         mxge_tx_ring_t *tx;
3816         uint32_t rx_pause = be32toh(sc->ss->fw_stats->dropped_pause);
3817         int i, err = 0;
3818
3819         /* see if we have outstanding transmits, which
3820            have been pending for more than mxge_ticks */
3821         for (i = 0; 
3822 #ifdef IFNET_BUF_RING
3823              (i < sc->num_slices) && (err == 0);
3824 #else
3825              (i < 1) && (err == 0);
3826 #endif
3827              i++) {
3828                 tx = &sc->ss[i].tx;             
3829                 if (tx->req != tx->done &&
3830                     tx->watchdog_req != tx->watchdog_done &&
3831                     tx->done == tx->watchdog_done) {
3832                         /* check for pause blocking before resetting */
3833                         if (tx->watchdog_rx_pause == rx_pause)
3834                                 err = mxge_watchdog_reset(sc, i);
3835                         else
3836                                 device_printf(sc->dev, "Flow control blocking "
3837                                               "xmits, check link partner\n");
3838                 }
3839
3840                 tx->watchdog_req = tx->req;
3841                 tx->watchdog_done = tx->done;
3842                 tx->watchdog_rx_pause = rx_pause;
3843         }
3844
3845         if (sc->need_media_probe)
3846                 mxge_media_probe(sc);
3847         return (err);
3848 }
3849
3850 static void
3851 mxge_update_stats(mxge_softc_t *sc)
3852 {
3853         struct mxge_slice_state *ss;
3854         u_long ipackets = 0;
3855         u_long opackets = 0;
3856 #ifdef IFNET_BUF_RING
3857         u_long obytes = 0;
3858         u_long omcasts = 0;
3859         u_long odrops = 0;
3860 #endif
3861         u_long oerrors = 0;
3862         int slice;
3863
3864         for (slice = 0; slice < sc->num_slices; slice++) {
3865                 ss = &sc->ss[slice];
3866                 ipackets += ss->ipackets;
3867                 opackets += ss->opackets;
3868 #ifdef IFNET_BUF_RING
3869                 obytes += ss->obytes;
3870                 omcasts += ss->omcasts;
3871                 odrops += ss->tx.br->br_drops;
3872 #endif
3873                 oerrors += ss->oerrors;
3874         }
3875         sc->ifp->if_ipackets = ipackets;
3876         sc->ifp->if_opackets = opackets;
3877 #ifdef IFNET_BUF_RING
3878         sc->ifp->if_obytes = obytes;
3879         sc->ifp->if_omcasts = omcasts;
3880         sc->ifp->if_snd.ifq_drops = odrops;
3881 #endif
3882         sc->ifp->if_oerrors = oerrors;
3883 }
3884
3885 static void
3886 mxge_tick(void *arg)
3887 {
3888         mxge_softc_t *sc = arg;
3889         int err = 0;
3890
3891         lwkt_serialize_enter(sc->ifp->if_serializer);
3892         /* aggregate stats from different slices */
3893         mxge_update_stats(sc);
3894         if (!sc->watchdog_countdown) {
3895                 err = mxge_watchdog(sc);
3896                 sc->watchdog_countdown = 4;
3897         }
3898         sc->watchdog_countdown--;
3899         if (err == 0)
3900                 callout_reset(&sc->co_hdl, mxge_ticks, mxge_tick, sc);
3901         lwkt_serialize_exit(sc->ifp->if_serializer);
3902 }
3903
3904 static int
3905 mxge_media_change(struct ifnet *ifp)
3906 {
3907         return EINVAL;
3908 }
3909
3910 static int
3911 mxge_change_mtu(mxge_softc_t *sc, int mtu)
3912 {
3913         struct ifnet *ifp = sc->ifp;
3914         int real_mtu, old_mtu;
3915         int err = 0;
3916
3917         if (ifp->if_serializer)
3918                 ASSERT_SERIALIZED(ifp->if_serializer);
3919
3920         real_mtu = mtu + ETHER_HDR_LEN + EVL_ENCAPLEN;
3921         if ((real_mtu > sc->max_mtu) || real_mtu < 60)
3922                 return EINVAL;
3923         old_mtu = ifp->if_mtu;
3924         ifp->if_mtu = mtu;
3925         if (ifp->if_flags & IFF_RUNNING) {
3926                 mxge_close(sc);
3927                 err = mxge_open(sc);
3928                 if (err != 0) {
3929                         ifp->if_mtu = old_mtu;
3930                         mxge_close(sc);
3931                         (void) mxge_open(sc);
3932                 }
3933         }
3934         return err;
3935 }       
3936
3937 static void
3938 mxge_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
3939 {
3940         mxge_softc_t *sc = ifp->if_softc;
3941         
3942
3943         if (sc == NULL)
3944                 return;
3945         ifmr->ifm_status = IFM_AVALID;
3946         ifmr->ifm_status |= sc->link_state ? IFM_ACTIVE : 0;
3947         ifmr->ifm_active = IFM_AUTO | IFM_ETHER;
3948         ifmr->ifm_active |= sc->link_state ? IFM_FDX : 0;
3949 }
3950
3951 static int
3952 mxge_ioctl(struct ifnet *ifp, u_long command, caddr_t data, struct ucred *cr)
3953 {
3954         mxge_softc_t *sc = ifp->if_softc;
3955         struct ifreq *ifr = (struct ifreq *)data;
3956         int err, mask;
3957
3958         (void)cr;
3959         err = 0;
3960         ASSERT_SERIALIZED(ifp->if_serializer);
3961         switch (command) {
3962         case SIOCSIFADDR:
3963         case SIOCGIFADDR:
3964                 err = ether_ioctl(ifp, command, data);
3965                 break;
3966
3967         case SIOCSIFMTU:
3968                 err = mxge_change_mtu(sc, ifr->ifr_mtu);
3969                 break;
3970
3971         case SIOCSIFFLAGS:
3972                 if (sc->dying) {
3973                         return EINVAL;
3974                 }
3975                 if (ifp->if_flags & IFF_UP) {
3976                         if (!(ifp->if_flags & IFF_RUNNING)) {
3977                                 err = mxge_open(sc);
3978                         } else {
3979                                 /* take care of promis can allmulti
3980                                    flag chages */
3981                                 mxge_change_promisc(sc, 
3982                                                     ifp->if_flags & IFF_PROMISC);
3983                                 mxge_set_multicast_list(sc);
3984                         }
3985                 } else {
3986                         if (ifp->if_flags & IFF_RUNNING) {
3987                                 mxge_close(sc);
3988                         }
3989                 }
3990                 break;
3991
3992         case SIOCADDMULTI:
3993         case SIOCDELMULTI:
3994                 mxge_set_multicast_list(sc);
3995                 break;
3996
3997         case SIOCSIFCAP:
3998                 mask = ifr->ifr_reqcap ^ ifp->if_capenable;
3999                 if (mask & IFCAP_TXCSUM) {
4000                         if (IFCAP_TXCSUM & ifp->if_capenable) {
4001                                 ifp->if_capenable &= ~(IFCAP_TXCSUM|IFCAP_TSO4);
4002                                 ifp->if_hwassist &= ~(CSUM_TCP | CSUM_UDP
4003                                                       | CSUM_TSO);
4004                         } else {
4005                                 ifp->if_capenable |= IFCAP_TXCSUM;
4006                                 ifp->if_hwassist |= (CSUM_TCP | CSUM_UDP);
4007                         }
4008                 } else if (mask & IFCAP_RXCSUM) {
4009                         if (IFCAP_RXCSUM & ifp->if_capenable) {
4010                                 ifp->if_capenable &= ~IFCAP_RXCSUM;
4011                                 sc->csum_flag = 0;
4012                         } else {
4013                                 ifp->if_capenable |= IFCAP_RXCSUM;
4014                                 sc->csum_flag = 1;
4015                         }
4016                 }
4017                 if (mask & IFCAP_TSO4) {
4018                         if (IFCAP_TSO4 & ifp->if_capenable) {
4019                                 ifp->if_capenable &= ~IFCAP_TSO4;
4020                                 ifp->if_hwassist &= ~CSUM_TSO;
4021                         } else if (IFCAP_TXCSUM & ifp->if_capenable) {
4022                                 ifp->if_capenable |= IFCAP_TSO4;
4023                                 ifp->if_hwassist |= CSUM_TSO;
4024                         } else {
4025                                 kprintf("mxge requires tx checksum offload"
4026                                        " be enabled to use TSO\n");
4027                                 err = EINVAL;
4028                         }
4029                 }
4030                 if (mask & IFCAP_LRO) {
4031                         if (IFCAP_LRO & ifp->if_capenable) 
4032                                 err = mxge_change_lro_locked(sc, 0);
4033                         else
4034                                 err = mxge_change_lro_locked(sc, mxge_lro_cnt);
4035                 }
4036                 if (mask & IFCAP_VLAN_HWTAGGING)
4037                         ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
4038                 VLAN_CAPABILITIES(ifp);
4039
4040                 break;
4041
4042         case SIOCGIFMEDIA:
4043                 err = ifmedia_ioctl(ifp, (struct ifreq *)data, 
4044                                     &sc->media, command);
4045                 break;
4046
4047         default:
4048                 err = ENOTTY;
4049         }
4050         return err;
4051 }
4052
4053 static void
4054 mxge_fetch_tunables(mxge_softc_t *sc)
4055 {
4056
4057         TUNABLE_INT_FETCH("hw.mxge.max_slices", &mxge_max_slices);
4058         TUNABLE_INT_FETCH("hw.mxge.flow_control_enabled", 
4059                           &mxge_flow_control);
4060         TUNABLE_INT_FETCH("hw.mxge.intr_coal_delay", 
4061                           &mxge_intr_coal_delay);       
4062         TUNABLE_INT_FETCH("hw.mxge.nvidia_ecrc_enable", 
4063                           &mxge_nvidia_ecrc_enable);    
4064         TUNABLE_INT_FETCH("hw.mxge.force_firmware", 
4065                           &mxge_force_firmware);        
4066         TUNABLE_INT_FETCH("hw.mxge.deassert_wait", 
4067                           &mxge_deassert_wait); 
4068         TUNABLE_INT_FETCH("hw.mxge.verbose", 
4069                           &mxge_verbose);       
4070         TUNABLE_INT_FETCH("hw.mxge.ticks", &mxge_ticks);
4071         TUNABLE_INT_FETCH("hw.mxge.lro_cnt", &sc->lro_cnt);
4072         TUNABLE_INT_FETCH("hw.mxge.always_promisc", &mxge_always_promisc);
4073         TUNABLE_INT_FETCH("hw.mxge.rss_hash_type", &mxge_rss_hash_type);
4074         TUNABLE_INT_FETCH("hw.mxge.initial_mtu", &mxge_initial_mtu);
4075         if (sc->lro_cnt != 0)
4076                 mxge_lro_cnt = sc->lro_cnt;
4077
4078         if (bootverbose)
4079                 mxge_verbose = 1;
4080         if (mxge_intr_coal_delay < 0 || mxge_intr_coal_delay > 10*1000)
4081                 mxge_intr_coal_delay = 30;
4082         if (mxge_ticks == 0)
4083                 mxge_ticks = hz / 2;
4084         sc->pause = mxge_flow_control;
4085         if (mxge_rss_hash_type < MXGEFW_RSS_HASH_TYPE_IPV4 
4086             || mxge_rss_hash_type > MXGEFW_RSS_HASH_TYPE_MAX) {
4087                 mxge_rss_hash_type = MXGEFW_RSS_HASH_TYPE_SRC_PORT;
4088         }
4089         if (mxge_initial_mtu > ETHERMTU_JUMBO ||
4090             mxge_initial_mtu < ETHER_MIN_LEN)
4091                 mxge_initial_mtu = ETHERMTU_JUMBO;
4092 }
4093
4094
4095 static void
4096 mxge_free_slices(mxge_softc_t *sc)
4097 {
4098         struct mxge_slice_state *ss;
4099         int i;
4100
4101
4102         if (sc->ss == NULL)
4103                 return;
4104
4105         for (i = 0; i < sc->num_slices; i++) {
4106                 ss = &sc->ss[i];
4107                 if (ss->fw_stats != NULL) {
4108                         mxge_dma_free(&ss->fw_stats_dma);
4109                         ss->fw_stats = NULL;
4110 #ifdef IFNET_BUF_RING
4111                         if (ss->tx.br != NULL) {
4112                                 drbr_free(ss->tx.br, M_DEVBUF);
4113                                 ss->tx.br = NULL;
4114                         }
4115 #endif
4116                 }
4117                 if (ss->rx_done.entry != NULL) {
4118                         mxge_dma_free(&ss->rx_done.dma);
4119                         ss->rx_done.entry = NULL;
4120                 }
4121         }
4122         kfree(sc->ss, M_DEVBUF);
4123         sc->ss = NULL;
4124 }
4125
4126 static int
4127 mxge_alloc_slices(mxge_softc_t *sc)
4128 {
4129         mxge_cmd_t cmd;
4130         struct mxge_slice_state *ss;
4131         size_t bytes;
4132         int err, i, max_intr_slots;
4133
4134         err = mxge_send_cmd(sc, MXGEFW_CMD_GET_RX_RING_SIZE, &cmd);
4135         if (err != 0) {
4136                 device_printf(sc->dev, "Cannot determine rx ring size\n");
4137                 return err;
4138         }
4139         sc->rx_ring_size = cmd.data0;
4140         max_intr_slots = 2 * (sc->rx_ring_size / sizeof (mcp_dma_addr_t));
4141         
4142         bytes = sizeof (*sc->ss) * sc->num_slices;
4143         sc->ss = kmalloc(bytes, M_DEVBUF, M_NOWAIT | M_ZERO);
4144         if (sc->ss == NULL)
4145                 return (ENOMEM);
4146         for (i = 0; i < sc->num_slices; i++) {
4147                 ss = &sc->ss[i];
4148
4149                 ss->sc = sc;
4150
4151                 /* allocate per-slice rx interrupt queues */
4152                 
4153                 bytes = max_intr_slots * sizeof (*ss->rx_done.entry);
4154                 err = mxge_dma_alloc(sc, &ss->rx_done.dma, bytes, 4096);
4155                 if (err != 0)
4156                         goto abort;
4157                 ss->rx_done.entry = ss->rx_done.dma.addr;
4158                 bzero(ss->rx_done.entry, bytes);
4159
4160                 /* 
4161                  * allocate the per-slice firmware stats; stats
4162                  * (including tx) are used used only on the first
4163                  * slice for now
4164                  */
4165 #ifndef IFNET_BUF_RING
4166                 if (i > 0)
4167                         continue;
4168 #endif
4169
4170                 bytes = sizeof (*ss->fw_stats);
4171                 err = mxge_dma_alloc(sc, &ss->fw_stats_dma, 
4172                                      sizeof (*ss->fw_stats), 64);
4173                 if (err != 0)
4174                         goto abort;
4175                 ss->fw_stats = (mcp_irq_data_t *)ss->fw_stats_dma.addr;
4176 #ifdef IFNET_BUF_RING
4177                 ss->tx.br = buf_ring_alloc(2048, M_DEVBUF, M_WAITOK,
4178                                            &ss->tx.lock);
4179 #endif
4180         }
4181
4182         return (0);
4183
4184 abort:
4185         mxge_free_slices(sc);
4186         return (ENOMEM);
4187 }
4188
4189 static void
4190 mxge_slice_probe(mxge_softc_t *sc)
4191 {
4192         mxge_cmd_t cmd;
4193         char *old_fw;
4194         int msix_cnt, status, max_intr_slots;
4195
4196         sc->num_slices = 1;
4197         /* 
4198          *  don't enable multiple slices if they are not enabled,
4199          *  or if this is not an SMP system 
4200          */
4201         
4202         if (mxge_max_slices == 0 || mxge_max_slices == 1 || ncpus < 2)
4203                 return;
4204
4205         /* see how many MSI-X interrupts are available */
4206         msix_cnt = pci_msix_count(sc->dev);
4207         if (msix_cnt < 2)
4208                 return;
4209
4210         /* now load the slice aware firmware see what it supports */
4211         old_fw = sc->fw_name;
4212         if (old_fw == mxge_fw_aligned)
4213                 sc->fw_name = mxge_fw_rss_aligned;
4214         else
4215                 sc->fw_name = mxge_fw_rss_unaligned;
4216         status = mxge_load_firmware(sc, 0);
4217         if (status != 0) {
4218                 device_printf(sc->dev, "Falling back to a single slice\n");
4219                 return;
4220         }
4221         
4222         /* try to send a reset command to the card to see if it
4223            is alive */
4224         memset(&cmd, 0, sizeof (cmd));
4225         status = mxge_send_cmd(sc, MXGEFW_CMD_RESET, &cmd);
4226         if (status != 0) {
4227                 device_printf(sc->dev, "failed reset\n");
4228                 goto abort_with_fw;
4229         }
4230
4231         /* get rx ring size */
4232         status = mxge_send_cmd(sc, MXGEFW_CMD_GET_RX_RING_SIZE, &cmd);
4233         if (status != 0) {
4234                 device_printf(sc->dev, "Cannot determine rx ring size\n");
4235                 goto abort_with_fw;
4236         }
4237         max_intr_slots = 2 * (cmd.data0 / sizeof (mcp_dma_addr_t));
4238
4239         /* tell it the size of the interrupt queues */
4240         cmd.data0 = max_intr_slots * sizeof (struct mcp_slot);
4241         status = mxge_send_cmd(sc, MXGEFW_CMD_SET_INTRQ_SIZE, &cmd);
4242         if (status != 0) {
4243                 device_printf(sc->dev, "failed MXGEFW_CMD_SET_INTRQ_SIZE\n");
4244                 goto abort_with_fw;
4245         }
4246
4247         /* ask the maximum number of slices it supports */
4248         status = mxge_send_cmd(sc, MXGEFW_CMD_GET_MAX_RSS_QUEUES, &cmd);
4249         if (status != 0) {
4250                 device_printf(sc->dev,
4251                               "failed MXGEFW_CMD_GET_MAX_RSS_QUEUES\n");
4252                 goto abort_with_fw;
4253         }
4254         sc->num_slices = cmd.data0;
4255         if (sc->num_slices > msix_cnt)
4256                 sc->num_slices = msix_cnt;
4257
4258         if (mxge_max_slices == -1) {
4259                 /* cap to number of CPUs in system */
4260                 if (sc->num_slices > ncpus)
4261                         sc->num_slices = ncpus;
4262         } else {
4263                 if (sc->num_slices > mxge_max_slices)
4264                         sc->num_slices = mxge_max_slices;
4265         }
4266         /* make sure it is a power of two */
4267         while (sc->num_slices & (sc->num_slices - 1))
4268                 sc->num_slices--;
4269
4270         if (mxge_verbose)
4271                 device_printf(sc->dev, "using %d slices\n",
4272                               sc->num_slices);
4273         
4274         return;
4275
4276 abort_with_fw:
4277         sc->fw_name = old_fw;
4278         (void) mxge_load_firmware(sc, 0);
4279 }
4280
4281 static int
4282 mxge_add_msix_irqs(mxge_softc_t *sc)
4283 {
4284         size_t bytes;
4285         int count, err, i, rid;
4286
4287         rid = PCIR_BAR(2);
4288         sc->msix_table_res = bus_alloc_resource_any(sc->dev, SYS_RES_MEMORY,
4289                                                     &rid, RF_ACTIVE);
4290
4291         if (sc->msix_table_res == NULL) {
4292                 device_printf(sc->dev, "couldn't alloc MSIX table res\n");
4293                 return ENXIO;
4294         }
4295
4296         count = sc->num_slices;
4297         err = pci_alloc_msix(sc->dev, &count);
4298         if (err != 0) {
4299                 device_printf(sc->dev, "pci_alloc_msix: failed, wanted %d"
4300                               "err = %d \n", sc->num_slices, err);
4301                 goto abort_with_msix_table;
4302         }
4303         if (count < sc->num_slices) {
4304                 device_printf(sc->dev, "pci_alloc_msix: need %d, got %d\n",
4305                               count, sc->num_slices);
4306                 device_printf(sc->dev,
4307                               "Try setting hw.mxge.max_slices to %d\n",
4308                               count);
4309                 err = ENOSPC;
4310                 goto abort_with_msix;
4311         }
4312         bytes = sizeof (*sc->msix_irq_res) * sc->num_slices;
4313         sc->msix_irq_res = kmalloc(bytes, M_DEVBUF, M_NOWAIT|M_ZERO);
4314         if (sc->msix_irq_res == NULL) {
4315                 err = ENOMEM;
4316                 goto abort_with_msix;
4317         }
4318
4319         for (i = 0; i < sc->num_slices; i++) {
4320                 rid = i + 1;
4321                 sc->msix_irq_res[i] = bus_alloc_resource_any(sc->dev,
4322                                                           SYS_RES_IRQ,
4323                                                           &rid, RF_ACTIVE);
4324                 if (sc->msix_irq_res[i] == NULL) {
4325                         device_printf(sc->dev, "couldn't allocate IRQ res"
4326                                       " for message %d\n", i);
4327                         err = ENXIO;
4328                         goto abort_with_res;
4329                 }
4330         }
4331
4332         bytes = sizeof (*sc->msix_ih) * sc->num_slices;
4333         sc->msix_ih =  kmalloc(bytes, M_DEVBUF, M_NOWAIT|M_ZERO);
4334
4335         for (i = 0; i < sc->num_slices; i++) {
4336                 err = bus_setup_intr(sc->dev, sc->msix_irq_res[i], 
4337                                      INTR_MPSAFE,
4338                                      mxge_intr, &sc->ss[i], &sc->msix_ih[i],
4339                                      sc->ifp->if_serializer);
4340                 if (err != 0) {
4341                         device_printf(sc->dev, "couldn't setup intr for "
4342                                       "message %d\n", i);
4343                         goto abort_with_intr;
4344                 }
4345         }
4346
4347         if (mxge_verbose) {
4348                 device_printf(sc->dev, "using %d msix IRQs:",
4349                               sc->num_slices);
4350                 for (i = 0; i < sc->num_slices; i++)
4351                         kprintf(" %ld",  rman_get_start(sc->msix_irq_res[i]));
4352                 kprintf("\n");
4353         }
4354         return (0);
4355
4356 abort_with_intr:
4357         for (i = 0; i < sc->num_slices; i++) {
4358                 if (sc->msix_ih[i] != NULL) {
4359                         bus_teardown_intr(sc->dev, sc->msix_irq_res[i],
4360                                           sc->msix_ih[i]);
4361                         sc->msix_ih[i] = NULL;
4362                 }
4363         }
4364         kfree(sc->msix_ih, M_DEVBUF);
4365
4366
4367 abort_with_res:
4368         for (i = 0; i < sc->num_slices; i++) {
4369                 rid = i + 1;
4370                 if (sc->msix_irq_res[i] != NULL)
4371                         bus_release_resource(sc->dev, SYS_RES_IRQ, rid,
4372                                              sc->msix_irq_res[i]);
4373                 sc->msix_irq_res[i] = NULL;
4374         }
4375         kfree(sc->msix_irq_res, M_DEVBUF);
4376
4377
4378 abort_with_msix:
4379         pci_release_msi(sc->dev);
4380
4381 abort_with_msix_table:
4382         bus_release_resource(sc->dev, SYS_RES_MEMORY, PCIR_BAR(2),
4383                              sc->msix_table_res);
4384
4385         return err;
4386 }
4387
4388 static int
4389 mxge_add_single_irq(mxge_softc_t *sc)
4390 {
4391         int count, err, rid;
4392
4393         count = pci_msi_count(sc->dev);
4394         if (count == 1 && pci_alloc_msi(sc->dev, &count) == 0) {
4395                 rid = 1;
4396         } else {
4397                 rid = 0;
4398                 sc->legacy_irq = 1;
4399         }
4400         sc->irq_res = bus_alloc_resource(sc->dev, SYS_RES_IRQ, &rid, 0, ~0,
4401                                          1, RF_SHAREABLE | RF_ACTIVE);
4402         if (sc->irq_res == NULL) {
4403                 device_printf(sc->dev, "could not alloc interrupt\n");
4404                 return ENXIO;
4405         }
4406         if (mxge_verbose)
4407                 device_printf(sc->dev, "using %s irq %ld\n",
4408                               sc->legacy_irq ? "INTx" : "MSI",
4409                               rman_get_start(sc->irq_res));
4410         err = bus_setup_intr(sc->dev, sc->irq_res, 
4411                              INTR_MPSAFE,
4412                              mxge_intr, &sc->ss[0], &sc->ih,
4413                              sc->ifp->if_serializer);
4414         if (err != 0) {
4415                 bus_release_resource(sc->dev, SYS_RES_IRQ,
4416                                      sc->legacy_irq ? 0 : 1, sc->irq_res);
4417                 if (!sc->legacy_irq)
4418                         pci_release_msi(sc->dev);
4419         }
4420         return err;
4421 }
4422
4423 static void
4424 mxge_rem_msix_irqs(mxge_softc_t *sc)
4425 {
4426         int i, rid;
4427
4428         for (i = 0; i < sc->num_slices; i++) {
4429                 if (sc->msix_ih[i] != NULL) {
4430                         bus_teardown_intr(sc->dev, sc->msix_irq_res[i],
4431                                           sc->msix_ih[i]);
4432                         sc->msix_ih[i] = NULL;
4433                 }
4434         }
4435         kfree(sc->msix_ih, M_DEVBUF);
4436
4437         for (i = 0; i < sc->num_slices; i++) {
4438                 rid = i + 1;
4439                 if (sc->msix_irq_res[i] != NULL)
4440                         bus_release_resource(sc->dev, SYS_RES_IRQ, rid,
4441                                              sc->msix_irq_res[i]);
4442                 sc->msix_irq_res[i] = NULL;
4443         }
4444         kfree(sc->msix_irq_res, M_DEVBUF);
4445
4446         bus_release_resource(sc->dev, SYS_RES_MEMORY, PCIR_BAR(2),
4447                              sc->msix_table_res);
4448
4449         pci_release_msi(sc->dev);
4450         return;
4451 }
4452
4453 static void
4454 mxge_rem_single_irq(mxge_softc_t *sc)
4455 {
4456         bus_teardown_intr(sc->dev, sc->irq_res, sc->ih);
4457         bus_release_resource(sc->dev, SYS_RES_IRQ,
4458                              sc->legacy_irq ? 0 : 1, sc->irq_res);
4459         if (!sc->legacy_irq)
4460                 pci_release_msi(sc->dev);
4461 }
4462
4463 static void
4464 mxge_rem_irq(mxge_softc_t *sc)
4465 {
4466         if (sc->num_slices > 1)
4467                 mxge_rem_msix_irqs(sc);
4468         else
4469                 mxge_rem_single_irq(sc);
4470 }
4471
4472 static int
4473 mxge_add_irq(mxge_softc_t *sc)
4474 {
4475         int err;
4476
4477         if (sc->num_slices > 1)
4478                 err = mxge_add_msix_irqs(sc);
4479         else
4480                 err = mxge_add_single_irq(sc);
4481         
4482         if (0 && err == 0 && sc->num_slices > 1) {
4483                 mxge_rem_msix_irqs(sc);
4484                 err = mxge_add_msix_irqs(sc);
4485         }
4486         return err;
4487 }
4488
4489
4490 static int 
4491 mxge_attach(device_t dev)
4492 {
4493         mxge_softc_t *sc = device_get_softc(dev);
4494         struct ifnet *ifp = &sc->arpcom.ac_if;
4495         int err, rid;
4496
4497         /*
4498          * avoid rewriting half the lines in this file to use
4499          * &sc->arpcom.ac_if instead
4500          */
4501         sc->ifp = ifp;
4502         sc->dev = dev;
4503         mxge_fetch_tunables(sc);
4504
4505         err = bus_dma_tag_create(NULL,                  /* parent */
4506                                  1,                     /* alignment */
4507                                  0,                     /* boundary */
4508                                  BUS_SPACE_MAXADDR,     /* low */
4509                                  BUS_SPACE_MAXADDR,     /* high */
4510                                  NULL, NULL,            /* filter */
4511                                  65536 + 256,           /* maxsize */
4512                                  MXGE_MAX_SEND_DESC,    /* num segs */
4513                                  65536,                 /* maxsegsize */
4514                                  0,                     /* flags */
4515                                  &sc->parent_dmat);     /* tag */
4516
4517         if (err != 0) {
4518                 device_printf(sc->dev, "Err %d allocating parent dmat\n",
4519                               err);
4520                 goto abort_with_nothing;
4521         }
4522
4523         sc->ifp = ifp;
4524         if_initname(ifp, device_get_name(dev), device_get_unit(dev));
4525
4526         callout_init_mp(&sc->co_hdl);
4527
4528         mxge_setup_cfg_space(sc);
4529         
4530         /* Map the board into the kernel */
4531         rid = PCIR_BARS;
4532         sc->mem_res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid, 0,
4533                                          ~0, 1, RF_ACTIVE);
4534         if (sc->mem_res == NULL) {
4535                 device_printf(dev, "could not map memory\n");
4536                 err = ENXIO;
4537                 goto abort_with_nothing;
4538         }
4539         sc->sram = rman_get_virtual(sc->mem_res);
4540         sc->sram_size = 2*1024*1024 - (2*(48*1024)+(32*1024)) - 0x100;
4541         if (sc->sram_size > rman_get_size(sc->mem_res)) {
4542                 device_printf(dev, "impossible memory region size %ld\n",
4543                               rman_get_size(sc->mem_res));
4544                 err = ENXIO;
4545                 goto abort_with_mem_res;
4546         }
4547
4548         /* make NULL terminated copy of the EEPROM strings section of
4549            lanai SRAM */
4550         bzero(sc->eeprom_strings, MXGE_EEPROM_STRINGS_SIZE);
4551         bus_space_read_region_1(rman_get_bustag(sc->mem_res),
4552                                 rman_get_bushandle(sc->mem_res),
4553                                 sc->sram_size - MXGE_EEPROM_STRINGS_SIZE,
4554                                 sc->eeprom_strings, 
4555                                 MXGE_EEPROM_STRINGS_SIZE - 2);
4556         err = mxge_parse_strings(sc);
4557         if (err != 0)
4558                 goto abort_with_mem_res;
4559
4560         /* Enable write combining for efficient use of PCIe bus */
4561         mxge_enable_wc(sc);
4562
4563         /* Allocate the out of band dma memory */
4564         err = mxge_dma_alloc(sc, &sc->cmd_dma, 
4565                              sizeof (mxge_cmd_t), 64);
4566         if (err != 0) 
4567                 goto abort_with_mem_res;
4568         sc->cmd = (mcp_cmd_response_t *) sc->cmd_dma.addr;
4569         err = mxge_dma_alloc(sc, &sc->zeropad_dma, 64, 64);
4570         if (err != 0) 
4571                 goto abort_with_cmd_dma;
4572
4573         err = mxge_dma_alloc(sc, &sc->dmabench_dma, 4096, 4096);
4574         if (err != 0)
4575                 goto abort_with_zeropad_dma;
4576
4577         /* select & load the firmware */
4578         err = mxge_select_firmware(sc);
4579         if (err != 0)
4580                 goto abort_with_dmabench;
4581         sc->intr_coal_delay = mxge_intr_coal_delay;
4582
4583         mxge_slice_probe(sc);
4584         err = mxge_alloc_slices(sc);
4585         if (err != 0)
4586                 goto abort_with_dmabench;
4587
4588         err = mxge_reset(sc, 0);
4589         if (err != 0)
4590                 goto abort_with_slices;
4591
4592         err = mxge_alloc_rings(sc);
4593         if (err != 0) {
4594                 device_printf(sc->dev, "failed to allocate rings\n");
4595                 goto abort_with_dmabench;
4596         }
4597
4598         ifp->if_baudrate = IF_Gbps(10UL);
4599         ifp->if_capabilities = IFCAP_RXCSUM | IFCAP_TXCSUM | IFCAP_TSO4 |
4600                 IFCAP_VLAN_MTU;
4601 #ifdef INET
4602         ifp->if_capabilities |= IFCAP_LRO;
4603 #endif
4604
4605 #ifdef MXGE_NEW_VLAN_API
4606         ifp->if_capabilities |= IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_HWCSUM;
4607 #endif
4608
4609         sc->max_mtu = mxge_max_mtu(sc);
4610         if (sc->max_mtu >= 9000)
4611                 ifp->if_capabilities |= IFCAP_JUMBO_MTU;
4612         else
4613                 device_printf(dev, "MTU limited to %d.  Install "
4614                               "latest firmware for 9000 byte jumbo support\n",
4615                               sc->max_mtu - ETHER_HDR_LEN);
4616         ifp->if_hwassist = CSUM_TCP | CSUM_UDP | CSUM_TSO;
4617         ifp->if_capenable = ifp->if_capabilities;
4618         if (sc->lro_cnt == 0)
4619                 ifp->if_capenable &= ~IFCAP_LRO;
4620         sc->csum_flag = 1;
4621         ifp->if_init = mxge_init;
4622         ifp->if_softc = sc;
4623         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
4624         ifp->if_ioctl = mxge_ioctl;
4625         ifp->if_start = mxge_start;
4626         /* Initialise the ifmedia structure */
4627         ifmedia_init(&sc->media, 0, mxge_media_change, 
4628                      mxge_media_status);
4629         mxge_set_media(sc, IFM_ETHER | IFM_AUTO);
4630         mxge_media_probe(sc);
4631         sc->dying = 0;
4632         ether_ifattach(ifp, sc->mac_addr, NULL);
4633         /* ether_ifattach sets mtu to ETHERMTU */
4634         if (mxge_initial_mtu != ETHERMTU) {
4635                 lwkt_serialize_enter(ifp->if_serializer);
4636                 mxge_change_mtu(sc, mxge_initial_mtu);
4637                 lwkt_serialize_exit(ifp->if_serializer);
4638         }
4639         /* must come after ether_ifattach() */
4640         err = mxge_add_irq(sc);
4641         if (err != 0) {
4642                 device_printf(sc->dev, "failed to add irq\n");
4643                 goto abort_with_rings;
4644         }
4645
4646         mxge_add_sysctls(sc);
4647 #ifdef IFNET_BUF_RING
4648         ifp->if_transmit = mxge_transmit;
4649         ifp->if_qflush = mxge_qflush;
4650 #endif
4651         return 0;
4652
4653 abort_with_rings:
4654         mxge_free_rings(sc);
4655 abort_with_slices:
4656         mxge_free_slices(sc);
4657 abort_with_dmabench:
4658         mxge_dma_free(&sc->dmabench_dma);
4659 abort_with_zeropad_dma:
4660         mxge_dma_free(&sc->zeropad_dma);
4661 abort_with_cmd_dma:
4662         mxge_dma_free(&sc->cmd_dma);
4663 abort_with_mem_res:
4664         bus_release_resource(dev, SYS_RES_MEMORY, PCIR_BARS, sc->mem_res);
4665         pci_disable_busmaster(dev);
4666         bus_dma_tag_destroy(sc->parent_dmat);
4667 abort_with_nothing:
4668         return err;
4669 }
4670
4671 static int
4672 mxge_detach(device_t dev)
4673 {
4674         mxge_softc_t *sc = device_get_softc(dev);
4675
4676         lwkt_serialize_enter(sc->ifp->if_serializer);
4677         sc->dying = 1;
4678         if (sc->ifp->if_flags & IFF_RUNNING)
4679                 mxge_close(sc);
4680         /*
4681          * XXX: race: the callout callback could be spinning on
4682          * the serializer and run anyway
4683          */
4684         callout_stop(&sc->co_hdl);
4685         lwkt_serialize_exit(sc->ifp->if_serializer);
4686
4687         ether_ifdetach(sc->ifp);
4688         ifmedia_removeall(&sc->media);
4689         mxge_dummy_rdma(sc, 0);
4690         mxge_rem_sysctls(sc);
4691         mxge_rem_irq(sc);
4692         mxge_free_rings(sc);
4693         mxge_free_slices(sc);
4694         mxge_dma_free(&sc->dmabench_dma);
4695         mxge_dma_free(&sc->zeropad_dma);
4696         mxge_dma_free(&sc->cmd_dma);
4697         bus_release_resource(dev, SYS_RES_MEMORY, PCIR_BARS, sc->mem_res);
4698         pci_disable_busmaster(dev);
4699         bus_dma_tag_destroy(sc->parent_dmat);
4700         return 0;
4701 }
4702
4703 static int
4704 mxge_shutdown(device_t dev)
4705 {
4706         return 0;
4707 }
4708
4709 /*
4710   This file uses Myri10GE driver indentation.
4711
4712   Local Variables:
4713   c-file-style:"linux"
4714   tab-width:8
4715   End:
4716 */