Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src-draft/trunk]: src/sys/dev/pci Inital support for iwn for new wifi stack.
details: https://anonhg.NetBSD.org/src-all/rev/9ccefdfa530a
branches: trunk
changeset: 1027219:9ccefdfa530a
user: Nathanial Sloss <nat%netbsd.org@localhost>
date: Fri May 01 01:09:09 2020 +1000
description:
Inital support for iwn for new wifi stack.
Doesn't work just yet, but it compiles.
diffstat:
sys/dev/pci/if_iwn.c | 534 ++++++++++++++++++++++++++++++++++----------------
1 files changed, 357 insertions(+), 177 deletions(-)
diffs (truncated from 1234 to 300 lines):
diff -r 37f998802693 -r 9ccefdfa530a sys/dev/pci/if_iwn.c
--- a/sys/dev/pci/if_iwn.c Fri May 01 00:16:58 2020 +1000
+++ b/sys/dev/pci/if_iwn.c Fri May 01 01:09:09 2020 +1000
@@ -32,7 +32,9 @@
#include <sys/proc.h>
#include <sys/mbuf.h>
#include <sys/kernel.h>
+#include <sys/kmem.h>
#include <sys/socket.h>
+#include <sys/sysctl.h>
#include <sys/systm.h>
#include <sys/malloc.h>
#ifdef notyetMODULE
@@ -66,6 +68,7 @@
#include <net/if_ether.h>
#include <netinet/ip.h>
+#include <net80211/ieee80211_netbsd.h>
#include <net80211/ieee80211_var.h>
#include <net80211/ieee80211_amrr.h>
#include <net80211/ieee80211_radiotap.h>
@@ -203,7 +206,7 @@
static void iwn_attach(device_t , device_t , void *);
static int iwn4965_attach(struct iwn_softc *, pci_product_id_t);
static int iwn5000_attach(struct iwn_softc *, pci_product_id_t);
-static void iwn_radiotap_attach(struct iwn_softc *);
+//static void iwn_radiotap_attach(struct iwn_softc *);
static int iwn_detach(device_t , int);
#if 0
static void iwn_power(int, void *);
@@ -234,6 +237,17 @@
static void iwn5000_ict_reset(struct iwn_softc *);
static int iwn_read_eeprom(struct iwn_softc *);
static void iwn4965_read_eeprom(struct iwn_softc *);
+static void iwn_getradiocaps(struct ieee80211com *, int, int *,
+ struct ieee80211_channel []);
+static struct ieee80211vap *
+ iwn_vap_create(struct ieee80211com *,
+ const char [IFNAMSIZ], int, enum ieee80211_opmode, int,
+ const uint8_t [IEEE80211_ADDR_LEN],
+ const uint8_t [IEEE80211_ADDR_LEN]);
+static void iwn_vap_delete(struct ieee80211vap *);
+static void iwn_parent(struct ieee80211com *);
+static void iwn_scan_end(struct ieee80211com *);
+static int iwn_reset(struct ieee80211vap *, u_long);
#ifdef IWN_DEBUG
static void iwn4965_print_power_group(struct iwn_softc *, int);
@@ -241,10 +255,9 @@
static void iwn5000_read_eeprom(struct iwn_softc *);
static void iwn_read_eeprom_channels(struct iwn_softc *, int, uint32_t);
static void iwn_read_eeprom_enhinfo(struct iwn_softc *);
-static struct ieee80211_node *iwn_node_alloc(struct ieee80211_node_table *);
static void iwn_newassoc(struct ieee80211_node *, int);
static int iwn_media_change(struct ifnet *);
-static int iwn_newstate(struct ieee80211com *, enum ieee80211_state, int);
+static int iwn_newstate(struct ieee80211vap *, enum ieee80211_state, int);
static void iwn_iter_func(void *, struct ieee80211_node *);
static void iwn_calib_timeout(void *);
static void iwn_rx_phy(struct iwn_softc *, struct iwn_rx_desc *,
@@ -320,12 +333,12 @@
static int iwn_config_bt_coex_adv1(struct iwn_softc *);
static int iwn_config_bt_coex_adv2(struct iwn_softc *);
-static int iwn_config(struct iwn_softc *);
-static uint16_t iwn_get_active_dwell_time(struct iwn_softc *, uint16_t,
+static int iwn_config(struct ieee80211vap *);
+static uint16_t iwn_get_active_dwell_time(struct ieee80211vap *, uint16_t,
uint8_t);
-static uint16_t iwn_limit_dwell(struct iwn_softc *, uint16_t);
-static uint16_t iwn_get_passive_dwell_time(struct iwn_softc *, uint16_t);
-static int iwn_scan(struct iwn_softc *, uint16_t);
+static uint16_t iwn_limit_dwell(struct ieee80211vap *, uint16_t);
+static uint16_t iwn_get_passive_dwell_time(struct ieee80211vap *, uint16_t);
+static void iwn_scan(struct ieee80211com *);
static int iwn_auth(struct iwn_softc *);
static int iwn_run(struct iwn_softc *);
#ifdef IWN_HWCRYPTO
@@ -405,6 +418,8 @@
#define DPRINTFN(n, x)
#endif
+static const uint8_t iwn_chan_2ghz[] =
+ { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 };
CFATTACH_DECL_NEW(iwn, sizeof(struct iwn_softc), iwn_match, iwn_attach,
iwn_detach, NULL);
@@ -417,11 +432,29 @@
}
static void
+iwn_getradiocaps(struct ieee80211com *ic,
+ int maxchans, int *nchans, struct ieee80211_channel chans[])
+{
+ uint8_t bands[IEEE80211_MODE_BYTES];
+
+ /*
+ * NNN Should be able to do something based on chip if
+ * a chip has more bands .... eg. N ... but for the future.
+ */
+
+ memset(bands, 0, sizeof(bands));
+ setbit(bands, IEEE80211_MODE_11B);
+ setbit(bands, IEEE80211_MODE_11G);
+ setbit(bands, IEEE80211_MODE_11NG);
+ ieee80211_add_channel_list_2ghz(chans, maxchans, nchans,
+ iwn_chan_2ghz, nitems(iwn_chan_2ghz), bands, IEEE80211_CHAN_HT20);
+}
+
+static void
iwn_attach(device_t parent __unused, device_t self, void *aux)
{
struct iwn_softc *sc = device_private(self);
struct ieee80211com *ic = &sc->sc_ic;
- struct ifnet *ifp = &sc->sc_ec.ec_if;
struct pci_attach_args *pa = aux;
const char *intrstr;
pcireg_t memtype, reg;
@@ -589,12 +622,11 @@
((sc->rxchainmask >> 0) & 1);
aprint_normal_dev(self, "MIMO %dT%dR, %.4s, address %s\n",
sc->ntxchains, sc->nrxchains, sc->eeprom_domain,
- ether_sprintf(ic->ic_myaddr));
-
- ic->ic_ifp = ifp;
+ ether_sprintf(ic->ic_macaddr));
+
+ ic->ic_softc = sc;
ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */
ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */
- ic->ic_state = IEEE80211_S_INIT;
/*
* Set device capabilities.
@@ -617,24 +649,26 @@
#if IWN_RBUF_SIZE == 8192
IEEE80211_HTCAP_AMSDU7935 |
#endif
- IEEE80211_HTCAP_CBW20_40 |
- IEEE80211_HTCAP_SGI20 |
- IEEE80211_HTCAP_SGI40;
+ IEEE80211_HTCAP_SHORTGI20 | /* short GI in 20MHz */
+ IEEE80211_HTCAP_CHWIDTH40 | /* 40 MHz channel width */
+ IEEE80211_HTCAP_SHORTGI40; /* short GI in 40MHz */
+#ifdef notyet
if (sc->hw_type != IWN_HW_REV_TYPE_4965)
ic->ic_htcaps |= IEEE80211_HTCAP_GF;
if (sc->hw_type == IWN_HW_REV_TYPE_6050)
ic->ic_htcaps |= IEEE80211_HTCAP_SMPS_DYN;
else
ic->ic_htcaps |= IEEE80211_HTCAP_SMPS_DIS;
+#endif
+ ic->ic_txstream = sc->ntxchains;
+ ic->ic_rxstream = sc->nrxchains;
+
}
#endif /* !IEEE80211_NO_HT */
+ ic->ic_getradiocaps = iwn_getradiocaps;
+
/* Set supported legacy rates. */
- ic->ic_sup_rates[IEEE80211_MODE_11B] = ieee80211_std_rateset_11b;
- ic->ic_sup_rates[IEEE80211_MODE_11G] = ieee80211_std_rateset_11g;
- if (sc->sc_flags & IWN_FLAG_HAS_5GHZ) {
- ic->ic_sup_rates[IEEE80211_MODE_11A] = ieee80211_std_rateset_11a;
- }
#ifndef IEEE80211_NO_HT
if (sc->sc_flags & IWN_FLAG_HAS_11N) {
/* Set supported HT rates. */
@@ -646,26 +680,23 @@
}
#endif
+#if 0
/* IBSS channel undefined for now. */
- ic->ic_ibss_chan = &ic->ic_channels[0];
-
- ifp->if_softc = sc;
- ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
- ifp->if_init = iwn_init;
- ifp->if_ioctl = iwn_ioctl;
- ifp->if_start = iwn_start;
- ifp->if_stop = iwn_stop;
- ifp->if_watchdog = iwn_watchdog;
- IFQ_SET_READY(&ifp->if_snd);
- memcpy(ifp->if_xname, device_xname(self), IFNAMSIZ);
-
- if_initialize(ifp);
+ ic->ic_curchan = &ic->ic_channels[0];
+#endif
+
+
+ iwn_getradiocaps(ic, IEEE80211_CHAN_MAX, &ic->ic_nchans,
+ ic->ic_channels);
+
+ //ifp->if_percpuq = if_percpuq_create(ifp);
ieee80211_ifattach(ic);
- /* Use common softint-based if_input */
- ifp->if_percpuq = if_percpuq_create(ifp);
- if_register(ifp);
-
- ic->ic_node_alloc = iwn_node_alloc;
+
+ ic->ic_vap_create = iwn_vap_create;
+ ic->ic_vap_delete = iwn_vap_delete;
+ ic->ic_parent = iwn_parent;
+ ic->ic_scan_start = iwn_scan;
+ ic->ic_scan_end = iwn_scan_end;
ic->ic_newassoc = iwn_newassoc;
#ifdef IWN_HWCRYPTO
ic->ic_crypto.cs_key_set = iwn_set_key;
@@ -679,34 +710,40 @@
ic->ic_ampdu_tx_stop = iwn_ampdu_tx_stop;
#endif
- /* Override 802.11 state transition machine. */
- sc->sc_newstate = ic->ic_newstate;
- ic->ic_newstate = iwn_newstate;
-
/* XXX media locking needs revisiting */
mutex_init(&sc->sc_media_mtx, MUTEX_DEFAULT, IPL_SOFTNET);
+#if 0
ieee80211_media_init_with_lock(ic,
iwn_media_change, ieee80211_media_status, &sc->sc_media_mtx);
+#endif
sc->amrr.amrr_min_success_threshold = 1;
sc->amrr.amrr_max_success_threshold = 15;
- iwn_radiotap_attach(sc);
-
- /*
- * XXX for NetBSD, OpenBSD timeout_set replaced by
- * callout_init and callout_setfunc, above.
- */
+// iwn_radiotap_attach(sc);
+
+ /* Use common softint-based if_input */
+ /* XXX NetBSD add call to ieee80211_announce for dmesg. */
+
+ sc->sc_flags |= IWN_FLAG_ATTACHED;
+ struct ieee80211vap *vap =
+ iwn_vap_create(ic, device_xname(sc->sc_dev),
+ device_unit(sc->sc_dev), IEEE80211_M_STA,
+ IEEE80211_CLONE_MACADDR, ic->ic_macaddr, ic->ic_macaddr);
+
+ if (vap == NULL) {
+ /* Didn't work ... now what! */
+ printf ("NNN vap_create didn't work ...\n");
+ }
if (pmf_device_register(self, NULL, iwn_resume))
- pmf_class_network_register(self, ifp);
+ pmf_class_network_register(self, vap->iv_ifp);
else
aprint_error_dev(self, "couldn't establish power handler\n");
- /* XXX NetBSD add call to ieee80211_announce for dmesg. */
+
ieee80211_announce(ic);
- sc->sc_flags |= IWN_FLAG_ATTACHED;
return;
/* Free allocated memory if something failed during attachment. */
@@ -729,7 +766,112 @@
unmap: bus_space_unmap(sc->sc_st, sc->sc_sh, sc->sc_sz);
}
-int
+static void
+iwn_vap_delete(struct ieee80211vap *vap)
+{
+ struct ifnet *ifp = vap->iv_ifp;
+ struct iwn_softc *sc __unused =vap->iv_ic->ic_softc;
+
+ DPRINTFN(DBG_FN, ("%s: %s\n", device_xname(sc->sc_dev), __func__));
+
+ iwn_stop(ifp, 0);
+ ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
+ bpf_detach(ifp);
+ if_detach(ifp);
+ kmem_free(vap, sizeof(struct ieee80211vap));
+}
+
+static int
+iwn_reset(struct ieee80211vap *vap, u_long arg)
+{
+ struct ifnet *ifp = vap->iv_ifp;
+ struct iwn_softc *sc = ifp->if_softc;
+ struct ieee80211com *ic = &sc->sc_ic;
+
+ if (ic->ic_opmode != IEEE80211_M_MONITOR)
+ return ENETRESET;
+
+ return 0;
+}
+
+static void
+iwn_scan_end(struct ieee80211com *ic)
Home |
Main Index |
Thread Index |
Old Index