]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/dev/cxgb/cxgb_main.c
zfs: merge openzfs/zfs@07a4c76e9 (master) into main
[FreeBSD/FreeBSD.git] / sys / dev / cxgb / cxgb_main.c
1 /**************************************************************************
2 SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3
4 Copyright (c) 2007-2009, Chelsio Inc.
5 All rights reserved.
6
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions are met:
9
10  1. Redistributions of source code must retain the above copyright notice,
11     this list of conditions and the following disclaimer.
12
13  2. Neither the name of the Chelsio Corporation nor the names of its
14     contributors may be used to endorse or promote products derived from
15     this software without specific prior written permission.
16
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21 LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 POSSIBILITY OF SUCH DAMAGE.
28
29 ***************************************************************************/
30
31 #include <sys/cdefs.h>
32 __FBSDID("$FreeBSD$");
33
34 #include "opt_inet.h"
35
36 #include <sys/param.h>
37 #include <sys/systm.h>
38 #include <sys/kernel.h>
39 #include <sys/bus.h>
40 #include <sys/module.h>
41 #include <sys/pciio.h>
42 #include <sys/conf.h>
43 #include <machine/bus.h>
44 #include <machine/resource.h>
45 #include <sys/ktr.h>
46 #include <sys/rman.h>
47 #include <sys/ioccom.h>
48 #include <sys/mbuf.h>
49 #include <sys/linker.h>
50 #include <sys/firmware.h>
51 #include <sys/socket.h>
52 #include <sys/sockio.h>
53 #include <sys/smp.h>
54 #include <sys/sysctl.h>
55 #include <sys/syslog.h>
56 #include <sys/queue.h>
57 #include <sys/taskqueue.h>
58 #include <sys/proc.h>
59
60 #include <net/bpf.h>
61 #include <net/debugnet.h>
62 #include <net/ethernet.h>
63 #include <net/if.h>
64 #include <net/if_var.h>
65 #include <net/if_arp.h>
66 #include <net/if_dl.h>
67 #include <net/if_media.h>
68 #include <net/if_types.h>
69 #include <net/if_vlan_var.h>
70
71 #include <netinet/in_systm.h>
72 #include <netinet/in.h>
73 #include <netinet/if_ether.h>
74 #include <netinet/ip.h>
75 #include <netinet/ip.h>
76 #include <netinet/tcp.h>
77 #include <netinet/udp.h>
78
79 #include <dev/pci/pcireg.h>
80 #include <dev/pci/pcivar.h>
81 #include <dev/pci/pci_private.h>
82
83 #include <cxgb_include.h>
84
85 #ifdef PRIV_SUPPORTED
86 #include <sys/priv.h>
87 #endif
88
89 static int cxgb_setup_interrupts(adapter_t *);
90 static void cxgb_teardown_interrupts(adapter_t *);
91 static void cxgb_init(void *);
92 static int cxgb_init_locked(struct port_info *);
93 static int cxgb_uninit_locked(struct port_info *);
94 static int cxgb_uninit_synchronized(struct port_info *);
95 static int cxgb_ioctl(struct ifnet *, unsigned long, caddr_t);
96 static int cxgb_media_change(struct ifnet *);
97 static int cxgb_ifm_type(int);
98 static void cxgb_build_medialist(struct port_info *);
99 static void cxgb_media_status(struct ifnet *, struct ifmediareq *);
100 static uint64_t cxgb_get_counter(struct ifnet *, ift_counter);
101 static int setup_sge_qsets(adapter_t *);
102 static void cxgb_async_intr(void *);
103 static void cxgb_tick_handler(void *, int);
104 static void cxgb_tick(void *);
105 static void link_check_callout(void *);
106 static void check_link_status(void *, int);
107 static void setup_rss(adapter_t *sc);
108 static int alloc_filters(struct adapter *);
109 static int setup_hw_filters(struct adapter *);
110 static int set_filter(struct adapter *, int, const struct filter_info *);
111 static inline void mk_set_tcb_field(struct cpl_set_tcb_field *, unsigned int,
112     unsigned int, u64, u64);
113 static inline void set_tcb_field_ulp(struct cpl_set_tcb_field *, unsigned int,
114     unsigned int, u64, u64);
115 #ifdef TCP_OFFLOAD
116 static int cpl_not_handled(struct sge_qset *, struct rsp_desc *, struct mbuf *);
117 #endif
118
119 /* Attachment glue for the PCI controller end of the device.  Each port of
120  * the device is attached separately, as defined later.
121  */
122 static int cxgb_controller_probe(device_t);
123 static int cxgb_controller_attach(device_t);
124 static int cxgb_controller_detach(device_t);
125 static void cxgb_free(struct adapter *);
126 static __inline void reg_block_dump(struct adapter *ap, uint8_t *buf, unsigned int start,
127     unsigned int end);
128 static void cxgb_get_regs(adapter_t *sc, struct ch_ifconf_regs *regs, uint8_t *buf);
129 static int cxgb_get_regs_len(void);
130 static void touch_bars(device_t dev);
131 static void cxgb_update_mac_settings(struct port_info *p);
132 #ifdef TCP_OFFLOAD
133 static int toe_capability(struct port_info *, int);
134 #endif
135
136 /* Table for probing the cards.  The desc field isn't actually used */
137 struct cxgb_ident {
138         uint16_t        vendor;
139         uint16_t        device;
140         int             index;
141         char            *desc;
142 } cxgb_identifiers[] = {
143         {PCI_VENDOR_ID_CHELSIO, 0x0020, 0, "PE9000"},
144         {PCI_VENDOR_ID_CHELSIO, 0x0021, 1, "T302E"},
145         {PCI_VENDOR_ID_CHELSIO, 0x0022, 2, "T310E"},
146         {PCI_VENDOR_ID_CHELSIO, 0x0023, 3, "T320X"},
147         {PCI_VENDOR_ID_CHELSIO, 0x0024, 1, "T302X"},
148         {PCI_VENDOR_ID_CHELSIO, 0x0025, 3, "T320E"},
149         {PCI_VENDOR_ID_CHELSIO, 0x0026, 2, "T310X"},
150         {PCI_VENDOR_ID_CHELSIO, 0x0030, 2, "T3B10"},
151         {PCI_VENDOR_ID_CHELSIO, 0x0031, 3, "T3B20"},
152         {PCI_VENDOR_ID_CHELSIO, 0x0032, 1, "T3B02"},
153         {PCI_VENDOR_ID_CHELSIO, 0x0033, 4, "T3B04"},
154         {PCI_VENDOR_ID_CHELSIO, 0x0035, 6, "T3C10"},
155         {PCI_VENDOR_ID_CHELSIO, 0x0036, 3, "S320E-CR"},
156         {PCI_VENDOR_ID_CHELSIO, 0x0037, 7, "N320E-G2"},
157         {0, 0, 0, NULL}
158 };
159
160 static device_method_t cxgb_controller_methods[] = {
161         DEVMETHOD(device_probe,         cxgb_controller_probe),
162         DEVMETHOD(device_attach,        cxgb_controller_attach),
163         DEVMETHOD(device_detach,        cxgb_controller_detach),
164
165         DEVMETHOD_END
166 };
167
168 static driver_t cxgb_controller_driver = {
169         "cxgbc",
170         cxgb_controller_methods,
171         sizeof(struct adapter)
172 };
173
174 static int cxgbc_mod_event(module_t, int, void *);
175 static devclass_t       cxgb_controller_devclass;
176 DRIVER_MODULE(cxgbc, pci, cxgb_controller_driver, cxgb_controller_devclass,
177     cxgbc_mod_event, 0);
178 MODULE_PNP_INFO("U16:vendor;U16:device", pci, cxgbc, cxgb_identifiers,
179     nitems(cxgb_identifiers) - 1);
180 MODULE_VERSION(cxgbc, 1);
181 MODULE_DEPEND(cxgbc, firmware, 1, 1, 1);
182
183 /*
184  * Attachment glue for the ports.  Attachment is done directly to the
185  * controller device.
186  */
187 static int cxgb_port_probe(device_t);
188 static int cxgb_port_attach(device_t);
189 static int cxgb_port_detach(device_t);
190
191 static device_method_t cxgb_port_methods[] = {
192         DEVMETHOD(device_probe,         cxgb_port_probe),
193         DEVMETHOD(device_attach,        cxgb_port_attach),
194         DEVMETHOD(device_detach,        cxgb_port_detach),
195         { 0, 0 }
196 };
197
198 static driver_t cxgb_port_driver = {
199         "cxgb",
200         cxgb_port_methods,
201         0
202 };
203
204 static d_ioctl_t cxgb_extension_ioctl;
205 static d_open_t cxgb_extension_open;
206 static d_close_t cxgb_extension_close;
207
208 static struct cdevsw cxgb_cdevsw = {
209        .d_version =    D_VERSION,
210        .d_flags =      0,
211        .d_open =       cxgb_extension_open,
212        .d_close =      cxgb_extension_close,
213        .d_ioctl =      cxgb_extension_ioctl,
214        .d_name =       "cxgb",
215 };
216
217 static devclass_t       cxgb_port_devclass;
218 DRIVER_MODULE(cxgb, cxgbc, cxgb_port_driver, cxgb_port_devclass, 0, 0);
219 MODULE_VERSION(cxgb, 1);
220
221 DEBUGNET_DEFINE(cxgb);
222
223 static struct mtx t3_list_lock;
224 static SLIST_HEAD(, adapter) t3_list;
225 #ifdef TCP_OFFLOAD
226 static struct mtx t3_uld_list_lock;
227 static SLIST_HEAD(, uld_info) t3_uld_list;
228 #endif
229
230 /*
231  * The driver uses the best interrupt scheme available on a platform in the
232  * order MSI-X, MSI, legacy pin interrupts.  This parameter determines which
233  * of these schemes the driver may consider as follows:
234  *
235  * msi = 2: choose from among all three options
236  * msi = 1 : only consider MSI and pin interrupts
237  * msi = 0: force pin interrupts
238  */
239 static int msi_allowed = 2;
240
241 SYSCTL_NODE(_hw, OID_AUTO, cxgb, CTLFLAG_RD | CTLFLAG_MPSAFE, 0,
242     "CXGB driver parameters");
243 SYSCTL_INT(_hw_cxgb, OID_AUTO, msi_allowed, CTLFLAG_RDTUN, &msi_allowed, 0,
244     "MSI-X, MSI, INTx selector");
245
246 /*
247  * The driver uses an auto-queue algorithm by default.
248  * To disable it and force a single queue-set per port, use multiq = 0
249  */
250 static int multiq = 1;
251 SYSCTL_INT(_hw_cxgb, OID_AUTO, multiq, CTLFLAG_RDTUN, &multiq, 0,
252     "use min(ncpus/ports, 8) queue-sets per port");
253
254 /*
255  * By default the driver will not update the firmware unless
256  * it was compiled against a newer version
257  * 
258  */
259 static int force_fw_update = 0;
260 SYSCTL_INT(_hw_cxgb, OID_AUTO, force_fw_update, CTLFLAG_RDTUN, &force_fw_update, 0,
261     "update firmware even if up to date");
262
263 int cxgb_use_16k_clusters = -1;
264 SYSCTL_INT(_hw_cxgb, OID_AUTO, use_16k_clusters, CTLFLAG_RDTUN,
265     &cxgb_use_16k_clusters, 0, "use 16kB clusters for the jumbo queue ");
266
267 static int nfilters = -1;
268 SYSCTL_INT(_hw_cxgb, OID_AUTO, nfilters, CTLFLAG_RDTUN,
269     &nfilters, 0, "max number of entries in the filter table");
270
271 enum {
272         MAX_TXQ_ENTRIES      = 16384,
273         MAX_CTRL_TXQ_ENTRIES = 1024,
274         MAX_RSPQ_ENTRIES     = 16384,
275         MAX_RX_BUFFERS       = 16384,
276         MAX_RX_JUMBO_BUFFERS = 16384,
277         MIN_TXQ_ENTRIES      = 4,
278         MIN_CTRL_TXQ_ENTRIES = 4,
279         MIN_RSPQ_ENTRIES     = 32,
280         MIN_FL_ENTRIES       = 32,
281         MIN_FL_JUMBO_ENTRIES = 32
282 };
283
284 struct filter_info {
285         u32 sip;
286         u32 sip_mask;
287         u32 dip;
288         u16 sport;
289         u16 dport;
290         u32 vlan:12;
291         u32 vlan_prio:3;
292         u32 mac_hit:1;
293         u32 mac_idx:4;
294         u32 mac_vld:1;
295         u32 pkt_type:2;
296         u32 report_filter_id:1;
297         u32 pass:1;
298         u32 rss:1;
299         u32 qset:3;
300         u32 locked:1;
301         u32 valid:1;
302 };
303
304 enum { FILTER_NO_VLAN_PRI = 7 };
305
306 #define EEPROM_MAGIC 0x38E2F10C
307
308 #define PORT_MASK ((1 << MAX_NPORTS) - 1)
309
310
311 static int set_eeprom(struct port_info *pi, const uint8_t *data, int len, int offset);
312
313
314 static __inline char
315 t3rev2char(struct adapter *adapter)
316 {
317         char rev = 'z';
318
319         switch(adapter->params.rev) {
320         case T3_REV_A:
321                 rev = 'a';
322                 break;
323         case T3_REV_B:
324         case T3_REV_B2:
325                 rev = 'b';
326                 break;
327         case T3_REV_C:
328                 rev = 'c';
329                 break;
330         }
331         return rev;
332 }
333
334 static struct cxgb_ident *
335 cxgb_get_ident(device_t dev)
336 {
337         struct cxgb_ident *id;
338
339         for (id = cxgb_identifiers; id->desc != NULL; id++) {
340                 if ((id->vendor == pci_get_vendor(dev)) &&
341                     (id->device == pci_get_device(dev))) {
342                         return (id);
343                 }
344         }
345         return (NULL);
346 }
347
348 static const struct adapter_info *
349 cxgb_get_adapter_info(device_t dev)
350 {
351         struct cxgb_ident *id;
352         const struct adapter_info *ai;
353
354         id = cxgb_get_ident(dev);
355         if (id == NULL)
356                 return (NULL);
357
358         ai = t3_get_adapter_info(id->index);
359
360         return (ai);
361 }
362
363 static int
364 cxgb_controller_probe(device_t dev)
365 {
366         const struct adapter_info *ai;
367         char *ports, buf[80];
368         int nports;
369
370         ai = cxgb_get_adapter_info(dev);
371         if (ai == NULL)
372                 return (ENXIO);
373
374         nports = ai->nports0 + ai->nports1;
375         if (nports == 1)
376                 ports = "port";
377         else
378                 ports = "ports";
379
380         snprintf(buf, sizeof(buf), "%s, %d %s", ai->desc, nports, ports);
381         device_set_desc_copy(dev, buf);
382         return (BUS_PROBE_DEFAULT);
383 }
384
385 #define FW_FNAME "cxgb_t3fw"
386 #define TPEEPROM_NAME "cxgb_t3%c_tp_eeprom"
387 #define TPSRAM_NAME "cxgb_t3%c_protocol_sram"
388
389 static int
390 upgrade_fw(adapter_t *sc)
391 {
392         const struct firmware *fw;
393         int status;
394         u32 vers;
395         
396         if ((fw = firmware_get(FW_FNAME)) == NULL)  {
397                 device_printf(sc->dev, "Could not find firmware image %s\n", FW_FNAME);
398                 return (ENOENT);
399         } else
400                 device_printf(sc->dev, "installing firmware on card\n");
401         status = t3_load_fw(sc, (const uint8_t *)fw->data, fw->datasize);
402
403         if (status != 0) {
404                 device_printf(sc->dev, "failed to install firmware: %d\n",
405                     status);
406         } else {
407                 t3_get_fw_version(sc, &vers);
408                 snprintf(&sc->fw_version[0], sizeof(sc->fw_version), "%d.%d.%d",
409                     G_FW_VERSION_MAJOR(vers), G_FW_VERSION_MINOR(vers),
410                     G_FW_VERSION_MICRO(vers));
411         }
412
413         firmware_put(fw, FIRMWARE_UNLOAD);
414
415         return (status);        
416 }
417
418 /*
419  * The cxgb_controller_attach function is responsible for the initial
420  * bringup of the device.  Its responsibilities include:
421  *
422  *  1. Determine if the device supports MSI or MSI-X.
423  *  2. Allocate bus resources so that we can access the Base Address Register
424  *  3. Create and initialize mutexes for the controller and its control
425  *     logic such as SGE and MDIO.
426  *  4. Call hardware specific setup routine for the adapter as a whole.
427  *  5. Allocate the BAR for doing MSI-X.
428  *  6. Setup the line interrupt iff MSI-X is not supported.
429  *  7. Create the driver's taskq.
430  *  8. Start one task queue service thread.
431  *  9. Check if the firmware and SRAM are up-to-date.  They will be
432  *     auto-updated later (before FULL_INIT_DONE), if required.
433  * 10. Create a child device for each MAC (port)
434  * 11. Initialize T3 private state.
435  * 12. Trigger the LED
436  * 13. Setup offload iff supported.
437  * 14. Reset/restart the tick callout.
438  * 15. Attach sysctls
439  *
440  * NOTE: Any modification or deviation from this list MUST be reflected in
441  * the above comment.  Failure to do so will result in problems on various
442  * error conditions including link flapping.
443  */
444 static int
445 cxgb_controller_attach(device_t dev)
446 {
447         device_t child;
448         const struct adapter_info *ai;
449         struct adapter *sc;
450         int i, error = 0;
451         uint32_t vers;
452         int port_qsets = 1;
453         int msi_needed, reg;
454         char buf[80];
455
456         sc = device_get_softc(dev);
457         sc->dev = dev;
458         sc->msi_count = 0;
459         ai = cxgb_get_adapter_info(dev);
460
461         snprintf(sc->lockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb controller lock %d",
462             device_get_unit(dev));
463         ADAPTER_LOCK_INIT(sc, sc->lockbuf);
464
465         snprintf(sc->reglockbuf, ADAPTER_LOCK_NAME_LEN, "SGE reg lock %d",
466             device_get_unit(dev));
467         snprintf(sc->mdiolockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb mdio lock %d",
468             device_get_unit(dev));
469         snprintf(sc->elmerlockbuf, ADAPTER_LOCK_NAME_LEN, "cxgb elmer lock %d",
470             device_get_unit(dev));
471         
472         MTX_INIT(&sc->sge.reg_lock, sc->reglockbuf, NULL, MTX_SPIN);
473         MTX_INIT(&sc->mdio_lock, sc->mdiolockbuf, NULL, MTX_DEF);
474         MTX_INIT(&sc->elmer_lock, sc->elmerlockbuf, NULL, MTX_DEF);
475
476         mtx_lock(&t3_list_lock);
477         SLIST_INSERT_HEAD(&t3_list, sc, link);
478         mtx_unlock(&t3_list_lock);
479
480         /* find the PCIe link width and set max read request to 4KB*/
481         if (pci_find_cap(dev, PCIY_EXPRESS, &reg) == 0) {
482                 uint16_t lnk;
483
484                 lnk = pci_read_config(dev, reg + PCIER_LINK_STA, 2);
485                 sc->link_width = (lnk & PCIEM_LINK_STA_WIDTH) >> 4;
486                 if (sc->link_width < 8 &&
487                     (ai->caps & SUPPORTED_10000baseT_Full)) {
488                         device_printf(sc->dev,
489                             "PCIe x%d Link, expect reduced performance\n",
490                             sc->link_width);
491                 }
492
493                 pci_set_max_read_req(dev, 4096);
494         }
495
496         touch_bars(dev);
497         pci_enable_busmaster(dev);
498         /*
499          * Allocate the registers and make them available to the driver.
500          * The registers that we care about for NIC mode are in BAR 0
501          */
502         sc->regs_rid = PCIR_BAR(0);
503         if ((sc->regs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
504             &sc->regs_rid, RF_ACTIVE)) == NULL) {
505                 device_printf(dev, "Cannot allocate BAR region 0\n");
506                 error = ENXIO;
507                 goto out;
508         }
509
510         sc->bt = rman_get_bustag(sc->regs_res);
511         sc->bh = rman_get_bushandle(sc->regs_res);
512         sc->mmio_len = rman_get_size(sc->regs_res);
513
514         for (i = 0; i < MAX_NPORTS; i++)
515                 sc->port[i].adapter = sc;
516
517         if (t3_prep_adapter(sc, ai, 1) < 0) {
518                 printf("prep adapter failed\n");
519                 error = ENODEV;
520                 goto out;
521         }
522
523         sc->udbs_rid = PCIR_BAR(2);
524         sc->udbs_res = NULL;
525         if (is_offload(sc) &&
526             ((sc->udbs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
527                    &sc->udbs_rid, RF_ACTIVE)) == NULL)) {
528                 device_printf(dev, "Cannot allocate BAR region 1\n");
529                 error = ENXIO;
530                 goto out;
531         }
532
533         /* Allocate the BAR for doing MSI-X.  If it succeeds, try to allocate
534          * enough messages for the queue sets.  If that fails, try falling
535          * back to MSI.  If that fails, then try falling back to the legacy
536          * interrupt pin model.
537          */
538         sc->msix_regs_rid = 0x20;
539         if ((msi_allowed >= 2) &&
540             (sc->msix_regs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
541             &sc->msix_regs_rid, RF_ACTIVE)) != NULL) {
542
543                 if (multiq)
544                         port_qsets = min(SGE_QSETS/sc->params.nports, mp_ncpus);
545                 msi_needed = sc->msi_count = sc->params.nports * port_qsets + 1;
546
547                 if (pci_msix_count(dev) == 0 ||
548                     (error = pci_alloc_msix(dev, &sc->msi_count)) != 0 ||
549                     sc->msi_count != msi_needed) {
550                         device_printf(dev, "alloc msix failed - "
551                                       "msi_count=%d, msi_needed=%d, err=%d; "
552                                       "will try MSI\n", sc->msi_count,
553                                       msi_needed, error);
554                         sc->msi_count = 0;
555                         port_qsets = 1;
556                         pci_release_msi(dev);
557                         bus_release_resource(dev, SYS_RES_MEMORY,
558                             sc->msix_regs_rid, sc->msix_regs_res);
559                         sc->msix_regs_res = NULL;
560                 } else {
561                         sc->flags |= USING_MSIX;
562                         sc->cxgb_intr = cxgb_async_intr;
563                         device_printf(dev,
564                                       "using MSI-X interrupts (%u vectors)\n",
565                                       sc->msi_count);
566                 }
567         }
568
569         if ((msi_allowed >= 1) && (sc->msi_count == 0)) {
570                 sc->msi_count = 1;
571                 if ((error = pci_alloc_msi(dev, &sc->msi_count)) != 0) {
572                         device_printf(dev, "alloc msi failed - "
573                                       "err=%d; will try INTx\n", error);
574                         sc->msi_count = 0;
575                         port_qsets = 1;
576                         pci_release_msi(dev);
577                 } else {
578                         sc->flags |= USING_MSI;
579                         sc->cxgb_intr = t3_intr_msi;
580                         device_printf(dev, "using MSI interrupts\n");
581                 }
582         }
583         if (sc->msi_count == 0) {
584                 device_printf(dev, "using line interrupts\n");
585                 sc->cxgb_intr = t3b_intr;
586         }
587
588         /* Create a private taskqueue thread for handling driver events */
589         sc->tq = taskqueue_create("cxgb_taskq", M_NOWAIT,
590             taskqueue_thread_enqueue, &sc->tq);
591         if (sc->tq == NULL) {
592                 device_printf(dev, "failed to allocate controller task queue\n");
593                 goto out;
594         }
595
596         taskqueue_start_threads(&sc->tq, 1, PI_NET, "%s taskq",
597             device_get_nameunit(dev));
598         TASK_INIT(&sc->tick_task, 0, cxgb_tick_handler, sc);
599
600         
601         /* Create a periodic callout for checking adapter status */
602         callout_init(&sc->cxgb_tick_ch, 1);
603         
604         if (t3_check_fw_version(sc) < 0 || force_fw_update) {
605                 /*
606                  * Warn user that a firmware update will be attempted in init.
607                  */
608                 device_printf(dev, "firmware needs to be updated to version %d.%d.%d\n",
609                     FW_VERSION_MAJOR, FW_VERSION_MINOR, FW_VERSION_MICRO);
610                 sc->flags &= ~FW_UPTODATE;
611         } else {
612                 sc->flags |= FW_UPTODATE;
613         }
614
615         if (t3_check_tpsram_version(sc) < 0) {
616                 /*
617                  * Warn user that a firmware update will be attempted in init.
618                  */
619                 device_printf(dev, "SRAM needs to be updated to version %c-%d.%d.%d\n",
620                     t3rev2char(sc), TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO);
621                 sc->flags &= ~TPS_UPTODATE;
622         } else {
623                 sc->flags |= TPS_UPTODATE;
624         }
625
626         /*
627          * Create a child device for each MAC.  The ethernet attachment
628          * will be done in these children.
629          */     
630         for (i = 0; i < (sc)->params.nports; i++) {
631                 struct port_info *pi;
632                 
633                 if ((child = device_add_child(dev, "cxgb", -1)) == NULL) {
634                         device_printf(dev, "failed to add child port\n");
635                         error = EINVAL;
636                         goto out;
637                 }
638                 pi = &sc->port[i];
639                 pi->adapter = sc;
640                 pi->nqsets = port_qsets;
641                 pi->first_qset = i*port_qsets;
642                 pi->port_id = i;
643                 pi->tx_chan = i >= ai->nports0;
644                 pi->txpkt_intf = pi->tx_chan ? 2 * (i - ai->nports0) + 1 : 2 * i;
645                 sc->rxpkt_map[pi->txpkt_intf] = i;
646                 sc->port[i].tx_chan = i >= ai->nports0;
647                 sc->portdev[i] = child;
648                 device_set_softc(child, pi);
649         }
650         if ((error = bus_generic_attach(dev)) != 0)
651                 goto out;
652
653         /* initialize sge private state */
654         t3_sge_init_adapter(sc);
655
656         t3_led_ready(sc);
657
658         error = t3_get_fw_version(sc, &vers);
659         if (error)
660                 goto out;
661
662         snprintf(&sc->fw_version[0], sizeof(sc->fw_version), "%d.%d.%d",
663             G_FW_VERSION_MAJOR(vers), G_FW_VERSION_MINOR(vers),
664             G_FW_VERSION_MICRO(vers));
665
666         snprintf(buf, sizeof(buf), "%s %sNIC\t E/C: %s S/N: %s",
667                  ai->desc, is_offload(sc) ? "R" : "",
668                  sc->params.vpd.ec, sc->params.vpd.sn);
669         device_set_desc_copy(dev, buf);
670
671         snprintf(&sc->port_types[0], sizeof(sc->port_types), "%x%x%x%x",
672                  sc->params.vpd.port_type[0], sc->params.vpd.port_type[1],
673                  sc->params.vpd.port_type[2], sc->params.vpd.port_type[3]);
674
675         device_printf(sc->dev, "Firmware Version %s\n", &sc->fw_version[0]);
676         callout_reset(&sc->cxgb_tick_ch, hz, cxgb_tick, sc);
677         t3_add_attach_sysctls(sc);
678
679 #ifdef TCP_OFFLOAD
680         for (i = 0; i < NUM_CPL_HANDLERS; i++)
681                 sc->cpl_handler[i] = cpl_not_handled;
682 #endif
683
684         t3_intr_clear(sc);
685         error = cxgb_setup_interrupts(sc);
686 out:
687         if (error)
688                 cxgb_free(sc);
689
690         return (error);
691 }
692
693 /*
694  * The cxgb_controller_detach routine is called with the device is
695  * unloaded from the system.
696  */
697
698 static int
699 cxgb_controller_detach(device_t dev)
700 {
701         struct adapter *sc;
702
703         sc = device_get_softc(dev);
704
705         cxgb_free(sc);
706
707         return (0);
708 }
709
710 /*
711  * The cxgb_free() is called by the cxgb_controller_detach() routine
712  * to tear down the structures that were built up in
713  * cxgb_controller_attach(), and should be the final piece of work
714  * done when fully unloading the driver.
715  * 
716  *
717  *  1. Shutting down the threads started by the cxgb_controller_attach()
718  *     routine.
719  *  2. Stopping the lower level device and all callouts (cxgb_down_locked()).
720  *  3. Detaching all of the port devices created during the
721  *     cxgb_controller_attach() routine.
722  *  4. Removing the device children created via cxgb_controller_attach().
723  *  5. Releasing PCI resources associated with the device.
724  *  6. Turning off the offload support, iff it was turned on.
725  *  7. Destroying the mutexes created in cxgb_controller_attach().
726  *
727  */
728 static void
729 cxgb_free(struct adapter *sc)
730 {
731         int i, nqsets = 0;
732
733         ADAPTER_LOCK(sc);
734         sc->flags |= CXGB_SHUTDOWN;
735         ADAPTER_UNLOCK(sc);
736
737         /*
738          * Make sure all child devices are gone.
739          */
740         bus_generic_detach(sc->dev);
741         for (i = 0; i < (sc)->params.nports; i++) {
742                 if (sc->portdev[i] &&
743                     device_delete_child(sc->dev, sc->portdev[i]) != 0)
744                         device_printf(sc->dev, "failed to delete child port\n");
745                 nqsets += sc->port[i].nqsets;
746         }
747
748         /*
749          * At this point, it is as if cxgb_port_detach has run on all ports, and
750          * cxgb_down has run on the adapter.  All interrupts have been silenced,
751          * all open devices have been closed.
752          */
753         KASSERT(sc->open_device_map == 0, ("%s: device(s) still open (%x)",
754                                            __func__, sc->open_device_map));
755         for (i = 0; i < sc->params.nports; i++) {
756                 KASSERT(sc->port[i].ifp == NULL, ("%s: port %i undead!",
757                                                   __func__, i));
758         }
759
760         /*
761          * Finish off the adapter's callouts.
762          */
763         callout_drain(&sc->cxgb_tick_ch);
764         callout_drain(&sc->sge_timer_ch);
765
766         /*
767          * Release resources grabbed under FULL_INIT_DONE by cxgb_up.  The
768          * sysctls are cleaned up by the kernel linker.
769          */
770         if (sc->flags & FULL_INIT_DONE) {
771                 t3_free_sge_resources(sc, nqsets);
772                 sc->flags &= ~FULL_INIT_DONE;
773         }
774
775         /*
776          * Release all interrupt resources.
777          */
778         cxgb_teardown_interrupts(sc);
779         if (sc->flags & (USING_MSI | USING_MSIX)) {
780                 device_printf(sc->dev, "releasing msi message(s)\n");
781                 pci_release_msi(sc->dev);
782         } else {
783                 device_printf(sc->dev, "no msi message to release\n");
784         }
785
786         if (sc->msix_regs_res != NULL) {
787                 bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->msix_regs_rid,
788                     sc->msix_regs_res);
789         }
790
791         /*
792          * Free the adapter's taskqueue.
793          */
794         if (sc->tq != NULL) {
795                 taskqueue_free(sc->tq);
796                 sc->tq = NULL;
797         }
798         
799         free(sc->filters, M_DEVBUF);
800         t3_sge_free(sc);
801
802         if (sc->udbs_res != NULL)
803                 bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->udbs_rid,
804                     sc->udbs_res);
805
806         if (sc->regs_res != NULL)
807                 bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->regs_rid,
808                     sc->regs_res);
809
810         MTX_DESTROY(&sc->mdio_lock);
811         MTX_DESTROY(&sc->sge.reg_lock);
812         MTX_DESTROY(&sc->elmer_lock);
813         mtx_lock(&t3_list_lock);
814         SLIST_REMOVE(&t3_list, sc, adapter, link);
815         mtx_unlock(&t3_list_lock);
816         ADAPTER_LOCK_DEINIT(sc);
817 }
818
819 /**
820  *      setup_sge_qsets - configure SGE Tx/Rx/response queues
821  *      @sc: the controller softc
822  *
823  *      Determines how many sets of SGE queues to use and initializes them.
824  *      We support multiple queue sets per port if we have MSI-X, otherwise
825  *      just one queue set per port.
826  */
827 static int
828 setup_sge_qsets(adapter_t *sc)
829 {
830         int i, j, err, irq_idx = 0, qset_idx = 0;
831         u_int ntxq = SGE_TXQ_PER_SET;
832
833         if ((err = t3_sge_alloc(sc)) != 0) {
834                 device_printf(sc->dev, "t3_sge_alloc returned %d\n", err);
835                 return (err);
836         }
837
838         if (sc->params.rev > 0 && !(sc->flags & USING_MSI))
839                 irq_idx = -1;
840
841         for (i = 0; i < (sc)->params.nports; i++) {
842                 struct port_info *pi = &sc->port[i];
843
844                 for (j = 0; j < pi->nqsets; j++, qset_idx++) {
845                         err = t3_sge_alloc_qset(sc, qset_idx, (sc)->params.nports,
846                             (sc->flags & USING_MSIX) ? qset_idx + 1 : irq_idx,
847                             &sc->params.sge.qset[qset_idx], ntxq, pi);
848                         if (err) {
849                                 t3_free_sge_resources(sc, qset_idx);
850                                 device_printf(sc->dev,
851                                     "t3_sge_alloc_qset failed with %d\n", err);
852                                 return (err);
853                         }
854                 }
855         }
856
857         sc->nqsets = qset_idx;
858
859         return (0);
860 }
861
862 static void
863 cxgb_teardown_interrupts(adapter_t *sc)
864 {
865         int i;
866
867         for (i = 0; i < SGE_QSETS; i++) {
868                 if (sc->msix_intr_tag[i] == NULL) {
869
870                         /* Should have been setup fully or not at all */
871                         KASSERT(sc->msix_irq_res[i] == NULL &&
872                                 sc->msix_irq_rid[i] == 0,
873                                 ("%s: half-done interrupt (%d).", __func__, i));
874
875                         continue;
876                 }
877
878                 bus_teardown_intr(sc->dev, sc->msix_irq_res[i],
879                                   sc->msix_intr_tag[i]);
880                 bus_release_resource(sc->dev, SYS_RES_IRQ, sc->msix_irq_rid[i],
881                                      sc->msix_irq_res[i]);
882
883                 sc->msix_irq_res[i] = sc->msix_intr_tag[i] = NULL;
884                 sc->msix_irq_rid[i] = 0;
885         }
886
887         if (sc->intr_tag) {
888                 KASSERT(sc->irq_res != NULL,
889                         ("%s: half-done interrupt.", __func__));
890
891                 bus_teardown_intr(sc->dev, sc->irq_res, sc->intr_tag);
892                 bus_release_resource(sc->dev, SYS_RES_IRQ, sc->irq_rid,
893                                      sc->irq_res);
894
895                 sc->irq_res = sc->intr_tag = NULL;
896                 sc->irq_rid = 0;
897         }
898 }
899
900 static int
901 cxgb_setup_interrupts(adapter_t *sc)
902 {
903         struct resource *res;
904         void *tag;
905         int i, rid, err, intr_flag = sc->flags & (USING_MSI | USING_MSIX);
906
907         sc->irq_rid = intr_flag ? 1 : 0;
908         sc->irq_res = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ, &sc->irq_rid,
909                                              RF_SHAREABLE | RF_ACTIVE);
910         if (sc->irq_res == NULL) {
911                 device_printf(sc->dev, "Cannot allocate interrupt (%x, %u)\n",
912                               intr_flag, sc->irq_rid);
913                 err = EINVAL;
914                 sc->irq_rid = 0;
915         } else {
916                 err = bus_setup_intr(sc->dev, sc->irq_res,
917                     INTR_MPSAFE | INTR_TYPE_NET, NULL,
918                     sc->cxgb_intr, sc, &sc->intr_tag);
919
920                 if (err) {
921                         device_printf(sc->dev,
922                                       "Cannot set up interrupt (%x, %u, %d)\n",
923                                       intr_flag, sc->irq_rid, err);
924                         bus_release_resource(sc->dev, SYS_RES_IRQ, sc->irq_rid,
925                                              sc->irq_res);
926                         sc->irq_res = sc->intr_tag = NULL;
927                         sc->irq_rid = 0;
928                 }
929         }
930
931         /* That's all for INTx or MSI */
932         if (!(intr_flag & USING_MSIX) || err)
933                 return (err);
934
935         bus_describe_intr(sc->dev, sc->irq_res, sc->intr_tag, "err");
936         for (i = 0; i < sc->msi_count - 1; i++) {
937                 rid = i + 2;
938                 res = bus_alloc_resource_any(sc->dev, SYS_RES_IRQ, &rid,
939                                              RF_SHAREABLE | RF_ACTIVE);
940                 if (res == NULL) {
941                         device_printf(sc->dev, "Cannot allocate interrupt "
942                                       "for message %d\n", rid);
943                         err = EINVAL;
944                         break;
945                 }
946
947                 err = bus_setup_intr(sc->dev, res, INTR_MPSAFE | INTR_TYPE_NET,
948                                      NULL, t3_intr_msix, &sc->sge.qs[i], &tag);
949                 if (err) {
950                         device_printf(sc->dev, "Cannot set up interrupt "
951                                       "for message %d (%d)\n", rid, err);
952                         bus_release_resource(sc->dev, SYS_RES_IRQ, rid, res);
953                         break;
954                 }
955
956                 sc->msix_irq_rid[i] = rid;
957                 sc->msix_irq_res[i] = res;
958                 sc->msix_intr_tag[i] = tag;
959                 bus_describe_intr(sc->dev, res, tag, "qs%d", i);
960         }
961
962         if (err)
963                 cxgb_teardown_interrupts(sc);
964
965         return (err);
966 }
967
968
969 static int
970 cxgb_port_probe(device_t dev)
971 {
972         struct port_info *p;
973         char buf[80];
974         const char *desc;
975         
976         p = device_get_softc(dev);
977         desc = p->phy.desc;
978         snprintf(buf, sizeof(buf), "Port %d %s", p->port_id, desc);
979         device_set_desc_copy(dev, buf);
980         return (0);
981 }
982
983
984 static int
985 cxgb_makedev(struct port_info *pi)
986 {
987         
988         pi->port_cdev = make_dev(&cxgb_cdevsw, pi->ifp->if_dunit,
989             UID_ROOT, GID_WHEEL, 0600, "%s", if_name(pi->ifp));
990         
991         if (pi->port_cdev == NULL)
992                 return (ENOMEM);
993
994         pi->port_cdev->si_drv1 = (void *)pi;
995         
996         return (0);
997 }
998
999 #define CXGB_CAP (IFCAP_VLAN_HWTAGGING | IFCAP_VLAN_MTU | IFCAP_HWCSUM | \
1000     IFCAP_VLAN_HWCSUM | IFCAP_TSO | IFCAP_JUMBO_MTU | IFCAP_LRO | \
1001     IFCAP_VLAN_HWTSO | IFCAP_LINKSTATE | IFCAP_HWCSUM_IPV6)
1002 #define CXGB_CAP_ENABLE CXGB_CAP
1003
1004 static int
1005 cxgb_port_attach(device_t dev)
1006 {
1007         struct port_info *p;
1008         struct ifnet *ifp;
1009         int err;
1010         struct adapter *sc;
1011
1012         p = device_get_softc(dev);
1013         sc = p->adapter;
1014         snprintf(p->lockbuf, PORT_NAME_LEN, "cxgb port lock %d:%d",
1015             device_get_unit(device_get_parent(dev)), p->port_id);
1016         PORT_LOCK_INIT(p, p->lockbuf);
1017
1018         callout_init(&p->link_check_ch, 1);
1019         TASK_INIT(&p->link_check_task, 0, check_link_status, p);
1020
1021         /* Allocate an ifnet object and set it up */
1022         ifp = p->ifp = if_alloc(IFT_ETHER);
1023         if (ifp == NULL) {
1024                 device_printf(dev, "Cannot allocate ifnet\n");
1025                 return (ENOMEM);
1026         }
1027         
1028         if_initname(ifp, device_get_name(dev), device_get_unit(dev));
1029         ifp->if_init = cxgb_init;
1030         ifp->if_softc = p;
1031         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
1032         ifp->if_ioctl = cxgb_ioctl;
1033         ifp->if_transmit = cxgb_transmit;
1034         ifp->if_qflush = cxgb_qflush;
1035         ifp->if_get_counter = cxgb_get_counter;
1036
1037         ifp->if_capabilities = CXGB_CAP;
1038 #ifdef TCP_OFFLOAD
1039         if (is_offload(sc))
1040                 ifp->if_capabilities |= IFCAP_TOE4;
1041 #endif
1042         ifp->if_capenable = CXGB_CAP_ENABLE;
1043         ifp->if_hwassist = CSUM_TCP | CSUM_UDP | CSUM_IP | CSUM_TSO |
1044             CSUM_UDP_IPV6 | CSUM_TCP_IPV6;
1045         ifp->if_hw_tsomax = IP_MAXPACKET;
1046         ifp->if_hw_tsomaxsegcount = 36;
1047         ifp->if_hw_tsomaxsegsize = 65536;
1048
1049         /*
1050          * Disable TSO on 4-port - it isn't supported by the firmware.
1051          */     
1052         if (sc->params.nports > 2) {
1053                 ifp->if_capabilities &= ~(IFCAP_TSO | IFCAP_VLAN_HWTSO);
1054                 ifp->if_capenable &= ~(IFCAP_TSO | IFCAP_VLAN_HWTSO);
1055                 ifp->if_hwassist &= ~CSUM_TSO;
1056         }
1057
1058         ether_ifattach(ifp, p->hw_addr);
1059
1060         /* Attach driver debugnet methods. */
1061         DEBUGNET_SET(ifp, cxgb);
1062
1063 #ifdef DEFAULT_JUMBO
1064         if (sc->params.nports <= 2)
1065                 ifp->if_mtu = ETHERMTU_JUMBO;
1066 #endif
1067         if ((err = cxgb_makedev(p)) != 0) {
1068                 printf("makedev failed %d\n", err);
1069                 return (err);
1070         }
1071
1072         /* Create a list of media supported by this port */
1073         ifmedia_init(&p->media, IFM_IMASK, cxgb_media_change,
1074             cxgb_media_status);
1075         cxgb_build_medialist(p);
1076       
1077         t3_sge_init_port(p);
1078
1079         return (err);
1080 }
1081
1082 /*
1083  * cxgb_port_detach() is called via the device_detach methods when
1084  * cxgb_free() calls the bus_generic_detach.  It is responsible for 
1085  * removing the device from the view of the kernel, i.e. from all 
1086  * interfaces lists etc.  This routine is only called when the driver is 
1087  * being unloaded, not when the link goes down.
1088  */
1089 static int
1090 cxgb_port_detach(device_t dev)
1091 {
1092         struct port_info *p;
1093         struct adapter *sc;
1094         int i;
1095
1096         p = device_get_softc(dev);
1097         sc = p->adapter;
1098
1099         /* Tell cxgb_ioctl and if_init that the port is going away */
1100         ADAPTER_LOCK(sc);
1101         SET_DOOMED(p);
1102         wakeup(&sc->flags);
1103         while (IS_BUSY(sc))
1104                 mtx_sleep(&sc->flags, &sc->lock, 0, "cxgbdtch", 0);
1105         SET_BUSY(sc);
1106         ADAPTER_UNLOCK(sc);
1107
1108         if (p->port_cdev != NULL)
1109                 destroy_dev(p->port_cdev);
1110
1111         cxgb_uninit_synchronized(p);
1112         ether_ifdetach(p->ifp);
1113
1114         for (i = p->first_qset; i < p->first_qset + p->nqsets; i++) {
1115                 struct sge_qset *qs = &sc->sge.qs[i];
1116                 struct sge_txq *txq = &qs->txq[TXQ_ETH];
1117
1118                 callout_drain(&txq->txq_watchdog);
1119                 callout_drain(&txq->txq_timer);
1120         }
1121
1122         PORT_LOCK_DEINIT(p);
1123         if_free(p->ifp);
1124         p->ifp = NULL;
1125
1126         ADAPTER_LOCK(sc);
1127         CLR_BUSY(sc);
1128         wakeup_one(&sc->flags);
1129         ADAPTER_UNLOCK(sc);
1130         return (0);
1131 }
1132
1133 void
1134 t3_fatal_err(struct adapter *sc)
1135 {
1136         u_int fw_status[4];
1137
1138         if (sc->flags & FULL_INIT_DONE) {
1139                 t3_sge_stop(sc);
1140                 t3_write_reg(sc, A_XGM_TX_CTRL, 0);
1141                 t3_write_reg(sc, A_XGM_RX_CTRL, 0);
1142                 t3_write_reg(sc, XGM_REG(A_XGM_TX_CTRL, 1), 0);
1143                 t3_write_reg(sc, XGM_REG(A_XGM_RX_CTRL, 1), 0);
1144                 t3_intr_disable(sc);
1145         }
1146         device_printf(sc->dev,"encountered fatal error, operation suspended\n");
1147         if (!t3_cim_ctl_blk_read(sc, 0xa0, 4, fw_status))
1148                 device_printf(sc->dev, "FW_ status: 0x%x, 0x%x, 0x%x, 0x%x\n",
1149                     fw_status[0], fw_status[1], fw_status[2], fw_status[3]);
1150 }
1151
1152 int
1153 t3_os_find_pci_capability(adapter_t *sc, int cap)
1154 {
1155         device_t dev;
1156         struct pci_devinfo *dinfo;
1157         pcicfgregs *cfg;
1158         uint32_t status;
1159         uint8_t ptr;
1160
1161         dev = sc->dev;
1162         dinfo = device_get_ivars(dev);
1163         cfg = &dinfo->cfg;
1164
1165         status = pci_read_config(dev, PCIR_STATUS, 2);
1166         if (!(status & PCIM_STATUS_CAPPRESENT))
1167                 return (0);
1168
1169         switch (cfg->hdrtype & PCIM_HDRTYPE) {
1170         case 0:
1171         case 1:
1172                 ptr = PCIR_CAP_PTR;
1173                 break;
1174         case 2:
1175                 ptr = PCIR_CAP_PTR_2;
1176                 break;
1177         default:
1178                 return (0);
1179                 break;
1180         }
1181         ptr = pci_read_config(dev, ptr, 1);
1182
1183         while (ptr != 0) {
1184                 if (pci_read_config(dev, ptr + PCICAP_ID, 1) == cap)
1185                         return (ptr);
1186                 ptr = pci_read_config(dev, ptr + PCICAP_NEXTPTR, 1);
1187         }
1188
1189         return (0);
1190 }
1191
1192 int
1193 t3_os_pci_save_state(struct adapter *sc)
1194 {
1195         device_t dev;
1196         struct pci_devinfo *dinfo;
1197
1198         dev = sc->dev;
1199         dinfo = device_get_ivars(dev);
1200
1201         pci_cfg_save(dev, dinfo, 0);
1202         return (0);
1203 }
1204
1205 int
1206 t3_os_pci_restore_state(struct adapter *sc)
1207 {
1208         device_t dev;
1209         struct pci_devinfo *dinfo;
1210
1211         dev = sc->dev;
1212         dinfo = device_get_ivars(dev);
1213
1214         pci_cfg_restore(dev, dinfo);
1215         return (0);
1216 }
1217
1218 /**
1219  *      t3_os_link_changed - handle link status changes
1220  *      @sc: the adapter associated with the link change
1221  *      @port_id: the port index whose link status has changed
1222  *      @link_status: the new status of the link
1223  *      @speed: the new speed setting
1224  *      @duplex: the new duplex setting
1225  *      @fc: the new flow-control setting
1226  *
1227  *      This is the OS-dependent handler for link status changes.  The OS
1228  *      neutral handler takes care of most of the processing for these events,
1229  *      then calls this handler for any OS-specific processing.
1230  */
1231 void
1232 t3_os_link_changed(adapter_t *adapter, int port_id, int link_status, int speed,
1233      int duplex, int fc, int mac_was_reset)
1234 {
1235         struct port_info *pi = &adapter->port[port_id];
1236         struct ifnet *ifp = pi->ifp;
1237
1238         /* no race with detach, so ifp should always be good */
1239         KASSERT(ifp, ("%s: if detached.", __func__));
1240
1241         /* Reapply mac settings if they were lost due to a reset */
1242         if (mac_was_reset) {
1243                 PORT_LOCK(pi);
1244                 cxgb_update_mac_settings(pi);
1245                 PORT_UNLOCK(pi);
1246         }
1247
1248         if (link_status) {
1249                 ifp->if_baudrate = IF_Mbps(speed);
1250                 if_link_state_change(ifp, LINK_STATE_UP);
1251         } else
1252                 if_link_state_change(ifp, LINK_STATE_DOWN);
1253 }
1254
1255 /**
1256  *      t3_os_phymod_changed - handle PHY module changes
1257  *      @phy: the PHY reporting the module change
1258  *      @mod_type: new module type
1259  *
1260  *      This is the OS-dependent handler for PHY module changes.  It is
1261  *      invoked when a PHY module is removed or inserted for any OS-specific
1262  *      processing.
1263  */
1264 void t3_os_phymod_changed(struct adapter *adap, int port_id)
1265 {
1266         static const char *mod_str[] = {
1267                 NULL, "SR", "LR", "LRM", "TWINAX", "TWINAX-L", "unknown"
1268         };
1269         struct port_info *pi = &adap->port[port_id];
1270         int mod = pi->phy.modtype;
1271
1272         if (mod != pi->media.ifm_cur->ifm_data)
1273                 cxgb_build_medialist(pi);
1274
1275         if (mod == phy_modtype_none)
1276                 if_printf(pi->ifp, "PHY module unplugged\n");
1277         else {
1278                 KASSERT(mod < ARRAY_SIZE(mod_str),
1279                         ("invalid PHY module type %d", mod));
1280                 if_printf(pi->ifp, "%s PHY module inserted\n", mod_str[mod]);
1281         }
1282 }
1283
1284 void
1285 t3_os_set_hw_addr(adapter_t *adapter, int port_idx, u8 hw_addr[])
1286 {
1287
1288         /*
1289          * The ifnet might not be allocated before this gets called,
1290          * as this is called early on in attach by t3_prep_adapter
1291          * save the address off in the port structure
1292          */
1293         if (cxgb_debug)
1294                 printf("set_hw_addr on idx %d addr %6D\n", port_idx, hw_addr, ":");
1295         bcopy(hw_addr, adapter->port[port_idx].hw_addr, ETHER_ADDR_LEN);
1296 }
1297
1298 /*
1299  * Programs the XGMAC based on the settings in the ifnet.  These settings
1300  * include MTU, MAC address, mcast addresses, etc.
1301  */
1302 static void
1303 cxgb_update_mac_settings(struct port_info *p)
1304 {
1305         struct ifnet *ifp = p->ifp;
1306         struct t3_rx_mode rm;
1307         struct cmac *mac = &p->mac;
1308         int mtu, hwtagging;
1309
1310         PORT_LOCK_ASSERT_OWNED(p);
1311
1312         bcopy(IF_LLADDR(ifp), p->hw_addr, ETHER_ADDR_LEN);
1313
1314         mtu = ifp->if_mtu;
1315         if (ifp->if_capenable & IFCAP_VLAN_MTU)
1316                 mtu += ETHER_VLAN_ENCAP_LEN;
1317
1318         hwtagging = (ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0;
1319
1320         t3_mac_set_mtu(mac, mtu);
1321         t3_set_vlan_accel(p->adapter, 1 << p->tx_chan, hwtagging);
1322         t3_mac_set_address(mac, 0, p->hw_addr);
1323         t3_init_rx_mode(&rm, p);
1324         t3_mac_set_rx_mode(mac, &rm);
1325 }
1326
1327
1328 static int
1329 await_mgmt_replies(struct adapter *adap, unsigned long init_cnt,
1330                               unsigned long n)
1331 {
1332         int attempts = 5;
1333
1334         while (adap->sge.qs[0].rspq.offload_pkts < init_cnt + n) {
1335                 if (!--attempts)
1336                         return (ETIMEDOUT);
1337                 t3_os_sleep(10);
1338         }
1339         return 0;
1340 }
1341
1342 static int
1343 init_tp_parity(struct adapter *adap)
1344 {
1345         int i;
1346         struct mbuf *m;
1347         struct cpl_set_tcb_field *greq;
1348         unsigned long cnt = adap->sge.qs[0].rspq.offload_pkts;
1349
1350         t3_tp_set_offload_mode(adap, 1);
1351
1352         for (i = 0; i < 16; i++) {
1353                 struct cpl_smt_write_req *req;
1354
1355                 m = m_gethdr(M_WAITOK, MT_DATA);
1356                 req = mtod(m, struct cpl_smt_write_req *);
1357                 m->m_len = m->m_pkthdr.len = sizeof(*req);
1358                 memset(req, 0, sizeof(*req));
1359                 req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1360                 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SMT_WRITE_REQ, i));
1361                 req->iff = i;
1362                 t3_mgmt_tx(adap, m);
1363         }
1364
1365         for (i = 0; i < 2048; i++) {
1366                 struct cpl_l2t_write_req *req;
1367
1368                 m = m_gethdr(M_WAITOK, MT_DATA);
1369                 req = mtod(m, struct cpl_l2t_write_req *);
1370                 m->m_len = m->m_pkthdr.len = sizeof(*req);
1371                 memset(req, 0, sizeof(*req));
1372                 req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1373                 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_L2T_WRITE_REQ, i));
1374                 req->params = htonl(V_L2T_W_IDX(i));
1375                 t3_mgmt_tx(adap, m);
1376         }
1377
1378         for (i = 0; i < 2048; i++) {
1379                 struct cpl_rte_write_req *req;
1380
1381                 m = m_gethdr(M_WAITOK, MT_DATA);
1382                 req = mtod(m, struct cpl_rte_write_req *);
1383                 m->m_len = m->m_pkthdr.len = sizeof(*req);
1384                 memset(req, 0, sizeof(*req));
1385                 req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1386                 OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_RTE_WRITE_REQ, i));
1387                 req->l2t_idx = htonl(V_L2T_W_IDX(i));
1388                 t3_mgmt_tx(adap, m);
1389         }
1390
1391         m = m_gethdr(M_WAITOK, MT_DATA);
1392         greq = mtod(m, struct cpl_set_tcb_field *);
1393         m->m_len = m->m_pkthdr.len = sizeof(*greq);
1394         memset(greq, 0, sizeof(*greq));
1395         greq->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
1396         OPCODE_TID(greq) = htonl(MK_OPCODE_TID(CPL_SET_TCB_FIELD, 0));
1397         greq->mask = htobe64(1);
1398         t3_mgmt_tx(adap, m);
1399
1400         i = await_mgmt_replies(adap, cnt, 16 + 2048 + 2048 + 1);
1401         t3_tp_set_offload_mode(adap, 0);
1402         return (i);
1403 }
1404
1405 /**
1406  *      setup_rss - configure Receive Side Steering (per-queue connection demux) 
1407  *      @adap: the adapter
1408  *
1409  *      Sets up RSS to distribute packets to multiple receive queues.  We
1410  *      configure the RSS CPU lookup table to distribute to the number of HW
1411  *      receive queues, and the response queue lookup table to narrow that
1412  *      down to the response queues actually configured for each port.
1413  *      We always configure the RSS mapping for two ports since the mapping
1414  *      table has plenty of entries.
1415  */
1416 static void
1417 setup_rss(adapter_t *adap)
1418 {
1419         int i;
1420         u_int nq[2]; 
1421         uint8_t cpus[SGE_QSETS + 1];
1422         uint16_t rspq_map[RSS_TABLE_SIZE];
1423         
1424         for (i = 0; i < SGE_QSETS; ++i)
1425                 cpus[i] = i;
1426         cpus[SGE_QSETS] = 0xff;
1427
1428         nq[0] = nq[1] = 0;
1429         for_each_port(adap, i) {
1430                 const struct port_info *pi = adap2pinfo(adap, i);
1431
1432                 nq[pi->tx_chan] += pi->nqsets;
1433         }
1434         for (i = 0; i < RSS_TABLE_SIZE / 2; ++i) {
1435                 rspq_map[i] = nq[0] ? i % nq[0] : 0;
1436                 rspq_map[i + RSS_TABLE_SIZE / 2] = nq[1] ? i % nq[1] + nq[0] : 0;
1437         }
1438
1439         /* Calculate the reverse RSS map table */
1440         for (i = 0; i < SGE_QSETS; ++i)
1441                 adap->rrss_map[i] = 0xff;
1442         for (i = 0; i < RSS_TABLE_SIZE; ++i)
1443                 if (adap->rrss_map[rspq_map[i]] == 0xff)
1444                         adap->rrss_map[rspq_map[i]] = i;
1445
1446         t3_config_rss(adap, F_RQFEEDBACKENABLE | F_TNLLKPEN | F_TNLMAPEN |
1447                       F_TNLPRTEN | F_TNL2TUPEN | F_TNL4TUPEN | F_OFDMAPEN |
1448                       F_RRCPLMAPEN | V_RRCPLCPUSIZE(6) | F_HASHTOEPLITZ,
1449                       cpus, rspq_map);
1450
1451 }
1452 static void
1453 send_pktsched_cmd(struct adapter *adap, int sched, int qidx, int lo,
1454                               int hi, int port)
1455 {
1456         struct mbuf *m;
1457         struct mngt_pktsched_wr *req;
1458
1459         m = m_gethdr(M_NOWAIT, MT_DATA);
1460         if (m) {        
1461                 req = mtod(m, struct mngt_pktsched_wr *);
1462                 req->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_MNGT));
1463                 req->mngt_opcode = FW_MNGTOPCODE_PKTSCHED_SET;
1464                 req->sched = sched;
1465                 req->idx = qidx;
1466                 req->min = lo;
1467                 req->max = hi;
1468                 req->binding = port;
1469                 m->m_len = m->m_pkthdr.len = sizeof(*req);
1470                 t3_mgmt_tx(adap, m);
1471         }
1472 }
1473
1474 static void
1475 bind_qsets(adapter_t *sc)
1476 {
1477         int i, j;
1478
1479         for (i = 0; i < (sc)->params.nports; ++i) {
1480                 const struct port_info *pi = adap2pinfo(sc, i);
1481
1482                 for (j = 0; j < pi->nqsets; ++j) {
1483                         send_pktsched_cmd(sc, 1, pi->first_qset + j, -1,
1484                                           -1, pi->tx_chan);
1485
1486                 }
1487         }
1488 }
1489
1490 static void
1491 update_tpeeprom(struct adapter *adap)
1492 {
1493         const struct firmware *tpeeprom;
1494
1495         uint32_t version;
1496         unsigned int major, minor;
1497         int ret, len;
1498         char rev, name[32];
1499
1500         t3_seeprom_read(adap, TP_SRAM_OFFSET, &version);
1501
1502         major = G_TP_VERSION_MAJOR(version);
1503         minor = G_TP_VERSION_MINOR(version);
1504         if (major == TP_VERSION_MAJOR  && minor == TP_VERSION_MINOR)
1505                 return; 
1506
1507         rev = t3rev2char(adap);
1508         snprintf(name, sizeof(name), TPEEPROM_NAME, rev);
1509
1510         tpeeprom = firmware_get(name);
1511         if (tpeeprom == NULL) {
1512                 device_printf(adap->dev,
1513                               "could not load TP EEPROM: unable to load %s\n",
1514                               name);
1515                 return;
1516         }
1517
1518         len = tpeeprom->datasize - 4;
1519         
1520         ret = t3_check_tpsram(adap, tpeeprom->data, tpeeprom->datasize);
1521         if (ret)
1522                 goto release_tpeeprom;
1523
1524         if (len != TP_SRAM_LEN) {
1525                 device_printf(adap->dev,
1526                               "%s length is wrong len=%d expected=%d\n", name,
1527                               len, TP_SRAM_LEN);
1528                 return;
1529         }
1530         
1531         ret = set_eeprom(&adap->port[0], tpeeprom->data, tpeeprom->datasize,
1532             TP_SRAM_OFFSET);
1533         
1534         if (!ret) {
1535                 device_printf(adap->dev,
1536                         "Protocol SRAM image updated in EEPROM to %d.%d.%d\n",
1537                          TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO);
1538         } else 
1539                 device_printf(adap->dev,
1540                               "Protocol SRAM image update in EEPROM failed\n");
1541
1542 release_tpeeprom:
1543         firmware_put(tpeeprom, FIRMWARE_UNLOAD);
1544         
1545         return;
1546 }
1547
1548 static int
1549 update_tpsram(struct adapter *adap)
1550 {
1551         const struct firmware *tpsram;
1552         int ret;
1553         char rev, name[32];
1554
1555         rev = t3rev2char(adap);
1556         snprintf(name, sizeof(name), TPSRAM_NAME, rev);
1557
1558         update_tpeeprom(adap);
1559
1560         tpsram = firmware_get(name);
1561         if (tpsram == NULL){
1562                 device_printf(adap->dev, "could not load TP SRAM\n");
1563                 return (EINVAL);
1564         } else
1565                 device_printf(adap->dev, "updating TP SRAM\n");
1566         
1567         ret = t3_check_tpsram(adap, tpsram->data, tpsram->datasize);
1568         if (ret)
1569                 goto release_tpsram;    
1570
1571         ret = t3_set_proto_sram(adap, tpsram->data);
1572         if (ret)
1573                 device_printf(adap->dev, "loading protocol SRAM failed\n");
1574
1575 release_tpsram:
1576         firmware_put(tpsram, FIRMWARE_UNLOAD);
1577         
1578         return ret;
1579 }
1580
1581 /**
1582  *      cxgb_up - enable the adapter
1583  *      @adap: adapter being enabled
1584  *
1585  *      Called when the first port is enabled, this function performs the
1586  *      actions necessary to make an adapter operational, such as completing
1587  *      the initialization of HW modules, and enabling interrupts.
1588  */
1589 static int
1590 cxgb_up(struct adapter *sc)
1591 {
1592         int err = 0;
1593         unsigned int mxf = t3_mc5_size(&sc->mc5) - MC5_MIN_TIDS;
1594
1595         KASSERT(sc->open_device_map == 0, ("%s: device(s) already open (%x)",
1596                                            __func__, sc->open_device_map));
1597
1598         if ((sc->flags & FULL_INIT_DONE) == 0) {
1599
1600                 ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
1601
1602                 if ((sc->flags & FW_UPTODATE) == 0)
1603                         if ((err = upgrade_fw(sc)))
1604                                 goto out;
1605
1606                 if ((sc->flags & TPS_UPTODATE) == 0)
1607                         if ((err = update_tpsram(sc)))
1608                                 goto out;
1609
1610                 if (is_offload(sc) && nfilters != 0) {
1611                         sc->params.mc5.nservers = 0;
1612
1613                         if (nfilters < 0)
1614                                 sc->params.mc5.nfilters = mxf;
1615                         else
1616                                 sc->params.mc5.nfilters = min(nfilters, mxf);
1617                 }
1618
1619                 err = t3_init_hw(sc, 0);
1620                 if (err)
1621                         goto out;
1622
1623                 t3_set_reg_field(sc, A_TP_PARA_REG5, 0, F_RXDDPOFFINIT);
1624                 t3_write_reg(sc, A_ULPRX_TDDP_PSZ, V_HPZ0(PAGE_SHIFT - 12));
1625
1626                 err = setup_sge_qsets(sc);
1627                 if (err)
1628                         goto out;
1629
1630                 alloc_filters(sc);
1631                 setup_rss(sc);
1632
1633                 t3_add_configured_sysctls(sc);
1634                 sc->flags |= FULL_INIT_DONE;
1635         }
1636
1637         t3_intr_clear(sc);
1638         t3_sge_start(sc);
1639         t3_intr_enable(sc);
1640
1641         if (sc->params.rev >= T3_REV_C && !(sc->flags & TP_PARITY_INIT) &&
1642             is_offload(sc) && init_tp_parity(sc) == 0)
1643                 sc->flags |= TP_PARITY_INIT;
1644
1645         if (sc->flags & TP_PARITY_INIT) {
1646                 t3_write_reg(sc, A_TP_INT_CAUSE, F_CMCACHEPERR | F_ARPLUTPERR);
1647                 t3_write_reg(sc, A_TP_INT_ENABLE, 0x7fbfffff);
1648         }
1649         
1650         if (!(sc->flags & QUEUES_BOUND)) {
1651                 bind_qsets(sc);
1652                 setup_hw_filters(sc);
1653                 sc->flags |= QUEUES_BOUND;              
1654         }
1655
1656         t3_sge_reset_adapter(sc);
1657 out:
1658         return (err);
1659 }
1660
1661 /*
1662  * Called when the last open device is closed.  Does NOT undo all of cxgb_up's
1663  * work.  Specifically, the resources grabbed under FULL_INIT_DONE are released
1664  * during controller_detach, not here.
1665  */
1666 static void
1667 cxgb_down(struct adapter *sc)
1668 {
1669         t3_sge_stop(sc);
1670         t3_intr_disable(sc);
1671 }
1672
1673 /*
1674  * if_init for cxgb ports.
1675  */
1676 static void
1677 cxgb_init(void *arg)
1678 {
1679         struct port_info *p = arg;
1680         struct adapter *sc = p->adapter;
1681
1682         ADAPTER_LOCK(sc);
1683         cxgb_init_locked(p); /* releases adapter lock */
1684         ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
1685 }
1686
1687 static int
1688 cxgb_init_locked(struct port_info *p)
1689 {
1690         struct adapter *sc = p->adapter;
1691         struct ifnet *ifp = p->ifp;
1692         struct cmac *mac = &p->mac;
1693         int i, rc = 0, may_sleep = 0, gave_up_lock = 0;
1694
1695         ADAPTER_LOCK_ASSERT_OWNED(sc);
1696
1697         while (!IS_DOOMED(p) && IS_BUSY(sc)) {
1698                 gave_up_lock = 1;
1699                 if (mtx_sleep(&sc->flags, &sc->lock, PCATCH, "cxgbinit", 0)) {
1700                         rc = EINTR;
1701                         goto done;
1702                 }
1703         }
1704         if (IS_DOOMED(p)) {
1705                 rc = ENXIO;
1706                 goto done;
1707         }
1708         KASSERT(!IS_BUSY(sc), ("%s: controller busy.", __func__));
1709
1710         /*
1711          * The code that runs during one-time adapter initialization can sleep
1712          * so it's important not to hold any locks across it.
1713          */
1714         may_sleep = sc->flags & FULL_INIT_DONE ? 0 : 1;
1715
1716         if (may_sleep) {
1717                 SET_BUSY(sc);
1718                 gave_up_lock = 1;
1719                 ADAPTER_UNLOCK(sc);
1720         }
1721
1722         if (sc->open_device_map == 0 && ((rc = cxgb_up(sc)) != 0))
1723                         goto done;
1724
1725         PORT_LOCK(p);
1726         if (isset(&sc->open_device_map, p->port_id) &&
1727             (ifp->if_drv_flags & IFF_DRV_RUNNING)) {
1728                 PORT_UNLOCK(p);
1729                 goto done;
1730         }
1731         t3_port_intr_enable(sc, p->port_id);
1732         if (!mac->multiport) 
1733                 t3_mac_init(mac);
1734         cxgb_update_mac_settings(p);
1735         t3_link_start(&p->phy, mac, &p->link_config);
1736         t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
1737         ifp->if_drv_flags |= IFF_DRV_RUNNING;
1738         ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
1739         PORT_UNLOCK(p);
1740
1741         for (i = p->first_qset; i < p->first_qset + p->nqsets; i++) {
1742                 struct sge_qset *qs = &sc->sge.qs[i];
1743                 struct sge_txq *txq = &qs->txq[TXQ_ETH];
1744
1745                 callout_reset_on(&txq->txq_watchdog, hz, cxgb_tx_watchdog, qs,
1746                                  txq->txq_watchdog.c_cpu);
1747         }
1748
1749         /* all ok */
1750         setbit(&sc->open_device_map, p->port_id);
1751         callout_reset(&p->link_check_ch,
1752             p->phy.caps & SUPPORTED_LINK_IRQ ?  hz * 3 : hz / 4,
1753             link_check_callout, p);
1754
1755 done:
1756         if (may_sleep) {
1757                 ADAPTER_LOCK(sc);
1758                 KASSERT(IS_BUSY(sc), ("%s: controller not busy.", __func__));
1759                 CLR_BUSY(sc);
1760         }
1761         if (gave_up_lock)
1762                 wakeup_one(&sc->flags);
1763         ADAPTER_UNLOCK(sc);
1764         return (rc);
1765 }
1766
1767 static int
1768 cxgb_uninit_locked(struct port_info *p)
1769 {
1770         struct adapter *sc = p->adapter;
1771         int rc;
1772
1773         ADAPTER_LOCK_ASSERT_OWNED(sc);
1774
1775         while (!IS_DOOMED(p) && IS_BUSY(sc)) {
1776                 if (mtx_sleep(&sc->flags, &sc->lock, PCATCH, "cxgbunin", 0)) {
1777                         rc = EINTR;
1778                         goto done;
1779                 }
1780         }
1781         if (IS_DOOMED(p)) {
1782                 rc = ENXIO;
1783                 goto done;
1784         }
1785         KASSERT(!IS_BUSY(sc), ("%s: controller busy.", __func__));
1786         SET_BUSY(sc);
1787         ADAPTER_UNLOCK(sc);
1788
1789         rc = cxgb_uninit_synchronized(p);
1790
1791         ADAPTER_LOCK(sc);
1792         KASSERT(IS_BUSY(sc), ("%s: controller not busy.", __func__));
1793         CLR_BUSY(sc);
1794         wakeup_one(&sc->flags);
1795 done:
1796         ADAPTER_UNLOCK(sc);
1797         return (rc);
1798 }
1799
1800 /*
1801  * Called on "ifconfig down", and from port_detach
1802  */
1803 static int
1804 cxgb_uninit_synchronized(struct port_info *pi)
1805 {
1806         struct adapter *sc = pi->adapter;
1807         struct ifnet *ifp = pi->ifp;
1808
1809         /*
1810          * taskqueue_drain may cause a deadlock if the adapter lock is held.
1811          */
1812         ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
1813
1814         /*
1815          * Clear this port's bit from the open device map, and then drain all
1816          * the tasks that can access/manipulate this port's port_info or ifp.
1817          * We disable this port's interrupts here and so the slow/ext
1818          * interrupt tasks won't be enqueued.  The tick task will continue to
1819          * be enqueued every second but the runs after this drain will not see
1820          * this port in the open device map.
1821          *
1822          * A well behaved task must take open_device_map into account and ignore
1823          * ports that are not open.
1824          */
1825         clrbit(&sc->open_device_map, pi->port_id);
1826         t3_port_intr_disable(sc, pi->port_id);
1827         taskqueue_drain(sc->tq, &sc->slow_intr_task);
1828         taskqueue_drain(sc->tq, &sc->tick_task);
1829
1830         callout_drain(&pi->link_check_ch);
1831         taskqueue_drain(sc->tq, &pi->link_check_task);
1832
1833         PORT_LOCK(pi);
1834         ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
1835
1836         /* disable pause frames */
1837         t3_set_reg_field(sc, A_XGM_TX_CFG + pi->mac.offset, F_TXPAUSEEN, 0);
1838
1839         /* Reset RX FIFO HWM */
1840         t3_set_reg_field(sc, A_XGM_RXFIFO_CFG +  pi->mac.offset,
1841                          V_RXFIFOPAUSEHWM(M_RXFIFOPAUSEHWM), 0);
1842
1843         DELAY(100 * 1000);
1844
1845         /* Wait for TXFIFO empty */
1846         t3_wait_op_done(sc, A_XGM_TXFIFO_CFG + pi->mac.offset,
1847                         F_TXFIFO_EMPTY, 1, 20, 5);
1848
1849         DELAY(100 * 1000);
1850         t3_mac_disable(&pi->mac, MAC_DIRECTION_RX);
1851
1852         pi->phy.ops->power_down(&pi->phy, 1);
1853
1854         PORT_UNLOCK(pi);
1855
1856         pi->link_config.link_ok = 0;
1857         t3_os_link_changed(sc, pi->port_id, 0, 0, 0, 0, 0);
1858
1859         if (sc->open_device_map == 0)
1860                 cxgb_down(pi->adapter);
1861
1862         return (0);
1863 }
1864
1865 /*
1866  * Mark lro enabled or disabled in all qsets for this port
1867  */
1868 static int
1869 cxgb_set_lro(struct port_info *p, int enabled)
1870 {
1871         int i;
1872         struct adapter *adp = p->adapter;
1873         struct sge_qset *q;
1874
1875         for (i = 0; i < p->nqsets; i++) {
1876                 q = &adp->sge.qs[p->first_qset + i];
1877                 q->lro.enabled = (enabled != 0);
1878         }
1879         return (0);
1880 }
1881
1882 static int
1883 cxgb_ioctl(struct ifnet *ifp, unsigned long command, caddr_t data)
1884 {
1885         struct port_info *p = ifp->if_softc;
1886         struct adapter *sc = p->adapter;
1887         struct ifreq *ifr = (struct ifreq *)data;
1888         int flags, error = 0, mtu;
1889         uint32_t mask;
1890
1891         switch (command) {
1892         case SIOCSIFMTU:
1893                 ADAPTER_LOCK(sc);
1894                 error = IS_DOOMED(p) ? ENXIO : (IS_BUSY(sc) ? EBUSY : 0);
1895                 if (error) {
1896 fail:
1897                         ADAPTER_UNLOCK(sc);
1898                         return (error);
1899                 }
1900
1901                 mtu = ifr->ifr_mtu;
1902                 if ((mtu < ETHERMIN) || (mtu > ETHERMTU_JUMBO)) {
1903                         error = EINVAL;
1904                 } else {
1905                         ifp->if_mtu = mtu;
1906                         PORT_LOCK(p);
1907                         cxgb_update_mac_settings(p);
1908                         PORT_UNLOCK(p);
1909                 }
1910                 ADAPTER_UNLOCK(sc);
1911                 break;
1912         case SIOCSIFFLAGS:
1913                 ADAPTER_LOCK(sc);
1914                 if (IS_DOOMED(p)) {
1915                         error = ENXIO;
1916                         goto fail;
1917                 }
1918                 if (ifp->if_flags & IFF_UP) {
1919                         if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1920                                 flags = p->if_flags;
1921                                 if (((ifp->if_flags ^ flags) & IFF_PROMISC) ||
1922                                     ((ifp->if_flags ^ flags) & IFF_ALLMULTI)) {
1923                                         if (IS_BUSY(sc)) {
1924                                                 error = EBUSY;
1925                                                 goto fail;
1926                                         }
1927                                         PORT_LOCK(p);
1928                                         cxgb_update_mac_settings(p);
1929                                         PORT_UNLOCK(p);
1930                                 }
1931                                 ADAPTER_UNLOCK(sc);
1932                         } else
1933                                 error = cxgb_init_locked(p);
1934                         p->if_flags = ifp->if_flags;
1935                 } else if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1936                         error = cxgb_uninit_locked(p);
1937                 else
1938                         ADAPTER_UNLOCK(sc);
1939
1940                 ADAPTER_LOCK_ASSERT_NOTOWNED(sc);
1941                 break;
1942         case SIOCADDMULTI:
1943         case SIOCDELMULTI:
1944                 ADAPTER_LOCK(sc);
1945                 error = IS_DOOMED(p) ? ENXIO : (IS_BUSY(sc) ? EBUSY : 0);
1946                 if (error)
1947                         goto fail;
1948
1949                 if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1950                         PORT_LOCK(p);
1951                         cxgb_update_mac_settings(p);
1952                         PORT_UNLOCK(p);
1953                 }
1954                 ADAPTER_UNLOCK(sc);
1955
1956                 break;
1957         case SIOCSIFCAP:
1958                 ADAPTER_LOCK(sc);
1959                 error = IS_DOOMED(p) ? ENXIO : (IS_BUSY(sc) ? EBUSY : 0);
1960                 if (error)
1961                         goto fail;
1962
1963                 mask = ifr->ifr_reqcap ^ ifp->if_capenable;
1964                 if (mask & IFCAP_TXCSUM) {
1965                         ifp->if_capenable ^= IFCAP_TXCSUM;
1966                         ifp->if_hwassist ^= (CSUM_TCP | CSUM_UDP | CSUM_IP);
1967
1968                         if (IFCAP_TSO4 & ifp->if_capenable &&
1969                             !(IFCAP_TXCSUM & ifp->if_capenable)) {
1970                                 mask &= ~IFCAP_TSO4;
1971                                 ifp->if_capenable &= ~IFCAP_TSO4;
1972                                 if_printf(ifp,
1973                                     "tso4 disabled due to -txcsum.\n");
1974                         }
1975                 }
1976                 if (mask & IFCAP_TXCSUM_IPV6) {
1977                         ifp->if_capenable ^= IFCAP_TXCSUM_IPV6;
1978                         ifp->if_hwassist ^= (CSUM_UDP_IPV6 | CSUM_TCP_IPV6);
1979
1980                         if (IFCAP_TSO6 & ifp->if_capenable &&
1981                             !(IFCAP_TXCSUM_IPV6 & ifp->if_capenable)) {
1982                                 mask &= ~IFCAP_TSO6;
1983                                 ifp->if_capenable &= ~IFCAP_TSO6;
1984                                 if_printf(ifp,
1985                                     "tso6 disabled due to -txcsum6.\n");
1986                         }
1987                 }
1988                 if (mask & IFCAP_RXCSUM)
1989                         ifp->if_capenable ^= IFCAP_RXCSUM;
1990                 if (mask & IFCAP_RXCSUM_IPV6)
1991                         ifp->if_capenable ^= IFCAP_RXCSUM_IPV6;
1992
1993                 /*
1994                  * Note that we leave CSUM_TSO alone (it is always set).  The
1995                  * kernel takes both IFCAP_TSOx and CSUM_TSO into account before
1996                  * sending a TSO request our way, so it's sufficient to toggle
1997                  * IFCAP_TSOx only.
1998                  */
1999                 if (mask & IFCAP_TSO4) {
2000                         if (!(IFCAP_TSO4 & ifp->if_capenable) &&
2001                             !(IFCAP_TXCSUM & ifp->if_capenable)) {
2002                                 if_printf(ifp, "enable txcsum first.\n");
2003                                 error = EAGAIN;
2004                                 goto fail;
2005                         }
2006                         ifp->if_capenable ^= IFCAP_TSO4;
2007                 }
2008                 if (mask & IFCAP_TSO6) {
2009                         if (!(IFCAP_TSO6 & ifp->if_capenable) &&
2010                             !(IFCAP_TXCSUM_IPV6 & ifp->if_capenable)) {
2011                                 if_printf(ifp, "enable txcsum6 first.\n");
2012                                 error = EAGAIN;
2013                                 goto fail;
2014                         }
2015                         ifp->if_capenable ^= IFCAP_TSO6;
2016                 }
2017                 if (mask & IFCAP_LRO) {
2018                         ifp->if_capenable ^= IFCAP_LRO;
2019
2020                         /* Safe to do this even if cxgb_up not called yet */
2021                         cxgb_set_lro(p, ifp->if_capenable & IFCAP_LRO);
2022                 }
2023 #ifdef TCP_OFFLOAD
2024                 if (mask & IFCAP_TOE4) {
2025                         int enable = (ifp->if_capenable ^ mask) & IFCAP_TOE4;
2026
2027                         error = toe_capability(p, enable);
2028                         if (error == 0)
2029                                 ifp->if_capenable ^= mask;
2030                 }
2031 #endif
2032                 if (mask & IFCAP_VLAN_HWTAGGING) {
2033                         ifp->if_capenable ^= IFCAP_VLAN_HWTAGGING;
2034                         if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
2035                                 PORT_LOCK(p);
2036                                 cxgb_update_mac_settings(p);
2037                                 PORT_UNLOCK(p);
2038                         }
2039                 }
2040                 if (mask & IFCAP_VLAN_MTU) {
2041                         ifp->if_capenable ^= IFCAP_VLAN_MTU;
2042                         if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
2043                                 PORT_LOCK(p);
2044                                 cxgb_update_mac_settings(p);
2045                                 PORT_UNLOCK(p);
2046                         }
2047                 }
2048                 if (mask & IFCAP_VLAN_HWTSO)
2049                         ifp->if_capenable ^= IFCAP_VLAN_HWTSO;
2050                 if (mask & IFCAP_VLAN_HWCSUM)
2051                         ifp->if_capenable ^= IFCAP_VLAN_HWCSUM;
2052
2053 #ifdef VLAN_CAPABILITIES
2054                 VLAN_CAPABILITIES(ifp);
2055 #endif
2056                 ADAPTER_UNLOCK(sc);
2057                 break;
2058         case SIOCSIFMEDIA:
2059         case SIOCGIFMEDIA:
2060                 error = ifmedia_ioctl(ifp, ifr, &p->media, command);
2061                 break;
2062         default:
2063                 error = ether_ioctl(ifp, command, data);
2064         }
2065
2066         return (error);
2067 }
2068
2069 static int
2070 cxgb_media_change(struct ifnet *ifp)
2071 {
2072         return (EOPNOTSUPP);
2073 }
2074
2075 /*
2076  * Translates phy->modtype to the correct Ethernet media subtype.
2077  */
2078 static int
2079 cxgb_ifm_type(int mod)
2080 {
2081         switch (mod) {
2082         case phy_modtype_sr:
2083                 return (IFM_10G_SR);
2084         case phy_modtype_lr:
2085                 return (IFM_10G_LR);
2086         case phy_modtype_lrm:
2087                 return (IFM_10G_LRM);
2088         case phy_modtype_twinax:
2089                 return (IFM_10G_TWINAX);
2090         case phy_modtype_twinax_long:
2091                 return (IFM_10G_TWINAX_LONG);
2092         case phy_modtype_none:
2093                 return (IFM_NONE);
2094         case phy_modtype_unknown:
2095                 return (IFM_UNKNOWN);
2096         }
2097
2098         KASSERT(0, ("%s: modtype %d unknown", __func__, mod));
2099         return (IFM_UNKNOWN);
2100 }
2101
2102 /*
2103  * Rebuilds the ifmedia list for this port, and sets the current media.
2104  */
2105 static void
2106 cxgb_build_medialist(struct port_info *p)
2107 {
2108         struct cphy *phy = &p->phy;
2109         struct ifmedia *media = &p->media;
2110         int mod = phy->modtype;
2111         int m = IFM_ETHER | IFM_FDX;
2112
2113         PORT_LOCK(p);
2114
2115         ifmedia_removeall(media);
2116         if (phy->caps & SUPPORTED_TP && phy->caps & SUPPORTED_Autoneg) {
2117                 /* Copper (RJ45) */
2118
2119                 if (phy->caps & SUPPORTED_10000baseT_Full)
2120                         ifmedia_add(media, m | IFM_10G_T, mod, NULL);
2121
2122                 if (phy->caps & SUPPORTED_1000baseT_Full)
2123                         ifmedia_add(media, m | IFM_1000_T, mod, NULL);
2124
2125                 if (phy->caps & SUPPORTED_100baseT_Full)
2126                         ifmedia_add(media, m | IFM_100_TX, mod, NULL);
2127
2128                 if (phy->caps & SUPPORTED_10baseT_Full)
2129                         ifmedia_add(media, m | IFM_10_T, mod, NULL);
2130
2131                 ifmedia_add(media, IFM_ETHER | IFM_AUTO, mod, NULL);
2132                 ifmedia_set(media, IFM_ETHER | IFM_AUTO);
2133
2134         } else if (phy->caps & SUPPORTED_TP) {
2135                 /* Copper (CX4) */
2136
2137                 KASSERT(phy->caps & SUPPORTED_10000baseT_Full,
2138                         ("%s: unexpected cap 0x%x", __func__, phy->caps));
2139
2140                 ifmedia_add(media, m | IFM_10G_CX4, mod, NULL);
2141                 ifmedia_set(media, m | IFM_10G_CX4);
2142
2143         } else if (phy->caps & SUPPORTED_FIBRE &&
2144                    phy->caps & SUPPORTED_10000baseT_Full) {
2145                 /* 10G optical (but includes SFP+ twinax) */
2146
2147                 m |= cxgb_ifm_type(mod);
2148                 if (IFM_SUBTYPE(m) == IFM_NONE)
2149                         m &= ~IFM_FDX;
2150
2151                 ifmedia_add(media, m, mod, NULL);
2152                 ifmedia_set(media, m);
2153
2154         } else if (phy->caps & SUPPORTED_FIBRE &&
2155                    phy->caps & SUPPORTED_1000baseT_Full) {
2156                 /* 1G optical */
2157
2158                 /* XXX: Lie and claim to be SX, could actually be any 1G-X */
2159                 ifmedia_add(media, m | IFM_1000_SX, mod, NULL);
2160                 ifmedia_set(media, m | IFM_1000_SX);
2161
2162         } else {
2163                 KASSERT(0, ("%s: don't know how to handle 0x%x.", __func__,
2164                             phy->caps));
2165         }
2166
2167         PORT_UNLOCK(p);
2168 }
2169
2170 static void
2171 cxgb_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
2172 {
2173         struct port_info *p = ifp->if_softc;
2174         struct ifmedia_entry *cur = p->media.ifm_cur;
2175         int speed = p->link_config.speed;
2176
2177         if (cur->ifm_data != p->phy.modtype) {
2178                 cxgb_build_medialist(p);
2179                 cur = p->media.ifm_cur;
2180         }
2181
2182         ifmr->ifm_status = IFM_AVALID;
2183         if (!p->link_config.link_ok)
2184                 return;
2185
2186         ifmr->ifm_status |= IFM_ACTIVE;
2187
2188         /*
2189          * active and current will differ iff current media is autoselect.  That
2190          * can happen only for copper RJ45.
2191          */
2192         if (IFM_SUBTYPE(cur->ifm_media) != IFM_AUTO)
2193                 return;
2194         KASSERT(p->phy.caps & SUPPORTED_TP && p->phy.caps & SUPPORTED_Autoneg,
2195                 ("%s: unexpected PHY caps 0x%x", __func__, p->phy.caps));
2196
2197         ifmr->ifm_active = IFM_ETHER | IFM_FDX;
2198         if (speed == SPEED_10000)
2199                 ifmr->ifm_active |= IFM_10G_T;
2200         else if (speed == SPEED_1000)
2201                 ifmr->ifm_active |= IFM_1000_T;
2202         else if (speed == SPEED_100)
2203                 ifmr->ifm_active |= IFM_100_TX;
2204         else if (speed == SPEED_10)
2205                 ifmr->ifm_active |= IFM_10_T;
2206         else
2207                 KASSERT(0, ("%s: link up but speed unknown (%u)", __func__,
2208                             speed));
2209 }
2210
2211 static uint64_t
2212 cxgb_get_counter(struct ifnet *ifp, ift_counter c)
2213 {
2214         struct port_info *pi = ifp->if_softc;
2215         struct adapter *sc = pi->adapter;
2216         struct cmac *mac = &pi->mac;
2217         struct mac_stats *mstats = &mac->stats;
2218
2219         cxgb_refresh_stats(pi);
2220
2221         switch (c) {
2222         case IFCOUNTER_IPACKETS:
2223                 return (mstats->rx_frames);
2224
2225         case IFCOUNTER_IERRORS:
2226                 return (mstats->rx_jabber + mstats->rx_data_errs +
2227                     mstats->rx_sequence_errs + mstats->rx_runt +
2228                     mstats->rx_too_long + mstats->rx_mac_internal_errs +
2229                     mstats->rx_short + mstats->rx_fcs_errs);
2230
2231         case IFCOUNTER_OPACKETS:
2232                 return (mstats->tx_frames);
2233
2234         case IFCOUNTER_OERRORS:
2235                 return (mstats->tx_excess_collisions + mstats->tx_underrun +
2236                     mstats->tx_len_errs + mstats->tx_mac_internal_errs +
2237                     mstats->tx_excess_deferral + mstats->tx_fcs_errs);
2238
2239         case IFCOUNTER_COLLISIONS:
2240                 return (mstats->tx_total_collisions);
2241
2242         case IFCOUNTER_IBYTES:
2243                 return (mstats->rx_octets);
2244
2245         case IFCOUNTER_OBYTES:
2246                 return (mstats->tx_octets);
2247
2248         case IFCOUNTER_IMCASTS:
2249                 return (mstats->rx_mcast_frames);
2250
2251         case IFCOUNTER_OMCASTS:
2252                 return (mstats->tx_mcast_frames);
2253
2254         case IFCOUNTER_IQDROPS:
2255                 return (mstats->rx_cong_drops);
2256
2257         case IFCOUNTER_OQDROPS: {
2258                 int i;
2259                 uint64_t drops;
2260
2261                 drops = 0;
2262                 if (sc->flags & FULL_INIT_DONE) {
2263                         for (i = pi->first_qset; i < pi->first_qset + pi->nqsets; i++)
2264                                 drops += sc->sge.qs[i].txq[TXQ_ETH].txq_mr->br_drops;
2265                 }
2266
2267                 return (drops);
2268
2269         }
2270
2271         default:
2272                 return (if_get_counter_default(ifp, c));
2273         }
2274 }
2275
2276 static void
2277 cxgb_async_intr(void *data)
2278 {
2279         adapter_t *sc = data;
2280
2281         t3_write_reg(sc, A_PL_INT_ENABLE0, 0);
2282         (void) t3_read_reg(sc, A_PL_INT_ENABLE0);
2283         taskqueue_enqueue(sc->tq, &sc->slow_intr_task);
2284 }
2285
2286 static void
2287 link_check_callout(void *arg)
2288 {
2289         struct port_info *pi = arg;
2290         struct adapter *sc = pi->adapter;
2291
2292         if (!isset(&sc->open_device_map, pi->port_id))
2293                 return;
2294
2295         taskqueue_enqueue(sc->tq, &pi->link_check_task);
2296 }
2297
2298 static void
2299 check_link_status(void *arg, int pending)
2300 {
2301         struct port_info *pi = arg;
2302         struct adapter *sc = pi->adapter;
2303
2304         if (!isset(&sc->open_device_map, pi->port_id))
2305                 return;
2306
2307         t3_link_changed(sc, pi->port_id);
2308
2309         if (pi->link_fault || !(pi->phy.caps & SUPPORTED_LINK_IRQ) ||
2310             pi->link_config.link_ok == 0)
2311                 callout_reset(&pi->link_check_ch, hz, link_check_callout, pi);
2312 }
2313
2314 void
2315 t3_os_link_intr(struct port_info *pi)
2316 {
2317         /*
2318          * Schedule a link check in the near future.  If the link is flapping
2319          * rapidly we'll keep resetting the callout and delaying the check until
2320          * things stabilize a bit.
2321          */
2322         callout_reset(&pi->link_check_ch, hz / 4, link_check_callout, pi);
2323 }
2324
2325 static void
2326 check_t3b2_mac(struct adapter *sc)
2327 {
2328         int i;
2329
2330         if (sc->flags & CXGB_SHUTDOWN)
2331                 return;
2332
2333         for_each_port(sc, i) {
2334                 struct port_info *p = &sc->port[i];
2335                 int status;
2336 #ifdef INVARIANTS
2337                 struct ifnet *ifp = p->ifp;
2338 #endif          
2339
2340                 if (!isset(&sc->open_device_map, p->port_id) || p->link_fault ||
2341                     !p->link_config.link_ok)
2342                         continue;
2343
2344                 KASSERT(ifp->if_drv_flags & IFF_DRV_RUNNING,
2345                         ("%s: state mismatch (drv_flags %x, device_map %x)",
2346                          __func__, ifp->if_drv_flags, sc->open_device_map));
2347
2348                 PORT_LOCK(p);
2349                 status = t3b2_mac_watchdog_task(&p->mac);
2350                 if (status == 1)
2351                         p->mac.stats.num_toggled++;
2352                 else if (status == 2) {
2353                         struct cmac *mac = &p->mac;
2354
2355                         cxgb_update_mac_settings(p);
2356                         t3_link_start(&p->phy, mac, &p->link_config);
2357                         t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
2358                         t3_port_intr_enable(sc, p->port_id);
2359                         p->mac.stats.num_resets++;
2360                 }
2361                 PORT_UNLOCK(p);
2362         }
2363 }
2364
2365 static void
2366 cxgb_tick(void *arg)
2367 {
2368         adapter_t *sc = (adapter_t *)arg;
2369
2370         if (sc->flags & CXGB_SHUTDOWN)
2371                 return;
2372
2373         taskqueue_enqueue(sc->tq, &sc->tick_task);      
2374         callout_reset(&sc->cxgb_tick_ch, hz, cxgb_tick, sc);
2375 }
2376
2377 void
2378 cxgb_refresh_stats(struct port_info *pi)
2379 {
2380         struct timeval tv;
2381         const struct timeval interval = {0, 250000};    /* 250ms */
2382
2383         getmicrotime(&tv);
2384         timevalsub(&tv, &interval);
2385         if (timevalcmp(&tv, &pi->last_refreshed, <))
2386                 return;
2387
2388         PORT_LOCK(pi);
2389         t3_mac_update_stats(&pi->mac);
2390         PORT_UNLOCK(pi);
2391         getmicrotime(&pi->last_refreshed);
2392 }
2393
2394 static void
2395 cxgb_tick_handler(void *arg, int count)
2396 {
2397         adapter_t *sc = (adapter_t *)arg;
2398         const struct adapter_params *p = &sc->params;
2399         int i;
2400         uint32_t cause, reset;
2401
2402         if (sc->flags & CXGB_SHUTDOWN || !(sc->flags & FULL_INIT_DONE))
2403                 return;
2404
2405         if (p->rev == T3_REV_B2 && p->nports < 4 && sc->open_device_map) 
2406                 check_t3b2_mac(sc);
2407
2408         cause = t3_read_reg(sc, A_SG_INT_CAUSE) & (F_RSPQSTARVE | F_FLEMPTY);
2409         if (cause) {
2410                 struct sge_qset *qs = &sc->sge.qs[0];
2411                 uint32_t mask, v;
2412
2413                 v = t3_read_reg(sc, A_SG_RSPQ_FL_STATUS) & ~0xff00;
2414
2415                 mask = 1;
2416                 for (i = 0; i < SGE_QSETS; i++) {
2417                         if (v & mask)
2418                                 qs[i].rspq.starved++;
2419                         mask <<= 1;
2420                 }
2421
2422                 mask <<= SGE_QSETS; /* skip RSPQXDISABLED */
2423
2424                 for (i = 0; i < SGE_QSETS * 2; i++) {
2425                         if (v & mask) {
2426                                 qs[i / 2].fl[i % 2].empty++;
2427                         }
2428                         mask <<= 1;
2429                 }
2430
2431                 /* clear */
2432                 t3_write_reg(sc, A_SG_RSPQ_FL_STATUS, v);
2433                 t3_write_reg(sc, A_SG_INT_CAUSE, cause);
2434         }
2435
2436         for (i = 0; i < sc->params.nports; i++) {
2437                 struct port_info *pi = &sc->port[i];
2438                 struct cmac *mac = &pi->mac;
2439
2440                 if (!isset(&sc->open_device_map, pi->port_id))
2441                         continue;
2442
2443                 cxgb_refresh_stats(pi);
2444
2445                 if (mac->multiport)
2446                         continue;
2447
2448                 /* Count rx fifo overflows, once per second */
2449                 cause = t3_read_reg(sc, A_XGM_INT_CAUSE + mac->offset);
2450                 reset = 0;
2451                 if (cause & F_RXFIFO_OVERFLOW) {
2452                         mac->stats.rx_fifo_ovfl++;
2453                         reset |= F_RXFIFO_OVERFLOW;
2454                 }
2455                 t3_write_reg(sc, A_XGM_INT_CAUSE + mac->offset, reset);
2456         }
2457 }
2458
2459 static void
2460 touch_bars(device_t dev)
2461 {
2462         /*
2463          * Don't enable yet
2464          */
2465 #if !defined(__LP64__) && 0
2466         u32 v;
2467
2468         pci_read_config_dword(pdev, PCI_BASE_ADDRESS_1, &v);
2469         pci_write_config_dword(pdev, PCI_BASE_ADDRESS_1, v);
2470         pci_read_config_dword(pdev, PCI_BASE_ADDRESS_3, &v);
2471         pci_write_config_dword(pdev, PCI_BASE_ADDRESS_3, v);
2472         pci_read_config_dword(pdev, PCI_BASE_ADDRESS_5, &v);
2473         pci_write_config_dword(pdev, PCI_BASE_ADDRESS_5, v);
2474 #endif
2475 }
2476
2477 static int
2478 set_eeprom(struct port_info *pi, const uint8_t *data, int len, int offset)
2479 {
2480         uint8_t *buf;
2481         int err = 0;
2482         u32 aligned_offset, aligned_len, *p;
2483         struct adapter *adapter = pi->adapter;
2484
2485
2486         aligned_offset = offset & ~3;
2487         aligned_len = (len + (offset & 3) + 3) & ~3;
2488
2489         if (aligned_offset != offset || aligned_len != len) {
2490                 buf = malloc(aligned_len, M_DEVBUF, M_WAITOK|M_ZERO);              
2491                 if (!buf)
2492                         return (ENOMEM);
2493                 err = t3_seeprom_read(adapter, aligned_offset, (u32 *)buf);
2494                 if (!err && aligned_len > 4)
2495                         err = t3_seeprom_read(adapter,
2496                                               aligned_offset + aligned_len - 4,
2497                                               (u32 *)&buf[aligned_len - 4]);
2498                 if (err)
2499                         goto out;
2500                 memcpy(buf + (offset & 3), data, len);
2501         } else
2502                 buf = (uint8_t *)(uintptr_t)data;
2503
2504         err = t3_seeprom_wp(adapter, 0);
2505         if (err)
2506                 goto out;
2507
2508         for (p = (u32 *)buf; !err && aligned_len; aligned_len -= 4, p++) {
2509                 err = t3_seeprom_write(adapter, aligned_offset, *p);
2510                 aligned_offset += 4;
2511         }
2512
2513         if (!err)
2514                 err = t3_seeprom_wp(adapter, 1);
2515 out:
2516         if (buf != data)
2517                 free(buf, M_DEVBUF);
2518         return err;
2519 }
2520
2521
2522 static int
2523 in_range(int val, int lo, int hi)
2524 {
2525         return val < 0 || (val <= hi && val >= lo);
2526 }
2527
2528 static int
2529 cxgb_extension_open(struct cdev *dev, int flags, int fmp, struct thread *td)
2530 {
2531        return (0);
2532 }
2533
2534 static int
2535 cxgb_extension_close(struct cdev *dev, int flags, int fmt, struct thread *td)
2536 {
2537        return (0);
2538 }
2539
2540 static int
2541 cxgb_extension_ioctl(struct cdev *dev, unsigned long cmd, caddr_t data,
2542     int fflag, struct thread *td)
2543 {
2544         int mmd, error = 0;
2545         struct port_info *pi = dev->si_drv1;
2546         adapter_t *sc = pi->adapter;
2547
2548 #ifdef PRIV_SUPPORTED   
2549         if (priv_check(td, PRIV_DRIVER)) {
2550                 if (cxgb_debug) 
2551                         printf("user does not have access to privileged ioctls\n");
2552                 return (EPERM);
2553         }
2554 #else
2555         if (suser(td)) {
2556                 if (cxgb_debug)
2557                         printf("user does not have access to privileged ioctls\n");
2558                 return (EPERM);
2559         }
2560 #endif
2561         
2562         switch (cmd) {
2563         case CHELSIO_GET_MIIREG: {
2564                 uint32_t val;
2565                 struct cphy *phy = &pi->phy;
2566                 struct ch_mii_data *mid = (struct ch_mii_data *)data;
2567                 
2568                 if (!phy->mdio_read)
2569                         return (EOPNOTSUPP);
2570                 if (is_10G(sc)) {
2571                         mmd = mid->phy_id >> 8;
2572                         if (!mmd)
2573                                 mmd = MDIO_DEV_PCS;
2574                         else if (mmd > MDIO_DEV_VEND2)
2575                                 return (EINVAL);
2576
2577                         error = phy->mdio_read(sc, mid->phy_id & 0x1f, mmd,
2578                                              mid->reg_num, &val);
2579                 } else
2580                         error = phy->mdio_read(sc, mid->phy_id & 0x1f, 0,
2581                                              mid->reg_num & 0x1f, &val);
2582                 if (error == 0)
2583                         mid->val_out = val;
2584                 break;
2585         }
2586         case CHELSIO_SET_MIIREG: {
2587                 struct cphy *phy = &pi->phy;
2588                 struct ch_mii_data *mid = (struct ch_mii_data *)data;
2589
2590                 if (!phy->mdio_write)
2591                         return (EOPNOTSUPP);
2592                 if (is_10G(sc)) {
2593                         mmd = mid->phy_id >> 8;
2594                         if (!mmd)
2595                                 mmd = MDIO_DEV_PCS;
2596                         else if (mmd > MDIO_DEV_VEND2)
2597                                 return (EINVAL);
2598                         
2599                         error = phy->mdio_write(sc, mid->phy_id & 0x1f,
2600                                               mmd, mid->reg_num, mid->val_in);
2601                 } else
2602                         error = phy->mdio_write(sc, mid->phy_id & 0x1f, 0,
2603                                               mid->reg_num & 0x1f,
2604                                               mid->val_in);
2605                 break;
2606         }
2607         case CHELSIO_SETREG: {
2608                 struct ch_reg *edata = (struct ch_reg *)data;
2609                 if ((edata->addr & 0x3) != 0 || edata->addr >= sc->mmio_len)
2610                         return (EFAULT);
2611                 t3_write_reg(sc, edata->addr, edata->val);
2612                 break;
2613         }
2614         case CHELSIO_GETREG: {
2615                 struct ch_reg *edata = (struct ch_reg *)data;
2616                 if ((edata->addr & 0x3) != 0 || edata->addr >= sc->mmio_len)
2617                         return (EFAULT);
2618                 edata->val = t3_read_reg(sc, edata->addr);
2619                 break;
2620         }
2621         case CHELSIO_GET_SGE_CONTEXT: {
2622                 struct ch_cntxt *ecntxt = (struct ch_cntxt *)data;
2623                 mtx_lock_spin(&sc->sge.reg_lock);
2624                 switch (ecntxt->cntxt_type) {
2625                 case CNTXT_TYPE_EGRESS:
2626                         error = -t3_sge_read_ecntxt(sc, ecntxt->cntxt_id,
2627                             ecntxt->data);
2628                         break;
2629                 case CNTXT_TYPE_FL:
2630                         error = -t3_sge_read_fl(sc, ecntxt->cntxt_id,
2631                             ecntxt->data);
2632                         break;
2633                 case CNTXT_TYPE_RSP:
2634                         error = -t3_sge_read_rspq(sc, ecntxt->cntxt_id,
2635                             ecntxt->data);
2636                         break;
2637                 case CNTXT_TYPE_CQ:
2638                         error = -t3_sge_read_cq(sc, ecntxt->cntxt_id,
2639                             ecntxt->data);
2640                         break;
2641                 default:
2642                         error = EINVAL;
2643                         break;
2644                 }
2645                 mtx_unlock_spin(&sc->sge.reg_lock);
2646                 break;
2647         }
2648         case CHELSIO_GET_SGE_DESC: {
2649                 struct ch_desc *edesc = (struct ch_desc *)data;
2650                 int ret;
2651                 if (edesc->queue_num >= SGE_QSETS * 6)
2652                         return (EINVAL);
2653                 ret = t3_get_desc(&sc->sge.qs[edesc->queue_num / 6],
2654                     edesc->queue_num % 6, edesc->idx, edesc->data);
2655                 if (ret < 0)
2656                         return (EINVAL);
2657                 edesc->size = ret;
2658                 break;
2659         }
2660         case CHELSIO_GET_QSET_PARAMS: {
2661                 struct qset_params *q;
2662                 struct ch_qset_params *t = (struct ch_qset_params *)data;
2663                 int q1 = pi->first_qset;
2664                 int nqsets = pi->nqsets;
2665                 int i;
2666
2667                 if (t->qset_idx >= nqsets)
2668                         return EINVAL;
2669
2670                 i = q1 + t->qset_idx;
2671                 q = &sc->params.sge.qset[i];
2672                 t->rspq_size   = q->rspq_size;
2673                 t->txq_size[0] = q->txq_size[0];
2674                 t->txq_size[1] = q->txq_size[1];
2675                 t->txq_size[2] = q->txq_size[2];
2676                 t->fl_size[0]  = q->fl_size;
2677                 t->fl_size[1]  = q->jumbo_size;
2678                 t->polling     = q->polling;
2679                 t->lro         = q->lro;
2680                 t->intr_lat    = q->coalesce_usecs;
2681                 t->cong_thres  = q->cong_thres;
2682                 t->qnum        = i;
2683
2684                 if ((sc->flags & FULL_INIT_DONE) == 0)
2685                         t->vector = 0;
2686                 else if (sc->flags & USING_MSIX)
2687                         t->vector = rman_get_start(sc->msix_irq_res[i]);
2688                 else
2689                         t->vector = rman_get_start(sc->irq_res);
2690
2691                 break;
2692         }
2693         case CHELSIO_GET_QSET_NUM: {
2694                 struct ch_reg *edata = (struct ch_reg *)data;
2695                 edata->val = pi->nqsets;
2696                 break;
2697         }
2698         case CHELSIO_LOAD_FW: {
2699                 uint8_t *fw_data;
2700                 uint32_t vers;
2701                 struct ch_mem_range *t = (struct ch_mem_range *)data;
2702
2703                 /*
2704                  * You're allowed to load a firmware only before FULL_INIT_DONE
2705                  *
2706                  * FW_UPTODATE is also set so the rest of the initialization
2707                  * will not overwrite what was loaded here.  This gives you the
2708                  * flexibility to load any firmware (and maybe shoot yourself in
2709                  * the foot).
2710                  */
2711
2712                 ADAPTER_LOCK(sc);
2713                 if (sc->open_device_map || sc->flags & FULL_INIT_DONE) {
2714                         ADAPTER_UNLOCK(sc);
2715                         return (EBUSY);
2716                 }
2717
2718                 fw_data = malloc(t->len, M_DEVBUF, M_NOWAIT);
2719                 if (!fw_data)
2720                         error = ENOMEM;
2721                 else
2722                         error = copyin(t->buf, fw_data, t->len);
2723
2724                 if (!error)
2725                         error = -t3_load_fw(sc, fw_data, t->len);
2726
2727                 if (t3_get_fw_version(sc, &vers) == 0) {
2728                         snprintf(&sc->fw_version[0], sizeof(sc->fw_version),
2729                             "%d.%d.%d", G_FW_VERSION_MAJOR(vers),
2730                             G_FW_VERSION_MINOR(vers), G_FW_VERSION_MICRO(vers));
2731                 }
2732
2733                 if (!error)
2734                         sc->flags |= FW_UPTODATE;
2735
2736                 free(fw_data, M_DEVBUF);
2737                 ADAPTER_UNLOCK(sc);
2738                 break;
2739         }
2740         case CHELSIO_LOAD_BOOT: {
2741                 uint8_t *boot_data;
2742                 struct ch_mem_range *t = (struct ch_mem_range *)data;
2743
2744                 boot_data = malloc(t->len, M_DEVBUF, M_NOWAIT);
2745                 if (!boot_data)
2746                         return ENOMEM;
2747
2748                 error = copyin(t->buf, boot_data, t->len);
2749                 if (!error)
2750                         error = -t3_load_boot(sc, boot_data, t->len);
2751
2752                 free(boot_data, M_DEVBUF);
2753                 break;
2754         }
2755         case CHELSIO_GET_PM: {
2756                 struct ch_pm *m = (struct ch_pm *)data;
2757                 struct tp_params *p = &sc->params.tp;
2758
2759                 if (!is_offload(sc))
2760                         return (EOPNOTSUPP);
2761
2762                 m->tx_pg_sz = p->tx_pg_size;
2763                 m->tx_num_pg = p->tx_num_pgs;
2764                 m->rx_pg_sz  = p->rx_pg_size;
2765                 m->rx_num_pg = p->rx_num_pgs;
2766                 m->pm_total  = p->pmtx_size + p->chan_rx_size * p->nchan;
2767
2768                 break;
2769         }
2770         case CHELSIO_SET_PM: {
2771                 struct ch_pm *m = (struct ch_pm *)data;
2772                 struct tp_params *p = &sc->params.tp;
2773
2774                 if (!is_offload(sc))
2775                         return (EOPNOTSUPP);
2776                 if (sc->flags & FULL_INIT_DONE)
2777                         return (EBUSY);
2778
2779                 if (!m->rx_pg_sz || (m->rx_pg_sz & (m->rx_pg_sz - 1)) ||
2780                     !m->tx_pg_sz || (m->tx_pg_sz & (m->tx_pg_sz - 1)))
2781                         return (EINVAL);        /* not power of 2 */
2782                 if (!(m->rx_pg_sz & 0x14000))
2783                         return (EINVAL);        /* not 16KB or 64KB */
2784                 if (!(m->tx_pg_sz & 0x1554000))
2785                         return (EINVAL);
2786                 if (m->tx_num_pg == -1)
2787                         m->tx_num_pg = p->tx_num_pgs;
2788                 if (m->rx_num_pg == -1)
2789                         m->rx_num_pg = p->rx_num_pgs;
2790                 if (m->tx_num_pg % 24 || m->rx_num_pg % 24)
2791                         return (EINVAL);
2792                 if (m->rx_num_pg * m->rx_pg_sz > p->chan_rx_size ||
2793                     m->tx_num_pg * m->tx_pg_sz > p->chan_tx_size)
2794                         return (EINVAL);
2795
2796                 p->rx_pg_size = m->rx_pg_sz;
2797                 p->tx_pg_size = m->tx_pg_sz;
2798                 p->rx_num_pgs = m->rx_num_pg;
2799                 p->tx_num_pgs = m->tx_num_pg;
2800                 break;
2801         }
2802         case CHELSIO_SETMTUTAB: {
2803                 struct ch_mtus *m = (struct ch_mtus *)data;
2804                 int i;
2805                 
2806                 if (!is_offload(sc))
2807                         return (EOPNOTSUPP);
2808                 if (offload_running(sc))
2809                         return (EBUSY);
2810                 if (m->nmtus != NMTUS)
2811                         return (EINVAL);
2812                 if (m->mtus[0] < 81)         /* accommodate SACK */
2813                         return (EINVAL);
2814                 
2815                 /*
2816                  * MTUs must be in ascending order
2817                  */
2818                 for (i = 1; i < NMTUS; ++i)
2819                         if (m->mtus[i] < m->mtus[i - 1])
2820                                 return (EINVAL);
2821
2822                 memcpy(sc->params.mtus, m->mtus, sizeof(sc->params.mtus));
2823                 break;
2824         }
2825         case CHELSIO_GETMTUTAB: {
2826                 struct ch_mtus *m = (struct ch_mtus *)data;
2827
2828                 if (!is_offload(sc))
2829                         return (EOPNOTSUPP);
2830
2831                 memcpy(m->mtus, sc->params.mtus, sizeof(m->mtus));
2832                 m->nmtus = NMTUS;
2833                 break;
2834         }
2835         case CHELSIO_GET_MEM: {
2836                 struct ch_mem_range *t = (struct ch_mem_range *)data;
2837                 struct mc7 *mem;
2838                 uint8_t *useraddr;
2839                 u64 buf[32];
2840
2841                 /*
2842                  * Use these to avoid modifying len/addr in the return
2843                  * struct
2844                  */
2845                 uint32_t len = t->len, addr = t->addr;
2846
2847                 if (!is_offload(sc))
2848                         return (EOPNOTSUPP);
2849                 if (!(sc->flags & FULL_INIT_DONE))
2850                         return (EIO);         /* need the memory controllers */
2851                 if ((addr & 0x7) || (len & 0x7))
2852                         return (EINVAL);
2853                 if (t->mem_id == MEM_CM)
2854                         mem = &sc->cm;
2855                 else if (t->mem_id == MEM_PMRX)
2856                         mem = &sc->pmrx;
2857                 else if (t->mem_id == MEM_PMTX)
2858                         mem = &sc->pmtx;
2859                 else
2860                         return (EINVAL);
2861
2862                 /*
2863                  * Version scheme:
2864                  * bits 0..9: chip version
2865                  * bits 10..15: chip revision
2866                  */
2867                 t->version = 3 | (sc->params.rev << 10);
2868                 
2869                 /*
2870                  * Read 256 bytes at a time as len can be large and we don't
2871                  * want to use huge intermediate buffers.
2872                  */
2873                 useraddr = (uint8_t *)t->buf; 
2874                 while (len) {
2875                         unsigned int chunk = min(len, sizeof(buf));
2876
2877                         error = t3_mc7_bd_read(mem, addr / 8, chunk / 8, buf);
2878                         if (error)
2879                                 return (-error);
2880                         if (copyout(buf, useraddr, chunk))
2881                                 return (EFAULT);
2882                         useraddr += chunk;
2883                         addr += chunk;
2884                         len -= chunk;
2885                 }
2886                 break;
2887         }
2888         case CHELSIO_READ_TCAM_WORD: {
2889                 struct ch_tcam_word *t = (struct ch_tcam_word *)data;
2890
2891                 if (!is_offload(sc))
2892                         return (EOPNOTSUPP);
2893                 if (!(sc->flags & FULL_INIT_DONE))
2894                         return (EIO);         /* need MC5 */            
2895                 return -t3_read_mc5_range(&sc->mc5, t->addr, 1, t->buf);
2896                 break;
2897         }
2898         case CHELSIO_SET_TRACE_FILTER: {
2899                 struct ch_trace *t = (struct ch_trace *)data;
2900                 const struct trace_params *tp;
2901
2902                 tp = (const struct trace_params *)&t->sip;
2903                 if (t->config_tx)
2904                         t3_config_trace_filter(sc, tp, 0, t->invert_match,
2905                                                t->trace_tx);
2906                 if (t->config_rx)
2907                         t3_config_trace_filter(sc, tp, 1, t->invert_match,
2908                                                t->trace_rx);
2909                 break;
2910         }
2911         case CHELSIO_SET_PKTSCHED: {
2912                 struct ch_pktsched_params *p = (struct ch_pktsched_params *)data;
2913                 if (sc->open_device_map == 0)
2914                         return (EAGAIN);
2915                 send_pktsched_cmd(sc, p->sched, p->idx, p->min, p->max,
2916                     p->binding);
2917                 break;
2918         }
2919         case CHELSIO_IFCONF_GETREGS: {
2920                 struct ch_ifconf_regs *regs = (struct ch_ifconf_regs *)data;
2921                 int reglen = cxgb_get_regs_len();
2922                 uint8_t *buf = malloc(reglen, M_DEVBUF, M_NOWAIT);
2923                 if (buf == NULL) {
2924                         return (ENOMEM);
2925                 }
2926                 if (regs->len > reglen)
2927                         regs->len = reglen;
2928                 else if (regs->len < reglen)
2929                         error = ENOBUFS;
2930
2931                 if (!error) {
2932                         cxgb_get_regs(sc, regs, buf);
2933                         error = copyout(buf, regs->data, reglen);
2934                 }
2935                 free(buf, M_DEVBUF);
2936
2937                 break;
2938         }
2939         case CHELSIO_SET_HW_SCHED: {
2940                 struct ch_hw_sched *t = (struct ch_hw_sched *)data;
2941                 unsigned int ticks_per_usec = core_ticks_per_usec(sc);
2942
2943                 if ((sc->flags & FULL_INIT_DONE) == 0)
2944                         return (EAGAIN);       /* need TP to be initialized */
2945                 if (t->sched >= NTX_SCHED || !in_range(t->mode, 0, 1) ||
2946                     !in_range(t->channel, 0, 1) ||
2947                     !in_range(t->kbps, 0, 10000000) ||
2948                     !in_range(t->class_ipg, 0, 10000 * 65535 / ticks_per_usec) ||
2949                     !in_range(t->flow_ipg, 0,
2950                               dack_ticks_to_usec(sc, 0x7ff)))
2951                         return (EINVAL);
2952
2953                 if (t->kbps >= 0) {
2954                         error = t3_config_sched(sc, t->kbps, t->sched);
2955                         if (error < 0)
2956                                 return (-error);
2957                 }
2958                 if (t->class_ipg >= 0)
2959                         t3_set_sched_ipg(sc, t->sched, t->class_ipg);
2960                 if (t->flow_ipg >= 0) {
2961                         t->flow_ipg *= 1000;     /* us -> ns */
2962                         t3_set_pace_tbl(sc, &t->flow_ipg, t->sched, 1);
2963                 }
2964                 if (t->mode >= 0) {
2965                         int bit = 1 << (S_TX_MOD_TIMER_MODE + t->sched);
2966
2967                         t3_set_reg_field(sc, A_TP_TX_MOD_QUEUE_REQ_MAP,
2968                                          bit, t->mode ? bit : 0);
2969                 }
2970                 if (t->channel >= 0)
2971                         t3_set_reg_field(sc, A_TP_TX_MOD_QUEUE_REQ_MAP,
2972                                          1 << t->sched, t->channel << t->sched);
2973                 break;
2974         }
2975         case CHELSIO_GET_EEPROM: {
2976                 int i;
2977                 struct ch_eeprom *e = (struct ch_eeprom *)data;
2978                 uint8_t *buf;
2979
2980                 if (e->offset & 3 || e->offset >= EEPROMSIZE ||
2981                     e->len > EEPROMSIZE || e->offset + e->len > EEPROMSIZE) {
2982                         return (EINVAL);
2983                 }
2984
2985                 buf = malloc(EEPROMSIZE, M_DEVBUF, M_NOWAIT);
2986                 if (buf == NULL) {
2987                         return (ENOMEM);
2988                 }
2989                 e->magic = EEPROM_MAGIC;
2990                 for (i = e->offset & ~3; !error && i < e->offset + e->len; i += 4)
2991                         error = -t3_seeprom_read(sc, i, (uint32_t *)&buf[i]);
2992
2993                 if (!error)
2994                         error = copyout(buf + e->offset, e->data, e->len);
2995
2996                 free(buf, M_DEVBUF);
2997                 break;
2998         }
2999         case CHELSIO_CLEAR_STATS: {
3000                 if (!(sc->flags & FULL_INIT_DONE))
3001                         return EAGAIN;
3002
3003                 PORT_LOCK(pi);
3004                 t3_mac_update_stats(&pi->mac);
3005                 memset(&pi->mac.stats, 0, sizeof(pi->mac.stats));
3006                 PORT_UNLOCK(pi);
3007                 break;
3008         }
3009         case CHELSIO_GET_UP_LA: {
3010                 struct ch_up_la *la = (struct ch_up_la *)data;
3011                 uint8_t *buf = malloc(LA_BUFSIZE, M_DEVBUF, M_NOWAIT);
3012                 if (buf == NULL) {
3013                         return (ENOMEM);
3014                 }
3015                 if (la->bufsize < LA_BUFSIZE)
3016                         error = ENOBUFS;
3017
3018                 if (!error)
3019                         error = -t3_get_up_la(sc, &la->stopped, &la->idx,
3020                                               &la->bufsize, buf);
3021                 if (!error)
3022                         error = copyout(buf, la->data, la->bufsize);
3023
3024                 free(buf, M_DEVBUF);
3025                 break;
3026         }
3027         case CHELSIO_GET_UP_IOQS: {
3028                 struct ch_up_ioqs *ioqs = (struct ch_up_ioqs *)data;
3029                 uint8_t *buf = malloc(IOQS_BUFSIZE, M_DEVBUF, M_NOWAIT);
3030                 uint32_t *v;
3031
3032                 if (buf == NULL) {
3033                         return (ENOMEM);
3034                 }
3035                 if (ioqs->bufsize < IOQS_BUFSIZE)
3036                         error = ENOBUFS;
3037
3038                 if (!error)
3039                         error = -t3_get_up_ioqs(sc, &ioqs->bufsize, buf);
3040
3041                 if (!error) {
3042                         v = (uint32_t *)buf;
3043
3044                         ioqs->ioq_rx_enable = *v++;
3045                         ioqs->ioq_tx_enable = *v++;
3046                         ioqs->ioq_rx_status = *v++;
3047                         ioqs->ioq_tx_status = *v++;
3048
3049                         error = copyout(v, ioqs->data, ioqs->bufsize);
3050                 }
3051
3052                 free(buf, M_DEVBUF);
3053                 break;
3054         }
3055         case CHELSIO_SET_FILTER: {
3056                 struct ch_filter *f = (struct ch_filter *)data;
3057                 struct filter_info *p;
3058                 unsigned int nfilters = sc->params.mc5.nfilters;
3059
3060                 if (!is_offload(sc))
3061                         return (EOPNOTSUPP);    /* No TCAM */
3062                 if (!(sc->flags & FULL_INIT_DONE))
3063                         return (EAGAIN);        /* mc5 not setup yet */
3064                 if (nfilters == 0)
3065                         return (EBUSY);         /* TOE will use TCAM */
3066
3067                 /* sanity checks */
3068                 if (f->filter_id >= nfilters ||
3069                     (f->val.dip && f->mask.dip != 0xffffffff) ||
3070                     (f->val.sport && f->mask.sport != 0xffff) ||
3071                     (f->val.dport && f->mask.dport != 0xffff) ||
3072                     (f->val.vlan && f->mask.vlan != 0xfff) ||
3073                     (f->val.vlan_prio &&
3074                         f->mask.vlan_prio != FILTER_NO_VLAN_PRI) ||
3075                     (f->mac_addr_idx != 0xffff && f->mac_addr_idx > 15) ||
3076                     f->qset >= SGE_QSETS ||
3077                     sc->rrss_map[f->qset] >= RSS_TABLE_SIZE)
3078                         return (EINVAL);
3079
3080                 /* Was allocated with M_WAITOK */
3081                 KASSERT(sc->filters, ("filter table NULL\n"));
3082
3083                 p = &sc->filters[f->filter_id];
3084                 if (p->locked)
3085                         return (EPERM);
3086
3087                 bzero(p, sizeof(*p));
3088                 p->sip = f->val.sip;
3089                 p->sip_mask = f->mask.sip;
3090                 p->dip = f->val.dip;
3091                 p->sport = f->val.sport;
3092                 p->dport = f->val.dport;
3093                 p->vlan = f->mask.vlan ? f->val.vlan : 0xfff;
3094                 p->vlan_prio = f->mask.vlan_prio ? (f->val.vlan_prio & 6) :
3095                     FILTER_NO_VLAN_PRI;
3096                 p->mac_hit = f->mac_hit;
3097                 p->mac_vld = f->mac_addr_idx != 0xffff;
3098                 p->mac_idx = f->mac_addr_idx;
3099                 p->pkt_type = f->proto;
3100                 p->report_filter_id = f->want_filter_id;
3101                 p->pass = f->pass;
3102                 p->rss = f->rss;
3103                 p->qset = f->qset;
3104
3105                 error = set_filter(sc, f->filter_id, p);
3106                 if (error == 0)
3107                         p->valid = 1;
3108                 break;
3109         }
3110         case CHELSIO_DEL_FILTER: {
3111                 struct ch_filter *f = (struct ch_filter *)data;
3112                 struct filter_info *p;
3113                 unsigned int nfilters = sc->params.mc5.nfilters;
3114
3115                 if (!is_offload(sc))
3116                         return (EOPNOTSUPP);
3117                 if (!(sc->flags & FULL_INIT_DONE))
3118                         return (EAGAIN);
3119                 if (nfilters == 0 || sc->filters == NULL)
3120                         return (EINVAL);
3121                 if (f->filter_id >= nfilters)
3122                        return (EINVAL);
3123
3124                 p = &sc->filters[f->filter_id];
3125                 if (p->locked)
3126                         return (EPERM);
3127                 if (!p->valid)
3128                         return (EFAULT); /* Read "Bad address" as "Bad index" */
3129
3130                 bzero(p, sizeof(*p));
3131                 p->sip = p->sip_mask = 0xffffffff;
3132                 p->vlan = 0xfff;
3133                 p->vlan_prio = FILTER_NO_VLAN_PRI;
3134                 p->pkt_type = 1;
3135                 error = set_filter(sc, f->filter_id, p);
3136                 break;
3137         }
3138         case CHELSIO_GET_FILTER: {
3139                 struct ch_filter *f = (struct ch_filter *)data;
3140                 struct filter_info *p;
3141                 unsigned int i, nfilters = sc->params.mc5.nfilters;
3142
3143                 if (!is_offload(sc))
3144                         return (EOPNOTSUPP);
3145                 if (!(sc->flags & FULL_INIT_DONE))
3146                         return (EAGAIN);
3147                 if (nfilters == 0 || sc->filters == NULL)
3148                         return (EINVAL);
3149
3150                 i = f->filter_id == 0xffffffff ? 0 : f->filter_id + 1;
3151                 for (; i < nfilters; i++) {
3152                         p = &sc->filters[i];
3153                         if (!p->valid)
3154                                 continue;
3155
3156                         bzero(f, sizeof(*f));
3157
3158                         f->filter_id = i;
3159                         f->val.sip = p->sip;
3160                         f->mask.sip = p->sip_mask;
3161                         f->val.dip = p->dip;
3162                         f->mask.dip = p->dip ? 0xffffffff : 0;
3163                         f->val.sport = p->sport;
3164                         f->mask.sport = p->sport ? 0xffff : 0;
3165                         f->val.dport = p->dport;
3166                         f->mask.dport = p->dport ? 0xffff : 0;
3167                         f->val.vlan = p->vlan == 0xfff ? 0 : p->vlan;
3168                         f->mask.vlan = p->vlan == 0xfff ? 0 : 0xfff;
3169                         f->val.vlan_prio = p->vlan_prio == FILTER_NO_VLAN_PRI ?
3170                             0 : p->vlan_prio;
3171                         f->mask.vlan_prio = p->vlan_prio == FILTER_NO_VLAN_PRI ?
3172                             0 : FILTER_NO_VLAN_PRI;
3173                         f->mac_hit = p->mac_hit;
3174                         f->mac_addr_idx = p->mac_vld ? p->mac_idx : 0xffff;
3175                         f->proto = p->pkt_type;
3176                         f->want_filter_id = p->report_filter_id;
3177                         f->pass = p->pass;
3178                         f->rss = p->rss;
3179                         f->qset = p->qset;
3180
3181                         break;
3182                 }
3183                 
3184                 if (i == nfilters)
3185                         f->filter_id = 0xffffffff;
3186                 break;
3187         }
3188         default:
3189                 return (EOPNOTSUPP);
3190                 break;
3191         }
3192
3193         return (error);
3194 }
3195
3196 static __inline void
3197 reg_block_dump(struct adapter *ap, uint8_t *buf, unsigned int start,
3198     unsigned int end)
3199 {
3200         uint32_t *p = (uint32_t *)(buf + start);
3201
3202         for ( ; start <= end; start += sizeof(uint32_t))
3203                 *p++ = t3_read_reg(ap, start);
3204 }
3205
3206 #define T3_REGMAP_SIZE (3 * 1024)
3207 static int
3208 cxgb_get_regs_len(void)
3209 {
3210         return T3_REGMAP_SIZE;
3211 }
3212
3213 static void
3214 cxgb_get_regs(adapter_t *sc, struct ch_ifconf_regs *regs, uint8_t *buf)
3215 {           
3216         
3217         /*
3218          * Version scheme:
3219          * bits 0..9: chip version
3220          * bits 10..15: chip revision
3221          * bit 31: set for PCIe cards
3222          */
3223         regs->version = 3 | (sc->params.rev << 10) | (is_pcie(sc) << 31);
3224
3225         /*
3226          * We skip the MAC statistics registers because they are clear-on-read.
3227          * Also reading multi-register stats would need to synchronize with the
3228          * periodic mac stats accumulation.  Hard to justify the complexity.
3229          */
3230         memset(buf, 0, cxgb_get_regs_len());
3231         reg_block_dump(sc, buf, 0, A_SG_RSPQ_CREDIT_RETURN);
3232         reg_block_dump(sc, buf, A_SG_HI_DRB_HI_THRSH, A_ULPRX_PBL_ULIMIT);
3233         reg_block_dump(sc, buf, A_ULPTX_CONFIG, A_MPS_INT_CAUSE);
3234         reg_block_dump(sc, buf, A_CPL_SWITCH_CNTRL, A_CPL_MAP_TBL_DATA);
3235         reg_block_dump(sc, buf, A_SMB_GLOBAL_TIME_CFG, A_XGM_SERDES_STAT3);
3236         reg_block_dump(sc, buf, A_XGM_SERDES_STATUS0,
3237                        XGM_REG(A_XGM_SERDES_STAT3, 1));
3238         reg_block_dump(sc, buf, XGM_REG(A_XGM_SERDES_STATUS0, 1),
3239                        XGM_REG(A_XGM_RX_SPI4_SOP_EOP_CNT, 1));
3240 }
3241
3242 static int
3243 alloc_filters(struct adapter *sc)
3244 {
3245         struct filter_info *p;
3246         unsigned int nfilters = sc->params.mc5.nfilters;
3247
3248         if (nfilters == 0)
3249                 return (0);
3250
3251         p = malloc(sizeof(*p) * nfilters, M_DEVBUF, M_WAITOK | M_ZERO);
3252         sc->filters = p;
3253
3254         p = &sc->filters[nfilters - 1];
3255         p->vlan = 0xfff;
3256         p->vlan_prio = FILTER_NO_VLAN_PRI;
3257         p->pass = p->rss = p->valid = p->locked = 1;
3258
3259         return (0);
3260 }
3261
3262 static int
3263 setup_hw_filters(struct adapter *sc)
3264 {
3265         int i, rc;
3266         unsigned int nfilters = sc->params.mc5.nfilters;
3267
3268         if (!sc->filters)
3269                 return (0);
3270
3271         t3_enable_filters(sc);
3272
3273         for (i = rc = 0; i < nfilters && !rc; i++) {
3274                 if (sc->filters[i].locked)
3275                         rc = set_filter(sc, i, &sc->filters[i]);
3276         }
3277
3278         return (rc);
3279 }
3280
3281 static int
3282 set_filter(struct adapter *sc, int id, const struct filter_info *f)
3283 {
3284         int len;
3285         struct mbuf *m;
3286         struct ulp_txpkt *txpkt;
3287         struct work_request_hdr *wr;
3288         struct cpl_pass_open_req *oreq;
3289         struct cpl_set_tcb_field *sreq;
3290
3291         len = sizeof(*wr) + sizeof(*oreq) + 2 * sizeof(*sreq);
3292         KASSERT(len <= MHLEN, ("filter request too big for an mbuf"));
3293
3294         id += t3_mc5_size(&sc->mc5) - sc->params.mc5.nroutes -
3295               sc->params.mc5.nfilters;
3296
3297         m = m_gethdr(M_WAITOK, MT_DATA);
3298         m->m_len = m->m_pkthdr.len = len;
3299         bzero(mtod(m, char *), len);
3300
3301         wr = mtod(m, struct work_request_hdr *);
3302         wr->wrh_hi = htonl(V_WR_OP(FW_WROPCODE_BYPASS) | F_WR_ATOMIC);
3303
3304         oreq = (struct cpl_pass_open_req *)(wr + 1);
3305         txpkt = (struct ulp_txpkt *)oreq;
3306         txpkt->cmd_dest = htonl(V_ULPTX_CMD(ULP_TXPKT));
3307         txpkt->len = htonl(V_ULPTX_NFLITS(sizeof(*oreq) / 8));
3308         OPCODE_TID(oreq) = htonl(MK_OPCODE_TID(CPL_PASS_OPEN_REQ, id));
3309         oreq->local_port = htons(f->dport);
3310         oreq->peer_port = htons(f->sport);
3311         oreq->local_ip = htonl(f->dip);
3312         oreq->peer_ip = htonl(f->sip);
3313         oreq->peer_netmask = htonl(f->sip_mask);
3314         oreq->opt0h = 0;
3315         oreq->opt0l = htonl(F_NO_OFFLOAD);
3316         oreq->opt1 = htonl(V_MAC_MATCH_VALID(f->mac_vld) |
3317                          V_CONN_POLICY(CPL_CONN_POLICY_FILTER) |
3318                          V_VLAN_PRI(f->vlan_prio >> 1) |
3319                          V_VLAN_PRI_VALID(f->vlan_prio != FILTER_NO_VLAN_PRI) |
3320                          V_PKT_TYPE(f->pkt_type) | V_OPT1_VLAN(f->vlan) |
3321                          V_MAC_MATCH(f->mac_idx | (f->mac_hit << 4)));
3322
3323         sreq = (struct cpl_set_tcb_field *)(oreq + 1);
3324         set_tcb_field_ulp(sreq, id, 1, 0x1800808000ULL,
3325                           (f->report_filter_id << 15) | (1 << 23) |
3326                           ((u64)f->pass << 35) | ((u64)!f->rss << 36));
3327         set_tcb_field_ulp(sreq + 1, id, 0, 0xffffffff, (2 << 19) | 1);
3328         t3_mgmt_tx(sc, m);
3329
3330         if (f->pass && !f->rss) {
3331                 len = sizeof(*sreq);
3332                 m = m_gethdr(M_WAITOK, MT_DATA);
3333                 m->m_len = m->m_pkthdr.len = len;
3334                 bzero(mtod(m, char *), len);
3335                 sreq = mtod(m, struct cpl_set_tcb_field *);
3336                 sreq->wr.wrh_hi = htonl(V_WR_OP(FW_WROPCODE_FORWARD));
3337                 mk_set_tcb_field(sreq, id, 25, 0x3f80000,
3338                                  (u64)sc->rrss_map[f->qset] << 19);
3339                 t3_mgmt_tx(sc, m);
3340         }
3341         return 0;
3342 }
3343
3344 static inline void
3345 mk_set_tcb_field(struct cpl_set_tcb_field *req, unsigned int tid,
3346     unsigned int word, u64 mask, u64 val)
3347 {
3348         OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_SET_TCB_FIELD, tid));
3349         req->reply = V_NO_REPLY(1);
3350         req->cpu_idx = 0;
3351         req->word = htons(word);
3352         req->mask = htobe64(mask);
3353         req->val = htobe64(val);
3354 }
3355
3356 static inline void
3357 set_tcb_field_ulp(struct cpl_set_tcb_field *req, unsigned int tid,
3358     unsigned int word, u64 mask, u64 val)
3359 {
3360         struct ulp_txpkt *txpkt = (struct ulp_txpkt *)req;
3361
3362         txpkt->cmd_dest = htonl(V_ULPTX_CMD(ULP_TXPKT));
3363         txpkt->len = htonl(V_ULPTX_NFLITS(sizeof(*req) / 8));
3364         mk_set_tcb_field(req, tid, word, mask, val);
3365 }
3366
3367 void
3368 t3_iterate(void (*func)(struct adapter *, void *), void *arg)
3369 {
3370         struct adapter *sc;
3371
3372         mtx_lock(&t3_list_lock);
3373         SLIST_FOREACH(sc, &t3_list, link) {
3374                 /*
3375                  * func should not make any assumptions about what state sc is
3376                  * in - the only guarantee is that sc->sc_lock is a valid lock.
3377                  */
3378                 func(sc, arg);
3379         }
3380         mtx_unlock(&t3_list_lock);
3381 }
3382
3383 #ifdef TCP_OFFLOAD
3384 static int
3385 toe_capability(struct port_info *pi, int enable)
3386 {
3387         int rc;
3388         struct adapter *sc = pi->adapter;
3389
3390         ADAPTER_LOCK_ASSERT_OWNED(sc);
3391
3392         if (!is_offload(sc))
3393                 return (ENODEV);
3394
3395         if (enable) {
3396                 if (!(sc->flags & FULL_INIT_DONE)) {
3397                         log(LOG_WARNING,
3398                             "You must enable a cxgb interface first\n");
3399                         return (EAGAIN);
3400                 }
3401
3402                 if (isset(&sc->offload_map, pi->port_id))
3403                         return (0);
3404
3405                 if (!(sc->flags & TOM_INIT_DONE)) {
3406                         rc = t3_activate_uld(sc, ULD_TOM);
3407                         if (rc == EAGAIN) {
3408                                 log(LOG_WARNING,
3409                                     "You must kldload t3_tom.ko before trying "
3410                                     "to enable TOE on a cxgb interface.\n");
3411                         }
3412                         if (rc != 0)
3413                                 return (rc);
3414                         KASSERT(sc->tom_softc != NULL,
3415                             ("%s: TOM activated but softc NULL", __func__));
3416                         KASSERT(sc->flags & TOM_INIT_DONE,
3417                             ("%s: TOM activated but flag not set", __func__));
3418                 }
3419
3420                 setbit(&sc->offload_map, pi->port_id);
3421
3422                 /*
3423                  * XXX: Temporary code to allow iWARP to be enabled when TOE is
3424                  * enabled on any port.  Need to figure out how to enable,
3425                  * disable, load, and unload iWARP cleanly.
3426                  */
3427                 if (!isset(&sc->offload_map, MAX_NPORTS) &&
3428                     t3_activate_uld(sc, ULD_IWARP) == 0)
3429                         setbit(&sc->offload_map, MAX_NPORTS);
3430         } else {
3431                 if (!isset(&sc->offload_map, pi->port_id))
3432                         return (0);
3433
3434                 KASSERT(sc->flags & TOM_INIT_DONE,
3435                     ("%s: TOM never initialized?", __func__));
3436                 clrbit(&sc->offload_map, pi->port_id);
3437         }
3438
3439         return (0);
3440 }
3441
3442 /*
3443  * Add an upper layer driver to the global list.
3444  */
3445 int
3446 t3_register_uld(struct uld_info *ui)
3447 {
3448         int rc = 0;
3449         struct uld_info *u;
3450
3451         mtx_lock(&t3_uld_list_lock);
3452         SLIST_FOREACH(u, &t3_uld_list, link) {
3453             if (u->uld_id == ui->uld_id) {
3454                     rc = EEXIST;
3455                     goto done;
3456             }
3457         }
3458
3459         SLIST_INSERT_HEAD(&t3_uld_list, ui, link);
3460         ui->refcount = 0;
3461 done:
3462         mtx_unlock(&t3_uld_list_lock);
3463         return (rc);
3464 }
3465
3466 int
3467 t3_unregister_uld(struct uld_info *ui)
3468 {
3469         int rc = EINVAL;
3470         struct uld_info *u;
3471
3472         mtx_lock(&t3_uld_list_lock);
3473
3474         SLIST_FOREACH(u, &t3_uld_list, link) {
3475             if (u == ui) {
3476                     if (ui->refcount > 0) {
3477                             rc = EBUSY;
3478                             goto done;
3479                     }
3480
3481                     SLIST_REMOVE(&t3_uld_list, ui, uld_info, link);
3482                     rc = 0;
3483                     goto done;
3484             }
3485         }
3486 done:
3487         mtx_unlock(&t3_uld_list_lock);
3488         return (rc);
3489 }
3490
3491 int
3492 t3_activate_uld(struct adapter *sc, int id)
3493 {
3494         int rc = EAGAIN;
3495         struct uld_info *ui;
3496
3497         mtx_lock(&t3_uld_list_lock);
3498
3499         SLIST_FOREACH(ui, &t3_uld_list, link) {
3500                 if (ui->uld_id == id) {
3501                         rc = ui->activate(sc);
3502                         if (rc == 0)
3503                                 ui->refcount++;
3504                         goto done;
3505                 }
3506         }
3507 done:
3508         mtx_unlock(&t3_uld_list_lock);
3509
3510         return (rc);
3511 }
3512
3513 int
3514 t3_deactivate_uld(struct adapter *sc, int id)
3515 {
3516         int rc = EINVAL;
3517         struct uld_info *ui;
3518
3519         mtx_lock(&t3_uld_list_lock);
3520
3521         SLIST_FOREACH(ui, &t3_uld_list, link) {
3522                 if (ui->uld_id == id) {
3523                         rc = ui->deactivate(sc);
3524                         if (rc == 0)
3525                                 ui->refcount--;
3526                         goto done;
3527                 }
3528         }
3529 done:
3530         mtx_unlock(&t3_uld_list_lock);
3531
3532         return (rc);
3533 }
3534
3535 static int
3536 cpl_not_handled(struct sge_qset *qs __unused, struct rsp_desc *r __unused,
3537     struct mbuf *m)
3538 {
3539         m_freem(m);
3540         return (EDOOFUS);
3541 }
3542
3543 int
3544 t3_register_cpl_handler(struct adapter *sc, int opcode, cpl_handler_t h)
3545 {
3546         uintptr_t *loc, new;
3547
3548         if (opcode >= NUM_CPL_HANDLERS)
3549                 return (EINVAL);
3550
3551         new = h ? (uintptr_t)h : (uintptr_t)cpl_not_handled;
3552         loc = (uintptr_t *) &sc->cpl_handler[opcode];
3553         atomic_store_rel_ptr(loc, new);
3554
3555         return (0);
3556 }
3557 #endif
3558
3559 static int
3560 cxgbc_mod_event(module_t mod, int cmd, void *arg)
3561 {
3562         int rc = 0;
3563
3564         switch (cmd) {
3565         case MOD_LOAD:
3566                 mtx_init(&t3_list_lock, "T3 adapters", 0, MTX_DEF);
3567                 SLIST_INIT(&t3_list);
3568 #ifdef TCP_OFFLOAD
3569                 mtx_init(&t3_uld_list_lock, "T3 ULDs", 0, MTX_DEF);
3570                 SLIST_INIT(&t3_uld_list);
3571 #endif
3572                 break;
3573
3574         case MOD_UNLOAD:
3575 #ifdef TCP_OFFLOAD
3576                 mtx_lock(&t3_uld_list_lock);
3577                 if (!SLIST_EMPTY(&t3_uld_list)) {
3578                         rc = EBUSY;
3579                         mtx_unlock(&t3_uld_list_lock);
3580                         break;
3581                 }
3582                 mtx_unlock(&t3_uld_list_lock);
3583                 mtx_destroy(&t3_uld_list_lock);
3584 #endif
3585                 mtx_lock(&t3_list_lock);
3586                 if (!SLIST_EMPTY(&t3_list)) {
3587                         rc = EBUSY;
3588                         mtx_unlock(&t3_list_lock);
3589                         break;
3590                 }
3591                 mtx_unlock(&t3_list_lock);
3592                 mtx_destroy(&t3_list_lock);
3593                 break;
3594         }
3595
3596         return (rc);
3597 }
3598
3599 #ifdef DEBUGNET
3600 static void
3601 cxgb_debugnet_init(struct ifnet *ifp, int *nrxr, int *ncl, int *clsize)
3602 {
3603         struct port_info *pi;
3604         adapter_t *adap;
3605
3606         pi = if_getsoftc(ifp);
3607         adap = pi->adapter;
3608         ADAPTER_LOCK(adap);
3609         *nrxr = adap->nqsets;
3610         *ncl = adap->sge.qs[0].fl[1].size;
3611         *clsize = adap->sge.qs[0].fl[1].buf_size;
3612         ADAPTER_UNLOCK(adap);
3613 }
3614
3615 static void
3616 cxgb_debugnet_event(struct ifnet *ifp, enum debugnet_ev event)
3617 {
3618         struct port_info *pi;
3619         struct sge_qset *qs;
3620         int i;
3621
3622         pi = if_getsoftc(ifp);
3623         if (event == DEBUGNET_START)
3624                 for (i = 0; i < pi->adapter->nqsets; i++) {
3625                         qs = &pi->adapter->sge.qs[i];
3626
3627                         /* Need to reinit after debugnet_mbuf_start(). */
3628                         qs->fl[0].zone = zone_pack;
3629                         qs->fl[1].zone = zone_clust;
3630                         qs->lro.enabled = 0;
3631                 }
3632 }
3633
3634 static int
3635 cxgb_debugnet_transmit(struct ifnet *ifp, struct mbuf *m)
3636 {
3637         struct port_info *pi;
3638         struct sge_qset *qs;
3639
3640         pi = if_getsoftc(ifp);
3641         if ((if_getdrvflags(ifp) & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
3642             IFF_DRV_RUNNING)
3643                 return (ENOENT);
3644
3645         qs = &pi->adapter->sge.qs[pi->first_qset];
3646         return (cxgb_debugnet_encap(qs, &m));
3647 }
3648
3649 static int
3650 cxgb_debugnet_poll(struct ifnet *ifp, int count)
3651 {
3652         struct port_info *pi;
3653         adapter_t *adap;
3654         int i;
3655
3656         pi = if_getsoftc(ifp);
3657         if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0)
3658                 return (ENOENT);
3659
3660         adap = pi->adapter;
3661         for (i = 0; i < adap->nqsets; i++)
3662                 (void)cxgb_debugnet_poll_rx(adap, &adap->sge.qs[i]);
3663         (void)cxgb_debugnet_poll_tx(&adap->sge.qs[pi->first_qset]);
3664         return (0);
3665 }
3666 #endif /* DEBUGNET */