2005-04-18 18:47:38 +00:00
|
|
|
/* $FreeBSD$ */
|
|
|
|
|
|
|
|
/*-
|
2006-01-29 12:35:26 +00:00
|
|
|
* Copyright (c) 2005, 2006
|
2005-04-18 18:47:38 +00:00
|
|
|
* Damien Bergamini <damien.bergamini@free.fr>
|
|
|
|
*
|
|
|
|
* Permission to use, copy, modify, and distribute this software for any
|
|
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
|
|
* copyright notice and this permission notice appear in all copies.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
|
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
|
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
|
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
|
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
|
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
|
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
*/
|
|
|
|
|
2006-03-05 20:36:56 +00:00
|
|
|
struct rt2560_rx_radiotap_header {
|
2005-04-18 18:47:38 +00:00
|
|
|
struct ieee80211_radiotap_header wr_ihdr;
|
|
|
|
uint64_t wr_tsf;
|
|
|
|
uint8_t wr_flags;
|
2006-01-29 12:35:26 +00:00
|
|
|
uint8_t wr_rate;
|
2005-04-18 18:47:38 +00:00
|
|
|
uint16_t wr_chan_freq;
|
|
|
|
uint16_t wr_chan_flags;
|
|
|
|
uint8_t wr_antenna;
|
|
|
|
uint8_t wr_antsignal;
|
|
|
|
};
|
|
|
|
|
2006-03-05 20:36:56 +00:00
|
|
|
#define RT2560_RX_RADIOTAP_PRESENT \
|
2005-04-18 18:47:38 +00:00
|
|
|
((1 << IEEE80211_RADIOTAP_TSFT) | \
|
|
|
|
(1 << IEEE80211_RADIOTAP_FLAGS) | \
|
2006-01-29 12:35:26 +00:00
|
|
|
(1 << IEEE80211_RADIOTAP_RATE) | \
|
2005-04-18 18:47:38 +00:00
|
|
|
(1 << IEEE80211_RADIOTAP_CHANNEL) | \
|
|
|
|
(1 << IEEE80211_RADIOTAP_ANTENNA) | \
|
|
|
|
(1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL))
|
|
|
|
|
2006-03-05 20:36:56 +00:00
|
|
|
struct rt2560_tx_radiotap_header {
|
2005-04-18 18:47:38 +00:00
|
|
|
struct ieee80211_radiotap_header wt_ihdr;
|
|
|
|
uint8_t wt_flags;
|
|
|
|
uint8_t wt_rate;
|
|
|
|
uint16_t wt_chan_freq;
|
|
|
|
uint16_t wt_chan_flags;
|
|
|
|
uint8_t wt_antenna;
|
|
|
|
};
|
|
|
|
|
2006-03-05 20:36:56 +00:00
|
|
|
#define RT2560_TX_RADIOTAP_PRESENT \
|
2005-04-18 18:47:38 +00:00
|
|
|
((1 << IEEE80211_RADIOTAP_FLAGS) | \
|
|
|
|
(1 << IEEE80211_RADIOTAP_RATE) | \
|
|
|
|
(1 << IEEE80211_RADIOTAP_CHANNEL) | \
|
|
|
|
(1 << IEEE80211_RADIOTAP_ANTENNA))
|
|
|
|
|
2006-03-05 20:36:56 +00:00
|
|
|
struct rt2560_tx_data {
|
2005-04-18 18:47:38 +00:00
|
|
|
bus_dmamap_t map;
|
|
|
|
struct mbuf *m;
|
|
|
|
struct ieee80211_node *ni;
|
2008-04-20 20:35:46 +00:00
|
|
|
uint8_t rix;
|
|
|
|
int8_t rssi;
|
2005-04-18 18:47:38 +00:00
|
|
|
};
|
|
|
|
|
2006-03-05 20:36:56 +00:00
|
|
|
struct rt2560_tx_ring {
|
2005-04-18 18:47:38 +00:00
|
|
|
bus_dma_tag_t desc_dmat;
|
|
|
|
bus_dma_tag_t data_dmat;
|
|
|
|
bus_dmamap_t desc_map;
|
|
|
|
bus_addr_t physaddr;
|
2006-03-05 20:36:56 +00:00
|
|
|
struct rt2560_tx_desc *desc;
|
|
|
|
struct rt2560_tx_data *data;
|
2005-04-18 18:47:38 +00:00
|
|
|
int count;
|
|
|
|
int queued;
|
|
|
|
int cur;
|
|
|
|
int next;
|
|
|
|
int cur_encrypt;
|
|
|
|
int next_encrypt;
|
|
|
|
};
|
|
|
|
|
2006-03-05 20:36:56 +00:00
|
|
|
struct rt2560_rx_data {
|
2005-04-18 18:47:38 +00:00
|
|
|
bus_dmamap_t map;
|
|
|
|
struct mbuf *m;
|
|
|
|
int drop;
|
|
|
|
};
|
|
|
|
|
2006-03-05 20:36:56 +00:00
|
|
|
struct rt2560_rx_ring {
|
2005-04-18 18:47:38 +00:00
|
|
|
bus_dma_tag_t desc_dmat;
|
|
|
|
bus_dma_tag_t data_dmat;
|
|
|
|
bus_dmamap_t desc_map;
|
|
|
|
bus_addr_t physaddr;
|
2006-03-05 20:36:56 +00:00
|
|
|
struct rt2560_rx_desc *desc;
|
|
|
|
struct rt2560_rx_data *data;
|
2005-04-18 18:47:38 +00:00
|
|
|
int count;
|
|
|
|
int cur;
|
|
|
|
int next;
|
|
|
|
int cur_decrypt;
|
|
|
|
};
|
|
|
|
|
2006-03-05 20:36:56 +00:00
|
|
|
struct rt2560_node {
|
2005-04-18 18:47:38 +00:00
|
|
|
struct ieee80211_node ni;
|
2008-04-20 20:35:46 +00:00
|
|
|
struct ieee80211_amrr_node amrr;
|
2005-04-18 18:47:38 +00:00
|
|
|
};
|
2008-04-20 20:35:46 +00:00
|
|
|
#define RT2560_NODE(ni) ((struct rt2560_node *)(ni))
|
|
|
|
|
|
|
|
struct rt2560_vap {
|
|
|
|
struct ieee80211vap ral_vap;
|
|
|
|
struct ieee80211_beacon_offsets ral_bo;
|
|
|
|
struct ieee80211_amrr amrr;
|
|
|
|
|
|
|
|
int (*ral_newstate)(struct ieee80211vap *,
|
|
|
|
enum ieee80211_state, int);
|
|
|
|
};
|
|
|
|
#define RT2560_VAP(vap) ((struct rt2560_vap *)(vap))
|
2005-04-18 18:47:38 +00:00
|
|
|
|
2006-03-05 20:36:56 +00:00
|
|
|
struct rt2560_softc {
|
|
|
|
struct ifnet *sc_ifp;
|
|
|
|
device_t sc_dev;
|
|
|
|
bus_space_tag_t sc_st;
|
|
|
|
bus_space_handle_t sc_sh;
|
2005-04-18 18:47:38 +00:00
|
|
|
|
2006-03-05 20:36:56 +00:00
|
|
|
struct mtx sc_mtx;
|
2005-04-18 18:47:38 +00:00
|
|
|
|
2006-12-19 17:37:41 +00:00
|
|
|
struct callout watchdog_ch;
|
2005-04-18 18:47:38 +00:00
|
|
|
|
2006-03-05 20:36:56 +00:00
|
|
|
int sc_tx_timer;
|
Update 802.11 wireless support:
o major overhaul of the way channels are handled: channels are now
fully enumerated and uniquely identify the operating characteristics;
these changes are visible to user applications which require changes
o make scanning support independent of the state machine to enable
background scanning and roaming
o move scanning support into loadable modules based on the operating
mode to enable different policies and reduce the memory footprint
on systems w/ constrained resources
o add background scanning in station mode (no support for adhoc/ibss
mode yet)
o significantly speedup sta mode scanning with a variety of techniques
o add roaming support when background scanning is supported; for now
we use a simple algorithm to trigger a roam: we threshold the rssi
and tx rate, if either drops too low we try to roam to a new ap
o add tx fragmentation support
o add first cut at 802.11n support: this code works with forthcoming
drivers but is incomplete; it's included now to establish a baseline
for other drivers to be developed and for user applications
o adjust max_linkhdr et. al. to reflect 802.11 requirements; this eliminates
prepending mbufs for traffic generated locally
o add support for Atheros protocol extensions; mainly the fast frames
encapsulation (note this can be used with any card that can tx+rx
large frames correctly)
o add sta support for ap's that beacon both WPA1+2 support
o change all data types from bsd-style to posix-style
o propagate noise floor data from drivers to net80211 and on to user apps
o correct various issues in the sta mode state machine related to handling
authentication and association failures
o enable the addition of sta mode power save support for drivers that need
net80211 support (not in this commit)
o remove old WI compatibility ioctls (wicontrol is officially dead)
o change the data structures returned for get sta info and get scan
results so future additions will not break user apps
o fixed tx rate is now maintained internally as an ieee rate and not an
index into the rate set; this needs to be extended to deal with
multi-mode operation
o add extended channel specifications to radiotap to enable 11n sniffing
Drivers:
o ath: add support for bg scanning, tx fragmentation, fast frames,
dynamic turbo (lightly tested), 11n (sniffing only and needs
new hal)
o awi: compile tested only
o ndis: lightly tested
o ipw: lightly tested
o iwi: add support for bg scanning (well tested but may have some
rough edges)
o ral, ural, rum: add suppoort for bg scanning, calibrate rssi data
o wi: lightly tested
This work is based on contributions by Atheros, kmacy, sephe, thompsa,
mlaier, kevlo, and others. Much of the scanning work was supported by
Atheros. The 11n work was supported by Marvell.
2007-06-11 03:36:55 +00:00
|
|
|
int sc_invalid;
|
2008-04-20 20:35:46 +00:00
|
|
|
int sc_debug;
|
|
|
|
|
|
|
|
const struct ieee80211_rate_table *sc_rates;
|
Update 802.11 wireless support:
o major overhaul of the way channels are handled: channels are now
fully enumerated and uniquely identify the operating characteristics;
these changes are visible to user applications which require changes
o make scanning support independent of the state machine to enable
background scanning and roaming
o move scanning support into loadable modules based on the operating
mode to enable different policies and reduce the memory footprint
on systems w/ constrained resources
o add background scanning in station mode (no support for adhoc/ibss
mode yet)
o significantly speedup sta mode scanning with a variety of techniques
o add roaming support when background scanning is supported; for now
we use a simple algorithm to trigger a roam: we threshold the rssi
and tx rate, if either drops too low we try to roam to a new ap
o add tx fragmentation support
o add first cut at 802.11n support: this code works with forthcoming
drivers but is incomplete; it's included now to establish a baseline
for other drivers to be developed and for user applications
o adjust max_linkhdr et. al. to reflect 802.11 requirements; this eliminates
prepending mbufs for traffic generated locally
o add support for Atheros protocol extensions; mainly the fast frames
encapsulation (note this can be used with any card that can tx+rx
large frames correctly)
o add sta support for ap's that beacon both WPA1+2 support
o change all data types from bsd-style to posix-style
o propagate noise floor data from drivers to net80211 and on to user apps
o correct various issues in the sta mode state machine related to handling
authentication and association failures
o enable the addition of sta mode power save support for drivers that need
net80211 support (not in this commit)
o remove old WI compatibility ioctls (wicontrol is officially dead)
o change the data structures returned for get sta info and get scan
results so future additions will not break user apps
o fixed tx rate is now maintained internally as an ieee rate and not an
index into the rate set; this needs to be extended to deal with
multi-mode operation
o add extended channel specifications to radiotap to enable 11n sniffing
Drivers:
o ath: add support for bg scanning, tx fragmentation, fast frames,
dynamic turbo (lightly tested), 11n (sniffing only and needs
new hal)
o awi: compile tested only
o ndis: lightly tested
o ipw: lightly tested
o iwi: add support for bg scanning (well tested but may have some
rough edges)
o ral, ural, rum: add suppoort for bg scanning, calibrate rssi data
o wi: lightly tested
This work is based on contributions by Atheros, kmacy, sephe, thompsa,
mlaier, kevlo, and others. Much of the scanning work was supported by
Atheros. The 11n work was supported by Marvell.
2007-06-11 03:36:55 +00:00
|
|
|
/*
|
|
|
|
* The same in both up to here
|
|
|
|
* ------------------------------------------------
|
|
|
|
*/
|
2006-03-05 20:36:56 +00:00
|
|
|
uint32_t asic_rev;
|
|
|
|
uint32_t eeprom_rev;
|
|
|
|
uint8_t rf_rev;
|
Update 802.11 wireless support:
o major overhaul of the way channels are handled: channels are now
fully enumerated and uniquely identify the operating characteristics;
these changes are visible to user applications which require changes
o make scanning support independent of the state machine to enable
background scanning and roaming
o move scanning support into loadable modules based on the operating
mode to enable different policies and reduce the memory footprint
on systems w/ constrained resources
o add background scanning in station mode (no support for adhoc/ibss
mode yet)
o significantly speedup sta mode scanning with a variety of techniques
o add roaming support when background scanning is supported; for now
we use a simple algorithm to trigger a roam: we threshold the rssi
and tx rate, if either drops too low we try to roam to a new ap
o add tx fragmentation support
o add first cut at 802.11n support: this code works with forthcoming
drivers but is incomplete; it's included now to establish a baseline
for other drivers to be developed and for user applications
o adjust max_linkhdr et. al. to reflect 802.11 requirements; this eliminates
prepending mbufs for traffic generated locally
o add support for Atheros protocol extensions; mainly the fast frames
encapsulation (note this can be used with any card that can tx+rx
large frames correctly)
o add sta support for ap's that beacon both WPA1+2 support
o change all data types from bsd-style to posix-style
o propagate noise floor data from drivers to net80211 and on to user apps
o correct various issues in the sta mode state machine related to handling
authentication and association failures
o enable the addition of sta mode power save support for drivers that need
net80211 support (not in this commit)
o remove old WI compatibility ioctls (wicontrol is officially dead)
o change the data structures returned for get sta info and get scan
results so future additions will not break user apps
o fixed tx rate is now maintained internally as an ieee rate and not an
index into the rate set; this needs to be extended to deal with
multi-mode operation
o add extended channel specifications to radiotap to enable 11n sniffing
Drivers:
o ath: add support for bg scanning, tx fragmentation, fast frames,
dynamic turbo (lightly tested), 11n (sniffing only and needs
new hal)
o awi: compile tested only
o ndis: lightly tested
o ipw: lightly tested
o iwi: add support for bg scanning (well tested but may have some
rough edges)
o ral, ural, rum: add suppoort for bg scanning, calibrate rssi data
o wi: lightly tested
This work is based on contributions by Atheros, kmacy, sephe, thompsa,
mlaier, kevlo, and others. Much of the scanning work was supported by
Atheros. The 11n work was supported by Marvell.
2007-06-11 03:36:55 +00:00
|
|
|
uint8_t rssi_corr;
|
2005-04-18 18:47:38 +00:00
|
|
|
|
2006-03-05 20:36:56 +00:00
|
|
|
struct rt2560_tx_ring txq;
|
|
|
|
struct rt2560_tx_ring prioq;
|
|
|
|
struct rt2560_tx_ring atimq;
|
|
|
|
struct rt2560_tx_ring bcnq;
|
|
|
|
struct rt2560_rx_ring rxq;
|
2005-04-18 18:47:38 +00:00
|
|
|
|
2006-03-05 20:36:56 +00:00
|
|
|
uint32_t rf_regs[4];
|
|
|
|
uint8_t txpow[14];
|
2005-04-18 18:47:38 +00:00
|
|
|
|
|
|
|
struct {
|
2006-03-05 20:36:56 +00:00
|
|
|
uint8_t reg;
|
|
|
|
uint8_t val;
|
|
|
|
} bbp_prom[16];
|
2005-04-18 18:47:38 +00:00
|
|
|
|
2006-03-05 20:36:56 +00:00
|
|
|
int led_mode;
|
|
|
|
int hw_radio;
|
|
|
|
int rx_ant;
|
|
|
|
int tx_ant;
|
|
|
|
int nb_ant;
|
2005-04-18 18:47:38 +00:00
|
|
|
|
2008-04-20 20:35:46 +00:00
|
|
|
struct rt2560_rx_radiotap_header sc_rxtap;
|
2006-03-05 20:36:56 +00:00
|
|
|
int sc_rxtap_len;
|
2005-04-18 18:47:38 +00:00
|
|
|
|
2008-04-20 20:35:46 +00:00
|
|
|
struct rt2560_tx_radiotap_header sc_txtap;
|
2006-03-05 20:36:56 +00:00
|
|
|
int sc_txtap_len;
|
Various bug fixes for 2560 parts of ral(4):
- Rename rt2560_read_eeprom to rt2560_read_config, we already have
rt2560_eeprom_read
- If hardware gives us wrong encryption done index, shout out loudly and
terminate the processing loop
- Process encryption done if RX done bit is set in interrupt status register
(according to Ralink Linux driver)
- Turn VALID/BUSY bits in TX descriptor only after TX descriptor is fully setup
- Fix BBP read: RT2560_BBPCSR can't be written until its RT2560_BBP_BUSY bit is
off (according to Ralink Linux driver)
- Skip invalid (0 of 0xffff) BBP register/value entries stored in EEPROM
- Fix channel TX power location in EEPROM, if channel TX power is above 31 set
it to 24 (TX power only has 5bits in RF register, "24" is according to Ralink
Linux driver)
- Configure BBP according to the BBP register/value stored in EEPROM, restore
BBP17 (RX sensitivity tuning) to default value after this.
- Set TX/RX antenna after BBP is initialized; these two operation will try to
set BBP registers
- Reconfigure ACK TX time registers according to 802.11g standard (TX @36Mb,
other side's ACK should be sent @24Mb).
- 2560 parts have two TX ring: one for management/control packets, one for data
packets. Add private OACTIVE flag for each of them. Turn on IFF_DRV_OACTIVE
if one of private OACTIVE is on; turn off IFF_DRV_OACTIVE iff all of them are
off.
- Rework watchdog to mimic old if_watchdog action. Process TX done/encryption
done in watchdog function (according to Ralink Linux driver)
Obtained from: DragonFly
Approved by: sam (mentor)
Tested by: sam
Related to PR: kern/117655
# Forcing long slot time setting is not included in this commit, comment and
# related code is in place, so if problem pops up, quick tests could be done.
2008-02-03 11:47:38 +00:00
|
|
|
#define RT2560_F_INPUT_RUNNING 0x1
|
|
|
|
#define RT2560_F_PRIO_OACTIVE 0x2
|
|
|
|
#define RT2560_F_DATA_OACTIVE 0x4
|
|
|
|
int sc_flags;
|
2005-04-18 18:47:38 +00:00
|
|
|
};
|
|
|
|
|
2006-03-05 20:36:56 +00:00
|
|
|
int rt2560_attach(device_t, int);
|
|
|
|
int rt2560_detach(void *);
|
Update 802.11 wireless support:
o major overhaul of the way channels are handled: channels are now
fully enumerated and uniquely identify the operating characteristics;
these changes are visible to user applications which require changes
o make scanning support independent of the state machine to enable
background scanning and roaming
o move scanning support into loadable modules based on the operating
mode to enable different policies and reduce the memory footprint
on systems w/ constrained resources
o add background scanning in station mode (no support for adhoc/ibss
mode yet)
o significantly speedup sta mode scanning with a variety of techniques
o add roaming support when background scanning is supported; for now
we use a simple algorithm to trigger a roam: we threshold the rssi
and tx rate, if either drops too low we try to roam to a new ap
o add tx fragmentation support
o add first cut at 802.11n support: this code works with forthcoming
drivers but is incomplete; it's included now to establish a baseline
for other drivers to be developed and for user applications
o adjust max_linkhdr et. al. to reflect 802.11 requirements; this eliminates
prepending mbufs for traffic generated locally
o add support for Atheros protocol extensions; mainly the fast frames
encapsulation (note this can be used with any card that can tx+rx
large frames correctly)
o add sta support for ap's that beacon both WPA1+2 support
o change all data types from bsd-style to posix-style
o propagate noise floor data from drivers to net80211 and on to user apps
o correct various issues in the sta mode state machine related to handling
authentication and association failures
o enable the addition of sta mode power save support for drivers that need
net80211 support (not in this commit)
o remove old WI compatibility ioctls (wicontrol is officially dead)
o change the data structures returned for get sta info and get scan
results so future additions will not break user apps
o fixed tx rate is now maintained internally as an ieee rate and not an
index into the rate set; this needs to be extended to deal with
multi-mode operation
o add extended channel specifications to radiotap to enable 11n sniffing
Drivers:
o ath: add support for bg scanning, tx fragmentation, fast frames,
dynamic turbo (lightly tested), 11n (sniffing only and needs
new hal)
o awi: compile tested only
o ndis: lightly tested
o ipw: lightly tested
o iwi: add support for bg scanning (well tested but may have some
rough edges)
o ral, ural, rum: add suppoort for bg scanning, calibrate rssi data
o wi: lightly tested
This work is based on contributions by Atheros, kmacy, sephe, thompsa,
mlaier, kevlo, and others. Much of the scanning work was supported by
Atheros. The 11n work was supported by Marvell.
2007-06-11 03:36:55 +00:00
|
|
|
void rt2560_stop(void *);
|
2006-03-05 20:36:56 +00:00
|
|
|
void rt2560_resume(void *);
|
|
|
|
void rt2560_intr(void *);
|
2005-04-18 18:47:38 +00:00
|
|
|
|
2008-04-20 20:35:46 +00:00
|
|
|
#define RAL_LOCK(sc) mtx_lock(&(sc)->sc_mtx)
|
|
|
|
#define RAL_LOCK_ASSERT(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED)
|
|
|
|
#define RAL_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx)
|