Ticket #10729: iwn.2.patch

File iwn.2.patch, 96.6 KB (added by jjido, 10 years ago)

FreeBSD 10.0.0 based patch

  • src/add-ons/kernel/drivers/network/wlan/iprowifi4965/dev/iwn/if_iwn.c

    diff --git a/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/dev/iwn/if_iwn.c b/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/dev/iwn/if_iwn.c
    index 8cd5a48..d3f234e 100644
    a b  
    11/*-
     2 * Copyright (c) 2013 Cedric GROSS <c.gross@kreiz-it.fr>
     3 * Copyright (c) 2011 Intel Corporation
    24 * Copyright (c) 2007-2009
    35 *  Damien Bergamini <damien.bergamini@free.fr>
    46 * Copyright (c) 2008
     
    2628#include <sys/cdefs.h>
    2729__FBSDID("$FreeBSD$");
    2830
     31#include "opt_wlan.h"
     32#include "opt_iwn.h"
     33
    2934#include <sys/param.h>
    3035#include <sys/sockio.h>
    3136#include <sys/sysctl.h>
    __FBSDID("$FreeBSD$");  
    7176
    7277#include <dev/iwn/if_iwnreg.h>
    7378#include <dev/iwn/if_iwnvar.h>
     79#include <dev/iwn/if_iwn_devid.h>
    7480
    7581struct iwn_ident {
    7682    uint16_t    vendor;
    struct iwn_ident {  
    7985};
    8086
    8187static const struct iwn_ident iwn_ident_table[] = {
    82     { 0x8086, 0x0082, "Intel Centrino Advanced-N 6205"      },
    83     { 0x8086, 0x0083, "Intel Centrino Wireless-N 1000"      },
    84     { 0x8086, 0x0084, "Intel Centrino Wireless-N 1000"      },
    85     { 0x8086, 0x0085, "Intel Centrino Advanced-N 6205"      },
    86     { 0x8086, 0x0087, "Intel Centrino Advanced-N + WiMAX 6250"  },
    87     { 0x8086, 0x0089, "Intel Centrino Advanced-N + WiMAX 6250"  },
    88     { 0x8086, 0x008a, "Intel Centrino Wireless-N 1030"      },
    89     { 0x8086, 0x008b, "Intel Centrino Wireless-N 1030"      },
    90     { 0x8086, 0x0090, "Intel Centrino Advanced-N 6230"      },
    91     { 0x8086, 0x0091, "Intel Centrino Advanced-N 6230"      },
    92 #ifdef __HAIKU__
    93     { 0x8086, 0x088e, "Intel Centrino Advanced-N 6235"      },
    94 #endif
    95     { 0x8086, 0x0885, "Intel Centrino Wireless-N + WiMAX 6150"  },
    96     { 0x8086, 0x0886, "Intel Centrino Wireless-N + WiMAX 6150"  },
    97     { 0x8086, 0x0896, "Intel Centrino Wireless-N 130"       },
    98     { 0x8086, 0x0887, "Intel Centrino Wireless-N 130"       },
    99     { 0x8086, 0x08ae, "Intel Centrino Wireless-N 100"       },
    100     { 0x8086, 0x08af, "Intel Centrino Wireless-N 100"       },
    101     { 0x8086, 0x4229, "Intel Wireless WiFi Link 4965"       },
    102     { 0x8086, 0x422b, "Intel Centrino Ultimate-N 6300"      },
    103     { 0x8086, 0x422c, "Intel Centrino Advanced-N 6200"      },
    104     { 0x8086, 0x422d, "Intel Wireless WiFi Link 4965"       },
    105     { 0x8086, 0x4230, "Intel Wireless WiFi Link 4965"       },
    106     { 0x8086, 0x4232, "Intel WiFi Link 5100"            },
    107     { 0x8086, 0x4233, "Intel Wireless WiFi Link 4965"       },
    108     { 0x8086, 0x4235, "Intel Ultimate N WiFi Link 5300"     },
    109     { 0x8086, 0x4236, "Intel Ultimate N WiFi Link 5300"     },
    110     { 0x8086, 0x4237, "Intel WiFi Link 5100"            },
    111     { 0x8086, 0x4238, "Intel Centrino Ultimate-N 6300"      },
    112     { 0x8086, 0x4239, "Intel Centrino Advanced-N 6200"      },
    113     { 0x8086, 0x423a, "Intel WiMAX/WiFi Link 5350"          },
    114     { 0x8086, 0x423b, "Intel WiMAX/WiFi Link 5350"          },
    115     { 0x8086, 0x423c, "Intel WiMAX/WiFi Link 5150"          },
    116     { 0x8086, 0x423d, "Intel WiMAX/WiFi Link 5150"          },
     88    { 0x8086, IWN_DID_6x05_1, "Intel Centrino Advanced-N 6205"      },
     89    { 0x8086, IWN_DID_1000_1, "Intel Centrino Wireless-N 1000"      },
     90    { 0x8086, IWN_DID_1000_2, "Intel Centrino Wireless-N 1000"      },
     91    { 0x8086, IWN_DID_6x05_2, "Intel Centrino Advanced-N 6205"      },
     92    { 0x8086, IWN_DID_6050_1, "Intel Centrino Advanced-N + WiMAX 6250"  },
     93    { 0x8086, IWN_DID_6050_2, "Intel Centrino Advanced-N + WiMAX 6250"  },
     94    { 0x8086, IWN_DID_x030_1, "Intel Centrino Wireless-N 1030"      },
     95    { 0x8086, IWN_DID_x030_2, "Intel Centrino Wireless-N 1030"      },
     96    { 0x8086, IWN_DID_x030_3, "Intel Centrino Advanced-N 6230"      },
     97    { 0x8086, IWN_DID_x030_4, "Intel Centrino Advanced-N 6230"      },
     98    { 0x8086, IWN_DID_6150_1, "Intel Centrino Wireless-N + WiMAX 6150"  },
     99    { 0x8086, IWN_DID_6150_2, "Intel Centrino Wireless-N + WiMAX 6150"  },
     100    { 0x8086, IWN_DID_2x30_1, "Intel Centrino Wireless-N 2230"      },
     101    { 0x8086, IWN_DID_2x30_2, "Intel Centrino Wireless-N 2230"      },
     102    { 0x8086, IWN_DID_130_1, "Intel Centrino Wireless-N 130"        },
     103    { 0x8086, IWN_DID_130_2, "Intel Centrino Wireless-N 130"        },
     104    { 0x8086, IWN_DID_100_1, "Intel Centrino Wireless-N 100"        },
     105    { 0x8086, IWN_DID_100_2, "Intel Centrino Wireless-N 100"        },
     106    { 0x8086, IWN_DID_4965_1, "Intel Wireless WiFi Link 4965"       },
     107    { 0x8086, IWN_DID_6x00_1, "Intel Centrino Ultimate-N 6300"      },
     108    { 0x8086, IWN_DID_6x00_2, "Intel Centrino Advanced-N 6200"      },
     109    { 0x8086, IWN_DID_4965_2, "Intel Wireless WiFi Link 4965"       },
     110    { 0x8086, IWN_DID_4965_3, "Intel Wireless WiFi Link 4965"       },
     111    { 0x8086, IWN_DID_5x00_1, "Intel WiFi Link 5100"            },
     112    { 0x8086, IWN_DID_4965_4, "Intel Wireless WiFi Link 4965"       },
     113    { 0x8086, IWN_DID_5x00_3, "Intel Ultimate N WiFi Link 5300"     },
     114    { 0x8086, IWN_DID_5x00_4, "Intel Ultimate N WiFi Link 5300"     },
     115    { 0x8086, IWN_DID_5x00_2, "Intel WiFi Link 5100"            },
     116    { 0x8086, IWN_DID_6x00_3, "Intel Centrino Ultimate-N 6300"      },
     117    { 0x8086, IWN_DID_6x00_4, "Intel Centrino Advanced-N 6200"      },
     118    { 0x8086, IWN_DID_5x50_1, "Intel WiMAX/WiFi Link 5350"          },
     119    { 0x8086, IWN_DID_5x50_2, "Intel WiMAX/WiFi Link 5350"          },
     120    { 0x8086, IWN_DID_5x50_3, "Intel WiMAX/WiFi Link 5150"          },
     121    { 0x8086, IWN_DID_5x50_4, "Intel WiMAX/WiFi Link 5150"          },
    117122    { 0, 0, NULL }
    118123};
    119124
    static void iwn5000_ict_reset(struct iwn_softc *);  
    159164static int  iwn_read_eeprom(struct iwn_softc *,
    160165            uint8_t macaddr[IEEE80211_ADDR_LEN]);
    161166static void iwn4965_read_eeprom(struct iwn_softc *);
     167#ifdef  IWN_DEBUG
    162168static void iwn4965_print_power_group(struct iwn_softc *, int);
     169#endif
    163170static void iwn5000_read_eeprom(struct iwn_softc *);
    164171static uint32_t iwn_eeprom_channel_flags(struct iwn_eeprom_chan *);
    165172static void iwn_read_eeprom_band(struct iwn_softc *, int);
    static void iwn_set_channel(struct ieee80211com *);  
    319326static void iwn_scan_curchan(struct ieee80211_scan_state *, unsigned long);
    320327static void iwn_scan_mindwell(struct ieee80211_scan_state *);
    321328static void iwn_hw_reset(void *, int);
     329#ifdef  IWN_DEBUG
     330static char *iwn_get_csr_string(int);
     331static void iwn_debug_register(struct iwn_softc *);
     332#endif
    322333
    323 #define IWN_DEBUG
    324 #ifdef IWN_DEBUG
     334#ifdef  IWN_DEBUG
    325335enum {
    326336    IWN_DEBUG_XMIT      = 0x00000001,   /* basic xmit operation */
    327337    IWN_DEBUG_RECV      = 0x00000002,   /* basic recv operation */
    enum {  
    336346    IWN_DEBUG_NODE      = 0x00000400,   /* node management */
    337347    IWN_DEBUG_LED       = 0x00000800,   /* led management */
    338348    IWN_DEBUG_CMD       = 0x00001000,   /* cmd submission */
     349    IWN_DEBUG_TXRATE    = 0x00002000,   /* TX rate debugging */
     350    IWN_DEBUG_PWRSAVE   = 0x00004000,   /* Power save operations */
     351    IWN_DEBUG_REGISTER  = 0x20000000,   /* print chipset register */
     352    IWN_DEBUG_TRACE     = 0x40000000,   /* Print begin and start driver function */
    339353    IWN_DEBUG_FATAL     = 0x80000000,   /* fatal errors */
    340354    IWN_DEBUG_ANY       = 0xffffffff
    341355};
    static device_method_t iwn_methods[] = {  
    399413    DEVMETHOD(device_shutdown,  iwn_shutdown),
    400414    DEVMETHOD(device_suspend,   iwn_suspend),
    401415    DEVMETHOD(device_resume,    iwn_resume),
    402 
    403     DEVMETHOD_END
     416    { 0, 0 }
    404417};
    405418
    406419static driver_t iwn_driver = {
    static driver_t iwn_driver = {  
    410423};
    411424static devclass_t iwn_devclass;
    412425
    413 DRIVER_MODULE(iwn, pci, iwn_driver, iwn_devclass, NULL, NULL);
     426DRIVER_MODULE(iwn, pci, iwn_driver, iwn_devclass, 0, 0);
    414427
    415428MODULE_VERSION(iwn, 1);
    416429
    iwn_probe(device_t dev)  
    427440        if (pci_get_vendor(dev) == ident->vendor &&
    428441            pci_get_device(dev) == ident->device) {
    429442            device_set_desc(dev, ident->name);
    430             return (BUS_PROBE_DEFAULT);
     443            return 0;
    431444        }
    432445    }
    433446    return ENXIO;
    iwn_attach(device_t dev)  
    439452    struct iwn_softc *sc = (struct iwn_softc *)device_get_softc(dev);
    440453    struct ieee80211com *ic;
    441454    struct ifnet *ifp;
    442     int i, error, rid;
     455    uint32_t reg;
     456    int i, error, result;
    443457    uint8_t macaddr[IEEE80211_ADDR_LEN];
    444458
    445459    sc->sc_dev = dev;
    446460
     461#ifdef  IWN_DEBUG
     462    error = resource_int_value(device_get_name(sc->sc_dev),
     463        device_get_unit(sc->sc_dev), "debug", &(sc->sc_debug));
     464    if (error != 0)
     465        sc->sc_debug = 0;
     466#else
     467    sc->sc_debug = 0;
     468#endif
     469
     470    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: begin\n",__func__);
     471
    447472    /*
    448473     * Get the offset of the PCI Express Capability Structure in PCI
    449474     * Configuration Space.
    iwn_attach(device_t dev)  
    457482    /* Clear device-specific "PCI retry timeout" register (41h). */
    458483    pci_write_config(dev, 0x41, 0, 1);
    459484
     485    /* Hardware bug workaround. */
     486    reg = pci_read_config(dev, PCIR_COMMAND, 2);
     487    if (reg & PCIM_CMD_INTxDIS) {
     488        DPRINTF(sc, IWN_DEBUG_RESET, "%s: PCIe INTx Disable set\n",
     489            __func__);
     490        reg &= ~PCIM_CMD_INTxDIS;
     491        pci_write_config(dev, PCIR_COMMAND, reg, 2);
     492    }
     493
    460494    /* Enable bus-mastering. */
    461495    pci_enable_busmaster(dev);
    462496
    463     rid = PCIR_BAR(0);
    464     sc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
     497    sc->mem_rid = PCIR_BAR(0);
     498    sc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->mem_rid,
    465499        RF_ACTIVE);
    466500    if (sc->mem == NULL) {
    467501        device_printf(dev, "can't map mem space\n");
    iwn_attach(device_t dev)  
    471505    sc->sc_st = rman_get_bustag(sc->mem);
    472506    sc->sc_sh = rman_get_bushandle(sc->mem);
    473507
    474     i = 1;
    475     rid = 0;
    476     if (pci_alloc_msi(dev, &i) == 0)
    477         rid = 1;
     508    sc->irq_rid = 0;
     509    if ((result = pci_msi_count(dev)) == 1 &&
     510        pci_alloc_msi(dev, &result) == 0)
     511        sc->irq_rid = 1;
    478512    /* Install interrupt handler. */
    479     sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE |
    480         (rid != 0 ? 0 : RF_SHAREABLE));
     513    sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irq_rid,
     514        RF_ACTIVE | RF_SHAREABLE);
    481515    if (sc->irq == NULL) {
    482516        device_printf(dev, "can't map interrupt\n");
    483517        error = ENOMEM;
    iwn_attach(device_t dev)  
    487521    IWN_LOCK_INIT(sc);
    488522
    489523    /* Read hardware revision and attach. */
    490     sc->hw_type = (IWN_READ(sc, IWN_HW_REV) >> 4) & 0xf;
     524    sc->hw_type = (IWN_READ(sc, IWN_HW_REV) >> IWN_HW_REV_TYPE_SHIFT)
     525        & IWN_HW_REV_TYPE_MASK;
     526    sc->subdevice_id = pci_get_subdevice(dev);
    491527    if (sc->hw_type == IWN_HW_REV_TYPE_4965)
    492528        error = iwn4965_attach(sc, pci_get_device(dev));
    493529    else
    iwn_attach(device_t dev)  
    577613        | IEEE80211_C_IBSS      /* ibss/adhoc mode */
    578614#endif
    579615        | IEEE80211_C_WME       /* WME */
     616        | IEEE80211_C_PMGT      /* Station-side power mgmt */
    580617        ;
    581618
    582619    /* Read MAC address, channels, etc from EEPROM. */
    iwn_attach(device_t dev)  
    604641    if (sc->sc_flags & IWN_FLAG_HAS_11N) {
    605642        ic->ic_rxstream = sc->nrxchains;
    606643        ic->ic_txstream = sc->ntxchains;
     644
     645        /*
     646         * The NICs we currently support cap out at 2x2 support
     647         * separate from the chains being used.
     648         *
     649         * This is a total hack to work around that until some
     650         * per-device method is implemented to return the
     651         * actual stream support.
     652         */
     653        if (ic->ic_rxstream > 2)
     654            ic->ic_rxstream = 2;
     655        if (ic->ic_txstream > 2)
     656            ic->ic_txstream = 2;
     657
    607658        ic->ic_htcaps =
    608659              IEEE80211_HTCAP_SMPS_OFF  /* SMPS mode disabled */
    609660            | IEEE80211_HTCAP_SHORTGI20 /* short GI in 20MHz */
    iwn_attach(device_t dev)  
    684735
    685736    if (bootverbose)
    686737        ieee80211_announce(ic);
     738    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
    687739    return 0;
    688740fail:
    689741    iwn_detach(dev);
     742    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end in error\n",__func__);
    690743    return error;
    691744}
    692745
    iwn4965_attach(struct iwn_softc *sc, uint16_t pid)  
    695748{
    696749    struct iwn_ops *ops = &sc->ops;
    697750
     751    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
    698752    ops->load_firmware = iwn4965_load_firmware;
    699753    ops->read_eeprom = iwn4965_read_eeprom;
    700754    ops->post_alive = iwn4965_post_alive;
    iwn4965_attach(struct iwn_softc *sc, uint16_t pid)  
    725779    sc->txchainmask = IWN_ANT_AB;
    726780    sc->rxchainmask = IWN_ANT_ABC;
    727781
     782    DPRINTF(sc, IWN_DEBUG_TRACE, "%s: end\n",__func__);
     783
    728784    return 0;
    729785}
    730786
    iwn5000_attach(struct iwn_softc *sc, uint16_t pid)  
    733789{
    734790    struct iwn_ops *ops = &sc->ops;
    735791
     792    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     793
    736794    ops->load_firmware = iwn5000_load_firmware;
    737795    ops->read_eeprom = iwn5000_read_eeprom;
    738796    ops->post_alive = iwn5000_post_alive;
    iwn5000_attach(struct iwn_softc *sc, uint16_t pid)  
    809867    default:
    810868        device_printf(sc->sc_dev, "adapter type %d not supported\n",
    811869            sc->hw_type);
     870        DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end in error\n",__func__);
    812871        return ENOTSUP;
    813872    }
    814873    return 0;
    iwn_radiotap_attach(struct iwn_softc *sc)  
    822881{
    823882    struct ifnet *ifp = sc->sc_ifp;
    824883    struct ieee80211com *ic = ifp->if_l2com;
    825 
     884    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
    826885    ieee80211_radiotap_attach(ic,
    827886        &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap),
    828887        IWN_TX_RADIOTAP_PRESENT,
    829888        &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap),
    830889        IWN_RX_RADIOTAP_PRESENT);
     890    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);
    831891}
    832892
    833893static void
    834894iwn_sysctlattach(struct iwn_softc *sc)
    835895{
     896#ifdef  IWN_DEBUG
    836897    struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->sc_dev);
    837898    struct sysctl_oid *tree = device_get_sysctl_tree(sc->sc_dev);
    838899
    839 #ifdef IWN_DEBUG
    840     sc->sc_debug = 0;
    841900    SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
    842         "debug", CTLFLAG_RW, &sc->sc_debug, 0, "control debugging printfs");
     901        "debug", CTLFLAG_RW, &sc->sc_debug, sc->sc_debug,
     902        "control debugging printfs");
    843903#endif
    844904}
    845905
    iwn_vap_create(struct ieee80211com *ic, const char name[IFNAMSIZ], int unit,  
    851911{
    852912    struct iwn_vap *ivp;
    853913    struct ieee80211vap *vap;
     914    uint8_t mac1[IEEE80211_ADDR_LEN];
     915    struct iwn_softc *sc = ic->ic_ifp->if_softc;
    854916
    855917    if (!TAILQ_EMPTY(&ic->ic_vaps))     /* only one at a time */
    856918        return NULL;
     919
     920    IEEE80211_ADDR_COPY(mac1, mac);
     921
    857922    ivp = (struct iwn_vap *) malloc(sizeof(struct iwn_vap),
    858923        M_80211_VAP, M_NOWAIT | M_ZERO);
    859924    if (ivp == NULL)
    860925        return NULL;
    861926    vap = &ivp->iv_vap;
    862     ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid, mac);
     927    ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid, mac1);
     928    ivp->ctx = IWN_RXON_BSS_CTX;
     929    IEEE80211_ADDR_COPY(ivp->macaddr, mac1);
    863930    vap->iv_bmissthreshold = 10;        /* override default */
    864931    /* Override with driver methods. */
    865932    ivp->iv_newstate = vap->iv_newstate;
    866933    vap->iv_newstate = iwn_newstate;
     934    sc->ivap[IWN_RXON_BSS_CTX] = vap;
    867935
    868936    ieee80211_ratectl_init(vap);
    869937    /* Complete setup. */
    iwn_detach(device_t dev)  
    890958    struct ieee80211com *ic;
    891959    int qid;
    892960
     961    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     962
    893963    if (ifp != NULL) {
    894964        ic = ifp->if_l2com;
    895965
    iwn_detach(device_t dev)  
    906976    /* Uninstall interrupt handler. */
    907977    if (sc->irq != NULL) {
    908978        bus_teardown_intr(dev, sc->irq, sc->sc_ih);
    909         bus_release_resource(dev, SYS_RES_IRQ, rman_get_rid(sc->irq),
    910             sc->irq);
    911         pci_release_msi(dev);
     979        bus_release_resource(dev, SYS_RES_IRQ, sc->irq_rid, sc->irq);
     980        if (sc->irq_rid == 1)
     981            pci_release_msi(dev);
    912982    }
    913983
    914984    /* Free DMA resources. */
    iwn_detach(device_t dev)  
    922992    iwn_free_fwmem(sc);
    923993
    924994    if (sc->mem != NULL)
    925         bus_release_resource(dev, SYS_RES_MEMORY,
    926             rman_get_rid(sc->mem), sc->mem);
     995        bus_release_resource(dev, SYS_RES_MEMORY, sc->mem_rid, sc->mem);
    927996
    928997    if (ifp != NULL)
    929998        if_free(ifp);
    930999
     1000    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n", __func__);
    9311001    IWN_LOCK_DESTROY(sc);
    9321002    return 0;
    9331003}
    iwn_eeprom_lock(struct iwn_softc *sc)  
    10881158            DELAY(10);
    10891159        }
    10901160    }
     1161    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end timeout\n", __func__);
    10911162    return ETIMEDOUT;
    10921163}
    10931164
    iwn_init_otprom(struct iwn_softc *sc)  
    11071178    uint16_t prev, base, next;
    11081179    int count, error;
    11091180
     1181    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     1182
    11101183    /* Wait for clock stabilization before accessing prph. */
    11111184    if ((error = iwn_clock_wait(sc)) != 0)
    11121185        return error;
    iwn_init_otprom(struct iwn_softc *sc)  
    11501223        /* Skip "next" word. */
    11511224        sc->prom_base = prev + 1;
    11521225    }
     1226
     1227    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);
     1228
    11531229    return 0;
    11541230}
    11551231
    iwn_read_prom_data(struct iwn_softc *sc, uint32_t addr, void *data, int count)  
    11601236    uint32_t val, tmp;
    11611237    int ntries;
    11621238
     1239    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     1240
    11631241    addr += sc->prom_base;
    11641242    for (; count > 0; count -= 2, addr++) {
    11651243        IWN_WRITE(sc, IWN_EEPROM, addr << 2);
    iwn_read_prom_data(struct iwn_softc *sc, uint32_t addr, void *data, int count)  
    11921270        if (count > 1)
    11931271            *out++ = val >> 24;
    11941272    }
     1273
     1274    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);
     1275
    11951276    return 0;
    11961277}
    11971278
    iwn_dma_contig_free(struct iwn_dma_info *dma)  
    12481329            bus_dmamap_sync(dma->tag, dma->map,
    12491330                BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
    12501331            bus_dmamap_unload(dma->tag, dma->map);
    1251             bus_dmamem_free(dma->tag, &dma->vaddr, dma->map);
     1332            bus_dmamem_free(dma->tag, dma->vaddr, dma->map);
    12521333            dma->vaddr = NULL;
    12531334        }
    12541335        bus_dmamap_destroy(dma->tag, dma->map);
    iwn_alloc_rx_ring(struct iwn_softc *sc, struct iwn_rx_ring *ring)  
    13221403
    13231404    ring->cur = 0;
    13241405
     1406    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     1407
    13251408    /* Allocate RX descriptors (256-byte aligned). */
    13261409    size = IWN_RX_RING_COUNT * sizeof (uint32_t);
    13271410    error = iwn_dma_contig_alloc(sc, &ring->desc_dma, (void **)&ring->desc,
    iwn_alloc_rx_ring(struct iwn_softc *sc, struct iwn_rx_ring *ring)  
    13961479    bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
    13971480        BUS_DMASYNC_PREWRITE);
    13981481
     1482    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     1483
    13991484    return 0;
    14001485
    14011486fail:   iwn_free_rx_ring(sc, ring);
     1487
     1488    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end in error\n",__func__);
     1489
    14021490    return error;
    14031491}
    14041492
    iwn_reset_rx_ring(struct iwn_softc *sc, struct iwn_rx_ring *ring)  
    14071495{
    14081496    int ntries;
    14091497
     1498    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     1499
    14101500    if (iwn_nic_lock(sc) == 0) {
    14111501        IWN_WRITE(sc, IWN_FH_RX_CONFIG, 0);
    14121502        for (ntries = 0; ntries < 1000; ntries++) {
    iwn_free_rx_ring(struct iwn_softc *sc, struct iwn_rx_ring *ring)  
    14261516{
    14271517    int i;
    14281518
     1519    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s \n", __func__);
     1520
    14291521    iwn_dma_contig_free(&ring->desc_dma);
    14301522    iwn_dma_contig_free(&ring->stat_dma);
    14311523
    iwn_alloc_tx_ring(struct iwn_softc *sc, struct iwn_tx_ring *ring, int qid)  
    14591551    ring->queued = 0;
    14601552    ring->cur = 0;
    14611553
     1554    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     1555
    14621556    /* Allocate TX descriptors (256-byte aligned). */
    14631557    size = IWN_TX_RING_COUNT * sizeof (struct iwn_tx_desc);
    14641558    error = iwn_dma_contig_alloc(sc, &ring->desc_dma, (void **)&ring->desc,
    iwn_alloc_tx_ring(struct iwn_softc *sc, struct iwn_tx_ring *ring, int qid)  
    15071601            goto fail;
    15081602        }
    15091603    }
     1604
     1605    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);
     1606
    15101607    return 0;
    15111608
    15121609fail:   iwn_free_tx_ring(sc, ring);
     1610    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end in error\n", __func__);
    15131611    return error;
    15141612}
    15151613
    iwn_reset_tx_ring(struct iwn_softc *sc, struct iwn_tx_ring *ring)  
    15181616{
    15191617    int i;
    15201618
     1619    DPRINTF(sc, IWN_DEBUG_TRACE, "->doing %s \n", __func__);
     1620
    15211621    for (i = 0; i < IWN_TX_RING_COUNT; i++) {
    15221622        struct iwn_tx_data *data = &ring->data[i];
    15231623
    iwn_free_tx_ring(struct iwn_softc *sc, struct iwn_tx_ring *ring)  
    15431643{
    15441644    int i;
    15451645
     1646    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s \n", __func__);
     1647
    15461648    iwn_dma_contig_free(&ring->desc_dma);
    15471649    iwn_dma_contig_free(&ring->cmd_dma);
    15481650
    iwn_read_eeprom(struct iwn_softc *sc, uint8_t macaddr[IEEE80211_ADDR_LEN])  
    15961698    uint16_t val;
    15971699    int error;
    15981700
     1701    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     1702
    15991703    /* Check whether adapter has an EEPROM or an OTPROM. */
    16001704    if (sc->hw_type >= IWN_HW_REV_TYPE_1000 &&
    16011705        (IWN_READ(sc, IWN_OTP_GP) & IWN_OTP_GP_DEV_SEL_OTP))
    iwn_read_eeprom(struct iwn_softc *sc, uint8_t macaddr[IEEE80211_ADDR_LEN])  
    16531757    iwn_apm_stop(sc);   /* Power OFF adapter. */
    16541758
    16551759    iwn_eeprom_unlock(sc);
     1760
     1761    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);
     1762
    16561763    return 0;
    16571764}
    16581765
    iwn4965_read_eeprom(struct iwn_softc *sc)  
    16631770    uint16_t val;
    16641771    int i;
    16651772
     1773    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     1774
    16661775    /* Read regulatory domain (4 ASCII characters). */
    16671776    iwn_read_prom_data(sc, IWN4965_EEPROM_DOMAIN, sc->eeprom_domain, 4);
    16681777
    iwn4965_read_eeprom(struct iwn_softc *sc)  
    17011810            iwn4965_print_power_group(sc, i);
    17021811    }
    17031812#endif
     1813
     1814    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);
    17041815}
    17051816
    17061817#ifdef IWN_DEBUG
    iwn5000_read_eeprom(struct iwn_softc *sc)  
    17471858    uint16_t val;
    17481859    int i;
    17491860
     1861    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     1862
    17501863    /* Read regulatory domain (4 ASCII characters). */
    17511864    iwn_read_prom_data(sc, IWN5000_EEPROM_REG, &val, 2);
    17521865    base = le16toh(val);
    iwn5000_read_eeprom(struct iwn_softc *sc)  
    17901903        DPRINTF(sc, IWN_DEBUG_CALIBRATE, "crystal calibration 0x%08x\n",
    17911904            le32toh(sc->eeprom_crystal));
    17921905    }
     1906
     1907    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);
     1908
    17931909}
    17941910
    17951911/*
    iwn_read_eeprom_band(struct iwn_softc *sc, int n)  
    18251941    uint8_t chan;
    18261942    int i, nflags;
    18271943
     1944    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     1945
    18281946    for (i = 0; i < band->nchan; i++) {
    18291947        if (!(channels[i].flags & IWN_EEPROM_CHAN_VALID)) {
    18301948            DPRINTF(sc, IWN_DEBUG_RESET,
    iwn_read_eeprom_band(struct iwn_softc *sc, int n)  
    18671985            c->ic_flags |= IEEE80211_CHAN_HT20;
    18681986        }
    18691987    }
     1988
     1989    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);
     1990
    18701991}
    18711992
    18721993static void
    iwn_read_eeprom_ht40(struct iwn_softc *sc, int n)  
    18802001    uint8_t chan;
    18812002    int i, nflags;
    18822003
    1883     if (!(sc->sc_flags & IWN_FLAG_HAS_11N))
     2004    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s start\n", __func__);
     2005
     2006    if (!(sc->sc_flags & IWN_FLAG_HAS_11N)) {
     2007        DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end no 11n\n", __func__);
    18842008        return;
     2009    }
    18852010
    18862011    for (i = 0; i < band->nchan; i++) {
    18872012        if (!(channels[i].flags & IWN_EEPROM_CHAN_VALID)) {
    iwn_read_eeprom_ht40(struct iwn_softc *sc, int n)  
    19292054        c->ic_flags &= ~IEEE80211_CHAN_HT;
    19302055        c->ic_flags |= IEEE80211_CHAN_HT40D | nflags;
    19312056    }
     2057
     2058    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);
     2059
    19322060}
    19332061
    19342062static void
    iwn_read_eeprom_enhinfo(struct iwn_softc *sc)  
    20122140    uint8_t flags;
    20132141    int i, j;
    20142142
     2143    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     2144
    20152145    iwn_read_prom_data(sc, IWN5000_EEPROM_REG, &val, 2);
    20162146    base = le16toh(val);
    20172147    iwn_read_prom_data(sc, base + IWN6000_EEPROM_ENHINFO,
    iwn_read_eeprom_enhinfo(struct iwn_softc *sc)  
    20622192            c->ic_maxpower = maxpwr;
    20632193        }
    20642194    }
     2195
     2196    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end\n", __func__);
     2197
    20652198}
    20662199
    20672200static struct ieee80211_node *
    rate2plcp(int rate)  
    20902223    return 0;
    20912224}
    20922225
    2093 static void
    2094 iwn_newassoc(struct ieee80211_node *ni, int isnew)
     2226/*
     2227 * Calculate the required PLCP value from the given rate,
     2228 * to the given node.
     2229 *
     2230 * This will take the node configuration (eg 11n, rate table
     2231 * setup, etc) into consideration.
     2232 */
     2233static uint32_t
     2234iwn_rate_to_plcp(struct iwn_softc *sc, struct ieee80211_node *ni,
     2235    uint8_t rate)
    20952236{
    20962237#define RV(v)   ((v) & IEEE80211_RATE_VAL)
    20972238    struct ieee80211com *ic = ni->ni_ic;
    2098     struct iwn_softc *sc = ic->ic_ifp->if_softc;
    2099     struct iwn_node *wn = (void *)ni;
    21002239    uint8_t txant1, txant2;
    2101     int i, plcp, rate, ridx;
     2240    uint32_t plcp = 0;
     2241    int ridx;
    21022242
    21032243    /* Use the first valid TX antenna. */
    21042244    txant1 = IWN_LSB(sc->txchainmask);
    21052245    txant2 = IWN_LSB(sc->txchainmask & ~txant1);
    21062246
     2247    /*
     2248     * If it's an MCS rate, let's set the plcp correctly
     2249     * and set the relevant flags based on the node config.
     2250     */
    21072251    if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) {
    2108         ridx = ni->ni_rates.rs_nrates - 1;
    2109         for (i = ni->ni_htrates.rs_nrates - 1; i >= 0; i--) {
    2110             plcp = RV(ni->ni_htrates.rs_rates[i]) | IWN_RFLAG_MCS;
    2111             if (IEEE80211_IS_CHAN_HT40(ni->ni_chan)) {
    2112                 plcp |= IWN_RFLAG_HT40;
    2113                 if (ni->ni_htcap & IEEE80211_HTCAP_SHORTGI40)
    2114                     plcp |= IWN_RFLAG_SGI;
    2115             } else if (ni->ni_htcap & IEEE80211_HTCAP_SHORTGI20)
     2252        /*
     2253         * Set the initial PLCP value to be between 0->31 for
     2254         * MCS 0 -> MCS 31, then set the "I'm an MCS rate!"
     2255         * flag.
     2256         */
     2257        plcp = RV(rate) | IWN_RFLAG_MCS;
     2258
     2259        /*
     2260         * XXX the following should only occur if both
     2261         * the local configuration _and_ the remote node
     2262         * advertise these capabilities.  Thus this code
     2263         * may need fixing!
     2264         */
     2265
     2266        /*
     2267         * Set the channel width and guard interval.
     2268         */
     2269        if (IEEE80211_IS_CHAN_HT40(ni->ni_chan)) {
     2270            plcp |= IWN_RFLAG_HT40;
     2271            if (ni->ni_htcap & IEEE80211_HTCAP_SHORTGI40)
    21162272                plcp |= IWN_RFLAG_SGI;
    2117             if (RV(ni->ni_htrates.rs_rates[i]) > 7)
    2118                 plcp |= IWN_RFLAG_ANT(txant1 | txant2);
    2119             else
    2120                 plcp |= IWN_RFLAG_ANT(txant1);
    2121             if (ridx >= 0) {
    2122                 rate = RV(ni->ni_rates.rs_rates[ridx]);
    2123                 wn->ridx[rate] = plcp;
    2124             }
    2125             wn->ridx[IEEE80211_RATE_MCS | i] = plcp;
    2126             ridx--;
     2273        } else if (ni->ni_htcap & IEEE80211_HTCAP_SHORTGI20) {
     2274            plcp |= IWN_RFLAG_SGI;
    21272275        }
    2128     } else {
    2129         for (i = 0; i < ni->ni_rates.rs_nrates; i++) {
    2130             rate = RV(ni->ni_rates.rs_rates[i]);
    2131             plcp = rate2plcp(rate);
    2132             ridx = ic->ic_rt->rateCodeToIndex[rate];
    2133             if (ridx < IWN_RIDX_OFDM6 &&
    2134                 IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))
    2135                 plcp |= IWN_RFLAG_CCK;
     2276
     2277        /*
     2278         * If it's a two stream rate, enable TX on both
     2279         * antennas.
     2280         *
     2281         * XXX three stream rates?
     2282         */
     2283        if (rate > 0x87)
     2284            plcp |= IWN_RFLAG_ANT(txant1 | txant2);
     2285        else
    21362286            plcp |= IWN_RFLAG_ANT(txant1);
    2137             wn->ridx[rate] = htole32(plcp);
    2138         }
     2287    } else {
     2288        /*
     2289         * Set the initial PLCP - fine for both
     2290         * OFDM and CCK rates.
     2291         */
     2292        plcp = rate2plcp(rate);
     2293
     2294        /* Set CCK flag if it's CCK */
     2295
     2296        /* XXX It would be nice to have a method
     2297         * to map the ridx -> phy table entry
     2298         * so we could just query that, rather than
     2299         * this hack to check against IWN_RIDX_OFDM6.
     2300         */
     2301        ridx = ieee80211_legacy_rate_lookup(ic->ic_rt,
     2302            rate & IEEE80211_RATE_VAL);
     2303        if (ridx < IWN_RIDX_OFDM6 &&
     2304            IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))
     2305            plcp |= IWN_RFLAG_CCK;
     2306
     2307        /* Set antenna configuration */
     2308        plcp |= IWN_RFLAG_ANT(txant1);
    21392309    }
     2310
     2311    DPRINTF(sc, IWN_DEBUG_TXRATE, "%s: rate=0x%02x, plcp=0x%08x\n",
     2312        __func__,
     2313        rate,
     2314        plcp);
     2315
     2316    return (htole32(plcp));
    21402317#undef  RV
    21412318}
    21422319
     2320static void
     2321iwn_newassoc(struct ieee80211_node *ni, int isnew)
     2322{
     2323    /* Doesn't do anything at the moment */
     2324}
     2325
    21432326static int
    21442327iwn_media_change(struct ifnet *ifp)
    21452328{
    iwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)  
    21582341    struct iwn_softc *sc = ic->ic_ifp->if_softc;
    21592342    int error = 0;
    21602343
     2344    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     2345
    21612346    DPRINTF(sc, IWN_DEBUG_STATE, "%s: %s -> %s\n", __func__,
    21622347        ieee80211_state_name[vap->iv_state], ieee80211_state_name[nstate]);
    21632348
    iwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)  
    21652350    IWN_LOCK(sc);
    21662351    callout_stop(&sc->calib_to);
    21672352
     2353    sc->rxon = &sc->rx_on[IWN_RXON_BSS_CTX];
     2354
    21682355    switch (nstate) {
    21692356    case IEEE80211_S_ASSOC:
    21702357        if (vap->iv_state != IEEE80211_S_RUN)
    iwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)  
    21782365         * !AUTH -> AUTH transition requires state reset to handle
    21792366         * reassociations correctly.
    21802367         */
    2181         sc->rxon.associd = 0;
    2182         sc->rxon.filter &= ~htole32(IWN_FILTER_BSS);
     2368        sc->rxon->associd = 0;
     2369        sc->rxon->filter &= ~htole32(IWN_FILTER_BSS);
    21832370        sc->calib.state = IWN_CALIB_STATE_INIT;
    21842371
    21852372        if ((error = iwn_auth(sc, vap)) != 0) {
    iwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)  
    22172404    }
    22182405    IWN_UNLOCK(sc);
    22192406    IEEE80211_LOCK(ic);
    2220     if (error != 0)
     2407    if (error != 0){
     2408        DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end in error\n", __func__);
    22212409        return error;
     2410    }
     2411
     2412    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     2413
    22222414    return ivp->iv_newstate(vap, nstate, arg);
    22232415}
    22242416
    iwn_rx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc,  
    22822474    uint32_t flags;
    22832475    int error, len, rssi, nf;
    22842476
     2477    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     2478
    22852479    if (desc->type == IWN_MPDU_RX_DONE) {
    22862480        /* Check for prior RX_PHY notification. */
    22872481        if (!sc->last_rx_valid) {
    iwn_rx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc,  
    24202614        (void)ieee80211_input_all(ic, m, rssi - nf, nf);
    24212615
    24222616    IWN_LOCK(sc);
     2617
     2618    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     2619
    24232620}
    24242621
    24252622/* Process an incoming Compressed BlockAck. */
    iwn_rx_compressed_ba(struct iwn_softc *sc, struct iwn_rx_desc *desc,  
    24412638    uint8_t tid;
    24422639    int ackfailcnt = 0, i, lastidx, qid, *res, shift;
    24432640
     2641    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     2642
    24442643    bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD);
    24452644
    24462645    qid = le16toh(ba->qid);
    24472646    txq = &sc->txq[ba->qid];
    24482647    tap = sc->qid2tap[ba->qid];
    2449     tid = WME_AC_TO_TID(tap->txa_ac);
     2648    tid = tap->txa_ac; // FreeBSD 10.0.0: tap->txa_tid;
    24502649    wn = (void *)tap->txa_ni;
    24512650
    24522651    res = NULL;
    iwn_rx_compressed_ba(struct iwn_softc *sc, struct iwn_rx_desc *desc,  
    24692668        KASSERT(ni != NULL, ("no node"));
    24702669        KASSERT(m != NULL, ("no mbuf"));
    24712670
    2472         if (m->m_flags & M_TXCB)
    2473             ieee80211_process_callback(ni, m, 1);
    2474 
    2475         m_freem(m);
    2476         ieee80211_free_node(ni);
     2671        ieee80211_tx_complete(ni, m, 1);
    24772672
    24782673        txq->queued--;
    24792674        txq->read = (txq->read + 1) % IWN_TX_RING_COUNT;
    iwn_rx_compressed_ba(struct iwn_softc *sc, struct iwn_rx_desc *desc,  
    25122707        }
    25132708        bitmap >>= 1;
    25142709    }
     2710
     2711    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     2712
    25152713}
    25162714
    25172715/*
    iwn5000_rx_calib_results(struct iwn_softc *sc, struct iwn_rx_desc *desc,  
    25252723    struct iwn_phy_calib *calib = (struct iwn_phy_calib *)(desc + 1);
    25262724    int len, idx = -1;
    25272725
     2726    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     2727
    25282728    /* Runtime firmware should not send such a notification. */
    2529     if (sc->sc_flags & IWN_FLAG_CALIB_DONE)
     2729    if (sc->sc_flags & IWN_FLAG_CALIB_DONE){
     2730        DPRINTF(sc, IWN_DEBUG_TRACE, "->%s received after clib done\n",
     2731        __func__);
    25302732        return;
    2531 
     2733    }
    25322734    len = (le32toh(desc->len) & 0x3fff) - 4;
    25332735    bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD);
    25342736
    iwn_rx_statistics(struct iwn_softc *sc, struct iwn_rx_desc *desc,  
    25902792    struct iwn_stats *stats = (struct iwn_stats *)(desc + 1);
    25912793    int temp;
    25922794
     2795    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     2796
    25932797    /* Ignore statistics received during a scan. */
    25942798    if (vap->iv_state != IEEE80211_S_RUN ||
    2595         (ic->ic_flags & IEEE80211_F_SCAN))
     2799        (ic->ic_flags & IEEE80211_F_SCAN)){
     2800        DPRINTF(sc, IWN_DEBUG_TRACE, "->%s received during calib\n",
     2801        __func__);
    25962802        return;
     2803    }
    25972804
    25982805    bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD);
    25992806
    iwn_rx_statistics(struct iwn_softc *sc, struct iwn_rx_desc *desc,  
    26312838        iwn_collect_noise(sc, &stats->rx.general);
    26322839    else if (calib->state == IWN_CALIB_STATE_RUN)
    26332840        iwn_tune_sensitivity(sc, &stats->rx);
     2841
     2842    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
    26342843}
    26352844
    26362845/*
    iwn_tx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, int ackfailcnt,  
    27122921
    27132922    KASSERT(data->ni != NULL, ("no node"));
    27142923
     2924    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     2925
    27152926    /* Unmap and free mbuf. */
    27162927    bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTWRITE);
    27172928    bus_dmamap_unload(ring->data_dmat, data->map);
    iwn_tx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, int ackfailcnt,  
    27192930    ni = data->ni, data->ni = NULL;
    27202931    vap = ni->ni_vap;
    27212932
    2722     if (m->m_flags & M_TXCB) {
    2723         /*
    2724          * Channels marked for "radar" require traffic to be received
    2725          * to unlock before we can transmit.  Until traffic is seen
    2726          * any attempt to transmit is returned immediately with status
    2727          * set to IWN_TX_FAIL_TX_LOCKED.  Unfortunately this can easily
    2728          * happen on first authenticate after scanning.  To workaround
    2729          * this we ignore a failure of this sort in AUTH state so the
    2730          * 802.11 layer will fall back to using a timeout to wait for
    2731          * the AUTH reply.  This allows the firmware time to see
    2732          * traffic so a subsequent retry of AUTH succeeds.  It's
    2733          * unclear why the firmware does not maintain state for
    2734          * channels recently visited as this would allow immediate
    2735          * use of the channel after a scan (where we see traffic).
    2736          */
    2737         if (status == IWN_TX_FAIL_TX_LOCKED &&
    2738             ni->ni_vap->iv_state == IEEE80211_S_AUTH)
    2739             ieee80211_process_callback(ni, m, 0);
    2740         else
    2741             ieee80211_process_callback(ni, m,
    2742                 (status & IWN_TX_FAIL) != 0);
    2743     }
    2744 
    27452933    /*
    27462934     * Update rate control statistics for the node.
    27472935     */
    iwn_tx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, int ackfailcnt,  
    27542942        ieee80211_ratectl_tx_complete(vap, ni,
    27552943            IEEE80211_RATECTL_TX_SUCCESS, &ackfailcnt, NULL);
    27562944    }
    2757     m_freem(m);
    2758     ieee80211_free_node(ni);
     2945
     2946    /*
     2947     * Channels marked for "radar" require traffic to be received
     2948     * to unlock before we can transmit.  Until traffic is seen
     2949     * any attempt to transmit is returned immediately with status
     2950     * set to IWN_TX_FAIL_TX_LOCKED.  Unfortunately this can easily
     2951     * happen on first authenticate after scanning.  To workaround
     2952     * this we ignore a failure of this sort in AUTH state so the
     2953     * 802.11 layer will fall back to using a timeout to wait for
     2954     * the AUTH reply.  This allows the firmware time to see
     2955     * traffic so a subsequent retry of AUTH succeeds.  It's
     2956     * unclear why the firmware does not maintain state for
     2957     * channels recently visited as this would allow immediate
     2958     * use of the channel after a scan (where we see traffic).
     2959     */
     2960    if (status == IWN_TX_FAIL_TX_LOCKED &&
     2961        ni->ni_vap->iv_state == IEEE80211_S_AUTH)
     2962        ieee80211_tx_complete(ni, m, 0);
     2963    else
     2964        ieee80211_tx_complete(ni, m,
     2965            (status & IWN_TX_FAIL) != 0);
    27592966
    27602967    sc->sc_tx_timer = 0;
    27612968    if (--ring->queued < IWN_TX_RING_LOMARK) {
    iwn_tx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, int ackfailcnt,  
    27662973            iwn_start_locked(ifp);
    27672974        }
    27682975    }
     2976
     2977    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     2978
    27692979}
    27702980
    27712981/*
    iwn_ampdu_tx_done(struct iwn_softc *sc, int qid, int idx, int nframes,  
    28133023    uint8_t tid;
    28143024    int bit, i, lastidx, *res, seqno, shift, start;
    28153025
     3026    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     3027
    28163028#ifdef NOT_YET
    28173029    if (nframes == 1) {
    28183030        if ((*status & 0xff) != 1 && (*status & 0xff) != 2)
    iwn_ampdu_tx_done(struct iwn_softc *sc, int qid, int idx, int nframes,  
    28443056        bitmap |= 1ULL << bit;
    28453057    }
    28463058    tap = sc->qid2tap[qid];
    2847     tid = WME_AC_TO_TID(tap->txa_ac);
     3059    tid = tap->txa_ac; // FreeBSD 10.0.0: tap->txa_tid;
    28483060    wn = (void *)tap->txa_ni;
    28493061    wn->agg[tid].bitmap = bitmap;
    28503062    wn->agg[tid].startidx = start;
    iwn_ampdu_tx_done(struct iwn_softc *sc, int qid, int idx, int nframes,  
    28713083        KASSERT(ni != NULL, ("no node"));
    28723084        KASSERT(m != NULL, ("no mbuf"));
    28733085
    2874         if (m->m_flags & M_TXCB)
    2875             ieee80211_process_callback(ni, m, 1);
    2876 
    2877         m_freem(m);
    2878         ieee80211_free_node(ni);
     3086        ieee80211_tx_complete(ni, m, 1);
    28793087
    28803088        ring->queued--;
    28813089        ring->read = (ring->read + 1) % IWN_TX_RING_COUNT;
    iwn_ampdu_tx_done(struct iwn_softc *sc, int qid, int idx, int nframes,  
    28993107            iwn_start_locked(ifp);
    29003108        }
    29013109    }
     3110
     3111    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     3112
    29023113}
    29033114
    29043115/*
    iwn_notif_intr(struct iwn_softc *sc)  
    30173228        }
    30183229        case IWN_STATE_CHANGED:
    30193230        {
    3020             uint32_t *status = (uint32_t *)(desc + 1);
    3021 
    30223231            /*
    30233232             * State change allows hardware switch change to be
    30243233             * noted. However, we handle this in iwn_intr as we
    iwn_notif_intr(struct iwn_softc *sc)  
    30263235             */
    30273236            bus_dmamap_sync(sc->rxq.data_dmat, data->map,
    30283237                BUS_DMASYNC_POSTREAD);
     3238#ifdef  IWN_DEBUG
     3239            uint32_t *status = (uint32_t *)(desc + 1);
    30293240            DPRINTF(sc, IWN_DEBUG_INTR, "state changed to %x\n",
    30303241                le32toh(*status));
     3242#endif
    30313243            break;
    30323244        }
    30333245        case IWN_START_SCAN:
    30343246        {
    3035             struct iwn_start_scan *scan =
    3036                 (struct iwn_start_scan *)(desc + 1);
    3037 
    30383247            bus_dmamap_sync(sc->rxq.data_dmat, data->map,
    30393248                BUS_DMASYNC_POSTREAD);
     3249#ifdef  IWN_DEBUG
     3250            struct iwn_start_scan *scan =
     3251                (struct iwn_start_scan *)(desc + 1);
    30403252            DPRINTF(sc, IWN_DEBUG_ANY,
    30413253                "%s: scanning channel %d status %x\n",
    30423254                __func__, scan->chan, le32toh(scan->status));
     3255#endif
    30433256            break;
    30443257        }
    30453258        case IWN_STOP_SCAN:
    30463259        {
    3047             struct iwn_stop_scan *scan =
    3048                 (struct iwn_stop_scan *)(desc + 1);
    3049 
    30503260            bus_dmamap_sync(sc->rxq.data_dmat, data->map,
    30513261                BUS_DMASYNC_POSTREAD);
     3262#ifdef  IWN_DEBUG
     3263            struct iwn_stop_scan *scan =
     3264                (struct iwn_stop_scan *)(desc + 1);
    30523265            DPRINTF(sc, IWN_DEBUG_STATE,
    30533266                "scan finished nchan=%d status=%d chan=%d\n",
    30543267                scan->nchan, scan->status, scan->chan);
     3268#endif
    30553269
    30563270            IWN_UNLOCK(sc);
    30573271            ieee80211_scan_next(vap);
    iwn_intr(void *arg)  
    31843398
    31853399    IWN_LOCK(sc);
    31863400
    3187 #if !defined(__HAIKU__)
    31883401    /* Disable interrupts. */
    31893402    IWN_WRITE(sc, IWN_INT_MASK, 0);
    31903403
    iwn_intr(void *arg)  
    32093422            return; /* Hardware gone! */
    32103423        r2 = IWN_READ(sc, IWN_FH_INT);
    32113424    }
    3212 #else
    3213     r1 = atomic_get((int32 *)&sc->sc_intr_status_1);
    3214     r2 = atomic_get((int32 *)&sc->sc_intr_status_2);
    3215 #endif
    32163425
    3217     DPRINTF(sc, IWN_DEBUG_INTR, "interrupt reg1=%x reg2=%x\n", r1, r2);
     3426    DPRINTF(sc, IWN_DEBUG_INTR, "interrupt reg1=0x%08x reg2=0x%08x\n"
     3427    , r1, r2);
    32183428
    32193429    if (r1 == 0 && r2 == 0)
    32203430        goto done;  /* Interrupt not for us. */
    iwn_intr(void *arg)  
    32353445    if (r1 & (IWN_INT_SW_ERR | IWN_INT_HW_ERR)) {
    32363446        device_printf(sc->sc_dev, "%s: fatal firmware error\n",
    32373447            __func__);
     3448#ifdef  IWN_DEBUG
     3449        iwn_debug_register(sc);
     3450#endif
    32383451        /* Dump firmware error log and stop. */
    32393452        iwn_fatal_intr(sc);
    32403453        ifp->if_flags &= ~IFF_UP;
    iwn4965_update_sched(struct iwn_softc *sc, int qid, int idx, uint8_t id,  
    32873500{
    32883501    uint16_t *w = &sc->sched[qid * IWN4965_SCHED_COUNT + idx];
    32893502
     3503    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     3504
    32903505    *w = htole16(len + 8);
    32913506    bus_dmamap_sync(sc->sched_dma.tag, sc->sched_dma.map,
    32923507        BUS_DMASYNC_PREWRITE);
    iwn5000_update_sched(struct iwn_softc *sc, int qid, int idx, uint8_t id,  
    33033518{
    33043519    uint16_t *w = &sc->sched[qid * IWN5000_SCHED_COUNT + idx];
    33053520
     3521    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     3522
    33063523    *w = htole16(id << 12 | (len + 8));
    33073524    bus_dmamap_sync(sc->sched_dma.tag, sc->sched_dma.map,
    33083525        BUS_DMASYNC_PREWRITE);
    iwn5000_reset_sched(struct iwn_softc *sc, int qid, int idx)  
    33193536{
    33203537    uint16_t *w = &sc->sched[qid * IWN5000_SCHED_COUNT + idx];
    33213538
     3539    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     3540
    33223541    *w = (*w & htole16(0xf000)) | htole16(1);
    33233542    bus_dmamap_sync(sc->sched_dma.tag, sc->sched_dma.map,
    33243543        BUS_DMASYNC_PREWRITE);
    iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni)  
    33533572    uint8_t tid, ridx, txant, type;
    33543573    int ac, i, totlen, error, pad, nsegs = 0, rate;
    33553574
     3575    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     3576
    33563577    IWN_LOCK_ASSERT(sc);
    33573578
    33583579    wh = mtod(m, struct ieee80211_frame *);
    iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni)  
    33983619        (void) ieee80211_ratectl_rate(ni, NULL, 0);
    33993620        rate = ni->ni_txrate;
    34003621    }
    3401     ridx = ic->ic_rt->rateCodeToIndex[rate];
     3622    ridx = ieee80211_legacy_rate_lookup(ic->ic_rt,
     3623        rate & IEEE80211_RATE_VAL);
    34023624
    34033625    /* Encrypt the frame if need be. */
    34043626    if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
    iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni)  
    35043726    tx->rts_ntries = 60;
    35053727    tx->data_ntries = 15;
    35063728    tx->lifetime = htole32(IWN_LIFETIME_INFINITE);
    3507     tx->rate = wn->ridx[rate];
     3729    tx->rate = iwn_rate_to_plcp(sc, ni, rate);
    35083730    if (tx->id == sc->broadcast_id) {
    35093731        /* Group or management frame. */
    35103732        tx->linkq = 0;
    iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni)  
    35973819    if (++ring->queued > IWN_TX_RING_HIMARK)
    35983820        sc->qfullmsk |= 1 << ring->qid;
    35993821
     3822    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     3823
    36003824    return 0;
    36013825}
    36023826
    iwn_tx_data_raw(struct iwn_softc *sc, struct mbuf *m,  
    36213845    int ac, totlen, error, pad, nsegs = 0, i, rate;
    36223846    uint8_t ridx, type, txant;
    36233847
     3848    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     3849
    36243850    IWN_LOCK_ASSERT(sc);
    36253851
    36263852    wh = mtod(m, struct ieee80211_frame *);
    iwn_tx_data_raw(struct iwn_softc *sc, struct mbuf *m,  
    36353861
    36363862    /* Choose a TX rate index. */
    36373863    rate = params->ibp_rate0;
    3638     ridx = ic->ic_rt->rateCodeToIndex[rate];
     3864    ridx = ieee80211_legacy_rate_lookup(ic->ic_rt,
     3865        rate & IEEE80211_RATE_VAL);
    36393866    if (ridx == (uint8_t)-1) {
    36403867        /* XXX fall back to mcast/mgmt rate? */
    36413868        m_freem(m);
    iwn_tx_data_raw(struct iwn_softc *sc, struct mbuf *m,  
    37113938    tx->rts_ntries = params->ibp_try1;
    37123939    tx->data_ntries = params->ibp_try0;
    37133940    tx->lifetime = htole32(IWN_LIFETIME_INFINITE);
     3941
     3942    /* XXX should just use  iwn_rate_to_plcp() */
    37143943    tx->rate = htole32(rate2plcp(rate));
    37153944    if (ridx < IWN_RIDX_OFDM6 &&
    37163945        IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))
    37173946        tx->rate |= htole32(IWN_RFLAG_CCK);
     3947
    37183948    /* Group or management frame. */
    37193949    tx->linkq = 0;
    37203950    txant = IWN_LSB(sc->txchainmask);
    37213951    tx->rate |= htole32(IWN_RFLAG_ANT(txant));
     3952
    37223953    /* Set physical address of "scratch area". */
    37233954    tx->loaddr = htole32(IWN_LOADDR(data->scratch_paddr));
    37243955    tx->hiaddr = IWN_HIADDR(data->scratch_paddr);
    iwn_tx_data_raw(struct iwn_softc *sc, struct mbuf *m,  
    38014032    if (++ring->queued > IWN_TX_RING_HIMARK)
    38024033        sc->qfullmsk |= 1 << ring->qid;
    38034034
     4035    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     4036
    38044037    return 0;
    38054038}
    38064039
    iwn_raw_xmit(struct ieee80211_node *ni, struct mbuf *m,  
    38134046    struct iwn_softc *sc = ifp->if_softc;
    38144047    int error = 0;
    38154048
     4049    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     4050
    38164051    if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
    38174052        ieee80211_free_node(ni);
    38184053        m_freem(m);
    iwn_raw_xmit(struct ieee80211_node *ni, struct mbuf *m,  
    38414076    sc->sc_tx_timer = 5;
    38424077
    38434078    IWN_UNLOCK(sc);
     4079
     4080    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     4081
    38444082    return error;
    38454083}
    38464084
    iwn_watchdog(void *arg)  
    38964134
    38974135    KASSERT(ifp->if_drv_flags & IFF_DRV_RUNNING, ("not running"));
    38984136
     4137    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     4138
    38994139    if (sc->sc_tx_timer > 0) {
    39004140        if (--sc->sc_tx_timer == 0) {
    39014141            if_printf(ifp, "device timeout\n");
    iwn_cmd(struct iwn_softc *sc, int code, const void *buf, int size, int async)  
    39634203    bus_addr_t paddr;
    39644204    int totlen, error;
    39654205
     4206    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     4207
    39664208    if (async == 0)
    39674209        IWN_LOCK_ASSERT(sc);
    39684210
    iwn_cmd(struct iwn_softc *sc, int code, const void *buf, int size, int async)  
    40184260    ring->cur = (ring->cur + 1) % IWN_TX_RING_COUNT;
    40194261    IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, ring->qid << 8 | ring->cur);
    40204262
     4263    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     4264
    40214265    return async ? 0 : msleep(desc, &sc->sc_mtx, PCATCH, "iwncmd", hz);
    40224266}
    40234267
    iwn4965_add_node(struct iwn_softc *sc, struct iwn_node_info *node, int async)  
    40274271    struct iwn4965_node_info hnode;
    40284272    caddr_t src, dst;
    40294273
     4274    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     4275
    40304276    /*
    40314277     * We use the node structure for 5000 Series internally (it is
    40324278     * a superset of the one for 4965AGN). We thus copy the common
    iwn4965_add_node(struct iwn_softc *sc, struct iwn_node_info *node, int async)  
    40434289static int
    40444290iwn5000_add_node(struct iwn_softc *sc, struct iwn_node_info *node, int async)
    40454291{
     4292
     4293    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     4294
    40464295    /* Direct mapping. */
    40474296    return iwn_cmd(sc, IWN_CMD_ADD_NODE, node, sizeof (*node), async);
    40484297}
    iwn_set_link_quality(struct iwn_softc *sc, struct ieee80211_node *ni)  
    40574306    uint8_t txant;
    40584307    int i, rate, txrate;
    40594308
     4309    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     4310
    40604311    /* Use the first valid TX antenna. */
    40614312    txant = IWN_LSB(sc->txchainmask);
    40624313
    iwn_set_link_quality(struct iwn_softc *sc, struct ieee80211_node *ni)  
    40744325    else
    40754326        txrate = rs->rs_nrates - 1;
    40764327    for (i = 0; i < IWN_MAX_TX_RETRIES; i++) {
     4328        uint32_t plcp;
     4329
    40774330        if (IEEE80211_IS_CHAN_HT(ni->ni_chan))
    40784331            rate = IEEE80211_RATE_MCS | txrate;
    40794332        else
    40804333            rate = RV(rs->rs_rates[txrate]);
    4081         linkq.retry[i] = wn->ridx[rate];
    40824334
    4083         if ((le32toh(wn->ridx[rate]) & IWN_RFLAG_MCS) &&
    4084             RV(le32toh(wn->ridx[rate])) > 7)
     4335        /* Do rate -> PLCP config mapping */
     4336        plcp = iwn_rate_to_plcp(sc, ni, rate);
     4337        linkq.retry[i] = plcp;
     4338
     4339        /* Special case for dual-stream rates? */
     4340        if ((le32toh(plcp) & IWN_RFLAG_MCS) &&
     4341            RV(le32toh(plcp)) > 7)
    40854342            linkq.mimo = i + 1;
    40864343
    40874344        /* Next retry at immediate lower bit-rate. */
    40884345        if (txrate > 0)
    40894346            txrate--;
    40904347    }
     4348
     4349    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     4350
    40914351    return iwn_cmd(sc, IWN_CMD_LINK_QUALITY, &linkq, sizeof linkq, 1);
    40924352#undef  RV
    40934353}
    iwn_add_broadcast_node(struct iwn_softc *sc, int async)  
    41064366    uint8_t txant;
    41074367    int i, error;
    41084368
     4369    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     4370
     4371    sc->rxon = &sc->rx_on[IWN_RXON_BSS_CTX];
     4372
    41094373    memset(&node, 0, sizeof node);
    41104374    IEEE80211_ADDR_COPY(node.macaddr, ifp->if_broadcastaddr);
    41114375    node.id = sc->broadcast_id;
    iwn_add_broadcast_node(struct iwn_softc *sc, int async)  
    41344398    for (i = 1; i < IWN_MAX_TX_RETRIES; i++) {
    41354399        linkq.retry[i] = linkq.retry[0];
    41364400    }
     4401
     4402    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     4403
    41374404    return iwn_cmd(sc, IWN_CMD_LINK_QUALITY, &linkq, sizeof linkq, async);
    41384405}
    41394406
    iwn_updateedca(struct ieee80211com *ic)  
    41454412    struct iwn_edca_params cmd;
    41464413    int aci;
    41474414
     4415    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     4416
    41484417    memset(&cmd, 0, sizeof cmd);
    41494418    cmd.flags = htole32(IWN_EDCA_UPDATE);
    41504419    for (aci = 0; aci < WME_NUM_AC; aci++) {
    iwn_updateedca(struct ieee80211com *ic)  
    41614430    (void)iwn_cmd(sc, IWN_CMD_EDCA_PARAMS, &cmd, sizeof cmd, 1);
    41624431    IWN_UNLOCK(sc);
    41634432    IEEE80211_LOCK(ic);
     4433
     4434    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     4435
    41644436    return 0;
    41654437#undef IWN_EXP2
    41664438}
    iwn_set_led(struct iwn_softc *sc, uint8_t which, uint8_t off, uint8_t on)  
    41764448{
    41774449    struct iwn_cmd_led led;
    41784450
     4451    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     4452
    41794453    /* Clear microcode LED ownership. */
    41804454    IWN_CLRBITS(sc, IWN_LED, IWN_LED_BSM_CTRL);
    41814455
    iwn_set_critical_temp(struct iwn_softc *sc)  
    41964470    struct iwn_critical_temp crit;
    41974471    int32_t temp;
    41984472
     4473    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     4474
    41994475    IWN_WRITE(sc, IWN_UCODE_GP1_CLR, IWN_UCODE_GP1_CTEMP_STOP_RF);
    42004476
    42014477    if (sc->hw_type == IWN_HW_REV_TYPE_5150)
    iwn_set_timing(struct iwn_softc *sc, struct ieee80211_node *ni)  
    42164492    struct iwn_cmd_timing cmd;
    42174493    uint64_t val, mod;
    42184494
     4495    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     4496
    42194497    memset(&cmd, 0, sizeof cmd);
    42204498    memcpy(&cmd.tstamp, ni->ni_tstamp.data, sizeof (uint64_t));
    42214499    cmd.bintval = htole16(ni->ni_intval);
    iwn4965_power_calibration(struct iwn_softc *sc, int temp)  
    42384516    struct ifnet *ifp = sc->sc_ifp;
    42394517    struct ieee80211com *ic = ifp->if_l2com;
    42404518
     4519    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     4520
    42414521    /* Adjust TX power if need be (delta >= 3 degC). */
    42424522    DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: temperature %d->%d\n",
    42434523        __func__, sc->temp, temp);
    iwn4965_set_txpower(struct iwn_softc *sc, struct ieee80211_channel *ch,  
    42734553    int i, c, grp, maxpwr;
    42744554    uint8_t chan;
    42754555
     4556    sc->rxon = &sc->rx_on[IWN_RXON_BSS_CTX];
    42764557    /* Retrieve current channel from last RXON. */
    4277     chan = sc->rxon.chan;
     4558    chan = sc->rxon->chan;
    42784559    DPRINTF(sc, IWN_DEBUG_RESET, "setting TX power for channel %d\n",
    42794560        chan);
    42804561
    iwn5000_set_txpower(struct iwn_softc *sc, struct ieee80211_channel *ch,  
    44094690{
    44104691    struct iwn5000_cmd_txpower cmd;
    44114692
     4693    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     4694
    44124695    /*
    44134696     * TX power calibration is handled automatically by the firmware
    44144697     * for 5000 Series.
    iwn4965_get_rssi(struct iwn_softc *sc, struct iwn_rx_stat *stat)  
    44314714    uint8_t mask, agc;
    44324715    int rssi;
    44334716
     4717    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     4718
    44344719    mask = (le16toh(phy->antenna) >> 4) & IWN_ANT_ABC;
    44354720    agc  = (le16toh(phy->agc) >> 7) & 0x7f;
    44364721
    iwn5000_get_rssi(struct iwn_softc *sc, struct iwn_rx_stat *stat)  
    44564741    uint8_t agc;
    44574742    int rssi;
    44584743
     4744    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     4745
    44594746    agc = (le32toh(phy->agc) >> 9) & 0x7f;
    44604747
    44614748    rssi = MAX(le16toh(phy->rssi[0]) & 0xff,
    iwn4965_get_temperature(struct iwn_softc *sc)  
    44974784    struct iwn_ucode_info *uc = &sc->ucode_info;
    44984785    int32_t r1, r2, r3, r4, temp;
    44994786
     4787    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     4788
    45004789    r1 = le32toh(uc->temp[0].chan20MHz);
    45014790    r2 = le32toh(uc->temp[1].chan20MHz);
    45024791    r3 = le32toh(uc->temp[2].chan20MHz);
    iwn5000_get_temperature(struct iwn_softc *sc)  
    45214810{
    45224811    int32_t temp;
    45234812
     4813    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     4814
    45244815    /*
    45254816     * Temperature is not used by the driver for 5000 Series because
    45264817     * TX power calibration is handled by firmware.
    iwn_init_sensitivity(struct iwn_softc *sc)  
    45444835    uint32_t flags;
    45454836    int error;
    45464837
     4838    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     4839
    45474840    /* Reset calibration state machine. */
    45484841    memset(calib, 0, sizeof (*calib));
    45494842    calib->state = IWN_CALIB_STATE_INIT;
    iwn_collect_noise(struct iwn_softc *sc,  
    45834876{
    45844877    struct iwn_ops *ops = &sc->ops;
    45854878    struct iwn_calib_state *calib = &sc->calib;
     4879    struct ifnet *ifp = sc->sc_ifp;
     4880    struct ieee80211com *ic = ifp->if_l2com;
    45864881    uint32_t val;
    45874882    int i;
    45884883
     4884    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     4885
    45894886    /* Accumulate RSSI and noise for all 3 antennas. */
    45904887    for (i = 0; i < 3; i++) {
    45914888        calib->rssi[i] += le32toh(stats->rssi[i]) & 0xff;
    iwn_collect_noise(struct iwn_softc *sc,  
    46174914
    46184915#ifdef notyet
    46194916    /* XXX Disable RX chains with no antennas connected. */
    4620     sc->rxon.rxchain = htole16(IWN_RXCHAIN_SEL(sc->chainmask));
    4621     (void)iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, sc->rxonsz, 1);
     4917    sc->rxon->rxchain = htole16(IWN_RXCHAIN_SEL(sc->chainmask));
     4918    (void)iwn_cmd(sc, IWN_CMD_RXON, sc->rxon, sc->rxonsz, 1);
    46224919#endif
    46234920
    4624 #if 0
    4625     /* XXX: not yet */
    46264921    /* Enable power-saving mode if requested by user. */
    4627     if (sc->sc_ic.ic_flags & IEEE80211_F_PMGTON)
     4922    if (ic->ic_flags & IEEE80211_F_PMGTON)
    46284923        (void)iwn_set_pslevel(sc, 0, 3, 1);
    4629 #endif
     4924
     4925    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     4926
    46304927}
    46314928
    46324929static int
    iwn4965_init_gains(struct iwn_softc *sc)  
    46344931{
    46354932    struct iwn_phy_calib_gain cmd;
    46364933
     4934    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     4935
    46374936    memset(&cmd, 0, sizeof cmd);
    46384937    cmd.code = IWN4965_PHY_CALIB_DIFF_GAIN;
    46394938    /* Differential gains initially set to 0 for all 3 antennas. */
    iwn5000_init_gains(struct iwn_softc *sc)  
    46474946{
    46484947    struct iwn_phy_calib cmd;
    46494948
     4949    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     4950
    46504951    memset(&cmd, 0, sizeof cmd);
    46514952    cmd.code = sc->reset_noise_gain;
    46524953    cmd.ngroups = 1;
    iwn4965_set_gains(struct iwn_softc *sc)  
    46634964    struct iwn_phy_calib_gain cmd;
    46644965    int i, delta, noise;
    46654966
     4967    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     4968
    46664969    /* Get minimal noise among connected antennas. */
    46674970    noise = INT_MAX;    /* NB: There's at least one antenna. */
    46684971    for (i = 0; i < 3; i++)
    iwn5000_set_gains(struct iwn_softc *sc)  
    46964999    struct iwn_phy_calib_gain cmd;
    46975000    int i, ant, div, delta;
    46985001
     5002    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     5003
    46995004    /* We collected 20 beacons and !=6050 need a 1.5 factor. */
    47005005    div = (sc->hw_type == IWN_HW_REV_TYPE_6050) ? 20 : 30;
    47015006
    iwn_tune_sensitivity(struct iwn_softc *sc, const struct iwn_rx_stats *stats)  
    47545059    uint8_t noise[3], noise_ref;
    47555060    int i, needs_update = 0;
    47565061
     5062    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     5063
    47575064    /* Check that we've been enabled long enough. */
    4758     if ((rxena = le32toh(stats->general.load)) == 0)
     5065    if ((rxena = le32toh(stats->general.load)) == 0){
     5066        DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end not so long\n", __func__);
    47595067        return;
     5068    }
    47605069
    47615070    /* Compute number of false alarms since last call for OFDM. */
    47625071    fa  = le32toh(stats->ofdm.bad_plcp) - calib->bad_plcp_ofdm;
    iwn_tune_sensitivity(struct iwn_softc *sc, const struct iwn_rx_stats *stats)  
    48745183
    48755184    if (needs_update)
    48765185        (void)iwn_send_sensitivity(sc);
     5186
     5187    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     5188
    48775189#undef dec
    48785190#undef inc
    48795191}
    iwn_set_pslevel(struct iwn_softc *sc, int dtim, int level, int async)  
    49385250    uint32_t reg;
    49395251    int i;
    49405252
     5253    DPRINTF(sc, IWN_DEBUG_PWRSAVE,
     5254        "%s: dtim=%d, level=%d, async=%d\n",
     5255        __func__,
     5256        dtim,
     5257        level,
     5258        async);
     5259
    49415260    /* Select which PS parameters to use. */
    49425261    if (dtim <= 2)
    49435262        pmgt = &iwn_pmgt[0][level];
    iwn_send_advanced_btcoex(struct iwn_softc *sc)  
    50415360        return error;
    50425361
    50435362    /* Force BT state machine change. */
    5044     memset(&btprot, 0, sizeof btprio);
     5363    memset(&btprot, 0, sizeof btprot);
    50455364    btprot.open = 1;
    50465365    btprot.type = 1;
    50475366    error = iwn_cmd(sc, IWN_CMD_BT_COEX_PROT, &btprot, sizeof(btprot), 1);
    iwn_config(struct iwn_softc *sc)  
    50745393    uint16_t rxchain;
    50755394    int error;
    50765395
     5396    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     5397
    50775398    if (sc->hw_type == IWN_HW_REV_TYPE_6005) {
    50785399        /* Set radio temperature sensor offset. */
    50795400        error = iwn5000_temp_offset_calib(sc);
    iwn_config(struct iwn_softc *sc)  
    51235444    }
    51245445
    51255446    /* Set mode, channel, RX filter and enable RX. */
    5126     memset(&sc->rxon, 0, sizeof (struct iwn_rxon));
    5127     IEEE80211_ADDR_COPY(sc->rxon.myaddr, IF_LLADDR(ifp));
    5128     IEEE80211_ADDR_COPY(sc->rxon.wlap, IF_LLADDR(ifp));
    5129     sc->rxon.chan = ieee80211_chan2ieee(ic, ic->ic_curchan);
    5130     sc->rxon.flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF);
     5447    sc->rxon = &sc->rx_on[IWN_RXON_BSS_CTX];
     5448    memset(sc->rxon, 0, sizeof (struct iwn_rxon));
     5449    IEEE80211_ADDR_COPY(sc->rxon->myaddr, IF_LLADDR(ifp));
     5450    IEEE80211_ADDR_COPY(sc->rxon->wlap, IF_LLADDR(ifp));
     5451    sc->rxon->chan = ieee80211_chan2ieee(ic, ic->ic_curchan);
     5452    sc->rxon->flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF);
    51315453    if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan))
    5132         sc->rxon.flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ);
     5454        sc->rxon->flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ);
    51335455    switch (ic->ic_opmode) {
    51345456    case IEEE80211_M_STA:
    5135         sc->rxon.mode = IWN_MODE_STA;
    5136         sc->rxon.filter = htole32(IWN_FILTER_MULTICAST);
     5457        sc->rxon->mode = IWN_MODE_STA;
     5458        sc->rxon->filter = htole32(IWN_FILTER_MULTICAST);
    51375459        break;
    51385460    case IEEE80211_M_MONITOR:
    5139         sc->rxon.mode = IWN_MODE_MONITOR;
    5140         sc->rxon.filter = htole32(IWN_FILTER_MULTICAST |
     5461        sc->rxon->mode = IWN_MODE_MONITOR;
     5462        sc->rxon->filter = htole32(IWN_FILTER_MULTICAST |
    51415463            IWN_FILTER_CTL | IWN_FILTER_PROMISC);
    51425464        break;
    51435465    default:
    51445466        /* Should not get there. */
    51455467        break;
    51465468    }
    5147     sc->rxon.cck_mask  = 0x0f;  /* not yet negotiated */
    5148     sc->rxon.ofdm_mask = 0xff;  /* not yet negotiated */
    5149     sc->rxon.ht_single_mask = 0xff;
    5150     sc->rxon.ht_dual_mask = 0xff;
    5151     sc->rxon.ht_triple_mask = 0xff;
     5469    sc->rxon->cck_mask  = 0x0f; /* not yet negotiated */
     5470    sc->rxon->ofdm_mask = 0xff; /* not yet negotiated */
     5471    sc->rxon->ht_single_mask = 0xff;
     5472    sc->rxon->ht_dual_mask = 0xff;
     5473    sc->rxon->ht_triple_mask = 0xff;
    51525474    rxchain =
    51535475        IWN_RXCHAIN_VALID(sc->rxchainmask) |
    51545476        IWN_RXCHAIN_MIMO_COUNT(2) |
    51555477        IWN_RXCHAIN_IDLE_COUNT(2);
    5156     sc->rxon.rxchain = htole16(rxchain);
     5478    sc->rxon->rxchain = htole16(rxchain);
    51575479    DPRINTF(sc, IWN_DEBUG_RESET, "%s: setting configuration\n", __func__);
    5158     error = iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, sc->rxonsz, 0);
     5480    error = iwn_cmd(sc, IWN_CMD_RXON, sc->rxon, sc->rxonsz, 0);
    51595481    if (error != 0) {
    51605482        device_printf(sc->sc_dev, "%s: RXON command failed\n",
    51615483            __func__);
    iwn_config(struct iwn_softc *sc)  
    51875509            "%s: could not set power saving level\n", __func__);
    51885510        return error;
    51895511    }
     5512
     5513    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     5514
    51905515    return 0;
    51915516}
    51925517
    iwn_scan(struct iwn_softc *sc)  
    52215546    uint8_t txant;
    52225547    int buflen, error;
    52235548
     5549    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     5550
     5551    sc->rxon = &sc->rx_on[IWN_RXON_BSS_CTX];
    52245552    buf = malloc(IWN_SCAN_MAXSZ, M_DEVBUF, M_NOWAIT | M_ZERO);
    52255553    if (buf == NULL) {
    52265554        device_printf(sc->sc_dev,
    iwn_scan(struct iwn_softc *sc)  
    52625590    } else {
    52635591        hdr->flags = htole32(IWN_RXON_24GHZ | IWN_RXON_AUTO);
    52645592        if (sc->hw_type == IWN_HW_REV_TYPE_4965 &&
    5265             sc->rxon.associd && sc->rxon.chan > 14)
     5593            sc->rxon->associd && sc->rxon->chan > 14)
    52665594            tx->rate = htole32(0xd);
    52675595        else {
    52685596            /* Send probe requests at 1Mbps. */
    iwn_scan(struct iwn_softc *sc)  
    53215649    } else if (IEEE80211_IS_CHAN_5GHZ(c)) {
    53225650        chan->rf_gain = 0x3b;
    53235651        chan->active  = htole16(24);
    5324         if (sc->rxon.associd)
     5652        if (sc->rxon->associd)
    53255653            chan->passive = htole16(78);
    53265654        else
    53275655            chan->passive = htole16(110);
    iwn_scan(struct iwn_softc *sc)  
    53345662    } else {
    53355663        chan->rf_gain = 0x28;
    53365664        chan->active  = htole16(36);
    5337         if (sc->rxon.associd)
     5665        if (sc->rxon->associd)
    53385666            chan->passive = htole16(88);
    53395667        else
    53405668            chan->passive = htole16(120);
    iwn_scan(struct iwn_softc *sc)  
    53565684        hdr->nchan);
    53575685    error = iwn_cmd(sc, IWN_CMD_SCAN, buf, buflen, 1);
    53585686    free(buf, M_DEVBUF);
     5687
     5688    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     5689
    53595690    return error;
    53605691}
    53615692
    iwn_auth(struct iwn_softc *sc, struct ieee80211vap *vap)  
    53685699    struct ieee80211_node *ni = vap->iv_bss;
    53695700    int error;
    53705701
     5702    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     5703
     5704    sc->rxon = &sc->rx_on[IWN_RXON_BSS_CTX];
    53715705    /* Update adapter configuration. */
    5372     IEEE80211_ADDR_COPY(sc->rxon.bssid, ni->ni_bssid);
    5373     sc->rxon.chan = ieee80211_chan2ieee(ic, ni->ni_chan);
    5374     sc->rxon.flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF);
     5706    IEEE80211_ADDR_COPY(sc->rxon->bssid, ni->ni_bssid);
     5707    sc->rxon->chan = ieee80211_chan2ieee(ic, ni->ni_chan);
     5708    sc->rxon->flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF);
    53755709    if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))
    5376         sc->rxon.flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ);
     5710        sc->rxon->flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ);
    53775711    if (ic->ic_flags & IEEE80211_F_SHSLOT)
    5378         sc->rxon.flags |= htole32(IWN_RXON_SHSLOT);
     5712        sc->rxon->flags |= htole32(IWN_RXON_SHSLOT);
    53795713    if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
    5380         sc->rxon.flags |= htole32(IWN_RXON_SHPREAMBLE);
     5714        sc->rxon->flags |= htole32(IWN_RXON_SHPREAMBLE);
    53815715    if (IEEE80211_IS_CHAN_A(ni->ni_chan)) {
    5382         sc->rxon.cck_mask  = 0;
    5383         sc->rxon.ofdm_mask = 0x15;
     5716        sc->rxon->cck_mask  = 0;
     5717        sc->rxon->ofdm_mask = 0x15;
    53845718    } else if (IEEE80211_IS_CHAN_B(ni->ni_chan)) {
    5385         sc->rxon.cck_mask  = 0x03;
    5386         sc->rxon.ofdm_mask = 0;
     5719        sc->rxon->cck_mask  = 0x03;
     5720        sc->rxon->ofdm_mask = 0;
    53875721    } else {
    53885722        /* Assume 802.11b/g. */
    5389         sc->rxon.cck_mask  = 0x0f;
    5390         sc->rxon.ofdm_mask = 0x15;
     5723        sc->rxon->cck_mask  = 0x0f;
     5724        sc->rxon->ofdm_mask = 0x15;
    53915725    }
    53925726    DPRINTF(sc, IWN_DEBUG_STATE, "rxon chan %d flags %x cck %x ofdm %x\n",
    5393         sc->rxon.chan, sc->rxon.flags, sc->rxon.cck_mask,
    5394         sc->rxon.ofdm_mask);
    5395     error = iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, sc->rxonsz, 1);
     5727        sc->rxon->chan, sc->rxon->flags, sc->rxon->cck_mask,
     5728        sc->rxon->ofdm_mask);
     5729    error = iwn_cmd(sc, IWN_CMD_RXON, sc->rxon, sc->rxonsz, 1);
    53965730    if (error != 0) {
    53975731        device_printf(sc->sc_dev, "%s: RXON command failed, error %d\n",
    53985732            __func__, error);
    iwn_auth(struct iwn_softc *sc, struct ieee80211vap *vap)  
    54155749            error);
    54165750        return error;
    54175751    }
     5752
     5753    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     5754
    54185755    return 0;
    54195756}
    54205757
    iwn_run(struct iwn_softc *sc, struct ieee80211vap *vap)  
    54295766    uint32_t htflags = 0;
    54305767    int error;
    54315768
     5769    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     5770
     5771    sc->rxon = &sc->rx_on[IWN_RXON_BSS_CTX];
    54325772    if (ic->ic_opmode == IEEE80211_M_MONITOR) {
    54335773        /* Link LED blinks while monitoring. */
    54345774        iwn_set_led(sc, IWN_LED_LINK, 5, 5);
    iwn_run(struct iwn_softc *sc, struct ieee80211vap *vap)  
    54415781    }
    54425782
    54435783    /* Update adapter configuration. */
    5444     IEEE80211_ADDR_COPY(sc->rxon.bssid, ni->ni_bssid);
    5445     sc->rxon.associd = htole16(IEEE80211_AID(ni->ni_associd));
    5446     sc->rxon.chan = ieee80211_chan2ieee(ic, ni->ni_chan);
    5447     sc->rxon.flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF);
     5784    IEEE80211_ADDR_COPY(sc->rxon->bssid, ni->ni_bssid);
     5785    sc->rxon->associd = htole16(IEEE80211_AID(ni->ni_associd));
     5786    sc->rxon->chan = ieee80211_chan2ieee(ic, ni->ni_chan);
     5787    sc->rxon->flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF);
    54485788    if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))
    5449         sc->rxon.flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ);
     5789        sc->rxon->flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ);
    54505790    if (ic->ic_flags & IEEE80211_F_SHSLOT)
    5451         sc->rxon.flags |= htole32(IWN_RXON_SHSLOT);
     5791        sc->rxon->flags |= htole32(IWN_RXON_SHSLOT);
    54525792    if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
    5453         sc->rxon.flags |= htole32(IWN_RXON_SHPREAMBLE);
     5793        sc->rxon->flags |= htole32(IWN_RXON_SHPREAMBLE);
    54545794    if (IEEE80211_IS_CHAN_A(ni->ni_chan)) {
    5455         sc->rxon.cck_mask  = 0;
    5456         sc->rxon.ofdm_mask = 0x15;
     5795        sc->rxon->cck_mask  = 0;
     5796        sc->rxon->ofdm_mask = 0x15;
    54575797    } else if (IEEE80211_IS_CHAN_B(ni->ni_chan)) {
    5458         sc->rxon.cck_mask  = 0x03;
    5459         sc->rxon.ofdm_mask = 0;
     5798        sc->rxon->cck_mask  = 0x03;
     5799        sc->rxon->ofdm_mask = 0;
    54605800    } else {
    54615801        /* Assume 802.11b/g. */
    5462         sc->rxon.cck_mask  = 0x0f;
    5463         sc->rxon.ofdm_mask = 0x15;
     5802        sc->rxon->cck_mask  = 0x0f;
     5803        sc->rxon->ofdm_mask = 0x15;
    54645804    }
    54655805    if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) {
    54665806        htflags |= IWN_RXON_HT_PROTMODE(ic->ic_curhtprotmode);
    iwn_run(struct iwn_softc *sc, struct ieee80211vap *vap)  
    54775817        if (IEEE80211_IS_CHAN_HT40D(ni->ni_chan))
    54785818            htflags |= IWN_RXON_HT_HT40MINUS;
    54795819    }
    5480     sc->rxon.flags |= htole32(htflags);
    5481     sc->rxon.filter |= htole32(IWN_FILTER_BSS);
     5820    sc->rxon->flags |= htole32(htflags);
     5821    sc->rxon->filter |= htole32(IWN_FILTER_BSS);
    54825822    DPRINTF(sc, IWN_DEBUG_STATE, "rxon chan %d flags %x\n",
    5483         sc->rxon.chan, sc->rxon.flags);
    5484     error = iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, sc->rxonsz, 1);
     5823        sc->rxon->chan, sc->rxon->flags);
     5824    error = iwn_cmd(sc, IWN_CMD_RXON, sc->rxon, sc->rxonsz, 1);
    54855825    if (error != 0) {
    54865826        device_printf(sc->sc_dev,
    54875827            "%s: could not update configuration, error %d\n", __func__,
    iwn_run(struct iwn_softc *sc, struct ieee80211vap *vap)  
    55485888
    55495889    /* Link LED always on while associated. */
    55505890    iwn_set_led(sc, IWN_LED_LINK, 0, 1);
     5891
     5892    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     5893
    55515894    return 0;
    55525895}
    55535896
    iwn_ampdu_rx_start(struct ieee80211_node *ni, struct ieee80211_rx_ampdu *rap,  
    55685911    uint8_t tid;
    55695912    int error;
    55705913
     5914    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     5915
    55715916    tid = MS(le16toh(baparamset), IEEE80211_BAPS_TID);
    55725917    ssn = MS(le16toh(baseqctl), IEEE80211_BASEQ_START);
    55735918
    iwn_ampdu_rx_stop(struct ieee80211_node *ni, struct ieee80211_rx_ampdu *rap)  
    56005945    struct iwn_node_info node;
    56015946    uint8_t tid;
    56025947
     5948    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     5949
    56035950    /* XXX: tid as an argument */
    56045951    for (tid = 0; tid < WME_NUM_TID; tid++) {
    56055952        if (&ni->ni_rx_ampdu[tid] == rap)
    iwn_addba_request(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap,  
    56235970    struct iwn_softc *sc = ni->ni_ic->ic_ifp->if_softc;
    56245971    int qid;
    56255972
     5973    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     5974
    56265975    for (qid = sc->firstaggqueue; qid < sc->ntxqs; qid++) {
    56275976        if (sc->qid2tap[qid] == NULL)
    56285977            break;
    iwn_addba_response(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap,  
    56505999{
    56516000    struct iwn_softc *sc = ni->ni_ic->ic_ifp->if_softc;
    56526001    int qid = *(int *)tap->txa_private;
    5653     uint8_t tid = WME_AC_TO_TID(tap->txa_ac);
     6002    uint8_t tid = tap->txa_ac; // FreeBSD 10.0.0: tap->txa_tid;
    56546003    int ret;
    56556004
     6005    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     6006
    56566007    if (code == IEEE80211_STATUS_SUCCESS) {
    56576008        ni->ni_txseqs[tid] = tap->txa_start & 0xfff;
    56586009        ret = iwn_ampdu_tx_start(ni->ni_ic, ni, tid);
    static int  
    56746025iwn_ampdu_tx_start(struct ieee80211com *ic, struct ieee80211_node *ni,
    56756026    uint8_t tid)
    56766027{
    5677     struct ieee80211_tx_ampdu *tap = &ni->ni_tx_ampdu[TID_TO_WME_AC(tid)];
     6028    struct ieee80211_tx_ampdu *tap = &ni->ni_tx_ampdu[tid];
    56786029    struct iwn_softc *sc = ni->ni_ic->ic_ifp->if_softc;
    56796030    struct iwn_ops *ops = &sc->ops;
    56806031    struct iwn_node *wn = (void *)ni;
    56816032    struct iwn_node_info node;
    56826033    int error, qid;
    56836034
     6035    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     6036
    56846037    /* Enable TX for the specified RA/TID. */
    56856038    wn->disable_tid &= ~(1 << tid);
    56866039    memset(&node, 0, sizeof node);
    iwn_ampdu_tx_stop(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap)  
    57096062{
    57106063    struct iwn_softc *sc = ni->ni_ic->ic_ifp->if_softc;
    57116064    struct iwn_ops *ops = &sc->ops;
    5712     uint8_t tid = WME_AC_TO_TID(tap->txa_ac);
     6065    uint8_t tid = tap->txa_ac; // FreeBSD 10.0.0: tap->txa_tid;
    57136066    int qid;
    57146067
     6068    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     6069
    57156070    sc->sc_addba_stop(ni, tap);
    57166071
    57176072    if (tap->txa_private == NULL)
    iwn4965_ampdu_tx_start(struct iwn_softc *sc, struct ieee80211_node *ni,  
    57356090{
    57366091    struct iwn_node *wn = (void *)ni;
    57376092
     6093    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     6094
    57386095    /* Stop TX scheduler while we're changing its configuration. */
    57396096    iwn_prph_write(sc, IWN4965_SCHED_QUEUE_STATUS(qid),
    57406097        IWN4965_TXQ_STATUS_CHGACT);
    iwn4965_ampdu_tx_start(struct iwn_softc *sc, struct ieee80211_node *ni,  
    57706127static void
    57716128iwn4965_ampdu_tx_stop(struct iwn_softc *sc, int qid, uint8_t tid, uint16_t ssn)
    57726129{
     6130    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     6131
    57736132    /* Stop TX scheduler while we're changing its configuration. */
    57746133    iwn_prph_write(sc, IWN4965_SCHED_QUEUE_STATUS(qid),
    57756134        IWN4965_TXQ_STATUS_CHGACT);
    iwn5000_ampdu_tx_start(struct iwn_softc *sc, struct ieee80211_node *ni,  
    57926151{
    57936152    struct iwn_node *wn = (void *)ni;
    57946153
     6154    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     6155
    57956156    /* Stop TX scheduler while we're changing its configuration. */
    57966157    iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid),
    57976158        IWN5000_TXQ_STATUS_CHGACT);
    iwn5000_ampdu_tx_start(struct iwn_softc *sc, struct ieee80211_node *ni,  
    58266187static void
    58276188iwn5000_ampdu_tx_stop(struct iwn_softc *sc, int qid, uint8_t tid, uint16_t ssn)
    58286189{
     6190    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     6191
    58296192    /* Stop TX scheduler while we're changing its configuration. */
    58306193    iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid),
    58316194        IWN5000_TXQ_STATUS_CHGACT);
    iwn4965_post_alive(struct iwn_softc *sc)  
    59726335    if ((error = iwn_nic_lock(sc)) != 0)
    59736336        return error;
    59746337
     6338    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     6339
    59756340    /* Clear TX scheduler state in SRAM. */
    59766341    sc->sched_base = iwn_prph_read(sc, IWN_SCHED_SRAM_ADDR);
    59776342    iwn_mem_set_region_4(sc, sc->sched_base + IWN4965_SCHED_CTX_OFF, 0,
    iwn5000_post_alive(struct iwn_softc *sc)  
    60226387{
    60236388    int error, qid;
    60246389
    6025 #ifndef __HAIKU__
     6390    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     6391
    60266392    /* Switch to using ICT interrupt mode. */
    60276393    iwn5000_ict_reset(sc);
    6028 #endif
    60296394
    6030     if ((error = iwn_nic_lock(sc)) != 0)
     6395    if ((error = iwn_nic_lock(sc)) != 0){
     6396        DPRINTF(sc, IWN_DEBUG_TRACE, "->%s end in error\n", __func__);
    60316397        return error;
     6398    }
    60326399
    60336400    /* Clear TX scheduler state in SRAM. */
    60346401    sc->sched_base = iwn_prph_read(sc, IWN_SCHED_SRAM_ADDR);
    iwn5000_post_alive(struct iwn_softc *sc)  
    61056472        /* Send calibration results to runtime firmware. */
    61066473        error = iwn5000_send_calibration(sc);
    61076474    }
     6475
     6476    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     6477
    61086478    return error;
    61096479}
    61106480
    iwn5000_load_firmware_section(struct iwn_softc *sc, uint32_t dst,  
    62286598    struct iwn_dma_info *dma = &sc->fw_dma;
    62296599    int error;
    62306600
     6601    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     6602
    62316603    /* Copy firmware section into pre-allocated DMA-safe memory. */
    62326604    memcpy(dma->vaddr, section, size);
    62336605    bus_dmamap_sync(dma->tag, dma->map, BUS_DMASYNC_PREWRITE);
    iwn5000_load_firmware(struct iwn_softc *sc)  
    62646636    struct iwn_fw_part *fw;
    62656637    int error;
    62666638
     6639    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     6640
    62676641    /* Load the initialization firmware on first boot only. */
    62686642    fw = (sc->sc_flags & IWN_FLAG_CALIB_DONE) ?
    62696643        &sc->fw.main : &sc->fw.init;
    iwn_read_firmware_tlv(struct iwn_softc *sc, struct iwn_fw_info *fw,  
    64296803                sc->noise_gain = tmp + 1;
    64306804            }
    64316805            break;
     6806        case IWN_FW_TLV_PAN:
     6807            sc->sc_flags |= IWN_FLAG_PAN_SUPPORT;
     6808            DPRINTF(sc, IWN_DEBUG_RESET,
     6809                "PAN Support found: %d\n", 1);
     6810            break;
     6811        case IWN_FW_TLV_FLAGS :
     6812            sc->tlv_feature_flags = htole32(*ptr);
     6813            break;
     6814        case IWN_FW_TLV_PBREQ_MAXLEN:
     6815        case IWN_FW_TLV_RUNT_EVTLOG_PTR:
     6816        case IWN_FW_TLV_RUNT_EVTLOG_SIZE:
     6817        case IWN_FW_TLV_RUNT_ERRLOG_PTR:
     6818        case IWN_FW_TLV_INIT_EVTLOG_PTR:
     6819        case IWN_FW_TLV_INIT_EVTLOG_SIZE:
     6820        case IWN_FW_TLV_INIT_ERRLOG_PTR:
     6821        case IWN_FW_TLV_WOWLAN_INST:
     6822        case IWN_FW_TLV_WOWLAN_DATA:
     6823            DPRINTF(sc, IWN_DEBUG_RESET,
     6824                "TLV type %d reconized but not handled\n",
     6825                le16toh(tlv->type));
     6826            break;
    64326827        default:
    64336828            DPRINTF(sc, IWN_DEBUG_RESET,
    64346829                "TLV type %d not handled\n", le16toh(tlv->type));
    iwn_read_firmware(struct iwn_softc *sc)  
    64466841    struct iwn_fw_info *fw = &sc->fw;
    64476842    int error;
    64486843
     6844    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     6845
    64496846    IWN_UNLOCK(sc);
    64506847
    64516848    memset(fw, 0, sizeof (*fw));
    iwn_apm_init(struct iwn_softc *sc)  
    65276924    uint32_t reg;
    65286925    int error;
    65296926
     6927    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     6928
    65306929    /* Disable L0s exit timer (NMI bug workaround). */
    65316930    IWN_SETBITS(sc, IWN_GIO_CHICKEN, IWN_GIO_CHICKEN_DIS_L0S_TIMER);
    65326931    /* Don't wait for ICH L0s (ICH bug workaround). */
    iwn_apm_stop(struct iwn_softc *sc)  
    66047003static int
    66057004iwn4965_nic_config(struct iwn_softc *sc)
    66067005{
     7006    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     7007
    66077008    if (IWN_RFCFG_TYPE(sc->rfcfg) == 1) {
    66087009        /*
    66097010         * I don't believe this to be correct but this is what the
    iwn5000_nic_config(struct iwn_softc *sc)  
    66267027    uint32_t tmp;
    66277028    int error;
    66287029
     7030    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     7031
    66297032    if (IWN_RFCFG_TYPE(sc->rfcfg) < 3) {
    66307033        IWN_SETBITS(sc, IWN_HW_IF_CONFIG,
    66317034            IWN_RFCFG_TYPE(sc->rfcfg) |
    iwn_hw_prepare(struct iwn_softc *sc)  
    66747077{
    66757078    int ntries;
    66767079
     7080    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     7081
    66777082    /* Check if hardware is ready. */
    66787083    IWN_SETBITS(sc, IWN_HW_IF_CONFIG, IWN_HW_IF_CONFIG_NIC_READY);
    66797084    for (ntries = 0; ntries < 5; ntries++) {
    iwn_hw_init(struct iwn_softc *sc)  
    67117116    struct iwn_ops *ops = &sc->ops;
    67127117    int error, chnl, qid;
    67137118
     7119    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     7120
    67147121    /* Clear pending interrupts. */
    67157122    IWN_WRITE(sc, IWN_INT, 0xffffffff);
    67167123
    iwn_hw_init(struct iwn_softc *sc)  
    68107217        return error;
    68117218    }
    68127219    /* Do post-firmware initialization. */
     7220
     7221    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     7222
    68137223    return ops->post_alive(sc);
    68147224}
    68157225
    iwn_hw_stop(struct iwn_softc *sc)  
    68187228{
    68197229    int chnl, qid, ntries;
    68207230
     7231    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     7232
    68217233    IWN_WRITE(sc, IWN_RESET, IWN_RESET_NEVO);
    68227234
    68237235    /* Disable interrupts. */
    iwn_radio_on(void *arg0, int pending)  
    68717283    struct ieee80211com *ic = ifp->if_l2com;
    68727284    struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
    68737285
     7286    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     7287
    68747288    if (vap != NULL) {
    68757289        iwn_init(sc);
    68767290        ieee80211_init(vap);
    iwn_radio_off(void *arg0, int pending)  
    68857299    struct ieee80211com *ic = ifp->if_l2com;
    68867300    struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
    68877301
     7302    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     7303
    68887304    iwn_stop(sc);
    68897305    if (vap != NULL)
    68907306        ieee80211_stop(vap);
    iwn_init_locked(struct iwn_softc *sc)  
    69027318    struct ifnet *ifp = sc->sc_ifp;
    69037319    int error;
    69047320
     7321    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s begin\n", __func__);
     7322
    69057323    IWN_LOCK_ASSERT(sc);
    69067324
    69077325    if ((error = iwn_hw_prepare(sc)) != 0) {
    iwn_init_locked(struct iwn_softc *sc)  
    69557373    ifp->if_drv_flags |= IFF_DRV_RUNNING;
    69567374
    69577375    callout_reset(&sc->watchdog_to, hz, iwn_watchdog, sc);
     7376
     7377    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
     7378
    69587379    return;
    69597380
    69607381fail:   iwn_stop_locked(sc);
     7382    DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end in error\n",__func__);
    69617383}
    69627384
    69637385static void
    iwn_set_channel(struct ieee80211com *ic)  
    70437465    struct iwn_softc *sc = ifp->if_softc;
    70447466    int error;
    70457467
     7468    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     7469
    70467470    IWN_LOCK(sc);
    70477471    sc->sc_rxtap.wr_chan_freq = htole16(c->ic_freq);
    70487472    sc->sc_rxtap.wr_chan_flags = htole16(c->ic_flags);
    iwn_hw_reset(void *arg0, int pending)  
    70977521    struct ifnet *ifp = sc->sc_ifp;
    70987522    struct ieee80211com *ic = ifp->if_l2com;
    70997523
     7524    DPRINTF(sc, IWN_DEBUG_TRACE, "->Doing %s\n", __func__);
     7525
    71007526    iwn_stop(sc);
    71017527    iwn_init(sc);
    71027528    ieee80211_notify_radio(ic, 1);
    71037529}
     7530#ifdef  IWN_DEBUG
     7531#define IWN_DESC(x) case x: return #x
     7532#define COUNTOF(array) (sizeof(array) / sizeof(array[0]))
     7533
     7534/*
     7535 * Translate CSR code to string
     7536 */
     7537static char *iwn_get_csr_string(int csr)
     7538{
     7539    switch (csr) {
     7540        IWN_DESC(IWN_HW_IF_CONFIG);
     7541        IWN_DESC(IWN_INT_COALESCING);
     7542        IWN_DESC(IWN_INT);
     7543        IWN_DESC(IWN_INT_MASK);
     7544        IWN_DESC(IWN_FH_INT);
     7545        IWN_DESC(IWN_GPIO_IN);
     7546        IWN_DESC(IWN_RESET);
     7547        IWN_DESC(IWN_GP_CNTRL);
     7548        IWN_DESC(IWN_HW_REV);
     7549        IWN_DESC(IWN_EEPROM);
     7550        IWN_DESC(IWN_EEPROM_GP);
     7551        IWN_DESC(IWN_OTP_GP);
     7552        IWN_DESC(IWN_GIO);
     7553        IWN_DESC(IWN_GP_UCODE);
     7554        IWN_DESC(IWN_GP_DRIVER);
     7555        IWN_DESC(IWN_UCODE_GP1);
     7556        IWN_DESC(IWN_UCODE_GP2);
     7557        IWN_DESC(IWN_LED);
     7558        IWN_DESC(IWN_DRAM_INT_TBL);
     7559        IWN_DESC(IWN_GIO_CHICKEN);
     7560        IWN_DESC(IWN_ANA_PLL);
     7561        IWN_DESC(IWN_HW_REV_WA);
     7562        IWN_DESC(IWN_DBG_HPET_MEM);
     7563    default:
     7564        return "UNKNOWN CSR";
     7565    }
     7566}
     7567
     7568/*
     7569 * This function print firmware register
     7570 */
     7571static void
     7572iwn_debug_register(struct iwn_softc *sc)
     7573{
     7574    int i;
     7575    static const uint32_t csr_tbl[] = {
     7576        IWN_HW_IF_CONFIG,
     7577        IWN_INT_COALESCING,
     7578        IWN_INT,
     7579        IWN_INT_MASK,
     7580        IWN_FH_INT,
     7581        IWN_GPIO_IN,
     7582        IWN_RESET,
     7583        IWN_GP_CNTRL,
     7584        IWN_HW_REV,
     7585        IWN_EEPROM,
     7586        IWN_EEPROM_GP,
     7587        IWN_OTP_GP,
     7588        IWN_GIO,
     7589        IWN_GP_UCODE,
     7590        IWN_GP_DRIVER,
     7591        IWN_UCODE_GP1,
     7592        IWN_UCODE_GP2,
     7593        IWN_LED,
     7594        IWN_DRAM_INT_TBL,
     7595        IWN_GIO_CHICKEN,
     7596        IWN_ANA_PLL,
     7597        IWN_HW_REV_WA,
     7598        IWN_DBG_HPET_MEM,
     7599    };
     7600    DPRINTF(sc, IWN_DEBUG_REGISTER,
     7601        "CSR values: (2nd byte of IWN_INT_COALESCING is IWN_INT_PERIODIC)%s",
     7602        "\n");
     7603    for (i = 0; i <  COUNTOF(csr_tbl); i++){
     7604        DPRINTF(sc, IWN_DEBUG_REGISTER,"  %10s: 0x%08x ",
     7605            iwn_get_csr_string(csr_tbl[i]), IWN_READ(sc, csr_tbl[i]));
     7606        if ((i+1) % 3 == 0)
     7607            DPRINTF(sc, IWN_DEBUG_REGISTER,"%s","\n");
     7608    }
     7609    DPRINTF(sc, IWN_DEBUG_REGISTER,"%s","\n");
     7610}
     7611#endif
  • src/add-ons/kernel/drivers/network/wlan/iprowifi4965/dev/iwn/if_iwnreg.h

    diff --git a/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/dev/iwn/if_iwnreg.h b/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/dev/iwn/if_iwnreg.h
    index 9aa0d66..911407b 100644
    a b  
    1818 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    1919 */
    2020
     21#define IWN_CT_KILL_THRESHOLD       114 /* in Celsius */
     22#define IWN_CT_KILL_EXIT_THRESHOLD  95  /* in Celsius */
     23
    2124#define IWN_TX_RING_COUNT   256
    2225#define IWN_TX_RING_LOMARK  192
    2326#define IWN_TX_RING_HIMARK  224
     
    3841#define IWN_ICT_SIZE        4096
    3942#define IWN_ICT_COUNT       (IWN_ICT_SIZE / sizeof (uint32_t))
    4043
     44/* For cards with PAN command, default is IWN_CMD_QUEUE_NUM */
     45#define IWN_CMD_QUEUE_NUM       4
     46#define IWN_PAN_CMD_QUEUE       9
     47
    4148/* Maximum number of DMA segments for TX. */
    4249#define IWN_MAX_SCATTER 20
    4350
     
    6269#define IWN_INT         0x008
    6370#define IWN_INT_MASK        0x00c
    6471#define IWN_FH_INT      0x010
     72#define IWN_GPIO_IN     0x018   /* read external chip pins */
    6573#define IWN_RESET       0x020
    6674#define IWN_GP_CNTRL        0x024
    6775#define IWN_HW_REV      0x028
     
    6977#define IWN_EEPROM_GP       0x030
    7078#define IWN_OTP_GP      0x034
    7179#define IWN_GIO         0x03c
     80#define IWN_GP_UCODE        0x048
    7281#define IWN_GP_DRIVER       0x050
     82#define IWN_UCODE_GP1       0x054
     83#define IWN_UCODE_GP1_SET   0x058
    7384#define IWN_UCODE_GP1_CLR   0x05c
     85#define IWN_UCODE_GP2       0x060
    7486#define IWN_LED         0x094
    7587#define IWN_DRAM_INT_TBL    0x0a0
    7688#define IWN_SHADOW_REG_CTRL 0x0a8
     
    7991#define IWN_HW_REV_WA       0x22c
    8092#define IWN_DBG_HPET_MEM    0x240
    8193#define IWN_DBG_LINK_PWR_MGMT   0x250
     94/* Need nic_lock for use above */
    8295#define IWN_MEM_RADDR       0x40c
    8396#define IWN_MEM_WADDR       0x410
    8497#define IWN_MEM_WDATA       0x418
    8598#define IWN_MEM_RDATA       0x41c
     99#define IWN_TARG_MBX_C      0x430
    86100#define IWN_PRPH_WADDR      0x444
    87101#define IWN_PRPH_RADDR      0x448
    88102#define IWN_PRPH_WDATA      0x44c
     
    194208#define IWN_GP_CNTRL_SLEEP      (1 << 4)
    195209#define IWN_GP_CNTRL_RFKILL     (1 << 27)
    196210
    197 /* Possible flags for register IWN_HW_REV. */
    198 #define IWN_HW_REV_TYPE_SHIFT   4
    199 #define IWN_HW_REV_TYPE_MASK    0x000000f0
    200 #define IWN_HW_REV_TYPE_4965    0
    201 #define IWN_HW_REV_TYPE_5300    2
    202 #define IWN_HW_REV_TYPE_5350    3
    203 #define IWN_HW_REV_TYPE_5150    4
    204 #define IWN_HW_REV_TYPE_5100    5
    205 #define IWN_HW_REV_TYPE_1000    6
    206 #define IWN_HW_REV_TYPE_6000    7
    207 #define IWN_HW_REV_TYPE_6050    8
    208 #define IWN_HW_REV_TYPE_6005    11
    209 
    210211/* Possible flags for register IWN_GIO_CHICKEN. */
    211212#define IWN_GIO_CHICKEN_L1A_NO_L0S_RX   (1 << 23)
    212213#define IWN_GIO_CHICKEN_DIS_L0S_TIMER   (1 << 29)
     
    220221#define IWN_GP_DRIVER_RADIO_2X2_IPA (2 << 0)
    221222#define IWN_GP_DRIVER_CALIB_VER6    (1 << 2)
    222223#define IWN_GP_DRIVER_6050_1X2      (1 << 3)
     224#define IWN_GP_DRIVER_REG_BIT_RADIO_IQ_INVERT   (1 << 7)
    223225
    224226/* Possible flags for register IWN_UCODE_GP1_CLR. */
    225227#define IWN_UCODE_GP1_RFKILL        (1 << 1)
    226228#define IWN_UCODE_GP1_CMD_BLOCKED   (1 << 2)
    227229#define IWN_UCODE_GP1_CTEMP_STOP_RF (1 << 3)
     230#define IWN_UCODE_GP1_CFG_COMPLETE  (1 << 5)
    228231
    229232/* Possible flags/values for register IWN_LED. */
    230233#define IWN_LED_BSM_CTRL    (1 << 5)
    231234#define IWN_LED_OFF     0x00000038
    232235#define IWN_LED_ON      0x00000078
    233236
     237#define IWN_MAX_BLINK_TBL   10
     238#define IWN_LED_STATIC_ON   0
     239#define IWN_LED_STATIC_OFF  1
     240#define IWN_LED_SLOW_BLINK  2
     241#define IWN_LED_INT_BLINK   3
     242#define IWN_LED_UNIT        0x1388  /* 5 ms */
     243
     244static const struct {
     245    uint16_t    tpt;    /* Mb/s */
     246    uint8_t     on_time;
     247    uint8_t     off_time;
     248} blink_tbl[] =
     249{
     250    {300, 5, 5},
     251    {200, 8, 8},
     252    {100, 11, 11},
     253    {70, 13, 13},
     254    {50, 15, 15},
     255    {20, 17, 17},
     256    {10, 19, 19},
     257    {5, 22, 22},
     258    {1, 26, 26},
     259    {0, 33, 33},
     260    /* SOLID_ON */
     261};
     262
    234263/* Possible flags for register IWN_DRAM_INT_TBL. */
    235264#define IWN_DRAM_INT_TBL_WRAP_CHECK (1 << 27)
    236265#define IWN_DRAM_INT_TBL_ENABLE     (1 << 31)
    struct iwn_rx_status {  
    377406} __packed;
    378407
    379408struct iwn_rx_desc {
     409    /*
     410     * The first 4 bytes of the RX frame header contain both the RX frame
     411     * size and some flags.
     412     * Bit fields:
     413     * 31:    flag flush RB request
     414     * 30:    flag ignore TC (terminal counter) request
     415     * 29:    flag fast IRQ request
     416     * 28-14: Reserved
     417     * 13-00: RX frame size
     418     */
    380419    uint32_t    len;
    381420    uint8_t     type;
    382421#define IWN_UC_READY              1
    383422#define IWN_ADD_NODE_DONE        24
    384423#define IWN_TX_DONE          28
     424#define IWN_REPLY_LED_CMD       72
    385425#define IWN5000_CALIBRATION_RESULT  102
    386426#define IWN5000_CALIBRATION_DONE    103
    387427#define IWN_START_SCAN          130
     428#define IWN_NOTIF_SCAN_RESULT       131
    388429#define IWN_STOP_SCAN           132
    389430#define IWN_RX_STATISTICS       156
    390431#define IWN_BEACON_STATISTICS       157
    struct iwn_rx_desc {  
    395436#define IWN_RX_DONE         195
    396437#define IWN_RX_COMPRESSED_BA        197
    397438
    398     uint8_t     flags;
    399     uint8_t     idx;
     439    uint8_t     flags;  /* 0:5 reserved, 6 abort, 7 internal */
     440    uint8_t     idx;    /* position within TX queue */
    400441    uint8_t     qid;
     442    /* 0:4 TX queue id - 5:6 reserved - 7 unsolicited RX
     443     * or uCode-originated notification
     444     */
    401445} __packed;
    402446
     447#define IWN_RX_DESC_QID_MSK     0x1F
     448#define IWN_UNSOLICITED_RX_NOTIF    0x80
     449
     450/* CARD_STATE_NOTIFICATION */
     451#define IWN_STATE_CHANGE_HW_CARD_DISABLED       0x01
     452#define IWN_STATE_CHANGE_SW_CARD_DISABLED       0x02
     453#define IWN_STATE_CHANGE_CT_CARD_DISABLED       0x04
     454#define IWN_STATE_CHANGE_RXON_CARD_DISABLED     0x10
     455
    403456/* Possible RX status flags. */
    404457#define IWN_RX_NO_CRC_ERR   (1 <<  0)
    405458#define IWN_RX_NO_OVFL_ERR  (1 <<  1)
    struct iwn_tx_cmd {  
    423476#define IWN_CMD_LINK_QUALITY         78
    424477#define IWN_CMD_SET_LED          72
    425478#define IWN5000_CMD_WIMAX_COEX       90
     479#define IWN_TEMP_NOTIFICATION       98
    426480#define IWN5000_CMD_CALIB_CONFIG    101
    427481#define IWN5000_CMD_CALIB_RESULT    102
    428482#define IWN5000_CMD_CALIB_COMPLETE  103
    struct iwn_tx_cmd {  
    439493#define IWN_CMD_PHY_CALIB       176
    440494#define IWN_CMD_BT_COEX_PRIOTABLE   204
    441495#define IWN_CMD_BT_COEX_PROT        205
     496#define IWN_CMD_BT_COEX_NOTIF       206
     497/* PAN commands */
     498#define IWN_CMD_WIPAN_PARAMS            0xb2
     499#define IWN_CMD_WIPAN_RXON          0xb3
     500#define IWN_CMD_WIPAN_RXON_TIMING       0xb4
     501#define IWN_CMD_WIPAN_RXON_ASSOC        0xb6
     502#define IWN_CMD_WIPAN_QOS_PARAM         0xb7
     503#define IWN_CMD_WIPAN_WEPKEY            0xb8
     504#define IWN_CMD_WIPAN_P2P_CHANNEL_SWITCH    0xb9
     505#define IWN_CMD_WIPAN_NOA_NOTIFICATION      0xbc
     506#define IWN_CMD_WIPAN_DEACTIVATION_COMPLETE 0xbd
    442507
    443508    uint8_t flags;
    444509    uint8_t idx;
    struct iwn_tx_cmd {  
    446511    uint8_t data[136];
    447512} __packed;
    448513
     514/*
     515 * Structure for IWN_CMD_GET_STATISTICS = (0x9c) 156
     516 * all devices identical.
     517 *
     518 * This command triggers an immediate response containing uCode statistics.
     519 * The response is in the same format as IWN_BEACON_STATISTICS (0x9d) 157.
     520 *
     521 * If the CLEAR_STATS configuration flag is set, uCode will clear its
     522 * internal copy of the statistics (counters) after issuing the response.
     523 * This flag does not affect IWN_BEACON_STATISTICS after beacons (see below).
     524 *
     525 * If the DISABLE_NOTIF configuration flag is set, uCode will not issue
     526 * IWN_BEACON_STATISTICS after received beacons.  This flag
     527 * does not affect the response to the IWN_CMD_GET_STATISTICS 0x9c itself.
     528 */
     529struct iwn_statistics_cmd {
     530    uint32_t    configuration_flags;
     531#define IWN_STATS_CONF_CLEAR_STATS      htole32(0x1)
     532#define IWN_STATS_CONF_DISABLE_NOTIF    htole32(0x2)
     533} __packed;
     534
    449535/* Antenna flags, used in various commands. */
    450536#define IWN_ANT_A   (1 << 0)
    451537#define IWN_ANT_B   (1 << 1)
    struct iwn_tx_cmd {  
    453539/* Shortcuts. */
    454540#define IWN_ANT_AB  (IWN_ANT_A | IWN_ANT_B)
    455541#define IWN_ANT_BC  (IWN_ANT_B | IWN_ANT_C)
     542#define IWN_ANT_AC  (IWN_ANT_A | IWN_ANT_C)
    456543#define IWN_ANT_ABC (IWN_ANT_A | IWN_ANT_B | IWN_ANT_C)
    457544
    458545/* Structure for command IWN_CMD_RXON. */
    struct iwn_rxon {  
    468555#define IWN_MODE_STA        3
    469556#define IWN_MODE_IBSS       4
    470557#define IWN_MODE_MONITOR    6
     558#define IWN_MODE_2STA       8
     559#define IWN_MODE_P2P        9
    471560
    472561    uint8_t     air;
    473562    uint16_t    rxchain;
    struct iwn_cmd_timing {  
    551640    uint16_t    atim;
    552641    uint32_t    binitval;
    553642    uint16_t    lintval;
    554     uint16_t    reserved;
     643    uint8_t     dtim_period;
     644    uint8_t     delta_cp_bss_tbtts;
    555645} __packed;
    556646
    557647/* Structure for command IWN_CMD_ADD_NODE. */
    struct iwn_node_info {  
    565655    uint16_t    reserved2;
    566656    uint8_t     id;
    567657#define IWN_ID_BSS       0
     658#define IWN_STA_ID      1
     659
     660#define IWN_PAN_ID_BCAST        14
    568661#define IWN5000_ID_BROADCAST    15
    569662#define IWN4965_ID_BROADCAST    31
    570663
    struct iwn_pmgt_cmd {  
    766859#define IWN_PS_SLEEP_OVER_DTIM  (1 << 2)
    767860#define IWN_PS_PCI_PMGT     (1 << 3)
    768861#define IWN_PS_FAST_PD      (1 << 4)
     862#define IWN_PS_BEACON_FILTERING (1 << 5)
     863#define IWN_PS_SHADOW_REG   (1 << 6)
     864#define IWN_PS_CT_KILL      (1 << 7)
     865#define IWN_PS_BT_SCD       (1 << 8)
     866#define IWN_PS_ADVANCED_PM  (1 << 9)
    769867
    770868    uint8_t     keepalive;
    771869    uint8_t     debug;
    struct iwn_scan_hdr {  
    803901
    804902struct iwn_scan_chan {
    805903    uint32_t    flags;
     904#define IWN_CHAN_PASSIVE    (0 << 0)
    806905#define IWN_CHAN_ACTIVE     (1 << 0)
    807906#define IWN_CHAN_NPBREQS(x) (((1 << (x)) - 1) << 1)
    808907
    struct iwn_scan_chan {  
    813912    uint16_t    passive;    /* msecs */
    814913} __packed;
    815914
     915#define IWN_SCAN_CRC_TH_DISABLED    0
     916#define IWN_SCAN_CRC_TH_DEFAULT     htole16(1)
     917#define IWN_SCAN_CRC_TH_NEVER       htole16(0xffff)
     918
    816919/* Maximum size of a scan command. */
    817920#define IWN_SCAN_MAXSZ  (MCLBYTES - 4)
    818921
     922#define IWN_ACTIVE_DWELL_TIME_24    (30)    /* all times in msec */
     923#define IWN_ACTIVE_DWELL_TIME_52    (20)
     924#define IWN_ACTIVE_DWELL_FACTOR_24  (3)
     925#define IWN_ACTIVE_DWELL_FACTOR_52  (2)
     926
     927#define IWN_PASSIVE_DWELL_TIME_24   (20)    /* all times in msec */
     928#define IWN_PASSIVE_DWELL_TIME_52   (10)
     929#define IWN_PASSIVE_DWELL_BASE      (100)
     930#define IWN_CHANNEL_TUNE_TIME       (5)
     931
     932#define IWN_SCAN_CHAN_TIMEOUT       2
     933
    819934/* Structure for command IWN_CMD_TXPOWER (4965AGN only.) */
    820935#define IWN_RIDX_MAX    32
    821936struct iwn4965_cmd_txpower {
    struct iwn_bluetooth {  
    862977
    863978struct iwn6000_btcoex_config {
    864979    uint8_t     flags;
     980#define IWN_BT_FLAG_COEX6000_CHAN_INHIBITION    1
     981#define IWN_BT_FLAG_COEX6000_MODE_MASK      ((1 << 3) | (1 << 4) | (1 << 5 ))
     982#define IWN_BT_FLAG_COEX6000_MODE_SHIFT         3
     983#define IWN_BT_FLAG_COEX6000_MODE_DISABLED      0
     984#define IWN_BT_FLAG_COEX6000_MODE_LEGACY_2W     1
     985#define IWN_BT_FLAG_COEX6000_MODE_3W            2
     986#define IWN_BT_FLAG_COEX6000_MODE_4W            3
     987
     988#define IWN_BT_FLAG_UCODE_DEFAULT       (1 << 6)
     989#define IWN_BT_FLAG_SYNC_2_BT_DISABLE   (1 << 7)
    865990    uint8_t     lead_time;
    866991    uint8_t     max_kill;
    867992    uint8_t     bt3_t7_timer;
    struct iwn6000_btcoex_config {  
    8781003    uint16_t    rx_prio_boost;
    8791004} __packed;
    8801005
     1006/* Structure for enhanced command IWN_CMD_BLUETOOTH for 2000 Series. */
     1007struct iwn2000_btcoex_config {
     1008    uint8_t     flags;  /* Cf Flags in iwn6000_btcoex_config */
     1009    uint8_t     lead_time;
     1010    uint8_t     max_kill;
     1011    uint8_t     bt3_t7_timer;
     1012    uint32_t    kill_ack;
     1013    uint32_t    kill_cts;
     1014    uint8_t     sample_time;
     1015    uint8_t     bt3_t2_timer;
     1016    uint16_t    bt4_reaction;
     1017    uint32_t    lookup_table[12];
     1018    uint16_t    bt4_decision;
     1019    uint16_t    valid;
     1020
     1021    uint32_t    prio_boost; /* size change prior to iwn6000_btcoex_config */
     1022    uint8_t     reserved;   /* added prior to iwn6000_btcoex_config */
     1023
     1024    uint8_t     tx_prio_boost;
     1025    uint16_t    rx_prio_boost;
     1026} __packed;
     1027
    8811028struct iwn_btcoex_priotable {
    8821029    uint8_t     calib_init1;
    8831030    uint8_t     calib_init2;
    struct iwn5000_phy_calib_temp_offset {  
    9961143    uint16_t    reserved;
    9971144} __packed;
    9981145
     1146struct iwn5000_phy_calib_temp_offsetv2 {
     1147    uint8_t     code;
     1148    uint8_t     group;
     1149    uint8_t     ngroups;
     1150    uint8_t     isvalid;
     1151    int16_t     offset_high;
     1152    int16_t     offset_low;
     1153    int16_t     burnt_voltage_ref;
     1154    int16_t     reserved;
     1155} __packed;
     1156
    9991157struct iwn_phy_calib_gain {
    10001158    uint8_t code;
    10011159    uint8_t group;
    struct iwn_ucode_info {  
    10631221} __packed;
    10641222
    10651223/* Structures for IWN_TX_DONE notification. */
     1224#define IWN_TX_STATUS_MSK       0xff
     1225#define TX_STATUS_SUCCESS       0x01
     1226#define TX_STATUS_DIRECT_DONE       0x02
     1227
    10661228#define IWN_TX_SUCCESS          0x00
    10671229#define IWN_TX_FAIL         0x80    /* all failures have 0x80 set */
    10681230#define IWN_TX_FAIL_SHORT_LIMIT     0x82    /* too many RTS retries */
    struct iwn4965_tx_stat {  
    10841246} __packed;
    10851247
    10861248struct iwn5000_tx_stat {
    1087     uint8_t     nframes;
     1249    uint8_t     nframes;    /* 1 no aggregation, >1 aggregation */
    10881250    uint8_t     btkillcnt;
    10891251    uint8_t     rtsfailcnt;
    10901252    uint8_t     ackfailcnt;
    struct iwn5000_tx_stat {  
    10961258    uint16_t    seq;
    10971259    uint16_t    len;
    10981260    uint8_t     tlc;
    1099     uint8_t     ratid;
     1261    uint8_t     ratid;  /* tid (0:3), sta_id (4:7) */
    11001262    uint8_t     fc[2];
    11011263    uint16_t    status;
    11021264    uint16_t    sequence;
    struct iwn_rx_stat {  
    11441306    uint16_t    chan;
    11451307    uint8_t     phybuf[32];
    11461308    uint32_t    rate;
     1309/*
     1310 * rate bit fields
     1311 *
     1312 * High-throughput (HT) rate format for bits 7:0 (bit 8 must be "1"):
     1313 *  2-0:  0)   6 Mbps
     1314 *        1)  12 Mbps
     1315 *        2)  18 Mbps
     1316 *        3)  24 Mbps
     1317 *        4)  36 Mbps
     1318 *        5)  48 Mbps
     1319 *        6)  54 Mbps
     1320 *        7)  60 Mbps
     1321 *
     1322 *  4-3:  0)  Single stream (SISO)
     1323 *        1)  Dual stream (MIMO)
     1324 *        2)  Triple stream (MIMO)
     1325 *
     1326 *    5:  Value of 0x20 in bits 7:0 indicates 6 Mbps HT40 duplicate data
     1327 *
     1328 * Legacy OFDM rate format for bits 7:0 (bit 8 must be "0", bit 9 "0"):
     1329 *  3-0:  0xD)   6 Mbps
     1330 *        0xF)   9 Mbps
     1331 *        0x5)  12 Mbps
     1332 *        0x7)  18 Mbps
     1333 *        0x9)  24 Mbps
     1334 *        0xB)  36 Mbps
     1335 *        0x1)  48 Mbps
     1336 *        0x3)  54 Mbps
     1337 *
     1338 * Legacy CCK rate format for bits 7:0 (bit 8 must be "0", bit 9 "1"):
     1339 *  6-0:   10)  1 Mbps
     1340 *         20)  2 Mbps
     1341 *         55)  5.5 Mbps
     1342 *        110)  11 Mbps
     1343 *
     1344 */
    11471345    uint16_t    len;
    11481346    uint16_t    reserve3;
    11491347} __packed;
    struct iwn_fw_tlv {  
    13661564#define IWN_FW_TLV_INIT_DATA        4
    13671565#define IWN_FW_TLV_BOOT_TEXT        5
    13681566#define IWN_FW_TLV_PBREQ_MAXLEN     6
     1567#define IWN_FW_TLV_PAN              7
     1568#define IWN_FW_TLV_RUNT_EVTLOG_PTR  8
     1569#define IWN_FW_TLV_RUNT_EVTLOG_SIZE 9
     1570#define IWN_FW_TLV_RUNT_ERRLOG_PTR  10
     1571#define IWN_FW_TLV_INIT_EVTLOG_PTR  11
     1572#define IWN_FW_TLV_INIT_EVTLOG_SIZE 12
     1573#define IWN_FW_TLV_INIT_ERRLOG_PTR  13
    13691574#define IWN_FW_TLV_ENH_SENS     14
    13701575#define IWN_FW_TLV_PHY_CALIB        15
     1576#define IWN_FW_TLV_WOWLAN_INST      16
     1577#define IWN_FW_TLV_WOWLAN_DATA      17
     1578#define IWN_FW_TLV_FLAGS            18
    13711579
    13721580    uint16_t    alt;
    13731581    uint32_t    len;
    struct iwn_fw_tlv {  
    14011609#define IWN4965_EEPROM_VOLTAGE  0x0e9
    14021610#define IWN4965_EEPROM_BANDS    0x0ea
    14031611/* Indirect offsets. */
     1612#define IWN5000_EEPROM_NO_HT40  0x000
    14041613#define IWN5000_EEPROM_DOMAIN   0x001
    14051614#define IWN5000_EEPROM_BAND1    0x004
    14061615#define IWN5000_EEPROM_BAND2    0x013
    static const uint32_t iwn6000_regulatory_bands[IWN_NBANDS] = {  
    15121721    IWN5000_EEPROM_BAND7
    15131722};
    15141723
     1724static const uint32_t iwn1000_regulatory_bands[IWN_NBANDS] = {
     1725    IWN5000_EEPROM_BAND1,
     1726    IWN5000_EEPROM_BAND2,
     1727    IWN5000_EEPROM_BAND3,
     1728    IWN5000_EEPROM_BAND4,
     1729    IWN5000_EEPROM_BAND5,
     1730    IWN5000_EEPROM_BAND6,
     1731    IWN5000_EEPROM_NO_HT40,
     1732};
     1733
    15151734#define IWN_CHAN_BANDS_COUNT     7
    15161735#define IWN_MAX_CHAN_PER_BAND   14
    15171736static const struct iwn_chan_band {
    static const struct iwn_chan_band {  
    15311750    { 11, { 36, 44, 52, 60, 100, 108, 116, 124, 132, 149, 157 } }
    15321751};
    15331752
     1753static const uint8_t iwn_bss_ac_to_queue[] = {
     1754    2, 3, 1, 0,
     1755};
     1756
     1757static const uint8_t iwn_pan_ac_to_queue[] = {
     1758    5, 4, 6, 7,
     1759};
    15341760#define IWN1000_OTP_NBLOCKS 3
    15351761#define IWN6000_OTP_NBLOCKS 4
    15361762#define IWN6050_OTP_NBLOCKS 7
    static const struct iwn_chan_band {  
    15401766#define IWN_RIDX_OFDM6  4
    15411767
    15421768#define IWN4965_MAX_PWR_INDEX   107
     1769#define IWN_POWERSAVE_LVL_NONE          0
     1770#define IWN_POWERSAVE_LVL_VOIP_COMPATIBLE   1
     1771#define IWN_POWERSAVE_LVL_MAX           5
     1772
     1773#define IWN_POWERSAVE_LVL_DEFAULT   IWN_POWERSAVE_LVL_NONE
     1774
     1775/* DTIM value to pass in for IWN_POWERSAVE_LVL_VOIP_COMPATIBLE */
     1776#define IWN_POWERSAVE_DTIM_VOIP_COMPATIBLE  2
    15431777
    15441778/*
    15451779 * RF Tx gain values from highest to lowest power (values obtained from
    static const struct iwn_sensitivity_limits iwn6000_sensitivity_limits = {  
    17221956    100
    17231957};
    17241958
     1959/* Get value from linux kernel 3.2.+ in Drivers/net/wireless/iwlwifi/iwl-2000.c*/
     1960static const struct iwn_sensitivity_limits iwn2030_sensitivity_limits = {
     1961    105,110,
     1962    128,232,
     1963    80,145,
     1964    128,232,
     1965    125,175,
     1966    160,310,
     1967    97,
     1968    97,
     1969    110
     1970};
     1971
    17251972/* Map TID to TX scheduler's FIFO. */
    17261973static const uint8_t iwn_tid2fifo[] = {
    17271974    1, 0, 0, 1, 2, 2, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 3
    static const char * const iwn_fw_errmsg[] = {  
    17722019    "NMI_INTERRUPT_DATA_ACTION_PT",
    17732020    "NMI_TRM_HW_ER",
    17742021    "NMI_INTERRUPT_TRM",
    1775     "NMI_INTERRUPT_BREAKPOINT",
     2022    "NMI_INTERRUPT_BREAKPOINT"
    17762023    "DEBUG_0",
    17772024    "DEBUG_1",
    17782025    "DEBUG_2",
  • src/add-ons/kernel/drivers/network/wlan/iprowifi4965/dev/iwn/if_iwnvar.h

    diff --git a/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/dev/iwn/if_iwnvar.h b/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/dev/iwn/if_iwnvar.h
    index 7647b09..d1c0b76 100644
    a b  
    22/*  $OpenBSD: if_iwnvar.h,v 1.18 2010/04/30 16:06:46 damien Exp $   */
    33
    44/*-
     5 * Copyright (c) 2013 Cedric GROSS <cg@cgross.info>
     6 * Copyright (c) 2011 Intel Corporation
    57 * Copyright (c) 2007, 2008
    68 *  Damien Bergamini <damien.bergamini@free.fr>
    79 * Copyright (c) 2008 Sam Leffler, Errno Consulting
     
    1820 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    1921 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    2022 */
     23enum iwn_rxon_ctx_id {
     24        IWN_RXON_BSS_CTX,
     25        IWN_RXON_PAN_CTX,
     26        IWN_NUM_RXON_CTX
     27};
     28
     29struct iwn_pan_slot {
     30    uint16_t    time;
     31    uint8_t     type;
     32    uint8_t     reserved;
     33} __packed;
     34
     35struct iwn_pan_params_cmd {
     36    uint16_t flags;
     37#define IWN_PAN_PARAMS_FLG_SLOTTED_MODE (1 << 3)
     38
     39    uint8_t reserved;
     40    uint8_t num_slots;
     41    struct iwn_pan_slot slots[10];
     42} __packed;
     43
     44struct iwn_led_mode
     45{
     46    uint8_t     led_cur_mode;
     47    uint64_t    led_cur_bt;
     48    uint64_t    led_last_bt;
     49    uint64_t    led_cur_tpt;
     50    uint64_t    led_last_tpt;
     51    uint64_t    led_bt_diff;
     52    int     led_cur_time;
     53    int     led_last_time;
     54};
    2155
    2256struct iwn_rx_radiotap_header {
    2357    struct ieee80211_radiotap_header wr_ihdr;
    struct iwn_node {  
    102136    struct  ieee80211_node      ni; /* must be the first */
    103137    uint16_t            disable_tid;
    104138    uint8_t             id;
    105     uint32_t            ridx[256];
    106139    struct {
    107140        uint64_t        bitmap;
    108141        int         startidx;
    struct iwn_vap {  
    192225
    193226    int         (*iv_newstate)(struct ieee80211vap *,
    194227                    enum ieee80211_state, int);
     228    int         ctx;
     229    int         beacon_int;
     230    uint8_t     macaddr[IEEE80211_ADDR_LEN];
     231
    195232};
    196233#define IWN_VAP(_vap)   ((struct iwn_vap *)(_vap))
    197234
    struct iwn_softc {  
    211248#define IWN_FLAG_HAS_11N    (1 << 6)
    212249#define IWN_FLAG_ENH_SENS   (1 << 7)
    213250#define IWN_FLAG_ADV_BTCOEX (1 << 8)
     251#define IWN_FLAG_PAN_SUPPORT    (1 << 9)
    214252
    215253    uint8_t         hw_type;
     254    /* subdevice_id used to adjust configuration */
     255    uint16_t        subdevice_id;
    216256
    217257    struct iwn_ops      ops;
    218258    const char      *fwname;
    struct iwn_softc {  
    254294    struct iwn_tx_ring  txq[IWN5000_NTXQUEUES];
    255295    struct iwn_rx_ring  rxq;
    256296
     297    int         mem_rid;
    257298    struct resource     *mem;
    258299    bus_space_tag_t     sc_st;
    259300    bus_space_handle_t  sc_sh;
     301    int         irq_rid;
    260302    struct resource     *irq;
    261303    void            *sc_ih;
    262304    bus_size_t      sc_sz;
    struct iwn_softc {  
    271313    int         calib_cnt;
    272314    struct iwn_calib_state  calib;
    273315    struct callout      watchdog_to;
    274 
     316    struct callout      ct_kill_exit_to;
    275317    struct iwn_fw_info  fw;
    276318    struct iwn_calib_info   calibcmd[5];
    277319    uint32_t        errptr;
    struct iwn_softc {  
    279321    struct iwn_rx_stat  last_rx_stat;
    280322    int         last_rx_valid;
    281323    struct iwn_ucode_info   ucode_info;
    282     struct iwn_rxon     rxon;
     324    struct iwn_rxon     rx_on[IWN_NUM_RXON_CTX];
     325    struct iwn_rxon     *rxon;
     326    int         ctx;
     327    struct ieee80211vap *ivap[IWN_NUM_RXON_CTX];
     328
     329    uint8_t         uc_scan_progress;
    283330    uint32_t        rawtemp;
    284331    int         temp;
    285332    int         noise;
    struct iwn_softc {  
    294341    char            eeprom_domain[4];
    295342    uint32_t        eeprom_crystal;
    296343    int16_t         eeprom_temp;
     344    int16_t         eeprom_temp_high;
    297345    int16_t         eeprom_voltage;
    298346    int8_t          maxpwr2GHz;
    299347    int8_t          maxpwr5GHz;
    300348    int8_t          maxpwr[IEEE80211_CHAN_MAX];
    301349
     350    uint32_t        tlv_feature_flags;
     351
    302352    int32_t         temp_off;
    303353    uint32_t        int_mask;
    304354    uint8_t         ntxchains;
    struct iwn_softc {  
    308358    uint8_t         chainmask;
    309359
    310360    int         sc_tx_timer;
     361    int         sc_scan_timer;
    311362
    312363    struct ieee80211_tx_ampdu *qid2tap[IWN5000_NTXQUEUES];
    313364
    struct iwn_softc {  
    322373    void            (*sc_addba_stop)(struct ieee80211_node *,
    323374                    struct ieee80211_tx_ampdu *);
    324375
     376    struct  iwn_led_mode sc_led;
    325377
    326378    struct iwn_rx_radiotap_header sc_rxtap;
    327379    struct iwn_tx_radiotap_header sc_txtap;
    328380
    329 #if defined(__HAIKU__)
    330     uint32_t sc_intr_status_1;
    331     uint32_t sc_intr_status_2;
    332 #endif
     381    /* The power save level originally configured by user */
     382    int         desired_pwrsave_level;
     383
     384    /*
     385     * The current power save level, this may differ from the
     386     * configured value due to thermal throttling etc.
     387     */
     388    int         current_pwrsave_level;
     389
     390    /* For specifique params */
     391    struct iwn_base_params *base_params;
    333392};
    334393
    335394#define IWN_LOCK_INIT(_sc) \
  • src/add-ons/kernel/drivers/network/wlan/iprowifi4965/glue.c

    diff --git a/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/glue.c b/src/add-ons/kernel/drivers/network/wlan/iprowifi4965/glue.c
    index 198bece..9b91f42 100644
    a b HAIKU_CHECK_DISABLE_INTERRUPTS(device_t dev)  
    5656        return 0;
    5757    }
    5858
     59    /*
    5960    atomic_set((int32*)&sc->sc_intr_status_1, r1);
    6061    atomic_set((int32*)&sc->sc_intr_status_2, r2);
     62    */
    6163
    6264    IWN_WRITE(sc, IWN_INT_MASK, 0);
    6365        // disable interrupts
  • src/libs/compat/freebsd_wlan/net80211/ieee80211_output.c

    diff --git a/src/libs/compat/freebsd_wlan/net80211/ieee80211_output.c b/src/libs/compat/freebsd_wlan/net80211/ieee80211_output.c
    index eb5ccb3..4a86174 100644
    a b ieee80211_beacon_update(struct ieee80211_node *ni,  
    30633063
    30643064    return len_changed;
    30653065}
     3066
     3067/*
     3068 * Added in FreeBSD 10.0.0
     3069 */
     3070
     3071/*
     3072 * Complete an mbuf transmission.
     3073 *
     3074 * For now, this simply processes a completed frame after the
     3075 * driver has completed it's transmission and/or retransmission.
     3076 * It assumes the frame is an 802.11 encapsulated frame.
     3077 *
     3078 * Later on it will grow to become the exit path for a given frame
     3079 * from the driver and, depending upon how it's been encapsulated
     3080 * and already transmitted, it may end up doing A-MPDU retransmission,
     3081 * power save requeuing, etc.
     3082 *
     3083 * In order for the above to work, the driver entry point to this
     3084 * must not hold any driver locks.  Thus, the driver needs to delay
     3085 * any actual mbuf completion until it can release said locks.
     3086 *
     3087 * This frees the mbuf and if the mbuf has a node reference,
     3088 * the node reference will be freed.
     3089 */
     3090void
     3091ieee80211_tx_complete(struct ieee80211_node *ni, struct mbuf *m, int status)
     3092{
     3093
     3094    if (ni != NULL) {
     3095        if (m->m_flags & M_TXCB)
     3096            ieee80211_process_callback(ni, m, status);
     3097        ieee80211_free_node(ni);
     3098    }
     3099    m_freem(m);
     3100}
  • src/libs/compat/freebsd_wlan/net80211/ieee80211_phy.h

    diff --git a/src/libs/compat/freebsd_wlan/net80211/ieee80211_phy.h b/src/libs/compat/freebsd_wlan/net80211/ieee80211_phy.h
    index 7508fe2..b247e17 100644
    a b ieee80211_ack_duration(const struct ieee80211_rate_table *rt,  
    137137}
    138138
    139139/*
     140 * Declaration required for FreeBSD 10.0.0 iwn
     141 */
     142
     143static __inline__ uint8_t
     144ieee80211_legacy_rate_lookup(const struct ieee80211_rate_table *rt,
     145    uint8_t rate)
     146{
     147
     148    return (rt->rateCodeToIndex[rate & IEEE80211_RATE_VAL]);
     149}
     150
     151/*
    140152 * Compute the time to transmit a frame of length frameLen bytes
    141153 * using the specified 802.11 rate code, phy, and short preamble
    142154 * setting.
  • src/libs/compat/freebsd_wlan/net80211/ieee80211_proto.h

    diff --git a/src/libs/compat/freebsd_wlan/net80211/ieee80211_proto.h b/src/libs/compat/freebsd_wlan/net80211/ieee80211_proto.h
    index 2b32557..8eed278 100644
    a b int ieee80211_send_probereq(struct ieee80211_node *ni,  
    117117        const uint8_t da[IEEE80211_ADDR_LEN],
    118118        const uint8_t bssid[IEEE80211_ADDR_LEN],
    119119        const uint8_t *ssid, size_t ssidlen);
     120void    ieee80211_tx_complete(struct ieee80211_node *,
     121        struct mbuf *, int);
    120122/*
    121123 * The formation of ProbeResponse frames requires guidance to
    122124 * deal with legacy clients.  When the client is identified as