mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-05 18:39:59 +00:00
Merge branch 'for-davem' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6
This commit is contained in:
commit
994635a137
84 changed files with 16663 additions and 202 deletions
|
@ -7,6 +7,7 @@
|
|||
|
||||
#include "bcma_private.h"
|
||||
#include <linux/bcma/bcma.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
MODULE_DESCRIPTION("Broadcom's specific AMBA driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
|
@ -229,6 +229,7 @@ static void ar9003_hw_fill_txdesc(struct ath_hw *ah, void *ds, u32 seglen,
|
|||
static int ar9003_hw_proc_txdesc(struct ath_hw *ah, void *ds,
|
||||
struct ath_tx_status *ts)
|
||||
{
|
||||
struct ar9003_txc *txc = (struct ar9003_txc *) ds;
|
||||
struct ar9003_txs *ads;
|
||||
u32 status;
|
||||
|
||||
|
@ -238,7 +239,11 @@ static int ar9003_hw_proc_txdesc(struct ath_hw *ah, void *ds,
|
|||
if ((status & AR_TxDone) == 0)
|
||||
return -EINPROGRESS;
|
||||
|
||||
ah->ts_tail = (ah->ts_tail + 1) % ah->ts_size;
|
||||
ts->qid = MS(ads->ds_info, AR_TxQcuNum);
|
||||
if (!txc || (MS(txc->info, AR_TxQcuNum) == ts->qid))
|
||||
ah->ts_tail = (ah->ts_tail + 1) % ah->ts_size;
|
||||
else
|
||||
return -ENOENT;
|
||||
|
||||
if ((MS(ads->ds_info, AR_DescId) != ATHEROS_VENDOR_ID) ||
|
||||
(MS(ads->ds_info, AR_TxRxDesc) != 1)) {
|
||||
|
@ -254,7 +259,6 @@ static int ar9003_hw_proc_txdesc(struct ath_hw *ah, void *ds,
|
|||
ts->ts_seqnum = MS(status, AR_SeqNum);
|
||||
ts->tid = MS(status, AR_TxTid);
|
||||
|
||||
ts->qid = MS(ads->ds_info, AR_TxQcuNum);
|
||||
ts->desc_id = MS(ads->status1, AR_TxDescId);
|
||||
ts->ts_tstamp = ads->status4;
|
||||
ts->ts_status = 0;
|
||||
|
|
|
@ -236,7 +236,7 @@ static void ar9003_paprd_get_gain_table(struct ath_hw *ah)
|
|||
memset(entry, 0, sizeof(ah->paprd_gain_table_entries));
|
||||
memset(index, 0, sizeof(ah->paprd_gain_table_index));
|
||||
|
||||
for (i = 0; i < 32; i++) {
|
||||
for (i = 0; i < PAPRD_GAIN_TABLE_ENTRIES; i++) {
|
||||
entry[i] = REG_READ(ah, reg);
|
||||
index[i] = (entry[i] >> 24) & 0xff;
|
||||
reg += 4;
|
||||
|
@ -246,13 +246,13 @@ static void ar9003_paprd_get_gain_table(struct ath_hw *ah)
|
|||
static unsigned int ar9003_get_desired_gain(struct ath_hw *ah, int chain,
|
||||
int target_power)
|
||||
{
|
||||
int olpc_gain_delta = 0;
|
||||
int olpc_gain_delta = 0, cl_gain_mod;
|
||||
int alpha_therm, alpha_volt;
|
||||
int therm_cal_value, volt_cal_value;
|
||||
int therm_value, volt_value;
|
||||
int thermal_gain_corr, voltage_gain_corr;
|
||||
int desired_scale, desired_gain = 0;
|
||||
u32 reg;
|
||||
u32 reg_olpc = 0, reg_cl_gain = 0;
|
||||
|
||||
REG_CLR_BIT(ah, AR_PHY_PAPRD_TRAINER_STAT1,
|
||||
AR_PHY_PAPRD_TRAINER_STAT1_PAPRD_TRAIN_DONE);
|
||||
|
@ -271,15 +271,29 @@ static unsigned int ar9003_get_desired_gain(struct ath_hw *ah, int chain,
|
|||
volt_value = REG_READ_FIELD(ah, AR_PHY_BB_THERM_ADC_4,
|
||||
AR_PHY_BB_THERM_ADC_4_LATEST_VOLT_VALUE);
|
||||
|
||||
if (chain == 0)
|
||||
reg = AR_PHY_TPC_11_B0;
|
||||
else if (chain == 1)
|
||||
reg = AR_PHY_TPC_11_B1;
|
||||
else
|
||||
reg = AR_PHY_TPC_11_B2;
|
||||
switch (chain) {
|
||||
case 0:
|
||||
reg_olpc = AR_PHY_TPC_11_B0;
|
||||
reg_cl_gain = AR_PHY_CL_TAB_0;
|
||||
break;
|
||||
case 1:
|
||||
reg_olpc = AR_PHY_TPC_11_B1;
|
||||
reg_cl_gain = AR_PHY_CL_TAB_1;
|
||||
break;
|
||||
case 2:
|
||||
reg_olpc = AR_PHY_TPC_11_B2;
|
||||
reg_cl_gain = AR_PHY_CL_TAB_2;
|
||||
break;
|
||||
default:
|
||||
ath_dbg(ath9k_hw_common(ah), ATH_DBG_CALIBRATE,
|
||||
"Invalid chainmask: %d\n", chain);
|
||||
break;
|
||||
}
|
||||
|
||||
olpc_gain_delta = REG_READ_FIELD(ah, reg,
|
||||
olpc_gain_delta = REG_READ_FIELD(ah, reg_olpc,
|
||||
AR_PHY_TPC_11_OLPC_GAIN_DELTA);
|
||||
cl_gain_mod = REG_READ_FIELD(ah, reg_cl_gain,
|
||||
AR_PHY_CL_TAB_CL_GAIN_MOD);
|
||||
|
||||
if (olpc_gain_delta >= 128)
|
||||
olpc_gain_delta = olpc_gain_delta - 256;
|
||||
|
@ -289,7 +303,7 @@ static unsigned int ar9003_get_desired_gain(struct ath_hw *ah, int chain,
|
|||
voltage_gain_corr = (alpha_volt * (volt_value - volt_cal_value) +
|
||||
(128 / 2)) / 128;
|
||||
desired_gain = target_power - olpc_gain_delta - thermal_gain_corr -
|
||||
voltage_gain_corr + desired_scale;
|
||||
voltage_gain_corr + desired_scale + cl_gain_mod;
|
||||
|
||||
return desired_gain;
|
||||
}
|
||||
|
@ -727,7 +741,7 @@ int ar9003_paprd_setup_gain_table(struct ath_hw *ah, int chain)
|
|||
desired_gain = ar9003_get_desired_gain(ah, chain, train_power);
|
||||
|
||||
gain_index = 0;
|
||||
for (i = 0; i < 32; i++) {
|
||||
for (i = 0; i < PAPRD_GAIN_TABLE_ENTRIES; i++) {
|
||||
if (ah->paprd_gain_table_index[i] >= desired_gain)
|
||||
break;
|
||||
gain_index++;
|
||||
|
|
|
@ -1121,6 +1121,9 @@
|
|||
#define AR_PHY_POWERTX_RATE8_POWERTXHT40_5 0x3F00
|
||||
#define AR_PHY_POWERTX_RATE8_POWERTXHT40_5_S 8
|
||||
|
||||
#define AR_PHY_CL_TAB_CL_GAIN_MOD 0x1f
|
||||
#define AR_PHY_CL_TAB_CL_GAIN_MOD_S 0
|
||||
|
||||
void ar9003_hw_set_chain_masks(struct ath_hw *ah, u8 rx, u8 tx);
|
||||
|
||||
#endif /* AR9003_PHY_H */
|
||||
|
|
|
@ -101,6 +101,11 @@ enum buffer_type {
|
|||
|
||||
#define ATH_TXSTATUS_RING_SIZE 64
|
||||
|
||||
#define DS2PHYS(_dd, _ds) \
|
||||
((_dd)->dd_desc_paddr + ((caddr_t)(_ds) - (caddr_t)(_dd)->dd_desc))
|
||||
#define ATH_DESC_4KB_BOUND_CHECK(_daddr) ((((_daddr) & 0xFFF) > 0xF7F) ? 1 : 0)
|
||||
#define ATH_DESC_4KB_BOUND_NUM_SKIPPED(_len) ((_len) / 4096)
|
||||
|
||||
struct ath_descdma {
|
||||
void *dd_desc;
|
||||
dma_addr_t dd_desc_paddr;
|
||||
|
|
|
@ -361,6 +361,7 @@ void ath_beacon_tasklet(unsigned long data)
|
|||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath_buf *bf = NULL;
|
||||
struct ieee80211_vif *vif;
|
||||
struct ath_tx_status ts;
|
||||
int slot;
|
||||
u32 bfaddr, bc = 0;
|
||||
|
||||
|
@ -385,7 +386,9 @@ void ath_beacon_tasklet(unsigned long data)
|
|||
ath_dbg(common, ATH_DBG_BSTUCK,
|
||||
"beacon is officially stuck\n");
|
||||
sc->sc_flags |= SC_OP_TSF_RESET;
|
||||
spin_lock(&sc->sc_pcu_lock);
|
||||
ath_reset(sc, true);
|
||||
spin_unlock(&sc->sc_pcu_lock);
|
||||
}
|
||||
|
||||
return;
|
||||
|
@ -465,6 +468,11 @@ void ath_beacon_tasklet(unsigned long data)
|
|||
ath9k_hw_txstart(ah, sc->beacon.beaconq);
|
||||
|
||||
sc->beacon.ast_be_xmit += bc; /* XXX per-vif? */
|
||||
if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) {
|
||||
spin_lock_bh(&sc->sc_pcu_lock);
|
||||
ath9k_hw_txprocdesc(ah, bf->bf_desc, (void *)&ts);
|
||||
spin_unlock_bh(&sc->sc_pcu_lock);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -49,6 +49,8 @@ static struct usb_device_id ath9k_hif_usb_ids[] = {
|
|||
.driver_info = AR9280_USB }, /* Netgear WNDA3200 */
|
||||
{ USB_DEVICE(0x083A, 0xA704),
|
||||
.driver_info = AR9280_USB }, /* SMC Networks */
|
||||
{ USB_DEVICE(0x0411, 0x017f),
|
||||
.driver_info = AR9280_USB }, /* Sony UWA-BR100 */
|
||||
|
||||
{ USB_DEVICE(0x0cf3, 0x20ff),
|
||||
.driver_info = STORAGE_DEVICE },
|
||||
|
|
|
@ -299,10 +299,6 @@ int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd,
|
|||
struct list_head *head, const char *name,
|
||||
int nbuf, int ndesc, bool is_tx)
|
||||
{
|
||||
#define DS2PHYS(_dd, _ds) \
|
||||
((_dd)->dd_desc_paddr + ((caddr_t)(_ds) - (caddr_t)(_dd)->dd_desc))
|
||||
#define ATH_DESC_4KB_BOUND_CHECK(_daddr) ((((_daddr) & 0xFFF) > 0xF7F) ? 1 : 0)
|
||||
#define ATH_DESC_4KB_BOUND_NUM_SKIPPED(_len) ((_len) / 4096)
|
||||
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||
u8 *ds;
|
||||
struct ath_buf *bf;
|
||||
|
@ -397,9 +393,6 @@ int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd,
|
|||
fail:
|
||||
memset(dd, 0, sizeof(*dd));
|
||||
return error;
|
||||
#undef ATH_DESC_4KB_BOUND_CHECK
|
||||
#undef ATH_DESC_4KB_BOUND_NUM_SKIPPED
|
||||
#undef DS2PHYS
|
||||
}
|
||||
|
||||
void ath9k_init_crypto(struct ath_softc *sc)
|
||||
|
|
|
@ -617,8 +617,11 @@ void ath_hw_check(struct work_struct *work)
|
|||
ath_dbg(common, ATH_DBG_RESET, "Possible baseband hang, "
|
||||
"busy=%d (try %d)\n", busy, sc->hw_busy_count + 1);
|
||||
if (busy >= 99) {
|
||||
if (++sc->hw_busy_count >= 3)
|
||||
if (++sc->hw_busy_count >= 3) {
|
||||
spin_lock_bh(&sc->sc_pcu_lock);
|
||||
ath_reset(sc, true);
|
||||
spin_unlock_bh(&sc->sc_pcu_lock);
|
||||
}
|
||||
} else if (busy >= 0)
|
||||
sc->hw_busy_count = 0;
|
||||
|
||||
|
@ -637,7 +640,9 @@ static void ath_hw_pll_rx_hang_check(struct ath_softc *sc, u32 pll_sqsum)
|
|||
/* Rx is hung for more than 500ms. Reset it */
|
||||
ath_dbg(common, ATH_DBG_RESET,
|
||||
"Possible RX hang, resetting");
|
||||
spin_lock_bh(&sc->sc_pcu_lock);
|
||||
ath_reset(sc, true);
|
||||
spin_unlock_bh(&sc->sc_pcu_lock);
|
||||
count = 0;
|
||||
}
|
||||
} else
|
||||
|
@ -674,7 +679,9 @@ void ath9k_tasklet(unsigned long data)
|
|||
|
||||
if ((status & ATH9K_INT_FATAL) ||
|
||||
(status & ATH9K_INT_BB_WATCHDOG)) {
|
||||
spin_lock(&sc->sc_pcu_lock);
|
||||
ath_reset(sc, true);
|
||||
spin_unlock(&sc->sc_pcu_lock);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -980,7 +987,6 @@ int ath_reset(struct ath_softc *sc, bool retry_tx)
|
|||
del_timer_sync(&common->ani.timer);
|
||||
|
||||
ath9k_ps_wakeup(sc);
|
||||
spin_lock_bh(&sc->sc_pcu_lock);
|
||||
|
||||
ieee80211_stop_queues(hw);
|
||||
|
||||
|
@ -1023,7 +1029,6 @@ int ath_reset(struct ath_softc *sc, bool retry_tx)
|
|||
}
|
||||
|
||||
ieee80211_wake_queues(hw);
|
||||
spin_unlock_bh(&sc->sc_pcu_lock);
|
||||
|
||||
/* Start ANI */
|
||||
if (!common->disable_ani)
|
||||
|
@ -2326,9 +2331,9 @@ static void ath9k_flush(struct ieee80211_hw *hw, bool drop)
|
|||
ath9k_ps_wakeup(sc);
|
||||
spin_lock_bh(&sc->sc_pcu_lock);
|
||||
drain_txq = ath_drain_all_txq(sc, false);
|
||||
spin_unlock_bh(&sc->sc_pcu_lock);
|
||||
if (!drain_txq)
|
||||
ath_reset(sc, false);
|
||||
spin_unlock_bh(&sc->sc_pcu_lock);
|
||||
ath9k_ps_restore(sc);
|
||||
ieee80211_wake_queues(hw);
|
||||
|
||||
|
|
|
@ -566,11 +566,8 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
|
|||
|
||||
rcu_read_unlock();
|
||||
|
||||
if (needreset) {
|
||||
spin_unlock_bh(&sc->sc_pcu_lock);
|
||||
if (needreset)
|
||||
ath_reset(sc, false);
|
||||
spin_lock_bh(&sc->sc_pcu_lock);
|
||||
}
|
||||
}
|
||||
|
||||
static u32 ath_lookup_rate(struct ath_softc *sc, struct ath_buf *bf,
|
||||
|
@ -2170,7 +2167,9 @@ static void ath_tx_complete_poll_work(struct work_struct *work)
|
|||
if (needreset) {
|
||||
ath_dbg(ath9k_hw_common(sc->sc_ah), ATH_DBG_RESET,
|
||||
"tx hung, resetting the chip\n");
|
||||
spin_lock_bh(&sc->sc_pcu_lock);
|
||||
ath_reset(sc, true);
|
||||
spin_unlock_bh(&sc->sc_pcu_lock);
|
||||
}
|
||||
|
||||
ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work,
|
||||
|
|
|
@ -472,7 +472,7 @@ static struct sk_buff *carl9170_rx_copy_data(u8 *buf, int len)
|
|||
u8 *qc = ieee80211_get_qos_ctl(hdr);
|
||||
reserved += NET_IP_ALIGN;
|
||||
|
||||
if (*qc & IEEE80211_QOS_CONTROL_A_MSDU_PRESENT)
|
||||
if (*qc & IEEE80211_QOS_CTL_A_MSDU_PRESENT)
|
||||
reserved += NET_IP_ALIGN;
|
||||
}
|
||||
|
||||
|
|
|
@ -11,6 +11,7 @@ b43-$(CONFIG_B43_PHY_N) += phy_n.o
|
|||
b43-$(CONFIG_B43_PHY_LP) += phy_lp.o
|
||||
b43-$(CONFIG_B43_PHY_LP) += tables_lpphy.o
|
||||
b43-$(CONFIG_B43_PHY_HT) += phy_ht.o
|
||||
b43-$(CONFIG_B43_PHY_HT) += tables_phy_ht.o
|
||||
b43-$(CONFIG_B43_PHY_HT) += radio_2059.o
|
||||
b43-y += sysfs.o
|
||||
b43-y += xmit.o
|
||||
|
|
|
@ -24,9 +24,14 @@
|
|||
|
||||
#include "b43.h"
|
||||
#include "phy_ht.h"
|
||||
#include "tables_phy_ht.h"
|
||||
#include "radio_2059.h"
|
||||
#include "main.h"
|
||||
|
||||
/**************************************************
|
||||
* Radio 2059.
|
||||
**************************************************/
|
||||
|
||||
static void b43_radio_2059_channel_setup(struct b43_wldev *dev,
|
||||
const struct b43_phy_ht_channeltab_e_radio2059 *e)
|
||||
{
|
||||
|
@ -56,7 +61,7 @@ static void b43_radio_2059_channel_setup(struct b43_wldev *dev,
|
|||
b43_radio_write(dev, 0x98, e->radio_syn98);
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
routing = i ? 0x800 : 0x400;
|
||||
routing = i ? R2059_RXRX1 : R2059_TXRX0;
|
||||
b43_radio_write(dev, routing | 0x4a, e->radio_rxtx4a);
|
||||
b43_radio_write(dev, routing | 0x58, e->radio_rxtx58);
|
||||
b43_radio_write(dev, routing | 0x5a, e->radio_rxtx5a);
|
||||
|
@ -78,11 +83,120 @@ static void b43_radio_2059_channel_setup(struct b43_wldev *dev,
|
|||
udelay(300);
|
||||
}
|
||||
|
||||
static void b43_radio_2059_init(struct b43_wldev *dev)
|
||||
{
|
||||
const u16 routing[] = { R2059_SYN, R2059_TXRX0, R2059_RXRX1 };
|
||||
const u16 radio_values[3][2] = {
|
||||
{ 0x61, 0xE9 }, { 0x69, 0xD5 }, { 0x73, 0x99 },
|
||||
};
|
||||
u16 i, j;
|
||||
|
||||
b43_radio_write(dev, R2059_ALL | 0x51, 0x0070);
|
||||
b43_radio_write(dev, R2059_ALL | 0x5a, 0x0003);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(routing); i++)
|
||||
b43_radio_set(dev, routing[i] | 0x146, 0x3);
|
||||
|
||||
b43_radio_set(dev, 0x2e, 0x0078);
|
||||
b43_radio_set(dev, 0xc0, 0x0080);
|
||||
msleep(2);
|
||||
b43_radio_mask(dev, 0x2e, ~0x0078);
|
||||
b43_radio_mask(dev, 0xc0, ~0x0080);
|
||||
|
||||
if (1) { /* FIXME */
|
||||
b43_radio_set(dev, R2059_RXRX1 | 0x4, 0x1);
|
||||
udelay(10);
|
||||
b43_radio_set(dev, R2059_RXRX1 | 0x0BF, 0x1);
|
||||
b43_radio_maskset(dev, R2059_RXRX1 | 0x19B, 0x3, 0x2);
|
||||
|
||||
b43_radio_set(dev, R2059_RXRX1 | 0x4, 0x2);
|
||||
udelay(100);
|
||||
b43_radio_mask(dev, R2059_RXRX1 | 0x4, ~0x2);
|
||||
|
||||
for (i = 0; i < 10000; i++) {
|
||||
if (b43_radio_read(dev, R2059_RXRX1 | 0x145) & 1) {
|
||||
i = 0;
|
||||
break;
|
||||
}
|
||||
udelay(100);
|
||||
}
|
||||
if (i)
|
||||
b43err(dev->wl, "radio 0x945 timeout\n");
|
||||
|
||||
b43_radio_mask(dev, R2059_RXRX1 | 0x4, ~0x1);
|
||||
b43_radio_set(dev, 0xa, 0x60);
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
b43_radio_write(dev, 0x17F, radio_values[i][0]);
|
||||
b43_radio_write(dev, 0x13D, 0x6E);
|
||||
b43_radio_write(dev, 0x13E, radio_values[i][1]);
|
||||
b43_radio_write(dev, 0x13C, 0x55);
|
||||
|
||||
for (j = 0; j < 10000; j++) {
|
||||
if (b43_radio_read(dev, 0x140) & 2) {
|
||||
j = 0;
|
||||
break;
|
||||
}
|
||||
udelay(500);
|
||||
}
|
||||
if (j)
|
||||
b43err(dev->wl, "radio 0x140 timeout\n");
|
||||
|
||||
b43_radio_write(dev, 0x13C, 0x15);
|
||||
}
|
||||
|
||||
b43_radio_mask(dev, 0x17F, ~0x1);
|
||||
}
|
||||
|
||||
b43_radio_mask(dev, 0x11, 0x0008);
|
||||
}
|
||||
|
||||
/**************************************************
|
||||
* Channel switching ops.
|
||||
**************************************************/
|
||||
|
||||
static void b43_phy_ht_channel_setup(struct b43_wldev *dev,
|
||||
const struct b43_phy_ht_channeltab_e_phy *e,
|
||||
struct ieee80211_channel *new_channel)
|
||||
{
|
||||
/* TODO */
|
||||
bool old_band_5ghz;
|
||||
u8 i;
|
||||
|
||||
old_band_5ghz = b43_phy_read(dev, B43_PHY_HT_BANDCTL) & 0; /* FIXME */
|
||||
if (new_channel->band == IEEE80211_BAND_5GHZ && !old_band_5ghz) {
|
||||
/* TODO */
|
||||
} else if (new_channel->band == IEEE80211_BAND_2GHZ && old_band_5ghz) {
|
||||
/* TODO */
|
||||
}
|
||||
|
||||
b43_phy_write(dev, B43_PHY_HT_BW1, e->bw1);
|
||||
b43_phy_write(dev, B43_PHY_HT_BW2, e->bw2);
|
||||
b43_phy_write(dev, B43_PHY_HT_BW3, e->bw3);
|
||||
b43_phy_write(dev, B43_PHY_HT_BW4, e->bw4);
|
||||
b43_phy_write(dev, B43_PHY_HT_BW5, e->bw5);
|
||||
b43_phy_write(dev, B43_PHY_HT_BW6, e->bw6);
|
||||
|
||||
/* TODO: some ops on PHY regs 0x0B0 and 0xC0A */
|
||||
|
||||
/* TODO: separated function? */
|
||||
for (i = 0; i < 3; i++) {
|
||||
u16 mask;
|
||||
u32 tmp = b43_httab_read(dev, B43_HTTAB32(26, 0xE8));
|
||||
|
||||
if (0) /* FIXME */
|
||||
mask = 0x2 << (i * 4);
|
||||
else
|
||||
mask = 0;
|
||||
b43_phy_mask(dev, B43_PHY_EXTG(0x108), mask);
|
||||
|
||||
b43_httab_write(dev, B43_HTTAB16(7, 0x110 + i), tmp >> 16);
|
||||
b43_httab_write(dev, B43_HTTAB8(13, 0x63 + (i * 4)),
|
||||
tmp & 0xFF);
|
||||
b43_httab_write(dev, B43_HTTAB8(13, 0x73 + (i * 4)),
|
||||
tmp & 0xFF);
|
||||
}
|
||||
|
||||
b43_phy_write(dev, 0x017e, 0x3830);
|
||||
}
|
||||
|
||||
static int b43_phy_ht_set_channel(struct b43_wldev *dev,
|
||||
|
@ -139,6 +253,13 @@ static void b43_phy_ht_op_prepare_structs(struct b43_wldev *dev)
|
|||
memset(phy_ht, 0, sizeof(*phy_ht));
|
||||
}
|
||||
|
||||
static int b43_phy_ht_op_init(struct b43_wldev *dev)
|
||||
{
|
||||
b43_phy_ht_tables_init(dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void b43_phy_ht_op_free(struct b43_wldev *dev)
|
||||
{
|
||||
struct b43_phy *phy = &dev->phy;
|
||||
|
@ -162,6 +283,11 @@ static void b43_phy_ht_op_software_rfkill(struct b43_wldev *dev,
|
|||
b43_phy_maskset(dev, B43_PHY_HT_RF_CTL1, ~0, 0x1);
|
||||
b43_phy_mask(dev, B43_PHY_HT_RF_CTL1, ~0);
|
||||
b43_phy_maskset(dev, B43_PHY_HT_RF_CTL1, ~0, 0x2);
|
||||
|
||||
if (dev->phy.radio_ver == 0x2059)
|
||||
b43_radio_2059_init(dev);
|
||||
else
|
||||
B43_WARN_ON(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -255,9 +381,7 @@ const struct b43_phy_operations b43_phyops_ht = {
|
|||
.allocate = b43_phy_ht_op_allocate,
|
||||
.free = b43_phy_ht_op_free,
|
||||
.prepare_structs = b43_phy_ht_op_prepare_structs,
|
||||
/*
|
||||
.init = b43_phy_ht_op_init,
|
||||
*/
|
||||
.phy_read = b43_phy_ht_op_read,
|
||||
.phy_write = b43_phy_ht_op_write,
|
||||
.phy_maskset = b43_phy_ht_op_maskset,
|
||||
|
|
|
@ -4,9 +4,16 @@
|
|||
#include "phy_common.h"
|
||||
|
||||
|
||||
#define B43_PHY_HT_BANDCTL 0x009 /* Band control */
|
||||
#define B43_PHY_HT_TABLE_ADDR 0x072 /* Table address */
|
||||
#define B43_PHY_HT_TABLE_DATALO 0x073 /* Table data low */
|
||||
#define B43_PHY_HT_TABLE_DATAHI 0x074 /* Table data high */
|
||||
#define B43_PHY_HT_BW1 0x1CE
|
||||
#define B43_PHY_HT_BW2 0x1CF
|
||||
#define B43_PHY_HT_BW3 0x1D0
|
||||
#define B43_PHY_HT_BW4 0x1D1
|
||||
#define B43_PHY_HT_BW5 0x1D2
|
||||
#define B43_PHY_HT_BW6 0x1D3
|
||||
|
||||
#define B43_PHY_HT_RF_CTL1 B43_PHY_EXTG(0x010)
|
||||
|
||||
|
@ -20,7 +27,12 @@
|
|||
|
||||
/* Values for PHY registers used on channel switching */
|
||||
struct b43_phy_ht_channeltab_e_phy {
|
||||
/* TODO */
|
||||
u16 bw1;
|
||||
u16 bw2;
|
||||
u16 bw3;
|
||||
u16 bw4;
|
||||
u16 bw5;
|
||||
u16 bw6;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -23,6 +23,141 @@
|
|||
#include "b43.h"
|
||||
#include "radio_2059.h"
|
||||
|
||||
#define RADIOREGS(r00, r01, r02, r03, r04, r05, r06, r07, r08, r09, \
|
||||
r10, r11, r12, r13, r14, r15, r16, r17, r18, r19, \
|
||||
r20, r21, r22, r23, r24, r25, r26, r27, r28) \
|
||||
.radio_syn16 = r00, \
|
||||
.radio_syn17 = r01, \
|
||||
.radio_syn22 = r02, \
|
||||
.radio_syn25 = r03, \
|
||||
.radio_syn27 = r04, \
|
||||
.radio_syn28 = r05, \
|
||||
.radio_syn29 = r06, \
|
||||
.radio_syn2c = r07, \
|
||||
.radio_syn2d = r08, \
|
||||
.radio_syn37 = r09, \
|
||||
.radio_syn41 = r10, \
|
||||
.radio_syn43 = r11, \
|
||||
.radio_syn47 = r12, \
|
||||
.radio_syn4a = r13, \
|
||||
.radio_syn58 = r14, \
|
||||
.radio_syn5a = r15, \
|
||||
.radio_syn6a = r16, \
|
||||
.radio_syn6d = r17, \
|
||||
.radio_syn6e = r18, \
|
||||
.radio_syn92 = r19, \
|
||||
.radio_syn98 = r20, \
|
||||
.radio_rxtx4a = r21, \
|
||||
.radio_rxtx58 = r22, \
|
||||
.radio_rxtx5a = r23, \
|
||||
.radio_rxtx6a = r24, \
|
||||
.radio_rxtx6d = r25, \
|
||||
.radio_rxtx6e = r26, \
|
||||
.radio_rxtx92 = r27, \
|
||||
.radio_rxtx98 = r28
|
||||
|
||||
#define PHYREGS(r0, r1, r2, r3, r4, r5) \
|
||||
.phy_regs.bw1 = r0, \
|
||||
.phy_regs.bw2 = r1, \
|
||||
.phy_regs.bw3 = r2, \
|
||||
.phy_regs.bw4 = r3, \
|
||||
.phy_regs.bw5 = r4, \
|
||||
.phy_regs.bw6 = r5
|
||||
|
||||
static const struct b43_phy_ht_channeltab_e_radio2059 b43_phy_ht_channeltab_radio2059[] = {
|
||||
{ .freq = 2412,
|
||||
RADIOREGS(0x48, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x6c,
|
||||
0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00),
|
||||
PHYREGS(0x03c9, 0x03c5, 0x03c1, 0x043a, 0x043f, 0x0443),
|
||||
},
|
||||
{ .freq = 2417,
|
||||
RADIOREGS(0x4b, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x71,
|
||||
0x09, 0x0f, 0x0a, 0x00, 0x0a, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00),
|
||||
PHYREGS(0x03cb, 0x03c7, 0x03c3, 0x0438, 0x043d, 0x0441),
|
||||
},
|
||||
{ .freq = 2422,
|
||||
RADIOREGS(0x4e, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x76,
|
||||
0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00),
|
||||
PHYREGS(0x03cd, 0x03c9, 0x03c5, 0x0436, 0x043a, 0x043f),
|
||||
},
|
||||
{ .freq = 2427,
|
||||
RADIOREGS(0x52, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x7b,
|
||||
0x09, 0x0f, 0x09, 0x00, 0x09, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00),
|
||||
PHYREGS(0x03cf, 0x03cb, 0x03c7, 0x0434, 0x0438, 0x043d),
|
||||
},
|
||||
{ .freq = 2432,
|
||||
RADIOREGS(0x55, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x80,
|
||||
0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00),
|
||||
PHYREGS(0x03d1, 0x03cd, 0x03c9, 0x0431, 0x0436, 0x043a),
|
||||
},
|
||||
{ .freq = 2437,
|
||||
RADIOREGS(0x58, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x85,
|
||||
0x09, 0x0f, 0x08, 0x00, 0x08, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00),
|
||||
PHYREGS(0x03d3, 0x03cf, 0x03cb, 0x042f, 0x0434, 0x0438),
|
||||
},
|
||||
{ .freq = 2442,
|
||||
RADIOREGS(0x5c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8a,
|
||||
0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00),
|
||||
PHYREGS(0x03d5, 0x03d1, 0x03cd, 0x042d, 0x0431, 0x0436),
|
||||
},
|
||||
{ .freq = 2447,
|
||||
RADIOREGS(0x5f, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x8f,
|
||||
0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00),
|
||||
PHYREGS(0x03d7, 0x03d3, 0x03cf, 0x042b, 0x042f, 0x0434),
|
||||
},
|
||||
{ .freq = 2452,
|
||||
RADIOREGS(0x62, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x94,
|
||||
0x09, 0x0f, 0x07, 0x00, 0x07, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00),
|
||||
PHYREGS(0x03d9, 0x03d5, 0x03d1, 0x0429, 0x042d, 0x0431),
|
||||
},
|
||||
{ .freq = 2457,
|
||||
RADIOREGS(0x66, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x99,
|
||||
0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00),
|
||||
PHYREGS(0x03db, 0x03d7, 0x03d3, 0x0427, 0x042b, 0x042f),
|
||||
},
|
||||
{ .freq = 2462,
|
||||
RADIOREGS(0x69, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0x9e,
|
||||
0x09, 0x0f, 0x06, 0x00, 0x06, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00),
|
||||
PHYREGS(0x03dd, 0x03d9, 0x03d5, 0x0424, 0x0429, 0x042d),
|
||||
},
|
||||
{ .freq = 2467,
|
||||
RADIOREGS(0x6c, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa3,
|
||||
0x09, 0x0f, 0x05, 0x00, 0x05, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00),
|
||||
PHYREGS(0x03df, 0x03db, 0x03d7, 0x0422, 0x0427, 0x042b),
|
||||
},
|
||||
{ .freq = 2472,
|
||||
RADIOREGS(0x70, 0x16, 0x30, 0x1b, 0x0a, 0x0a, 0x30, 0xa8,
|
||||
0x09, 0x0f, 0x05, 0x00, 0x05, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x61, 0x03,
|
||||
0x00, 0x00, 0x00, 0xf0, 0x00),
|
||||
PHYREGS(0x03e1, 0x03dd, 0x03d9, 0x0420, 0x0424, 0x0429),
|
||||
},
|
||||
};
|
||||
|
||||
const struct b43_phy_ht_channeltab_e_radio2059
|
||||
*b43_phy_ht_get_channeltab_e_r2059(struct b43_wldev *dev, u16 freq)
|
||||
{
|
||||
|
|
|
@ -5,6 +5,11 @@
|
|||
|
||||
#include "phy_ht.h"
|
||||
|
||||
#define R2059_SYN 0x000
|
||||
#define R2059_TXRX0 0x400
|
||||
#define R2059_RXRX1 0x800
|
||||
#define R2059_ALL 0xC00
|
||||
|
||||
/* Values for various registers uploaded on channel switching */
|
||||
struct b43_phy_ht_channeltab_e_radio2059 {
|
||||
/* The channel frequency in MHz */
|
||||
|
|
750
drivers/net/wireless/b43/tables_phy_ht.c
Normal file
750
drivers/net/wireless/b43/tables_phy_ht.c
Normal file
|
@ -0,0 +1,750 @@
|
|||
/*
|
||||
|
||||
Broadcom B43 wireless driver
|
||||
IEEE 802.11n HT-PHY data tables
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
|
||||
Boston, MA 02110-1301, USA.
|
||||
|
||||
*/
|
||||
|
||||
#include "b43.h"
|
||||
#include "tables_phy_ht.h"
|
||||
#include "phy_common.h"
|
||||
#include "phy_ht.h"
|
||||
|
||||
static const u16 b43_httab_0x12[] = {
|
||||
0x0000, 0x0008, 0x000a, 0x0010, 0x0012, 0x0019,
|
||||
0x001a, 0x001c, 0x0080, 0x0088, 0x008a, 0x0090,
|
||||
0x0092, 0x0099, 0x009a, 0x009c, 0x0100, 0x0108,
|
||||
0x010a, 0x0110, 0x0112, 0x0119, 0x011a, 0x011c,
|
||||
0x0180, 0x0188, 0x018a, 0x0190, 0x0192, 0x0199,
|
||||
0x019a, 0x019c, 0x0000, 0x0098, 0x00a0, 0x00a8,
|
||||
0x009a, 0x00a2, 0x00aa, 0x0120, 0x0128, 0x0128,
|
||||
0x0130, 0x0138, 0x0138, 0x0140, 0x0122, 0x012a,
|
||||
0x012a, 0x0132, 0x013a, 0x013a, 0x0142, 0x01a8,
|
||||
0x01b0, 0x01b8, 0x01b0, 0x01b8, 0x01c0, 0x01c8,
|
||||
0x01c0, 0x01c8, 0x01d0, 0x01d0, 0x01d8, 0x01aa,
|
||||
0x01b2, 0x01ba, 0x01b2, 0x01ba, 0x01c2, 0x01ca,
|
||||
0x01c2, 0x01ca, 0x01d2, 0x01d2, 0x01da, 0x0001,
|
||||
0x0002, 0x0004, 0x0009, 0x000c, 0x0011, 0x0014,
|
||||
0x0018, 0x0020, 0x0021, 0x0022, 0x0024, 0x0081,
|
||||
0x0082, 0x0084, 0x0089, 0x008c, 0x0091, 0x0094,
|
||||
0x0098, 0x00a0, 0x00a1, 0x00a2, 0x00a4, 0x0007,
|
||||
0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007,
|
||||
0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007,
|
||||
0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007,
|
||||
0x0007, 0x0007, 0x0007, 0x0007, 0x0007, 0x0007,
|
||||
0x0007, 0x0007,
|
||||
};
|
||||
|
||||
static const u16 b43_httab_0x27[] = {
|
||||
0x0009, 0x000e, 0x0011, 0x0014, 0x0017, 0x001a,
|
||||
0x001d, 0x0020, 0x0009, 0x000e, 0x0011, 0x0014,
|
||||
0x0017, 0x001a, 0x001d, 0x0020, 0x0009, 0x000e,
|
||||
0x0011, 0x0014, 0x0017, 0x001a, 0x001d, 0x0020,
|
||||
0x0009, 0x000e, 0x0011, 0x0014, 0x0017, 0x001a,
|
||||
0x001d, 0x0020,
|
||||
};
|
||||
|
||||
static const u16 b43_httab_0x26[] = {
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000,
|
||||
};
|
||||
|
||||
static const u32 b43_httab_0x25[] = {
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
};
|
||||
|
||||
static const u32 b43_httab_0x2f[] = {
|
||||
0x00035700, 0x0002cc9a, 0x00026666, 0x0001581f,
|
||||
0x0001581f, 0x0001581f, 0x0001581f, 0x0001581f,
|
||||
0x0001581f, 0x0001581f, 0x0001581f, 0x00035700,
|
||||
0x0002cc9a, 0x00026666, 0x0001581f, 0x0001581f,
|
||||
0x0001581f, 0x0001581f, 0x0001581f, 0x0001581f,
|
||||
0x0001581f, 0x0001581f,
|
||||
};
|
||||
|
||||
static const u16 b43_httab_0x1a[] = {
|
||||
0x0055, 0x0054, 0x0054, 0x0053, 0x0052, 0x0052,
|
||||
0x0051, 0x0051, 0x0050, 0x004f, 0x004f, 0x004e,
|
||||
0x004e, 0x004d, 0x004c, 0x004c, 0x004b, 0x004a,
|
||||
0x0049, 0x0049, 0x0048, 0x0047, 0x0046, 0x0046,
|
||||
0x0045, 0x0044, 0x0043, 0x0042, 0x0041, 0x0040,
|
||||
0x0040, 0x003f, 0x003e, 0x003d, 0x003c, 0x003a,
|
||||
0x0039, 0x0038, 0x0037, 0x0036, 0x0035, 0x0033,
|
||||
0x0032, 0x0031, 0x002f, 0x002e, 0x002c, 0x002b,
|
||||
0x0029, 0x0027, 0x0025, 0x0023, 0x0021, 0x001f,
|
||||
0x001d, 0x001a, 0x0018, 0x0015, 0x0012, 0x000e,
|
||||
0x000b, 0x0007, 0x0002, 0x00fd,
|
||||
};
|
||||
|
||||
static const u16 b43_httab_0x1b[] = {
|
||||
0x0055, 0x0054, 0x0054, 0x0053, 0x0052, 0x0052,
|
||||
0x0051, 0x0051, 0x0050, 0x004f, 0x004f, 0x004e,
|
||||
0x004e, 0x004d, 0x004c, 0x004c, 0x004b, 0x004a,
|
||||
0x0049, 0x0049, 0x0048, 0x0047, 0x0046, 0x0046,
|
||||
0x0045, 0x0044, 0x0043, 0x0042, 0x0041, 0x0040,
|
||||
0x0040, 0x003f, 0x003e, 0x003d, 0x003c, 0x003a,
|
||||
0x0039, 0x0038, 0x0037, 0x0036, 0x0035, 0x0033,
|
||||
0x0032, 0x0031, 0x002f, 0x002e, 0x002c, 0x002b,
|
||||
0x0029, 0x0027, 0x0025, 0x0023, 0x0021, 0x001f,
|
||||
0x001d, 0x001a, 0x0018, 0x0015, 0x0012, 0x000e,
|
||||
0x000b, 0x0007, 0x0002, 0x00fd,
|
||||
};
|
||||
|
||||
static const u16 b43_httab_0x1c[] = {
|
||||
0x0055, 0x0054, 0x0054, 0x0053, 0x0052, 0x0052,
|
||||
0x0051, 0x0051, 0x0050, 0x004f, 0x004f, 0x004e,
|
||||
0x004e, 0x004d, 0x004c, 0x004c, 0x004b, 0x004a,
|
||||
0x0049, 0x0049, 0x0048, 0x0047, 0x0046, 0x0046,
|
||||
0x0045, 0x0044, 0x0043, 0x0042, 0x0041, 0x0040,
|
||||
0x0040, 0x003f, 0x003e, 0x003d, 0x003c, 0x003a,
|
||||
0x0039, 0x0038, 0x0037, 0x0036, 0x0035, 0x0033,
|
||||
0x0032, 0x0031, 0x002f, 0x002e, 0x002c, 0x002b,
|
||||
0x0029, 0x0027, 0x0025, 0x0023, 0x0021, 0x001f,
|
||||
0x001d, 0x001a, 0x0018, 0x0015, 0x0012, 0x000e,
|
||||
0x000b, 0x0007, 0x0002, 0x00fd,
|
||||
};
|
||||
|
||||
static const u32 b43_httab_0x1a_0xc0[] = {
|
||||
0x5bf70044, 0x5bf70042, 0x5bf70040, 0x5bf7003e,
|
||||
0x5bf7003c, 0x5bf7003b, 0x5bf70039, 0x5bf70037,
|
||||
0x5bf70036, 0x5bf70034, 0x5bf70033, 0x5bf70031,
|
||||
0x5bf70030, 0x5ba70044, 0x5ba70042, 0x5ba70040,
|
||||
0x5ba7003e, 0x5ba7003c, 0x5ba7003b, 0x5ba70039,
|
||||
0x5ba70037, 0x5ba70036, 0x5ba70034, 0x5ba70033,
|
||||
0x5b770044, 0x5b770042, 0x5b770040, 0x5b77003e,
|
||||
0x5b77003c, 0x5b77003b, 0x5b770039, 0x5b770037,
|
||||
0x5b770036, 0x5b770034, 0x5b770033, 0x5b770031,
|
||||
0x5b770030, 0x5b77002f, 0x5b77002d, 0x5b77002c,
|
||||
0x5b470044, 0x5b470042, 0x5b470040, 0x5b47003e,
|
||||
0x5b47003c, 0x5b47003b, 0x5b470039, 0x5b470037,
|
||||
0x5b470036, 0x5b470034, 0x5b470033, 0x5b470031,
|
||||
0x5b470030, 0x5b47002f, 0x5b47002d, 0x5b47002c,
|
||||
0x5b47002b, 0x5b47002a, 0x5b270044, 0x5b270042,
|
||||
0x5b270040, 0x5b27003e, 0x5b27003c, 0x5b27003b,
|
||||
0x5b270039, 0x5b270037, 0x5b270036, 0x5b270034,
|
||||
0x5b270033, 0x5b270031, 0x5b270030, 0x5b27002f,
|
||||
0x5b170044, 0x5b170042, 0x5b170040, 0x5b17003e,
|
||||
0x5b17003c, 0x5b17003b, 0x5b170039, 0x5b170037,
|
||||
0x5b170036, 0x5b170034, 0x5b170033, 0x5b170031,
|
||||
0x5b170030, 0x5b17002f, 0x5b17002d, 0x5b17002c,
|
||||
0x5b17002b, 0x5b17002a, 0x5b170028, 0x5b170027,
|
||||
0x5b170026, 0x5b170025, 0x5b170024, 0x5b170023,
|
||||
0x5b070044, 0x5b070042, 0x5b070040, 0x5b07003e,
|
||||
0x5b07003c, 0x5b07003b, 0x5b070039, 0x5b070037,
|
||||
0x5b070036, 0x5b070034, 0x5b070033, 0x5b070031,
|
||||
0x5b070030, 0x5b07002f, 0x5b07002d, 0x5b07002c,
|
||||
0x5b07002b, 0x5b07002a, 0x5b070028, 0x5b070027,
|
||||
0x5b070026, 0x5b070025, 0x5b070024, 0x5b070023,
|
||||
0x5b070022, 0x5b070021, 0x5b070020, 0x5b07001f,
|
||||
0x5b07001e, 0x5b07001d, 0x5b07001d, 0x5b07001c,
|
||||
};
|
||||
|
||||
static const u32 b43_httab_0x1a_0x140[] = {
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
};
|
||||
|
||||
static const u32 b43_httab_0x1b_0x140[] = {
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
};
|
||||
|
||||
static const u32 b43_httab_0x1c_0x140[] = {
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
};
|
||||
|
||||
static const u16 b43_httab_0x1a_0x1c0[] = {
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000,
|
||||
};
|
||||
|
||||
static const u16 b43_httab_0x1b_0x1c0[] = {
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000,
|
||||
};
|
||||
|
||||
static const u16 b43_httab_0x1c_0x1c0[] = {
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
|
||||
0x0000, 0x0000,
|
||||
};
|
||||
|
||||
static const u16 b43_httab_0x1a_0x240[] = {
|
||||
0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036,
|
||||
0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036,
|
||||
0x0036, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
|
||||
0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
|
||||
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
|
||||
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
|
||||
0x001e, 0x001e, 0x001e, 0x001e, 0x000e, 0x000e,
|
||||
0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e,
|
||||
0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e,
|
||||
0x000e, 0x000e, 0x000e, 0x000e, 0x01fc, 0x01fc,
|
||||
0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc,
|
||||
0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc,
|
||||
0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
|
||||
0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
|
||||
0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
|
||||
0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
|
||||
0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
|
||||
0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
|
||||
0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
|
||||
0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
|
||||
0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
|
||||
0x01d6, 0x01d6,
|
||||
};
|
||||
|
||||
static const u16 b43_httab_0x1b_0x240[] = {
|
||||
0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036,
|
||||
0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036,
|
||||
0x0036, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
|
||||
0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
|
||||
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
|
||||
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
|
||||
0x001e, 0x001e, 0x001e, 0x001e, 0x000e, 0x000e,
|
||||
0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e,
|
||||
0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e,
|
||||
0x000e, 0x000e, 0x000e, 0x000e, 0x01fc, 0x01fc,
|
||||
0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc,
|
||||
0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc,
|
||||
0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
|
||||
0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
|
||||
0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
|
||||
0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
|
||||
0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
|
||||
0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
|
||||
0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
|
||||
0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
|
||||
0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
|
||||
0x01d6, 0x01d6,
|
||||
};
|
||||
|
||||
static const u16 b43_httab_0x1c_0x240[] = {
|
||||
0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036,
|
||||
0x0036, 0x0036, 0x0036, 0x0036, 0x0036, 0x0036,
|
||||
0x0036, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
|
||||
0x002a, 0x002a, 0x002a, 0x002a, 0x002a, 0x002a,
|
||||
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
|
||||
0x001e, 0x001e, 0x001e, 0x001e, 0x001e, 0x001e,
|
||||
0x001e, 0x001e, 0x001e, 0x001e, 0x000e, 0x000e,
|
||||
0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e,
|
||||
0x000e, 0x000e, 0x000e, 0x000e, 0x000e, 0x000e,
|
||||
0x000e, 0x000e, 0x000e, 0x000e, 0x01fc, 0x01fc,
|
||||
0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc,
|
||||
0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc, 0x01fc,
|
||||
0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
|
||||
0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
|
||||
0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
|
||||
0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee, 0x01ee,
|
||||
0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
|
||||
0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
|
||||
0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
|
||||
0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
|
||||
0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6, 0x01d6,
|
||||
0x01d6, 0x01d6,
|
||||
};
|
||||
|
||||
static const u32 b43_httab_0x1f[] = {
|
||||
0x00000000, 0x00000000, 0x00016023, 0x00006028,
|
||||
0x00034036, 0x0003402e, 0x0007203c, 0x0006e037,
|
||||
0x00070030, 0x0009401f, 0x0009a00f, 0x000b600d,
|
||||
0x000c8007, 0x000ce007, 0x00101fff, 0x00121ff9,
|
||||
0x0012e004, 0x0014dffc, 0x0016dff6, 0x0018dfe9,
|
||||
0x001b3fe5, 0x001c5fd0, 0x001ddfc2, 0x001f1fb6,
|
||||
0x00207fa4, 0x00219f8f, 0x0022ff7d, 0x00247f6c,
|
||||
0x0024df5b, 0x00267f4b, 0x0027df3b, 0x0029bf3b,
|
||||
0x002b5f2f, 0x002d3f2e, 0x002f5f2a, 0x002fff15,
|
||||
0x00315f0b, 0x0032defa, 0x0033beeb, 0x0034fed9,
|
||||
0x00353ec5, 0x00361eb0, 0x00363e9b, 0x0036be87,
|
||||
0x0036be70, 0x0038fe67, 0x0044beb2, 0x00513ef3,
|
||||
0x00595f11, 0x00669f3d, 0x0078dfdf, 0x00a143aa,
|
||||
0x01642fff, 0x0162afff, 0x01620fff, 0x0160cfff,
|
||||
0x015f0fff, 0x015dafff, 0x015bcfff, 0x015bcfff,
|
||||
0x015b4fff, 0x015acfff, 0x01590fff, 0x0156cfff,
|
||||
};
|
||||
|
||||
static const u32 b43_httab_0x21[] = {
|
||||
0x00000000, 0x00000000, 0x00016023, 0x00006028,
|
||||
0x00034036, 0x0003402e, 0x0007203c, 0x0006e037,
|
||||
0x00070030, 0x0009401f, 0x0009a00f, 0x000b600d,
|
||||
0x000c8007, 0x000ce007, 0x00101fff, 0x00121ff9,
|
||||
0x0012e004, 0x0014dffc, 0x0016dff6, 0x0018dfe9,
|
||||
0x001b3fe5, 0x001c5fd0, 0x001ddfc2, 0x001f1fb6,
|
||||
0x00207fa4, 0x00219f8f, 0x0022ff7d, 0x00247f6c,
|
||||
0x0024df5b, 0x00267f4b, 0x0027df3b, 0x0029bf3b,
|
||||
0x002b5f2f, 0x002d3f2e, 0x002f5f2a, 0x002fff15,
|
||||
0x00315f0b, 0x0032defa, 0x0033beeb, 0x0034fed9,
|
||||
0x00353ec5, 0x00361eb0, 0x00363e9b, 0x0036be87,
|
||||
0x0036be70, 0x0038fe67, 0x0044beb2, 0x00513ef3,
|
||||
0x00595f11, 0x00669f3d, 0x0078dfdf, 0x00a143aa,
|
||||
0x01642fff, 0x0162afff, 0x01620fff, 0x0160cfff,
|
||||
0x015f0fff, 0x015dafff, 0x015bcfff, 0x015bcfff,
|
||||
0x015b4fff, 0x015acfff, 0x01590fff, 0x0156cfff,
|
||||
};
|
||||
|
||||
static const u32 b43_httab_0x23[] = {
|
||||
0x00000000, 0x00000000, 0x00016023, 0x00006028,
|
||||
0x00034036, 0x0003402e, 0x0007203c, 0x0006e037,
|
||||
0x00070030, 0x0009401f, 0x0009a00f, 0x000b600d,
|
||||
0x000c8007, 0x000ce007, 0x00101fff, 0x00121ff9,
|
||||
0x0012e004, 0x0014dffc, 0x0016dff6, 0x0018dfe9,
|
||||
0x001b3fe5, 0x001c5fd0, 0x001ddfc2, 0x001f1fb6,
|
||||
0x00207fa4, 0x00219f8f, 0x0022ff7d, 0x00247f6c,
|
||||
0x0024df5b, 0x00267f4b, 0x0027df3b, 0x0029bf3b,
|
||||
0x002b5f2f, 0x002d3f2e, 0x002f5f2a, 0x002fff15,
|
||||
0x00315f0b, 0x0032defa, 0x0033beeb, 0x0034fed9,
|
||||
0x00353ec5, 0x00361eb0, 0x00363e9b, 0x0036be87,
|
||||
0x0036be70, 0x0038fe67, 0x0044beb2, 0x00513ef3,
|
||||
0x00595f11, 0x00669f3d, 0x0078dfdf, 0x00a143aa,
|
||||
0x01642fff, 0x0162afff, 0x01620fff, 0x0160cfff,
|
||||
0x015f0fff, 0x015dafff, 0x015bcfff, 0x015bcfff,
|
||||
0x015b4fff, 0x015acfff, 0x01590fff, 0x0156cfff,
|
||||
};
|
||||
|
||||
static const u32 b43_httab_0x20[] = {
|
||||
0x0b5e002d, 0x0ae2002f, 0x0a3b0032, 0x09a70035,
|
||||
0x09220038, 0x08ab003b, 0x081f003f, 0x07a20043,
|
||||
0x07340047, 0x06d2004b, 0x067a004f, 0x06170054,
|
||||
0x05bf0059, 0x0571005e, 0x051e0064, 0x04d3006a,
|
||||
0x04910070, 0x044c0077, 0x040f007e, 0x03d90085,
|
||||
0x03a1008d, 0x036f0095, 0x033d009e, 0x030b00a8,
|
||||
0x02e000b2, 0x02b900bc, 0x029200c7, 0x026d00d3,
|
||||
0x024900e0, 0x022900ed, 0x020a00fb, 0x01ec010a,
|
||||
0x01d20119, 0x01b7012a, 0x019e013c, 0x0188014e,
|
||||
0x01720162, 0x015d0177, 0x0149018e, 0x013701a5,
|
||||
0x012601be, 0x011501d8, 0x010601f4, 0x00f70212,
|
||||
0x00e90231, 0x00dc0253, 0x00d00276, 0x00c4029b,
|
||||
0x00b902c3, 0x00af02ed, 0x00a50319, 0x009c0348,
|
||||
0x0093037a, 0x008b03af, 0x008303e6, 0x007c0422,
|
||||
0x00750460, 0x006e04a3, 0x006804e9, 0x00620533,
|
||||
0x005d0582, 0x005805d6, 0x0053062e, 0x004e068c,
|
||||
};
|
||||
|
||||
static const u32 b43_httab_0x22[] = {
|
||||
0x0b5e002d, 0x0ae2002f, 0x0a3b0032, 0x09a70035,
|
||||
0x09220038, 0x08ab003b, 0x081f003f, 0x07a20043,
|
||||
0x07340047, 0x06d2004b, 0x067a004f, 0x06170054,
|
||||
0x05bf0059, 0x0571005e, 0x051e0064, 0x04d3006a,
|
||||
0x04910070, 0x044c0077, 0x040f007e, 0x03d90085,
|
||||
0x03a1008d, 0x036f0095, 0x033d009e, 0x030b00a8,
|
||||
0x02e000b2, 0x02b900bc, 0x029200c7, 0x026d00d3,
|
||||
0x024900e0, 0x022900ed, 0x020a00fb, 0x01ec010a,
|
||||
0x01d20119, 0x01b7012a, 0x019e013c, 0x0188014e,
|
||||
0x01720162, 0x015d0177, 0x0149018e, 0x013701a5,
|
||||
0x012601be, 0x011501d8, 0x010601f4, 0x00f70212,
|
||||
0x00e90231, 0x00dc0253, 0x00d00276, 0x00c4029b,
|
||||
0x00b902c3, 0x00af02ed, 0x00a50319, 0x009c0348,
|
||||
0x0093037a, 0x008b03af, 0x008303e6, 0x007c0422,
|
||||
0x00750460, 0x006e04a3, 0x006804e9, 0x00620533,
|
||||
0x005d0582, 0x005805d6, 0x0053062e, 0x004e068c,
|
||||
};
|
||||
|
||||
static const u32 b43_httab_0x24[] = {
|
||||
0x0b5e002d, 0x0ae2002f, 0x0a3b0032, 0x09a70035,
|
||||
0x09220038, 0x08ab003b, 0x081f003f, 0x07a20043,
|
||||
0x07340047, 0x06d2004b, 0x067a004f, 0x06170054,
|
||||
0x05bf0059, 0x0571005e, 0x051e0064, 0x04d3006a,
|
||||
0x04910070, 0x044c0077, 0x040f007e, 0x03d90085,
|
||||
0x03a1008d, 0x036f0095, 0x033d009e, 0x030b00a8,
|
||||
0x02e000b2, 0x02b900bc, 0x029200c7, 0x026d00d3,
|
||||
0x024900e0, 0x022900ed, 0x020a00fb, 0x01ec010a,
|
||||
0x01d20119, 0x01b7012a, 0x019e013c, 0x0188014e,
|
||||
0x01720162, 0x015d0177, 0x0149018e, 0x013701a5,
|
||||
0x012601be, 0x011501d8, 0x010601f4, 0x00f70212,
|
||||
0x00e90231, 0x00dc0253, 0x00d00276, 0x00c4029b,
|
||||
0x00b902c3, 0x00af02ed, 0x00a50319, 0x009c0348,
|
||||
0x0093037a, 0x008b03af, 0x008303e6, 0x007c0422,
|
||||
0x00750460, 0x006e04a3, 0x006804e9, 0x00620533,
|
||||
0x005d0582, 0x005805d6, 0x0053062e, 0x004e068c,
|
||||
};
|
||||
|
||||
/**************************************************
|
||||
* R/W ops.
|
||||
**************************************************/
|
||||
|
||||
u32 b43_httab_read(struct b43_wldev *dev, u32 offset)
|
||||
{
|
||||
u32 type, value;
|
||||
|
||||
type = offset & B43_HTTAB_TYPEMASK;
|
||||
offset &= ~B43_HTTAB_TYPEMASK;
|
||||
B43_WARN_ON(offset > 0xFFFF);
|
||||
|
||||
switch (type) {
|
||||
case B43_HTTAB_8BIT:
|
||||
b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
|
||||
value = b43_phy_read(dev, B43_PHY_HT_TABLE_DATALO) & 0xFF;
|
||||
break;
|
||||
case B43_HTTAB_16BIT:
|
||||
b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
|
||||
value = b43_phy_read(dev, B43_PHY_HT_TABLE_DATALO);
|
||||
break;
|
||||
case B43_HTTAB_32BIT:
|
||||
b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
|
||||
value = b43_phy_read(dev, B43_PHY_HT_TABLE_DATAHI);
|
||||
value <<= 16;
|
||||
value |= b43_phy_read(dev, B43_PHY_HT_TABLE_DATALO);
|
||||
break;
|
||||
default:
|
||||
B43_WARN_ON(1);
|
||||
value = 0;
|
||||
}
|
||||
|
||||
return value;
|
||||
}
|
||||
|
||||
void b43_httab_read_bulk(struct b43_wldev *dev, u32 offset,
|
||||
unsigned int nr_elements, void *_data)
|
||||
{
|
||||
u32 type;
|
||||
u8 *data = _data;
|
||||
unsigned int i;
|
||||
|
||||
type = offset & B43_HTTAB_TYPEMASK;
|
||||
offset &= ~B43_HTTAB_TYPEMASK;
|
||||
B43_WARN_ON(offset > 0xFFFF);
|
||||
|
||||
b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
|
||||
|
||||
for (i = 0; i < nr_elements; i++) {
|
||||
switch (type) {
|
||||
case B43_HTTAB_8BIT:
|
||||
*data = b43_phy_read(dev, B43_PHY_HT_TABLE_DATALO) & 0xFF;
|
||||
data++;
|
||||
break;
|
||||
case B43_HTTAB_16BIT:
|
||||
*((u16 *)data) = b43_phy_read(dev, B43_PHY_HT_TABLE_DATALO);
|
||||
data += 2;
|
||||
break;
|
||||
case B43_HTTAB_32BIT:
|
||||
*((u32 *)data) = b43_phy_read(dev, B43_PHY_HT_TABLE_DATAHI);
|
||||
*((u32 *)data) <<= 16;
|
||||
*((u32 *)data) |= b43_phy_read(dev, B43_PHY_HT_TABLE_DATALO);
|
||||
data += 4;
|
||||
break;
|
||||
default:
|
||||
B43_WARN_ON(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void b43_httab_write(struct b43_wldev *dev, u32 offset, u32 value)
|
||||
{
|
||||
u32 type;
|
||||
|
||||
type = offset & B43_HTTAB_TYPEMASK;
|
||||
offset &= 0xFFFF;
|
||||
|
||||
switch (type) {
|
||||
case B43_HTTAB_8BIT:
|
||||
B43_WARN_ON(value & ~0xFF);
|
||||
b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
|
||||
b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO, value);
|
||||
break;
|
||||
case B43_HTTAB_16BIT:
|
||||
B43_WARN_ON(value & ~0xFFFF);
|
||||
b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
|
||||
b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO, value);
|
||||
break;
|
||||
case B43_HTTAB_32BIT:
|
||||
b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
|
||||
b43_phy_write(dev, B43_PHY_HT_TABLE_DATAHI, value >> 16);
|
||||
b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO, value & 0xFFFF);
|
||||
break;
|
||||
default:
|
||||
B43_WARN_ON(1);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void b43_httab_write_bulk(struct b43_wldev *dev, u32 offset,
|
||||
unsigned int nr_elements, const void *_data)
|
||||
{
|
||||
u32 type, value;
|
||||
const u8 *data = _data;
|
||||
unsigned int i;
|
||||
|
||||
type = offset & B43_HTTAB_TYPEMASK;
|
||||
offset &= ~B43_HTTAB_TYPEMASK;
|
||||
B43_WARN_ON(offset > 0xFFFF);
|
||||
|
||||
b43_phy_write(dev, B43_PHY_HT_TABLE_ADDR, offset);
|
||||
|
||||
for (i = 0; i < nr_elements; i++) {
|
||||
switch (type) {
|
||||
case B43_HTTAB_8BIT:
|
||||
value = *data;
|
||||
data++;
|
||||
B43_WARN_ON(value & ~0xFF);
|
||||
b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO, value);
|
||||
break;
|
||||
case B43_HTTAB_16BIT:
|
||||
value = *((u16 *)data);
|
||||
data += 2;
|
||||
B43_WARN_ON(value & ~0xFFFF);
|
||||
b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO, value);
|
||||
break;
|
||||
case B43_HTTAB_32BIT:
|
||||
value = *((u32 *)data);
|
||||
data += 4;
|
||||
b43_phy_write(dev, B43_PHY_HT_TABLE_DATAHI, value >> 16);
|
||||
b43_phy_write(dev, B43_PHY_HT_TABLE_DATALO,
|
||||
value & 0xFFFF);
|
||||
break;
|
||||
default:
|
||||
B43_WARN_ON(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**************************************************
|
||||
* Tables ops.
|
||||
**************************************************/
|
||||
|
||||
#define httab_upload(dev, offset, data) do { \
|
||||
b43_httab_write_bulk(dev, offset, ARRAY_SIZE(data), data); \
|
||||
} while (0)
|
||||
void b43_phy_ht_tables_init(struct b43_wldev *dev)
|
||||
{
|
||||
httab_upload(dev, B43_HTTAB16(0x12, 0), b43_httab_0x12);
|
||||
httab_upload(dev, B43_HTTAB16(0x27, 0), b43_httab_0x27);
|
||||
httab_upload(dev, B43_HTTAB16(0x26, 0), b43_httab_0x26);
|
||||
httab_upload(dev, B43_HTTAB32(0x25, 0), b43_httab_0x25);
|
||||
httab_upload(dev, B43_HTTAB32(0x2f, 0), b43_httab_0x2f);
|
||||
httab_upload(dev, B43_HTTAB16(0x1a, 0), b43_httab_0x1a);
|
||||
httab_upload(dev, B43_HTTAB16(0x1b, 0), b43_httab_0x1b);
|
||||
httab_upload(dev, B43_HTTAB16(0x1c, 0), b43_httab_0x1c);
|
||||
httab_upload(dev, B43_HTTAB32(0x1a, 0x0c0), b43_httab_0x1a_0xc0);
|
||||
httab_upload(dev, B43_HTTAB32(0x1a, 0x140), b43_httab_0x1a_0x140);
|
||||
httab_upload(dev, B43_HTTAB32(0x1b, 0x140), b43_httab_0x1b_0x140);
|
||||
httab_upload(dev, B43_HTTAB32(0x1c, 0x140), b43_httab_0x1c_0x140);
|
||||
httab_upload(dev, B43_HTTAB16(0x1a, 0x1c0), b43_httab_0x1a_0x1c0);
|
||||
httab_upload(dev, B43_HTTAB16(0x1b, 0x1c0), b43_httab_0x1b_0x1c0);
|
||||
httab_upload(dev, B43_HTTAB16(0x1c, 0x1c0), b43_httab_0x1c_0x1c0);
|
||||
httab_upload(dev, B43_HTTAB16(0x1a, 0x240), b43_httab_0x1a_0x240);
|
||||
httab_upload(dev, B43_HTTAB16(0x1b, 0x240), b43_httab_0x1b_0x240);
|
||||
httab_upload(dev, B43_HTTAB16(0x1c, 0x240), b43_httab_0x1c_0x240);
|
||||
httab_upload(dev, B43_HTTAB32(0x1f, 0), b43_httab_0x1f);
|
||||
httab_upload(dev, B43_HTTAB32(0x21, 0), b43_httab_0x21);
|
||||
httab_upload(dev, B43_HTTAB32(0x23, 0), b43_httab_0x23);
|
||||
httab_upload(dev, B43_HTTAB32(0x20, 0), b43_httab_0x20);
|
||||
httab_upload(dev, B43_HTTAB32(0x22, 0), b43_httab_0x22);
|
||||
httab_upload(dev, B43_HTTAB32(0x24, 0), b43_httab_0x24);
|
||||
}
|
22
drivers/net/wireless/b43/tables_phy_ht.h
Normal file
22
drivers/net/wireless/b43/tables_phy_ht.h
Normal file
|
@ -0,0 +1,22 @@
|
|||
#ifndef B43_TABLES_PHY_HT_H_
|
||||
#define B43_TABLES_PHY_HT_H_
|
||||
|
||||
/* The HT-PHY tables. */
|
||||
#define B43_HTTAB_TYPEMASK 0xF0000000
|
||||
#define B43_HTTAB_8BIT 0x10000000
|
||||
#define B43_HTTAB_16BIT 0x20000000
|
||||
#define B43_HTTAB_32BIT 0x30000000
|
||||
#define B43_HTTAB8(table, offset) (((table) << 10) | (offset) | B43_HTTAB_8BIT)
|
||||
#define B43_HTTAB16(table, offset) (((table) << 10) | (offset) | B43_HTTAB_16BIT)
|
||||
#define B43_HTTAB32(table, offset) (((table) << 10) | (offset) | B43_HTTAB_32BIT)
|
||||
|
||||
u32 b43_httab_read(struct b43_wldev *dev, u32 offset);
|
||||
void b43_httab_read_bulk(struct b43_wldev *dev, u32 offset,
|
||||
unsigned int nr_elements, void *_data);
|
||||
void b43_httab_write(struct b43_wldev *dev, u32 offset, u32 value);
|
||||
void b43_httab_write_bulk(struct b43_wldev *dev, u32 offset,
|
||||
unsigned int nr_elements, const void *_data);
|
||||
|
||||
void b43_phy_ht_tables_init(struct b43_wldev *dev);
|
||||
|
||||
#endif /* B43_TABLES_PHY_HT_H_ */
|
|
@ -484,7 +484,7 @@ static inline u16 iwl_legacy_pcie_link_ctl(struct iwl_priv *priv)
|
|||
{
|
||||
int pos;
|
||||
u16 pci_lnk_ctl;
|
||||
pos = pci_find_capability(priv->pci_dev, PCI_CAP_ID_EXP);
|
||||
pos = pci_pcie_cap(priv->pci_dev);
|
||||
pci_read_config_word(priv->pci_dev, pos + PCI_EXP_LNKCTL, &pci_lnk_ctl);
|
||||
return pci_lnk_ctl;
|
||||
}
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include <net/mac80211.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <asm/unaligned.h>
|
||||
#include <linux/stringify.h>
|
||||
|
||||
#include "iwl-eeprom.h"
|
||||
#include "iwl-dev.h"
|
||||
|
@ -53,10 +54,10 @@
|
|||
#define IWL100_UCODE_API_MIN 5
|
||||
|
||||
#define IWL1000_FW_PRE "iwlwifi-1000-"
|
||||
#define IWL1000_MODULE_FIRMWARE(api) IWL1000_FW_PRE #api ".ucode"
|
||||
#define IWL1000_MODULE_FIRMWARE(api) IWL1000_FW_PRE __stringify(api) ".ucode"
|
||||
|
||||
#define IWL100_FW_PRE "iwlwifi-100-"
|
||||
#define IWL100_MODULE_FIRMWARE(api) IWL100_FW_PRE #api ".ucode"
|
||||
#define IWL100_MODULE_FIRMWARE(api) IWL100_FW_PRE __stringify(api) ".ucode"
|
||||
|
||||
|
||||
/*
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include <net/mac80211.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <asm/unaligned.h>
|
||||
#include <linux/stringify.h>
|
||||
|
||||
#include "iwl-eeprom.h"
|
||||
#include "iwl-dev.h"
|
||||
|
@ -56,13 +57,13 @@
|
|||
#define IWL105_UCODE_API_MIN 5
|
||||
|
||||
#define IWL2030_FW_PRE "iwlwifi-2030-"
|
||||
#define IWL2030_MODULE_FIRMWARE(api) IWL2030_FW_PRE #api ".ucode"
|
||||
#define IWL2030_MODULE_FIRMWARE(api) IWL2030_FW_PRE __stringify(api) ".ucode"
|
||||
|
||||
#define IWL2000_FW_PRE "iwlwifi-2000-"
|
||||
#define IWL2000_MODULE_FIRMWARE(api) IWL2000_FW_PRE #api ".ucode"
|
||||
#define IWL2000_MODULE_FIRMWARE(api) IWL2000_FW_PRE __stringify(api) ".ucode"
|
||||
|
||||
#define IWL105_FW_PRE "iwlwifi-105-"
|
||||
#define IWL105_MODULE_FIRMWARE(api) IWL105_FW_PRE #api ".ucode"
|
||||
#define IWL105_MODULE_FIRMWARE(api) IWL105_FW_PRE __stringify(api) ".ucode"
|
||||
|
||||
static void iwl2000_set_ct_threshold(struct iwl_priv *priv)
|
||||
{
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include <net/mac80211.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <asm/unaligned.h>
|
||||
#include <linux/stringify.h>
|
||||
|
||||
#include "iwl-eeprom.h"
|
||||
#include "iwl-dev.h"
|
||||
|
@ -55,10 +56,10 @@
|
|||
#define IWL5150_UCODE_API_MIN 1
|
||||
|
||||
#define IWL5000_FW_PRE "iwlwifi-5000-"
|
||||
#define IWL5000_MODULE_FIRMWARE(api) IWL5000_FW_PRE #api ".ucode"
|
||||
#define IWL5000_MODULE_FIRMWARE(api) IWL5000_FW_PRE __stringify(api) ".ucode"
|
||||
|
||||
#define IWL5150_FW_PRE "iwlwifi-5150-"
|
||||
#define IWL5150_MODULE_FIRMWARE(api) IWL5150_FW_PRE #api ".ucode"
|
||||
#define IWL5150_MODULE_FIRMWARE(api) IWL5150_FW_PRE __stringify(api) ".ucode"
|
||||
|
||||
/* NIC configuration for 5000 series */
|
||||
static void iwl5000_nic_config(struct iwl_priv *priv)
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include <net/mac80211.h>
|
||||
#include <linux/etherdevice.h>
|
||||
#include <asm/unaligned.h>
|
||||
#include <linux/stringify.h>
|
||||
|
||||
#include "iwl-eeprom.h"
|
||||
#include "iwl-dev.h"
|
||||
|
@ -56,16 +57,16 @@
|
|||
#define IWL6000G2_UCODE_API_MIN 4
|
||||
|
||||
#define IWL6000_FW_PRE "iwlwifi-6000-"
|
||||
#define IWL6000_MODULE_FIRMWARE(api) IWL6000_FW_PRE #api ".ucode"
|
||||
#define IWL6000_MODULE_FIRMWARE(api) IWL6000_FW_PRE __stringify(api) ".ucode"
|
||||
|
||||
#define IWL6050_FW_PRE "iwlwifi-6050-"
|
||||
#define IWL6050_MODULE_FIRMWARE(api) IWL6050_FW_PRE #api ".ucode"
|
||||
#define IWL6050_MODULE_FIRMWARE(api) IWL6050_FW_PRE __stringify(api) ".ucode"
|
||||
|
||||
#define IWL6005_FW_PRE "iwlwifi-6000g2a-"
|
||||
#define IWL6005_MODULE_FIRMWARE(api) IWL6005_FW_PRE #api ".ucode"
|
||||
#define IWL6005_MODULE_FIRMWARE(api) IWL6005_FW_PRE __stringify(api) ".ucode"
|
||||
|
||||
#define IWL6030_FW_PRE "iwlwifi-6000g2b-"
|
||||
#define IWL6030_MODULE_FIRMWARE(api) IWL6030_FW_PRE #api ".ucode"
|
||||
#define IWL6030_MODULE_FIRMWARE(api) IWL6030_FW_PRE __stringify(api) ".ucode"
|
||||
|
||||
static void iwl6000_set_ct_threshold(struct iwl_priv *priv)
|
||||
{
|
||||
|
|
|
@ -210,6 +210,8 @@ static int iwlagn_rxon_disconn(struct iwl_priv *priv,
|
|||
* keys, so we have to restore those afterwards.
|
||||
*/
|
||||
iwl_clear_ucode_stations(priv, ctx);
|
||||
/* update -- might need P2P now */
|
||||
iwl_update_bcast_station(priv, ctx);
|
||||
iwl_restore_stations(priv, ctx);
|
||||
ret = iwl_restore_default_wep_keys(priv, ctx);
|
||||
if (ret) {
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
#include "iwl-agn.h"
|
||||
|
||||
static struct iwl_link_quality_cmd *
|
||||
iwl_sta_alloc_lq(struct iwl_priv *priv, u8 sta_id)
|
||||
iwl_sta_alloc_lq(struct iwl_priv *priv, struct iwl_rxon_context *ctx, u8 sta_id)
|
||||
{
|
||||
int i, r;
|
||||
struct iwl_link_quality_cmd *link_cmd;
|
||||
|
@ -47,10 +47,15 @@ iwl_sta_alloc_lq(struct iwl_priv *priv, u8 sta_id)
|
|||
IWL_ERR(priv, "Unable to allocate memory for LQ cmd.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
lockdep_assert_held(&priv->mutex);
|
||||
|
||||
/* Set up the rate scaling to start at selected rate, fall back
|
||||
* all the way down to 1M in IEEE order, and then spin on 1M */
|
||||
if (priv->band == IEEE80211_BAND_5GHZ)
|
||||
r = IWL_RATE_6M_INDEX;
|
||||
else if (ctx && ctx->vif && ctx->vif->p2p)
|
||||
r = IWL_RATE_6M_INDEX;
|
||||
else
|
||||
r = IWL_RATE_1M_INDEX;
|
||||
|
||||
|
@ -115,7 +120,7 @@ int iwlagn_add_bssid_station(struct iwl_priv *priv, struct iwl_rxon_context *ctx
|
|||
spin_unlock_irqrestore(&priv->sta_lock, flags);
|
||||
|
||||
/* Set up default rate scaling table in device's station table */
|
||||
link_cmd = iwl_sta_alloc_lq(priv, sta_id);
|
||||
link_cmd = iwl_sta_alloc_lq(priv, ctx, sta_id);
|
||||
if (!link_cmd) {
|
||||
IWL_ERR(priv, "Unable to initialize rate scaling for station %pM.\n",
|
||||
addr);
|
||||
|
@ -554,7 +559,7 @@ int iwlagn_alloc_bcast_station(struct iwl_priv *priv,
|
|||
priv->stations[sta_id].used |= IWL_STA_BCAST;
|
||||
spin_unlock_irqrestore(&priv->sta_lock, flags);
|
||||
|
||||
link_cmd = iwl_sta_alloc_lq(priv, sta_id);
|
||||
link_cmd = iwl_sta_alloc_lq(priv, ctx, sta_id);
|
||||
if (!link_cmd) {
|
||||
IWL_ERR(priv,
|
||||
"Unable to initialize rate scaling for bcast station.\n");
|
||||
|
@ -574,14 +579,14 @@ int iwlagn_alloc_bcast_station(struct iwl_priv *priv,
|
|||
* Only used by iwlagn. Placed here to have all bcast station management
|
||||
* code together.
|
||||
*/
|
||||
static int iwl_update_bcast_station(struct iwl_priv *priv,
|
||||
struct iwl_rxon_context *ctx)
|
||||
int iwl_update_bcast_station(struct iwl_priv *priv,
|
||||
struct iwl_rxon_context *ctx)
|
||||
{
|
||||
unsigned long flags;
|
||||
struct iwl_link_quality_cmd *link_cmd;
|
||||
u8 sta_id = ctx->bcast_sta_id;
|
||||
|
||||
link_cmd = iwl_sta_alloc_lq(priv, sta_id);
|
||||
link_cmd = iwl_sta_alloc_lq(priv, ctx, sta_id);
|
||||
if (!link_cmd) {
|
||||
IWL_ERR(priv, "Unable to initialize rate scaling for bcast station.\n");
|
||||
return -ENOMEM;
|
||||
|
|
|
@ -132,6 +132,7 @@ int iwlagn_send_beacon_cmd(struct iwl_priv *priv)
|
|||
struct iwl_host_cmd cmd = {
|
||||
.id = REPLY_TX_BEACON,
|
||||
};
|
||||
struct ieee80211_tx_info *info;
|
||||
u32 frame_size;
|
||||
u32 rate_flags;
|
||||
u32 rate;
|
||||
|
@ -172,14 +173,31 @@ int iwlagn_send_beacon_cmd(struct iwl_priv *priv)
|
|||
frame_size);
|
||||
|
||||
/* Set up packet rate and flags */
|
||||
rate = iwl_rate_get_lowest_plcp(priv, priv->beacon_ctx);
|
||||
info = IEEE80211_SKB_CB(priv->beacon_skb);
|
||||
|
||||
/*
|
||||
* Let's set up the rate at least somewhat correctly;
|
||||
* it will currently not actually be used by the uCode,
|
||||
* it uses the broadcast station's rate instead.
|
||||
*/
|
||||
if (info->control.rates[0].idx < 0 ||
|
||||
info->control.rates[0].flags & IEEE80211_TX_RC_MCS)
|
||||
rate = 0;
|
||||
else
|
||||
rate = info->control.rates[0].idx;
|
||||
|
||||
priv->mgmt_tx_ant = iwl_toggle_tx_ant(priv, priv->mgmt_tx_ant,
|
||||
priv->hw_params.valid_tx_ant);
|
||||
rate_flags = iwl_ant_idx_to_flags(priv->mgmt_tx_ant);
|
||||
if ((rate >= IWL_FIRST_CCK_RATE) && (rate <= IWL_LAST_CCK_RATE))
|
||||
|
||||
/* In mac80211, rates for 5 GHz start at 0 */
|
||||
if (info->band == IEEE80211_BAND_5GHZ)
|
||||
rate += IWL_FIRST_OFDM_RATE;
|
||||
else if (rate >= IWL_FIRST_CCK_RATE && rate <= IWL_LAST_CCK_RATE)
|
||||
rate_flags |= RATE_MCS_CCK_MSK;
|
||||
tx_beacon_cmd->tx.rate_n_flags = iwl_hw_set_rate_n_flags(rate,
|
||||
rate_flags);
|
||||
|
||||
tx_beacon_cmd->tx.rate_n_flags =
|
||||
iwl_hw_set_rate_n_flags(rate, rate_flags);
|
||||
|
||||
/* Submit command */
|
||||
cmd.len[0] = sizeof(*tx_beacon_cmd);
|
||||
|
|
|
@ -304,6 +304,8 @@ int iwl_sta_rx_agg_start(struct iwl_priv *priv, struct ieee80211_sta *sta,
|
|||
int iwl_sta_rx_agg_stop(struct iwl_priv *priv, struct ieee80211_sta *sta,
|
||||
int tid);
|
||||
void iwl_sta_modify_sleep_tx_count(struct iwl_priv *priv, int sta_id, int cnt);
|
||||
int iwl_update_bcast_station(struct iwl_priv *priv,
|
||||
struct iwl_rxon_context *ctx);
|
||||
int iwl_update_bcast_stations(struct iwl_priv *priv);
|
||||
void iwlagn_mac_sta_notify(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
|
|
|
@ -526,19 +526,6 @@ int iwl_full_rxon_required(struct iwl_priv *priv,
|
|||
return 0;
|
||||
}
|
||||
|
||||
u8 iwl_rate_get_lowest_plcp(struct iwl_priv *priv,
|
||||
struct iwl_rxon_context *ctx)
|
||||
{
|
||||
/*
|
||||
* Assign the lowest rate -- should really get this from
|
||||
* the beacon skb from mac80211.
|
||||
*/
|
||||
if (ctx->staging.flags & RXON_FLG_BAND_24G_MSK)
|
||||
return IWL_RATE_1M_PLCP;
|
||||
else
|
||||
return IWL_RATE_6M_PLCP;
|
||||
}
|
||||
|
||||
static void _iwl_set_rxon_ht(struct iwl_priv *priv,
|
||||
struct iwl_ht_config *ht_conf,
|
||||
struct iwl_rxon_context *ctx)
|
||||
|
@ -1717,6 +1704,7 @@ int iwl_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|||
struct iwl_rxon_context *ctx = iwl_rxon_ctx_from_vif(vif);
|
||||
struct iwl_rxon_context *bss_ctx = &priv->contexts[IWL_RXON_CTX_BSS];
|
||||
struct iwl_rxon_context *tmp;
|
||||
enum nl80211_iftype newviftype = newtype;
|
||||
u32 interface_modes;
|
||||
int err;
|
||||
|
||||
|
@ -1772,7 +1760,7 @@ int iwl_mac_change_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|||
|
||||
/* success */
|
||||
iwl_teardown_interface(priv, vif, true);
|
||||
vif->type = newtype;
|
||||
vif->type = newviftype;
|
||||
vif->p2p = newp2p;
|
||||
err = iwl_setup_interface(priv, ctx);
|
||||
WARN_ON(err);
|
||||
|
|
|
@ -408,13 +408,6 @@ void iwl_setup_watchdog(struct iwl_priv *priv);
|
|||
****************************************************/
|
||||
int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force);
|
||||
|
||||
/*******************************************************************************
|
||||
* Rate
|
||||
******************************************************************************/
|
||||
|
||||
u8 iwl_rate_get_lowest_plcp(struct iwl_priv *priv,
|
||||
struct iwl_rxon_context *ctx);
|
||||
|
||||
/*******************************************************************************
|
||||
* Scanning
|
||||
******************************************************************************/
|
||||
|
|
|
@ -113,7 +113,7 @@ const char *get_cmd_string(u8 cmd)
|
|||
}
|
||||
}
|
||||
|
||||
#define HOST_COMPLETE_TIMEOUT (HZ / 2)
|
||||
#define HOST_COMPLETE_TIMEOUT (2 * HZ)
|
||||
|
||||
static void iwl_generic_cmd_callback(struct iwl_priv *priv,
|
||||
struct iwl_device_cmd *cmd,
|
||||
|
|
|
@ -383,7 +383,6 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
{
|
||||
struct iwl_cfg *cfg = (struct iwl_cfg *)(ent->driver_data);
|
||||
struct iwl_pci_bus *bus;
|
||||
u8 rev_id;
|
||||
u16 pci_cmd;
|
||||
int err;
|
||||
|
||||
|
@ -440,8 +439,7 @@ static int iwl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||
(unsigned long long) pci_resource_len(pdev, 0));
|
||||
pr_info("pci_resource_base = %p\n", bus->hw_base);
|
||||
|
||||
pci_read_config_byte(pdev, PCI_REVISION_ID, &rev_id);
|
||||
pr_info("HW Revision ID = 0x%X\n", rev_id);
|
||||
pr_info("HW Revision ID = 0x%X\n", pdev->revision);
|
||||
|
||||
/* We disable the RETRY_TIMEOUT register (0x41) to keep
|
||||
* PCI Tx retries from interfering with C3 CPU state */
|
||||
|
@ -496,14 +494,11 @@ static void iwl_pci_down(void *bus)
|
|||
static void __devexit iwl_pci_remove(struct pci_dev *pdev)
|
||||
{
|
||||
struct iwl_priv *priv = pci_get_drvdata(pdev);
|
||||
|
||||
/* This can happen if probe failed */
|
||||
if (unlikely(!priv))
|
||||
return;
|
||||
void *bus_specific = priv->bus.bus_specific;
|
||||
|
||||
iwl_remove(priv);
|
||||
|
||||
iwl_pci_down(IWL_BUS_GET_PCI_BUS(&priv->bus));
|
||||
iwl_pci_down(bus_specific);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
@ -530,14 +525,7 @@ static int iwl_pci_resume(struct device *device)
|
|||
return iwl_resume(priv);
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops iwl_dev_pm_ops = {
|
||||
.suspend = iwl_pci_suspend,
|
||||
.resume = iwl_pci_resume,
|
||||
.freeze = iwl_pci_suspend,
|
||||
.thaw = iwl_pci_resume,
|
||||
.poweroff = iwl_pci_suspend,
|
||||
.restore = iwl_pci_resume,
|
||||
};
|
||||
static SIMPLE_DEV_PM_OPS(iwl_dev_pm_ops, iwl_pci_suspend, iwl_pci_resume);
|
||||
|
||||
#define IWL_PM_OPS (&iwl_dev_pm_ops)
|
||||
|
||||
|
|
|
@ -126,7 +126,7 @@ static inline u8 iwl_tfd_get_num_tbs(struct iwl_tfd *tfd)
|
|||
}
|
||||
|
||||
static void iwlagn_unmap_tfd(struct iwl_priv *priv, struct iwl_cmd_meta *meta,
|
||||
struct iwl_tfd *tfd)
|
||||
struct iwl_tfd *tfd, enum dma_data_direction dma_dir)
|
||||
{
|
||||
int i;
|
||||
int num_tbs;
|
||||
|
@ -150,7 +150,7 @@ static void iwlagn_unmap_tfd(struct iwl_priv *priv, struct iwl_cmd_meta *meta,
|
|||
/* Unmap chunks, if any. */
|
||||
for (i = 1; i < num_tbs; i++)
|
||||
dma_unmap_single(priv->bus.dev, iwl_tfd_tb_get_addr(tfd, i),
|
||||
iwl_tfd_tb_get_len(tfd, i), DMA_TO_DEVICE);
|
||||
iwl_tfd_tb_get_len(tfd, i), dma_dir);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -166,7 +166,8 @@ void iwlagn_txq_free_tfd(struct iwl_priv *priv, struct iwl_tx_queue *txq)
|
|||
struct iwl_tfd *tfd_tmp = txq->tfds;
|
||||
int index = txq->q.read_ptr;
|
||||
|
||||
iwlagn_unmap_tfd(priv, &txq->meta[index], &tfd_tmp[index]);
|
||||
iwlagn_unmap_tfd(priv, &txq->meta[index], &tfd_tmp[index],
|
||||
DMA_TO_DEVICE);
|
||||
|
||||
/* free SKB */
|
||||
if (txq->txb) {
|
||||
|
@ -309,9 +310,7 @@ void iwl_cmd_queue_unmap(struct iwl_priv *priv)
|
|||
i = get_cmd_index(q, q->read_ptr);
|
||||
|
||||
if (txq->meta[i].flags & CMD_MAPPED) {
|
||||
dma_unmap_single(priv->bus.dev,
|
||||
dma_unmap_addr(&txq->meta[i], mapping),
|
||||
dma_unmap_len(&txq->meta[i], len),
|
||||
iwlagn_unmap_tfd(priv, &txq->meta[i], &txq->tfds[i],
|
||||
DMA_BIDIRECTIONAL);
|
||||
txq->meta[i].flags = 0;
|
||||
}
|
||||
|
@ -534,12 +533,7 @@ int iwl_tx_queue_init(struct iwl_priv *priv, struct iwl_tx_queue *txq,
|
|||
void iwl_tx_queue_reset(struct iwl_priv *priv, struct iwl_tx_queue *txq,
|
||||
int slots_num, u32 txq_id)
|
||||
{
|
||||
int actual_slots = slots_num;
|
||||
|
||||
if (txq_id == priv->cmd_queue)
|
||||
actual_slots++;
|
||||
|
||||
memset(txq->meta, 0, sizeof(struct iwl_cmd_meta) * actual_slots);
|
||||
memset(txq->meta, 0, sizeof(struct iwl_cmd_meta) * slots_num);
|
||||
|
||||
txq->need_update = 0;
|
||||
|
||||
|
@ -699,10 +693,11 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
|
|||
if (!(cmd->dataflags[i] & IWL_HCMD_DFL_NOCOPY))
|
||||
continue;
|
||||
phys_addr = dma_map_single(priv->bus.dev, (void *)cmd->data[i],
|
||||
cmd->len[i], DMA_TO_DEVICE);
|
||||
cmd->len[i], DMA_BIDIRECTIONAL);
|
||||
if (dma_mapping_error(priv->bus.dev, phys_addr)) {
|
||||
iwlagn_unmap_tfd(priv, out_meta,
|
||||
&txq->tfds[q->write_ptr]);
|
||||
&txq->tfds[q->write_ptr],
|
||||
DMA_BIDIRECTIONAL);
|
||||
idx = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
@ -806,7 +801,7 @@ void iwl_tx_cmd_complete(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb)
|
|||
cmd = txq->cmd[cmd_index];
|
||||
meta = &txq->meta[cmd_index];
|
||||
|
||||
iwlagn_unmap_tfd(priv, meta, &txq->tfds[index]);
|
||||
iwlagn_unmap_tfd(priv, meta, &txq->tfds[index], DMA_BIDIRECTIONAL);
|
||||
|
||||
/* Input error checking is done when commands are added to queue. */
|
||||
if (meta->flags & CMD_WANT_SKB) {
|
||||
|
|
|
@ -586,7 +586,7 @@ int lbtf_rx(struct lbtf_private *priv, struct sk_buff *skb)
|
|||
need_padding ^= ieee80211_has_a4(hdr->frame_control);
|
||||
need_padding ^= ieee80211_is_data_qos(hdr->frame_control) &&
|
||||
(*ieee80211_get_qos_ctl(hdr) &
|
||||
IEEE80211_QOS_CONTROL_A_MSDU_PRESENT);
|
||||
IEEE80211_QOS_CTL_A_MSDU_PRESENT);
|
||||
|
||||
if (need_padding) {
|
||||
memmove(skb->data + 2, skb->data, skb->len);
|
||||
|
|
|
@ -1130,6 +1130,8 @@ static int mac80211_hwsim_hw_scan(struct ieee80211_hw *hw,
|
|||
for (i = 0; i < req->n_channels; i++)
|
||||
printk(KERN_DEBUG "hwsim hw_scan freq %d\n",
|
||||
req->channels[i]->center_freq);
|
||||
print_hex_dump(KERN_DEBUG, "scan IEs: ", DUMP_PREFIX_OFFSET,
|
||||
16, 1, req->ie, req->ie_len, 1);
|
||||
|
||||
ieee80211_queue_delayed_work(hw, &hsd->w, 2 * HZ);
|
||||
|
||||
|
|
|
@ -779,6 +779,8 @@ static int mwifiex_cmd_ibss_coalescing_status(struct host_cmd_ds_command *cmd,
|
|||
case HostCmd_ACT_GEN_SET:
|
||||
if (enable)
|
||||
ibss_coal->enable = cpu_to_le16(*enable);
|
||||
else
|
||||
ibss_coal->enable = 0;
|
||||
break;
|
||||
|
||||
/* In other case.. Nothing to do */
|
||||
|
|
|
@ -183,30 +183,32 @@ static int mwifiex_ret_802_11_rssi_info(struct mwifiex_private *priv,
|
|||
*/
|
||||
static int mwifiex_ret_802_11_snmp_mib(struct mwifiex_private *priv,
|
||||
struct host_cmd_ds_command *resp,
|
||||
u32 *ul_temp)
|
||||
u32 *data_buf)
|
||||
{
|
||||
struct host_cmd_ds_802_11_snmp_mib *smib = &resp->params.smib;
|
||||
u16 oid = le16_to_cpu(smib->oid);
|
||||
u16 query_type = le16_to_cpu(smib->query_type);
|
||||
u32 ul_temp;
|
||||
|
||||
dev_dbg(priv->adapter->dev, "info: SNMP_RESP: oid value = %#x,"
|
||||
" query_type = %#x, buf size = %#x\n",
|
||||
oid, query_type, le16_to_cpu(smib->buf_size));
|
||||
if (query_type == HostCmd_ACT_GEN_GET) {
|
||||
if (ul_temp)
|
||||
*ul_temp = le16_to_cpu(*((__le16 *) (smib->value)));
|
||||
ul_temp = le16_to_cpu(*((__le16 *) (smib->value)));
|
||||
if (data_buf)
|
||||
*data_buf = ul_temp;
|
||||
switch (oid) {
|
||||
case FRAG_THRESH_I:
|
||||
dev_dbg(priv->adapter->dev,
|
||||
"info: SNMP_RESP: FragThsd =%u\n", *ul_temp);
|
||||
"info: SNMP_RESP: FragThsd =%u\n", ul_temp);
|
||||
break;
|
||||
case RTS_THRESH_I:
|
||||
dev_dbg(priv->adapter->dev,
|
||||
"info: SNMP_RESP: RTSThsd =%u\n", *ul_temp);
|
||||
"info: SNMP_RESP: RTSThsd =%u\n", ul_temp);
|
||||
break;
|
||||
case SHORT_RETRY_LIM_I:
|
||||
dev_dbg(priv->adapter->dev,
|
||||
"info: SNMP_RESP: TxRetryCount=%u\n", *ul_temp);
|
||||
"info: SNMP_RESP: TxRetryCount=%u\n", ul_temp);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@ -622,22 +624,23 @@ static int mwifiex_ret_802_11d_domain_info(struct mwifiex_private *priv,
|
|||
*/
|
||||
static int mwifiex_ret_802_11_rf_channel(struct mwifiex_private *priv,
|
||||
struct host_cmd_ds_command *resp,
|
||||
u16 *new_channel)
|
||||
u16 *data_buf)
|
||||
{
|
||||
struct host_cmd_ds_802_11_rf_channel *rf_channel =
|
||||
&resp->params.rf_channel;
|
||||
u16 new_channel = le16_to_cpu(rf_channel->current_channel);
|
||||
|
||||
if (new_channel)
|
||||
*new_channel = le16_to_cpu(rf_channel->current_channel);
|
||||
|
||||
if (priv->curr_bss_params.bss_descriptor.channel != *new_channel) {
|
||||
if (priv->curr_bss_params.bss_descriptor.channel != new_channel) {
|
||||
dev_dbg(priv->adapter->dev, "cmd: Channel Switch: %d to %d\n",
|
||||
priv->curr_bss_params.bss_descriptor.channel,
|
||||
*new_channel);
|
||||
new_channel);
|
||||
/* Update the channel again */
|
||||
priv->curr_bss_params.bss_descriptor.channel = *new_channel;
|
||||
priv->curr_bss_params.bss_descriptor.channel = new_channel;
|
||||
}
|
||||
|
||||
if (data_buf)
|
||||
*data_buf = new_channel;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@
|
|||
* @QID_RX: RX queue
|
||||
* @QID_OTHER: None of the above (don't use, only present for completeness)
|
||||
* @QID_BEACON: Beacon queue (value unspecified, don't send it to device)
|
||||
* @QID_ATIM: Atim queue (value unspeficied, don't send it to device)
|
||||
* @QID_ATIM: Atim queue (value unspecified, don't send it to device)
|
||||
*/
|
||||
enum data_queue_qid {
|
||||
QID_AC_VO = 0,
|
||||
|
|
|
@ -21,6 +21,17 @@ config RTL8192SE
|
|||
|
||||
If you choose to build it as a module, it will be called rtl8192se
|
||||
|
||||
config RTL8192DE
|
||||
tristate "Realtek RTL8192DE/RTL8188DE PCIe Wireless Network Adapter"
|
||||
depends on MAC80211 && EXPERIMENTAL
|
||||
select FW_LOADER
|
||||
select RTLWIFI
|
||||
---help---
|
||||
This is the driver for Realtek RTL8192DE/RTL8188DE 802.11n PCIe
|
||||
wireless network adapters.
|
||||
|
||||
If you choose to build it as a module, it will be called rtl8192de
|
||||
|
||||
config RTL8192CU
|
||||
tristate "Realtek RTL8192CU/RTL8188CU USB Wireless Network Adapter"
|
||||
depends on MAC80211 && USB && EXPERIMENTAL
|
||||
|
@ -35,10 +46,10 @@ config RTL8192CU
|
|||
|
||||
config RTLWIFI
|
||||
tristate
|
||||
depends on RTL8192CE || RTL8192CU || RTL8192SE
|
||||
depends on RTL8192CE || RTL8192CU || RTL8192SE || RTL8192DE
|
||||
default m
|
||||
|
||||
config RTL8192C_COMMON
|
||||
tristate
|
||||
depends on RTL8192CE || RTL8192CU || RTL8192SE
|
||||
depends on RTL8192CE || RTL8192CU
|
||||
default m
|
||||
|
|
|
@ -23,5 +23,6 @@ obj-$(CONFIG_RTL8192C_COMMON) += rtl8192c/
|
|||
obj-$(CONFIG_RTL8192CE) += rtl8192ce/
|
||||
obj-$(CONFIG_RTL8192CU) += rtl8192cu/
|
||||
obj-$(CONFIG_RTL8192SE) += rtl8192se/
|
||||
obj-$(CONFIG_RTL8192DE) += rtl8192de/
|
||||
|
||||
ccflags-y += -D__CHECK_ENDIAN__
|
||||
|
|
|
@ -35,10 +35,10 @@
|
|||
#include "efuse.h"
|
||||
|
||||
static const u16 pcibridge_vendors[PCI_BRIDGE_VENDOR_MAX] = {
|
||||
INTEL_VENDOR_ID,
|
||||
ATI_VENDOR_ID,
|
||||
AMD_VENDOR_ID,
|
||||
SIS_VENDOR_ID
|
||||
PCI_VENDOR_ID_INTEL,
|
||||
PCI_VENDOR_ID_ATI,
|
||||
PCI_VENDOR_ID_AMD,
|
||||
PCI_VENDOR_ID_SI
|
||||
};
|
||||
|
||||
static const u8 ac_to_hwq[] = {
|
||||
|
@ -390,7 +390,7 @@ static void rtl_pci_parse_configuration(struct pci_dev *pdev,
|
|||
u8 linkctrl_reg;
|
||||
|
||||
/*Link Control Register */
|
||||
pos = pci_find_capability(pdev, PCI_CAP_ID_EXP);
|
||||
pos = pci_pcie_cap(pdev);
|
||||
pci_read_config_byte(pdev, pos + PCI_EXP_LNKCTL, &linkctrl_reg);
|
||||
pcipriv->ndis_adapter.linkctrl_reg = linkctrl_reg;
|
||||
|
||||
|
@ -1615,6 +1615,16 @@ static bool _rtl_pci_find_adapter(struct pci_dev *pdev,
|
|||
pci_read_config_byte(pdev, 0x8, &revisionid);
|
||||
pci_read_config_word(pdev, 0x3C, &irqline);
|
||||
|
||||
/* PCI ID 0x10ec:0x8192 occurs for both RTL8192E, which uses
|
||||
* r8192e_pci, and RTL8192SE, which uses this driver. If the
|
||||
* revision ID is RTL_PCI_REVISION_ID_8192PCIE (0x01), then
|
||||
* the correct driver is r8192e_pci, thus this routine should
|
||||
* return false.
|
||||
*/
|
||||
if (deviceid == RTL_PCI_8192SE_DID &&
|
||||
revisionid == RTL_PCI_REVISION_ID_8192PCIE)
|
||||
return false;
|
||||
|
||||
if (deviceid == RTL_PCI_8192_DID ||
|
||||
deviceid == RTL_PCI_0044_DID ||
|
||||
deviceid == RTL_PCI_0047_DID ||
|
||||
|
@ -1847,7 +1857,8 @@ int __devinit rtl_pci_probe(struct pci_dev *pdev,
|
|||
pci_write_config_byte(pdev, 0x04, 0x07);
|
||||
|
||||
/* find adapter */
|
||||
_rtl_pci_find_adapter(pdev, hw);
|
||||
if (!_rtl_pci_find_adapter(pdev, hw))
|
||||
goto fail3;
|
||||
|
||||
/* Init IO handler */
|
||||
_rtl_pci_io_handler_init(&pdev->dev, hw);
|
||||
|
|
|
@ -62,12 +62,6 @@
|
|||
.subdevice = PCI_ANY_ID,\
|
||||
.driver_data = (kernel_ulong_t)&(cfg)
|
||||
|
||||
#define INTEL_VENDOR_ID 0x8086
|
||||
#define SIS_VENDOR_ID 0x1039
|
||||
#define ATI_VENDOR_ID 0x1002
|
||||
#define ATI_DEVICE_ID 0x7914
|
||||
#define AMD_VENDOR_ID 0x1022
|
||||
|
||||
#define PCI_MAX_BRIDGE_NUMBER 255
|
||||
#define PCI_MAX_DEVICES 32
|
||||
#define PCI_MAX_FUNCTION 8
|
||||
|
@ -75,11 +69,6 @@
|
|||
#define PCI_CONF_ADDRESS 0x0CF8 /*PCI Configuration Space Address */
|
||||
#define PCI_CONF_DATA 0x0CFC /*PCI Configuration Space Data */
|
||||
|
||||
#define PCI_CLASS_BRIDGE_DEV 0x06
|
||||
#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
|
||||
#define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10
|
||||
#define PCI_CAP_ID_EXP 0x10
|
||||
|
||||
#define U1DONTCARE 0xFF
|
||||
#define U2DONTCARE 0xFFFF
|
||||
#define U4DONTCARE 0xFFFFFFFF
|
||||
|
|
|
@ -1203,7 +1203,9 @@
|
|||
#define EPROM_CMD_CONFIG 0x3
|
||||
#define EPROM_CMD_LOAD 1
|
||||
|
||||
#define HWSET_MAX_SIZE 128
|
||||
#define HWSET_MAX_SIZE_92S HWSET_MAX_SIZE
|
||||
#define EFUSE_MAX_SECTION 16
|
||||
|
||||
#define WL_HWPDN_EN BIT(0)
|
||||
|
||||
|
|
|
@ -53,6 +53,8 @@ MODULE_FIRMWARE("rtlwifi/rtl8192cufw.bin");
|
|||
static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
const struct firmware *firmware;
|
||||
int err;
|
||||
|
||||
rtlpriv->dm.dm_initialgain_enable = 1;
|
||||
rtlpriv->dm.dm_flag = 0;
|
||||
|
@ -64,6 +66,24 @@ static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
|
|||
("Can't alloc buffer for fw.\n"));
|
||||
return 1;
|
||||
}
|
||||
/* request fw */
|
||||
err = request_firmware(&firmware, rtlpriv->cfg->fw_name,
|
||||
rtlpriv->io.dev);
|
||||
if (err) {
|
||||
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||
("Failed to request firmware!\n"));
|
||||
return 1;
|
||||
}
|
||||
if (firmware->size > 0x4000) {
|
||||
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||
("Firmware is too big!\n"));
|
||||
release_firmware(firmware);
|
||||
return 1;
|
||||
}
|
||||
memcpy(rtlpriv->rtlhal.pfirmware, firmware->data, firmware->size);
|
||||
rtlpriv->rtlhal.fwsize = firmware->size;
|
||||
release_firmware(firmware);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
14
drivers/net/wireless/rtlwifi/rtl8192de/Makefile
Normal file
14
drivers/net/wireless/rtlwifi/rtl8192de/Makefile
Normal file
|
@ -0,0 +1,14 @@
|
|||
rtl8192de-objs := \
|
||||
dm.o \
|
||||
fw.o \
|
||||
hw.o \
|
||||
led.o \
|
||||
phy.o \
|
||||
rf.o \
|
||||
sw.o \
|
||||
table.o \
|
||||
trx.o
|
||||
|
||||
obj-$(CONFIG_RTL8192DE) += rtl8192de.o
|
||||
|
||||
ccflags-y += -D__CHECK_ENDIAN__
|
269
drivers/net/wireless/rtlwifi/rtl8192de/def.h
Normal file
269
drivers/net/wireless/rtlwifi/rtl8192de/def.h
Normal file
|
@ -0,0 +1,269 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2009-2010 Realtek Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
|
||||
* Hsinchu 300, Taiwan.
|
||||
*
|
||||
* Larry Finger <Larry.Finger@lwfinger.net>
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __RTL92D_DEF_H__
|
||||
#define __RTL92D_DEF_H__
|
||||
|
||||
/* Min Spacing related settings. */
|
||||
#define MAX_MSS_DENSITY_2T 0x13
|
||||
#define MAX_MSS_DENSITY_1T 0x0A
|
||||
|
||||
#define RF6052_MAX_TX_PWR 0x3F
|
||||
#define RF6052_MAX_REG 0x3F
|
||||
#define RF6052_MAX_PATH 2
|
||||
|
||||
#define HAL_RETRY_LIMIT_INFRA 48
|
||||
#define HAL_RETRY_LIMIT_AP_ADHOC 7
|
||||
|
||||
#define PHY_RSSI_SLID_WIN_MAX 100
|
||||
#define PHY_LINKQUALITY_SLID_WIN_MAX 20
|
||||
#define PHY_BEACON_RSSI_SLID_WIN_MAX 10
|
||||
|
||||
#define RESET_DELAY_8185 20
|
||||
|
||||
#define RT_IBSS_INT_MASKS (IMR_BCNINT | IMR_TBDOK | IMR_TBDER)
|
||||
#define RT_AC_INT_MASKS (IMR_VIDOK | IMR_VODOK | IMR_BEDOK|IMR_BKDOK)
|
||||
|
||||
#define NUM_OF_FIRMWARE_QUEUE 10
|
||||
#define NUM_OF_PAGES_IN_FW 0x100
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_BK 0x07
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_BE 0x07
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_VI 0x07
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_VO 0x07
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_HCCA 0x0
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_CMD 0x0
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_MGNT 0x02
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_HIGH 0x02
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_BCN 0x2
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_PUB 0xA1
|
||||
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_BK_DTM 0x026
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_BE_DTM 0x048
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_VI_DTM 0x048
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_VO_DTM 0x026
|
||||
#define NUM_OF_PAGE_IN_FW_QUEUE_PUB_DTM 0x00
|
||||
|
||||
#define MAX_LINES_HWCONFIG_TXT 1000
|
||||
#define MAX_BYTES_LINE_HWCONFIG_TXT 256
|
||||
|
||||
#define SW_THREE_WIRE 0
|
||||
#define HW_THREE_WIRE 2
|
||||
|
||||
#define BT_DEMO_BOARD 0
|
||||
#define BT_QA_BOARD 1
|
||||
#define BT_FPGA 2
|
||||
|
||||
#define RX_SMOOTH_FACTOR 20
|
||||
|
||||
#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0
|
||||
#define HAL_PRIME_CHNL_OFFSET_LOWER 1
|
||||
#define HAL_PRIME_CHNL_OFFSET_UPPER 2
|
||||
|
||||
#define MAX_H2C_QUEUE_NUM 10
|
||||
|
||||
#define RX_MPDU_QUEUE 0
|
||||
#define RX_CMD_QUEUE 1
|
||||
#define RX_MAX_QUEUE 2
|
||||
|
||||
#define C2H_RX_CMD_HDR_LEN 8
|
||||
#define GET_C2H_CMD_CMD_LEN(__prxhdr) \
|
||||
LE_BITS_TO_4BYTE((__prxhdr), 0, 16)
|
||||
#define GET_C2H_CMD_ELEMENT_ID(__prxhdr) \
|
||||
LE_BITS_TO_4BYTE((__prxhdr), 16, 8)
|
||||
#define GET_C2H_CMD_CMD_SEQ(__prxhdr) \
|
||||
LE_BITS_TO_4BYTE((__prxhdr), 24, 7)
|
||||
#define GET_C2H_CMD_CONTINUE(__prxhdr) \
|
||||
LE_BITS_TO_4BYTE((__prxhdr), 31, 1)
|
||||
#define GET_C2H_CMD_CONTENT(__prxhdr) \
|
||||
((u8 *)(__prxhdr) + C2H_RX_CMD_HDR_LEN)
|
||||
|
||||
#define GET_C2H_CMD_FEEDBACK_ELEMENT_ID(__pcmdfbhdr) \
|
||||
LE_BITS_TO_4BYTE((__pcmdfbhdr), 0, 8)
|
||||
#define GET_C2H_CMD_FEEDBACK_CCX_LEN(__pcmdfbhdr) \
|
||||
LE_BITS_TO_4BYTE((__pcmdfbhdr), 8, 8)
|
||||
#define GET_C2H_CMD_FEEDBACK_CCX_CMD_CNT(__pcmdfbhdr) \
|
||||
LE_BITS_TO_4BYTE((__pcmdfbhdr), 16, 16)
|
||||
#define GET_C2H_CMD_FEEDBACK_CCX_MAC_ID(__pcmdfbhdr) \
|
||||
LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 0, 5)
|
||||
#define GET_C2H_CMD_FEEDBACK_CCX_VALID(__pcmdfbhdr) \
|
||||
LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 7, 1)
|
||||
#define GET_C2H_CMD_FEEDBACK_CCX_RETRY_CNT(__pcmdfbhdr) \
|
||||
LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 8, 5)
|
||||
#define GET_C2H_CMD_FEEDBACK_CCX_TOK(__pcmdfbhdr) \
|
||||
LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 15, 1)
|
||||
#define GET_C2H_CMD_FEEDBACK_CCX_QSEL(__pcmdfbhdr) \
|
||||
LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 16, 4)
|
||||
#define GET_C2H_CMD_FEEDBACK_CCX_SEQ(__pcmdfbhdr) \
|
||||
LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 20, 12)
|
||||
|
||||
/*
|
||||
* 92D chip ver:
|
||||
* BIT8: IS 92D
|
||||
* BIT9: single phy
|
||||
* BIT10: C-cut
|
||||
* BIT11: D-cut
|
||||
*/
|
||||
|
||||
/* Chip specific */
|
||||
#define CHIP_92C BIT(0)
|
||||
#define CHIP_92C_1T2R BIT(1)
|
||||
#define CHIP_8723 BIT(2) /* RTL8723 With BT feature */
|
||||
#define CHIP_8723_DRV_REV BIT(3) /* RTL8723 Driver Revised */
|
||||
#define NORMAL_CHIP BIT(4)
|
||||
#define CHIP_VENDOR_UMC BIT(5)
|
||||
#define CHIP_VENDOR_UMC_B_CUT BIT(6) /* Chip version for ECO */
|
||||
|
||||
/* for 92D */
|
||||
#define CHIP_92D BIT(8)
|
||||
#define CHIP_92D_SINGLEPHY BIT(9)
|
||||
#define CHIP_92D_C_CUT BIT(10)
|
||||
#define CHIP_92D_D_CUT BIT(11)
|
||||
|
||||
enum version_8192d {
|
||||
VERSION_TEST_CHIP_88C = 0x00,
|
||||
VERSION_TEST_CHIP_92C = 0x01,
|
||||
VERSION_NORMAL_TSMC_CHIP_88C = 0x10,
|
||||
VERSION_NORMAL_TSMC_CHIP_92C = 0x11,
|
||||
VERSION_NORMAL_TSMC_CHIP_92C_1T2R = 0x13,
|
||||
VERSION_NORMAL_UMC_CHIP_88C_A_CUT = 0x30,
|
||||
VERSION_NORMAL_UMC_CHIP_92C_A_CUT = 0x31,
|
||||
VERSION_NORMAL_UMC_CHIP_92C_1T2R_A_CUT = 0x33,
|
||||
VERSION_NORMA_UMC_CHIP_8723_1T1R_A_CUT = 0x34,
|
||||
VERSION_NORMA_UMC_CHIP_8723_1T1R_B_CUT = 0x3c,
|
||||
VERSION_NORMAL_UMC_CHIP_88C_B_CUT = 0x70,
|
||||
VERSION_NORMAL_UMC_CHIP_92C_B_CUT = 0x71,
|
||||
VERSION_NORMAL_UMC_CHIP_92C_1T2R_B_CUT = 0x73,
|
||||
VERSION_TEST_CHIP_92D_SINGLEPHY = 0x300,
|
||||
VERSION_TEST_CHIP_92D_DUALPHY = 0x100,
|
||||
VERSION_NORMAL_CHIP_92D_SINGLEPHY = 0x310,
|
||||
VERSION_NORMAL_CHIP_92D_DUALPHY = 0x110,
|
||||
VERSION_NORMAL_CHIP_92D_C_CUT_SINGLEPHY = 0x710,
|
||||
VERSION_NORMAL_CHIP_92D_C_CUT_DUALPHY = 0x510,
|
||||
VERSION_NORMAL_CHIP_92D_D_CUT_SINGLEPHY = 0xB10,
|
||||
VERSION_NORMAL_CHIP_92D_D_CUT_DUALPHY = 0x910,
|
||||
};
|
||||
|
||||
#define IS_92D_SINGLEPHY(version) \
|
||||
((version & CHIP_92D_SINGLEPHY) ? true : false)
|
||||
#define IS_92D_C_CUT(version) \
|
||||
((version & CHIP_92D_C_CUT) ? true : false)
|
||||
#define IS_92D_D_CUT(version) \
|
||||
((version & CHIP_92D_D_CUT) ? true : false)
|
||||
|
||||
enum rf_optype {
|
||||
RF_OP_BY_SW_3WIRE = 0,
|
||||
RF_OP_BY_FW,
|
||||
RF_OP_MAX
|
||||
};
|
||||
|
||||
enum rtl_desc_qsel {
|
||||
QSLT_BK = 0x2,
|
||||
QSLT_BE = 0x0,
|
||||
QSLT_VI = 0x5,
|
||||
QSLT_VO = 0x7,
|
||||
QSLT_BEACON = 0x10,
|
||||
QSLT_HIGH = 0x11,
|
||||
QSLT_MGNT = 0x12,
|
||||
QSLT_CMD = 0x13,
|
||||
};
|
||||
|
||||
enum rtl_desc92d_rate {
|
||||
DESC92D_RATE1M = 0x00,
|
||||
DESC92D_RATE2M = 0x01,
|
||||
DESC92D_RATE5_5M = 0x02,
|
||||
DESC92D_RATE11M = 0x03,
|
||||
|
||||
DESC92D_RATE6M = 0x04,
|
||||
DESC92D_RATE9M = 0x05,
|
||||
DESC92D_RATE12M = 0x06,
|
||||
DESC92D_RATE18M = 0x07,
|
||||
DESC92D_RATE24M = 0x08,
|
||||
DESC92D_RATE36M = 0x09,
|
||||
DESC92D_RATE48M = 0x0a,
|
||||
DESC92D_RATE54M = 0x0b,
|
||||
|
||||
DESC92D_RATEMCS0 = 0x0c,
|
||||
DESC92D_RATEMCS1 = 0x0d,
|
||||
DESC92D_RATEMCS2 = 0x0e,
|
||||
DESC92D_RATEMCS3 = 0x0f,
|
||||
DESC92D_RATEMCS4 = 0x10,
|
||||
DESC92D_RATEMCS5 = 0x11,
|
||||
DESC92D_RATEMCS6 = 0x12,
|
||||
DESC92D_RATEMCS7 = 0x13,
|
||||
DESC92D_RATEMCS8 = 0x14,
|
||||
DESC92D_RATEMCS9 = 0x15,
|
||||
DESC92D_RATEMCS10 = 0x16,
|
||||
DESC92D_RATEMCS11 = 0x17,
|
||||
DESC92D_RATEMCS12 = 0x18,
|
||||
DESC92D_RATEMCS13 = 0x19,
|
||||
DESC92D_RATEMCS14 = 0x1a,
|
||||
DESC92D_RATEMCS15 = 0x1b,
|
||||
DESC92D_RATEMCS15_SG = 0x1c,
|
||||
DESC92D_RATEMCS32 = 0x20,
|
||||
};
|
||||
|
||||
enum channel_plan {
|
||||
CHPL_FCC = 0,
|
||||
CHPL_IC = 1,
|
||||
CHPL_ETSI = 2,
|
||||
CHPL_SPAIN = 3,
|
||||
CHPL_FRANCE = 4,
|
||||
CHPL_MKK = 5,
|
||||
CHPL_MKK1 = 6,
|
||||
CHPL_ISRAEL = 7,
|
||||
CHPL_TELEC = 8,
|
||||
CHPL_GLOBAL = 9,
|
||||
CHPL_WORLD = 10,
|
||||
};
|
||||
|
||||
struct phy_sts_cck_8192d {
|
||||
u8 adc_pwdb_X[4];
|
||||
u8 sq_rpt;
|
||||
u8 cck_agc_rpt;
|
||||
};
|
||||
|
||||
struct h2c_cmd_8192c {
|
||||
u8 element_id;
|
||||
u32 cmd_len;
|
||||
u8 *p_cmdbuffer;
|
||||
};
|
||||
|
||||
struct txpower_info {
|
||||
u8 cck_index[RF6052_MAX_PATH][CHANNEL_GROUP_MAX];
|
||||
u8 ht40_1sindex[RF6052_MAX_PATH][CHANNEL_GROUP_MAX];
|
||||
u8 ht40_2sindexdiff[RF6052_MAX_PATH][CHANNEL_GROUP_MAX];
|
||||
u8 ht20indexdiff[RF6052_MAX_PATH][CHANNEL_GROUP_MAX];
|
||||
u8 ofdmindexdiff[RF6052_MAX_PATH][CHANNEL_GROUP_MAX];
|
||||
u8 ht40maxoffset[RF6052_MAX_PATH][CHANNEL_GROUP_MAX];
|
||||
u8 ht20maxoffset[RF6052_MAX_PATH][CHANNEL_GROUP_MAX];
|
||||
u8 tssi_a[3]; /* 5GL/5GM/5GH */
|
||||
u8 tssi_b[3];
|
||||
};
|
||||
|
||||
#endif
|
1355
drivers/net/wireless/rtlwifi/rtl8192de/dm.c
Normal file
1355
drivers/net/wireless/rtlwifi/rtl8192de/dm.c
Normal file
File diff suppressed because it is too large
Load diff
212
drivers/net/wireless/rtlwifi/rtl8192de/dm.h
Normal file
212
drivers/net/wireless/rtlwifi/rtl8192de/dm.h
Normal file
|
@ -0,0 +1,212 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2009-2010 Realtek Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
|
||||
* Hsinchu 300, Taiwan.
|
||||
*
|
||||
* Larry Finger <Larry.Finger@lwfinger.net>
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __RTL92C_DM_H__
|
||||
#define __RTL92C_DM_H__
|
||||
|
||||
#define HAL_DM_DIG_DISABLE BIT(0)
|
||||
#define HAL_DM_HIPWR_DISABLE BIT(1)
|
||||
|
||||
#define OFDM_TABLE_LENGTH 37
|
||||
#define OFDM_TABLE_SIZE_92D 43
|
||||
#define CCK_TABLE_LENGTH 33
|
||||
|
||||
#define CCK_TABLE_SIZE 33
|
||||
|
||||
#define BW_AUTO_SWITCH_HIGH_LOW 25
|
||||
#define BW_AUTO_SWITCH_LOW_HIGH 30
|
||||
|
||||
#define DM_DIG_THRESH_HIGH 40
|
||||
#define DM_DIG_THRESH_LOW 35
|
||||
|
||||
#define DM_FALSEALARM_THRESH_LOW 400
|
||||
#define DM_FALSEALARM_THRESH_HIGH 1000
|
||||
|
||||
#define DM_DIG_MAX 0x3e
|
||||
#define DM_DIG_MIN 0x1c
|
||||
|
||||
#define DM_DIG_FA_UPPER 0x32
|
||||
#define DM_DIG_FA_LOWER 0x20
|
||||
#define DM_DIG_FA_TH0 0x100
|
||||
#define DM_DIG_FA_TH1 0x400
|
||||
#define DM_DIG_FA_TH2 0x600
|
||||
|
||||
#define DM_DIG_BACKOFF_MAX 12
|
||||
#define DM_DIG_BACKOFF_MIN -4
|
||||
#define DM_DIG_BACKOFF_DEFAULT 10
|
||||
|
||||
#define RXPATHSELECTION_SS_TH_lOW 30
|
||||
#define RXPATHSELECTION_DIFF_TH 18
|
||||
|
||||
#define DM_RATR_STA_INIT 0
|
||||
#define DM_RATR_STA_HIGH 1
|
||||
#define DM_RATR_STA_MIDDLE 2
|
||||
#define DM_RATR_STA_LOW 3
|
||||
|
||||
#define CTS2SELF_THVAL 30
|
||||
#define REGC38_TH 20
|
||||
|
||||
#define WAIOTTHVAL 25
|
||||
|
||||
#define TXHIGHPWRLEVEL_NORMAL 0
|
||||
#define TXHIGHPWRLEVEL_LEVEL1 1
|
||||
#define TXHIGHPWRLEVEL_LEVEL2 2
|
||||
#define TXHIGHPWRLEVEL_BT1 3
|
||||
#define TXHIGHPWRLEVEL_BT2 4
|
||||
|
||||
#define DM_TYPE_BYFW 0
|
||||
#define DM_TYPE_BYDRIVER 1
|
||||
|
||||
#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74
|
||||
#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67
|
||||
#define INDEX_MAPPING_NUM 13
|
||||
|
||||
struct ps_t {
|
||||
u8 pre_ccastate;
|
||||
u8 cur_ccasate;
|
||||
|
||||
u8 pre_rfstate;
|
||||
u8 cur_rfstate;
|
||||
|
||||
long rssi_val_min;
|
||||
};
|
||||
|
||||
struct dig_t {
|
||||
u8 dig_enable_flag;
|
||||
u8 dig_ext_port_stage;
|
||||
|
||||
u32 rssi_lowthresh;
|
||||
u32 rssi_highthresh;
|
||||
|
||||
u32 fa_lowthresh;
|
||||
u32 fa_highthresh;
|
||||
|
||||
u8 cursta_connectctate;
|
||||
u8 presta_connectstate;
|
||||
u8 curmultista_connectstate;
|
||||
|
||||
u8 pre_igvalue;
|
||||
u8 cur_igvalue;
|
||||
|
||||
char backoff_val;
|
||||
char backoff_val_range_max;
|
||||
char backoff_val_range_min;
|
||||
u8 rx_gain_range_max;
|
||||
u8 rx_gain_range_min;
|
||||
u8 min_undecorated_pwdb_for_dm;
|
||||
long last_min_undecorated_pwdb_for_dm;
|
||||
|
||||
u8 pre_cck_pd_state;
|
||||
u8 cur_cck_pd_state;
|
||||
|
||||
u8 pre_cck_fa_state;
|
||||
u8 cur_cck_fa_state;
|
||||
|
||||
u8 pre_ccastate;
|
||||
u8 cur_ccasate;
|
||||
|
||||
u8 large_fa_hit;
|
||||
u8 forbidden_igi;
|
||||
u32 recover_cnt;
|
||||
};
|
||||
|
||||
struct swat {
|
||||
u8 failure_cnt;
|
||||
u8 try_flag;
|
||||
u8 stop_trying;
|
||||
long pre_rssi;
|
||||
long trying_threshold;
|
||||
u8 cur_antenna;
|
||||
u8 pre_antenna;
|
||||
};
|
||||
|
||||
enum tag_dynamic_init_gain_operation_type_definition {
|
||||
DIG_TYPE_THRESH_HIGH = 0,
|
||||
DIG_TYPE_THRESH_LOW = 1,
|
||||
DIG_TYPE_BACKOFF = 2,
|
||||
DIG_TYPE_RX_GAIN_MIN = 3,
|
||||
DIG_TYPE_RX_GAIN_MAX = 4,
|
||||
DIG_TYPE_ENABLE = 5,
|
||||
DIG_TYPE_DISABLE = 6,
|
||||
DIG_OP_TYPE_MAX
|
||||
};
|
||||
|
||||
enum tag_cck_packet_detection_threshold_type_definition {
|
||||
CCK_PD_STAGE_LOWRSSI = 0,
|
||||
CCK_PD_STAGE_HIGHRSSI = 1,
|
||||
CCK_FA_STAGE_LOW = 2,
|
||||
CCK_FA_STAGE_HIGH = 3,
|
||||
CCK_PD_STAGE_MAX = 4,
|
||||
};
|
||||
|
||||
enum dm_1r_cca {
|
||||
CCA_1R = 0,
|
||||
CCA_2R = 1,
|
||||
CCA_MAX = 2,
|
||||
};
|
||||
|
||||
enum dm_rf {
|
||||
RF_SAVE = 0,
|
||||
RF_NORMAL = 1,
|
||||
RF_MAX = 2,
|
||||
};
|
||||
|
||||
enum dm_sw_ant_switch {
|
||||
ANS_ANTENNA_B = 1,
|
||||
ANS_ANTENNA_A = 2,
|
||||
ANS_ANTENNA_MAX = 3,
|
||||
};
|
||||
|
||||
enum dm_dig_ext_port_alg {
|
||||
DIG_EXT_PORT_STAGE_0 = 0,
|
||||
DIG_EXT_PORT_STAGE_1 = 1,
|
||||
DIG_EXT_PORT_STAGE_2 = 2,
|
||||
DIG_EXT_PORT_STAGE_3 = 3,
|
||||
DIG_EXT_PORT_STAGE_MAX = 4,
|
||||
};
|
||||
|
||||
enum dm_dig_connect {
|
||||
DIG_STA_DISCONNECT = 0,
|
||||
DIG_STA_CONNECT = 1,
|
||||
DIG_STA_BEFORE_CONNECT = 2,
|
||||
DIG_MULTISTA_DISCONNECT = 3,
|
||||
DIG_MULTISTA_CONNECT = 4,
|
||||
DIG_CONNECT_MAX
|
||||
};
|
||||
|
||||
extern struct dig_t de_digtable;
|
||||
|
||||
void rtl92d_dm_init(struct ieee80211_hw *hw);
|
||||
void rtl92d_dm_watchdog(struct ieee80211_hw *hw);
|
||||
void rtl92d_dm_init_edca_turbo(struct ieee80211_hw *hw);
|
||||
void rtl92d_dm_write_dig(struct ieee80211_hw *hw);
|
||||
void rtl92d_dm_check_txpower_tracking_thermal_meter(struct ieee80211_hw *hw);
|
||||
void rtl92d_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw);
|
||||
|
||||
#endif
|
790
drivers/net/wireless/rtlwifi/rtl8192de/fw.c
Normal file
790
drivers/net/wireless/rtlwifi/rtl8192de/fw.c
Normal file
|
@ -0,0 +1,790 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2009-2010 Realtek Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
|
||||
* Hsinchu 300, Taiwan.
|
||||
*
|
||||
* Larry Finger <Larry.Finger@lwfinger.net>
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include "../wifi.h"
|
||||
#include "../pci.h"
|
||||
#include "../base.h"
|
||||
#include "reg.h"
|
||||
#include "def.h"
|
||||
#include "fw.h"
|
||||
#include "sw.h"
|
||||
|
||||
static bool _rtl92d_is_fw_downloaded(struct rtl_priv *rtlpriv)
|
||||
{
|
||||
return (rtl_read_dword(rtlpriv, REG_MCUFWDL) & MCUFWDL_RDY) ?
|
||||
true : false;
|
||||
}
|
||||
|
||||
static void _rtl92d_enable_fw_download(struct ieee80211_hw *hw, bool enable)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
u8 tmp;
|
||||
|
||||
if (enable) {
|
||||
tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
|
||||
rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp | 0x04);
|
||||
tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
|
||||
rtl_write_byte(rtlpriv, REG_MCUFWDL, tmp | 0x01);
|
||||
tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL + 2);
|
||||
rtl_write_byte(rtlpriv, REG_MCUFWDL + 2, tmp & 0xf7);
|
||||
} else {
|
||||
tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
|
||||
rtl_write_byte(rtlpriv, REG_MCUFWDL, tmp & 0xfe);
|
||||
/* Reserved for fw extension.
|
||||
* 0x81[7] is used for mac0 status ,
|
||||
* so don't write this reg here
|
||||
* rtl_write_byte(rtlpriv, REG_MCUFWDL + 1, 0x00);*/
|
||||
}
|
||||
}
|
||||
|
||||
static void _rtl92d_fw_block_write(struct ieee80211_hw *hw,
|
||||
const u8 *buffer, u32 size)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
u32 blocksize = sizeof(u32);
|
||||
u8 *bufferptr = (u8 *) buffer;
|
||||
u32 *pu4BytePtr = (u32 *) buffer;
|
||||
u32 i, offset, blockCount, remainSize;
|
||||
|
||||
blockCount = size / blocksize;
|
||||
remainSize = size % blocksize;
|
||||
for (i = 0; i < blockCount; i++) {
|
||||
offset = i * blocksize;
|
||||
rtl_write_dword(rtlpriv, (FW_8192D_START_ADDRESS + offset),
|
||||
*(pu4BytePtr + i));
|
||||
}
|
||||
if (remainSize) {
|
||||
offset = blockCount * blocksize;
|
||||
bufferptr += offset;
|
||||
for (i = 0; i < remainSize; i++) {
|
||||
rtl_write_byte(rtlpriv, (FW_8192D_START_ADDRESS +
|
||||
offset + i), *(bufferptr + i));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void _rtl92d_fw_page_write(struct ieee80211_hw *hw,
|
||||
u32 page, const u8 *buffer, u32 size)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
u8 value8;
|
||||
u8 u8page = (u8) (page & 0x07);
|
||||
|
||||
value8 = (rtl_read_byte(rtlpriv, REG_MCUFWDL + 2) & 0xF8) | u8page;
|
||||
rtl_write_byte(rtlpriv, (REG_MCUFWDL + 2), value8);
|
||||
_rtl92d_fw_block_write(hw, buffer, size);
|
||||
}
|
||||
|
||||
static void _rtl92d_fill_dummy(u8 *pfwbuf, u32 *pfwlen)
|
||||
{
|
||||
u32 fwlen = *pfwlen;
|
||||
u8 remain = (u8) (fwlen % 4);
|
||||
|
||||
remain = (remain == 0) ? 0 : (4 - remain);
|
||||
while (remain > 0) {
|
||||
pfwbuf[fwlen] = 0;
|
||||
fwlen++;
|
||||
remain--;
|
||||
}
|
||||
*pfwlen = fwlen;
|
||||
}
|
||||
|
||||
static void _rtl92d_write_fw(struct ieee80211_hw *hw,
|
||||
enum version_8192d version, u8 *buffer, u32 size)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
|
||||
u8 *bufferPtr = (u8 *) buffer;
|
||||
u32 pagenums, remainSize;
|
||||
u32 page, offset;
|
||||
|
||||
RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE, ("FW size is %d bytes,\n", size));
|
||||
if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192DE)
|
||||
_rtl92d_fill_dummy(bufferPtr, &size);
|
||||
pagenums = size / FW_8192D_PAGE_SIZE;
|
||||
remainSize = size % FW_8192D_PAGE_SIZE;
|
||||
if (pagenums > 8) {
|
||||
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||
("Page numbers should not greater then 8\n"));
|
||||
}
|
||||
for (page = 0; page < pagenums; page++) {
|
||||
offset = page * FW_8192D_PAGE_SIZE;
|
||||
_rtl92d_fw_page_write(hw, page, (bufferPtr + offset),
|
||||
FW_8192D_PAGE_SIZE);
|
||||
}
|
||||
if (remainSize) {
|
||||
offset = pagenums * FW_8192D_PAGE_SIZE;
|
||||
page = pagenums;
|
||||
_rtl92d_fw_page_write(hw, page, (bufferPtr + offset),
|
||||
remainSize);
|
||||
}
|
||||
}
|
||||
|
||||
static int _rtl92d_fw_free_to_go(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
u32 counter = 0;
|
||||
u32 value32;
|
||||
|
||||
do {
|
||||
value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
|
||||
} while ((counter++ < FW_8192D_POLLING_TIMEOUT_COUNT) &&
|
||||
(!(value32 & FWDL_ChkSum_rpt)));
|
||||
if (counter >= FW_8192D_POLLING_TIMEOUT_COUNT) {
|
||||
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||
("chksum report faill ! REG_MCUFWDL:0x%08x .\n",
|
||||
value32));
|
||||
return -EIO;
|
||||
}
|
||||
RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
|
||||
("Checksum report OK ! REG_MCUFWDL:0x%08x .\n", value32));
|
||||
value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
|
||||
value32 |= MCUFWDL_RDY;
|
||||
rtl_write_dword(rtlpriv, REG_MCUFWDL, value32);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void rtl92d_firmware_selfreset(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
u8 u1b_tmp;
|
||||
u8 delay = 100;
|
||||
|
||||
/* Set (REG_HMETFR + 3) to 0x20 is reset 8051 */
|
||||
rtl_write_byte(rtlpriv, REG_HMETFR + 3, 0x20);
|
||||
u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
|
||||
while (u1b_tmp & BIT(2)) {
|
||||
delay--;
|
||||
if (delay == 0)
|
||||
break;
|
||||
udelay(50);
|
||||
u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
|
||||
}
|
||||
RT_ASSERT((delay > 0), ("8051 reset failed!\n"));
|
||||
RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
|
||||
("=====> 8051 reset success (%d) .\n", delay));
|
||||
}
|
||||
|
||||
static int _rtl92d_fw_init(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
|
||||
u32 counter;
|
||||
|
||||
RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG, ("FW already have download\n"));
|
||||
/* polling for FW ready */
|
||||
counter = 0;
|
||||
do {
|
||||
if (rtlhal->interfaceindex == 0) {
|
||||
if (rtl_read_byte(rtlpriv, FW_MAC0_READY) &
|
||||
MAC0_READY) {
|
||||
RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
|
||||
("Polling FW ready success!! "
|
||||
"REG_MCUFWDL: 0x%x .\n",
|
||||
rtl_read_byte(rtlpriv,
|
||||
FW_MAC0_READY)));
|
||||
return 0;
|
||||
}
|
||||
udelay(5);
|
||||
} else {
|
||||
if (rtl_read_byte(rtlpriv, FW_MAC1_READY) &
|
||||
MAC1_READY) {
|
||||
RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
|
||||
("Polling FW ready success!! "
|
||||
"REG_MCUFWDL: 0x%x .\n",
|
||||
rtl_read_byte(rtlpriv,
|
||||
FW_MAC1_READY)));
|
||||
return 0;
|
||||
}
|
||||
udelay(5);
|
||||
}
|
||||
} while (counter++ < POLLING_READY_TIMEOUT_COUNT);
|
||||
|
||||
if (rtlhal->interfaceindex == 0) {
|
||||
RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
|
||||
("Polling FW ready fail!! MAC0 FW init not ready: "
|
||||
"0x%x .\n",
|
||||
rtl_read_byte(rtlpriv, FW_MAC0_READY)));
|
||||
} else {
|
||||
RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
|
||||
("Polling FW ready fail!! MAC1 FW init not ready: "
|
||||
"0x%x .\n",
|
||||
rtl_read_byte(rtlpriv, FW_MAC1_READY)));
|
||||
}
|
||||
RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
|
||||
("Polling FW ready fail!! REG_MCUFWDL:0x%08ul .\n",
|
||||
rtl_read_dword(rtlpriv, REG_MCUFWDL)));
|
||||
return -1;
|
||||
}
|
||||
|
||||
int rtl92d_download_fw(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
|
||||
u8 *pfwheader;
|
||||
u8 *pfwdata;
|
||||
u32 fwsize;
|
||||
int err;
|
||||
enum version_8192d version = rtlhal->version;
|
||||
u8 value;
|
||||
u32 count;
|
||||
bool fw_downloaded = false, fwdl_in_process = false;
|
||||
unsigned long flags;
|
||||
|
||||
if (!rtlhal->pfirmware)
|
||||
return 1;
|
||||
fwsize = rtlhal->fwsize;
|
||||
pfwheader = (u8 *) rtlhal->pfirmware;
|
||||
pfwdata = (u8 *) rtlhal->pfirmware;
|
||||
rtlhal->fw_version = (u16) GET_FIRMWARE_HDR_VERSION(pfwheader);
|
||||
rtlhal->fw_subversion = (u16) GET_FIRMWARE_HDR_SUB_VER(pfwheader);
|
||||
RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, (" FirmwareVersion(%d),"
|
||||
"FirmwareSubVersion(%d), Signature(%#x)\n",
|
||||
rtlhal->fw_version, rtlhal->fw_subversion,
|
||||
GET_FIRMWARE_HDR_SIGNATURE(pfwheader)));
|
||||
if (IS_FW_HEADER_EXIST(pfwheader)) {
|
||||
RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
|
||||
("Shift 32 bytes for FW header!!\n"));
|
||||
pfwdata = pfwdata + 32;
|
||||
fwsize = fwsize - 32;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&globalmutex_for_fwdownload, flags);
|
||||
fw_downloaded = _rtl92d_is_fw_downloaded(rtlpriv);
|
||||
if ((rtl_read_byte(rtlpriv, 0x1f) & BIT(5)) == BIT(5))
|
||||
fwdl_in_process = true;
|
||||
else
|
||||
fwdl_in_process = false;
|
||||
if (fw_downloaded) {
|
||||
spin_unlock_irqrestore(&globalmutex_for_fwdownload, flags);
|
||||
goto exit;
|
||||
} else if (fwdl_in_process) {
|
||||
spin_unlock_irqrestore(&globalmutex_for_fwdownload, flags);
|
||||
for (count = 0; count < 5000; count++) {
|
||||
udelay(500);
|
||||
spin_lock_irqsave(&globalmutex_for_fwdownload, flags);
|
||||
fw_downloaded = _rtl92d_is_fw_downloaded(rtlpriv);
|
||||
if ((rtl_read_byte(rtlpriv, 0x1f) & BIT(5)) == BIT(5))
|
||||
fwdl_in_process = true;
|
||||
else
|
||||
fwdl_in_process = false;
|
||||
spin_unlock_irqrestore(&globalmutex_for_fwdownload,
|
||||
flags);
|
||||
if (fw_downloaded)
|
||||
goto exit;
|
||||
else if (!fwdl_in_process)
|
||||
break;
|
||||
else
|
||||
RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
|
||||
("Wait for another mac "
|
||||
"download fw\n"));
|
||||
}
|
||||
spin_lock_irqsave(&globalmutex_for_fwdownload, flags);
|
||||
value = rtl_read_byte(rtlpriv, 0x1f);
|
||||
value |= BIT(5);
|
||||
rtl_write_byte(rtlpriv, 0x1f, value);
|
||||
spin_unlock_irqrestore(&globalmutex_for_fwdownload, flags);
|
||||
} else {
|
||||
value = rtl_read_byte(rtlpriv, 0x1f);
|
||||
value |= BIT(5);
|
||||
rtl_write_byte(rtlpriv, 0x1f, value);
|
||||
spin_unlock_irqrestore(&globalmutex_for_fwdownload, flags);
|
||||
}
|
||||
|
||||
/* If 8051 is running in RAM code, driver should
|
||||
* inform Fw to reset by itself, or it will cause
|
||||
* download Fw fail.*/
|
||||
/* 8051 RAM code */
|
||||
if (rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) {
|
||||
rtl92d_firmware_selfreset(hw);
|
||||
rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
|
||||
}
|
||||
_rtl92d_enable_fw_download(hw, true);
|
||||
_rtl92d_write_fw(hw, version, pfwdata, fwsize);
|
||||
_rtl92d_enable_fw_download(hw, false);
|
||||
spin_lock_irqsave(&globalmutex_for_fwdownload, flags);
|
||||
err = _rtl92d_fw_free_to_go(hw);
|
||||
/* download fw over,clear 0x1f[5] */
|
||||
value = rtl_read_byte(rtlpriv, 0x1f);
|
||||
value &= (~BIT(5));
|
||||
rtl_write_byte(rtlpriv, 0x1f, value);
|
||||
spin_unlock_irqrestore(&globalmutex_for_fwdownload, flags);
|
||||
if (err) {
|
||||
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||
("fw is not ready to run!\n"));
|
||||
goto exit;
|
||||
} else {
|
||||
RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
|
||||
("fw is ready to run!\n"));
|
||||
}
|
||||
exit:
|
||||
err = _rtl92d_fw_init(hw);
|
||||
return err;
|
||||
}
|
||||
|
||||
static bool _rtl92d_check_fw_read_last_h2c(struct ieee80211_hw *hw, u8 boxnum)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
u8 val_hmetfr;
|
||||
bool result = false;
|
||||
|
||||
val_hmetfr = rtl_read_byte(rtlpriv, REG_HMETFR);
|
||||
if (((val_hmetfr >> boxnum) & BIT(0)) == 0)
|
||||
result = true;
|
||||
return result;
|
||||
}
|
||||
|
||||
static void _rtl92d_fill_h2c_command(struct ieee80211_hw *hw,
|
||||
u8 element_id, u32 cmd_len, u8 *cmdbuffer)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
|
||||
struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
|
||||
u8 boxnum;
|
||||
u16 box_reg = 0, box_extreg = 0;
|
||||
u8 u1b_tmp;
|
||||
bool isfw_read = false;
|
||||
u8 buf_index = 0;
|
||||
bool bwrite_sucess = false;
|
||||
u8 wait_h2c_limmit = 100;
|
||||
u8 wait_writeh2c_limmit = 100;
|
||||
u8 boxcontent[4], boxextcontent[2];
|
||||
u32 h2c_waitcounter = 0;
|
||||
unsigned long flag;
|
||||
u8 idx;
|
||||
|
||||
if (ppsc->rfpwr_state == ERFOFF || ppsc->inactive_pwrstate == ERFOFF) {
|
||||
RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
|
||||
("Return as RF is off!!!\n"));
|
||||
return;
|
||||
}
|
||||
RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("come in\n"));
|
||||
while (true) {
|
||||
spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
|
||||
if (rtlhal->h2c_setinprogress) {
|
||||
RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
|
||||
("H2C set in progress! Wait to set.."
|
||||
"element_id(%d).\n", element_id));
|
||||
|
||||
while (rtlhal->h2c_setinprogress) {
|
||||
spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock,
|
||||
flag);
|
||||
h2c_waitcounter++;
|
||||
RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
|
||||
("Wait 100 us (%d times)...\n",
|
||||
h2c_waitcounter));
|
||||
udelay(100);
|
||||
|
||||
if (h2c_waitcounter > 1000)
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&rtlpriv->locks.h2c_lock,
|
||||
flag);
|
||||
}
|
||||
spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
|
||||
} else {
|
||||
rtlhal->h2c_setinprogress = true;
|
||||
spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
|
||||
break;
|
||||
}
|
||||
}
|
||||
while (!bwrite_sucess) {
|
||||
wait_writeh2c_limmit--;
|
||||
if (wait_writeh2c_limmit == 0) {
|
||||
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||
("Write H2C fail because no trigger "
|
||||
"for FW INT!\n"));
|
||||
break;
|
||||
}
|
||||
boxnum = rtlhal->last_hmeboxnum;
|
||||
switch (boxnum) {
|
||||
case 0:
|
||||
box_reg = REG_HMEBOX_0;
|
||||
box_extreg = REG_HMEBOX_EXT_0;
|
||||
break;
|
||||
case 1:
|
||||
box_reg = REG_HMEBOX_1;
|
||||
box_extreg = REG_HMEBOX_EXT_1;
|
||||
break;
|
||||
case 2:
|
||||
box_reg = REG_HMEBOX_2;
|
||||
box_extreg = REG_HMEBOX_EXT_2;
|
||||
break;
|
||||
case 3:
|
||||
box_reg = REG_HMEBOX_3;
|
||||
box_extreg = REG_HMEBOX_EXT_3;
|
||||
break;
|
||||
default:
|
||||
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||
("switch case not process\n"));
|
||||
break;
|
||||
}
|
||||
isfw_read = _rtl92d_check_fw_read_last_h2c(hw, boxnum);
|
||||
while (!isfw_read) {
|
||||
wait_h2c_limmit--;
|
||||
if (wait_h2c_limmit == 0) {
|
||||
RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
|
||||
("Wating too long for FW read "
|
||||
"clear HMEBox(%d)!\n", boxnum));
|
||||
break;
|
||||
}
|
||||
udelay(10);
|
||||
isfw_read = _rtl92d_check_fw_read_last_h2c(hw, boxnum);
|
||||
u1b_tmp = rtl_read_byte(rtlpriv, 0x1BF);
|
||||
RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
|
||||
("Wating for FW read clear HMEBox(%d)!!! "
|
||||
"0x1BF = %2x\n", boxnum, u1b_tmp));
|
||||
}
|
||||
if (!isfw_read) {
|
||||
RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
|
||||
("Write H2C register BOX[%d] fail!!!!! "
|
||||
"Fw do not read.\n", boxnum));
|
||||
break;
|
||||
}
|
||||
memset(boxcontent, 0, sizeof(boxcontent));
|
||||
memset(boxextcontent, 0, sizeof(boxextcontent));
|
||||
boxcontent[0] = element_id;
|
||||
RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
|
||||
("Write element_id box_reg(%4x) = %2x\n",
|
||||
box_reg, element_id));
|
||||
switch (cmd_len) {
|
||||
case 1:
|
||||
boxcontent[0] &= ~(BIT(7));
|
||||
memcpy(boxcontent + 1, cmdbuffer + buf_index, 1);
|
||||
for (idx = 0; idx < 4; idx++)
|
||||
rtl_write_byte(rtlpriv, box_reg + idx,
|
||||
boxcontent[idx]);
|
||||
break;
|
||||
case 2:
|
||||
boxcontent[0] &= ~(BIT(7));
|
||||
memcpy(boxcontent + 1, cmdbuffer + buf_index, 2);
|
||||
for (idx = 0; idx < 4; idx++)
|
||||
rtl_write_byte(rtlpriv, box_reg + idx,
|
||||
boxcontent[idx]);
|
||||
break;
|
||||
case 3:
|
||||
boxcontent[0] &= ~(BIT(7));
|
||||
memcpy(boxcontent + 1, cmdbuffer + buf_index, 3);
|
||||
for (idx = 0; idx < 4; idx++)
|
||||
rtl_write_byte(rtlpriv, box_reg + idx,
|
||||
boxcontent[idx]);
|
||||
break;
|
||||
case 4:
|
||||
boxcontent[0] |= (BIT(7));
|
||||
memcpy(boxextcontent, cmdbuffer + buf_index, 2);
|
||||
memcpy(boxcontent + 1, cmdbuffer + buf_index + 2, 2);
|
||||
for (idx = 0; idx < 2; idx++)
|
||||
rtl_write_byte(rtlpriv, box_extreg + idx,
|
||||
boxextcontent[idx]);
|
||||
for (idx = 0; idx < 4; idx++)
|
||||
rtl_write_byte(rtlpriv, box_reg + idx,
|
||||
boxcontent[idx]);
|
||||
break;
|
||||
case 5:
|
||||
boxcontent[0] |= (BIT(7));
|
||||
memcpy(boxextcontent, cmdbuffer + buf_index, 2);
|
||||
memcpy(boxcontent + 1, cmdbuffer + buf_index + 2, 3);
|
||||
for (idx = 0; idx < 2; idx++)
|
||||
rtl_write_byte(rtlpriv, box_extreg + idx,
|
||||
boxextcontent[idx]);
|
||||
for (idx = 0; idx < 4; idx++)
|
||||
rtl_write_byte(rtlpriv, box_reg + idx,
|
||||
boxcontent[idx]);
|
||||
break;
|
||||
default:
|
||||
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||
("switch case not process\n"));
|
||||
break;
|
||||
}
|
||||
bwrite_sucess = true;
|
||||
rtlhal->last_hmeboxnum = boxnum + 1;
|
||||
if (rtlhal->last_hmeboxnum == 4)
|
||||
rtlhal->last_hmeboxnum = 0;
|
||||
RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
|
||||
("pHalData->last_hmeboxnum = %d\n",
|
||||
rtlhal->last_hmeboxnum));
|
||||
}
|
||||
spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
|
||||
rtlhal->h2c_setinprogress = false;
|
||||
spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
|
||||
RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("go out\n"));
|
||||
}
|
||||
|
||||
void rtl92d_fill_h2c_cmd(struct ieee80211_hw *hw,
|
||||
u8 element_id, u32 cmd_len, u8 *cmdbuffer)
|
||||
{
|
||||
struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
|
||||
u32 tmp_cmdbuf[2];
|
||||
|
||||
if (rtlhal->fw_ready == false) {
|
||||
RT_ASSERT(false, ("return H2C cmd because of Fw "
|
||||
"download fail!!!\n"));
|
||||
return;
|
||||
}
|
||||
memset(tmp_cmdbuf, 0, 8);
|
||||
memcpy(tmp_cmdbuf, cmdbuffer, cmd_len);
|
||||
_rtl92d_fill_h2c_command(hw, element_id, cmd_len, (u8 *)&tmp_cmdbuf);
|
||||
return;
|
||||
}
|
||||
|
||||
void rtl92d_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
u8 u1_h2c_set_pwrmode[3] = { 0 };
|
||||
struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
|
||||
|
||||
RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, ("FW LPS mode = %d\n", mode));
|
||||
SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, mode);
|
||||
SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode, 1);
|
||||
SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(u1_h2c_set_pwrmode,
|
||||
ppsc->reg_max_lps_awakeintvl);
|
||||
RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
|
||||
"rtl92d_set_fw_rsvdpagepkt(): u1_h2c_set_pwrmode\n",
|
||||
u1_h2c_set_pwrmode, 3);
|
||||
rtl92d_fill_h2c_cmd(hw, H2C_SETPWRMODE, 3, u1_h2c_set_pwrmode);
|
||||
}
|
||||
|
||||
static bool _rtl92d_cmd_send_packet(struct ieee80211_hw *hw,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
|
||||
struct rtl8192_tx_ring *ring;
|
||||
struct rtl_tx_desc *pdesc;
|
||||
u8 idx = 0;
|
||||
unsigned long flags;
|
||||
struct sk_buff *pskb;
|
||||
|
||||
ring = &rtlpci->tx_ring[BEACON_QUEUE];
|
||||
pskb = __skb_dequeue(&ring->queue);
|
||||
if (pskb)
|
||||
kfree_skb(pskb);
|
||||
spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
|
||||
pdesc = &ring->desc[idx];
|
||||
/* discard output from call below */
|
||||
rtlpriv->cfg->ops->get_desc((u8 *) pdesc, true, HW_DESC_OWN);
|
||||
rtlpriv->cfg->ops->fill_tx_cmddesc(hw, (u8 *) pdesc, 1, 1, skb);
|
||||
__skb_queue_tail(&ring->queue, skb);
|
||||
spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
|
||||
rtlpriv->cfg->ops->tx_polling(hw, BEACON_QUEUE);
|
||||
return true;
|
||||
}
|
||||
|
||||
#define BEACON_PG 0 /*->1 */
|
||||
#define PSPOLL_PG 2
|
||||
#define NULL_PG 3
|
||||
#define PROBERSP_PG 4 /*->5 */
|
||||
#define TOTAL_RESERVED_PKT_LEN 768
|
||||
|
||||
static u8 reserved_page_packet[TOTAL_RESERVED_PKT_LEN] = {
|
||||
/* page 0 beacon */
|
||||
0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
|
||||
0xFF, 0xFF, 0x00, 0xE0, 0x4C, 0x76, 0x00, 0x42,
|
||||
0x00, 0x40, 0x10, 0x10, 0x00, 0x03, 0x50, 0x08,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x64, 0x00, 0x00, 0x04, 0x00, 0x0C, 0x6C, 0x69,
|
||||
0x6E, 0x6B, 0x73, 0x79, 0x73, 0x5F, 0x77, 0x6C,
|
||||
0x61, 0x6E, 0x01, 0x04, 0x82, 0x84, 0x8B, 0x96,
|
||||
0x03, 0x01, 0x01, 0x06, 0x02, 0x00, 0x00, 0x2A,
|
||||
0x01, 0x00, 0x32, 0x08, 0x24, 0x30, 0x48, 0x6C,
|
||||
0x0C, 0x12, 0x18, 0x60, 0x2D, 0x1A, 0x6C, 0x18,
|
||||
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x3D, 0x00, 0xDD, 0x06, 0x00, 0xE0, 0x4C, 0x02,
|
||||
0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
|
||||
/* page 1 beacon */
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x10, 0x00, 0x20, 0x8C, 0x00, 0x12, 0x10, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
|
||||
/* page 2 ps-poll */
|
||||
0xA4, 0x10, 0x01, 0xC0, 0x00, 0x40, 0x10, 0x10,
|
||||
0x00, 0x03, 0x00, 0xE0, 0x4C, 0x76, 0x00, 0x42,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x18, 0x00, 0x20, 0x8C, 0x00, 0x12, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
|
||||
0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
|
||||
/* page 3 null */
|
||||
0x48, 0x01, 0x00, 0x00, 0x00, 0x40, 0x10, 0x10,
|
||||
0x00, 0x03, 0x00, 0xE0, 0x4C, 0x76, 0x00, 0x42,
|
||||
0x00, 0x40, 0x10, 0x10, 0x00, 0x03, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x72, 0x00, 0x20, 0x8C, 0x00, 0x12, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
|
||||
0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
|
||||
/* page 4 probe_resp */
|
||||
0x50, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x10,
|
||||
0x00, 0x03, 0x00, 0xE0, 0x4C, 0x76, 0x00, 0x42,
|
||||
0x00, 0x40, 0x10, 0x10, 0x00, 0x03, 0x00, 0x00,
|
||||
0x9E, 0x46, 0x15, 0x32, 0x27, 0xF2, 0x2D, 0x00,
|
||||
0x64, 0x00, 0x00, 0x04, 0x00, 0x0C, 0x6C, 0x69,
|
||||
0x6E, 0x6B, 0x73, 0x79, 0x73, 0x5F, 0x77, 0x6C,
|
||||
0x61, 0x6E, 0x01, 0x04, 0x82, 0x84, 0x8B, 0x96,
|
||||
0x03, 0x01, 0x01, 0x06, 0x02, 0x00, 0x00, 0x2A,
|
||||
0x01, 0x00, 0x32, 0x08, 0x24, 0x30, 0x48, 0x6C,
|
||||
0x0C, 0x12, 0x18, 0x60, 0x2D, 0x1A, 0x6C, 0x18,
|
||||
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x3D, 0x00, 0xDD, 0x06, 0x00, 0xE0, 0x4C, 0x02,
|
||||
0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
|
||||
/* page 5 probe_resp */
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
};
|
||||
|
||||
void rtl92d_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool dl_finished)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
|
||||
struct sk_buff *skb = NULL;
|
||||
u32 totalpacketlen;
|
||||
bool rtstatus;
|
||||
u8 u1RsvdPageLoc[3] = { 0 };
|
||||
bool dlok = false;
|
||||
u8 *beacon;
|
||||
u8 *p_pspoll;
|
||||
u8 *nullfunc;
|
||||
u8 *p_probersp;
|
||||
/*---------------------------------------------------------
|
||||
(1) beacon
|
||||
---------------------------------------------------------*/
|
||||
beacon = &reserved_page_packet[BEACON_PG * 128];
|
||||
SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr);
|
||||
SET_80211_HDR_ADDRESS3(beacon, mac->bssid);
|
||||
/*-------------------------------------------------------
|
||||
(2) ps-poll
|
||||
--------------------------------------------------------*/
|
||||
p_pspoll = &reserved_page_packet[PSPOLL_PG * 128];
|
||||
SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
|
||||
SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
|
||||
SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);
|
||||
SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG);
|
||||
/*--------------------------------------------------------
|
||||
(3) null data
|
||||
---------------------------------------------------------*/
|
||||
nullfunc = &reserved_page_packet[NULL_PG * 128];
|
||||
SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid);
|
||||
SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
|
||||
SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
|
||||
SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1RsvdPageLoc, NULL_PG);
|
||||
/*---------------------------------------------------------
|
||||
(4) probe response
|
||||
----------------------------------------------------------*/
|
||||
p_probersp = &reserved_page_packet[PROBERSP_PG * 128];
|
||||
SET_80211_HDR_ADDRESS1(p_probersp, mac->bssid);
|
||||
SET_80211_HDR_ADDRESS2(p_probersp, mac->mac_addr);
|
||||
SET_80211_HDR_ADDRESS3(p_probersp, mac->bssid);
|
||||
SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1RsvdPageLoc, PROBERSP_PG);
|
||||
totalpacketlen = TOTAL_RESERVED_PKT_LEN;
|
||||
RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
|
||||
"rtl92d_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n",
|
||||
&reserved_page_packet[0], totalpacketlen);
|
||||
RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
|
||||
"rtl92d_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n",
|
||||
u1RsvdPageLoc, 3);
|
||||
skb = dev_alloc_skb(totalpacketlen);
|
||||
memcpy((u8 *) skb_put(skb, totalpacketlen), &reserved_page_packet,
|
||||
totalpacketlen);
|
||||
rtstatus = _rtl92d_cmd_send_packet(hw, skb);
|
||||
|
||||
if (rtstatus)
|
||||
dlok = true;
|
||||
if (dlok) {
|
||||
RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
|
||||
("Set RSVD page location to Fw.\n"));
|
||||
RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
|
||||
"H2C_RSVDPAGE:\n", u1RsvdPageLoc, 3);
|
||||
rtl92d_fill_h2c_cmd(hw, H2C_RSVDPAGE,
|
||||
sizeof(u1RsvdPageLoc), u1RsvdPageLoc);
|
||||
} else
|
||||
RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
|
||||
("Set RSVD page location to Fw FAIL!!!!!!.\n"));
|
||||
}
|
||||
|
||||
void rtl92d_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus)
|
||||
{
|
||||
u8 u1_joinbssrpt_parm[1] = {0};
|
||||
|
||||
SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(u1_joinbssrpt_parm, mstatus);
|
||||
rtl92d_fill_h2c_cmd(hw, H2C_JOINBSSRPT, 1, u1_joinbssrpt_parm);
|
||||
}
|
155
drivers/net/wireless/rtlwifi/rtl8192de/fw.h
Normal file
155
drivers/net/wireless/rtlwifi/rtl8192de/fw.h
Normal file
|
@ -0,0 +1,155 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2009-2010 Realtek Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
|
||||
* Hsinchu 300, Taiwan.
|
||||
*
|
||||
* Larry Finger <Larry.Finger@lwfinger.net>
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __RTL92D__FW__H__
|
||||
#define __RTL92D__FW__H__
|
||||
|
||||
#define FW_8192D_START_ADDRESS 0x1000
|
||||
#define FW_8192D_PAGE_SIZE 4096
|
||||
#define FW_8192D_POLLING_TIMEOUT_COUNT 1000
|
||||
|
||||
#define IS_FW_HEADER_EXIST(_pfwhdr) \
|
||||
((GET_FIRMWARE_HDR_SIGNATURE(_pfwhdr) & 0xFFF0) == 0x92C0 || \
|
||||
(GET_FIRMWARE_HDR_SIGNATURE(_pfwhdr) & 0xFFF0) == 0x88C0 || \
|
||||
(GET_FIRMWARE_HDR_SIGNATURE(_pfwhdr) & 0xFFFF) == 0x92D0 || \
|
||||
(GET_FIRMWARE_HDR_SIGNATURE(_pfwhdr) & 0xFFFF) == 0x92D1 || \
|
||||
(GET_FIRMWARE_HDR_SIGNATURE(_pfwhdr) & 0xFFFF) == 0x92D2 || \
|
||||
(GET_FIRMWARE_HDR_SIGNATURE(_pfwhdr) & 0xFFFF) == 0x92D3)
|
||||
|
||||
/* Define a macro that takes an le32 word, converts it to host ordering,
|
||||
* right shifts by a specified count, creates a mask of the specified
|
||||
* bit count, and extracts that number of bits.
|
||||
*/
|
||||
|
||||
#define SHIFT_AND_MASK_LE(__pdesc, __shift, __mask) \
|
||||
((le32_to_cpu(*(((__le32 *)(__pdesc)))) >> (__shift)) & \
|
||||
BIT_LEN_MASK_32(__mask))
|
||||
|
||||
/* Firmware Header(8-byte alinment required) */
|
||||
/* --- LONG WORD 0 ---- */
|
||||
#define GET_FIRMWARE_HDR_SIGNATURE(__fwhdr) \
|
||||
SHIFT_AND_MASK_LE(__fwhdr, 0, 16)
|
||||
#define GET_FIRMWARE_HDR_CATEGORY(__fwhdr) \
|
||||
SHIFT_AND_MASK_LE(__fwhdr, 16, 8)
|
||||
#define GET_FIRMWARE_HDR_FUNCTION(__fwhdr) \
|
||||
SHIFT_AND_MASK_LE(__fwhdr, 24, 8)
|
||||
#define GET_FIRMWARE_HDR_VERSION(__fwhdr) \
|
||||
SHIFT_AND_MASK_LE(__fwhdr + 4, 0, 16)
|
||||
#define GET_FIRMWARE_HDR_SUB_VER(__fwhdr) \
|
||||
SHIFT_AND_MASK_LE(__fwhdr + 4, 16, 8)
|
||||
#define GET_FIRMWARE_HDR_RSVD1(__fwhdr) \
|
||||
SHIFT_AND_MASK_LE(__fwhdr + 4, 24, 8)
|
||||
|
||||
/* --- LONG WORD 1 ---- */
|
||||
#define GET_FIRMWARE_HDR_MONTH(__fwhdr) \
|
||||
SHIFT_AND_MASK_LE(__fwhdr + 8, 0, 8)
|
||||
#define GET_FIRMWARE_HDR_DATE(__fwhdr) \
|
||||
SHIFT_AND_MASK_LE(__fwhdr + 8, 8, 8)
|
||||
#define GET_FIRMWARE_HDR_HOUR(__fwhdr) \
|
||||
SHIFT_AND_MASK_LE(__fwhdr + 8, 16, 8)
|
||||
#define GET_FIRMWARE_HDR_MINUTE(__fwhdr) \
|
||||
SHIFT_AND_MASK_LE(__fwhdr + 8, 24, 8)
|
||||
#define GET_FIRMWARE_HDR_ROMCODE_SIZE(__fwhdr) \
|
||||
SHIFT_AND_MASK_LE(__fwhdr + 12, 0, 16)
|
||||
#define GET_FIRMWARE_HDR_RSVD2(__fwhdr) \
|
||||
SHIFT_AND_MASK_LE(__fwhdr + 12, 16, 16)
|
||||
|
||||
/* --- LONG WORD 2 ---- */
|
||||
#define GET_FIRMWARE_HDR_SVN_IDX(__fwhdr) \
|
||||
SHIFT_AND_MASK_LE(__fwhdr + 16, 0, 32)
|
||||
#define GET_FIRMWARE_HDR_RSVD3(__fwhdr) \
|
||||
SHIFT_AND_MASK_LE(__fwhdr + 20, 0, 32)
|
||||
|
||||
/* --- LONG WORD 3 ---- */
|
||||
#define GET_FIRMWARE_HDR_RSVD4(__fwhdr) \
|
||||
SHIFT_AND_MASK_LE(__fwhdr + 24, 0, 32)
|
||||
#define GET_FIRMWARE_HDR_RSVD5(__fwhdr) \
|
||||
SHIFT_AND_MASK_LE(__fwhdr + 28, 0, 32)
|
||||
|
||||
#define pagenum_128(_len) \
|
||||
(u32)(((_len) >> 7) + ((_len) & 0x7F ? 1 : 0))
|
||||
|
||||
#define SET_H2CCMD_PWRMODE_PARM_MODE(__ph2ccmd, __val) \
|
||||
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val)
|
||||
#define SET_H2CCMD_PWRMODE_PARM_SMART_PS(__ph2ccmd, __val) \
|
||||
SET_BITS_TO_LE_1BYTE((__ph2ccmd) + 1, 0, 8, __val)
|
||||
#define SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__ph2ccmd, __val) \
|
||||
SET_BITS_TO_LE_1BYTE((__ph2ccmd) + 2, 0, 8, __val)
|
||||
#define SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(__ph2ccmd, __val) \
|
||||
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val)
|
||||
#define SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__ph2ccmd, __val) \
|
||||
SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val)
|
||||
#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__ph2ccmd, __val) \
|
||||
SET_BITS_TO_LE_1BYTE((__ph2ccmd) + 1, 0, 8, __val)
|
||||
#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__ph2ccmd, __val) \
|
||||
SET_BITS_TO_LE_1BYTE((__ph2ccmd) + 2, 0, 8, __val)
|
||||
|
||||
struct rtl92d_firmware_header {
|
||||
u16 signature;
|
||||
u8 category;
|
||||
u8 function;
|
||||
u16 version;
|
||||
u8 subversion;
|
||||
u8 rsvd1;
|
||||
|
||||
u8 month;
|
||||
u8 date;
|
||||
u8 hour;
|
||||
u8 minute;
|
||||
u16 ramcodeSize;
|
||||
u16 rsvd2;
|
||||
|
||||
u32 svnindex;
|
||||
u32 rsvd3;
|
||||
|
||||
u32 rsvd4;
|
||||
u32 rsvd5;
|
||||
};
|
||||
|
||||
enum rtl8192d_h2c_cmd {
|
||||
H2C_AP_OFFLOAD = 0,
|
||||
H2C_SETPWRMODE = 1,
|
||||
H2C_JOINBSSRPT = 2,
|
||||
H2C_RSVDPAGE = 3,
|
||||
H2C_RSSI_REPORT = 5,
|
||||
H2C_RA_MASK = 6,
|
||||
H2C_MAC_MODE_SEL = 9,
|
||||
H2C_PWRM = 15,
|
||||
MAX_H2CCMD
|
||||
};
|
||||
|
||||
int rtl92d_download_fw(struct ieee80211_hw *hw);
|
||||
void rtl92d_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id,
|
||||
u32 cmd_len, u8 *p_cmdbuffer);
|
||||
void rtl92d_firmware_selfreset(struct ieee80211_hw *hw);
|
||||
void rtl92d_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode);
|
||||
void rtl92d_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished);
|
||||
void rtl92d_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus);
|
||||
|
||||
#endif
|
2326
drivers/net/wireless/rtlwifi/rtl8192de/hw.c
Normal file
2326
drivers/net/wireless/rtlwifi/rtl8192de/hw.c
Normal file
File diff suppressed because it is too large
Load diff
66
drivers/net/wireless/rtlwifi/rtl8192de/hw.h
Normal file
66
drivers/net/wireless/rtlwifi/rtl8192de/hw.h
Normal file
|
@ -0,0 +1,66 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2009-2010 Realtek Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
|
||||
* Hsinchu 300, Taiwan.
|
||||
*
|
||||
* Larry Finger <Larry.Finger@lwfinger.net>
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __RTL92DE_HW_H__
|
||||
#define __RTL92DE_HW_H__
|
||||
|
||||
void rtl92de_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
|
||||
void rtl92de_read_eeprom_info(struct ieee80211_hw *hw);
|
||||
void rtl92de_interrupt_recognized(struct ieee80211_hw *hw,
|
||||
u32 *p_inta, u32 *p_intb);
|
||||
int rtl92de_hw_init(struct ieee80211_hw *hw);
|
||||
void rtl92de_card_disable(struct ieee80211_hw *hw);
|
||||
void rtl92de_enable_interrupt(struct ieee80211_hw *hw);
|
||||
void rtl92de_disable_interrupt(struct ieee80211_hw *hw);
|
||||
int rtl92de_set_network_type(struct ieee80211_hw *hw, enum nl80211_iftype type);
|
||||
void rtl92de_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid);
|
||||
void rtl92de_set_qos(struct ieee80211_hw *hw, int aci);
|
||||
void rtl92de_set_beacon_related_registers(struct ieee80211_hw *hw);
|
||||
void rtl92de_set_beacon_interval(struct ieee80211_hw *hw);
|
||||
void rtl92de_update_interrupt_mask(struct ieee80211_hw *hw,
|
||||
u32 add_msr, u32 rm_msr);
|
||||
void rtl92de_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
|
||||
void rtl92de_update_hal_rate_tbl(struct ieee80211_hw *hw,
|
||||
struct ieee80211_sta *sta, u8 rssi_level);
|
||||
void rtl92de_update_channel_access_setting(struct ieee80211_hw *hw);
|
||||
bool rtl92de_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid);
|
||||
void rtl92de_enable_hw_security_config(struct ieee80211_hw *hw);
|
||||
void rtl92de_set_key(struct ieee80211_hw *hw, u32 key_index,
|
||||
u8 *p_macaddr, bool is_group, u8 enc_algo,
|
||||
bool is_wepkey, bool clear_all);
|
||||
|
||||
extern void rtl92de_write_dword_dbi(struct ieee80211_hw *hw, u16 offset,
|
||||
u32 value, u8 direct);
|
||||
extern u32 rtl92de_read_dword_dbi(struct ieee80211_hw *hw, u16 offset,
|
||||
u8 direct);
|
||||
void rtl92de_suspend(struct ieee80211_hw *hw);
|
||||
void rtl92de_resume(struct ieee80211_hw *hw);
|
||||
void rtl92d_linked_set_reg(struct ieee80211_hw *hw);
|
||||
|
||||
#endif
|
159
drivers/net/wireless/rtlwifi/rtl8192de/led.c
Normal file
159
drivers/net/wireless/rtlwifi/rtl8192de/led.c
Normal file
|
@ -0,0 +1,159 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2009-2010 Realtek Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
|
||||
* Hsinchu 300, Taiwan.
|
||||
*
|
||||
* Larry Finger <Larry.Finger@lwfinger.net>
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include "../wifi.h"
|
||||
#include "../pci.h"
|
||||
#include "reg.h"
|
||||
#include "led.h"
|
||||
|
||||
static void _rtl92ce_init_led(struct ieee80211_hw *hw,
|
||||
struct rtl_led *pled, enum rtl_led_pin ledpin)
|
||||
{
|
||||
pled->hw = hw;
|
||||
pled->ledpin = ledpin;
|
||||
pled->ledon = false;
|
||||
}
|
||||
|
||||
void rtl92de_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled)
|
||||
{
|
||||
u8 ledcfg;
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
|
||||
RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
|
||||
("LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin));
|
||||
|
||||
switch (pled->ledpin) {
|
||||
case LED_PIN_GPIO0:
|
||||
break;
|
||||
case LED_PIN_LED0:
|
||||
ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2);
|
||||
|
||||
if ((rtlpriv->efuse.eeprom_did == 0x8176) ||
|
||||
(rtlpriv->efuse.eeprom_did == 0x8193))
|
||||
/* BIT7 of REG_LEDCFG2 should be set to
|
||||
* make sure we could emit the led2. */
|
||||
rtl_write_byte(rtlpriv, REG_LEDCFG2, (ledcfg & 0xf0) |
|
||||
BIT(7) | BIT(5) | BIT(6));
|
||||
else
|
||||
rtl_write_byte(rtlpriv, REG_LEDCFG2, (ledcfg & 0xf0) |
|
||||
BIT(7) | BIT(5));
|
||||
break;
|
||||
case LED_PIN_LED1:
|
||||
ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG1);
|
||||
|
||||
rtl_write_byte(rtlpriv, REG_LEDCFG2, (ledcfg & 0x0f) | BIT(5));
|
||||
break;
|
||||
default:
|
||||
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||
("switch case not process\n"));
|
||||
break;
|
||||
}
|
||||
pled->ledon = true;
|
||||
}
|
||||
|
||||
void rtl92de_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
|
||||
u8 ledcfg;
|
||||
|
||||
RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
|
||||
("LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin));
|
||||
|
||||
ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2);
|
||||
|
||||
switch (pled->ledpin) {
|
||||
case LED_PIN_GPIO0:
|
||||
break;
|
||||
case LED_PIN_LED0:
|
||||
ledcfg &= 0xf0;
|
||||
if (pcipriv->ledctl.led_opendrain == true)
|
||||
rtl_write_byte(rtlpriv, REG_LEDCFG2,
|
||||
(ledcfg | BIT(1) | BIT(5) | BIT(6)));
|
||||
else
|
||||
rtl_write_byte(rtlpriv, REG_LEDCFG2,
|
||||
(ledcfg | BIT(3) | BIT(5) | BIT(6)));
|
||||
break;
|
||||
case LED_PIN_LED1:
|
||||
ledcfg &= 0x0f;
|
||||
rtl_write_byte(rtlpriv, REG_LEDCFG2, (ledcfg | BIT(3)));
|
||||
break;
|
||||
default:
|
||||
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||
("switch case not process\n"));
|
||||
break;
|
||||
}
|
||||
pled->ledon = false;
|
||||
}
|
||||
|
||||
void rtl92de_init_sw_leds(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
|
||||
_rtl92ce_init_led(hw, &(pcipriv->ledctl.sw_led0), LED_PIN_LED0);
|
||||
_rtl92ce_init_led(hw, &(pcipriv->ledctl.sw_led1), LED_PIN_LED1);
|
||||
}
|
||||
|
||||
static void _rtl92ce_sw_led_control(struct ieee80211_hw *hw,
|
||||
enum led_ctl_mode ledaction)
|
||||
{
|
||||
struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
|
||||
struct rtl_led *pLed0 = &(pcipriv->ledctl.sw_led0);
|
||||
switch (ledaction) {
|
||||
case LED_CTL_POWER_ON:
|
||||
case LED_CTL_LINK:
|
||||
case LED_CTL_NO_LINK:
|
||||
rtl92de_sw_led_on(hw, pLed0);
|
||||
break;
|
||||
case LED_CTL_POWER_OFF:
|
||||
rtl92de_sw_led_off(hw, pLed0);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void rtl92de_led_control(struct ieee80211_hw *hw, enum led_ctl_mode ledaction)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
|
||||
|
||||
if ((ppsc->rfoff_reason > RF_CHANGE_BY_PS) &&
|
||||
(ledaction == LED_CTL_TX ||
|
||||
ledaction == LED_CTL_RX ||
|
||||
ledaction == LED_CTL_SITE_SURVEY ||
|
||||
ledaction == LED_CTL_LINK ||
|
||||
ledaction == LED_CTL_NO_LINK ||
|
||||
ledaction == LED_CTL_START_TO_LINK ||
|
||||
ledaction == LED_CTL_POWER_ON)) {
|
||||
return;
|
||||
}
|
||||
RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, ("ledaction %d,\n", ledaction));
|
||||
|
||||
_rtl92ce_sw_led_control(hw, ledaction);
|
||||
}
|
38
drivers/net/wireless/rtlwifi/rtl8192de/led.h
Normal file
38
drivers/net/wireless/rtlwifi/rtl8192de/led.h
Normal file
|
@ -0,0 +1,38 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2009-2010 Realtek Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
|
||||
* Hsinchu 300, Taiwan.
|
||||
*
|
||||
* Larry Finger <Larry.Finger@lwfinger.net>
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __RTL92CE_LED_H__
|
||||
#define __RTL92CE_LED_H__
|
||||
|
||||
void rtl92de_init_sw_leds(struct ieee80211_hw *hw);
|
||||
void rtl92de_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled);
|
||||
void rtl92de_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled);
|
||||
void rtl92de_led_control(struct ieee80211_hw *hw, enum led_ctl_mode ledaction);
|
||||
|
||||
#endif
|
3837
drivers/net/wireless/rtlwifi/rtl8192de/phy.c
Normal file
3837
drivers/net/wireless/rtlwifi/rtl8192de/phy.c
Normal file
File diff suppressed because it is too large
Load diff
178
drivers/net/wireless/rtlwifi/rtl8192de/phy.h
Normal file
178
drivers/net/wireless/rtlwifi/rtl8192de/phy.h
Normal file
|
@ -0,0 +1,178 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2009-2010 Realtek Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
|
||||
* Hsinchu 300, Taiwan.
|
||||
*
|
||||
* Larry Finger <Larry.Finger@lwfinger.net>
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __RTL92D_PHY_H__
|
||||
#define __RTL92D_PHY_H__
|
||||
|
||||
#define MAX_PRECMD_CNT 16
|
||||
#define MAX_RFDEPENDCMD_CNT 16
|
||||
#define MAX_POSTCMD_CNT 16
|
||||
|
||||
#define MAX_DOZE_WAITING_TIMES_9x 64
|
||||
|
||||
#define RT_CANNOT_IO(hw) false
|
||||
#define HIGHPOWER_RADIOA_ARRAYLEN 22
|
||||
|
||||
#define IQK_ADDA_REG_NUM 16
|
||||
#define MAX_TOLERANCE 5
|
||||
#define IQK_DELAY_TIME 1
|
||||
|
||||
#define APK_BB_REG_NUM 5
|
||||
#define APK_AFE_REG_NUM 16
|
||||
#define APK_CURVE_REG_NUM 4
|
||||
#define PATH_NUM 2
|
||||
|
||||
#define LOOP_LIMIT 5
|
||||
#define MAX_STALL_TIME 50
|
||||
#define ANTENNA_DIVERSITY_VALUE 0x80
|
||||
#define MAX_TXPWR_IDX_NMODE_92S 63
|
||||
#define RESET_CNT_LIMIT 3
|
||||
|
||||
#define IQK_ADDA_REG_NUM 16
|
||||
#define IQK_BB_REG_NUM 10
|
||||
#define IQK_BB_REG_NUM_test 6
|
||||
#define IQK_MAC_REG_NUM 4
|
||||
#define RX_INDEX_MAPPING_NUM 15
|
||||
|
||||
#define IQK_DELAY_TIME 1
|
||||
|
||||
#define CT_OFFSET_MAC_ADDR 0X16
|
||||
|
||||
#define CT_OFFSET_CCK_TX_PWR_IDX 0x5A
|
||||
#define CT_OFFSET_HT401S_TX_PWR_IDX 0x60
|
||||
#define CT_OFFSET_HT402S_TX_PWR_IDX_DIFF 0x66
|
||||
#define CT_OFFSET_HT20_TX_PWR_IDX_DIFF 0x69
|
||||
#define CT_OFFSET_OFDM_TX_PWR_IDX_DIFF 0x6C
|
||||
|
||||
#define CT_OFFSET_HT40_MAX_PWR_OFFSET 0x6F
|
||||
#define CT_OFFSET_HT20_MAX_PWR_OFFSET 0x72
|
||||
|
||||
#define CT_OFFSET_CHANNEL_PLAH 0x75
|
||||
#define CT_OFFSET_THERMAL_METER 0x78
|
||||
#define CT_OFFSET_RF_OPTION 0x79
|
||||
#define CT_OFFSET_VERSION 0x7E
|
||||
#define CT_OFFSET_CUSTOMER_ID 0x7F
|
||||
|
||||
enum swchnlcmd_id {
|
||||
CMDID_END,
|
||||
CMDID_SET_TXPOWEROWER_LEVEL,
|
||||
CMDID_BBREGWRITE10,
|
||||
CMDID_WRITEPORT_ULONG,
|
||||
CMDID_WRITEPORT_USHORT,
|
||||
CMDID_WRITEPORT_UCHAR,
|
||||
CMDID_RF_WRITEREG,
|
||||
};
|
||||
|
||||
struct swchnlcmd {
|
||||
enum swchnlcmd_id cmdid;
|
||||
u32 para1;
|
||||
u32 para2;
|
||||
u32 msdelay;
|
||||
};
|
||||
|
||||
enum baseband_config_type {
|
||||
BASEBAND_CONFIG_PHY_REG = 0,
|
||||
BASEBAND_CONFIG_AGC_TAB = 1,
|
||||
};
|
||||
|
||||
enum rf_content {
|
||||
radioa_txt = 0,
|
||||
radiob_txt = 1,
|
||||
radioc_txt = 2,
|
||||
radiod_txt = 3
|
||||
};
|
||||
|
||||
static inline void rtl92d_acquire_cckandrw_pagea_ctl(struct ieee80211_hw *hw,
|
||||
unsigned long *flag)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
|
||||
if (rtlpriv->rtlhal.interfaceindex == 1)
|
||||
spin_lock_irqsave(&rtlpriv->locks.cck_and_rw_pagea_lock, *flag);
|
||||
}
|
||||
|
||||
static inline void rtl92d_release_cckandrw_pagea_ctl(struct ieee80211_hw *hw,
|
||||
unsigned long *flag)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
|
||||
if (rtlpriv->rtlhal.interfaceindex == 1)
|
||||
spin_unlock_irqrestore(&rtlpriv->locks.cck_and_rw_pagea_lock,
|
||||
*flag);
|
||||
}
|
||||
|
||||
extern u32 rtl92d_phy_query_bb_reg(struct ieee80211_hw *hw,
|
||||
u32 regaddr, u32 bitmask);
|
||||
extern void rtl92d_phy_set_bb_reg(struct ieee80211_hw *hw,
|
||||
u32 regaddr, u32 bitmask, u32 data);
|
||||
extern u32 rtl92d_phy_query_rf_reg(struct ieee80211_hw *hw,
|
||||
enum radio_path rfpath, u32 regaddr,
|
||||
u32 bitmask);
|
||||
extern void rtl92d_phy_set_rf_reg(struct ieee80211_hw *hw,
|
||||
enum radio_path rfpath, u32 regaddr,
|
||||
u32 bitmask, u32 data);
|
||||
extern bool rtl92d_phy_mac_config(struct ieee80211_hw *hw);
|
||||
extern bool rtl92d_phy_bb_config(struct ieee80211_hw *hw);
|
||||
extern bool rtl92d_phy_rf_config(struct ieee80211_hw *hw);
|
||||
extern bool rtl92c_phy_config_rf_with_feaderfile(struct ieee80211_hw *hw,
|
||||
enum radio_path rfpath);
|
||||
extern void rtl92d_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw);
|
||||
extern void rtl92d_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel);
|
||||
extern void rtl92d_phy_scan_operation_backup(struct ieee80211_hw *hw,
|
||||
u8 operation);
|
||||
extern void rtl92d_phy_set_bw_mode(struct ieee80211_hw *hw,
|
||||
enum nl80211_channel_type ch_type);
|
||||
extern u8 rtl92d_phy_sw_chnl(struct ieee80211_hw *hw);
|
||||
bool rtl92d_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
|
||||
enum rf_content content,
|
||||
enum radio_path rfpath);
|
||||
bool rtl92d_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype);
|
||||
extern bool rtl92d_phy_set_rf_power_state(struct ieee80211_hw *hw,
|
||||
enum rf_pwrstate rfpwr_state);
|
||||
|
||||
void rtl92d_phy_config_macphymode(struct ieee80211_hw *hw);
|
||||
void rtl92d_phy_config_macphymode_info(struct ieee80211_hw *hw);
|
||||
u8 rtl92d_get_chnlgroup_fromarray(u8 chnl);
|
||||
void rtl92d_phy_set_poweron(struct ieee80211_hw *hw);
|
||||
void rtl92d_phy_config_maccoexist_rfpage(struct ieee80211_hw *hw);
|
||||
bool rtl92d_phy_check_poweroff(struct ieee80211_hw *hw);
|
||||
void rtl92d_phy_lc_calibrate(struct ieee80211_hw *hw);
|
||||
void rtl92d_update_bbrf_configuration(struct ieee80211_hw *hw);
|
||||
void rtl92d_phy_ap_calibrate(struct ieee80211_hw *hw, char delta);
|
||||
void rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw);
|
||||
void rtl92d_phy_reset_iqk_result(struct ieee80211_hw *hw);
|
||||
void rtl92d_release_cckandrw_pagea_ctl(struct ieee80211_hw *hw,
|
||||
unsigned long *flag);
|
||||
void rtl92d_acquire_cckandrw_pagea_ctl(struct ieee80211_hw *hw,
|
||||
unsigned long *flag);
|
||||
u8 rtl92d_get_rightchnlplace_for_iqk(u8 chnl);
|
||||
void rtl92d_phy_reload_iqk_setting(struct ieee80211_hw *hw, u8 channel);
|
||||
void rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw);
|
||||
|
||||
#endif
|
1313
drivers/net/wireless/rtlwifi/rtl8192de/reg.h
Normal file
1313
drivers/net/wireless/rtlwifi/rtl8192de/reg.h
Normal file
File diff suppressed because it is too large
Load diff
628
drivers/net/wireless/rtlwifi/rtl8192de/rf.c
Normal file
628
drivers/net/wireless/rtlwifi/rtl8192de/rf.c
Normal file
|
@ -0,0 +1,628 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2009-2010 Realtek Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
|
||||
* Hsinchu 300, Taiwan.
|
||||
*
|
||||
* Larry Finger <Larry.Finger@lwfinger.net>
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include "../wifi.h"
|
||||
#include "reg.h"
|
||||
#include "def.h"
|
||||
#include "phy.h"
|
||||
#include "rf.h"
|
||||
#include "dm.h"
|
||||
#include "hw.h"
|
||||
|
||||
void rtl92d_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_phy *rtlphy = &(rtlpriv->phy);
|
||||
u8 rfpath;
|
||||
|
||||
switch (bandwidth) {
|
||||
case HT_CHANNEL_WIDTH_20:
|
||||
for (rfpath = 0; rfpath < rtlphy->num_total_rfpath; rfpath++) {
|
||||
rtlphy->rfreg_chnlval[rfpath] = ((rtlphy->rfreg_chnlval
|
||||
[rfpath] & 0xfffff3ff) | 0x0400);
|
||||
rtl_set_rfreg(hw, rfpath, RF_CHNLBW, BIT(10) |
|
||||
BIT(11), 0x01);
|
||||
|
||||
RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
|
||||
("20M RF 0x18 = 0x%x\n",
|
||||
rtlphy->rfreg_chnlval[rfpath]));
|
||||
}
|
||||
|
||||
break;
|
||||
case HT_CHANNEL_WIDTH_20_40:
|
||||
for (rfpath = 0; rfpath < rtlphy->num_total_rfpath; rfpath++) {
|
||||
rtlphy->rfreg_chnlval[rfpath] =
|
||||
((rtlphy->rfreg_chnlval[rfpath] & 0xfffff3ff));
|
||||
rtl_set_rfreg(hw, rfpath, RF_CHNLBW, BIT(10) | BIT(11),
|
||||
0x00);
|
||||
RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
|
||||
("40M RF 0x18 = 0x%x\n",
|
||||
rtlphy->rfreg_chnlval[rfpath]));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||
("unknown bandwidth: %#X\n", bandwidth));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void rtl92d_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
|
||||
u8 *ppowerlevel)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_phy *rtlphy = &(rtlpriv->phy);
|
||||
struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
|
||||
struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
|
||||
u32 tx_agc[2] = {0, 0}, tmpval;
|
||||
bool turbo_scanoff = false;
|
||||
u8 idx1, idx2;
|
||||
u8 *ptr;
|
||||
|
||||
if (rtlefuse->eeprom_regulatory != 0)
|
||||
turbo_scanoff = true;
|
||||
if (mac->act_scanning == true) {
|
||||
tx_agc[RF90_PATH_A] = 0x3f3f3f3f;
|
||||
tx_agc[RF90_PATH_B] = 0x3f3f3f3f;
|
||||
if (turbo_scanoff) {
|
||||
for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
|
||||
tx_agc[idx1] = ppowerlevel[idx1] |
|
||||
(ppowerlevel[idx1] << 8) |
|
||||
(ppowerlevel[idx1] << 16) |
|
||||
(ppowerlevel[idx1] << 24);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
|
||||
tx_agc[idx1] = ppowerlevel[idx1] |
|
||||
(ppowerlevel[idx1] << 8) |
|
||||
(ppowerlevel[idx1] << 16) |
|
||||
(ppowerlevel[idx1] << 24);
|
||||
}
|
||||
if (rtlefuse->eeprom_regulatory == 0) {
|
||||
tmpval = (rtlphy->mcs_txpwrlevel_origoffset[0][6]) +
|
||||
(rtlphy->mcs_txpwrlevel_origoffset[0][7] << 8);
|
||||
tx_agc[RF90_PATH_A] += tmpval;
|
||||
tmpval = (rtlphy->mcs_txpwrlevel_origoffset[0][14]) +
|
||||
(rtlphy->mcs_txpwrlevel_origoffset[0][15] << 24);
|
||||
tx_agc[RF90_PATH_B] += tmpval;
|
||||
}
|
||||
}
|
||||
|
||||
for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
|
||||
ptr = (u8 *) (&(tx_agc[idx1]));
|
||||
for (idx2 = 0; idx2 < 4; idx2++) {
|
||||
if (*ptr > RF6052_MAX_TX_PWR)
|
||||
*ptr = RF6052_MAX_TX_PWR;
|
||||
ptr++;
|
||||
}
|
||||
}
|
||||
|
||||
tmpval = tx_agc[RF90_PATH_A] & 0xff;
|
||||
rtl_set_bbreg(hw, RTXAGC_A_CCK1_MCS32, BMASKBYTE1, tmpval);
|
||||
RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
|
||||
("CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", tmpval,
|
||||
RTXAGC_A_CCK1_MCS32));
|
||||
tmpval = tx_agc[RF90_PATH_A] >> 8;
|
||||
rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval);
|
||||
RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
|
||||
("CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval,
|
||||
RTXAGC_B_CCK11_A_CCK2_11));
|
||||
tmpval = tx_agc[RF90_PATH_B] >> 24;
|
||||
rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, BMASKBYTE0, tmpval);
|
||||
RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
|
||||
("CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval,
|
||||
RTXAGC_B_CCK11_A_CCK2_11));
|
||||
tmpval = tx_agc[RF90_PATH_B] & 0x00ffffff;
|
||||
rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, 0xffffff00, tmpval);
|
||||
RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
|
||||
("CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n", tmpval,
|
||||
RTXAGC_B_CCK1_55_MCS32));
|
||||
}
|
||||
|
||||
static void _rtl92d_phy_get_power_base(struct ieee80211_hw *hw,
|
||||
u8 *ppowerlevel, u8 channel,
|
||||
u32 *ofdmbase, u32 *mcsbase)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_phy *rtlphy = &(rtlpriv->phy);
|
||||
struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
|
||||
u32 powerbase0, powerbase1;
|
||||
u8 legacy_pwrdiff, ht20_pwrdiff;
|
||||
u8 i, powerlevel[2];
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
powerlevel[i] = ppowerlevel[i];
|
||||
legacy_pwrdiff = rtlefuse->txpwr_legacyhtdiff[i][channel - 1];
|
||||
powerbase0 = powerlevel[i] + legacy_pwrdiff;
|
||||
powerbase0 = (powerbase0 << 24) | (powerbase0 << 16) |
|
||||
(powerbase0 << 8) | powerbase0;
|
||||
*(ofdmbase + i) = powerbase0;
|
||||
RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
|
||||
(" [OFDM power base index rf(%c) = 0x%x]\n",
|
||||
((i == 0) ? 'A' : 'B'), *(ofdmbase + i)));
|
||||
}
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20) {
|
||||
ht20_pwrdiff = rtlefuse->txpwr_ht20diff[i][channel - 1];
|
||||
powerlevel[i] += ht20_pwrdiff;
|
||||
}
|
||||
powerbase1 = powerlevel[i];
|
||||
powerbase1 = (powerbase1 << 24) | (powerbase1 << 16) |
|
||||
(powerbase1 << 8) | powerbase1;
|
||||
*(mcsbase + i) = powerbase1;
|
||||
RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
|
||||
(" [MCS power base index rf(%c) = 0x%x]\n",
|
||||
((i == 0) ? 'A' : 'B'), *(mcsbase + i)));
|
||||
}
|
||||
}
|
||||
|
||||
static u8 _rtl92d_phy_get_chnlgroup_bypg(u8 chnlindex)
|
||||
{
|
||||
u8 group;
|
||||
u8 channel_info[59] = {
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
||||
36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
|
||||
60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
|
||||
114, 116, 118, 120, 122, 124, 126, 128, 130, 132,
|
||||
134, 136, 138, 140, 149, 151, 153, 155, 157, 159,
|
||||
161, 163, 165
|
||||
};
|
||||
|
||||
if (channel_info[chnlindex] <= 3) /* Chanel 1-3 */
|
||||
group = 0;
|
||||
else if (channel_info[chnlindex] <= 9) /* Channel 4-9 */
|
||||
group = 1;
|
||||
else if (channel_info[chnlindex] <= 14) /* Channel 10-14 */
|
||||
group = 2;
|
||||
else if (channel_info[chnlindex] <= 64)
|
||||
group = 6;
|
||||
else if (channel_info[chnlindex] <= 140)
|
||||
group = 7;
|
||||
else
|
||||
group = 8;
|
||||
return group;
|
||||
}
|
||||
|
||||
static void _rtl92d_get_txpower_writeval_by_regulatory(struct ieee80211_hw *hw,
|
||||
u8 channel, u8 index,
|
||||
u32 *powerbase0,
|
||||
u32 *powerbase1,
|
||||
u32 *p_outwriteval)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_phy *rtlphy = &(rtlpriv->phy);
|
||||
struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
|
||||
u8 i, chnlgroup = 0, pwr_diff_limit[4];
|
||||
u32 writeval = 0, customer_limit, rf;
|
||||
|
||||
for (rf = 0; rf < 2; rf++) {
|
||||
switch (rtlefuse->eeprom_regulatory) {
|
||||
case 0:
|
||||
chnlgroup = 0;
|
||||
writeval = rtlphy->mcs_txpwrlevel_origoffset
|
||||
[chnlgroup][index +
|
||||
(rf ? 8 : 0)] + ((index < 2) ?
|
||||
powerbase0[rf] :
|
||||
powerbase1[rf]);
|
||||
RTPRINT(rtlpriv, FPHY, PHY_TXPWR, ("RTK better "
|
||||
"performance, writeval(%c) = 0x%x\n",
|
||||
((rf == 0) ? 'A' : 'B'), writeval));
|
||||
break;
|
||||
case 1:
|
||||
if (rtlphy->pwrgroup_cnt == 1)
|
||||
chnlgroup = 0;
|
||||
if (rtlphy->pwrgroup_cnt >= MAX_PG_GROUP) {
|
||||
chnlgroup = _rtl92d_phy_get_chnlgroup_bypg(
|
||||
channel - 1);
|
||||
if (rtlphy->current_chan_bw ==
|
||||
HT_CHANNEL_WIDTH_20)
|
||||
chnlgroup++;
|
||||
else
|
||||
chnlgroup += 4;
|
||||
writeval = rtlphy->mcs_txpwrlevel_origoffset
|
||||
[chnlgroup][index +
|
||||
(rf ? 8 : 0)] + ((index < 2) ?
|
||||
powerbase0[rf] :
|
||||
powerbase1[rf]);
|
||||
RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
|
||||
("Realtek regulatory, "
|
||||
"20MHz, writeval(%c) = 0x%x\n",
|
||||
((rf == 0) ? 'A' : 'B'),
|
||||
writeval));
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
writeval = ((index < 2) ? powerbase0[rf] :
|
||||
powerbase1[rf]);
|
||||
RTPRINT(rtlpriv, FPHY, PHY_TXPWR, ("Better regulatory, "
|
||||
"writeval(%c) = 0x%x\n",
|
||||
((rf == 0) ? 'A' : 'B'), writeval));
|
||||
break;
|
||||
case 3:
|
||||
chnlgroup = 0;
|
||||
if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
|
||||
RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
|
||||
("customer's limit, 40MHz rf(%c) = "
|
||||
"0x%x\n", ((rf == 0) ? 'A' : 'B'),
|
||||
rtlefuse->pwrgroup_ht40[rf]
|
||||
[channel - 1]));
|
||||
} else {
|
||||
RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
|
||||
("customer's limit, 20MHz rf(%c) = "
|
||||
"0x%x\n", ((rf == 0) ? 'A' : 'B'),
|
||||
rtlefuse->pwrgroup_ht20[rf]
|
||||
[channel - 1]));
|
||||
}
|
||||
for (i = 0; i < 4; i++) {
|
||||
pwr_diff_limit[i] =
|
||||
(u8)((rtlphy->mcs_txpwrlevel_origoffset
|
||||
[chnlgroup][index + (rf ? 8 : 0)] &
|
||||
(0x7f << (i * 8))) >> (i * 8));
|
||||
if (rtlphy->current_chan_bw ==
|
||||
HT_CHANNEL_WIDTH_20_40) {
|
||||
if (pwr_diff_limit[i] >
|
||||
rtlefuse->pwrgroup_ht40[rf]
|
||||
[channel - 1])
|
||||
pwr_diff_limit[i] =
|
||||
rtlefuse->pwrgroup_ht40
|
||||
[rf][channel - 1];
|
||||
} else {
|
||||
if (pwr_diff_limit[i] >
|
||||
rtlefuse->pwrgroup_ht20[rf][
|
||||
channel - 1])
|
||||
pwr_diff_limit[i] =
|
||||
rtlefuse->pwrgroup_ht20[rf]
|
||||
[channel - 1];
|
||||
}
|
||||
}
|
||||
customer_limit = (pwr_diff_limit[3] << 24) |
|
||||
(pwr_diff_limit[2] << 16) |
|
||||
(pwr_diff_limit[1] << 8) |
|
||||
(pwr_diff_limit[0]);
|
||||
RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
|
||||
("Customer's limit rf(%c) = 0x%x\n",
|
||||
((rf == 0) ? 'A' : 'B'), customer_limit));
|
||||
writeval = customer_limit + ((index < 2) ?
|
||||
powerbase0[rf] : powerbase1[rf]);
|
||||
RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
|
||||
("Customer, writeval rf(%c)= 0x%x\n",
|
||||
((rf == 0) ? 'A' : 'B'), writeval));
|
||||
break;
|
||||
default:
|
||||
chnlgroup = 0;
|
||||
writeval = rtlphy->mcs_txpwrlevel_origoffset
|
||||
[chnlgroup][index +
|
||||
(rf ? 8 : 0)] + ((index < 2) ?
|
||||
powerbase0[rf] : powerbase1[rf]);
|
||||
RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
|
||||
("RTK better performance, writeval "
|
||||
"rf(%c) = 0x%x\n",
|
||||
((rf == 0) ? 'A' : 'B'), writeval));
|
||||
break;
|
||||
}
|
||||
*(p_outwriteval + rf) = writeval;
|
||||
}
|
||||
}
|
||||
|
||||
static void _rtl92d_write_ofdm_power_reg(struct ieee80211_hw *hw,
|
||||
u8 index, u32 *pvalue)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_phy *rtlphy = &(rtlpriv->phy);
|
||||
static u16 regoffset_a[6] = {
|
||||
RTXAGC_A_RATE18_06, RTXAGC_A_RATE54_24,
|
||||
RTXAGC_A_MCS03_MCS00, RTXAGC_A_MCS07_MCS04,
|
||||
RTXAGC_A_MCS11_MCS08, RTXAGC_A_MCS15_MCS12
|
||||
};
|
||||
static u16 regoffset_b[6] = {
|
||||
RTXAGC_B_RATE18_06, RTXAGC_B_RATE54_24,
|
||||
RTXAGC_B_MCS03_MCS00, RTXAGC_B_MCS07_MCS04,
|
||||
RTXAGC_B_MCS11_MCS08, RTXAGC_B_MCS15_MCS12
|
||||
};
|
||||
u8 i, rf, pwr_val[4];
|
||||
u32 writeval;
|
||||
u16 regoffset;
|
||||
|
||||
for (rf = 0; rf < 2; rf++) {
|
||||
writeval = pvalue[rf];
|
||||
for (i = 0; i < 4; i++) {
|
||||
pwr_val[i] = (u8) ((writeval & (0x7f <<
|
||||
(i * 8))) >> (i * 8));
|
||||
if (pwr_val[i] > RF6052_MAX_TX_PWR)
|
||||
pwr_val[i] = RF6052_MAX_TX_PWR;
|
||||
}
|
||||
writeval = (pwr_val[3] << 24) | (pwr_val[2] << 16) |
|
||||
(pwr_val[1] << 8) | pwr_val[0];
|
||||
if (rf == 0)
|
||||
regoffset = regoffset_a[index];
|
||||
else
|
||||
regoffset = regoffset_b[index];
|
||||
rtl_set_bbreg(hw, regoffset, BMASKDWORD, writeval);
|
||||
RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
|
||||
("Set 0x%x = %08x\n", regoffset, writeval));
|
||||
if (((get_rf_type(rtlphy) == RF_2T2R) &&
|
||||
(regoffset == RTXAGC_A_MCS15_MCS12 ||
|
||||
regoffset == RTXAGC_B_MCS15_MCS12)) ||
|
||||
((get_rf_type(rtlphy) != RF_2T2R) &&
|
||||
(regoffset == RTXAGC_A_MCS07_MCS04 ||
|
||||
regoffset == RTXAGC_B_MCS07_MCS04))) {
|
||||
writeval = pwr_val[3];
|
||||
if (regoffset == RTXAGC_A_MCS15_MCS12 ||
|
||||
regoffset == RTXAGC_A_MCS07_MCS04)
|
||||
regoffset = 0xc90;
|
||||
if (regoffset == RTXAGC_B_MCS15_MCS12 ||
|
||||
regoffset == RTXAGC_B_MCS07_MCS04)
|
||||
regoffset = 0xc98;
|
||||
for (i = 0; i < 3; i++) {
|
||||
if (i != 2)
|
||||
writeval = (writeval > 8) ?
|
||||
(writeval - 8) : 0;
|
||||
else
|
||||
writeval = (writeval > 6) ?
|
||||
(writeval - 6) : 0;
|
||||
rtl_write_byte(rtlpriv, (u32) (regoffset + i),
|
||||
(u8) writeval);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void rtl92d_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw,
|
||||
u8 *ppowerlevel, u8 channel)
|
||||
{
|
||||
u32 writeval[2], powerbase0[2], powerbase1[2];
|
||||
u8 index;
|
||||
|
||||
_rtl92d_phy_get_power_base(hw, ppowerlevel, channel,
|
||||
&powerbase0[0], &powerbase1[0]);
|
||||
for (index = 0; index < 6; index++) {
|
||||
_rtl92d_get_txpower_writeval_by_regulatory(hw,
|
||||
channel, index, &powerbase0[0],
|
||||
&powerbase1[0], &writeval[0]);
|
||||
_rtl92d_write_ofdm_power_reg(hw, index, &writeval[0]);
|
||||
}
|
||||
}
|
||||
|
||||
bool rtl92d_phy_enable_anotherphy(struct ieee80211_hw *hw, bool bmac0)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
|
||||
u8 u1btmp;
|
||||
u8 direct = bmac0 == true ? BIT(3) | BIT(2) : BIT(3);
|
||||
u8 mac_reg = bmac0 == true ? REG_MAC1 : REG_MAC0;
|
||||
u8 mac_on_bit = bmac0 == true ? MAC1_ON : MAC0_ON;
|
||||
bool bresult = true; /* true: need to enable BB/RF power */
|
||||
|
||||
rtlhal->during_mac0init_radiob = false;
|
||||
rtlhal->during_mac1init_radioa = false;
|
||||
RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, ("===>\n"));
|
||||
/* MAC0 Need PHY1 load radio_b.txt . Driver use DBI to write. */
|
||||
u1btmp = rtl_read_byte(rtlpriv, mac_reg);
|
||||
if (!(u1btmp & mac_on_bit)) {
|
||||
RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("enable BB & RF\n"));
|
||||
/* Enable BB and RF power */
|
||||
rtl92de_write_dword_dbi(hw, REG_SYS_ISO_CTRL,
|
||||
rtl92de_read_dword_dbi(hw, REG_SYS_ISO_CTRL, direct) |
|
||||
BIT(29) | BIT(16) | BIT(17), direct);
|
||||
} else {
|
||||
/* We think if MAC1 is ON,then radio_a.txt
|
||||
* and radio_b.txt has been load. */
|
||||
bresult = false;
|
||||
}
|
||||
RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, ("<===\n"));
|
||||
return bresult;
|
||||
|
||||
}
|
||||
|
||||
void rtl92d_phy_powerdown_anotherphy(struct ieee80211_hw *hw, bool bmac0)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
|
||||
u8 u1btmp;
|
||||
u8 direct = bmac0 == true ? BIT(3) | BIT(2) : BIT(3);
|
||||
u8 mac_reg = bmac0 == true ? REG_MAC1 : REG_MAC0;
|
||||
u8 mac_on_bit = bmac0 == true ? MAC1_ON : MAC0_ON;
|
||||
|
||||
rtlhal->during_mac0init_radiob = false;
|
||||
rtlhal->during_mac1init_radioa = false;
|
||||
RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, ("====>\n"));
|
||||
/* check MAC0 enable or not again now, if
|
||||
* enabled, not power down radio A. */
|
||||
u1btmp = rtl_read_byte(rtlpriv, mac_reg);
|
||||
if (!(u1btmp & mac_on_bit)) {
|
||||
RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, ("power down\n"));
|
||||
/* power down RF radio A according to YuNan's advice. */
|
||||
rtl92de_write_dword_dbi(hw, RFPGA0_XA_LSSIPARAMETER,
|
||||
0x00000000, direct);
|
||||
}
|
||||
RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, ("<====\n"));
|
||||
}
|
||||
|
||||
bool rtl92d_phy_rf6052_config(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_phy *rtlphy = &(rtlpriv->phy);
|
||||
bool rtstatus = true;
|
||||
struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
|
||||
u32 u4_regvalue = 0;
|
||||
u8 rfpath;
|
||||
struct bb_reg_def *pphyreg;
|
||||
bool mac1_initradioa_first = false, mac0_initradiob_first = false;
|
||||
bool need_pwrdown_radioa = false, need_pwrdown_radiob = false;
|
||||
bool true_bpath = false;
|
||||
|
||||
if (rtlphy->rf_type == RF_1T1R)
|
||||
rtlphy->num_total_rfpath = 1;
|
||||
else
|
||||
rtlphy->num_total_rfpath = 2;
|
||||
|
||||
/* Single phy mode: use radio_a radio_b config path_A path_B */
|
||||
/* seperately by MAC0, and MAC1 needn't configure RF; */
|
||||
/* Dual PHY mode:MAC0 use radio_a config 1st phy path_A, */
|
||||
/* MAC1 use radio_b config 2nd PHY path_A. */
|
||||
/* DMDP,MAC0 on G band,MAC1 on A band. */
|
||||
if (rtlhal->macphymode == DUALMAC_DUALPHY) {
|
||||
if (rtlhal->current_bandtype == BAND_ON_2_4G &&
|
||||
rtlhal->interfaceindex == 0) {
|
||||
/* MAC0 needs PHY1 load radio_b.txt.
|
||||
* Driver use DBI to write. */
|
||||
if (rtl92d_phy_enable_anotherphy(hw, true)) {
|
||||
rtlphy->num_total_rfpath = 2;
|
||||
mac0_initradiob_first = true;
|
||||
} else {
|
||||
/* We think if MAC1 is ON,then radio_a.txt and
|
||||
* radio_b.txt has been load. */
|
||||
return rtstatus;
|
||||
}
|
||||
} else if (rtlhal->current_bandtype == BAND_ON_5G &&
|
||||
rtlhal->interfaceindex == 1) {
|
||||
/* MAC1 needs PHY0 load radio_a.txt.
|
||||
* Driver use DBI to write. */
|
||||
if (rtl92d_phy_enable_anotherphy(hw, false)) {
|
||||
rtlphy->num_total_rfpath = 2;
|
||||
mac1_initradioa_first = true;
|
||||
} else {
|
||||
/* We think if MAC0 is ON,then radio_a.txt and
|
||||
* radio_b.txt has been load. */
|
||||
return rtstatus;
|
||||
}
|
||||
} else if (rtlhal->interfaceindex == 1) {
|
||||
/* MAC0 enabled, only init radia B. */
|
||||
true_bpath = true;
|
||||
}
|
||||
}
|
||||
|
||||
for (rfpath = 0; rfpath < rtlphy->num_total_rfpath; rfpath++) {
|
||||
/* Mac1 use PHY0 write */
|
||||
if (mac1_initradioa_first) {
|
||||
if (rfpath == RF90_PATH_A) {
|
||||
rtlhal->during_mac1init_radioa = true;
|
||||
need_pwrdown_radioa = true;
|
||||
} else if (rfpath == RF90_PATH_B) {
|
||||
rtlhal->during_mac1init_radioa = false;
|
||||
mac1_initradioa_first = false;
|
||||
rfpath = RF90_PATH_A;
|
||||
true_bpath = true;
|
||||
rtlphy->num_total_rfpath = 1;
|
||||
}
|
||||
} else if (mac0_initradiob_first) {
|
||||
/* Mac0 use PHY1 write */
|
||||
if (rfpath == RF90_PATH_A)
|
||||
rtlhal->during_mac0init_radiob = false;
|
||||
if (rfpath == RF90_PATH_B) {
|
||||
rtlhal->during_mac0init_radiob = true;
|
||||
mac0_initradiob_first = false;
|
||||
need_pwrdown_radiob = true;
|
||||
rfpath = RF90_PATH_A;
|
||||
true_bpath = true;
|
||||
rtlphy->num_total_rfpath = 1;
|
||||
}
|
||||
}
|
||||
pphyreg = &rtlphy->phyreg_def[rfpath];
|
||||
switch (rfpath) {
|
||||
case RF90_PATH_A:
|
||||
case RF90_PATH_C:
|
||||
u4_regvalue = rtl_get_bbreg(hw, pphyreg->rfintfs,
|
||||
BRFSI_RFENV);
|
||||
break;
|
||||
case RF90_PATH_B:
|
||||
case RF90_PATH_D:
|
||||
u4_regvalue = rtl_get_bbreg(hw, pphyreg->rfintfs,
|
||||
BRFSI_RFENV << 16);
|
||||
break;
|
||||
}
|
||||
rtl_set_bbreg(hw, pphyreg->rfintfe, BRFSI_RFENV << 16, 0x1);
|
||||
udelay(1);
|
||||
rtl_set_bbreg(hw, pphyreg->rfintfo, BRFSI_RFENV, 0x1);
|
||||
udelay(1);
|
||||
/* Set bit number of Address and Data for RF register */
|
||||
/* Set 1 to 4 bits for 8255 */
|
||||
rtl_set_bbreg(hw, pphyreg->rfhssi_para2,
|
||||
B3WIREADDRESSLENGTH, 0x0);
|
||||
udelay(1);
|
||||
/* Set 0 to 12 bits for 8255 */
|
||||
rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREDATALENGTH, 0x0);
|
||||
udelay(1);
|
||||
switch (rfpath) {
|
||||
case RF90_PATH_A:
|
||||
if (true_bpath == true)
|
||||
rtstatus = rtl92d_phy_config_rf_with_headerfile(
|
||||
hw, radiob_txt,
|
||||
(enum radio_path)rfpath);
|
||||
else
|
||||
rtstatus = rtl92d_phy_config_rf_with_headerfile(
|
||||
hw, radioa_txt,
|
||||
(enum radio_path)rfpath);
|
||||
break;
|
||||
case RF90_PATH_B:
|
||||
rtstatus =
|
||||
rtl92d_phy_config_rf_with_headerfile(hw, radiob_txt,
|
||||
(enum radio_path) rfpath);
|
||||
break;
|
||||
case RF90_PATH_C:
|
||||
break;
|
||||
case RF90_PATH_D:
|
||||
break;
|
||||
}
|
||||
switch (rfpath) {
|
||||
case RF90_PATH_A:
|
||||
case RF90_PATH_C:
|
||||
rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV,
|
||||
u4_regvalue);
|
||||
break;
|
||||
case RF90_PATH_B:
|
||||
case RF90_PATH_D:
|
||||
rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV << 16,
|
||||
u4_regvalue);
|
||||
break;
|
||||
}
|
||||
if (rtstatus != true) {
|
||||
RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
|
||||
("Radio[%d] Fail!!", rfpath));
|
||||
goto phy_rf_cfg_fail;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* check MAC0 enable or not again, if enabled,
|
||||
* not power down radio A. */
|
||||
/* check MAC1 enable or not again, if enabled,
|
||||
* not power down radio B. */
|
||||
if (need_pwrdown_radioa)
|
||||
rtl92d_phy_powerdown_anotherphy(hw, false);
|
||||
else if (need_pwrdown_radiob)
|
||||
rtl92d_phy_powerdown_anotherphy(hw, true);
|
||||
RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, ("<---\n"));
|
||||
return rtstatus;
|
||||
|
||||
phy_rf_cfg_fail:
|
||||
return rtstatus;
|
||||
}
|
44
drivers/net/wireless/rtlwifi/rtl8192de/rf.h
Normal file
44
drivers/net/wireless/rtlwifi/rtl8192de/rf.h
Normal file
|
@ -0,0 +1,44 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2009-2010 Realtek Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
|
||||
* Hsinchu 300, Taiwan.
|
||||
*
|
||||
* Larry Finger <Larry.Finger@lwfinger.net>
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __RTL92D_RF_H__
|
||||
#define __RTL92D_RF_H__
|
||||
|
||||
extern void rtl92d_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw,
|
||||
u8 bandwidth);
|
||||
extern void rtl92d_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
|
||||
u8 *ppowerlevel);
|
||||
extern void rtl92d_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw,
|
||||
u8 *ppowerlevel, u8 channel);
|
||||
extern bool rtl92d_phy_rf6052_config(struct ieee80211_hw *hw);
|
||||
extern bool rtl92d_phy_enable_anotherphy(struct ieee80211_hw *hw, bool bmac0);
|
||||
extern void rtl92d_phy_powerdown_anotherphy(struct ieee80211_hw *hw,
|
||||
bool bmac0);
|
||||
|
||||
#endif
|
423
drivers/net/wireless/rtlwifi/rtl8192de/sw.c
Normal file
423
drivers/net/wireless/rtlwifi/rtl8192de/sw.c
Normal file
|
@ -0,0 +1,423 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2009-2010 Realtek Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
|
||||
* Hsinchu 300, Taiwan.
|
||||
*
|
||||
* Larry Finger <Larry.Finger@lwfinger.net>
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include <linux/vmalloc.h>
|
||||
|
||||
#include "../wifi.h"
|
||||
#include "../core.h"
|
||||
#include "../pci.h"
|
||||
#include "reg.h"
|
||||
#include "def.h"
|
||||
#include "phy.h"
|
||||
#include "dm.h"
|
||||
#include "hw.h"
|
||||
#include "sw.h"
|
||||
#include "trx.h"
|
||||
#include "led.h"
|
||||
|
||||
static void rtl92d_init_aspm_vars(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
|
||||
|
||||
/*close ASPM for AMD defaultly */
|
||||
rtlpci->const_amdpci_aspm = 0;
|
||||
|
||||
/*
|
||||
* ASPM PS mode.
|
||||
* 0 - Disable ASPM,
|
||||
* 1 - Enable ASPM without Clock Req,
|
||||
* 2 - Enable ASPM with Clock Req,
|
||||
* 3 - Alwyas Enable ASPM with Clock Req,
|
||||
* 4 - Always Enable ASPM without Clock Req.
|
||||
* set defult to RTL8192CE:3 RTL8192E:2
|
||||
* */
|
||||
rtlpci->const_pci_aspm = 3;
|
||||
|
||||
/*Setting for PCI-E device */
|
||||
rtlpci->const_devicepci_aspm_setting = 0x03;
|
||||
|
||||
/*Setting for PCI-E bridge */
|
||||
rtlpci->const_hostpci_aspm_setting = 0x02;
|
||||
|
||||
/*
|
||||
* In Hw/Sw Radio Off situation.
|
||||
* 0 - Default,
|
||||
* 1 - From ASPM setting without low Mac Pwr,
|
||||
* 2 - From ASPM setting with low Mac Pwr,
|
||||
* 3 - Bus D3
|
||||
* set default to RTL8192CE:0 RTL8192SE:2
|
||||
*/
|
||||
rtlpci->const_hwsw_rfoff_d3 = 0;
|
||||
|
||||
/*
|
||||
* This setting works for those device with
|
||||
* backdoor ASPM setting such as EPHY setting.
|
||||
* 0 - Not support ASPM,
|
||||
* 1 - Support ASPM,
|
||||
* 2 - According to chipset.
|
||||
*/
|
||||
rtlpci->const_support_pciaspm = 1;
|
||||
}
|
||||
|
||||
static int rtl92d_init_sw_vars(struct ieee80211_hw *hw)
|
||||
{
|
||||
int err;
|
||||
u8 tid;
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
|
||||
const struct firmware *firmware;
|
||||
static int header_print;
|
||||
|
||||
rtlpriv->dm.dm_initialgain_enable = true;
|
||||
rtlpriv->dm.dm_flag = 0;
|
||||
rtlpriv->dm.disable_framebursting = 0;
|
||||
rtlpriv->dm.thermalvalue = 0;
|
||||
rtlpriv->dm.useramask = 1;
|
||||
|
||||
/* dual mac */
|
||||
if (rtlpriv->rtlhal.current_bandtype == BAND_ON_5G)
|
||||
rtlpriv->phy.current_channel = 36;
|
||||
else
|
||||
rtlpriv->phy.current_channel = 1;
|
||||
|
||||
if (rtlpriv->rtlhal.macphymode != SINGLEMAC_SINGLEPHY) {
|
||||
rtlpriv->rtlhal.disable_amsdu_8k = true;
|
||||
/* No long RX - reduce fragmentation */
|
||||
rtlpci->rxbuffersize = 4096;
|
||||
}
|
||||
|
||||
rtlpci->transmit_config = CFENDFORM | BIT(12) | BIT(13);
|
||||
|
||||
rtlpci->receive_config = (
|
||||
RCR_APPFCS
|
||||
| RCR_AMF
|
||||
| RCR_ADF
|
||||
| RCR_APP_MIC
|
||||
| RCR_APP_ICV
|
||||
| RCR_AICV
|
||||
| RCR_ACRC32
|
||||
| RCR_AB
|
||||
| RCR_AM
|
||||
| RCR_APM
|
||||
| RCR_APP_PHYST_RXFF
|
||||
| RCR_HTC_LOC_CTRL
|
||||
);
|
||||
|
||||
rtlpci->irq_mask[0] = (u32) (
|
||||
IMR_ROK
|
||||
| IMR_VODOK
|
||||
| IMR_VIDOK
|
||||
| IMR_BEDOK
|
||||
| IMR_BKDOK
|
||||
| IMR_MGNTDOK
|
||||
| IMR_HIGHDOK
|
||||
| IMR_BDOK
|
||||
| IMR_RDU
|
||||
| IMR_RXFOVW
|
||||
);
|
||||
|
||||
rtlpci->irq_mask[1] = (u32) (IMR_CPWM | IMR_C2HCMD);
|
||||
|
||||
/* for LPS & IPS */
|
||||
rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps;
|
||||
rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
|
||||
rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps;
|
||||
rtlpriv->psc.reg_fwctrl_lps = 3;
|
||||
rtlpriv->psc.reg_max_lps_awakeintvl = 5;
|
||||
/* for ASPM, you can close aspm through
|
||||
* set const_support_pciaspm = 0 */
|
||||
rtl92d_init_aspm_vars(hw);
|
||||
|
||||
if (rtlpriv->psc.reg_fwctrl_lps == 1)
|
||||
rtlpriv->psc.fwctrl_psmode = FW_PS_MIN_MODE;
|
||||
else if (rtlpriv->psc.reg_fwctrl_lps == 2)
|
||||
rtlpriv->psc.fwctrl_psmode = FW_PS_MAX_MODE;
|
||||
else if (rtlpriv->psc.reg_fwctrl_lps == 3)
|
||||
rtlpriv->psc.fwctrl_psmode = FW_PS_DTIM_MODE;
|
||||
|
||||
/* for firmware buf */
|
||||
rtlpriv->rtlhal.pfirmware = vzalloc(0x8000);
|
||||
if (!rtlpriv->rtlhal.pfirmware) {
|
||||
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||
("Can't alloc buffer for fw.\n"));
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (!header_print) {
|
||||
printk(KERN_INFO "rtl8192de: Driver for Realtek RTL8192DE"
|
||||
" WLAN interface");
|
||||
printk(KERN_INFO "rtl8192de: Loading firmware file %s\n",
|
||||
rtlpriv->cfg->fw_name);
|
||||
header_print++;
|
||||
}
|
||||
/* request fw */
|
||||
err = request_firmware(&firmware, rtlpriv->cfg->fw_name,
|
||||
rtlpriv->io.dev);
|
||||
if (err) {
|
||||
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||
("Failed to request firmware!\n"));
|
||||
return 1;
|
||||
}
|
||||
if (firmware->size > 0x8000) {
|
||||
RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
|
||||
("Firmware is too big!\n"));
|
||||
release_firmware(firmware);
|
||||
return 1;
|
||||
}
|
||||
memcpy(rtlpriv->rtlhal.pfirmware, firmware->data, firmware->size);
|
||||
rtlpriv->rtlhal.fwsize = firmware->size;
|
||||
release_firmware(firmware);
|
||||
|
||||
/* for early mode */
|
||||
rtlpriv->rtlhal.earlymode_enable = true;
|
||||
for (tid = 0; tid < 8; tid++)
|
||||
skb_queue_head_init(&rtlpriv->mac80211.skb_waitq[tid]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void rtl92d_deinit_sw_vars(struct ieee80211_hw *hw)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
u8 tid;
|
||||
|
||||
if (rtlpriv->rtlhal.pfirmware) {
|
||||
vfree(rtlpriv->rtlhal.pfirmware);
|
||||
rtlpriv->rtlhal.pfirmware = NULL;
|
||||
}
|
||||
for (tid = 0; tid < 8; tid++)
|
||||
skb_queue_purge(&rtlpriv->mac80211.skb_waitq[tid]);
|
||||
}
|
||||
|
||||
static struct rtl_hal_ops rtl8192de_hal_ops = {
|
||||
.init_sw_vars = rtl92d_init_sw_vars,
|
||||
.deinit_sw_vars = rtl92d_deinit_sw_vars,
|
||||
.read_eeprom_info = rtl92de_read_eeprom_info,
|
||||
.interrupt_recognized = rtl92de_interrupt_recognized,
|
||||
.hw_init = rtl92de_hw_init,
|
||||
.hw_disable = rtl92de_card_disable,
|
||||
.hw_suspend = rtl92de_suspend,
|
||||
.hw_resume = rtl92de_resume,
|
||||
.enable_interrupt = rtl92de_enable_interrupt,
|
||||
.disable_interrupt = rtl92de_disable_interrupt,
|
||||
.set_network_type = rtl92de_set_network_type,
|
||||
.set_chk_bssid = rtl92de_set_check_bssid,
|
||||
.set_qos = rtl92de_set_qos,
|
||||
.set_bcn_reg = rtl92de_set_beacon_related_registers,
|
||||
.set_bcn_intv = rtl92de_set_beacon_interval,
|
||||
.update_interrupt_mask = rtl92de_update_interrupt_mask,
|
||||
.get_hw_reg = rtl92de_get_hw_reg,
|
||||
.set_hw_reg = rtl92de_set_hw_reg,
|
||||
.update_rate_tbl = rtl92de_update_hal_rate_tbl,
|
||||
.fill_tx_desc = rtl92de_tx_fill_desc,
|
||||
.fill_tx_cmddesc = rtl92de_tx_fill_cmddesc,
|
||||
.query_rx_desc = rtl92de_rx_query_desc,
|
||||
.set_channel_access = rtl92de_update_channel_access_setting,
|
||||
.radio_onoff_checking = rtl92de_gpio_radio_on_off_checking,
|
||||
.set_bw_mode = rtl92d_phy_set_bw_mode,
|
||||
.switch_channel = rtl92d_phy_sw_chnl,
|
||||
.dm_watchdog = rtl92d_dm_watchdog,
|
||||
.scan_operation_backup = rtl92d_phy_scan_operation_backup,
|
||||
.set_rf_power_state = rtl92d_phy_set_rf_power_state,
|
||||
.led_control = rtl92de_led_control,
|
||||
.set_desc = rtl92de_set_desc,
|
||||
.get_desc = rtl92de_get_desc,
|
||||
.tx_polling = rtl92de_tx_polling,
|
||||
.enable_hw_sec = rtl92de_enable_hw_security_config,
|
||||
.set_key = rtl92de_set_key,
|
||||
.init_sw_leds = rtl92de_init_sw_leds,
|
||||
.get_bbreg = rtl92d_phy_query_bb_reg,
|
||||
.set_bbreg = rtl92d_phy_set_bb_reg,
|
||||
.get_rfreg = rtl92d_phy_query_rf_reg,
|
||||
.set_rfreg = rtl92d_phy_set_rf_reg,
|
||||
.linked_set_reg = rtl92d_linked_set_reg,
|
||||
};
|
||||
|
||||
static struct rtl_mod_params rtl92de_mod_params = {
|
||||
.sw_crypto = false,
|
||||
.inactiveps = true,
|
||||
.swctrl_lps = true,
|
||||
.fwctrl_lps = false,
|
||||
};
|
||||
|
||||
static struct rtl_hal_cfg rtl92de_hal_cfg = {
|
||||
.bar_id = 2,
|
||||
.write_readback = true,
|
||||
.name = "rtl8192de",
|
||||
.fw_name = "rtlwifi/rtl8192defw.bin",
|
||||
.ops = &rtl8192de_hal_ops,
|
||||
.mod_params = &rtl92de_mod_params,
|
||||
|
||||
.maps[SYS_ISO_CTRL] = REG_SYS_ISO_CTRL,
|
||||
.maps[SYS_FUNC_EN] = REG_SYS_FUNC_EN,
|
||||
.maps[SYS_CLK] = REG_SYS_CLKR,
|
||||
.maps[MAC_RCR_AM] = RCR_AM,
|
||||
.maps[MAC_RCR_AB] = RCR_AB,
|
||||
.maps[MAC_RCR_ACRC32] = RCR_ACRC32,
|
||||
.maps[MAC_RCR_ACF] = RCR_ACF,
|
||||
.maps[MAC_RCR_AAP] = RCR_AAP,
|
||||
|
||||
.maps[EFUSE_TEST] = REG_EFUSE_TEST,
|
||||
.maps[EFUSE_CTRL] = REG_EFUSE_CTRL,
|
||||
.maps[EFUSE_CLK] = 0, /* just for 92se */
|
||||
.maps[EFUSE_CLK_CTRL] = REG_EFUSE_CTRL,
|
||||
.maps[EFUSE_PWC_EV12V] = PWC_EV12V,
|
||||
.maps[EFUSE_FEN_ELDR] = FEN_ELDR,
|
||||
.maps[EFUSE_LOADER_CLK_EN] = LOADER_CLK_EN,
|
||||
.maps[EFUSE_ANA8M] = 0, /* just for 92se */
|
||||
.maps[EFUSE_HWSET_MAX_SIZE] = HWSET_MAX_SIZE,
|
||||
.maps[EFUSE_MAX_SECTION_MAP] = EFUSE_MAX_SECTION,
|
||||
.maps[EFUSE_REAL_CONTENT_SIZE] = EFUSE_REAL_CONTENT_LEN,
|
||||
|
||||
.maps[RWCAM] = REG_CAMCMD,
|
||||
.maps[WCAMI] = REG_CAMWRITE,
|
||||
.maps[RCAMO] = REG_CAMREAD,
|
||||
.maps[CAMDBG] = REG_CAMDBG,
|
||||
.maps[SECR] = REG_SECCFG,
|
||||
.maps[SEC_CAM_NONE] = CAM_NONE,
|
||||
.maps[SEC_CAM_WEP40] = CAM_WEP40,
|
||||
.maps[SEC_CAM_TKIP] = CAM_TKIP,
|
||||
.maps[SEC_CAM_AES] = CAM_AES,
|
||||
.maps[SEC_CAM_WEP104] = CAM_WEP104,
|
||||
|
||||
.maps[RTL_IMR_BCNDMAINT6] = IMR_BCNDMAINT6,
|
||||
.maps[RTL_IMR_BCNDMAINT5] = IMR_BCNDMAINT5,
|
||||
.maps[RTL_IMR_BCNDMAINT4] = IMR_BCNDMAINT4,
|
||||
.maps[RTL_IMR_BCNDMAINT3] = IMR_BCNDMAINT3,
|
||||
.maps[RTL_IMR_BCNDMAINT2] = IMR_BCNDMAINT2,
|
||||
.maps[RTL_IMR_BCNDMAINT1] = IMR_BCNDMAINT1,
|
||||
.maps[RTL_IMR_BCNDOK8] = IMR_BCNDOK8,
|
||||
.maps[RTL_IMR_BCNDOK7] = IMR_BCNDOK7,
|
||||
.maps[RTL_IMR_BCNDOK6] = IMR_BCNDOK6,
|
||||
.maps[RTL_IMR_BCNDOK5] = IMR_BCNDOK5,
|
||||
.maps[RTL_IMR_BCNDOK4] = IMR_BCNDOK4,
|
||||
.maps[RTL_IMR_BCNDOK3] = IMR_BCNDOK3,
|
||||
.maps[RTL_IMR_BCNDOK2] = IMR_BCNDOK2,
|
||||
.maps[RTL_IMR_BCNDOK1] = IMR_BCNDOK1,
|
||||
.maps[RTL_IMR_TIMEOUT2] = IMR_TIMEOUT2,
|
||||
.maps[RTL_IMR_TIMEOUT1] = IMR_TIMEOUT1,
|
||||
|
||||
.maps[RTL_IMR_TXFOVW] = IMR_TXFOVW,
|
||||
.maps[RTL_IMR_PSTIMEOUT] = IMR_PSTIMEOUT,
|
||||
.maps[RTL_IMR_BcnInt] = IMR_BcnInt,
|
||||
.maps[RTL_IMR_RXFOVW] = IMR_RXFOVW,
|
||||
.maps[RTL_IMR_RDU] = IMR_RDU,
|
||||
.maps[RTL_IMR_ATIMEND] = IMR_ATIMEND,
|
||||
.maps[RTL_IMR_BDOK] = IMR_BDOK,
|
||||
.maps[RTL_IMR_MGNTDOK] = IMR_MGNTDOK,
|
||||
.maps[RTL_IMR_TBDER] = IMR_TBDER,
|
||||
.maps[RTL_IMR_HIGHDOK] = IMR_HIGHDOK,
|
||||
.maps[RTL_IMR_TBDOK] = IMR_TBDOK,
|
||||
.maps[RTL_IMR_BKDOK] = IMR_BKDOK,
|
||||
.maps[RTL_IMR_BEDOK] = IMR_BEDOK,
|
||||
.maps[RTL_IMR_VIDOK] = IMR_VIDOK,
|
||||
.maps[RTL_IMR_VODOK] = IMR_VODOK,
|
||||
.maps[RTL_IMR_ROK] = IMR_ROK,
|
||||
.maps[RTL_IBSS_INT_MASKS] = (IMR_BcnInt | IMR_TBDOK | IMR_TBDER),
|
||||
|
||||
.maps[RTL_RC_CCK_RATE1M] = DESC92D_RATE1M,
|
||||
.maps[RTL_RC_CCK_RATE2M] = DESC92D_RATE2M,
|
||||
.maps[RTL_RC_CCK_RATE5_5M] = DESC92D_RATE5_5M,
|
||||
.maps[RTL_RC_CCK_RATE11M] = DESC92D_RATE11M,
|
||||
.maps[RTL_RC_OFDM_RATE6M] = DESC92D_RATE6M,
|
||||
.maps[RTL_RC_OFDM_RATE9M] = DESC92D_RATE9M,
|
||||
.maps[RTL_RC_OFDM_RATE12M] = DESC92D_RATE12M,
|
||||
.maps[RTL_RC_OFDM_RATE18M] = DESC92D_RATE18M,
|
||||
.maps[RTL_RC_OFDM_RATE24M] = DESC92D_RATE24M,
|
||||
.maps[RTL_RC_OFDM_RATE36M] = DESC92D_RATE36M,
|
||||
.maps[RTL_RC_OFDM_RATE48M] = DESC92D_RATE48M,
|
||||
.maps[RTL_RC_OFDM_RATE54M] = DESC92D_RATE54M,
|
||||
|
||||
.maps[RTL_RC_HT_RATEMCS7] = DESC92D_RATEMCS7,
|
||||
.maps[RTL_RC_HT_RATEMCS15] = DESC92D_RATEMCS15,
|
||||
};
|
||||
|
||||
static struct pci_device_id rtl92de_pci_ids[] __devinitdata = {
|
||||
{RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8193, rtl92de_hal_cfg)},
|
||||
{RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x002B, rtl92de_hal_cfg)},
|
||||
{},
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(pci, rtl92de_pci_ids);
|
||||
|
||||
MODULE_AUTHOR("lizhaoming <chaoming_li@realsil.com.cn>");
|
||||
MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>");
|
||||
MODULE_AUTHOR("Larry Finger <Larry.Finger@lwfinger.net>");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_DESCRIPTION("Realtek 8192DE 802.11n Dual Mac PCI wireless");
|
||||
MODULE_FIRMWARE("rtlwifi/rtl8192defw.bin");
|
||||
|
||||
module_param_named(swenc, rtl92de_mod_params.sw_crypto, bool, 0444);
|
||||
module_param_named(ips, rtl92de_mod_params.inactiveps, bool, 0444);
|
||||
module_param_named(swlps, rtl92de_mod_params.swctrl_lps, bool, 0444);
|
||||
module_param_named(fwlps, rtl92de_mod_params.fwctrl_lps, bool, 0444);
|
||||
MODULE_PARM_DESC(swenc, "using hardware crypto (default 0 [hardware])\n");
|
||||
MODULE_PARM_DESC(ips, "using no link power save (default 1 is open)\n");
|
||||
MODULE_PARM_DESC(swlps, "using linked sw control power save (default 1"
|
||||
" is open)\n");
|
||||
|
||||
static struct pci_driver rtl92de_driver = {
|
||||
.name = KBUILD_MODNAME,
|
||||
.id_table = rtl92de_pci_ids,
|
||||
.probe = rtl_pci_probe,
|
||||
.remove = rtl_pci_disconnect,
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
.suspend = rtl_pci_suspend,
|
||||
.resume = rtl_pci_resume,
|
||||
#endif
|
||||
|
||||
};
|
||||
|
||||
/* add global spin lock to solve the problem that
|
||||
* Dul mac register operation on the same time */
|
||||
spinlock_t globalmutex_power;
|
||||
spinlock_t globalmutex_for_fwdownload;
|
||||
spinlock_t globalmutex_for_power_and_efuse;
|
||||
|
||||
static int __init rtl92de_module_init(void)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
spin_lock_init(&globalmutex_power);
|
||||
spin_lock_init(&globalmutex_for_fwdownload);
|
||||
spin_lock_init(&globalmutex_for_power_and_efuse);
|
||||
|
||||
ret = pci_register_driver(&rtl92de_driver);
|
||||
if (ret)
|
||||
RT_ASSERT(false, (": No device found\n"));
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit rtl92de_module_exit(void)
|
||||
{
|
||||
pci_unregister_driver(&rtl92de_driver);
|
||||
}
|
||||
|
||||
module_init(rtl92de_module_init);
|
||||
module_exit(rtl92de_module_exit);
|
37
drivers/net/wireless/rtlwifi/rtl8192de/sw.h
Normal file
37
drivers/net/wireless/rtlwifi/rtl8192de/sw.h
Normal file
|
@ -0,0 +1,37 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2009-2010 Realtek Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
|
||||
* Hsinchu 300, Taiwan.
|
||||
*
|
||||
* Larry Finger <Larry.Finger@lwfinger.net>
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __RTL92DE_SW_H__
|
||||
#define __RTL92DE_SW_H__
|
||||
|
||||
extern spinlock_t globalmutex_power;
|
||||
extern spinlock_t globalmutex_for_fwdownload;
|
||||
extern spinlock_t globalmutex_for_power_and_efuse;
|
||||
|
||||
#endif
|
1690
drivers/net/wireless/rtlwifi/rtl8192de/table.c
Normal file
1690
drivers/net/wireless/rtlwifi/rtl8192de/table.c
Normal file
File diff suppressed because it is too large
Load diff
57
drivers/net/wireless/rtlwifi/rtl8192de/table.h
Normal file
57
drivers/net/wireless/rtlwifi/rtl8192de/table.h
Normal file
|
@ -0,0 +1,57 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2009-2010 Realtek Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
|
||||
* Hsinchu 300, Taiwan.
|
||||
*
|
||||
* Larry Finger <Larry.Finger@lwfinger.net>
|
||||
*
|
||||
* Created on 2010/ 5/18, 1:41
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __RTL92DE_TABLE__H_
|
||||
#define __RTL92DE_TABLE__H_
|
||||
|
||||
/*Created on 2011/ 1/14, 1:35*/
|
||||
|
||||
#define PHY_REG_2T_ARRAYLENGTH 380
|
||||
extern u32 rtl8192de_phy_reg_2tarray[PHY_REG_2T_ARRAYLENGTH];
|
||||
#define PHY_REG_ARRAY_PG_LENGTH 624
|
||||
extern u32 rtl8192de_phy_reg_array_pg[PHY_REG_ARRAY_PG_LENGTH];
|
||||
#define RADIOA_2T_ARRAYLENGTH 378
|
||||
extern u32 rtl8192de_radioa_2tarray[RADIOA_2T_ARRAYLENGTH];
|
||||
#define RADIOB_2T_ARRAYLENGTH 384
|
||||
extern u32 rtl8192de_radiob_2tarray[RADIOB_2T_ARRAYLENGTH];
|
||||
#define RADIOA_2T_INT_PA_ARRAYLENGTH 378
|
||||
extern u32 rtl8192de_radioa_2t_int_paarray[RADIOA_2T_INT_PA_ARRAYLENGTH];
|
||||
#define RADIOB_2T_INT_PA_ARRAYLENGTH 384
|
||||
extern u32 rtl8192de_radiob_2t_int_paarray[RADIOB_2T_INT_PA_ARRAYLENGTH];
|
||||
#define MAC_2T_ARRAYLENGTH 160
|
||||
extern u32 rtl8192de_mac_2tarray[MAC_2T_ARRAYLENGTH];
|
||||
#define AGCTAB_ARRAYLENGTH 386
|
||||
extern u32 rtl8192de_agctab_array[AGCTAB_ARRAYLENGTH];
|
||||
#define AGCTAB_5G_ARRAYLENGTH 194
|
||||
extern u32 rtl8192de_agctab_5garray[AGCTAB_5G_ARRAYLENGTH];
|
||||
#define AGCTAB_2G_ARRAYLENGTH 194
|
||||
extern u32 rtl8192de_agctab_2garray[AGCTAB_2G_ARRAYLENGTH];
|
||||
|
||||
#endif
|
959
drivers/net/wireless/rtlwifi/rtl8192de/trx.c
Normal file
959
drivers/net/wireless/rtlwifi/rtl8192de/trx.c
Normal file
|
@ -0,0 +1,959 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2009-2010 Realtek Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
|
||||
* Hsinchu 300, Taiwan.
|
||||
*
|
||||
* Larry Finger <Larry.Finger@lwfinger.net>
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include "../wifi.h"
|
||||
#include "../pci.h"
|
||||
#include "../base.h"
|
||||
#include "reg.h"
|
||||
#include "def.h"
|
||||
#include "phy.h"
|
||||
#include "trx.h"
|
||||
#include "led.h"
|
||||
|
||||
static u8 _rtl92de_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue)
|
||||
{
|
||||
__le16 fc = rtl_get_fc(skb);
|
||||
|
||||
if (unlikely(ieee80211_is_beacon(fc)))
|
||||
return QSLT_BEACON;
|
||||
if (ieee80211_is_mgmt(fc))
|
||||
return QSLT_MGNT;
|
||||
|
||||
return skb->priority;
|
||||
}
|
||||
|
||||
static int _rtl92de_rate_mapping(bool isht, u8 desc_rate)
|
||||
{
|
||||
int rate_idx;
|
||||
|
||||
if (false == isht) {
|
||||
switch (desc_rate) {
|
||||
case DESC92D_RATE1M:
|
||||
rate_idx = 0;
|
||||
break;
|
||||
case DESC92D_RATE2M:
|
||||
rate_idx = 1;
|
||||
break;
|
||||
case DESC92D_RATE5_5M:
|
||||
rate_idx = 2;
|
||||
break;
|
||||
case DESC92D_RATE11M:
|
||||
rate_idx = 3;
|
||||
break;
|
||||
case DESC92D_RATE6M:
|
||||
rate_idx = 4;
|
||||
break;
|
||||
case DESC92D_RATE9M:
|
||||
rate_idx = 5;
|
||||
break;
|
||||
case DESC92D_RATE12M:
|
||||
rate_idx = 6;
|
||||
break;
|
||||
case DESC92D_RATE18M:
|
||||
rate_idx = 7;
|
||||
break;
|
||||
case DESC92D_RATE24M:
|
||||
rate_idx = 8;
|
||||
break;
|
||||
case DESC92D_RATE36M:
|
||||
rate_idx = 9;
|
||||
break;
|
||||
case DESC92D_RATE48M:
|
||||
rate_idx = 10;
|
||||
break;
|
||||
case DESC92D_RATE54M:
|
||||
rate_idx = 11;
|
||||
break;
|
||||
default:
|
||||
rate_idx = 0;
|
||||
break;
|
||||
}
|
||||
return rate_idx;
|
||||
} else {
|
||||
switch (desc_rate) {
|
||||
case DESC92D_RATE1M:
|
||||
rate_idx = 0;
|
||||
break;
|
||||
case DESC92D_RATE2M:
|
||||
rate_idx = 1;
|
||||
break;
|
||||
case DESC92D_RATE5_5M:
|
||||
rate_idx = 2;
|
||||
break;
|
||||
case DESC92D_RATE11M:
|
||||
rate_idx = 3;
|
||||
break;
|
||||
case DESC92D_RATE6M:
|
||||
rate_idx = 4;
|
||||
break;
|
||||
case DESC92D_RATE9M:
|
||||
rate_idx = 5;
|
||||
break;
|
||||
case DESC92D_RATE12M:
|
||||
rate_idx = 6;
|
||||
break;
|
||||
case DESC92D_RATE18M:
|
||||
rate_idx = 7;
|
||||
break;
|
||||
case DESC92D_RATE24M:
|
||||
rate_idx = 8;
|
||||
break;
|
||||
case DESC92D_RATE36M:
|
||||
rate_idx = 9;
|
||||
break;
|
||||
case DESC92D_RATE48M:
|
||||
rate_idx = 10;
|
||||
break;
|
||||
case DESC92D_RATE54M:
|
||||
rate_idx = 11;
|
||||
break;
|
||||
default:
|
||||
rate_idx = 11;
|
||||
break;
|
||||
}
|
||||
return rate_idx;
|
||||
}
|
||||
}
|
||||
|
||||
static u8 _rtl92d_query_rxpwrpercentage(char antpower)
|
||||
{
|
||||
if ((antpower <= -100) || (antpower >= 20))
|
||||
return 0;
|
||||
else if (antpower >= 0)
|
||||
return 100;
|
||||
else
|
||||
return 100 + antpower;
|
||||
}
|
||||
|
||||
static u8 _rtl92d_evm_db_to_percentage(char value)
|
||||
{
|
||||
char ret_val = value;
|
||||
|
||||
if (ret_val >= 0)
|
||||
ret_val = 0;
|
||||
if (ret_val <= -33)
|
||||
ret_val = -33;
|
||||
ret_val = 0 - ret_val;
|
||||
ret_val *= 3;
|
||||
if (ret_val == 99)
|
||||
ret_val = 100;
|
||||
return ret_val;
|
||||
}
|
||||
|
||||
static long _rtl92de_translate_todbm(struct ieee80211_hw *hw,
|
||||
u8 signal_strength_index)
|
||||
{
|
||||
long signal_power;
|
||||
|
||||
signal_power = (long)((signal_strength_index + 1) >> 1);
|
||||
signal_power -= 95;
|
||||
return signal_power;
|
||||
}
|
||||
|
||||
static long _rtl92de_signal_scale_mapping(struct ieee80211_hw *hw, long currsig)
|
||||
{
|
||||
long retsig;
|
||||
|
||||
if (currsig >= 61 && currsig <= 100)
|
||||
retsig = 90 + ((currsig - 60) / 4);
|
||||
else if (currsig >= 41 && currsig <= 60)
|
||||
retsig = 78 + ((currsig - 40) / 2);
|
||||
else if (currsig >= 31 && currsig <= 40)
|
||||
retsig = 66 + (currsig - 30);
|
||||
else if (currsig >= 21 && currsig <= 30)
|
||||
retsig = 54 + (currsig - 20);
|
||||
else if (currsig >= 5 && currsig <= 20)
|
||||
retsig = 42 + (((currsig - 5) * 2) / 3);
|
||||
else if (currsig == 4)
|
||||
retsig = 36;
|
||||
else if (currsig == 3)
|
||||
retsig = 27;
|
||||
else if (currsig == 2)
|
||||
retsig = 18;
|
||||
else if (currsig == 1)
|
||||
retsig = 9;
|
||||
else
|
||||
retsig = currsig;
|
||||
return retsig;
|
||||
}
|
||||
|
||||
static void _rtl92de_query_rxphystatus(struct ieee80211_hw *hw,
|
||||
struct rtl_stats *pstats,
|
||||
struct rx_desc_92d *pdesc,
|
||||
struct rx_fwinfo_92d *p_drvinfo,
|
||||
bool packet_match_bssid,
|
||||
bool packet_toself,
|
||||
bool packet_beacon)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
|
||||
struct phy_sts_cck_8192d *cck_buf;
|
||||
s8 rx_pwr_all, rx_pwr[4];
|
||||
u8 rf_rx_num = 0, evm, pwdb_all;
|
||||
u8 i, max_spatial_stream;
|
||||
u32 rssi, total_rssi = 0;
|
||||
bool is_cck_rate;
|
||||
|
||||
is_cck_rate = RX_HAL_IS_CCK_RATE(pdesc);
|
||||
pstats->packet_matchbssid = packet_match_bssid;
|
||||
pstats->packet_toself = packet_toself;
|
||||
pstats->packet_beacon = packet_beacon;
|
||||
pstats->is_cck = is_cck_rate;
|
||||
pstats->rx_mimo_signalquality[0] = -1;
|
||||
pstats->rx_mimo_signalquality[1] = -1;
|
||||
|
||||
if (is_cck_rate) {
|
||||
u8 report, cck_highpwr;
|
||||
cck_buf = (struct phy_sts_cck_8192d *)p_drvinfo;
|
||||
if (ppsc->rfpwr_state == ERFON)
|
||||
cck_highpwr = (u8) rtl_get_bbreg(hw,
|
||||
RFPGA0_XA_HSSIPARAMETER2,
|
||||
BIT(9));
|
||||
else
|
||||
cck_highpwr = false;
|
||||
if (!cck_highpwr) {
|
||||
u8 cck_agc_rpt = cck_buf->cck_agc_rpt;
|
||||
report = cck_buf->cck_agc_rpt & 0xc0;
|
||||
report = report >> 6;
|
||||
switch (report) {
|
||||
case 0x3:
|
||||
rx_pwr_all = -46 - (cck_agc_rpt & 0x3e);
|
||||
break;
|
||||
case 0x2:
|
||||
rx_pwr_all = -26 - (cck_agc_rpt & 0x3e);
|
||||
break;
|
||||
case 0x1:
|
||||
rx_pwr_all = -12 - (cck_agc_rpt & 0x3e);
|
||||
break;
|
||||
case 0x0:
|
||||
rx_pwr_all = 16 - (cck_agc_rpt & 0x3e);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
u8 cck_agc_rpt = cck_buf->cck_agc_rpt;
|
||||
report = p_drvinfo->cfosho[0] & 0x60;
|
||||
report = report >> 5;
|
||||
switch (report) {
|
||||
case 0x3:
|
||||
rx_pwr_all = -46 - ((cck_agc_rpt & 0x1f) << 1);
|
||||
break;
|
||||
case 0x2:
|
||||
rx_pwr_all = -26 - ((cck_agc_rpt & 0x1f) << 1);
|
||||
break;
|
||||
case 0x1:
|
||||
rx_pwr_all = -12 - ((cck_agc_rpt & 0x1f) << 1);
|
||||
break;
|
||||
case 0x0:
|
||||
rx_pwr_all = 16 - ((cck_agc_rpt & 0x1f) << 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
pwdb_all = _rtl92d_query_rxpwrpercentage(rx_pwr_all);
|
||||
/* CCK gain is smaller than OFDM/MCS gain, */
|
||||
/* so we add gain diff by experiences, the val is 6 */
|
||||
pwdb_all += 6;
|
||||
if (pwdb_all > 100)
|
||||
pwdb_all = 100;
|
||||
/* modify the offset to make the same gain index with OFDM. */
|
||||
if (pwdb_all > 34 && pwdb_all <= 42)
|
||||
pwdb_all -= 2;
|
||||
else if (pwdb_all > 26 && pwdb_all <= 34)
|
||||
pwdb_all -= 6;
|
||||
else if (pwdb_all > 14 && pwdb_all <= 26)
|
||||
pwdb_all -= 8;
|
||||
else if (pwdb_all > 4 && pwdb_all <= 14)
|
||||
pwdb_all -= 4;
|
||||
pstats->rx_pwdb_all = pwdb_all;
|
||||
pstats->recvsignalpower = rx_pwr_all;
|
||||
if (packet_match_bssid) {
|
||||
u8 sq;
|
||||
if (pstats->rx_pwdb_all > 40) {
|
||||
sq = 100;
|
||||
} else {
|
||||
sq = cck_buf->sq_rpt;
|
||||
if (sq > 64)
|
||||
sq = 0;
|
||||
else if (sq < 20)
|
||||
sq = 100;
|
||||
else
|
||||
sq = ((64 - sq) * 100) / 44;
|
||||
}
|
||||
pstats->signalquality = sq;
|
||||
pstats->rx_mimo_signalquality[0] = sq;
|
||||
pstats->rx_mimo_signalquality[1] = -1;
|
||||
}
|
||||
} else {
|
||||
rtlpriv->dm.rfpath_rxenable[0] = true;
|
||||
rtlpriv->dm.rfpath_rxenable[1] = true;
|
||||
for (i = RF90_PATH_A; i < RF6052_MAX_PATH; i++) {
|
||||
if (rtlpriv->dm.rfpath_rxenable[i])
|
||||
rf_rx_num++;
|
||||
rx_pwr[i] = ((p_drvinfo->gain_trsw[i] & 0x3f) * 2)
|
||||
- 110;
|
||||
rssi = _rtl92d_query_rxpwrpercentage(rx_pwr[i]);
|
||||
total_rssi += rssi;
|
||||
rtlpriv->stats.rx_snr_db[i] =
|
||||
(long)(p_drvinfo->rxsnr[i] / 2);
|
||||
if (packet_match_bssid)
|
||||
pstats->rx_mimo_signalstrength[i] = (u8) rssi;
|
||||
}
|
||||
rx_pwr_all = ((p_drvinfo->pwdb_all >> 1) & 0x7f) - 106;
|
||||
pwdb_all = _rtl92d_query_rxpwrpercentage(rx_pwr_all);
|
||||
pstats->rx_pwdb_all = pwdb_all;
|
||||
pstats->rxpower = rx_pwr_all;
|
||||
pstats->recvsignalpower = rx_pwr_all;
|
||||
if (pdesc->rxht && pdesc->rxmcs >= DESC92D_RATEMCS8 &&
|
||||
pdesc->rxmcs <= DESC92D_RATEMCS15)
|
||||
max_spatial_stream = 2;
|
||||
else
|
||||
max_spatial_stream = 1;
|
||||
for (i = 0; i < max_spatial_stream; i++) {
|
||||
evm = _rtl92d_evm_db_to_percentage(p_drvinfo->rxevm[i]);
|
||||
if (packet_match_bssid) {
|
||||
if (i == 0)
|
||||
pstats->signalquality =
|
||||
(u8)(evm & 0xff);
|
||||
pstats->rx_mimo_signalquality[i] =
|
||||
(u8)(evm & 0xff);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (is_cck_rate)
|
||||
pstats->signalstrength = (u8)(_rtl92de_signal_scale_mapping(hw,
|
||||
pwdb_all));
|
||||
else if (rf_rx_num != 0)
|
||||
pstats->signalstrength = (u8)(_rtl92de_signal_scale_mapping(hw,
|
||||
total_rssi /= rf_rx_num));
|
||||
}
|
||||
|
||||
static void rtl92d_loop_over_paths(struct ieee80211_hw *hw,
|
||||
struct rtl_stats *pstats)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_phy *rtlphy = &(rtlpriv->phy);
|
||||
u8 rfpath;
|
||||
|
||||
for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
|
||||
rfpath++) {
|
||||
if (rtlpriv->stats.rx_rssi_percentage[rfpath] == 0) {
|
||||
rtlpriv->stats.rx_rssi_percentage[rfpath] =
|
||||
pstats->rx_mimo_signalstrength[rfpath];
|
||||
|
||||
}
|
||||
if (pstats->rx_mimo_signalstrength[rfpath] >
|
||||
rtlpriv->stats.rx_rssi_percentage[rfpath]) {
|
||||
rtlpriv->stats.rx_rssi_percentage[rfpath] =
|
||||
((rtlpriv->stats.rx_rssi_percentage[rfpath] *
|
||||
(RX_SMOOTH_FACTOR - 1)) +
|
||||
(pstats->rx_mimo_signalstrength[rfpath])) /
|
||||
(RX_SMOOTH_FACTOR);
|
||||
rtlpriv->stats.rx_rssi_percentage[rfpath] =
|
||||
rtlpriv->stats.rx_rssi_percentage[rfpath] + 1;
|
||||
} else {
|
||||
rtlpriv->stats.rx_rssi_percentage[rfpath] =
|
||||
((rtlpriv->stats.rx_rssi_percentage[rfpath] *
|
||||
(RX_SMOOTH_FACTOR - 1)) +
|
||||
(pstats->rx_mimo_signalstrength[rfpath])) /
|
||||
(RX_SMOOTH_FACTOR);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void _rtl92de_process_ui_rssi(struct ieee80211_hw *hw,
|
||||
struct rtl_stats *pstats)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
u32 last_rssi, tmpval;
|
||||
|
||||
if (pstats->packet_toself || pstats->packet_beacon) {
|
||||
rtlpriv->stats.rssi_calculate_cnt++;
|
||||
if (rtlpriv->stats.ui_rssi.total_num++ >=
|
||||
PHY_RSSI_SLID_WIN_MAX) {
|
||||
rtlpriv->stats.ui_rssi.total_num =
|
||||
PHY_RSSI_SLID_WIN_MAX;
|
||||
last_rssi = rtlpriv->stats.ui_rssi.elements[
|
||||
rtlpriv->stats.ui_rssi.index];
|
||||
rtlpriv->stats.ui_rssi.total_val -= last_rssi;
|
||||
}
|
||||
rtlpriv->stats.ui_rssi.total_val += pstats->signalstrength;
|
||||
rtlpriv->stats.ui_rssi.elements
|
||||
[rtlpriv->stats.ui_rssi.index++] =
|
||||
pstats->signalstrength;
|
||||
if (rtlpriv->stats.ui_rssi.index >= PHY_RSSI_SLID_WIN_MAX)
|
||||
rtlpriv->stats.ui_rssi.index = 0;
|
||||
tmpval = rtlpriv->stats.ui_rssi.total_val /
|
||||
rtlpriv->stats.ui_rssi.total_num;
|
||||
rtlpriv->stats.signal_strength = _rtl92de_translate_todbm(hw,
|
||||
(u8) tmpval);
|
||||
pstats->rssi = rtlpriv->stats.signal_strength;
|
||||
}
|
||||
if (!pstats->is_cck && pstats->packet_toself)
|
||||
rtl92d_loop_over_paths(hw, pstats);
|
||||
}
|
||||
|
||||
static void _rtl92de_update_rxsignalstatistics(struct ieee80211_hw *hw,
|
||||
struct rtl_stats *pstats)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
int weighting = 0;
|
||||
|
||||
if (rtlpriv->stats.recv_signal_power == 0)
|
||||
rtlpriv->stats.recv_signal_power = pstats->recvsignalpower;
|
||||
if (pstats->recvsignalpower > rtlpriv->stats.recv_signal_power)
|
||||
weighting = 5;
|
||||
else if (pstats->recvsignalpower < rtlpriv->stats.recv_signal_power)
|
||||
weighting = (-5);
|
||||
rtlpriv->stats.recv_signal_power = (rtlpriv->stats.recv_signal_power *
|
||||
5 + pstats->recvsignalpower + weighting) / 6;
|
||||
}
|
||||
|
||||
static void _rtl92de_process_pwdb(struct ieee80211_hw *hw,
|
||||
struct rtl_stats *pstats)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
|
||||
long undecorated_smoothed_pwdb;
|
||||
|
||||
if (mac->opmode == NL80211_IFTYPE_ADHOC ||
|
||||
mac->opmode == NL80211_IFTYPE_AP)
|
||||
return;
|
||||
else
|
||||
undecorated_smoothed_pwdb =
|
||||
rtlpriv->dm.undecorated_smoothed_pwdb;
|
||||
|
||||
if (pstats->packet_toself || pstats->packet_beacon) {
|
||||
if (undecorated_smoothed_pwdb < 0)
|
||||
undecorated_smoothed_pwdb = pstats->rx_pwdb_all;
|
||||
if (pstats->rx_pwdb_all > (u32) undecorated_smoothed_pwdb) {
|
||||
undecorated_smoothed_pwdb =
|
||||
(((undecorated_smoothed_pwdb) *
|
||||
(RX_SMOOTH_FACTOR - 1)) +
|
||||
(pstats->rx_pwdb_all)) / (RX_SMOOTH_FACTOR);
|
||||
undecorated_smoothed_pwdb =
|
||||
undecorated_smoothed_pwdb + 1;
|
||||
} else {
|
||||
undecorated_smoothed_pwdb =
|
||||
(((undecorated_smoothed_pwdb) *
|
||||
(RX_SMOOTH_FACTOR - 1)) +
|
||||
(pstats->rx_pwdb_all)) / (RX_SMOOTH_FACTOR);
|
||||
}
|
||||
rtlpriv->dm.undecorated_smoothed_pwdb =
|
||||
undecorated_smoothed_pwdb;
|
||||
_rtl92de_update_rxsignalstatistics(hw, pstats);
|
||||
}
|
||||
}
|
||||
|
||||
static void rtl92d_loop_over_streams(struct ieee80211_hw *hw,
|
||||
struct rtl_stats *pstats)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
int stream;
|
||||
|
||||
for (stream = 0; stream < 2; stream++) {
|
||||
if (pstats->rx_mimo_signalquality[stream] != -1) {
|
||||
if (rtlpriv->stats.rx_evm_percentage[stream] == 0) {
|
||||
rtlpriv->stats.rx_evm_percentage[stream] =
|
||||
pstats->rx_mimo_signalquality[stream];
|
||||
}
|
||||
rtlpriv->stats.rx_evm_percentage[stream] =
|
||||
((rtlpriv->stats.rx_evm_percentage[stream]
|
||||
* (RX_SMOOTH_FACTOR - 1)) +
|
||||
(pstats->rx_mimo_signalquality[stream] * 1)) /
|
||||
(RX_SMOOTH_FACTOR);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void _rtl92de_process_ui_link_quality(struct ieee80211_hw *hw,
|
||||
struct rtl_stats *pstats)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
u32 last_evm, tmpval;
|
||||
|
||||
if (pstats->signalquality == 0)
|
||||
return;
|
||||
if (pstats->packet_toself || pstats->packet_beacon) {
|
||||
if (rtlpriv->stats.ui_link_quality.total_num++ >=
|
||||
PHY_LINKQUALITY_SLID_WIN_MAX) {
|
||||
rtlpriv->stats.ui_link_quality.total_num =
|
||||
PHY_LINKQUALITY_SLID_WIN_MAX;
|
||||
last_evm = rtlpriv->stats.ui_link_quality.elements[
|
||||
rtlpriv->stats.ui_link_quality.index];
|
||||
rtlpriv->stats.ui_link_quality.total_val -= last_evm;
|
||||
}
|
||||
rtlpriv->stats.ui_link_quality.total_val +=
|
||||
pstats->signalquality;
|
||||
rtlpriv->stats.ui_link_quality.elements[
|
||||
rtlpriv->stats.ui_link_quality.index++] =
|
||||
pstats->signalquality;
|
||||
if (rtlpriv->stats.ui_link_quality.index >=
|
||||
PHY_LINKQUALITY_SLID_WIN_MAX)
|
||||
rtlpriv->stats.ui_link_quality.index = 0;
|
||||
tmpval = rtlpriv->stats.ui_link_quality.total_val /
|
||||
rtlpriv->stats.ui_link_quality.total_num;
|
||||
rtlpriv->stats.signal_quality = tmpval;
|
||||
rtlpriv->stats.last_sigstrength_inpercent = tmpval;
|
||||
rtl92d_loop_over_streams(hw, pstats);
|
||||
}
|
||||
}
|
||||
|
||||
static void _rtl92de_process_phyinfo(struct ieee80211_hw *hw,
|
||||
u8 *buffer,
|
||||
struct rtl_stats *pcurrent_stats)
|
||||
{
|
||||
|
||||
if (!pcurrent_stats->packet_matchbssid &&
|
||||
!pcurrent_stats->packet_beacon)
|
||||
return;
|
||||
|
||||
_rtl92de_process_ui_rssi(hw, pcurrent_stats);
|
||||
_rtl92de_process_pwdb(hw, pcurrent_stats);
|
||||
_rtl92de_process_ui_link_quality(hw, pcurrent_stats);
|
||||
}
|
||||
|
||||
static void _rtl92de_translate_rx_signal_stuff(struct ieee80211_hw *hw,
|
||||
struct sk_buff *skb,
|
||||
struct rtl_stats *pstats,
|
||||
struct rx_desc_92d *pdesc,
|
||||
struct rx_fwinfo_92d *p_drvinfo)
|
||||
{
|
||||
struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
|
||||
struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
|
||||
struct ieee80211_hdr *hdr;
|
||||
u8 *tmp_buf;
|
||||
u8 *praddr;
|
||||
u16 type, cfc;
|
||||
__le16 fc;
|
||||
bool packet_matchbssid, packet_toself, packet_beacon;
|
||||
|
||||
tmp_buf = skb->data + pstats->rx_drvinfo_size + pstats->rx_bufshift;
|
||||
hdr = (struct ieee80211_hdr *)tmp_buf;
|
||||
fc = hdr->frame_control;
|
||||
cfc = le16_to_cpu(fc);
|
||||
type = WLAN_FC_GET_TYPE(fc);
|
||||
praddr = hdr->addr1;
|
||||
packet_matchbssid = ((IEEE80211_FTYPE_CTL != type) &&
|
||||
(!compare_ether_addr(mac->bssid, (cfc & IEEE80211_FCTL_TODS) ?
|
||||
hdr->addr1 : (cfc & IEEE80211_FCTL_FROMDS) ?
|
||||
hdr->addr2 : hdr->addr3)) && (!pstats->hwerror) &&
|
||||
(!pstats->crc) && (!pstats->icv));
|
||||
packet_toself = packet_matchbssid &&
|
||||
(!compare_ether_addr(praddr, rtlefuse->dev_addr));
|
||||
if (ieee80211_is_beacon(fc))
|
||||
packet_beacon = true;
|
||||
_rtl92de_query_rxphystatus(hw, pstats, pdesc, p_drvinfo,
|
||||
packet_matchbssid, packet_toself,
|
||||
packet_beacon);
|
||||
_rtl92de_process_phyinfo(hw, tmp_buf, pstats);
|
||||
}
|
||||
|
||||
bool rtl92de_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *stats,
|
||||
struct ieee80211_rx_status *rx_status,
|
||||
u8 *p_desc, struct sk_buff *skb)
|
||||
{
|
||||
struct rx_fwinfo_92d *p_drvinfo;
|
||||
struct rx_desc_92d *pdesc = (struct rx_desc_92d *)p_desc;
|
||||
u32 phystatus = GET_RX_DESC_PHYST(pdesc);
|
||||
|
||||
stats->length = (u16) GET_RX_DESC_PKT_LEN(pdesc);
|
||||
stats->rx_drvinfo_size = (u8) GET_RX_DESC_DRV_INFO_SIZE(pdesc) *
|
||||
RX_DRV_INFO_SIZE_UNIT;
|
||||
stats->rx_bufshift = (u8) (GET_RX_DESC_SHIFT(pdesc) & 0x03);
|
||||
stats->icv = (u16) GET_RX_DESC_ICV(pdesc);
|
||||
stats->crc = (u16) GET_RX_DESC_CRC32(pdesc);
|
||||
stats->hwerror = (stats->crc | stats->icv);
|
||||
stats->decrypted = !GET_RX_DESC_SWDEC(pdesc);
|
||||
stats->rate = (u8) GET_RX_DESC_RXMCS(pdesc);
|
||||
stats->shortpreamble = (u16) GET_RX_DESC_SPLCP(pdesc);
|
||||
stats->isampdu = (bool) (GET_RX_DESC_PAGGR(pdesc) == 1);
|
||||
stats->isfirst_ampdu = (bool) ((GET_RX_DESC_PAGGR(pdesc) == 1)
|
||||
&& (GET_RX_DESC_FAGGR(pdesc) == 1));
|
||||
stats->timestamp_low = GET_RX_DESC_TSFL(pdesc);
|
||||
stats->rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(pdesc);
|
||||
rx_status->freq = hw->conf.channel->center_freq;
|
||||
rx_status->band = hw->conf.channel->band;
|
||||
if (GET_RX_DESC_CRC32(pdesc))
|
||||
rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
|
||||
if (!GET_RX_DESC_SWDEC(pdesc))
|
||||
rx_status->flag |= RX_FLAG_DECRYPTED;
|
||||
if (GET_RX_DESC_BW(pdesc))
|
||||
rx_status->flag |= RX_FLAG_40MHZ;
|
||||
if (GET_RX_DESC_RXHT(pdesc))
|
||||
rx_status->flag |= RX_FLAG_HT;
|
||||
rx_status->flag |= RX_FLAG_MACTIME_MPDU;
|
||||
if (stats->decrypted)
|
||||
rx_status->flag |= RX_FLAG_DECRYPTED;
|
||||
rx_status->rate_idx = _rtl92de_rate_mapping((bool)
|
||||
GET_RX_DESC_RXHT(pdesc),
|
||||
(u8)
|
||||
GET_RX_DESC_RXMCS(pdesc));
|
||||
rx_status->mactime = GET_RX_DESC_TSFL(pdesc);
|
||||
if (phystatus == true) {
|
||||
p_drvinfo = (struct rx_fwinfo_92d *)(skb->data +
|
||||
stats->rx_bufshift);
|
||||
_rtl92de_translate_rx_signal_stuff(hw,
|
||||
skb, stats, pdesc,
|
||||
p_drvinfo);
|
||||
}
|
||||
/*rx_status->qual = stats->signal; */
|
||||
rx_status->signal = stats->rssi + 10;
|
||||
/*rx_status->noise = -stats->noise; */
|
||||
return true;
|
||||
}
|
||||
|
||||
static void _rtl92de_insert_emcontent(struct rtl_tcb_desc *ptcb_desc,
|
||||
u8 *virtualaddress)
|
||||
{
|
||||
memset(virtualaddress, 0, 8);
|
||||
|
||||
SET_EARLYMODE_PKTNUM(virtualaddress, ptcb_desc->empkt_num);
|
||||
SET_EARLYMODE_LEN0(virtualaddress, ptcb_desc->empkt_len[0]);
|
||||
SET_EARLYMODE_LEN1(virtualaddress, ptcb_desc->empkt_len[1]);
|
||||
SET_EARLYMODE_LEN2_1(virtualaddress, ptcb_desc->empkt_len[2] & 0xF);
|
||||
SET_EARLYMODE_LEN2_2(virtualaddress, ptcb_desc->empkt_len[2] >> 4);
|
||||
SET_EARLYMODE_LEN3(virtualaddress, ptcb_desc->empkt_len[3]);
|
||||
SET_EARLYMODE_LEN4(virtualaddress, ptcb_desc->empkt_len[4]);
|
||||
}
|
||||
|
||||
void rtl92de_tx_fill_desc(struct ieee80211_hw *hw,
|
||||
struct ieee80211_hdr *hdr, u8 *pdesc_tx,
|
||||
struct ieee80211_tx_info *info, struct sk_buff *skb,
|
||||
u8 hw_queue, struct rtl_tcb_desc *ptcb_desc)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
|
||||
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
|
||||
struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
|
||||
struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
|
||||
struct ieee80211_sta *sta = info->control.sta;
|
||||
u8 *pdesc = (u8 *) pdesc_tx;
|
||||
u16 seq_number;
|
||||
__le16 fc = hdr->frame_control;
|
||||
unsigned int buf_len = 0;
|
||||
unsigned int skb_len = skb->len;
|
||||
u8 fw_qsel = _rtl92de_map_hwqueue_to_fwqueue(skb, hw_queue);
|
||||
bool firstseg = ((hdr->seq_ctrl &
|
||||
cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0);
|
||||
bool lastseg = ((hdr->frame_control &
|
||||
cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) == 0);
|
||||
dma_addr_t mapping;
|
||||
u8 bw_40 = 0;
|
||||
|
||||
if (mac->opmode == NL80211_IFTYPE_STATION) {
|
||||
bw_40 = mac->bw_40;
|
||||
} else if (mac->opmode == NL80211_IFTYPE_AP ||
|
||||
mac->opmode == NL80211_IFTYPE_ADHOC) {
|
||||
if (sta)
|
||||
bw_40 = sta->ht_cap.cap &
|
||||
IEEE80211_HT_CAP_SUP_WIDTH_20_40;
|
||||
}
|
||||
seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
|
||||
rtl_get_tcb_desc(hw, info, sta, skb, ptcb_desc);
|
||||
/* reserve 8 byte for AMPDU early mode */
|
||||
if (rtlhal->earlymode_enable) {
|
||||
skb_push(skb, EM_HDR_LEN);
|
||||
memset(skb->data, 0, EM_HDR_LEN);
|
||||
}
|
||||
buf_len = skb->len;
|
||||
mapping = pci_map_single(rtlpci->pdev, skb->data, skb->len,
|
||||
PCI_DMA_TODEVICE);
|
||||
CLEAR_PCI_TX_DESC_CONTENT(pdesc, sizeof(struct tx_desc_92d));
|
||||
if (ieee80211_is_nullfunc(fc) || ieee80211_is_ctl(fc)) {
|
||||
firstseg = true;
|
||||
lastseg = true;
|
||||
}
|
||||
if (firstseg) {
|
||||
if (rtlhal->earlymode_enable) {
|
||||
SET_TX_DESC_PKT_OFFSET(pdesc, 1);
|
||||
SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN +
|
||||
EM_HDR_LEN);
|
||||
if (ptcb_desc->empkt_num) {
|
||||
RT_TRACE(rtlpriv, COMP_SEND, DBG_LOUD,
|
||||
("Insert 8 byte.pTcb->EMPktNum:%d\n",
|
||||
ptcb_desc->empkt_num));
|
||||
_rtl92de_insert_emcontent(ptcb_desc,
|
||||
(u8 *)(skb->data));
|
||||
}
|
||||
} else {
|
||||
SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
|
||||
}
|
||||
/* 5G have no CCK rate */
|
||||
if (rtlhal->current_bandtype == BAND_ON_5G)
|
||||
if (ptcb_desc->hw_rate < DESC92D_RATE6M)
|
||||
ptcb_desc->hw_rate = DESC92D_RATE6M;
|
||||
SET_TX_DESC_TX_RATE(pdesc, ptcb_desc->hw_rate);
|
||||
if (ptcb_desc->use_shortgi || ptcb_desc->use_shortpreamble)
|
||||
SET_TX_DESC_DATA_SHORTGI(pdesc, 1);
|
||||
|
||||
if (rtlhal->macphymode == DUALMAC_DUALPHY &&
|
||||
ptcb_desc->hw_rate == DESC92D_RATEMCS7)
|
||||
SET_TX_DESC_DATA_SHORTGI(pdesc, 1);
|
||||
|
||||
if (info->flags & IEEE80211_TX_CTL_AMPDU) {
|
||||
SET_TX_DESC_AGG_ENABLE(pdesc, 1);
|
||||
SET_TX_DESC_MAX_AGG_NUM(pdesc, 0x14);
|
||||
}
|
||||
SET_TX_DESC_SEQ(pdesc, seq_number);
|
||||
SET_TX_DESC_RTS_ENABLE(pdesc, ((ptcb_desc->rts_enable &&
|
||||
!ptcb_desc->cts_enable) ? 1 : 0));
|
||||
SET_TX_DESC_HW_RTS_ENABLE(pdesc, ((ptcb_desc->rts_enable
|
||||
|| ptcb_desc->cts_enable) ? 1 : 0));
|
||||
SET_TX_DESC_CTS2SELF(pdesc, ((ptcb_desc->cts_enable) ? 1 : 0));
|
||||
SET_TX_DESC_RTS_STBC(pdesc, ((ptcb_desc->rts_stbc) ? 1 : 0));
|
||||
/* 5G have no CCK rate */
|
||||
if (rtlhal->current_bandtype == BAND_ON_5G)
|
||||
if (ptcb_desc->rts_rate < DESC92D_RATE6M)
|
||||
ptcb_desc->rts_rate = DESC92D_RATE6M;
|
||||
SET_TX_DESC_RTS_RATE(pdesc, ptcb_desc->rts_rate);
|
||||
SET_TX_DESC_RTS_BW(pdesc, 0);
|
||||
SET_TX_DESC_RTS_SC(pdesc, ptcb_desc->rts_sc);
|
||||
SET_TX_DESC_RTS_SHORT(pdesc, ((ptcb_desc->rts_rate <=
|
||||
DESC92D_RATE54M) ?
|
||||
(ptcb_desc->rts_use_shortpreamble ? 1 : 0) :
|
||||
(ptcb_desc->rts_use_shortgi ? 1 : 0)));
|
||||
if (bw_40) {
|
||||
if (ptcb_desc->packet_bw) {
|
||||
SET_TX_DESC_DATA_BW(pdesc, 1);
|
||||
SET_TX_DESC_TX_SUB_CARRIER(pdesc, 3);
|
||||
} else {
|
||||
SET_TX_DESC_DATA_BW(pdesc, 0);
|
||||
SET_TX_DESC_TX_SUB_CARRIER(pdesc,
|
||||
mac->cur_40_prime_sc);
|
||||
}
|
||||
} else {
|
||||
SET_TX_DESC_DATA_BW(pdesc, 0);
|
||||
SET_TX_DESC_TX_SUB_CARRIER(pdesc, 0);
|
||||
}
|
||||
SET_TX_DESC_LINIP(pdesc, 0);
|
||||
SET_TX_DESC_PKT_SIZE(pdesc, (u16) skb_len);
|
||||
if (sta) {
|
||||
u8 ampdu_density = sta->ht_cap.ampdu_density;
|
||||
SET_TX_DESC_AMPDU_DENSITY(pdesc, ampdu_density);
|
||||
}
|
||||
if (info->control.hw_key) {
|
||||
struct ieee80211_key_conf *keyconf;
|
||||
|
||||
keyconf = info->control.hw_key;
|
||||
switch (keyconf->cipher) {
|
||||
case WLAN_CIPHER_SUITE_WEP40:
|
||||
case WLAN_CIPHER_SUITE_WEP104:
|
||||
case WLAN_CIPHER_SUITE_TKIP:
|
||||
SET_TX_DESC_SEC_TYPE(pdesc, 0x1);
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_CCMP:
|
||||
SET_TX_DESC_SEC_TYPE(pdesc, 0x3);
|
||||
break;
|
||||
default:
|
||||
SET_TX_DESC_SEC_TYPE(pdesc, 0x0);
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
SET_TX_DESC_PKT_ID(pdesc, 0);
|
||||
SET_TX_DESC_QUEUE_SEL(pdesc, fw_qsel);
|
||||
SET_TX_DESC_DATA_RATE_FB_LIMIT(pdesc, 0x1F);
|
||||
SET_TX_DESC_RTS_RATE_FB_LIMIT(pdesc, 0xF);
|
||||
SET_TX_DESC_DISABLE_FB(pdesc, ptcb_desc->disable_ratefallback ?
|
||||
1 : 0);
|
||||
SET_TX_DESC_USE_RATE(pdesc, ptcb_desc->use_driver_rate ? 1 : 0);
|
||||
|
||||
/* Set TxRate and RTSRate in TxDesc */
|
||||
/* This prevent Tx initial rate of new-coming packets */
|
||||
/* from being overwritten by retried packet rate.*/
|
||||
if (!ptcb_desc->use_driver_rate) {
|
||||
SET_TX_DESC_RTS_RATE(pdesc, 0x08);
|
||||
/* SET_TX_DESC_TX_RATE(pdesc, 0x0b); */
|
||||
}
|
||||
if (ieee80211_is_data_qos(fc)) {
|
||||
if (mac->rdg_en) {
|
||||
RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
|
||||
("Enable RDG function.\n"));
|
||||
SET_TX_DESC_RDG_ENABLE(pdesc, 1);
|
||||
SET_TX_DESC_HTC(pdesc, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SET_TX_DESC_FIRST_SEG(pdesc, (firstseg ? 1 : 0));
|
||||
SET_TX_DESC_LAST_SEG(pdesc, (lastseg ? 1 : 0));
|
||||
SET_TX_DESC_TX_BUFFER_SIZE(pdesc, (u16) buf_len);
|
||||
SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping);
|
||||
if (rtlpriv->dm.useramask) {
|
||||
SET_TX_DESC_RATE_ID(pdesc, ptcb_desc->ratr_index);
|
||||
SET_TX_DESC_MACID(pdesc, ptcb_desc->mac_id);
|
||||
} else {
|
||||
SET_TX_DESC_RATE_ID(pdesc, 0xC + ptcb_desc->ratr_index);
|
||||
SET_TX_DESC_MACID(pdesc, ptcb_desc->ratr_index);
|
||||
}
|
||||
if (ieee80211_is_data_qos(fc))
|
||||
SET_TX_DESC_QOS(pdesc, 1);
|
||||
|
||||
if ((!ieee80211_is_data_qos(fc)) && ppsc->fwctrl_lps) {
|
||||
SET_TX_DESC_HWSEQ_EN(pdesc, 1);
|
||||
SET_TX_DESC_PKT_ID(pdesc, 8);
|
||||
}
|
||||
SET_TX_DESC_MORE_FRAG(pdesc, (lastseg ? 0 : 1));
|
||||
RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, ("\n"));
|
||||
}
|
||||
|
||||
void rtl92de_tx_fill_cmddesc(struct ieee80211_hw *hw,
|
||||
u8 *pdesc, bool firstseg,
|
||||
bool lastseg, struct sk_buff *skb)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
|
||||
struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
|
||||
struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
|
||||
u8 fw_queue = QSLT_BEACON;
|
||||
dma_addr_t mapping = pci_map_single(rtlpci->pdev,
|
||||
skb->data, skb->len, PCI_DMA_TODEVICE);
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data);
|
||||
__le16 fc = hdr->frame_control;
|
||||
|
||||
CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE);
|
||||
if (firstseg)
|
||||
SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
|
||||
/* 5G have no CCK rate
|
||||
* Caution: The macros below are multi-line expansions.
|
||||
* The braces are needed no matter what checkpatch says
|
||||
*/
|
||||
if (rtlhal->current_bandtype == BAND_ON_5G) {
|
||||
SET_TX_DESC_TX_RATE(pdesc, DESC92D_RATE6M);
|
||||
} else {
|
||||
SET_TX_DESC_TX_RATE(pdesc, DESC92D_RATE1M);
|
||||
}
|
||||
SET_TX_DESC_SEQ(pdesc, 0);
|
||||
SET_TX_DESC_LINIP(pdesc, 0);
|
||||
SET_TX_DESC_QUEUE_SEL(pdesc, fw_queue);
|
||||
SET_TX_DESC_FIRST_SEG(pdesc, 1);
|
||||
SET_TX_DESC_LAST_SEG(pdesc, 1);
|
||||
SET_TX_DESC_TX_BUFFER_SIZE(pdesc, (u16) (skb->len));
|
||||
SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping);
|
||||
SET_TX_DESC_RATE_ID(pdesc, 7);
|
||||
SET_TX_DESC_MACID(pdesc, 0);
|
||||
SET_TX_DESC_PKT_SIZE((u8 *) pdesc, (u16) (skb->len));
|
||||
SET_TX_DESC_FIRST_SEG(pdesc, 1);
|
||||
SET_TX_DESC_LAST_SEG(pdesc, 1);
|
||||
SET_TX_DESC_OFFSET(pdesc, 0x20);
|
||||
SET_TX_DESC_USE_RATE(pdesc, 1);
|
||||
|
||||
if (!ieee80211_is_data_qos(fc) && ppsc->fwctrl_lps) {
|
||||
SET_TX_DESC_HWSEQ_EN(pdesc, 1);
|
||||
SET_TX_DESC_PKT_ID(pdesc, 8);
|
||||
}
|
||||
|
||||
RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
|
||||
"H2C Tx Cmd Content\n", pdesc, TX_DESC_SIZE);
|
||||
wmb();
|
||||
SET_TX_DESC_OWN(pdesc, 1);
|
||||
}
|
||||
|
||||
void rtl92de_set_desc(u8 *pdesc, bool istx, u8 desc_name, u8 *val)
|
||||
{
|
||||
if (istx == true) {
|
||||
switch (desc_name) {
|
||||
case HW_DESC_OWN:
|
||||
wmb();
|
||||
SET_TX_DESC_OWN(pdesc, 1);
|
||||
break;
|
||||
case HW_DESC_TX_NEXTDESC_ADDR:
|
||||
SET_TX_DESC_NEXT_DESC_ADDRESS(pdesc, *(u32 *) val);
|
||||
break;
|
||||
default:
|
||||
RT_ASSERT(false, ("ERR txdesc :%d"
|
||||
" not process\n", desc_name));
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
switch (desc_name) {
|
||||
case HW_DESC_RXOWN:
|
||||
wmb();
|
||||
SET_RX_DESC_OWN(pdesc, 1);
|
||||
break;
|
||||
case HW_DESC_RXBUFF_ADDR:
|
||||
SET_RX_DESC_BUFF_ADDR(pdesc, *(u32 *) val);
|
||||
break;
|
||||
case HW_DESC_RXPKT_LEN:
|
||||
SET_RX_DESC_PKT_LEN(pdesc, *(u32 *) val);
|
||||
break;
|
||||
case HW_DESC_RXERO:
|
||||
SET_RX_DESC_EOR(pdesc, 1);
|
||||
break;
|
||||
default:
|
||||
RT_ASSERT(false, ("ERR rxdesc :%d "
|
||||
"not process\n", desc_name));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
u32 rtl92de_get_desc(u8 *p_desc, bool istx, u8 desc_name)
|
||||
{
|
||||
u32 ret = 0;
|
||||
|
||||
if (istx == true) {
|
||||
switch (desc_name) {
|
||||
case HW_DESC_OWN:
|
||||
ret = GET_TX_DESC_OWN(p_desc);
|
||||
break;
|
||||
case HW_DESC_TXBUFF_ADDR:
|
||||
ret = GET_TX_DESC_TX_BUFFER_ADDRESS(p_desc);
|
||||
break;
|
||||
default:
|
||||
RT_ASSERT(false, ("ERR txdesc :%d "
|
||||
"not process\n", desc_name));
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
struct rx_desc_92c *pdesc = (struct rx_desc_92c *)p_desc;
|
||||
switch (desc_name) {
|
||||
case HW_DESC_OWN:
|
||||
ret = GET_RX_DESC_OWN(pdesc);
|
||||
break;
|
||||
case HW_DESC_RXPKT_LEN:
|
||||
ret = GET_RX_DESC_PKT_LEN(pdesc);
|
||||
break;
|
||||
default:
|
||||
RT_ASSERT(false, ("ERR rxdesc :%d "
|
||||
"not process\n", desc_name));
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
void rtl92de_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
if (hw_queue == BEACON_QUEUE)
|
||||
rtl_write_word(rtlpriv, REG_PCIE_CTRL_REG, BIT(4));
|
||||
else
|
||||
rtl_write_word(rtlpriv, REG_PCIE_CTRL_REG,
|
||||
BIT(0) << (hw_queue));
|
||||
}
|
756
drivers/net/wireless/rtlwifi/rtl8192de/trx.h
Normal file
756
drivers/net/wireless/rtlwifi/rtl8192de/trx.h
Normal file
|
@ -0,0 +1,756 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* Copyright(c) 2009-2010 Realtek Corporation.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of version 2 of the GNU General Public License as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program; if not, write to the Free Software Foundation, Inc.,
|
||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
|
||||
*
|
||||
* The full GNU General Public License is included in this distribution in the
|
||||
* file called LICENSE.
|
||||
*
|
||||
* Contact Information:
|
||||
* wlanfae <wlanfae@realtek.com>
|
||||
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
|
||||
* Hsinchu 300, Taiwan.
|
||||
*
|
||||
* Larry Finger <Larry.Finger@lwfinger.net>
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __RTL92DE_TRX_H__
|
||||
#define __RTL92DE_TRX_H__
|
||||
|
||||
#define TX_DESC_SIZE 64
|
||||
#define TX_DESC_AGGR_SUBFRAME_SIZE 32
|
||||
|
||||
#define RX_DESC_SIZE 32
|
||||
#define RX_DRV_INFO_SIZE_UNIT 8
|
||||
|
||||
#define TX_DESC_NEXT_DESC_OFFSET 40
|
||||
#define USB_HWDESC_HEADER_LEN 32
|
||||
#define CRCLENGTH 4
|
||||
|
||||
/* Define a macro that takes a le32 word, converts it to host ordering,
|
||||
* right shifts by a specified count, creates a mask of the specified
|
||||
* bit count, and extracts that number of bits.
|
||||
*/
|
||||
|
||||
#define SHIFT_AND_MASK_LE(__pdesc, __shift, __mask) \
|
||||
((le32_to_cpu(*(((__le32 *)(__pdesc)))) >> (__shift)) & \
|
||||
BIT_LEN_MASK_32(__mask))
|
||||
|
||||
/* Define a macro that clears a bit field in an le32 word and
|
||||
* sets the specified value into that bit field. The resulting
|
||||
* value remains in le32 ordering; however, it is properly converted
|
||||
* to host ordering for the clear and set operations before conversion
|
||||
* back to le32.
|
||||
*/
|
||||
|
||||
#define SET_BITS_OFFSET_LE(__pdesc, __shift, __len, __val) \
|
||||
(*(__le32 *)(__pdesc) = \
|
||||
(cpu_to_le32((le32_to_cpu(*((__le32 *)(__pdesc))) & \
|
||||
(~(BIT_OFFSET_LEN_MASK_32((__shift), __len)))) | \
|
||||
(((u32)(__val) & BIT_LEN_MASK_32(__len)) << (__shift)))));
|
||||
|
||||
/* macros to read/write various fields in RX or TX descriptors */
|
||||
|
||||
#define SET_TX_DESC_PKT_SIZE(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc, 0, 16, __val)
|
||||
#define SET_TX_DESC_OFFSET(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc, 16, 8, __val)
|
||||
#define SET_TX_DESC_BMC(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc, 24, 1, __val)
|
||||
#define SET_TX_DESC_HTC(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc, 25, 1, __val)
|
||||
#define SET_TX_DESC_LAST_SEG(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc, 26, 1, __val)
|
||||
#define SET_TX_DESC_FIRST_SEG(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc, 27, 1, __val)
|
||||
#define SET_TX_DESC_LINIP(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc, 28, 1, __val)
|
||||
#define SET_TX_DESC_NO_ACM(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc, 29, 1, __val)
|
||||
#define SET_TX_DESC_GF(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc, 30, 1, __val)
|
||||
#define SET_TX_DESC_OWN(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc, 31, 1, __val)
|
||||
|
||||
#define GET_TX_DESC_PKT_SIZE(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 0, 16)
|
||||
#define GET_TX_DESC_OFFSET(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 16, 8)
|
||||
#define GET_TX_DESC_BMC(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 24, 1)
|
||||
#define GET_TX_DESC_HTC(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 25, 1)
|
||||
#define GET_TX_DESC_LAST_SEG(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 26, 1)
|
||||
#define GET_TX_DESC_FIRST_SEG(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 27, 1)
|
||||
#define GET_TX_DESC_LINIP(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 28, 1)
|
||||
#define GET_TX_DESC_NO_ACM(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 29, 1)
|
||||
#define GET_TX_DESC_GF(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 30, 1)
|
||||
#define GET_TX_DESC_OWN(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 31, 1)
|
||||
|
||||
#define SET_TX_DESC_MACID(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+4, 0, 5, __val)
|
||||
#define SET_TX_DESC_AGG_ENABLE(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+4, 5, 1, __val)
|
||||
#define SET_TX_DESC_BK(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+4, 6, 1, __val)
|
||||
#define SET_TX_DESC_RDG_ENABLE(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+4, 7, 1, __val)
|
||||
#define SET_TX_DESC_QUEUE_SEL(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+4, 8, 5, __val)
|
||||
#define SET_TX_DESC_RDG_NAV_EXT(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+4, 13, 1, __val)
|
||||
#define SET_TX_DESC_LSIG_TXOP_EN(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+4, 14, 1, __val)
|
||||
#define SET_TX_DESC_PIFS(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+4, 15, 1, __val)
|
||||
#define SET_TX_DESC_RATE_ID(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+4, 16, 4, __val)
|
||||
#define SET_TX_DESC_NAV_USE_HDR(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+4, 20, 1, __val)
|
||||
#define SET_TX_DESC_EN_DESC_ID(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+4, 21, 1, __val)
|
||||
#define SET_TX_DESC_SEC_TYPE(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+4, 22, 2, __val)
|
||||
#define SET_TX_DESC_PKT_OFFSET(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+4, 26, 8, __val)
|
||||
|
||||
#define GET_TX_DESC_MACID(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 0, 5)
|
||||
#define GET_TX_DESC_AGG_ENABLE(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 5, 1)
|
||||
#define GET_TX_DESC_AGG_BREAK(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 6, 1)
|
||||
#define GET_TX_DESC_RDG_ENABLE(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 7, 1)
|
||||
#define GET_TX_DESC_QUEUE_SEL(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 8, 5)
|
||||
#define GET_TX_DESC_RDG_NAV_EXT(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 13, 1)
|
||||
#define GET_TX_DESC_LSIG_TXOP_EN(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 14, 1)
|
||||
#define GET_TX_DESC_PIFS(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 15, 1)
|
||||
#define GET_TX_DESC_RATE_ID(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 16, 4)
|
||||
#define GET_TX_DESC_NAV_USE_HDR(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 20, 1)
|
||||
#define GET_TX_DESC_EN_DESC_ID(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 21, 1)
|
||||
#define GET_TX_DESC_SEC_TYPE(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 22, 2)
|
||||
#define GET_TX_DESC_PKT_OFFSET(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 24, 8)
|
||||
|
||||
#define SET_TX_DESC_RTS_RC(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+8, 0, 6, __val)
|
||||
#define SET_TX_DESC_DATA_RC(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+8, 6, 6, __val)
|
||||
#define SET_TX_DESC_BAR_RTY_TH(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+8, 14, 2, __val)
|
||||
#define SET_TX_DESC_MORE_FRAG(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+8, 17, 1, __val)
|
||||
#define SET_TX_DESC_RAW(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+8, 18, 1, __val)
|
||||
#define SET_TX_DESC_CCX(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+8, 19, 1, __val)
|
||||
#define SET_TX_DESC_AMPDU_DENSITY(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+8, 20, 3, __val)
|
||||
#define SET_TX_DESC_ANTSEL_A(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+8, 24, 1, __val)
|
||||
#define SET_TX_DESC_ANTSEL_B(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+8, 25, 1, __val)
|
||||
#define SET_TX_DESC_TX_ANT_CCK(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+8, 26, 2, __val)
|
||||
#define SET_TX_DESC_TX_ANTL(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+8, 28, 2, __val)
|
||||
#define SET_TX_DESC_TX_ANT_HT(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+8, 30, 2, __val)
|
||||
|
||||
#define GET_TX_DESC_RTS_RC(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+8, 0, 6)
|
||||
#define GET_TX_DESC_DATA_RC(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+8, 6, 6)
|
||||
#define GET_TX_DESC_BAR_RTY_TH(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+8, 14, 2)
|
||||
#define GET_TX_DESC_MORE_FRAG(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+8, 17, 1)
|
||||
#define GET_TX_DESC_RAW(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+8, 18, 1)
|
||||
#define GET_TX_DESC_CCX(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+8, 19, 1)
|
||||
#define GET_TX_DESC_AMPDU_DENSITY(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+8, 20, 3)
|
||||
#define GET_TX_DESC_ANTSEL_A(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+8, 24, 1)
|
||||
#define GET_TX_DESC_ANTSEL_B(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+8, 25, 1)
|
||||
#define GET_TX_DESC_TX_ANT_CCK(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+8, 26, 2)
|
||||
#define GET_TX_DESC_TX_ANTL(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+8, 28, 2)
|
||||
#define GET_TX_DESC_TX_ANT_HT(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+8, 30, 2)
|
||||
|
||||
#define SET_TX_DESC_NEXT_HEAP_PAGE(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+12, 0, 8, __val)
|
||||
#define SET_TX_DESC_TAIL_PAGE(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+12, 8, 8, __val)
|
||||
#define SET_TX_DESC_SEQ(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+12, 16, 12, __val)
|
||||
#define SET_TX_DESC_PKT_ID(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+12, 28, 4, __val)
|
||||
|
||||
#define GET_TX_DESC_NEXT_HEAP_PAGE(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+12, 0, 8)
|
||||
#define GET_TX_DESC_TAIL_PAGE(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+12, 8, 8)
|
||||
#define GET_TX_DESC_SEQ(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+12, 16, 12)
|
||||
#define GET_TX_DESC_PKT_ID(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+12, 28, 4)
|
||||
|
||||
#define SET_TX_DESC_RTS_RATE(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+16, 0, 5, __val)
|
||||
#define SET_TX_DESC_AP_DCFE(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+16, 5, 1, __val)
|
||||
#define SET_TX_DESC_QOS(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+16, 6, 1, __val)
|
||||
#define SET_TX_DESC_HWSEQ_EN(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+16, 7, 1, __val)
|
||||
#define SET_TX_DESC_USE_RATE(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+16, 8, 1, __val)
|
||||
#define SET_TX_DESC_DISABLE_RTS_FB(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+16, 9, 1, __val)
|
||||
#define SET_TX_DESC_DISABLE_FB(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+16, 10, 1, __val)
|
||||
#define SET_TX_DESC_CTS2SELF(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+16, 11, 1, __val)
|
||||
#define SET_TX_DESC_RTS_ENABLE(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+16, 12, 1, __val)
|
||||
#define SET_TX_DESC_HW_RTS_ENABLE(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+16, 13, 1, __val)
|
||||
#define SET_TX_DESC_PORT_ID(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+16, 14, 1, __val)
|
||||
#define SET_TX_DESC_WAIT_DCTS(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+16, 18, 1, __val)
|
||||
#define SET_TX_DESC_CTS2AP_EN(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+16, 19, 1, __val)
|
||||
#define SET_TX_DESC_TX_SUB_CARRIER(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+16, 20, 2, __val)
|
||||
#define SET_TX_DESC_TX_STBC(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+16, 22, 2, __val)
|
||||
#define SET_TX_DESC_DATA_SHORT(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+16, 24, 1, __val)
|
||||
#define SET_TX_DESC_DATA_BW(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+16, 25, 1, __val)
|
||||
#define SET_TX_DESC_RTS_SHORT(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+16, 26, 1, __val)
|
||||
#define SET_TX_DESC_RTS_BW(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+16, 27, 1, __val)
|
||||
#define SET_TX_DESC_RTS_SC(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+16, 28, 2, __val)
|
||||
#define SET_TX_DESC_RTS_STBC(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+16, 30, 2, __val)
|
||||
|
||||
#define GET_TX_DESC_RTS_RATE(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 0, 5)
|
||||
#define GET_TX_DESC_AP_DCFE(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 5, 1)
|
||||
#define GET_TX_DESC_QOS(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 6, 1)
|
||||
#define GET_TX_DESC_HWSEQ_EN(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 7, 1)
|
||||
#define GET_TX_DESC_USE_RATE(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 8, 1)
|
||||
#define GET_TX_DESC_DISABLE_RTS_FB(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 9, 1)
|
||||
#define GET_TX_DESC_DISABLE_FB(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 10, 1)
|
||||
#define GET_TX_DESC_CTS2SELF(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 11, 1)
|
||||
#define GET_TX_DESC_RTS_ENABLE(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 12, 1)
|
||||
#define GET_TX_DESC_HW_RTS_ENABLE(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 13, 1)
|
||||
#define GET_TX_DESC_PORT_ID(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 14, 1)
|
||||
#define GET_TX_DESC_WAIT_DCTS(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 18, 1)
|
||||
#define GET_TX_DESC_CTS2AP_EN(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 19, 1)
|
||||
#define GET_TX_DESC_TX_SUB_CARRIER(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 20, 2)
|
||||
#define GET_TX_DESC_TX_STBC(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 22, 2)
|
||||
#define GET_TX_DESC_DATA_SHORT(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 24, 1)
|
||||
#define GET_TX_DESC_DATA_BW(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 25, 1)
|
||||
#define GET_TX_DESC_RTS_SHORT(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 26, 1)
|
||||
#define GET_TX_DESC_RTS_BW(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 27, 1)
|
||||
#define GET_TX_DESC_RTS_SC(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 28, 2)
|
||||
#define GET_TX_DESC_RTS_STBC(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 30, 2)
|
||||
|
||||
#define SET_TX_DESC_TX_RATE(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+20, 0, 6, __val)
|
||||
#define SET_TX_DESC_DATA_SHORTGI(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+20, 6, 1, __val)
|
||||
#define SET_TX_DESC_CCX_TAG(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+20, 7, 1, __val)
|
||||
#define SET_TX_DESC_DATA_RATE_FB_LIMIT(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+20, 8, 5, __val)
|
||||
#define SET_TX_DESC_RTS_RATE_FB_LIMIT(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+20, 13, 4, __val)
|
||||
#define SET_TX_DESC_RETRY_LIMIT_ENABLE(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+20, 17, 1, __val)
|
||||
#define SET_TX_DESC_DATA_RETRY_LIMIT(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+20, 18, 6, __val)
|
||||
#define SET_TX_DESC_USB_TXAGG_NUM(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+20, 24, 8, __val)
|
||||
|
||||
#define GET_TX_DESC_TX_RATE(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+20, 0, 6)
|
||||
#define GET_TX_DESC_DATA_SHORTGI(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+20, 6, 1)
|
||||
#define GET_TX_DESC_CCX_TAG(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+20, 7, 1)
|
||||
#define GET_TX_DESC_DATA_RATE_FB_LIMIT(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+20, 8, 5)
|
||||
#define GET_TX_DESC_RTS_RATE_FB_LIMIT(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+20, 13, 4)
|
||||
#define GET_TX_DESC_RETRY_LIMIT_ENABLE(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+20, 17, 1)
|
||||
#define GET_TX_DESC_DATA_RETRY_LIMIT(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+20, 18, 6)
|
||||
#define GET_TX_DESC_USB_TXAGG_NUM(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+20, 24, 8)
|
||||
|
||||
#define SET_TX_DESC_TXAGC_A(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+24, 0, 5, __val)
|
||||
#define SET_TX_DESC_TXAGC_B(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+24, 5, 5, __val)
|
||||
#define SET_TX_DESC_USE_MAX_LEN(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+24, 10, 1, __val)
|
||||
#define SET_TX_DESC_MAX_AGG_NUM(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+24, 11, 5, __val)
|
||||
#define SET_TX_DESC_MCSG1_MAX_LEN(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+24, 16, 4, __val)
|
||||
#define SET_TX_DESC_MCSG2_MAX_LEN(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+24, 20, 4, __val)
|
||||
#define SET_TX_DESC_MCSG3_MAX_LEN(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+24, 24, 4, __val)
|
||||
#define SET_TX_DESC_MCS7_SGI_MAX_LEN(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+24, 28, 4, __val)
|
||||
|
||||
#define GET_TX_DESC_TXAGC_A(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+24, 0, 5)
|
||||
#define GET_TX_DESC_TXAGC_B(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+24, 5, 5)
|
||||
#define GET_TX_DESC_USE_MAX_LEN(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+24, 10, 1)
|
||||
#define GET_TX_DESC_MAX_AGG_NUM(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+24, 11, 5)
|
||||
#define GET_TX_DESC_MCSG1_MAX_LEN(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+24, 16, 4)
|
||||
#define GET_TX_DESC_MCSG2_MAX_LEN(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+24, 20, 4)
|
||||
#define GET_TX_DESC_MCSG3_MAX_LEN(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+24, 24, 4)
|
||||
#define GET_TX_DESC_MCS7_SGI_MAX_LEN(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+24, 28, 4)
|
||||
|
||||
#define SET_TX_DESC_TX_BUFFER_SIZE(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+28, 0, 16, __val)
|
||||
#define SET_TX_DESC_MCSG4_MAX_LEN(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+28, 16, 4, __val)
|
||||
#define SET_TX_DESC_MCSG5_MAX_LEN(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+28, 20, 4, __val)
|
||||
#define SET_TX_DESC_MCSG6_MAX_LEN(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+28, 24, 4, __val)
|
||||
#define SET_TX_DESC_MCS15_SGI_MAX_LEN(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+28, 28, 4, __val)
|
||||
|
||||
#define GET_TX_DESC_TX_BUFFER_SIZE(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+28, 0, 16)
|
||||
#define GET_TX_DESC_MCSG4_MAX_LEN(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+28, 16, 4)
|
||||
#define GET_TX_DESC_MCSG5_MAX_LEN(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+28, 20, 4)
|
||||
#define GET_TX_DESC_MCSG6_MAX_LEN(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+28, 24, 4)
|
||||
#define GET_TX_DESC_MCS15_SGI_MAX_LEN(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+28, 28, 4)
|
||||
|
||||
#define SET_TX_DESC_TX_BUFFER_ADDRESS(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+32, 0, 32, __val)
|
||||
#define SET_TX_DESC_TX_BUFFER_ADDRESS64(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+36, 0, 32, __val)
|
||||
|
||||
#define GET_TX_DESC_TX_BUFFER_ADDRESS(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+32, 0, 32)
|
||||
#define GET_TX_DESC_TX_BUFFER_ADDRESS64(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+36, 0, 32)
|
||||
|
||||
#define SET_TX_DESC_NEXT_DESC_ADDRESS(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+40, 0, 32, __val)
|
||||
#define SET_TX_DESC_NEXT_DESC_ADDRESS64(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+44, 0, 32, __val)
|
||||
|
||||
#define GET_TX_DESC_NEXT_DESC_ADDRESS(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+40, 0, 32)
|
||||
#define GET_TX_DESC_NEXT_DESC_ADDRESS64(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+44, 0, 32)
|
||||
|
||||
#define GET_RX_DESC_PKT_LEN(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 0, 14)
|
||||
#define GET_RX_DESC_CRC32(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 14, 1)
|
||||
#define GET_RX_DESC_ICV(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 15, 1)
|
||||
#define GET_RX_DESC_DRV_INFO_SIZE(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 16, 4)
|
||||
#define GET_RX_DESC_SECURITY(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 20, 3)
|
||||
#define GET_RX_DESC_QOS(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 23, 1)
|
||||
#define GET_RX_DESC_SHIFT(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 24, 2)
|
||||
#define GET_RX_DESC_PHYST(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 26, 1)
|
||||
#define GET_RX_DESC_SWDEC(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 27, 1)
|
||||
#define GET_RX_DESC_LS(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 28, 1)
|
||||
#define GET_RX_DESC_FS(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 29, 1)
|
||||
#define GET_RX_DESC_EOR(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 30, 1)
|
||||
#define GET_RX_DESC_OWN(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc, 31, 1)
|
||||
|
||||
#define SET_RX_DESC_PKT_LEN(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc, 0, 14, __val)
|
||||
#define SET_RX_DESC_EOR(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc, 30, 1, __val)
|
||||
#define SET_RX_DESC_OWN(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc, 31, 1, __val)
|
||||
|
||||
#define GET_RX_DESC_MACID(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 0, 5)
|
||||
#define GET_RX_DESC_TID(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 5, 4)
|
||||
#define GET_RX_DESC_HWRSVD(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 9, 5)
|
||||
#define GET_RX_DESC_PAGGR(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 14, 1)
|
||||
#define GET_RX_DESC_FAGGR(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 15, 1)
|
||||
#define GET_RX_DESC_A1_FIT(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 16, 4)
|
||||
#define GET_RX_DESC_A2_FIT(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 20, 4)
|
||||
#define GET_RX_DESC_PAM(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 24, 1)
|
||||
#define GET_RX_DESC_PWR(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 25, 1)
|
||||
#define GET_RX_DESC_MD(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 26, 1)
|
||||
#define GET_RX_DESC_MF(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 27, 1)
|
||||
#define GET_RX_DESC_TYPE(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 28, 2)
|
||||
#define GET_RX_DESC_MC(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 30, 1)
|
||||
#define GET_RX_DESC_BC(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+4, 31, 1)
|
||||
#define GET_RX_DESC_SEQ(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+8, 0, 12)
|
||||
#define GET_RX_DESC_FRAG(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+8, 12, 4)
|
||||
#define GET_RX_DESC_NEXT_PKT_LEN(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+8, 16, 14)
|
||||
#define GET_RX_DESC_NEXT_IND(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+8, 30, 1)
|
||||
#define GET_RX_DESC_RSVD(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+8, 31, 1)
|
||||
|
||||
#define GET_RX_DESC_RXMCS(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+12, 0, 6)
|
||||
#define GET_RX_DESC_RXHT(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+12, 6, 1)
|
||||
#define GET_RX_DESC_SPLCP(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+12, 8, 1)
|
||||
#define GET_RX_DESC_BW(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+12, 9, 1)
|
||||
#define GET_RX_DESC_HTC(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+12, 10, 1)
|
||||
#define GET_RX_DESC_HWPC_ERR(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+12, 14, 1)
|
||||
#define GET_RX_DESC_HWPC_IND(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+12, 15, 1)
|
||||
#define GET_RX_DESC_IV0(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+12, 16, 16)
|
||||
|
||||
#define GET_RX_DESC_IV1(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+16, 0, 32)
|
||||
#define GET_RX_DESC_TSFL(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+20, 0, 32)
|
||||
|
||||
#define GET_RX_DESC_BUFF_ADDR(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+24, 0, 32)
|
||||
#define GET_RX_DESC_BUFF_ADDR64(__pdesc) \
|
||||
SHIFT_AND_MASK_LE(__pdesc+28, 0, 32)
|
||||
|
||||
#define SET_RX_DESC_BUFF_ADDR(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+24, 0, 32, __val)
|
||||
#define SET_RX_DESC_BUFF_ADDR64(__pdesc, __val) \
|
||||
SET_BITS_OFFSET_LE(__pdesc+28, 0, 32, __val)
|
||||
|
||||
#define CLEAR_PCI_TX_DESC_CONTENT(__pdesc, _size) \
|
||||
do { \
|
||||
if (_size > TX_DESC_NEXT_DESC_OFFSET) \
|
||||
memset((void *)__pdesc, 0, TX_DESC_NEXT_DESC_OFFSET); \
|
||||
else \
|
||||
memset((void *)__pdesc, 0, _size); \
|
||||
} while (0);
|
||||
|
||||
#define RX_HAL_IS_CCK_RATE(_pdesc)\
|
||||
(_pdesc->rxmcs == DESC92D_RATE1M || \
|
||||
_pdesc->rxmcs == DESC92D_RATE2M || \
|
||||
_pdesc->rxmcs == DESC92D_RATE5_5M || \
|
||||
_pdesc->rxmcs == DESC92D_RATE11M)
|
||||
|
||||
/* For 92D early mode */
|
||||
#define SET_EARLYMODE_PKTNUM(__paddr, __value) \
|
||||
SET_BITS_OFFSET_LE(__paddr, 0, 3, __value)
|
||||
#define SET_EARLYMODE_LEN0(__paddr, __value) \
|
||||
SET_BITS_OFFSET_LE(__paddr, 4, 12, __value)
|
||||
#define SET_EARLYMODE_LEN1(__paddr, __value) \
|
||||
SET_BITS_OFFSET_LE(__paddr, 16, 12, __value)
|
||||
#define SET_EARLYMODE_LEN2_1(__paddr, __value) \
|
||||
SET_BITS_OFFSET_LE(__paddr, 28, 4, __value)
|
||||
#define SET_EARLYMODE_LEN2_2(__paddr, __value) \
|
||||
SET_BITS_OFFSET_LE(__paddr+4, 0, 8, __value)
|
||||
#define SET_EARLYMODE_LEN3(__paddr, __value) \
|
||||
SET_BITS_OFFSET_LE(__paddr+4, 8, 12, __value)
|
||||
#define SET_EARLYMODE_LEN4(__paddr, __value) \
|
||||
SET_BITS_OFFSET_LE(__paddr+4, 20, 12, __value)
|
||||
|
||||
struct rx_fwinfo_92d {
|
||||
u8 gain_trsw[4];
|
||||
u8 pwdb_all;
|
||||
u8 cfosho[4];
|
||||
u8 cfotail[4];
|
||||
char rxevm[2];
|
||||
char rxsnr[4];
|
||||
u8 pdsnr[2];
|
||||
u8 csi_current[2];
|
||||
u8 csi_target[2];
|
||||
u8 sigevm;
|
||||
u8 max_ex_pwr;
|
||||
u8 ex_intf_flag:1;
|
||||
u8 sgi_en:1;
|
||||
u8 rxsc:2;
|
||||
u8 reserve:4;
|
||||
} __packed;
|
||||
|
||||
struct tx_desc_92d {
|
||||
u32 pktsize:16;
|
||||
u32 offset:8;
|
||||
u32 bmc:1;
|
||||
u32 htc:1;
|
||||
u32 lastseg:1;
|
||||
u32 firstseg:1;
|
||||
u32 linip:1;
|
||||
u32 noacm:1;
|
||||
u32 gf:1;
|
||||
u32 own:1;
|
||||
|
||||
u32 macid:5;
|
||||
u32 agg_en:1;
|
||||
u32 bk:1;
|
||||
u32 rdg_en:1;
|
||||
u32 queuesel:5;
|
||||
u32 rd_nav_ext:1;
|
||||
u32 lsig_txop_en:1;
|
||||
u32 pifs:1;
|
||||
u32 rateid:4;
|
||||
u32 nav_usehdr:1;
|
||||
u32 en_descid:1;
|
||||
u32 sectype:2;
|
||||
u32 pktoffset:8;
|
||||
|
||||
u32 rts_rc:6;
|
||||
u32 data_rc:6;
|
||||
u32 rsvd0:2;
|
||||
u32 bar_retryht:2;
|
||||
u32 rsvd1:1;
|
||||
u32 morefrag:1;
|
||||
u32 raw:1;
|
||||
u32 ccx:1;
|
||||
u32 ampdudensity:3;
|
||||
u32 rsvd2:1;
|
||||
u32 ant_sela:1;
|
||||
u32 ant_selb:1;
|
||||
u32 txant_cck:2;
|
||||
u32 txant_l:2;
|
||||
u32 txant_ht:2;
|
||||
|
||||
u32 nextheadpage:8;
|
||||
u32 tailpage:8;
|
||||
u32 seq:12;
|
||||
u32 pktid:4;
|
||||
|
||||
u32 rtsrate:5;
|
||||
u32 apdcfe:1;
|
||||
u32 qos:1;
|
||||
u32 hwseq_enable:1;
|
||||
u32 userrate:1;
|
||||
u32 dis_rtsfb:1;
|
||||
u32 dis_datafb:1;
|
||||
u32 cts2self:1;
|
||||
u32 rts_en:1;
|
||||
u32 hwrts_en:1;
|
||||
u32 portid:1;
|
||||
u32 rsvd3:3;
|
||||
u32 waitdcts:1;
|
||||
u32 cts2ap_en:1;
|
||||
u32 txsc:2;
|
||||
u32 stbc:2;
|
||||
u32 txshort:1;
|
||||
u32 txbw:1;
|
||||
u32 rtsshort:1;
|
||||
u32 rtsbw:1;
|
||||
u32 rtssc:2;
|
||||
u32 rtsstbc:2;
|
||||
|
||||
u32 txrate:6;
|
||||
u32 shortgi:1;
|
||||
u32 ccxt:1;
|
||||
u32 txrate_fb_lmt:5;
|
||||
u32 rtsrate_fb_lmt:4;
|
||||
u32 retrylmt_en:1;
|
||||
u32 txretrylmt:6;
|
||||
u32 usb_txaggnum:8;
|
||||
|
||||
u32 txagca:5;
|
||||
u32 txagcb:5;
|
||||
u32 usemaxlen:1;
|
||||
u32 maxaggnum:5;
|
||||
u32 mcsg1maxlen:4;
|
||||
u32 mcsg2maxlen:4;
|
||||
u32 mcsg3maxlen:4;
|
||||
u32 mcs7sgimaxlen:4;
|
||||
|
||||
u32 txbuffersize:16;
|
||||
u32 mcsg4maxlen:4;
|
||||
u32 mcsg5maxlen:4;
|
||||
u32 mcsg6maxlen:4;
|
||||
u32 mcsg15sgimaxlen:4;
|
||||
|
||||
u32 txbuffaddr;
|
||||
u32 txbufferaddr64;
|
||||
u32 nextdescaddress;
|
||||
u32 nextdescaddress64;
|
||||
|
||||
u32 reserve_pass_pcie_mm_limit[4];
|
||||
} __packed;
|
||||
|
||||
struct rx_desc_92d {
|
||||
u32 length:14;
|
||||
u32 crc32:1;
|
||||
u32 icverror:1;
|
||||
u32 drv_infosize:4;
|
||||
u32 security:3;
|
||||
u32 qos:1;
|
||||
u32 shift:2;
|
||||
u32 phystatus:1;
|
||||
u32 swdec:1;
|
||||
u32 lastseg:1;
|
||||
u32 firstseg:1;
|
||||
u32 eor:1;
|
||||
u32 own:1;
|
||||
|
||||
u32 macid:5;
|
||||
u32 tid:4;
|
||||
u32 hwrsvd:5;
|
||||
u32 paggr:1;
|
||||
u32 faggr:1;
|
||||
u32 a1_fit:4;
|
||||
u32 a2_fit:4;
|
||||
u32 pam:1;
|
||||
u32 pwr:1;
|
||||
u32 moredata:1;
|
||||
u32 morefrag:1;
|
||||
u32 type:2;
|
||||
u32 mc:1;
|
||||
u32 bc:1;
|
||||
|
||||
u32 seq:12;
|
||||
u32 frag:4;
|
||||
u32 nextpktlen:14;
|
||||
u32 nextind:1;
|
||||
u32 rsvd:1;
|
||||
|
||||
u32 rxmcs:6;
|
||||
u32 rxht:1;
|
||||
u32 amsdu:1;
|
||||
u32 splcp:1;
|
||||
u32 bandwidth:1;
|
||||
u32 htc:1;
|
||||
u32 tcpchk_rpt:1;
|
||||
u32 ipcchk_rpt:1;
|
||||
u32 tcpchk_valid:1;
|
||||
u32 hwpcerr:1;
|
||||
u32 hwpcind:1;
|
||||
u32 iv0:16;
|
||||
|
||||
u32 iv1;
|
||||
|
||||
u32 tsfl;
|
||||
|
||||
u32 bufferaddress;
|
||||
u32 bufferaddress64;
|
||||
|
||||
} __packed;
|
||||
|
||||
void rtl92de_tx_fill_desc(struct ieee80211_hw *hw,
|
||||
struct ieee80211_hdr *hdr,
|
||||
u8 *pdesc, struct ieee80211_tx_info *info,
|
||||
struct sk_buff *skb, u8 hw_queue,
|
||||
struct rtl_tcb_desc *ptcb_desc);
|
||||
bool rtl92de_rx_query_desc(struct ieee80211_hw *hw,
|
||||
struct rtl_stats *stats,
|
||||
struct ieee80211_rx_status *rx_status,
|
||||
u8 *pdesc, struct sk_buff *skb);
|
||||
void rtl92de_set_desc(u8 *pdesc, bool istx, u8 desc_name, u8 *val);
|
||||
u32 rtl92de_get_desc(u8 *pdesc, bool istx, u8 desc_name);
|
||||
void rtl92de_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
|
||||
void rtl92de_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
|
||||
bool b_firstseg, bool b_lastseg,
|
||||
struct sk_buff *skb);
|
||||
|
||||
#endif
|
|
@ -302,9 +302,6 @@ enum hw_variables {
|
|||
HW_VAR_DATA_FILTER,
|
||||
};
|
||||
|
||||
#define HWSET_MAX_SIZE 128
|
||||
#define EFUSE_MAX_SECTION 16
|
||||
|
||||
enum _RT_MEDIA_STATUS {
|
||||
RT_MEDIA_DISCONNECT = 0,
|
||||
RT_MEDIA_CONNECT = 1
|
||||
|
|
|
@ -1167,14 +1167,7 @@ int wl1271_cmd_add_sta(struct wl1271 *wl, struct ieee80211_sta *sta, u8 hlid)
|
|||
cmd->bss_index = WL1271_AP_BSS_INDEX;
|
||||
cmd->aid = sta->aid;
|
||||
cmd->hlid = hlid;
|
||||
|
||||
/*
|
||||
* FIXME: Does STA support QOS? We need to propagate this info from
|
||||
* hostapd. Currently not that important since this is only used for
|
||||
* sending the correct flavor of null-data packet in response to a
|
||||
* trigger.
|
||||
*/
|
||||
cmd->wmm = 0;
|
||||
cmd->wmm = sta->wme ? 1 : 0;
|
||||
|
||||
cmd->supported_rates = cpu_to_le32(wl1271_tx_enabled_rates_get(wl,
|
||||
sta->supp_rates[wl->band]));
|
||||
|
|
|
@ -1002,8 +1002,8 @@ u32 ssb_calc_clock_rate(u32 plltype, u32 n, u32 m)
|
|||
switch (plltype) {
|
||||
case SSB_PLLTYPE_6: /* 100/200 or 120/240 only */
|
||||
if (m & SSB_CHIPCO_CLK_T6_MMASK)
|
||||
return SSB_CHIPCO_CLK_T6_M0;
|
||||
return SSB_CHIPCO_CLK_T6_M1;
|
||||
return SSB_CHIPCO_CLK_T6_M1;
|
||||
return SSB_CHIPCO_CLK_T6_M0;
|
||||
case SSB_PLLTYPE_1: /* 48Mhz base, 3 dividers */
|
||||
case SSB_PLLTYPE_3: /* 25Mhz, 2 dividers */
|
||||
case SSB_PLLTYPE_4: /* 48Mhz, 4 dividers */
|
||||
|
|
|
@ -310,8 +310,7 @@ int ssb_bus_scan(struct ssb_bus *bus,
|
|||
} else {
|
||||
if (bus->bustype == SSB_BUSTYPE_PCI) {
|
||||
bus->chip_id = pcidev_to_chipid(bus->host_pci);
|
||||
pci_read_config_byte(bus->host_pci, PCI_REVISION_ID,
|
||||
&bus->chip_rev);
|
||||
bus->chip_rev = bus->host_pci->revision;
|
||||
bus->chip_package = 0;
|
||||
} else {
|
||||
bus->chip_id = 0x4710;
|
||||
|
|
|
@ -117,8 +117,19 @@
|
|||
#define IEEE80211_MAX_MESH_ID_LEN 32
|
||||
|
||||
#define IEEE80211_QOS_CTL_LEN 2
|
||||
#define IEEE80211_QOS_CTL_TID_MASK 0x000F
|
||||
#define IEEE80211_QOS_CTL_TAG1D_MASK 0x0007
|
||||
/* 1d tag mask */
|
||||
#define IEEE80211_QOS_CTL_TAG1D_MASK 0x0007
|
||||
/* TID mask */
|
||||
#define IEEE80211_QOS_CTL_TID_MASK 0x000f
|
||||
/* EOSP */
|
||||
#define IEEE80211_QOS_CTL_EOSP 0x0010
|
||||
/* ACK policy */
|
||||
#define IEEE80211_QOS_CTL_ACK_POLICY_NORMAL 0x0000
|
||||
#define IEEE80211_QOS_CTL_ACK_POLICY_NOACK 0x0020
|
||||
#define IEEE80211_QOS_CTL_ACK_POLICY_NO_EXPL 0x0040
|
||||
#define IEEE80211_QOS_CTL_ACK_POLICY_BLOCKACK 0x0060
|
||||
/* A-MSDU 802.11n */
|
||||
#define IEEE80211_QOS_CTL_A_MSDU_PRESENT 0x0080
|
||||
|
||||
/* U-APSD queue for WMM IEs sent by AP */
|
||||
#define IEEE80211_WMM_IE_AP_QOSINFO_UAPSD (1<<7)
|
||||
|
@ -1423,9 +1434,6 @@ enum ieee80211_sa_query_action {
|
|||
};
|
||||
|
||||
|
||||
/* A-MSDU 802.11n */
|
||||
#define IEEE80211_QOS_CONTROL_A_MSDU_PRESENT 0x0080
|
||||
|
||||
/* cipher suite selectors */
|
||||
#define WLAN_CIPHER_SUITE_USE_GROUP 0x000FAC00
|
||||
#define WLAN_CIPHER_SUITE_WEP40 0x000FAC01
|
||||
|
|
|
@ -2697,7 +2697,7 @@ void cfg80211_send_unprot_disassoc(struct net_device *dev, const u8 *buf,
|
|||
* @dev: network device
|
||||
* @addr: The source MAC address of the frame
|
||||
* @key_type: The key type that the received frame used
|
||||
* @key_id: Key identifier (0..3)
|
||||
* @key_id: Key identifier (0..3). Can be -1 if missing.
|
||||
* @tsc: The TSC value of the frame that generated the MIC failure (6 octets)
|
||||
* @gfp: allocation flags
|
||||
*
|
||||
|
|
|
@ -933,6 +933,7 @@ enum set_key_cmd {
|
|||
* @aid: AID we assigned to the station if we're an AP
|
||||
* @supp_rates: Bitmap of supported rates (per band)
|
||||
* @ht_cap: HT capabilities of this STA; restricted to our own TX capabilities
|
||||
* @wme: indicates whether the STA supports WME. Only valid during AP-mode.
|
||||
* @drv_priv: data area for driver use, will always be aligned to
|
||||
* sizeof(void *), size is determined in hw information.
|
||||
*/
|
||||
|
@ -941,6 +942,7 @@ struct ieee80211_sta {
|
|||
u8 addr[ETH_ALEN];
|
||||
u16 aid;
|
||||
struct ieee80211_sta_ht_cap ht_cap;
|
||||
bool wme;
|
||||
|
||||
/* must be last */
|
||||
u8 drv_priv[0] __attribute__((__aligned__(sizeof(void *))));
|
||||
|
|
|
@ -6,6 +6,7 @@ menuconfig BT
|
|||
tristate "Bluetooth subsystem support"
|
||||
depends on NET && !S390
|
||||
depends on RFKILL || !RFKILL
|
||||
select CRYPTO
|
||||
help
|
||||
Bluetooth is low-cost, low-power, short-range wireless technology.
|
||||
It was designed as a replacement for cables and other short-range
|
||||
|
|
|
@ -262,7 +262,11 @@ void ieee80211_process_addba_request(struct ieee80211_local *local,
|
|||
"%pM on tid %u\n",
|
||||
mgmt->sa, tid);
|
||||
#endif /* CONFIG_MAC80211_HT_DEBUG */
|
||||
goto end;
|
||||
|
||||
/* delete existing Rx BA session on the same tid */
|
||||
___ieee80211_stop_rx_ba_session(sta, tid, WLAN_BACK_RECIPIENT,
|
||||
WLAN_STATUS_UNSPECIFIED_QOS,
|
||||
false);
|
||||
}
|
||||
|
||||
/* prepare A-MPDU MLME for Rx aggregation */
|
||||
|
|
|
@ -674,8 +674,11 @@ static void sta_apply_parameters(struct ieee80211_local *local,
|
|||
|
||||
if (mask & BIT(NL80211_STA_FLAG_WME)) {
|
||||
sta->flags &= ~WLAN_STA_WME;
|
||||
if (set & BIT(NL80211_STA_FLAG_WME))
|
||||
sta->sta.wme = false;
|
||||
if (set & BIT(NL80211_STA_FLAG_WME)) {
|
||||
sta->flags |= WLAN_STA_WME;
|
||||
sta->sta.wme = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (mask & BIT(NL80211_STA_FLAG_MFP)) {
|
||||
|
|
|
@ -1350,10 +1350,12 @@ int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer,
|
|||
struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata,
|
||||
u8 *dst,
|
||||
const u8 *ssid, size_t ssid_len,
|
||||
const u8 *ie, size_t ie_len);
|
||||
const u8 *ie, size_t ie_len,
|
||||
bool directed);
|
||||
void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst,
|
||||
const u8 *ssid, size_t ssid_len,
|
||||
const u8 *ie, size_t ie_len);
|
||||
const u8 *ie, size_t ie_len,
|
||||
bool directed);
|
||||
|
||||
void ieee80211_sta_def_wmm_params(struct ieee80211_sub_if_data *sdata,
|
||||
const size_t supp_rates_len,
|
||||
|
|
|
@ -760,23 +760,34 @@ void ieee80211_dynamic_ps_enable_work(struct work_struct *work)
|
|||
if (local->hw.conf.flags & IEEE80211_CONF_PS)
|
||||
return;
|
||||
|
||||
/*
|
||||
* transmission can be stopped by others which leads to
|
||||
* dynamic_ps_timer expiry. Postpond the ps timer if it
|
||||
* is not the actual idle state.
|
||||
*/
|
||||
spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
|
||||
for (q = 0; q < local->hw.queues; q++) {
|
||||
if (local->queue_stop_reasons[q]) {
|
||||
spin_unlock_irqrestore(&local->queue_stop_reason_lock,
|
||||
flags);
|
||||
if (!local->disable_dynamic_ps &&
|
||||
local->hw.conf.dynamic_ps_timeout > 0) {
|
||||
/* don't enter PS if TX frames are pending */
|
||||
if (drv_tx_frames_pending(local)) {
|
||||
mod_timer(&local->dynamic_ps_timer, jiffies +
|
||||
msecs_to_jiffies(
|
||||
local->hw.conf.dynamic_ps_timeout));
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* transmission can be stopped by others which leads to
|
||||
* dynamic_ps_timer expiry. Postpone the ps timer if it
|
||||
* is not the actual idle state.
|
||||
*/
|
||||
spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
|
||||
for (q = 0; q < local->hw.queues; q++) {
|
||||
if (local->queue_stop_reasons[q]) {
|
||||
spin_unlock_irqrestore(&local->queue_stop_reason_lock,
|
||||
flags);
|
||||
mod_timer(&local->dynamic_ps_timer, jiffies +
|
||||
msecs_to_jiffies(
|
||||
local->hw.conf.dynamic_ps_timeout));
|
||||
return;
|
||||
}
|
||||
}
|
||||
spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
|
||||
}
|
||||
spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
|
||||
|
||||
if ((local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK) &&
|
||||
(!(ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED))) {
|
||||
|
@ -801,7 +812,8 @@ void ieee80211_dynamic_ps_enable_work(struct work_struct *work)
|
|||
ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
|
||||
}
|
||||
|
||||
netif_tx_wake_all_queues(sdata->dev);
|
||||
if (local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)
|
||||
netif_tx_wake_all_queues(sdata->dev);
|
||||
}
|
||||
|
||||
void ieee80211_dynamic_ps_timer(unsigned long data)
|
||||
|
@ -1204,7 +1216,8 @@ static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata)
|
|||
ieee80211_send_nullfunc(sdata->local, sdata, 0);
|
||||
} else {
|
||||
ssid = ieee80211_bss_get_ie(ifmgd->associated, WLAN_EID_SSID);
|
||||
ieee80211_send_probe_req(sdata, dst, ssid + 2, ssid[1], NULL, 0);
|
||||
ieee80211_send_probe_req(sdata, dst, ssid + 2, ssid[1], NULL, 0,
|
||||
true);
|
||||
}
|
||||
|
||||
ifmgd->probe_send_count++;
|
||||
|
@ -1289,7 +1302,7 @@ struct sk_buff *ieee80211_ap_probereq_get(struct ieee80211_hw *hw,
|
|||
|
||||
ssid = ieee80211_bss_get_ie(ifmgd->associated, WLAN_EID_SSID);
|
||||
skb = ieee80211_build_probe_req(sdata, ifmgd->associated->bssid,
|
||||
ssid + 2, ssid[1], NULL, 0);
|
||||
ssid + 2, ssid[1], NULL, 0, true);
|
||||
|
||||
return skb;
|
||||
}
|
||||
|
|
|
@ -338,7 +338,7 @@ static void ieee80211_parse_qos(struct ieee80211_rx_data *rx)
|
|||
u8 *qc = ieee80211_get_qos_ctl(hdr);
|
||||
/* frame has qos control */
|
||||
tid = *qc & IEEE80211_QOS_CTL_TID_MASK;
|
||||
if (*qc & IEEE80211_QOS_CONTROL_A_MSDU_PRESENT)
|
||||
if (*qc & IEEE80211_QOS_CTL_A_MSDU_PRESENT)
|
||||
status->rx_flags |= IEEE80211_RX_AMSDU;
|
||||
} else {
|
||||
/*
|
||||
|
|
|
@ -228,6 +228,7 @@ ieee80211_scan_rx(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb)
|
|||
static bool ieee80211_prep_hw_scan(struct ieee80211_local *local)
|
||||
{
|
||||
struct cfg80211_scan_request *req = local->scan_req;
|
||||
struct ieee80211_sub_if_data *sdata = local->scan_sdata;
|
||||
enum ieee80211_band band;
|
||||
int i, ielen, n_chans;
|
||||
|
||||
|
@ -251,8 +252,8 @@ static bool ieee80211_prep_hw_scan(struct ieee80211_local *local)
|
|||
local->hw_scan_req->n_channels = n_chans;
|
||||
|
||||
ielen = ieee80211_build_preq_ies(local, (u8 *)local->hw_scan_req->ie,
|
||||
req->ie, req->ie_len, band, (u32) -1,
|
||||
0);
|
||||
req->ie, req->ie_len, band,
|
||||
sdata->rc_rateidx_mask[band], 0);
|
||||
local->hw_scan_req->ie_len = ielen;
|
||||
|
||||
return true;
|
||||
|
@ -658,7 +659,8 @@ static void ieee80211_scan_state_send_probe(struct ieee80211_local *local,
|
|||
sdata, NULL,
|
||||
local->scan_req->ssids[i].ssid,
|
||||
local->scan_req->ssids[i].ssid_len,
|
||||
local->scan_req->ie, local->scan_req->ie_len);
|
||||
local->scan_req->ie, local->scan_req->ie_len,
|
||||
false);
|
||||
|
||||
/*
|
||||
* After sending probe requests, wait for probe responses
|
||||
|
|
|
@ -1018,7 +1018,8 @@ int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer,
|
|||
struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata,
|
||||
u8 *dst,
|
||||
const u8 *ssid, size_t ssid_len,
|
||||
const u8 *ie, size_t ie_len)
|
||||
const u8 *ie, size_t ie_len,
|
||||
bool directed)
|
||||
{
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct sk_buff *skb;
|
||||
|
@ -1035,8 +1036,16 @@ struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
chan = ieee80211_frequency_to_channel(
|
||||
local->hw.conf.channel->center_freq);
|
||||
/*
|
||||
* Do not send DS Channel parameter for directed probe requests
|
||||
* in order to maximize the chance that we get a response. Some
|
||||
* badly-behaved APs don't respond when this parameter is included.
|
||||
*/
|
||||
if (directed)
|
||||
chan = 0;
|
||||
else
|
||||
chan = ieee80211_frequency_to_channel(
|
||||
local->hw.conf.channel->center_freq);
|
||||
|
||||
buf_len = ieee80211_build_preq_ies(local, buf, ie, ie_len,
|
||||
local->hw.conf.channel->band,
|
||||
|
@ -1062,11 +1071,13 @@ struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata,
|
|||
|
||||
void ieee80211_send_probe_req(struct ieee80211_sub_if_data *sdata, u8 *dst,
|
||||
const u8 *ssid, size_t ssid_len,
|
||||
const u8 *ie, size_t ie_len)
|
||||
const u8 *ie, size_t ie_len,
|
||||
bool directed)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
||||
skb = ieee80211_build_probe_req(sdata, dst, ssid, ssid_len, ie, ie_len);
|
||||
skb = ieee80211_build_probe_req(sdata, dst, ssid, ssid_len, ie, ie_len,
|
||||
directed);
|
||||
if (skb)
|
||||
ieee80211_tx_skb(sdata, skb);
|
||||
}
|
||||
|
|
|
@ -151,8 +151,7 @@ void ieee80211_set_qos_hdr(struct ieee80211_local *local, struct sk_buff *skb)
|
|||
tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
|
||||
|
||||
if (unlikely(local->wifi_wme_noack_test))
|
||||
ack_policy |= QOS_CONTROL_ACK_POLICY_NOACK <<
|
||||
QOS_CONTROL_ACK_POLICY_SHIFT;
|
||||
ack_policy |= IEEE80211_QOS_CTL_ACK_POLICY_NOACK;
|
||||
/* qos header is 2 bytes, second reserved */
|
||||
*p++ = ack_policy | tid;
|
||||
*p = 0;
|
||||
|
|
|
@ -13,11 +13,6 @@
|
|||
#include <linux/netdevice.h>
|
||||
#include "ieee80211_i.h"
|
||||
|
||||
#define QOS_CONTROL_ACK_POLICY_NORMAL 0
|
||||
#define QOS_CONTROL_ACK_POLICY_NOACK 1
|
||||
|
||||
#define QOS_CONTROL_ACK_POLICY_SHIFT 5
|
||||
|
||||
extern const int ieee802_1d_to_ac[8];
|
||||
|
||||
u16 ieee80211_select_queue(struct ieee80211_sub_if_data *sdata,
|
||||
|
|
|
@ -450,7 +450,7 @@ ieee80211_direct_probe(struct ieee80211_work *wk)
|
|||
* will not answer to direct packet in unassociated state.
|
||||
*/
|
||||
ieee80211_send_probe_req(sdata, NULL, wk->probe_auth.ssid,
|
||||
wk->probe_auth.ssid_len, NULL, 0);
|
||||
wk->probe_auth.ssid_len, NULL, 0, true);
|
||||
|
||||
wk->timeout = jiffies + IEEE80211_AUTH_TIMEOUT;
|
||||
run_again(local, wk->timeout);
|
||||
|
|
|
@ -154,7 +154,13 @@ ieee80211_rx_h_michael_mic_verify(struct ieee80211_rx_data *rx)
|
|||
return RX_CONTINUE;
|
||||
|
||||
mic_fail:
|
||||
mac80211_ev_michael_mic_failure(rx->sdata, rx->key->conf.keyidx,
|
||||
/*
|
||||
* In some cases the key can be unset - e.g. a multicast packet, in
|
||||
* a driver that supports HW encryption. Send up the key idx only if
|
||||
* the key is set.
|
||||
*/
|
||||
mac80211_ev_michael_mic_failure(rx->sdata,
|
||||
rx->key ? rx->key->conf.keyidx : -1,
|
||||
(void *) skb->data, NULL, GFP_ATOMIC);
|
||||
return RX_DROP_UNUSABLE;
|
||||
}
|
||||
|
|
|
@ -6566,7 +6566,8 @@ void nl80211_michael_mic_failure(struct cfg80211_registered_device *rdev,
|
|||
if (addr)
|
||||
NLA_PUT(msg, NL80211_ATTR_MAC, ETH_ALEN, addr);
|
||||
NLA_PUT_U32(msg, NL80211_ATTR_KEY_TYPE, key_type);
|
||||
NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_id);
|
||||
if (key_id != -1)
|
||||
NLA_PUT_U8(msg, NL80211_ATTR_KEY_IDX, key_id);
|
||||
if (tsc)
|
||||
NLA_PUT(msg, NL80211_ATTR_KEY_SEQ, 6, tsc);
|
||||
|
||||
|
|
Loading…
Reference in a new issue