Home | History | Annotate | Line # | Download | only in cxgb
cxgb_main.c revision 1.1.6.2
      1  1.1.6.2  yamt /**************************************************************************
      2  1.1.6.2  yamt 
      3  1.1.6.2  yamt Copyright (c) 2007, Chelsio Inc.
      4  1.1.6.2  yamt All rights reserved.
      5  1.1.6.2  yamt 
      6  1.1.6.2  yamt Redistribution and use in source and binary forms, with or without
      7  1.1.6.2  yamt modification, are permitted provided that the following conditions are met:
      8  1.1.6.2  yamt 
      9  1.1.6.2  yamt  1. Redistributions of source code must retain the above copyright notice,
     10  1.1.6.2  yamt     this list of conditions and the following disclaimer.
     11  1.1.6.2  yamt 
     12  1.1.6.2  yamt  2. Neither the name of the Chelsio Corporation nor the names of its
     13  1.1.6.2  yamt     contributors may be used to endorse or promote products derived from
     14  1.1.6.2  yamt     this software without specific prior written permission.
     15  1.1.6.2  yamt 
     16  1.1.6.2  yamt THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
     17  1.1.6.2  yamt AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     18  1.1.6.2  yamt IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     19  1.1.6.2  yamt ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     20  1.1.6.2  yamt LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     21  1.1.6.2  yamt CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     22  1.1.6.2  yamt SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     23  1.1.6.2  yamt INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     24  1.1.6.2  yamt CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     25  1.1.6.2  yamt ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     26  1.1.6.2  yamt POSSIBILITY OF SUCH DAMAGE.
     27  1.1.6.2  yamt 
     28  1.1.6.2  yamt ***************************************************************************/
     29  1.1.6.2  yamt 
     30  1.1.6.2  yamt #include <sys/cdefs.h>
     31  1.1.6.2  yamt __KERNEL_RCSID(0, "$NetBSD: cxgb_main.c,v 1.1.6.2 2010/08/11 22:54:05 yamt Exp $");
     32  1.1.6.2  yamt 
     33  1.1.6.2  yamt #include <sys/param.h>
     34  1.1.6.2  yamt #include <sys/systm.h>
     35  1.1.6.2  yamt #include <sys/kernel.h>
     36  1.1.6.2  yamt #include <sys/conf.h>
     37  1.1.6.2  yamt #include <machine/bus.h>
     38  1.1.6.2  yamt #include <sys/ioccom.h>
     39  1.1.6.2  yamt #include <sys/mbuf.h>
     40  1.1.6.2  yamt #include <sys/socket.h>
     41  1.1.6.2  yamt #include <sys/sockio.h>
     42  1.1.6.2  yamt #include <sys/sysctl.h>
     43  1.1.6.2  yamt #include <sys/queue.h>
     44  1.1.6.2  yamt 
     45  1.1.6.2  yamt #include <net/bpf.h>
     46  1.1.6.2  yamt #include <net/if.h>
     47  1.1.6.2  yamt #include <net/if_arp.h>
     48  1.1.6.2  yamt #include <net/if_dl.h>
     49  1.1.6.2  yamt #include <net/if_media.h>
     50  1.1.6.2  yamt #include <net/if_types.h>
     51  1.1.6.2  yamt 
     52  1.1.6.2  yamt #include <netinet/in_systm.h>
     53  1.1.6.2  yamt #include <netinet/in.h>
     54  1.1.6.2  yamt #include <netinet/ip.h>
     55  1.1.6.2  yamt #include <netinet/ip.h>
     56  1.1.6.2  yamt #include <netinet/tcp.h>
     57  1.1.6.2  yamt #include <netinet/udp.h>
     58  1.1.6.2  yamt #include <netinet/if_inarp.h>
     59  1.1.6.2  yamt 
     60  1.1.6.2  yamt #include <dev/pci/pcireg.h>
     61  1.1.6.2  yamt #include <dev/pci/pcivar.h>
     62  1.1.6.2  yamt 
     63  1.1.6.2  yamt #ifdef CONFIG_DEFINED
     64  1.1.6.2  yamt #include <cxgb_include.h>
     65  1.1.6.2  yamt #else
     66  1.1.6.2  yamt #include <dev/pci/cxgb/cxgb_include.h>
     67  1.1.6.2  yamt #endif
     68  1.1.6.2  yamt 
     69  1.1.6.2  yamt #ifdef PRIV_SUPPORTED
     70  1.1.6.2  yamt #include <sys/priv.h>
     71  1.1.6.2  yamt #endif
     72  1.1.6.2  yamt 
     73  1.1.6.2  yamt #include <altq/altq_conf.h>
     74  1.1.6.2  yamt 
     75  1.1.6.2  yamt static int cxgb_setup_msix(adapter_t *, int);
     76  1.1.6.2  yamt static void cxgb_teardown_msix(adapter_t *);
     77  1.1.6.2  yamt static int cxgb_init(struct ifnet *);
     78  1.1.6.2  yamt static void cxgb_init_locked(struct port_info *);
     79  1.1.6.2  yamt static void cxgb_stop_locked(struct port_info *);
     80  1.1.6.2  yamt static void cxgb_set_rxmode(struct port_info *);
     81  1.1.6.2  yamt static int cxgb_ioctl(struct ifnet *, unsigned long, void *);
     82  1.1.6.2  yamt static void cxgb_start(struct ifnet *);
     83  1.1.6.2  yamt static void cxgb_stop(struct ifnet *, int);
     84  1.1.6.2  yamt static void cxgb_start_proc(struct work *, void *);
     85  1.1.6.2  yamt static int cxgb_media_change(struct ifnet *);
     86  1.1.6.2  yamt static void cxgb_media_status(struct ifnet *, struct ifmediareq *);
     87  1.1.6.2  yamt static int setup_sge_qsets(adapter_t *);
     88  1.1.6.2  yamt static int cxgb_async_intr(void *);
     89  1.1.6.2  yamt static void cxgb_ext_intr_handler(struct work *, void *);
     90  1.1.6.2  yamt static void cxgb_tick_handler(struct work *, void *);
     91  1.1.6.2  yamt static void cxgb_down_locked(struct adapter *sc);
     92  1.1.6.2  yamt static void cxgb_tick(void *);
     93  1.1.6.2  yamt static void setup_rss(adapter_t *sc);
     94  1.1.6.2  yamt 
     95  1.1.6.2  yamt /* Attachment glue for the PCI controller end of the device.  Each port of
     96  1.1.6.2  yamt  * the device is attached separately, as defined later.
     97  1.1.6.2  yamt  */
     98  1.1.6.2  yamt static int cxgb_controller_match(device_t dev, cfdata_t match, void *context);
     99  1.1.6.2  yamt static void cxgb_controller_attach(device_t parent, device_t dev, void *context);
    100  1.1.6.2  yamt static int cxgb_controller_detach(device_t dev, int flags);
    101  1.1.6.2  yamt static void cxgb_free(struct adapter *);
    102  1.1.6.2  yamt static __inline void reg_block_dump(struct adapter *ap, uint8_t *buf, unsigned int start,
    103  1.1.6.2  yamt     unsigned int end);
    104  1.1.6.2  yamt static void touch_bars(device_t dev);
    105  1.1.6.2  yamt 
    106  1.1.6.2  yamt #ifdef notyet
    107  1.1.6.2  yamt static int offload_close(struct toedev *tdev);
    108  1.1.6.2  yamt #endif
    109  1.1.6.2  yamt 
    110  1.1.6.2  yamt 
    111  1.1.6.2  yamt CFATTACH_DECL(cxgbc, sizeof(struct adapter), cxgb_controller_match, cxgb_controller_attach, cxgb_controller_detach, NULL);
    112  1.1.6.2  yamt 
    113  1.1.6.2  yamt /*
    114  1.1.6.2  yamt  * Attachment glue for the ports.  Attachment is done directly to the
    115  1.1.6.2  yamt  * controller device.
    116  1.1.6.2  yamt  */
    117  1.1.6.2  yamt static int cxgb_port_match(device_t dev, cfdata_t match, void *context);
    118  1.1.6.2  yamt static void cxgb_port_attach(device_t dev, device_t self, void *context);
    119  1.1.6.2  yamt static int cxgb_port_detach(device_t dev, int flags);
    120  1.1.6.2  yamt 
    121  1.1.6.2  yamt CFATTACH_DECL(cxgb, sizeof(struct port_device), cxgb_port_match, cxgb_port_attach, cxgb_port_detach, NULL);
    122  1.1.6.2  yamt 
    123  1.1.6.2  yamt #define SGE_MSIX_COUNT (SGE_QSETS + 1)
    124  1.1.6.2  yamt 
    125  1.1.6.2  yamt extern int collapse_mbufs;
    126  1.1.6.2  yamt #ifdef MSI_SUPPORTED
    127  1.1.6.2  yamt /*
    128  1.1.6.2  yamt  * The driver uses the best interrupt scheme available on a platform in the
    129  1.1.6.2  yamt  * order MSI-X, MSI, legacy pin interrupts.  This parameter determines which
    130  1.1.6.2  yamt  * of these schemes the driver may consider as follows:
    131  1.1.6.2  yamt  *
    132  1.1.6.2  yamt  * msi = 2: choose from among all three options
    133  1.1.6.2  yamt  * msi = 1 : only consider MSI and pin interrupts
    134  1.1.6.2  yamt  * msi = 0: force pin interrupts
    135  1.1.6.2  yamt  */
    136  1.1.6.2  yamt static int msi_allowed = 2;
    137  1.1.6.2  yamt #endif
    138  1.1.6.2  yamt 
    139  1.1.6.2  yamt /*
    140  1.1.6.2  yamt  * The driver uses an auto-queue algorithm by default.
    141  1.1.6.2  yamt  * To disable it and force a single queue-set per port, use singleq = 1.
    142  1.1.6.2  yamt  */
    143  1.1.6.2  yamt static int singleq = 1;
    144  1.1.6.2  yamt 
    145  1.1.6.2  yamt enum {
    146  1.1.6.2  yamt     MAX_TXQ_ENTRIES      = 16384,
    147  1.1.6.2  yamt     MAX_CTRL_TXQ_ENTRIES = 1024,
    148  1.1.6.2  yamt     MAX_RSPQ_ENTRIES     = 16384,
    149  1.1.6.2  yamt     MAX_RX_BUFFERS       = 16384,
    150  1.1.6.2  yamt     MAX_RX_JUMBO_BUFFERS = 16384,
    151  1.1.6.2  yamt     MIN_TXQ_ENTRIES      = 4,
    152  1.1.6.2  yamt     MIN_CTRL_TXQ_ENTRIES = 4,
    153  1.1.6.2  yamt     MIN_RSPQ_ENTRIES     = 32,
    154  1.1.6.2  yamt     MIN_FL_ENTRIES       = 32,
    155  1.1.6.2  yamt     MIN_FL_JUMBO_ENTRIES = 32
    156  1.1.6.2  yamt };
    157  1.1.6.2  yamt 
    158  1.1.6.2  yamt struct filter_info {
    159  1.1.6.2  yamt     u32 sip;
    160  1.1.6.2  yamt     u32 sip_mask;
    161  1.1.6.2  yamt     u32 dip;
    162  1.1.6.2  yamt     u16 sport;
    163  1.1.6.2  yamt     u16 dport;
    164  1.1.6.2  yamt     u32 vlan:12;
    165  1.1.6.2  yamt     u32 vlan_prio:3;
    166  1.1.6.2  yamt     u32 mac_hit:1;
    167  1.1.6.2  yamt     u32 mac_idx:4;
    168  1.1.6.2  yamt     u32 mac_vld:1;
    169  1.1.6.2  yamt     u32 pkt_type:2;
    170  1.1.6.2  yamt     u32 report_filter_id:1;
    171  1.1.6.2  yamt     u32 pass:1;
    172  1.1.6.2  yamt     u32 rss:1;
    173  1.1.6.2  yamt     u32 qset:3;
    174  1.1.6.2  yamt     u32 locked:1;
    175  1.1.6.2  yamt     u32 valid:1;
    176  1.1.6.2  yamt };
    177  1.1.6.2  yamt 
    178  1.1.6.2  yamt enum { FILTER_NO_VLAN_PRI = 7 };
    179  1.1.6.2  yamt 
    180  1.1.6.2  yamt #define PORT_MASK ((1 << MAX_NPORTS) - 1)
    181  1.1.6.2  yamt 
    182  1.1.6.2  yamt /* Table for probing the cards.  The desc field isn't actually used */
    183  1.1.6.2  yamt struct cxgb_ident {
    184  1.1.6.2  yamt     uint16_t    vendor;
    185  1.1.6.2  yamt     uint16_t    device;
    186  1.1.6.2  yamt     int         index;
    187  1.1.6.2  yamt     const char  *desc;
    188  1.1.6.2  yamt } cxgb_identifiers[] = {
    189  1.1.6.2  yamt     {PCI_VENDOR_ID_CHELSIO, 0x0020, 0, "PE9000"},
    190  1.1.6.2  yamt     {PCI_VENDOR_ID_CHELSIO, 0x0021, 1, "T302E"},
    191  1.1.6.2  yamt     {PCI_VENDOR_ID_CHELSIO, 0x0022, 2, "T310E"},
    192  1.1.6.2  yamt     {PCI_VENDOR_ID_CHELSIO, 0x0023, 3, "T320X"},
    193  1.1.6.2  yamt     {PCI_VENDOR_ID_CHELSIO, 0x0024, 1, "T302X"},
    194  1.1.6.2  yamt     {PCI_VENDOR_ID_CHELSIO, 0x0025, 3, "T320E"},
    195  1.1.6.2  yamt     {PCI_VENDOR_ID_CHELSIO, 0x0026, 2, "T310X"},
    196  1.1.6.2  yamt     {PCI_VENDOR_ID_CHELSIO, 0x0030, 2, "T3B10"},
    197  1.1.6.2  yamt     {PCI_VENDOR_ID_CHELSIO, 0x0031, 3, "T3B20"},
    198  1.1.6.2  yamt     {PCI_VENDOR_ID_CHELSIO, 0x0032, 1, "T3B02"},
    199  1.1.6.2  yamt     {PCI_VENDOR_ID_CHELSIO, 0x0033, 4, "T3B04"},
    200  1.1.6.2  yamt     {0, 0, 0, NULL}
    201  1.1.6.2  yamt };
    202  1.1.6.2  yamt 
    203  1.1.6.2  yamt 
    204  1.1.6.2  yamt static inline char
    205  1.1.6.2  yamt t3rev2char(struct adapter *adapter)
    206  1.1.6.2  yamt {
    207  1.1.6.2  yamt     char rev = 'z';
    208  1.1.6.2  yamt 
    209  1.1.6.2  yamt     switch(adapter->params.rev) {
    210  1.1.6.2  yamt     case T3_REV_A:
    211  1.1.6.2  yamt         rev = 'a';
    212  1.1.6.2  yamt         break;
    213  1.1.6.2  yamt     case T3_REV_B:
    214  1.1.6.2  yamt     case T3_REV_B2:
    215  1.1.6.2  yamt         rev = 'b';
    216  1.1.6.2  yamt         break;
    217  1.1.6.2  yamt     case T3_REV_C:
    218  1.1.6.2  yamt         rev = 'c';
    219  1.1.6.2  yamt         break;
    220  1.1.6.2  yamt     }
    221  1.1.6.2  yamt     return rev;
    222  1.1.6.2  yamt }
    223  1.1.6.2  yamt 
    224  1.1.6.2  yamt static struct cxgb_ident *cxgb_get_ident(struct pci_attach_args *pa)
    225  1.1.6.2  yamt {
    226  1.1.6.2  yamt     struct cxgb_ident *id;
    227  1.1.6.2  yamt     int vendorid, deviceid;
    228  1.1.6.2  yamt 
    229  1.1.6.2  yamt     vendorid = PCI_VENDOR(pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_ID_REG));
    230  1.1.6.2  yamt     deviceid = PCI_PRODUCT(pci_conf_read(pa->pa_pc, pa->pa_tag, PCI_ID_REG));
    231  1.1.6.2  yamt 
    232  1.1.6.2  yamt     for (id = cxgb_identifiers; id->desc != NULL; id++) {
    233  1.1.6.2  yamt         if ((id->vendor == vendorid) &&
    234  1.1.6.2  yamt             (id->device == deviceid)) {
    235  1.1.6.2  yamt             return (id);
    236  1.1.6.2  yamt         }
    237  1.1.6.2  yamt     }
    238  1.1.6.2  yamt     return (NULL);
    239  1.1.6.2  yamt }
    240  1.1.6.2  yamt 
    241  1.1.6.2  yamt static const struct adapter_info *cxgb_get_adapter_info(struct pci_attach_args *pa)
    242  1.1.6.2  yamt {
    243  1.1.6.2  yamt     struct cxgb_ident *id;
    244  1.1.6.2  yamt     const struct adapter_info *ai;
    245  1.1.6.2  yamt 
    246  1.1.6.2  yamt     id = cxgb_get_ident(pa);
    247  1.1.6.2  yamt     if (id == NULL)
    248  1.1.6.2  yamt         return (NULL);
    249  1.1.6.2  yamt 
    250  1.1.6.2  yamt     ai = t3_get_adapter_info(id->index);
    251  1.1.6.2  yamt     return (ai);
    252  1.1.6.2  yamt }
    253  1.1.6.2  yamt 
    254  1.1.6.2  yamt static int cxgb_controller_match(device_t dev, cfdata_t match, void *context)
    255  1.1.6.2  yamt {
    256  1.1.6.2  yamt     struct pci_attach_args *pa = context;
    257  1.1.6.2  yamt     const struct adapter_info *ai;
    258  1.1.6.2  yamt 
    259  1.1.6.2  yamt     ai = cxgb_get_adapter_info(pa);
    260  1.1.6.2  yamt     if (ai == NULL)
    261  1.1.6.2  yamt         return (0);
    262  1.1.6.2  yamt 
    263  1.1.6.2  yamt     return (100); // we ARE the best driver for this card!!
    264  1.1.6.2  yamt }
    265  1.1.6.2  yamt 
    266  1.1.6.2  yamt #define FW_FNAME "t3fw%d%d%d"
    267  1.1.6.2  yamt #define TPEEPROM_NAME "t3%ctpe%d%d%d"
    268  1.1.6.2  yamt #define TPSRAM_NAME "t3%cps%d%d%d"
    269  1.1.6.2  yamt 
    270  1.1.6.2  yamt int cxgb_cfprint(void *aux, const char *info);
    271  1.1.6.2  yamt int cxgb_cfprint(void *aux, const char *info)
    272  1.1.6.2  yamt {
    273  1.1.6.2  yamt     if (info)
    274  1.1.6.2  yamt     {
    275  1.1.6.2  yamt         printf("cxgb_cfprint(%p, \"%s\")\n", aux, info);
    276  1.1.6.2  yamt         INT3;
    277  1.1.6.2  yamt     }
    278  1.1.6.2  yamt 
    279  1.1.6.2  yamt     return (QUIET);
    280  1.1.6.2  yamt }
    281  1.1.6.2  yamt 
    282  1.1.6.2  yamt void cxgb_make_task(void *context)
    283  1.1.6.2  yamt {
    284  1.1.6.2  yamt     struct cxgb_task *w = (struct cxgb_task *)context;
    285  1.1.6.2  yamt 
    286  1.1.6.2  yamt     // we can only use workqueue_create() once the system is up and running
    287  1.1.6.2  yamt     workqueue_create(&w->wq, w->name, w->func, w->context, PRIBIO, IPL_NET, 0);
    288  1.1.6.2  yamt //  printf("======>> create workqueue for %s %p\n", w->name, w->wq);
    289  1.1.6.2  yamt }
    290  1.1.6.2  yamt 
    291  1.1.6.2  yamt static void
    292  1.1.6.2  yamt cxgb_controller_attach(device_t parent, device_t dev, void *context)
    293  1.1.6.2  yamt {
    294  1.1.6.2  yamt     device_t child;
    295  1.1.6.2  yamt     const struct adapter_info *ai;
    296  1.1.6.2  yamt     struct adapter *sc;
    297  1.1.6.2  yamt     struct pci_attach_args *pa = context;
    298  1.1.6.2  yamt     struct cxgb_attach_args cxgb_args;
    299  1.1.6.2  yamt     int locs[2];
    300  1.1.6.2  yamt     int i, error = 0;
    301  1.1.6.2  yamt     uint32_t vers;
    302  1.1.6.2  yamt     int port_qsets = 1;
    303  1.1.6.2  yamt     int reg;
    304  1.1.6.2  yamt #ifdef MSI_SUPPORTED
    305  1.1.6.2  yamt     int msi_needed;
    306  1.1.6.2  yamt #endif
    307  1.1.6.2  yamt 
    308  1.1.6.2  yamt     sc = device_private(dev);
    309  1.1.6.2  yamt     sc->dev = dev;
    310  1.1.6.2  yamt     memcpy(&sc->pa, pa, sizeof(struct pci_attach_args));
    311  1.1.6.2  yamt     sc->msi_count = 0;
    312  1.1.6.2  yamt     ai = cxgb_get_adapter_info(pa);
    313  1.1.6.2  yamt 
    314  1.1.6.2  yamt     /*
    315  1.1.6.2  yamt      * XXX not really related but a recent addition
    316  1.1.6.2  yamt      */
    317  1.1.6.2  yamt #ifdef MSI_SUPPORTED
    318  1.1.6.2  yamt     /* find the PCIe link width and set max read request to 4KB*/
    319  1.1.6.2  yamt     if (pci_find_extcap(dev, PCIY_EXPRESS, &reg) == 0) {
    320  1.1.6.2  yamt         uint16_t lnk, pectl;
    321  1.1.6.2  yamt         lnk = pci_read_config(dev, reg + 0x12, 2);
    322  1.1.6.2  yamt         sc->link_width = (lnk >> 4) & 0x3f;
    323  1.1.6.2  yamt 
    324  1.1.6.2  yamt         pectl = pci_read_config(dev, reg + 0x8, 2);
    325  1.1.6.2  yamt         pectl = (pectl & ~0x7000) | (5 << 12);
    326  1.1.6.2  yamt         pci_write_config(dev, reg + 0x8, pectl, 2);
    327  1.1.6.2  yamt     }
    328  1.1.6.2  yamt 
    329  1.1.6.2  yamt     if (sc->link_width != 0 && sc->link_width <= 4 &&
    330  1.1.6.2  yamt         (ai->nports0 + ai->nports1) <= 2) {
    331  1.1.6.2  yamt         device_printf(sc->dev,
    332  1.1.6.2  yamt             "PCIe x%d Link, expect reduced performance\n",
    333  1.1.6.2  yamt             sc->link_width);
    334  1.1.6.2  yamt     }
    335  1.1.6.2  yamt #endif
    336  1.1.6.2  yamt 
    337  1.1.6.2  yamt     touch_bars(dev);
    338  1.1.6.2  yamt 
    339  1.1.6.2  yamt     pci_enable_busmaster(dev);
    340  1.1.6.2  yamt 
    341  1.1.6.2  yamt     /*
    342  1.1.6.2  yamt      * Allocate the registers and make them available to the driver.
    343  1.1.6.2  yamt      * The registers that we care about for NIC mode are in BAR 0
    344  1.1.6.2  yamt      */
    345  1.1.6.2  yamt 	sc->regs_rid = PCI_MAPREG_START;
    346  1.1.6.2  yamt 	t3_os_pci_read_config_4(sc, PCI_MAPREG_START, &reg);
    347  1.1.6.2  yamt 
    348  1.1.6.2  yamt 	// call bus_space_map
    349  1.1.6.2  yamt 	sc->bar0 = reg&0xFFFFF000;
    350  1.1.6.2  yamt 	bus_space_map(sc->pa.pa_memt, sc->bar0, 4096, 0, &sc->bar0_handle);
    351  1.1.6.2  yamt 
    352  1.1.6.2  yamt     MTX_INIT(&sc->sge.reg_lock, sc->reglockbuf, NULL, MTX_DEF);
    353  1.1.6.2  yamt     MTX_INIT(&sc->mdio_lock, sc->mdiolockbuf, NULL, MTX_DEF);
    354  1.1.6.2  yamt     MTX_INIT(&sc->elmer_lock, sc->elmerlockbuf, NULL, MTX_DEF);
    355  1.1.6.2  yamt 
    356  1.1.6.2  yamt     sc->bt = sc->pa.pa_memt;
    357  1.1.6.2  yamt     sc->bh = sc->bar0_handle;
    358  1.1.6.2  yamt     sc->mmio_len = 4096;
    359  1.1.6.2  yamt 
    360  1.1.6.2  yamt     if (t3_prep_adapter(sc, ai, 1) < 0) {
    361  1.1.6.2  yamt         printf("prep adapter failed\n");
    362  1.1.6.2  yamt         error = ENODEV;
    363  1.1.6.2  yamt         goto out;
    364  1.1.6.2  yamt     }
    365  1.1.6.2  yamt     /* Allocate the BAR for doing MSI-X.  If it succeeds, try to allocate
    366  1.1.6.2  yamt      * enough messages for the queue sets.  If that fails, try falling
    367  1.1.6.2  yamt      * back to MSI.  If that fails, then try falling back to the legacy
    368  1.1.6.2  yamt      * interrupt pin model.
    369  1.1.6.2  yamt      */
    370  1.1.6.2  yamt #ifdef MSI_SUPPORTED
    371  1.1.6.2  yamt 
    372  1.1.6.2  yamt     sc->msix_regs_rid = 0x20;
    373  1.1.6.2  yamt     if ((msi_allowed >= 2) &&
    374  1.1.6.2  yamt         (sc->msix_regs_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
    375  1.1.6.2  yamt         &sc->msix_regs_rid, RF_ACTIVE)) != NULL) {
    376  1.1.6.2  yamt 
    377  1.1.6.2  yamt         msi_needed = sc->msi_count = SGE_MSIX_COUNT;
    378  1.1.6.2  yamt 
    379  1.1.6.2  yamt         if (((error = pci_alloc_msix(dev, &sc->msi_count)) != 0) ||
    380  1.1.6.2  yamt             (sc->msi_count != msi_needed)) {
    381  1.1.6.2  yamt             device_printf(dev, "msix allocation failed - msi_count = %d"
    382  1.1.6.2  yamt                 " msi_needed=%d will try msi err=%d\n", sc->msi_count,
    383  1.1.6.2  yamt                 msi_needed, error);
    384  1.1.6.2  yamt             sc->msi_count = 0;
    385  1.1.6.2  yamt             pci_release_msi(dev);
    386  1.1.6.2  yamt             bus_release_resource(dev, SYS_RES_MEMORY,
    387  1.1.6.2  yamt                 sc->msix_regs_rid, sc->msix_regs_res);
    388  1.1.6.2  yamt             sc->msix_regs_res = NULL;
    389  1.1.6.2  yamt         } else {
    390  1.1.6.2  yamt             sc->flags |= USING_MSIX;
    391  1.1.6.2  yamt             sc->cxgb_intr = t3_intr_msix;
    392  1.1.6.2  yamt         }
    393  1.1.6.2  yamt     }
    394  1.1.6.2  yamt 
    395  1.1.6.2  yamt     if ((msi_allowed >= 1) && (sc->msi_count == 0)) {
    396  1.1.6.2  yamt         sc->msi_count = 1;
    397  1.1.6.2  yamt         if (pci_alloc_msi(dev, &sc->msi_count)) {
    398  1.1.6.2  yamt             device_printf(dev, "alloc msi failed - will try INTx\n");
    399  1.1.6.2  yamt             sc->msi_count = 0;
    400  1.1.6.2  yamt             pci_release_msi(dev);
    401  1.1.6.2  yamt         } else {
    402  1.1.6.2  yamt             sc->flags |= USING_MSI;
    403  1.1.6.2  yamt             sc->irq_rid = 1;
    404  1.1.6.2  yamt             sc->cxgb_intr = t3_intr_msi;
    405  1.1.6.2  yamt         }
    406  1.1.6.2  yamt     }
    407  1.1.6.2  yamt #endif
    408  1.1.6.2  yamt     if (sc->msi_count == 0) {
    409  1.1.6.2  yamt         device_printf(dev, "using line interrupts\n");
    410  1.1.6.2  yamt         sc->irq_rid = 0;
    411  1.1.6.2  yamt         sc->cxgb_intr = t3b_intr;
    412  1.1.6.2  yamt     }
    413  1.1.6.2  yamt 
    414  1.1.6.2  yamt     sc->ext_intr_task.name = "cxgb_ext_intr_handler";
    415  1.1.6.2  yamt     sc->ext_intr_task.func = cxgb_ext_intr_handler;
    416  1.1.6.2  yamt     sc->ext_intr_task.context = sc;
    417  1.1.6.2  yamt     kthread_create(PRI_NONE, 0, NULL, cxgb_make_task, &sc->ext_intr_task, NULL, "cxgb_make_task");
    418  1.1.6.2  yamt 
    419  1.1.6.2  yamt     sc->tick_task.name = "cxgb_tick_handler";
    420  1.1.6.2  yamt     sc->tick_task.func = cxgb_tick_handler;
    421  1.1.6.2  yamt     sc->tick_task.context = sc;
    422  1.1.6.2  yamt     kthread_create(PRI_NONE, 0, NULL, cxgb_make_task, &sc->tick_task, NULL, "cxgb_make_task");
    423  1.1.6.2  yamt 
    424  1.1.6.2  yamt     /* Create a periodic callout for checking adapter status */
    425  1.1.6.2  yamt     callout_init(&sc->cxgb_tick_ch, 0);
    426  1.1.6.2  yamt 
    427  1.1.6.2  yamt     if (t3_check_fw_version(sc) != 0) {
    428  1.1.6.2  yamt         /*
    429  1.1.6.2  yamt          * Warn user that a firmware update will be attempted in init.
    430  1.1.6.2  yamt          */
    431  1.1.6.2  yamt         device_printf(dev, "firmware needs to be updated to version %d.%d.%d\n",
    432  1.1.6.2  yamt             FW_VERSION_MAJOR, FW_VERSION_MINOR, FW_VERSION_MICRO);
    433  1.1.6.2  yamt         sc->flags &= ~FW_UPTODATE;
    434  1.1.6.2  yamt     } else {
    435  1.1.6.2  yamt         sc->flags |= FW_UPTODATE;
    436  1.1.6.2  yamt     }
    437  1.1.6.2  yamt 
    438  1.1.6.2  yamt     if (t3_check_tpsram_version(sc) != 0) {
    439  1.1.6.2  yamt         /*
    440  1.1.6.2  yamt          * Warn user that a firmware update will be attempted in init.
    441  1.1.6.2  yamt          */
    442  1.1.6.2  yamt         device_printf(dev, "SRAM needs to be updated to version %c-%d.%d.%d\n",
    443  1.1.6.2  yamt             t3rev2char(sc), TP_VERSION_MAJOR, TP_VERSION_MINOR, TP_VERSION_MICRO);
    444  1.1.6.2  yamt         sc->flags &= ~TPS_UPTODATE;
    445  1.1.6.2  yamt     } else {
    446  1.1.6.2  yamt         sc->flags |= TPS_UPTODATE;
    447  1.1.6.2  yamt     }
    448  1.1.6.2  yamt 
    449  1.1.6.2  yamt     if ((sc->flags & USING_MSIX) && !singleq)
    450  1.1.6.2  yamt         port_qsets = (SGE_QSETS/(sc)->params.nports);
    451  1.1.6.2  yamt 
    452  1.1.6.2  yamt     /*
    453  1.1.6.2  yamt      * Create a child device for each MAC.  The ethernet attachment
    454  1.1.6.2  yamt      * will be done in these children.
    455  1.1.6.2  yamt      */
    456  1.1.6.2  yamt     for (i = 0; i < (sc)->params.nports; i++) {
    457  1.1.6.2  yamt         struct port_info *pi;
    458  1.1.6.2  yamt 
    459  1.1.6.2  yamt         pi = &sc->port[i];
    460  1.1.6.2  yamt         pi->adapter = sc;
    461  1.1.6.2  yamt         pi->nqsets = port_qsets;
    462  1.1.6.2  yamt         pi->first_qset = i*port_qsets;
    463  1.1.6.2  yamt         pi->port_id = i;
    464  1.1.6.2  yamt         pi->tx_chan = i >= ai->nports0;
    465  1.1.6.2  yamt         pi->txpkt_intf = pi->tx_chan ? 2 * (i - ai->nports0) + 1 : 2 * i;
    466  1.1.6.2  yamt         sc->rxpkt_map[pi->txpkt_intf] = i;
    467  1.1.6.2  yamt         cxgb_args.port = i;
    468  1.1.6.2  yamt         locs[0] = 1;
    469  1.1.6.2  yamt         locs[1] = i;
    470  1.1.6.2  yamt 	printf("\n"); // for cleaner formatting in dmesg
    471  1.1.6.2  yamt         child = config_found_sm_loc(dev, "cxgbc", locs, &cxgb_args,
    472  1.1.6.2  yamt                     cxgb_cfprint, config_stdsubmatch);
    473  1.1.6.2  yamt 	printf("\n"); // for cleaner formatting in dmesg
    474  1.1.6.2  yamt         sc->portdev[i] = child;
    475  1.1.6.2  yamt     }
    476  1.1.6.2  yamt 
    477  1.1.6.2  yamt     /*
    478  1.1.6.2  yamt      * XXX need to poll for link status
    479  1.1.6.2  yamt      */
    480  1.1.6.2  yamt     sc->params.stats_update_period = 1;
    481  1.1.6.2  yamt 
    482  1.1.6.2  yamt     /* initialize sge private state */
    483  1.1.6.2  yamt     t3_sge_init_adapter(sc);
    484  1.1.6.2  yamt 
    485  1.1.6.2  yamt     t3_led_ready(sc);
    486  1.1.6.2  yamt 
    487  1.1.6.2  yamt     error = t3_get_fw_version(sc, &vers);
    488  1.1.6.2  yamt     if (error)
    489  1.1.6.2  yamt         goto out;
    490  1.1.6.2  yamt 
    491  1.1.6.2  yamt     snprintf(&sc->fw_version[0], sizeof(sc->fw_version), "%d.%d.%d",
    492  1.1.6.2  yamt         G_FW_VERSION_MAJOR(vers), G_FW_VERSION_MINOR(vers),
    493  1.1.6.2  yamt         G_FW_VERSION_MICRO(vers));
    494  1.1.6.2  yamt out:
    495  1.1.6.2  yamt     if (error)
    496  1.1.6.2  yamt     {
    497  1.1.6.2  yamt         cxgb_free(sc);
    498  1.1.6.2  yamt     }
    499  1.1.6.2  yamt }
    500  1.1.6.2  yamt 
    501  1.1.6.2  yamt static int
    502  1.1.6.2  yamt cxgb_controller_detach(device_t dev, int flags)
    503  1.1.6.2  yamt {
    504  1.1.6.2  yamt     struct adapter *sc;
    505  1.1.6.2  yamt 
    506  1.1.6.2  yamt     sc = device_private(dev);
    507  1.1.6.2  yamt 
    508  1.1.6.2  yamt     cxgb_free(sc);
    509  1.1.6.2  yamt 
    510  1.1.6.2  yamt     return (0);
    511  1.1.6.2  yamt }
    512  1.1.6.2  yamt 
    513  1.1.6.2  yamt static void
    514  1.1.6.2  yamt cxgb_free(struct adapter *sc)
    515  1.1.6.2  yamt {
    516  1.1.6.2  yamt     int i;
    517  1.1.6.2  yamt 
    518  1.1.6.2  yamt     ADAPTER_LOCK(sc);
    519  1.1.6.2  yamt     /*
    520  1.1.6.2  yamt      * drops the lock
    521  1.1.6.2  yamt      */
    522  1.1.6.2  yamt     cxgb_down_locked(sc);
    523  1.1.6.2  yamt 
    524  1.1.6.2  yamt #ifdef MSI_SUPPORTED
    525  1.1.6.2  yamt     if (sc->flags & (USING_MSI | USING_MSIX)) {
    526  1.1.6.2  yamt         device_printf(sc->dev, "releasing msi message(s)\n");
    527  1.1.6.2  yamt         pci_release_msi(sc->dev);
    528  1.1.6.2  yamt     } else {
    529  1.1.6.2  yamt         device_printf(sc->dev, "no msi message to release\n");
    530  1.1.6.2  yamt     }
    531  1.1.6.2  yamt     if (sc->msix_regs_res != NULL) {
    532  1.1.6.2  yamt         bus_release_resource(sc->dev, SYS_RES_MEMORY, sc->msix_regs_rid,
    533  1.1.6.2  yamt             sc->msix_regs_res);
    534  1.1.6.2  yamt     }
    535  1.1.6.2  yamt #endif
    536  1.1.6.2  yamt 
    537  1.1.6.2  yamt     t3_sge_deinit_sw(sc);
    538  1.1.6.2  yamt     /*
    539  1.1.6.2  yamt      * Wait for last callout
    540  1.1.6.2  yamt      */
    541  1.1.6.2  yamt 
    542  1.1.6.2  yamt     tsleep(&sc, 0, "cxgb unload", 3*hz);
    543  1.1.6.2  yamt 
    544  1.1.6.2  yamt     for (i = 0; i < (sc)->params.nports; ++i) {
    545  1.1.6.2  yamt         if (sc->portdev[i] != NULL)
    546  1.1.6.2  yamt 	{
    547  1.1.6.2  yamt 		INT3;
    548  1.1.6.2  yamt 	}
    549  1.1.6.2  yamt     }
    550  1.1.6.2  yamt 
    551  1.1.6.2  yamt #ifdef notyet
    552  1.1.6.2  yamt     if (is_offload(sc)) {
    553  1.1.6.2  yamt         cxgb_adapter_unofld(sc);
    554  1.1.6.2  yamt         if (isset(&sc->open_device_map, OFFLOAD_DEVMAP_BIT))
    555  1.1.6.2  yamt             offload_close(&sc->tdev);
    556  1.1.6.2  yamt     }
    557  1.1.6.2  yamt #endif
    558  1.1.6.2  yamt 
    559  1.1.6.2  yamt     t3_free_sge_resources(sc);
    560  1.1.6.2  yamt     free(sc->filters, M_DEVBUF);
    561  1.1.6.2  yamt     t3_sge_free(sc);
    562  1.1.6.2  yamt 
    563  1.1.6.2  yamt     MTX_DESTROY(&sc->mdio_lock);
    564  1.1.6.2  yamt     MTX_DESTROY(&sc->sge.reg_lock);
    565  1.1.6.2  yamt     MTX_DESTROY(&sc->elmer_lock);
    566  1.1.6.2  yamt     ADAPTER_LOCK_DEINIT(sc);
    567  1.1.6.2  yamt 
    568  1.1.6.2  yamt     return;
    569  1.1.6.2  yamt }
    570  1.1.6.2  yamt 
    571  1.1.6.2  yamt /**
    572  1.1.6.2  yamt  *  setup_sge_qsets - configure SGE Tx/Rx/response queues
    573  1.1.6.2  yamt  *  @sc: the controller softc
    574  1.1.6.2  yamt  *
    575  1.1.6.2  yamt  *  Determines how many sets of SGE queues to use and initializes them.
    576  1.1.6.2  yamt  *  We support multiple queue sets per port if we have MSI-X, otherwise
    577  1.1.6.2  yamt  *  just one queue set per port.
    578  1.1.6.2  yamt  */
    579  1.1.6.2  yamt static int
    580  1.1.6.2  yamt setup_sge_qsets(adapter_t *sc)
    581  1.1.6.2  yamt {
    582  1.1.6.2  yamt     int i, j, err, irq_idx = 0, qset_idx = 0;
    583  1.1.6.2  yamt     u_int ntxq = SGE_TXQ_PER_SET;
    584  1.1.6.2  yamt 
    585  1.1.6.2  yamt     if ((err = t3_sge_alloc(sc)) != 0) {
    586  1.1.6.2  yamt         device_printf(sc->dev, "t3_sge_alloc returned %d\n", err);
    587  1.1.6.2  yamt         return (err);
    588  1.1.6.2  yamt     }
    589  1.1.6.2  yamt 
    590  1.1.6.2  yamt     if (sc->params.rev > 0 && !(sc->flags & USING_MSI))
    591  1.1.6.2  yamt         irq_idx = -1;
    592  1.1.6.2  yamt 
    593  1.1.6.2  yamt     for (i = 0; i < (sc)->params.nports; i++) {
    594  1.1.6.2  yamt         struct port_info *pi = &sc->port[i];
    595  1.1.6.2  yamt 
    596  1.1.6.2  yamt         for (j = 0; j < pi->nqsets; j++, qset_idx++) {
    597  1.1.6.2  yamt             err = t3_sge_alloc_qset(sc, qset_idx, (sc)->params.nports,
    598  1.1.6.2  yamt                 (sc->flags & USING_MSIX) ? qset_idx + 1 : irq_idx,
    599  1.1.6.2  yamt                 &sc->params.sge.qset[qset_idx], ntxq, pi);
    600  1.1.6.2  yamt             if (err) {
    601  1.1.6.2  yamt                 t3_free_sge_resources(sc);
    602  1.1.6.2  yamt                 device_printf(sc->dev, "t3_sge_alloc_qset failed with %d\n",
    603  1.1.6.2  yamt                     err);
    604  1.1.6.2  yamt                 return (err);
    605  1.1.6.2  yamt             }
    606  1.1.6.2  yamt         }
    607  1.1.6.2  yamt     }
    608  1.1.6.2  yamt 
    609  1.1.6.2  yamt     return (0);
    610  1.1.6.2  yamt }
    611  1.1.6.2  yamt 
    612  1.1.6.2  yamt static void
    613  1.1.6.2  yamt cxgb_teardown_msix(adapter_t *sc)
    614  1.1.6.2  yamt {
    615  1.1.6.2  yamt     int i, nqsets;
    616  1.1.6.2  yamt 
    617  1.1.6.2  yamt     for (nqsets = i = 0; i < (sc)->params.nports; i++)
    618  1.1.6.2  yamt         nqsets += sc->port[i].nqsets;
    619  1.1.6.2  yamt 
    620  1.1.6.2  yamt     for (i = 0; i < nqsets; i++) {
    621  1.1.6.2  yamt         if (sc->msix_intr_tag[i] != NULL) {
    622  1.1.6.2  yamt             sc->msix_intr_tag[i] = NULL;
    623  1.1.6.2  yamt         }
    624  1.1.6.2  yamt         if (sc->msix_irq_res[i] != NULL) {
    625  1.1.6.2  yamt             sc->msix_irq_res[i] = NULL;
    626  1.1.6.2  yamt         }
    627  1.1.6.2  yamt     }
    628  1.1.6.2  yamt }
    629  1.1.6.2  yamt 
    630  1.1.6.2  yamt static int
    631  1.1.6.2  yamt cxgb_setup_msix(adapter_t *sc, int msix_count)
    632  1.1.6.2  yamt {
    633  1.1.6.2  yamt     int i, j, k, nqsets, rid;
    634  1.1.6.2  yamt 
    635  1.1.6.2  yamt     /* The first message indicates link changes and error conditions */
    636  1.1.6.2  yamt     sc->irq_rid = 1;
    637  1.1.6.2  yamt     /* Allocate PCI interrupt resources. */
    638  1.1.6.2  yamt     if (pci_intr_map(&sc->pa, &sc->intr_handle))
    639  1.1.6.2  yamt     {
    640  1.1.6.2  yamt         printf("cxgb_setup_msix(%d): pci_intr_map() failed\n", __LINE__);
    641  1.1.6.2  yamt         return (EINVAL);
    642  1.1.6.2  yamt     }
    643  1.1.6.2  yamt     sc->intr_cookie = pci_intr_establish(sc->pa.pa_pc, sc->intr_handle,
    644  1.1.6.2  yamt                         IPL_NET, cxgb_async_intr, sc);
    645  1.1.6.2  yamt     if (sc->intr_cookie == NULL)
    646  1.1.6.2  yamt     {
    647  1.1.6.2  yamt         printf("cxgb_setup_msix(%d): pci_intr_establish() failed\n", __LINE__);
    648  1.1.6.2  yamt         return (EINVAL);
    649  1.1.6.2  yamt     }
    650  1.1.6.2  yamt     for (i = k = 0; i < (sc)->params.nports; i++) {
    651  1.1.6.2  yamt         nqsets = sc->port[i].nqsets;
    652  1.1.6.2  yamt         for (j = 0; j < nqsets; j++, k++) {
    653  1.1.6.2  yamt             rid = k + 2;
    654  1.1.6.2  yamt             if (cxgb_debug)
    655  1.1.6.2  yamt                 printf("rid=%d ", rid);
    656  1.1.6.2  yamt             INT3;
    657  1.1.6.2  yamt         }
    658  1.1.6.2  yamt     }
    659  1.1.6.2  yamt 
    660  1.1.6.2  yamt 
    661  1.1.6.2  yamt     return (0);
    662  1.1.6.2  yamt }
    663  1.1.6.2  yamt 
    664  1.1.6.2  yamt static int cxgb_port_match(device_t dev, cfdata_t match, void *context)
    665  1.1.6.2  yamt {
    666  1.1.6.2  yamt     return (100);
    667  1.1.6.2  yamt }
    668  1.1.6.2  yamt 
    669  1.1.6.2  yamt #define IFCAP_HWCSUM (IFCAP_CSUM_IPv4_Rx | IFCAP_CSUM_IPv4_Tx)
    670  1.1.6.2  yamt #define IFCAP_RXCSUM IFCAP_CSUM_IPv4_Rx
    671  1.1.6.2  yamt #define IFCAP_TXCSUM IFCAP_CSUM_IPv4_Tx
    672  1.1.6.2  yamt 
    673  1.1.6.2  yamt #ifdef TSO_SUPPORTED
    674  1.1.6.2  yamt #define CXGB_CAP (IFCAP_HWCSUM | IFCAP_TSO)
    675  1.1.6.2  yamt /* Don't enable TSO6 yet */
    676  1.1.6.2  yamt #define CXGB_CAP_ENABLE (IFCAP_HWCSUM | IFCAP_TSO4)
    677  1.1.6.2  yamt #else
    678  1.1.6.2  yamt #define CXGB_CAP (IFCAP_HWCSUM)
    679  1.1.6.2  yamt /* Don't enable TSO6 yet */
    680  1.1.6.2  yamt #define CXGB_CAP_ENABLE (IFCAP_HWCSUM)
    681  1.1.6.2  yamt #define IFCAP_TSO4 0x0
    682  1.1.6.2  yamt #define IFCAP_TSO6 0x0
    683  1.1.6.2  yamt #define CSUM_TSO   0x0
    684  1.1.6.2  yamt #endif
    685  1.1.6.2  yamt 
    686  1.1.6.2  yamt static void
    687  1.1.6.2  yamt cxgb_port_attach(device_t dev, device_t self, void *context)
    688  1.1.6.2  yamt {
    689  1.1.6.2  yamt     struct port_info *p;
    690  1.1.6.2  yamt     struct port_device *pd;
    691  1.1.6.2  yamt     int *port_number = (int *)context;
    692  1.1.6.2  yamt     char buf[32];
    693  1.1.6.2  yamt     struct ifnet *ifp;
    694  1.1.6.2  yamt     int media_flags;
    695  1.1.6.2  yamt     pd = (struct port_device *)self; // device is first element in port_device
    696  1.1.6.2  yamt     pd->dev = self;
    697  1.1.6.2  yamt     pd->parent = (struct adapter *)dev;
    698  1.1.6.2  yamt     pd->port_number = *port_number;
    699  1.1.6.2  yamt     p = &pd->parent->port[*port_number];
    700  1.1.6.2  yamt     p->pd = pd;
    701  1.1.6.2  yamt 
    702  1.1.6.2  yamt     PORT_LOCK_INIT(p, p->lockbuf);
    703  1.1.6.2  yamt 
    704  1.1.6.2  yamt     /* Allocate an ifnet object and set it up */
    705  1.1.6.2  yamt     ifp = p->ifp = (void *)malloc(sizeof (struct ifnet), M_IFADDR, M_WAITOK);
    706  1.1.6.2  yamt     if (ifp == NULL) {
    707  1.1.6.2  yamt         device_printf(dev, "Cannot allocate ifnet\n");
    708  1.1.6.2  yamt         return;
    709  1.1.6.2  yamt     }
    710  1.1.6.2  yamt     memset(ifp, 0, sizeof(struct ifnet));
    711  1.1.6.2  yamt 
    712  1.1.6.2  yamt     /*
    713  1.1.6.2  yamt      * Note that there is currently no watchdog timer.
    714  1.1.6.2  yamt      */
    715  1.1.6.2  yamt     snprintf(buf, sizeof(buf), "cxgb%d", p->port);
    716  1.1.6.2  yamt     strcpy(ifp->if_xname, buf);
    717  1.1.6.2  yamt     ifp->if_init = cxgb_init;
    718  1.1.6.2  yamt     ifp->if_softc = p;
    719  1.1.6.2  yamt     ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
    720  1.1.6.2  yamt     ifp->if_ioctl = cxgb_ioctl;
    721  1.1.6.2  yamt     ifp->if_start = cxgb_start;
    722  1.1.6.2  yamt     ifp->if_stop = cxgb_stop;
    723  1.1.6.2  yamt     ifp->if_timer = 0;  /* Disable ifnet watchdog */
    724  1.1.6.2  yamt     ifp->if_watchdog = NULL;
    725  1.1.6.2  yamt 
    726  1.1.6.2  yamt     ifp->if_snd.ifq_maxlen = TX_ETH_Q_SIZE;
    727  1.1.6.2  yamt     IFQ_SET_MAXLEN(&ifp->if_snd, ifp->if_snd.ifq_maxlen);
    728  1.1.6.2  yamt 
    729  1.1.6.2  yamt     IFQ_SET_READY(&ifp->if_snd);
    730  1.1.6.2  yamt 
    731  1.1.6.2  yamt     ifp->if_capabilities = ifp->if_capenable = 0;
    732  1.1.6.2  yamt     ifp->if_baudrate = 10000000000; // 10 Gbps
    733  1.1.6.2  yamt     /*
    734  1.1.6.2  yamt      * disable TSO on 4-port - it isn't supported by the firmware yet
    735  1.1.6.2  yamt      */
    736  1.1.6.2  yamt     if (p->adapter->params.nports > 2) {
    737  1.1.6.2  yamt         ifp->if_capabilities &= ~(IFCAP_TSO4 | IFCAP_TSO6);
    738  1.1.6.2  yamt         ifp->if_capenable &= ~(IFCAP_TSO4 | IFCAP_TSO6);
    739  1.1.6.2  yamt     }
    740  1.1.6.2  yamt 
    741  1.1.6.2  yamt     if_attach(ifp);
    742  1.1.6.2  yamt     ether_ifattach(ifp, p->hw_addr);
    743  1.1.6.2  yamt     /*
    744  1.1.6.2  yamt      * Only default to jumbo frames on 10GigE
    745  1.1.6.2  yamt      */
    746  1.1.6.2  yamt     if (p->adapter->params.nports <= 2)
    747  1.1.6.2  yamt         ifp->if_mtu = 9000;
    748  1.1.6.2  yamt     ifmedia_init(&p->media, IFM_IMASK, cxgb_media_change,
    749  1.1.6.2  yamt         cxgb_media_status);
    750  1.1.6.2  yamt 
    751  1.1.6.2  yamt     if (!strcmp(p->port_type->desc, "10GBASE-CX4")) {
    752  1.1.6.2  yamt         media_flags = IFM_ETHER | IFM_10G_CX4 | IFM_FDX;
    753  1.1.6.2  yamt     } else if (!strcmp(p->port_type->desc, "10GBASE-SR")) {
    754  1.1.6.2  yamt         media_flags = IFM_ETHER | IFM_10G_SR | IFM_FDX;
    755  1.1.6.2  yamt     } else if (!strcmp(p->port_type->desc, "10GBASE-XR")) {
    756  1.1.6.2  yamt         media_flags = IFM_ETHER | IFM_10G_LR | IFM_FDX;
    757  1.1.6.2  yamt     } else if (!strcmp(p->port_type->desc, "10/100/1000BASE-T")) {
    758  1.1.6.2  yamt         ifmedia_add(&p->media, IFM_ETHER | IFM_10_T, 0, NULL);
    759  1.1.6.2  yamt         ifmedia_add(&p->media, IFM_ETHER | IFM_10_T | IFM_FDX,
    760  1.1.6.2  yamt                 0, NULL);
    761  1.1.6.2  yamt         ifmedia_add(&p->media, IFM_ETHER | IFM_100_TX,
    762  1.1.6.2  yamt                 0, NULL);
    763  1.1.6.2  yamt         ifmedia_add(&p->media, IFM_ETHER | IFM_100_TX | IFM_FDX,
    764  1.1.6.2  yamt                 0, NULL);
    765  1.1.6.2  yamt         ifmedia_add(&p->media, IFM_ETHER | IFM_1000_T | IFM_FDX,
    766  1.1.6.2  yamt                 0, NULL);
    767  1.1.6.2  yamt         media_flags = 0;
    768  1.1.6.2  yamt     } else {
    769  1.1.6.2  yamt             printf("unsupported media type %s\n", p->port_type->desc);
    770  1.1.6.2  yamt         return;
    771  1.1.6.2  yamt     }
    772  1.1.6.2  yamt     if (media_flags) {
    773  1.1.6.2  yamt         ifmedia_add(&p->media, media_flags, 0, NULL);
    774  1.1.6.2  yamt         ifmedia_set(&p->media, media_flags);
    775  1.1.6.2  yamt     } else {
    776  1.1.6.2  yamt         ifmedia_add(&p->media, IFM_ETHER | IFM_AUTO, 0, NULL);
    777  1.1.6.2  yamt         ifmedia_set(&p->media, IFM_ETHER | IFM_AUTO);
    778  1.1.6.2  yamt     }
    779  1.1.6.2  yamt 
    780  1.1.6.2  yamt     snprintf(p->taskqbuf, TASKQ_NAME_LEN, "cxgb_port_taskq%d", p->port_id);
    781  1.1.6.2  yamt     p->start_task.name = "cxgb_start_proc";
    782  1.1.6.2  yamt     p->start_task.func = cxgb_start_proc;
    783  1.1.6.2  yamt     p->start_task.context = ifp;
    784  1.1.6.2  yamt     kthread_create(PRI_NONE, 0, NULL, cxgb_make_task, &p->start_task, NULL, "cxgb_make_task");
    785  1.1.6.2  yamt 
    786  1.1.6.2  yamt     t3_sge_init_port(p);
    787  1.1.6.2  yamt }
    788  1.1.6.2  yamt 
    789  1.1.6.2  yamt static int
    790  1.1.6.2  yamt cxgb_port_detach(device_t dev, int flags)
    791  1.1.6.2  yamt {
    792  1.1.6.2  yamt     struct port_info *p;
    793  1.1.6.2  yamt 
    794  1.1.6.2  yamt     p = (struct port_info *)dev; // device is first thing in adapter
    795  1.1.6.2  yamt 
    796  1.1.6.2  yamt     PORT_LOCK(p);
    797  1.1.6.2  yamt     if (p->ifp->if_drv_flags & IFF_DRV_RUNNING)
    798  1.1.6.2  yamt         cxgb_stop_locked(p);
    799  1.1.6.2  yamt     PORT_UNLOCK(p);
    800  1.1.6.2  yamt 
    801  1.1.6.2  yamt     if (p->start_task.wq != NULL) {
    802  1.1.6.2  yamt         workqueue_destroy(p->start_task.wq);
    803  1.1.6.2  yamt         p->start_task.wq = NULL;
    804  1.1.6.2  yamt     }
    805  1.1.6.2  yamt 
    806  1.1.6.2  yamt     ether_ifdetach(p->ifp);
    807  1.1.6.2  yamt     /*
    808  1.1.6.2  yamt      * the lock may be acquired in ifdetach
    809  1.1.6.2  yamt      */
    810  1.1.6.2  yamt     PORT_LOCK_DEINIT(p);
    811  1.1.6.2  yamt     if_detach(p->ifp);
    812  1.1.6.2  yamt 
    813  1.1.6.2  yamt     return (0);
    814  1.1.6.2  yamt }
    815  1.1.6.2  yamt 
    816  1.1.6.2  yamt void
    817  1.1.6.2  yamt t3_fatal_err(struct adapter *sc)
    818  1.1.6.2  yamt {
    819  1.1.6.2  yamt     u_int fw_status[4];
    820  1.1.6.2  yamt 
    821  1.1.6.2  yamt     if (sc->flags & FULL_INIT_DONE) {
    822  1.1.6.2  yamt         t3_sge_stop(sc);
    823  1.1.6.2  yamt         t3_write_reg(sc, A_XGM_TX_CTRL, 0);
    824  1.1.6.2  yamt         t3_write_reg(sc, A_XGM_RX_CTRL, 0);
    825  1.1.6.2  yamt         t3_write_reg(sc, XGM_REG(A_XGM_TX_CTRL, 1), 0);
    826  1.1.6.2  yamt         t3_write_reg(sc, XGM_REG(A_XGM_RX_CTRL, 1), 0);
    827  1.1.6.2  yamt         t3_intr_disable(sc);
    828  1.1.6.2  yamt     }
    829  1.1.6.2  yamt     device_printf(sc->dev,"encountered fatal error, operation suspended\n");
    830  1.1.6.2  yamt     if (!t3_cim_ctl_blk_read(sc, 0xa0, 4, fw_status))
    831  1.1.6.2  yamt         device_printf(sc->dev, "FW_ status: 0x%x, 0x%x, 0x%x, 0x%x\n",
    832  1.1.6.2  yamt             fw_status[0], fw_status[1], fw_status[2], fw_status[3]);
    833  1.1.6.2  yamt }
    834  1.1.6.2  yamt 
    835  1.1.6.2  yamt int
    836  1.1.6.2  yamt t3_os_find_pci_capability(adapter_t *sc, int cap)
    837  1.1.6.2  yamt {
    838  1.1.6.2  yamt     device_t dev;
    839  1.1.6.2  yamt     uint32_t status;
    840  1.1.6.2  yamt     uint32_t bhlc;
    841  1.1.6.2  yamt     uint32_t temp;
    842  1.1.6.2  yamt     uint8_t ptr;
    843  1.1.6.2  yamt     dev = sc->dev;
    844  1.1.6.2  yamt     status = pci_conf_read(sc->pa.pa_pc, sc->pa.pa_tag, PCI_COMMAND_STATUS_REG);
    845  1.1.6.2  yamt     if (!(status&PCI_STATUS_CAPLIST_SUPPORT))
    846  1.1.6.2  yamt         return (0);
    847  1.1.6.2  yamt     bhlc = pci_conf_read(sc->pa.pa_pc, sc->pa.pa_tag, PCI_BHLC_REG);
    848  1.1.6.2  yamt     switch (PCI_HDRTYPE(bhlc))
    849  1.1.6.2  yamt     {
    850  1.1.6.2  yamt     case 0:
    851  1.1.6.2  yamt     case 1:
    852  1.1.6.2  yamt         ptr = PCI_CAPLISTPTR_REG;
    853  1.1.6.2  yamt         break;
    854  1.1.6.2  yamt     case 2:
    855  1.1.6.2  yamt         ptr = PCI_CARDBUS_CAPLISTPTR_REG;
    856  1.1.6.2  yamt         break;
    857  1.1.6.2  yamt     default:
    858  1.1.6.2  yamt         return (0);
    859  1.1.6.2  yamt     }
    860  1.1.6.2  yamt     temp = pci_conf_read(sc->pa.pa_pc, sc->pa.pa_tag, ptr);
    861  1.1.6.2  yamt     ptr = PCI_CAPLIST_PTR(temp);
    862  1.1.6.2  yamt     while (ptr != 0) {
    863  1.1.6.2  yamt         temp = pci_conf_read(sc->pa.pa_pc, sc->pa.pa_tag, ptr);
    864  1.1.6.2  yamt         if (PCI_CAPLIST_CAP(temp) == cap)
    865  1.1.6.2  yamt             return (ptr);
    866  1.1.6.2  yamt         ptr = PCI_CAPLIST_NEXT(temp);
    867  1.1.6.2  yamt     }
    868  1.1.6.2  yamt 
    869  1.1.6.2  yamt     return (0);
    870  1.1.6.2  yamt }
    871  1.1.6.2  yamt 
    872  1.1.6.2  yamt int
    873  1.1.6.2  yamt t3_os_pci_save_state(struct adapter *sc)
    874  1.1.6.2  yamt {
    875  1.1.6.2  yamt     INT3;
    876  1.1.6.2  yamt     return (0);
    877  1.1.6.2  yamt }
    878  1.1.6.2  yamt 
    879  1.1.6.2  yamt int
    880  1.1.6.2  yamt t3_os_pci_restore_state(struct adapter *sc)
    881  1.1.6.2  yamt {
    882  1.1.6.2  yamt     INT3;
    883  1.1.6.2  yamt     return (0);
    884  1.1.6.2  yamt }
    885  1.1.6.2  yamt 
    886  1.1.6.2  yamt /**
    887  1.1.6.2  yamt  *  t3_os_link_changed - handle link status changes
    888  1.1.6.2  yamt  *  @adapter: the adapter associated with the link change
    889  1.1.6.2  yamt  *  @port_id: the port index whose limk status has changed
    890  1.1.6.2  yamt  *  @link_stat: the new status of the link
    891  1.1.6.2  yamt  *  @speed: the new speed setting
    892  1.1.6.2  yamt  *  @duplex: the new duplex setting
    893  1.1.6.2  yamt  *  @fc: the new flow-control setting
    894  1.1.6.2  yamt  *
    895  1.1.6.2  yamt  *  This is the OS-dependent handler for link status changes.  The OS
    896  1.1.6.2  yamt  *  neutral handler takes care of most of the processing for these events,
    897  1.1.6.2  yamt  *  then calls this handler for any OS-specific processing.
    898  1.1.6.2  yamt  */
    899  1.1.6.2  yamt void
    900  1.1.6.2  yamt t3_os_link_changed(adapter_t *adapter, int port_id, int link_status, int speed,
    901  1.1.6.2  yamt      int duplex, int fc)
    902  1.1.6.2  yamt {
    903  1.1.6.2  yamt     struct port_info *pi = &adapter->port[port_id];
    904  1.1.6.2  yamt     struct cmac *mac = &adapter->port[port_id].mac;
    905  1.1.6.2  yamt 
    906  1.1.6.2  yamt     if ((pi->ifp->if_flags & IFF_UP) == 0)
    907  1.1.6.2  yamt         return;
    908  1.1.6.2  yamt 
    909  1.1.6.2  yamt     if (link_status) {
    910  1.1.6.2  yamt         t3_mac_enable(mac, MAC_DIRECTION_RX);
    911  1.1.6.2  yamt         if_link_state_change(pi->ifp, LINK_STATE_UP);
    912  1.1.6.2  yamt     } else {
    913  1.1.6.2  yamt         if_link_state_change(pi->ifp, LINK_STATE_DOWN);
    914  1.1.6.2  yamt         pi->phy.ops->power_down(&pi->phy, 1);
    915  1.1.6.2  yamt         t3_mac_disable(mac, MAC_DIRECTION_RX);
    916  1.1.6.2  yamt         t3_link_start(&pi->phy, mac, &pi->link_config);
    917  1.1.6.2  yamt     }
    918  1.1.6.2  yamt }
    919  1.1.6.2  yamt 
    920  1.1.6.2  yamt /*
    921  1.1.6.2  yamt  * Interrupt-context handler for external (PHY) interrupts.
    922  1.1.6.2  yamt  */
    923  1.1.6.2  yamt void
    924  1.1.6.2  yamt t3_os_ext_intr_handler(adapter_t *sc)
    925  1.1.6.2  yamt {
    926  1.1.6.2  yamt     if (cxgb_debug)
    927  1.1.6.2  yamt         printf("t3_os_ext_intr_handler\n");
    928  1.1.6.2  yamt     /*
    929  1.1.6.2  yamt      * Schedule a task to handle external interrupts as they may be slow
    930  1.1.6.2  yamt      * and we use a mutex to protect MDIO registers.  We disable PHY
    931  1.1.6.2  yamt      * interrupts in the meantime and let the task reenable them when
    932  1.1.6.2  yamt      * it's done.
    933  1.1.6.2  yamt      */
    934  1.1.6.2  yamt     ADAPTER_LOCK(sc);
    935  1.1.6.2  yamt     if (sc->slow_intr_mask) {
    936  1.1.6.2  yamt         sc->slow_intr_mask &= ~F_T3DBG;
    937  1.1.6.2  yamt         t3_write_reg(sc, A_PL_INT_ENABLE0, sc->slow_intr_mask);
    938  1.1.6.2  yamt         workqueue_enqueue(sc->ext_intr_task.wq, &sc->ext_intr_task.w, NULL);
    939  1.1.6.2  yamt     }
    940  1.1.6.2  yamt     ADAPTER_UNLOCK(sc);
    941  1.1.6.2  yamt }
    942  1.1.6.2  yamt 
    943  1.1.6.2  yamt void
    944  1.1.6.2  yamt t3_os_set_hw_addr(adapter_t *adapter, int port_idx, u8 hw_addr[])
    945  1.1.6.2  yamt {
    946  1.1.6.2  yamt 
    947  1.1.6.2  yamt     /*
    948  1.1.6.2  yamt      * The ifnet might not be allocated before this gets called,
    949  1.1.6.2  yamt      * as this is called early on in attach by t3_prep_adapter
    950  1.1.6.2  yamt      * save the address off in the port structure
    951  1.1.6.2  yamt      */
    952  1.1.6.2  yamt     if (cxgb_debug)
    953  1.1.6.2  yamt 	printf("set_hw_addr on idx %d addr %02x:%02x:%02x:%02x:%02x:%02x\n",
    954  1.1.6.2  yamt 		port_idx, hw_addr[0], hw_addr[1], hw_addr[2], hw_addr[3], hw_addr[4], hw_addr[5]);
    955  1.1.6.2  yamt     memcpy(adapter->port[port_idx].hw_addr, hw_addr, ETHER_ADDR_LEN);
    956  1.1.6.2  yamt }
    957  1.1.6.2  yamt 
    958  1.1.6.2  yamt /**
    959  1.1.6.2  yamt  *  link_start - enable a port
    960  1.1.6.2  yamt  *  @p: the port to enable
    961  1.1.6.2  yamt  *
    962  1.1.6.2  yamt  *  Performs the MAC and PHY actions needed to enable a port.
    963  1.1.6.2  yamt  */
    964  1.1.6.2  yamt static void
    965  1.1.6.2  yamt cxgb_link_start(struct port_info *p)
    966  1.1.6.2  yamt {
    967  1.1.6.2  yamt     struct ifnet *ifp;
    968  1.1.6.2  yamt     struct t3_rx_mode rm;
    969  1.1.6.2  yamt     struct cmac *mac = &p->mac;
    970  1.1.6.2  yamt 
    971  1.1.6.2  yamt     ifp = p->ifp;
    972  1.1.6.2  yamt 
    973  1.1.6.2  yamt     t3_init_rx_mode(&rm, p);
    974  1.1.6.2  yamt     if (!mac->multiport)
    975  1.1.6.2  yamt         t3_mac_reset(mac);
    976  1.1.6.2  yamt     t3_mac_set_mtu(mac, ifp->if_mtu + ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN);
    977  1.1.6.2  yamt     t3_mac_set_address(mac, 0, p->hw_addr);
    978  1.1.6.2  yamt     t3_mac_set_rx_mode(mac, &rm);
    979  1.1.6.2  yamt     t3_link_start(&p->phy, mac, &p->link_config);
    980  1.1.6.2  yamt     t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
    981  1.1.6.2  yamt }
    982  1.1.6.2  yamt 
    983  1.1.6.2  yamt /**
    984  1.1.6.2  yamt  *  setup_rss - configure Receive Side Steering (per-queue connection demux)
    985  1.1.6.2  yamt  *  @adap: the adapter
    986  1.1.6.2  yamt  *
    987  1.1.6.2  yamt  *  Sets up RSS to distribute packets to multiple receive queues.  We
    988  1.1.6.2  yamt  *  configure the RSS CPU lookup table to distribute to the number of HW
    989  1.1.6.2  yamt  *  receive queues, and the response queue lookup table to narrow that
    990  1.1.6.2  yamt  *  down to the response queues actually configured for each port.
    991  1.1.6.2  yamt  *  We always configure the RSS mapping for two ports since the mapping
    992  1.1.6.2  yamt  *  table has plenty of entries.
    993  1.1.6.2  yamt  */
    994  1.1.6.2  yamt static void
    995  1.1.6.2  yamt setup_rss(adapter_t *adap)
    996  1.1.6.2  yamt {
    997  1.1.6.2  yamt     int i;
    998  1.1.6.2  yamt     u_int nq[2];
    999  1.1.6.2  yamt     uint8_t cpus[SGE_QSETS + 1];
   1000  1.1.6.2  yamt     uint16_t rspq_map[RSS_TABLE_SIZE];
   1001  1.1.6.2  yamt 
   1002  1.1.6.2  yamt     for (i = 0; i < SGE_QSETS; ++i)
   1003  1.1.6.2  yamt         cpus[i] = i;
   1004  1.1.6.2  yamt     cpus[SGE_QSETS] = 0xff;
   1005  1.1.6.2  yamt 
   1006  1.1.6.2  yamt     nq[0] = nq[1] = 0;
   1007  1.1.6.2  yamt     for_each_port(adap, i) {
   1008  1.1.6.2  yamt         const struct port_info *pi = adap2pinfo(adap, i);
   1009  1.1.6.2  yamt 
   1010  1.1.6.2  yamt         nq[pi->tx_chan] += pi->nqsets;
   1011  1.1.6.2  yamt     }
   1012  1.1.6.2  yamt     nq[0] = max(nq[0], 1U);
   1013  1.1.6.2  yamt     nq[1] = max(nq[1], 1U);
   1014  1.1.6.2  yamt     for (i = 0; i < RSS_TABLE_SIZE / 2; ++i) {
   1015  1.1.6.2  yamt         rspq_map[i] = i % nq[0];
   1016  1.1.6.2  yamt         rspq_map[i + RSS_TABLE_SIZE / 2] = (i % nq[1]) + nq[0];
   1017  1.1.6.2  yamt     }
   1018  1.1.6.2  yamt     /* Calculate the reverse RSS map table */
   1019  1.1.6.2  yamt     for (i = 0; i < RSS_TABLE_SIZE; ++i)
   1020  1.1.6.2  yamt         if (adap->rrss_map[rspq_map[i]] == 0xff)
   1021  1.1.6.2  yamt             adap->rrss_map[rspq_map[i]] = i;
   1022  1.1.6.2  yamt 
   1023  1.1.6.2  yamt     t3_config_rss(adap, F_RQFEEDBACKENABLE | F_TNLLKPEN | F_TNLMAPEN |
   1024  1.1.6.2  yamt               F_TNLPRTEN | F_TNL2TUPEN | F_TNL4TUPEN | F_OFDMAPEN |
   1025  1.1.6.2  yamt               V_RRCPLCPUSIZE(6), cpus, rspq_map);
   1026  1.1.6.2  yamt 
   1027  1.1.6.2  yamt }
   1028  1.1.6.2  yamt 
   1029  1.1.6.2  yamt /*
   1030  1.1.6.2  yamt  * Sends an mbuf to an offload queue driver
   1031  1.1.6.2  yamt  * after dealing with any active network taps.
   1032  1.1.6.2  yamt  */
   1033  1.1.6.2  yamt static inline int
   1034  1.1.6.2  yamt offload_tx(struct toedev *tdev, struct mbuf *m)
   1035  1.1.6.2  yamt {
   1036  1.1.6.2  yamt     int ret;
   1037  1.1.6.2  yamt 
   1038  1.1.6.2  yamt     critical_enter();
   1039  1.1.6.2  yamt     ret = t3_offload_tx(tdev, m);
   1040  1.1.6.2  yamt     critical_exit();
   1041  1.1.6.2  yamt     return (ret);
   1042  1.1.6.2  yamt }
   1043  1.1.6.2  yamt 
   1044  1.1.6.2  yamt static void
   1045  1.1.6.2  yamt send_pktsched_cmd(struct adapter *adap, int sched, int qidx, int lo,
   1046  1.1.6.2  yamt                   int hi, int port)
   1047  1.1.6.2  yamt {
   1048  1.1.6.2  yamt     struct mbuf *m;
   1049  1.1.6.2  yamt     struct mngt_pktsched_wr *req;
   1050  1.1.6.2  yamt 
   1051  1.1.6.2  yamt     m = m_gethdr(M_DONTWAIT, MT_DATA);
   1052  1.1.6.2  yamt     if (m) {
   1053  1.1.6.2  yamt         req = mtod(m, struct mngt_pktsched_wr *);
   1054  1.1.6.2  yamt         req->wr_hi = htonl(V_WR_OP(FW_WROPCODE_MNGT));
   1055  1.1.6.2  yamt         req->mngt_opcode = FW_MNGTOPCODE_PKTSCHED_SET;
   1056  1.1.6.2  yamt         req->sched = sched;
   1057  1.1.6.2  yamt         req->idx = qidx;
   1058  1.1.6.2  yamt         req->min = lo;
   1059  1.1.6.2  yamt         req->max = hi;
   1060  1.1.6.2  yamt         req->binding = port;
   1061  1.1.6.2  yamt         m->m_len = m->m_pkthdr.len = sizeof(*req);
   1062  1.1.6.2  yamt         t3_mgmt_tx(adap, m);
   1063  1.1.6.2  yamt     }
   1064  1.1.6.2  yamt }
   1065  1.1.6.2  yamt 
   1066  1.1.6.2  yamt static void
   1067  1.1.6.2  yamt bind_qsets(adapter_t *sc)
   1068  1.1.6.2  yamt {
   1069  1.1.6.2  yamt     int i, j;
   1070  1.1.6.2  yamt 
   1071  1.1.6.2  yamt     for (i = 0; i < (sc)->params.nports; ++i) {
   1072  1.1.6.2  yamt         const struct port_info *pi = adap2pinfo(sc, i);
   1073  1.1.6.2  yamt 
   1074  1.1.6.2  yamt         for (j = 0; j < pi->nqsets; ++j) {
   1075  1.1.6.2  yamt             send_pktsched_cmd(sc, 1, pi->first_qset + j, -1,
   1076  1.1.6.2  yamt                       -1, pi->tx_chan);
   1077  1.1.6.2  yamt 
   1078  1.1.6.2  yamt         }
   1079  1.1.6.2  yamt     }
   1080  1.1.6.2  yamt }
   1081  1.1.6.2  yamt 
   1082  1.1.6.2  yamt /**
   1083  1.1.6.2  yamt  *  cxgb_up - enable the adapter
   1084  1.1.6.2  yamt  *  @adap: adapter being enabled
   1085  1.1.6.2  yamt  *
   1086  1.1.6.2  yamt  *  Called when the first port is enabled, this function performs the
   1087  1.1.6.2  yamt  *  actions necessary to make an adapter operational, such as completing
   1088  1.1.6.2  yamt  *  the initialization of HW modules, and enabling interrupts.
   1089  1.1.6.2  yamt  *
   1090  1.1.6.2  yamt  */
   1091  1.1.6.2  yamt static int
   1092  1.1.6.2  yamt cxgb_up(struct adapter *sc)
   1093  1.1.6.2  yamt {
   1094  1.1.6.2  yamt     int err = 0;
   1095  1.1.6.2  yamt 
   1096  1.1.6.2  yamt     if ((sc->flags & FULL_INIT_DONE) == 0) {
   1097  1.1.6.2  yamt 
   1098  1.1.6.2  yamt         if ((sc->flags & FW_UPTODATE) == 0)
   1099  1.1.6.2  yamt 	    printf("SHOULD UPGRADE FIRMWARE!\n");
   1100  1.1.6.2  yamt         if ((sc->flags & TPS_UPTODATE) == 0)
   1101  1.1.6.2  yamt 	    printf("SHOULD UPDATE TPSRAM\n");
   1102  1.1.6.2  yamt         err = t3_init_hw(sc, 0);
   1103  1.1.6.2  yamt         if (err)
   1104  1.1.6.2  yamt             goto out;
   1105  1.1.6.2  yamt 
   1106  1.1.6.2  yamt         t3_write_reg(sc, A_ULPRX_TDDP_PSZ, V_HPZ0(PAGE_SHIFT - 12));
   1107  1.1.6.2  yamt 
   1108  1.1.6.2  yamt         err = setup_sge_qsets(sc);
   1109  1.1.6.2  yamt         if (err)
   1110  1.1.6.2  yamt             goto out;
   1111  1.1.6.2  yamt 
   1112  1.1.6.2  yamt         setup_rss(sc);
   1113  1.1.6.2  yamt         sc->flags |= FULL_INIT_DONE;
   1114  1.1.6.2  yamt     }
   1115  1.1.6.2  yamt 
   1116  1.1.6.2  yamt     t3_intr_clear(sc);
   1117  1.1.6.2  yamt 
   1118  1.1.6.2  yamt     /* If it's MSI or INTx, allocate a single interrupt for everything */
   1119  1.1.6.2  yamt     if ((sc->flags & USING_MSIX) == 0) {
   1120  1.1.6.2  yamt         if (pci_intr_map(&sc->pa, &sc->intr_handle))
   1121  1.1.6.2  yamt         {
   1122  1.1.6.2  yamt             device_printf(sc->dev, "Cannot allocate interrupt\n");
   1123  1.1.6.2  yamt             err = EINVAL;
   1124  1.1.6.2  yamt             goto out;
   1125  1.1.6.2  yamt         }
   1126  1.1.6.2  yamt         device_printf(sc->dev, "allocated intr_handle=%p\n", sc->intr_handle);
   1127  1.1.6.2  yamt         sc->intr_cookie = pci_intr_establish(sc->pa.pa_pc,
   1128  1.1.6.2  yamt                     sc->intr_handle, IPL_NET,
   1129  1.1.6.2  yamt                     sc->cxgb_intr, sc);
   1130  1.1.6.2  yamt         if (sc->intr_cookie == NULL)
   1131  1.1.6.2  yamt         {
   1132  1.1.6.2  yamt             device_printf(sc->dev, "Cannot establish interrupt\n");
   1133  1.1.6.2  yamt             err = EINVAL;
   1134  1.1.6.2  yamt             goto irq_err;
   1135  1.1.6.2  yamt         }
   1136  1.1.6.2  yamt     } else {
   1137  1.1.6.2  yamt         printf("Using MSIX?!?!?!\n");
   1138  1.1.6.2  yamt         INT3;
   1139  1.1.6.2  yamt         cxgb_setup_msix(sc, sc->msi_count);
   1140  1.1.6.2  yamt     }
   1141  1.1.6.2  yamt 
   1142  1.1.6.2  yamt     t3_sge_start(sc);
   1143  1.1.6.2  yamt     t3_intr_enable(sc);
   1144  1.1.6.2  yamt 
   1145  1.1.6.2  yamt     if (!(sc->flags & QUEUES_BOUND)) {
   1146  1.1.6.2  yamt         bind_qsets(sc);
   1147  1.1.6.2  yamt         sc->flags |= QUEUES_BOUND;
   1148  1.1.6.2  yamt     }
   1149  1.1.6.2  yamt out:
   1150  1.1.6.2  yamt     return (err);
   1151  1.1.6.2  yamt irq_err:
   1152  1.1.6.2  yamt     CH_ERR(sc, "request_irq failed, err %d\n", err);
   1153  1.1.6.2  yamt     goto out;
   1154  1.1.6.2  yamt }
   1155  1.1.6.2  yamt 
   1156  1.1.6.2  yamt 
   1157  1.1.6.2  yamt /*
   1158  1.1.6.2  yamt  * Release resources when all the ports and offloading have been stopped.
   1159  1.1.6.2  yamt  */
   1160  1.1.6.2  yamt static void
   1161  1.1.6.2  yamt cxgb_down_locked(struct adapter *sc)
   1162  1.1.6.2  yamt {
   1163  1.1.6.2  yamt     t3_sge_stop(sc);
   1164  1.1.6.2  yamt     t3_intr_disable(sc);
   1165  1.1.6.2  yamt 
   1166  1.1.6.2  yamt     INT3; // XXXXXXXXXXXXXXXXXX
   1167  1.1.6.2  yamt 
   1168  1.1.6.2  yamt     if (sc->flags & USING_MSIX)
   1169  1.1.6.2  yamt         cxgb_teardown_msix(sc);
   1170  1.1.6.2  yamt     ADAPTER_UNLOCK(sc);
   1171  1.1.6.2  yamt 
   1172  1.1.6.2  yamt     callout_drain(&sc->cxgb_tick_ch);
   1173  1.1.6.2  yamt     callout_drain(&sc->sge_timer_ch);
   1174  1.1.6.2  yamt 
   1175  1.1.6.2  yamt #ifdef notyet
   1176  1.1.6.2  yamt 
   1177  1.1.6.2  yamt         if (sc->port[i].tq != NULL)
   1178  1.1.6.2  yamt #endif
   1179  1.1.6.2  yamt 
   1180  1.1.6.2  yamt }
   1181  1.1.6.2  yamt 
   1182  1.1.6.2  yamt static int
   1183  1.1.6.2  yamt cxgb_init(struct ifnet *ifp)
   1184  1.1.6.2  yamt {
   1185  1.1.6.2  yamt     struct port_info *p = ifp->if_softc;
   1186  1.1.6.2  yamt 
   1187  1.1.6.2  yamt     PORT_LOCK(p);
   1188  1.1.6.2  yamt     cxgb_init_locked(p);
   1189  1.1.6.2  yamt     PORT_UNLOCK(p);
   1190  1.1.6.2  yamt 
   1191  1.1.6.2  yamt     return (0); // ????????????
   1192  1.1.6.2  yamt }
   1193  1.1.6.2  yamt 
   1194  1.1.6.2  yamt static void
   1195  1.1.6.2  yamt cxgb_init_locked(struct port_info *p)
   1196  1.1.6.2  yamt {
   1197  1.1.6.2  yamt     struct ifnet *ifp;
   1198  1.1.6.2  yamt     adapter_t *sc = p->adapter;
   1199  1.1.6.2  yamt     int err;
   1200  1.1.6.2  yamt 
   1201  1.1.6.2  yamt     PORT_LOCK_ASSERT_OWNED(p);
   1202  1.1.6.2  yamt     ifp = p->ifp;
   1203  1.1.6.2  yamt 
   1204  1.1.6.2  yamt     ADAPTER_LOCK(p->adapter);
   1205  1.1.6.2  yamt     if ((sc->open_device_map == 0) && (err = cxgb_up(sc))) {
   1206  1.1.6.2  yamt         ADAPTER_UNLOCK(p->adapter);
   1207  1.1.6.2  yamt         cxgb_stop_locked(p);
   1208  1.1.6.2  yamt         return;
   1209  1.1.6.2  yamt     }
   1210  1.1.6.2  yamt     if (p->adapter->open_device_map == 0) {
   1211  1.1.6.2  yamt         t3_intr_clear(sc);
   1212  1.1.6.2  yamt         t3_sge_init_adapter(sc);
   1213  1.1.6.2  yamt     }
   1214  1.1.6.2  yamt     setbit(&p->adapter->open_device_map, p->port_id);
   1215  1.1.6.2  yamt     ADAPTER_UNLOCK(p->adapter);
   1216  1.1.6.2  yamt 
   1217  1.1.6.2  yamt     cxgb_link_start(p);
   1218  1.1.6.2  yamt     t3_link_changed(sc, p->port_id);
   1219  1.1.6.2  yamt     ifp->if_baudrate = p->link_config.speed * 1000000;
   1220  1.1.6.2  yamt 
   1221  1.1.6.2  yamt     device_printf(sc->dev, "enabling interrupts on port=%d\n", p->port_id);
   1222  1.1.6.2  yamt     t3_port_intr_enable(sc, p->port_id);
   1223  1.1.6.2  yamt 
   1224  1.1.6.2  yamt     callout_reset(&sc->cxgb_tick_ch, sc->params.stats_update_period * hz,
   1225  1.1.6.2  yamt         cxgb_tick, sc);
   1226  1.1.6.2  yamt 
   1227  1.1.6.2  yamt     ifp->if_drv_flags |= IFF_DRV_RUNNING;
   1228  1.1.6.2  yamt     ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
   1229  1.1.6.2  yamt }
   1230  1.1.6.2  yamt 
   1231  1.1.6.2  yamt static void
   1232  1.1.6.2  yamt cxgb_set_rxmode(struct port_info *p)
   1233  1.1.6.2  yamt {
   1234  1.1.6.2  yamt     struct t3_rx_mode rm;
   1235  1.1.6.2  yamt     struct cmac *mac = &p->mac;
   1236  1.1.6.2  yamt 
   1237  1.1.6.2  yamt     PORT_LOCK_ASSERT_OWNED(p);
   1238  1.1.6.2  yamt 
   1239  1.1.6.2  yamt     t3_init_rx_mode(&rm, p);
   1240  1.1.6.2  yamt     t3_mac_set_rx_mode(mac, &rm);
   1241  1.1.6.2  yamt }
   1242  1.1.6.2  yamt 
   1243  1.1.6.2  yamt static void
   1244  1.1.6.2  yamt cxgb_stop_locked(struct port_info *p)
   1245  1.1.6.2  yamt {
   1246  1.1.6.2  yamt     struct ifnet *ifp;
   1247  1.1.6.2  yamt 
   1248  1.1.6.2  yamt     PORT_LOCK_ASSERT_OWNED(p);
   1249  1.1.6.2  yamt     ADAPTER_LOCK_ASSERT_NOTOWNED(p->adapter);
   1250  1.1.6.2  yamt 
   1251  1.1.6.2  yamt     ifp = p->ifp;
   1252  1.1.6.2  yamt 
   1253  1.1.6.2  yamt     t3_port_intr_disable(p->adapter, p->port_id);
   1254  1.1.6.2  yamt     ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
   1255  1.1.6.2  yamt     p->phy.ops->power_down(&p->phy, 1);
   1256  1.1.6.2  yamt     t3_mac_disable(&p->mac, MAC_DIRECTION_TX | MAC_DIRECTION_RX);
   1257  1.1.6.2  yamt 
   1258  1.1.6.2  yamt     ADAPTER_LOCK(p->adapter);
   1259  1.1.6.2  yamt     clrbit(&p->adapter->open_device_map, p->port_id);
   1260  1.1.6.2  yamt 
   1261  1.1.6.2  yamt 
   1262  1.1.6.2  yamt     if (p->adapter->open_device_map == 0) {
   1263  1.1.6.2  yamt         cxgb_down_locked(p->adapter);
   1264  1.1.6.2  yamt     } else
   1265  1.1.6.2  yamt         ADAPTER_UNLOCK(p->adapter);
   1266  1.1.6.2  yamt 
   1267  1.1.6.2  yamt }
   1268  1.1.6.2  yamt 
   1269  1.1.6.2  yamt static int
   1270  1.1.6.2  yamt cxgb_set_mtu(struct port_info *p, int mtu)
   1271  1.1.6.2  yamt {
   1272  1.1.6.2  yamt     struct ifnet *ifp = p->ifp;
   1273  1.1.6.2  yamt     struct ifreq ifr;
   1274  1.1.6.2  yamt     int error = 0;
   1275  1.1.6.2  yamt 
   1276  1.1.6.2  yamt     ifr.ifr_mtu = mtu;
   1277  1.1.6.2  yamt 
   1278  1.1.6.2  yamt     if ((mtu < ETHERMIN) || (mtu > ETHER_MAX_LEN_JUMBO))
   1279  1.1.6.2  yamt         error = EINVAL;
   1280  1.1.6.2  yamt     else if ((error = ifioctl_common(ifp, SIOCSIFMTU, &ifr)) == ENETRESET) {
   1281  1.1.6.2  yamt         error = 0;
   1282  1.1.6.2  yamt         PORT_LOCK(p);
   1283  1.1.6.2  yamt         if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
   1284  1.1.6.2  yamt             callout_stop(&p->adapter->cxgb_tick_ch);
   1285  1.1.6.2  yamt             cxgb_stop_locked(p);
   1286  1.1.6.2  yamt             cxgb_init_locked(p);
   1287  1.1.6.2  yamt         }
   1288  1.1.6.2  yamt         PORT_UNLOCK(p);
   1289  1.1.6.2  yamt     }
   1290  1.1.6.2  yamt     return (error);
   1291  1.1.6.2  yamt }
   1292  1.1.6.2  yamt 
   1293  1.1.6.2  yamt static int
   1294  1.1.6.2  yamt cxgb_ioctl(struct ifnet *ifp, unsigned long command, void *data)
   1295  1.1.6.2  yamt {
   1296  1.1.6.2  yamt     struct port_info *p = ifp->if_softc;
   1297  1.1.6.2  yamt     struct ifaddr *ifa = (struct ifaddr *)data;
   1298  1.1.6.2  yamt     struct ifreq *ifr = (struct ifreq *)data;
   1299  1.1.6.2  yamt     int flags, error = 0;
   1300  1.1.6.2  yamt 
   1301  1.1.6.2  yamt     /*
   1302  1.1.6.2  yamt      * XXX need to check that we aren't in the middle of an unload
   1303  1.1.6.2  yamt      */
   1304  1.1.6.2  yamt     printf("cxgb_ioctl(%d): command=%08lx\n", __LINE__, command);
   1305  1.1.6.2  yamt     switch (command) {
   1306  1.1.6.2  yamt     case SIOCSIFMTU:
   1307  1.1.6.2  yamt         error = cxgb_set_mtu(p, ifr->ifr_mtu);
   1308  1.1.6.2  yamt 	printf("SIOCSIFMTU: error=%d\n", error);
   1309  1.1.6.2  yamt         break;
   1310  1.1.6.2  yamt     case SIOCINITIFADDR:
   1311  1.1.6.2  yamt 	printf("SIOCINITIFADDR:\n");
   1312  1.1.6.2  yamt         PORT_LOCK(p);
   1313  1.1.6.2  yamt         if (ifa->ifa_addr->sa_family == AF_INET) {
   1314  1.1.6.2  yamt             ifp->if_flags |= IFF_UP;
   1315  1.1.6.2  yamt             if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
   1316  1.1.6.2  yamt                 cxgb_init_locked(p);
   1317  1.1.6.2  yamt             arp_ifinit(ifp, ifa);
   1318  1.1.6.2  yamt         } else
   1319  1.1.6.2  yamt             error = ether_ioctl(ifp, command, data);
   1320  1.1.6.2  yamt         PORT_UNLOCK(p);
   1321  1.1.6.2  yamt         break;
   1322  1.1.6.2  yamt     case SIOCSIFFLAGS:
   1323  1.1.6.2  yamt 	printf("SIOCSIFFLAGS:\n");
   1324  1.1.6.2  yamt #if 0
   1325  1.1.6.2  yamt 	if ((error = ifioctl_common(ifp, cmd, data)) != 0)
   1326  1.1.6.2  yamt 		break;
   1327  1.1.6.2  yamt #endif
   1328  1.1.6.2  yamt         callout_drain(&p->adapter->cxgb_tick_ch);
   1329  1.1.6.2  yamt         PORT_LOCK(p);
   1330  1.1.6.2  yamt         if (ifp->if_flags & IFF_UP) {
   1331  1.1.6.2  yamt             if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
   1332  1.1.6.2  yamt                 flags = p->if_flags;
   1333  1.1.6.2  yamt                 if (((ifp->if_flags ^ flags) & IFF_PROMISC) ||
   1334  1.1.6.2  yamt                     ((ifp->if_flags ^ flags) & IFF_ALLMULTI))
   1335  1.1.6.2  yamt                     cxgb_set_rxmode(p);
   1336  1.1.6.2  yamt             } else
   1337  1.1.6.2  yamt                 cxgb_init_locked(p);
   1338  1.1.6.2  yamt             p->if_flags = ifp->if_flags;
   1339  1.1.6.2  yamt         } else if (ifp->if_drv_flags & IFF_DRV_RUNNING)
   1340  1.1.6.2  yamt             cxgb_stop_locked(p);
   1341  1.1.6.2  yamt 
   1342  1.1.6.2  yamt         if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
   1343  1.1.6.2  yamt             adapter_t *sc = p->adapter;
   1344  1.1.6.2  yamt             callout_reset(&sc->cxgb_tick_ch,
   1345  1.1.6.2  yamt                 sc->params.stats_update_period * hz,
   1346  1.1.6.2  yamt                 cxgb_tick, sc);
   1347  1.1.6.2  yamt         }
   1348  1.1.6.2  yamt         PORT_UNLOCK(p);
   1349  1.1.6.2  yamt         break;
   1350  1.1.6.2  yamt     case SIOCSIFMEDIA:
   1351  1.1.6.2  yamt 	printf("SIOCSIFMEDIA:\n");
   1352  1.1.6.2  yamt     case SIOCGIFMEDIA:
   1353  1.1.6.2  yamt         error = ifmedia_ioctl(ifp, ifr, &p->media, command);
   1354  1.1.6.2  yamt 	printf("SIOCGIFMEDIA: error=%d\n", error);
   1355  1.1.6.2  yamt         break;
   1356  1.1.6.2  yamt     default:
   1357  1.1.6.2  yamt 	printf("Dir = %x  Len = %x  Group = '%c'  Num = %x\n",
   1358  1.1.6.2  yamt 		(unsigned int)(command&0xe0000000)>>28, (unsigned int)(command&0x1fff0000)>>16,
   1359  1.1.6.2  yamt 		(unsigned int)(command&0xff00)>>8, (unsigned int)command&0xff);
   1360  1.1.6.2  yamt         if ((error = ether_ioctl(ifp, command, data)) != ENETRESET)
   1361  1.1.6.2  yamt 		break;
   1362  1.1.6.2  yamt 	error = 0;
   1363  1.1.6.2  yamt         break;
   1364  1.1.6.2  yamt     }
   1365  1.1.6.2  yamt     return (error);
   1366  1.1.6.2  yamt }
   1367  1.1.6.2  yamt 
   1368  1.1.6.2  yamt static int
   1369  1.1.6.2  yamt cxgb_start_tx(struct ifnet *ifp, uint32_t txmax)
   1370  1.1.6.2  yamt {
   1371  1.1.6.2  yamt     struct sge_qset *qs;
   1372  1.1.6.2  yamt     struct sge_txq *txq;
   1373  1.1.6.2  yamt     struct port_info *p = ifp->if_softc;
   1374  1.1.6.2  yamt     struct mbuf *m = NULL;
   1375  1.1.6.2  yamt     int err, in_use_init, free_it;
   1376  1.1.6.2  yamt 
   1377  1.1.6.2  yamt     if (!p->link_config.link_ok)
   1378  1.1.6.2  yamt     {
   1379  1.1.6.2  yamt         return (ENXIO);
   1380  1.1.6.2  yamt     }
   1381  1.1.6.2  yamt 
   1382  1.1.6.2  yamt     if (IFQ_IS_EMPTY(&ifp->if_snd))
   1383  1.1.6.2  yamt     {
   1384  1.1.6.2  yamt         return (ENOBUFS);
   1385  1.1.6.2  yamt     }
   1386  1.1.6.2  yamt 
   1387  1.1.6.2  yamt     qs = &p->adapter->sge.qs[p->first_qset];
   1388  1.1.6.2  yamt     txq = &qs->txq[TXQ_ETH];
   1389  1.1.6.2  yamt     err = 0;
   1390  1.1.6.2  yamt 
   1391  1.1.6.2  yamt     if (txq->flags & TXQ_TRANSMITTING)
   1392  1.1.6.2  yamt     {
   1393  1.1.6.2  yamt         return (EINPROGRESS);
   1394  1.1.6.2  yamt     }
   1395  1.1.6.2  yamt 
   1396  1.1.6.2  yamt     mtx_lock(&txq->lock);
   1397  1.1.6.2  yamt     txq->flags |= TXQ_TRANSMITTING;
   1398  1.1.6.2  yamt     in_use_init = txq->in_use;
   1399  1.1.6.2  yamt     while ((txq->in_use - in_use_init < txmax) &&
   1400  1.1.6.2  yamt         (txq->size > txq->in_use + TX_MAX_DESC)) {
   1401  1.1.6.2  yamt         free_it = 0;
   1402  1.1.6.2  yamt         IFQ_DEQUEUE(&ifp->if_snd, m);
   1403  1.1.6.2  yamt         if (m == NULL)
   1404  1.1.6.2  yamt             break;
   1405  1.1.6.2  yamt         /*
   1406  1.1.6.2  yamt          * Convert chain to M_IOVEC
   1407  1.1.6.2  yamt          */
   1408  1.1.6.2  yamt         KASSERT((m->m_flags & M_IOVEC) == 0);
   1409  1.1.6.2  yamt #ifdef notyet
   1410  1.1.6.2  yamt         m0 = m;
   1411  1.1.6.2  yamt         if (collapse_mbufs && m->m_pkthdr.len > MCLBYTES &&
   1412  1.1.6.2  yamt             m_collapse(m, TX_MAX_SEGS, &m0) == EFBIG) {
   1413  1.1.6.2  yamt             if ((m0 = m_defrag(m, M_NOWAIT)) != NULL) {
   1414  1.1.6.2  yamt                 m = m0;
   1415  1.1.6.2  yamt                 m_collapse(m, TX_MAX_SEGS, &m0);
   1416  1.1.6.2  yamt             } else
   1417  1.1.6.2  yamt                 break;
   1418  1.1.6.2  yamt         }
   1419  1.1.6.2  yamt         m = m0;
   1420  1.1.6.2  yamt #endif
   1421  1.1.6.2  yamt         if ((err = t3_encap(p, &m, &free_it)) != 0)
   1422  1.1.6.2  yamt         {
   1423  1.1.6.2  yamt             printf("t3_encap() returned %d\n", err);
   1424  1.1.6.2  yamt             break;
   1425  1.1.6.2  yamt         }
   1426  1.1.6.2  yamt //        bpf_mtap(ifp, m);
   1427  1.1.6.2  yamt         if (free_it)
   1428  1.1.6.2  yamt 	{
   1429  1.1.6.2  yamt             m_freem(m);
   1430  1.1.6.2  yamt 	}
   1431  1.1.6.2  yamt     }
   1432  1.1.6.2  yamt     txq->flags &= ~TXQ_TRANSMITTING;
   1433  1.1.6.2  yamt     mtx_unlock(&txq->lock);
   1434  1.1.6.2  yamt 
   1435  1.1.6.2  yamt     if (__predict_false(err)) {
   1436  1.1.6.2  yamt         if (err == ENOMEM) {
   1437  1.1.6.2  yamt             ifp->if_drv_flags |= IFF_DRV_OACTIVE;
   1438  1.1.6.2  yamt 	// XXXXXXXXXX lock/unlock??
   1439  1.1.6.2  yamt             IF_PREPEND(&ifp->if_snd, m);
   1440  1.1.6.2  yamt         }
   1441  1.1.6.2  yamt     }
   1442  1.1.6.2  yamt     if (err == 0 && m == NULL)
   1443  1.1.6.2  yamt         err = ENOBUFS;
   1444  1.1.6.2  yamt     else if ((err == 0) &&  (txq->size <= txq->in_use + TX_MAX_DESC) &&
   1445  1.1.6.2  yamt         (ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0) {
   1446  1.1.6.2  yamt         ifp->if_drv_flags |= IFF_DRV_OACTIVE;
   1447  1.1.6.2  yamt         err = ENOSPC;
   1448  1.1.6.2  yamt     }
   1449  1.1.6.2  yamt     return (err);
   1450  1.1.6.2  yamt }
   1451  1.1.6.2  yamt 
   1452  1.1.6.2  yamt static void
   1453  1.1.6.2  yamt cxgb_start_proc(struct work *wk, void *arg)
   1454  1.1.6.2  yamt {
   1455  1.1.6.2  yamt     struct ifnet *ifp = arg;
   1456  1.1.6.2  yamt     struct port_info *pi = ifp->if_softc;
   1457  1.1.6.2  yamt     struct sge_qset *qs;
   1458  1.1.6.2  yamt     struct sge_txq *txq;
   1459  1.1.6.2  yamt     int error;
   1460  1.1.6.2  yamt 
   1461  1.1.6.2  yamt     qs = &pi->adapter->sge.qs[pi->first_qset];
   1462  1.1.6.2  yamt     txq = &qs->txq[TXQ_ETH];
   1463  1.1.6.2  yamt 
   1464  1.1.6.2  yamt     do {
   1465  1.1.6.2  yamt         if (desc_reclaimable(txq) > TX_CLEAN_MAX_DESC >> 2)
   1466  1.1.6.2  yamt             workqueue_enqueue(pi->timer_reclaim_task.wq, &pi->timer_reclaim_task.w, NULL);
   1467  1.1.6.2  yamt 
   1468  1.1.6.2  yamt         error = cxgb_start_tx(ifp, TX_START_MAX_DESC);
   1469  1.1.6.2  yamt     } while (error == 0);
   1470  1.1.6.2  yamt }
   1471  1.1.6.2  yamt 
   1472  1.1.6.2  yamt static void
   1473  1.1.6.2  yamt cxgb_start(struct ifnet *ifp)
   1474  1.1.6.2  yamt {
   1475  1.1.6.2  yamt     struct port_info *pi = ifp->if_softc;
   1476  1.1.6.2  yamt     struct sge_qset *qs;
   1477  1.1.6.2  yamt     struct sge_txq *txq;
   1478  1.1.6.2  yamt     int err;
   1479  1.1.6.2  yamt 
   1480  1.1.6.2  yamt     qs = &pi->adapter->sge.qs[pi->first_qset];
   1481  1.1.6.2  yamt     txq = &qs->txq[TXQ_ETH];
   1482  1.1.6.2  yamt 
   1483  1.1.6.2  yamt     if (desc_reclaimable(txq) > TX_CLEAN_MAX_DESC >> 2)
   1484  1.1.6.2  yamt         workqueue_enqueue(pi->timer_reclaim_task.wq, &pi->timer_reclaim_task.w, NULL);
   1485  1.1.6.2  yamt 
   1486  1.1.6.2  yamt     err = cxgb_start_tx(ifp, TX_START_MAX_DESC);
   1487  1.1.6.2  yamt 
   1488  1.1.6.2  yamt     if (err == 0)
   1489  1.1.6.2  yamt         workqueue_enqueue(pi->start_task.wq, &pi->start_task.w, NULL);
   1490  1.1.6.2  yamt }
   1491  1.1.6.2  yamt 
   1492  1.1.6.2  yamt static void
   1493  1.1.6.2  yamt cxgb_stop(struct ifnet *ifp, int reason)
   1494  1.1.6.2  yamt {
   1495  1.1.6.2  yamt     struct port_info *pi = ifp->if_softc;
   1496  1.1.6.2  yamt 
   1497  1.1.6.2  yamt     printf("cxgb_stop(): pi=%p, reason=%d\n", pi, reason);
   1498  1.1.6.2  yamt     INT3;
   1499  1.1.6.2  yamt }
   1500  1.1.6.2  yamt 
   1501  1.1.6.2  yamt static int
   1502  1.1.6.2  yamt cxgb_media_change(struct ifnet *ifp)
   1503  1.1.6.2  yamt {
   1504  1.1.6.2  yamt     printf("media change not supported: ifp=%p\n", ifp);
   1505  1.1.6.2  yamt     return (ENXIO);
   1506  1.1.6.2  yamt }
   1507  1.1.6.2  yamt 
   1508  1.1.6.2  yamt static void
   1509  1.1.6.2  yamt cxgb_media_status(struct ifnet *ifp, struct ifmediareq *ifmr)
   1510  1.1.6.2  yamt {
   1511  1.1.6.2  yamt     struct port_info *p;
   1512  1.1.6.2  yamt 
   1513  1.1.6.2  yamt     p = ifp->if_softc;
   1514  1.1.6.2  yamt 
   1515  1.1.6.2  yamt     ifmr->ifm_status = IFM_AVALID;
   1516  1.1.6.2  yamt     ifmr->ifm_active = IFM_ETHER;
   1517  1.1.6.2  yamt 
   1518  1.1.6.2  yamt     if (!p->link_config.link_ok)
   1519  1.1.6.2  yamt         return;
   1520  1.1.6.2  yamt 
   1521  1.1.6.2  yamt     ifmr->ifm_status |= IFM_ACTIVE;
   1522  1.1.6.2  yamt 
   1523  1.1.6.2  yamt     switch (p->link_config.speed) {
   1524  1.1.6.2  yamt     case 10:
   1525  1.1.6.2  yamt         ifmr->ifm_active |= IFM_10_T;
   1526  1.1.6.2  yamt         break;
   1527  1.1.6.2  yamt     case 100:
   1528  1.1.6.2  yamt         ifmr->ifm_active |= IFM_100_TX;
   1529  1.1.6.2  yamt             break;
   1530  1.1.6.2  yamt     case 1000:
   1531  1.1.6.2  yamt         ifmr->ifm_active |= IFM_1000_T;
   1532  1.1.6.2  yamt         break;
   1533  1.1.6.2  yamt     }
   1534  1.1.6.2  yamt 
   1535  1.1.6.2  yamt     if (p->link_config.duplex)
   1536  1.1.6.2  yamt         ifmr->ifm_active |= IFM_FDX;
   1537  1.1.6.2  yamt     else
   1538  1.1.6.2  yamt         ifmr->ifm_active |= IFM_HDX;
   1539  1.1.6.2  yamt }
   1540  1.1.6.2  yamt 
   1541  1.1.6.2  yamt static int
   1542  1.1.6.2  yamt cxgb_async_intr(void *data)
   1543  1.1.6.2  yamt {
   1544  1.1.6.2  yamt     adapter_t *sc = data;
   1545  1.1.6.2  yamt 
   1546  1.1.6.2  yamt     if (cxgb_debug)
   1547  1.1.6.2  yamt         device_printf(sc->dev, "cxgb_async_intr\n");
   1548  1.1.6.2  yamt     /*
   1549  1.1.6.2  yamt      * May need to sleep - defer to taskqueue
   1550  1.1.6.2  yamt      */
   1551  1.1.6.2  yamt     workqueue_enqueue(sc->slow_intr_task.wq, &sc->slow_intr_task.w, NULL);
   1552  1.1.6.2  yamt 
   1553  1.1.6.2  yamt     return (1);
   1554  1.1.6.2  yamt }
   1555  1.1.6.2  yamt 
   1556  1.1.6.2  yamt static void
   1557  1.1.6.2  yamt cxgb_ext_intr_handler(struct work *wk, void *arg)
   1558  1.1.6.2  yamt {
   1559  1.1.6.2  yamt     adapter_t *sc = (adapter_t *)arg;
   1560  1.1.6.2  yamt 
   1561  1.1.6.2  yamt     if (cxgb_debug)
   1562  1.1.6.2  yamt         printf("cxgb_ext_intr_handler\n");
   1563  1.1.6.2  yamt 
   1564  1.1.6.2  yamt     t3_phy_intr_handler(sc);
   1565  1.1.6.2  yamt 
   1566  1.1.6.2  yamt     /* Now reenable external interrupts */
   1567  1.1.6.2  yamt     ADAPTER_LOCK(sc);
   1568  1.1.6.2  yamt     if (sc->slow_intr_mask) {
   1569  1.1.6.2  yamt         sc->slow_intr_mask |= F_T3DBG;
   1570  1.1.6.2  yamt         t3_write_reg(sc, A_PL_INT_CAUSE0, F_T3DBG);
   1571  1.1.6.2  yamt         t3_write_reg(sc, A_PL_INT_ENABLE0, sc->slow_intr_mask);
   1572  1.1.6.2  yamt     }
   1573  1.1.6.2  yamt     ADAPTER_UNLOCK(sc);
   1574  1.1.6.2  yamt }
   1575  1.1.6.2  yamt 
   1576  1.1.6.2  yamt static void
   1577  1.1.6.2  yamt check_link_status(adapter_t *sc)
   1578  1.1.6.2  yamt {
   1579  1.1.6.2  yamt     int i;
   1580  1.1.6.2  yamt 
   1581  1.1.6.2  yamt     for (i = 0; i < (sc)->params.nports; ++i) {
   1582  1.1.6.2  yamt         struct port_info *p = &sc->port[i];
   1583  1.1.6.2  yamt 
   1584  1.1.6.2  yamt         if (!(p->port_type->caps & SUPPORTED_IRQ))
   1585  1.1.6.2  yamt             t3_link_changed(sc, i);
   1586  1.1.6.2  yamt         p->ifp->if_baudrate = p->link_config.speed * 1000000;
   1587  1.1.6.2  yamt     }
   1588  1.1.6.2  yamt }
   1589  1.1.6.2  yamt 
   1590  1.1.6.2  yamt static void
   1591  1.1.6.2  yamt check_t3b2_mac(struct adapter *adapter)
   1592  1.1.6.2  yamt {
   1593  1.1.6.2  yamt     int i;
   1594  1.1.6.2  yamt 
   1595  1.1.6.2  yamt     for_each_port(adapter, i) {
   1596  1.1.6.2  yamt         struct port_info *p = &adapter->port[i];
   1597  1.1.6.2  yamt         struct ifnet *ifp = p->ifp;
   1598  1.1.6.2  yamt         int status;
   1599  1.1.6.2  yamt 
   1600  1.1.6.2  yamt         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
   1601  1.1.6.2  yamt             continue;
   1602  1.1.6.2  yamt 
   1603  1.1.6.2  yamt         status = 0;
   1604  1.1.6.2  yamt         PORT_LOCK(p);
   1605  1.1.6.2  yamt         if ((ifp->if_drv_flags & IFF_DRV_RUNNING))
   1606  1.1.6.2  yamt             status = t3b2_mac_watchdog_task(&p->mac);
   1607  1.1.6.2  yamt         if (status == 1)
   1608  1.1.6.2  yamt             p->mac.stats.num_toggled++;
   1609  1.1.6.2  yamt         else if (status == 2) {
   1610  1.1.6.2  yamt             struct cmac *mac = &p->mac;
   1611  1.1.6.2  yamt 
   1612  1.1.6.2  yamt             t3_mac_set_mtu(mac, ifp->if_mtu + ETHER_HDR_LEN
   1613  1.1.6.2  yamt                 + ETHER_VLAN_ENCAP_LEN);
   1614  1.1.6.2  yamt             t3_mac_set_address(mac, 0, p->hw_addr);
   1615  1.1.6.2  yamt             cxgb_set_rxmode(p);
   1616  1.1.6.2  yamt             t3_link_start(&p->phy, mac, &p->link_config);
   1617  1.1.6.2  yamt             t3_mac_enable(mac, MAC_DIRECTION_RX | MAC_DIRECTION_TX);
   1618  1.1.6.2  yamt             t3_port_intr_enable(adapter, p->port_id);
   1619  1.1.6.2  yamt             p->mac.stats.num_resets++;
   1620  1.1.6.2  yamt         }
   1621  1.1.6.2  yamt         PORT_UNLOCK(p);
   1622  1.1.6.2  yamt     }
   1623  1.1.6.2  yamt }
   1624  1.1.6.2  yamt 
   1625  1.1.6.2  yamt static void
   1626  1.1.6.2  yamt cxgb_tick(void *arg)
   1627  1.1.6.2  yamt {
   1628  1.1.6.2  yamt     adapter_t *sc = (adapter_t *)arg;
   1629  1.1.6.2  yamt 
   1630  1.1.6.2  yamt     workqueue_enqueue(sc->tick_task.wq, &sc->tick_task.w, NULL);
   1631  1.1.6.2  yamt 
   1632  1.1.6.2  yamt     if (sc->open_device_map != 0)
   1633  1.1.6.2  yamt         callout_reset(&sc->cxgb_tick_ch, sc->params.stats_update_period * hz,
   1634  1.1.6.2  yamt             cxgb_tick, sc);
   1635  1.1.6.2  yamt }
   1636  1.1.6.2  yamt 
   1637  1.1.6.2  yamt static void
   1638  1.1.6.2  yamt cxgb_tick_handler(struct work *wk, void *arg)
   1639  1.1.6.2  yamt {
   1640  1.1.6.2  yamt     adapter_t *sc = (adapter_t *)arg;
   1641  1.1.6.2  yamt     const struct adapter_params *p = &sc->params;
   1642  1.1.6.2  yamt 
   1643  1.1.6.2  yamt     ADAPTER_LOCK(sc);
   1644  1.1.6.2  yamt     if (p->linkpoll_period)
   1645  1.1.6.2  yamt         check_link_status(sc);
   1646  1.1.6.2  yamt 
   1647  1.1.6.2  yamt     /*
   1648  1.1.6.2  yamt      * adapter lock can currently only be acquire after the
   1649  1.1.6.2  yamt      * port lock
   1650  1.1.6.2  yamt      */
   1651  1.1.6.2  yamt     ADAPTER_UNLOCK(sc);
   1652  1.1.6.2  yamt 
   1653  1.1.6.2  yamt     if (p->rev == T3_REV_B2 && p->nports < 4)
   1654  1.1.6.2  yamt         check_t3b2_mac(sc);
   1655  1.1.6.2  yamt }
   1656  1.1.6.2  yamt 
   1657  1.1.6.2  yamt static void
   1658  1.1.6.2  yamt touch_bars(device_t dev)
   1659  1.1.6.2  yamt {
   1660  1.1.6.2  yamt     /*
   1661  1.1.6.2  yamt      * Don't enable yet
   1662  1.1.6.2  yamt      */
   1663  1.1.6.2  yamt #if !defined(__LP64__) && 0
   1664  1.1.6.2  yamt     u32 v;
   1665  1.1.6.2  yamt 
   1666  1.1.6.2  yamt     pci_read_config_dword(pdev, PCI_BASE_ADDRESS_1, &v);
   1667  1.1.6.2  yamt     pci_write_config_dword(pdev, PCI_BASE_ADDRESS_1, v);
   1668  1.1.6.2  yamt     pci_read_config_dword(pdev, PCI_BASE_ADDRESS_3, &v);
   1669  1.1.6.2  yamt     pci_write_config_dword(pdev, PCI_BASE_ADDRESS_3, v);
   1670  1.1.6.2  yamt     pci_read_config_dword(pdev, PCI_BASE_ADDRESS_5, &v);
   1671  1.1.6.2  yamt     pci_write_config_dword(pdev, PCI_BASE_ADDRESS_5, v);
   1672  1.1.6.2  yamt #endif
   1673  1.1.6.2  yamt }
   1674  1.1.6.2  yamt 
   1675  1.1.6.2  yamt static __inline void
   1676  1.1.6.2  yamt reg_block_dump(struct adapter *ap, uint8_t *buf, unsigned int start,
   1677  1.1.6.2  yamt     unsigned int end)
   1678  1.1.6.2  yamt {
   1679  1.1.6.2  yamt     uint32_t *p = (uint32_t *)buf + start;
   1680  1.1.6.2  yamt 
   1681  1.1.6.2  yamt     for ( ; start <= end; start += sizeof(uint32_t))
   1682  1.1.6.2  yamt         *p++ = t3_read_reg(ap, start);
   1683  1.1.6.2  yamt }
   1684  1.1.6.2  yamt 
   1685