* [PATCH v2 01/26] staging: brcm80211: remove uncoditional code blocks from brcmsmac
From: Franky Lin @ 2011-09-27 17:45 UTC (permalink / raw)
To: gregkh; +Cc: devel, linux-wireless
In-Reply-To: <1317145530-18839-1-git-send-email-frankyl@broadcom.com>
From: Arend van Spriel <arend@broadcom.com>
Using a block statement to scope function variables is not
common in linux kernel development. Browsed through the brcmsmac
to remove those.
Reported-by: Johannes Berg <johannes@sipsolutions.net>
Reviewed-by: Roland Vossen <rvossen@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
---
drivers/staging/brcm80211/brcmsmac/main.c | 9 +--
drivers/staging/brcm80211/brcmsmac/phy/phy_cmn.c | 31 +++----
drivers/staging/brcm80211/brcmsmac/phy/phy_lcn.c | 106 ++++++++++------------
3 files changed, 63 insertions(+), 83 deletions(-)
diff --git a/drivers/staging/brcm80211/brcmsmac/main.c b/drivers/staging/brcm80211/brcmsmac/main.c
index 2c9ac6d..d6b43ff 100644
--- a/drivers/staging/brcm80211/brcmsmac/main.c
+++ b/drivers/staging/brcm80211/brcmsmac/main.c
@@ -5076,7 +5076,7 @@ brcms_c_attach(struct brcms_info *wl, u16 vendor, u16 device, uint unit,
{
struct brcms_c_info *wlc;
uint err = 0;
- uint j;
+ uint i, j;
struct brcms_pub *pub;
uint n_disabled;
@@ -5149,11 +5149,8 @@ brcms_c_attach(struct brcms_info *wl, u16 vendor, u16 device, uint unit,
wlc->stf->hw_rxchain);
/* pull up some info resulting from the low attach */
- {
- int i;
- for (i = 0; i < NFIFO; i++)
- wlc->core->txavail[i] = wlc->hw->txavail[i];
- }
+ for (i = 0; i < NFIFO; i++)
+ wlc->core->txavail[i] = wlc->hw->txavail[i];
brcms_b_hw_etheraddr(wlc->hw, wlc->perm_etheraddr);
diff --git a/drivers/staging/brcm80211/brcmsmac/phy/phy_cmn.c b/drivers/staging/brcm80211/brcmsmac/phy/phy_cmn.c
index 196a595..a26c682 100644
--- a/drivers/staging/brcm80211/brcmsmac/phy/phy_cmn.c
+++ b/drivers/staging/brcm80211/brcmsmac/phy/phy_cmn.c
@@ -1199,12 +1199,7 @@ static bool wlc_phy_cal_txpower_recalc_sw(struct brcms_phy *pi)
void wlc_phy_switch_radio(struct brcms_phy_pub *pih, bool on)
{
struct brcms_phy *pi = (struct brcms_phy *) pih;
-
- {
- uint mc;
-
- mc = R_REG(&pi->regs->maccontrol);
- }
+ (void)R_REG(&pi->regs->maccontrol);
if (ISNPHY(pi)) {
wlc_phy_switch_radio_nphy(pi, on);
@@ -1696,26 +1691,22 @@ void wlc_phy_txpower_recalc_target(struct brcms_phy *pi)
band,
rate);
- {
-
- wlc_phy_txpower_sromlimit((struct brcms_phy_pub *) pi,
- target_chan,
- &mintxpwr, &maxtxpwr, rate);
+ wlc_phy_txpower_sromlimit((struct brcms_phy_pub *) pi,
+ target_chan,
+ &mintxpwr, &maxtxpwr, rate);
- maxtxpwr = min(maxtxpwr, pi->txpwr_limit[rate]);
+ maxtxpwr = min(maxtxpwr, pi->txpwr_limit[rate]);
- maxtxpwr =
- (maxtxpwr > pactrl) ? (maxtxpwr - pactrl) : 0;
+ maxtxpwr = (maxtxpwr > pactrl) ? (maxtxpwr - pactrl) : 0;
- maxtxpwr = (maxtxpwr > 6) ? (maxtxpwr - 6) : 0;
+ maxtxpwr = (maxtxpwr > 6) ? (maxtxpwr - 6) : 0;
- maxtxpwr = min(maxtxpwr, tx_pwr_target[rate]);
+ maxtxpwr = min(maxtxpwr, tx_pwr_target[rate]);
- if (pi->txpwr_percent <= 100)
- maxtxpwr = (maxtxpwr * pi->txpwr_percent) / 100;
+ if (pi->txpwr_percent <= 100)
+ maxtxpwr = (maxtxpwr * pi->txpwr_percent) / 100;
- tx_pwr_target[rate] = max(maxtxpwr, mintxpwr);
- }
+ tx_pwr_target[rate] = max(maxtxpwr, mintxpwr);
tx_pwr_target[rate] =
min(tx_pwr_target[rate], pi->txpwr_env_limit[rate]);
diff --git a/drivers/staging/brcm80211/brcmsmac/phy/phy_lcn.c b/drivers/staging/brcm80211/brcmsmac/phy/phy_lcn.c
index 46661b8..fdcea56 100644
--- a/drivers/staging/brcm80211/brcmsmac/phy/phy_lcn.c
+++ b/drivers/staging/brcm80211/brcmsmac/phy/phy_lcn.c
@@ -69,6 +69,14 @@
#define LCN_TEMPSENSE_OFFSET 80812
#define LCN_TEMPSENSE_DEN 2647
+#define LCN_BW_LMT 200
+#define LCN_CUR_LMT 1250
+#define LCN_MULT 1
+#define LCN_VCO_DIV 30
+#define LCN_OFFSET 680
+#define LCN_FACT 490
+#define LCN_CUR_DIV 2640
+
#define LCNPHY_txgainctrlovrval1_pagain_ovr_val1_SHIFT \
(0 + 8)
#define LCNPHY_txgainctrlovrval1_pagain_ovr_val1_MASK \
@@ -1054,21 +1062,17 @@ static int wlc_lcnphy_calc_floor(s16 coeff_x, int type)
static void
wlc_lcnphy_get_tx_gain(struct brcms_phy *pi, struct lcnphy_txgains *gains)
{
- u16 dac_gain;
+ u16 dac_gain, rfgain0, rfgain1;
dac_gain = read_phy_reg(pi, 0x439) >> 0;
gains->dac_gain = (dac_gain & 0x380) >> 7;
- {
- u16 rfgain0, rfgain1;
-
- rfgain0 = (read_phy_reg(pi, 0x4b5) & (0xffff << 0)) >> 0;
- rfgain1 = (read_phy_reg(pi, 0x4fb) & (0x7fff << 0)) >> 0;
+ rfgain0 = (read_phy_reg(pi, 0x4b5) & (0xffff << 0)) >> 0;
+ rfgain1 = (read_phy_reg(pi, 0x4fb) & (0x7fff << 0)) >> 0;
- gains->gm_gain = rfgain0 & 0xff;
- gains->pga_gain = (rfgain0 >> 8) & 0xff;
- gains->pad_gain = rfgain1 & 0xff;
- }
+ gains->gm_gain = rfgain0 & 0xff;
+ gains->pga_gain = (rfgain0 >> 8) & 0xff;
+ gains->pad_gain = rfgain1 & 0xff;
}
@@ -1634,6 +1638,9 @@ wlc_lcnphy_radio_2064_channel_tune_4313(struct brcms_phy *pi, u8 channel)
u32 div_int, div_frac, fvco3, fpfd, fref3, fcal_div;
u16 loop_bw, d30, setCount;
+ u8 h29, h28_ten, e30, h30_ten, cp_current;
+ u16 g30, d28;
+
ci = &chan_info_2064_lcnphy[0];
rfpll_doubler = 1;
@@ -1746,27 +1753,18 @@ wlc_lcnphy_radio_2064_channel_tune_4313(struct brcms_phy *pi, u8 channel)
write_radio_reg(pi, RADIO_2064_REG042, 0xA3);
write_radio_reg(pi, RADIO_2064_REG043, 0x0C);
- {
- u8 h29, h23, c28, d29, h28_ten, e30, h30_ten, cp_current;
- u16 c29, c38, c30, g30, d28;
- c29 = loop_bw;
- d29 = 200;
- c38 = 1250;
- h29 = d29 / c29;
- h23 = 1;
- c28 = 30;
- d28 = (((PLL_2064_HIGH_END_KVCO - PLL_2064_LOW_END_KVCO) *
- (fvco3 / 2 - PLL_2064_LOW_END_VCO)) /
- (PLL_2064_HIGH_END_VCO - PLL_2064_LOW_END_VCO))
- + PLL_2064_LOW_END_KVCO;
- h28_ten = (d28 * 10) / c28;
- c30 = 2640;
- e30 = (d30 - 680) / 490;
- g30 = 680 + (e30 * 490);
- h30_ten = (g30 * 10) / c30;
- cp_current = ((c38 * h29 * h23 * 100) / h28_ten) / h30_ten;
- mod_radio_reg(pi, RADIO_2064_REG03C, 0x3f, cp_current);
- }
+ h29 = LCN_BW_LMT / loop_bw;
+ d28 = (((PLL_2064_HIGH_END_KVCO - PLL_2064_LOW_END_KVCO) *
+ (fvco3 / 2 - PLL_2064_LOW_END_VCO)) /
+ (PLL_2064_HIGH_END_VCO - PLL_2064_LOW_END_VCO))
+ + PLL_2064_LOW_END_KVCO;
+ h28_ten = (d28 * 10) / LCN_VCO_DIV;
+ e30 = (d30 - LCN_OFFSET) / LCN_FACT;
+ g30 = LCN_OFFSET + (e30 * LCN_FACT);
+ h30_ten = (g30 * 10) / LCN_CUR_DIV;
+ cp_current = ((LCN_CUR_LMT * h29 * LCN_MULT * 100) / h28_ten) / h30_ten;
+ mod_radio_reg(pi, RADIO_2064_REG03C, 0x3f, cp_current);
+
if (channel >= 1 && channel <= 5)
write_radio_reg(pi, RADIO_2064_REG03C, 0x8);
else
@@ -4838,18 +4836,13 @@ static bool wlc_phy_txpwr_srom_read_lcnphy(struct brcms_phy *pi)
pi_lcn->lcnphy_rssi_vc = (u8) PHY_GETINTVAR(pi, "rssismc2g");
pi_lcn->lcnphy_rssi_gs = (u8) PHY_GETINTVAR(pi, "rssisav2g");
- {
- pi_lcn->lcnphy_rssi_vf_lowtemp = pi_lcn->lcnphy_rssi_vf;
- pi_lcn->lcnphy_rssi_vc_lowtemp = pi_lcn->lcnphy_rssi_vc;
- pi_lcn->lcnphy_rssi_gs_lowtemp = pi_lcn->lcnphy_rssi_gs;
-
- pi_lcn->lcnphy_rssi_vf_hightemp =
- pi_lcn->lcnphy_rssi_vf;
- pi_lcn->lcnphy_rssi_vc_hightemp =
- pi_lcn->lcnphy_rssi_vc;
- pi_lcn->lcnphy_rssi_gs_hightemp =
- pi_lcn->lcnphy_rssi_gs;
- }
+ pi_lcn->lcnphy_rssi_vf_lowtemp = pi_lcn->lcnphy_rssi_vf;
+ pi_lcn->lcnphy_rssi_vc_lowtemp = pi_lcn->lcnphy_rssi_vc;
+ pi_lcn->lcnphy_rssi_gs_lowtemp = pi_lcn->lcnphy_rssi_gs;
+
+ pi_lcn->lcnphy_rssi_vf_hightemp = pi_lcn->lcnphy_rssi_vf;
+ pi_lcn->lcnphy_rssi_vc_hightemp = pi_lcn->lcnphy_rssi_vc;
+ pi_lcn->lcnphy_rssi_gs_hightemp = pi_lcn->lcnphy_rssi_gs;
txpwr = (s8) PHY_GETINTVAR(pi, "maxp2ga0");
pi->tx_srom_max_2g = txpwr;
@@ -5098,6 +5091,8 @@ s32 wlc_lcnphy_rx_signal_power(struct brcms_phy *pi, s32 gain_index)
s32 log_val, gain_mismatch, desired_gain, input_power_offset_db,
input_power_db;
s32 received_power, temperature;
+ u32 power;
+ u32 msb1, msb2, val1, val2, diff1, diff2;
uint freq;
struct brcms_phy_lcnphy *pi_lcn = pi->u.pi_lcnphy;
@@ -5107,20 +5102,17 @@ s32 wlc_lcnphy_rx_signal_power(struct brcms_phy *pi, s32 gain_index)
nominal_power_db = read_phy_reg(pi, 0x425) >> 8;
- {
- u32 power = (received_power * 16);
- u32 msb1, msb2, val1, val2, diff1, diff2;
- msb1 = ffs(power) - 1;
- msb2 = msb1 + 1;
- val1 = 1 << msb1;
- val2 = 1 << msb2;
- diff1 = (power - val1);
- diff2 = (val2 - power);
- if (diff1 < diff2)
- log_val = msb1;
- else
- log_val = msb2;
- }
+ power = (received_power * 16);
+ msb1 = ffs(power) - 1;
+ msb2 = msb1 + 1;
+ val1 = 1 << msb1;
+ val2 = 1 << msb2;
+ diff1 = (power - val1);
+ diff2 = (val2 - power);
+ if (diff1 < diff2)
+ log_val = msb1;
+ else
+ log_val = msb2;
log_val = log_val * 3;
--
1.7.1
^ permalink raw reply related
* [PATCH v2 17/26] staging: brcm80211: removed global variable in softmac otp
From: Franky Lin @ 2011-09-27 17:45 UTC (permalink / raw)
To: gregkh; +Cc: devel, linux-wireless
In-Reply-To: <1317145530-18839-1-git-send-email-frankyl@broadcom.com>
From: Roland Vossen <rvossen@broadcom.com>
Placed variable on the stack instead and deleted unused functions.
Softmac was tested to function properly with multiple adapters in one
system.
Reported-by: Johannes Berg <johannes@sipsolutions.net>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
---
drivers/staging/brcm80211/brcmsmac/otp.c | 143 ++++--------------------------
drivers/staging/brcm80211/brcmsmac/otp.h | 8 --
2 files changed, 18 insertions(+), 133 deletions(-)
diff --git a/drivers/staging/brcm80211/brcmsmac/otp.c b/drivers/staging/brcm80211/brcmsmac/otp.c
index 06cb575..f15e8be 100644
--- a/drivers/staging/brcm80211/brcmsmac/otp.c
+++ b/drivers/staging/brcm80211/brcmsmac/otp.c
@@ -67,15 +67,13 @@
/* Fixed size subregions sizes in words */
#define OTPGU_CI_SZ 2
+struct otpinfo;
+
/* OTP function struct */
struct otp_fn_s {
- int (*size)(struct otpinfo *oi);
- u16 (*read_bit)(struct otpinfo *oi, struct chipcregs *cc, uint off);
- struct otpinfo *(*init)(struct si_pub *sih);
+ int (*init)(struct si_pub *sih, struct otpinfo *oi);
int (*read_region)(struct otpinfo *oi, int region, u16 *data,
uint *wlen);
- int (*nvread)(struct otpinfo *oi, char *data, uint *len);
- int (*status)(struct otpinfo *oi);
};
struct otpinfo {
@@ -99,21 +97,6 @@ struct otpinfo {
int otpgu_base; /* offset to General Use Region */
};
-static struct otpinfo otpinfo;
-
-/*
- * IPX OTP Code
- *
- * Exported functions:
- * ipxotp_status()
- * ipxotp_size()
- * ipxotp_init()
- * ipxotp_read_bit()
- * ipxotp_read_region()
- * ipxotp_nvread()
- *
- */
-
/* OTP layout */
/* CC revs 21, 24 and 27 OTP General Use Region word offset */
#define REVA4_OTPGU_BASE 12
@@ -149,51 +132,11 @@ static struct otpinfo otpinfo;
#define OTP4315_SWREG_SZ 178 /* 178 bytes */
#define OTP_SZ_FU_144 (144/8) /* 144 bits */
-static int ipxotp_status(struct otpinfo *oi)
-{
- return (int)(oi->status);
-}
-
-/* Return size in bytes */
-static int ipxotp_size(struct otpinfo *oi)
-{
- return (int)oi->wsize * 2;
-}
-
static u16 ipxotp_otpr(struct otpinfo *oi, struct chipcregs *cc, uint wn)
{
return R_REG(&cc->sromotp[wn]);
}
-static u16 ipxotp_read_bit(struct otpinfo *oi, struct chipcregs *cc, uint off)
-{
- uint k, row, col;
- u32 otpp, st;
-
- row = off / oi->cols;
- col = off % oi->cols;
-
- otpp = OTPP_START_BUSY |
- ((OTPPOC_READ << OTPP_OC_SHIFT) & OTPP_OC_MASK) |
- ((row << OTPP_ROW_SHIFT) & OTPP_ROW_MASK) |
- ((col << OTPP_COL_SHIFT) & OTPP_COL_MASK);
- W_REG(&cc->otpprog, otpp);
-
- for (k = 0;
- ((st = R_REG(&cc->otpprog)) & OTPP_START_BUSY)
- && (k < OTPP_TRIES); k++)
- ;
- if (k >= OTPP_TRIES)
- return 0xffff;
-
- if (st & OTPP_READERR)
- return 0xffff;
-
- st = (st & OTPP_VALUE_MASK) >> OTPP_VALUE_SHIFT;
-
- return (int)st;
-}
-
/*
* Calculate max HW/SW region byte size by subtracting fuse region
* and checksum size, osizew is oi->wsize (OTP size - GU size) in words
@@ -294,28 +237,24 @@ static void _ipxotp_init(struct otpinfo *oi, struct chipcregs *cc)
oi->flim = oi->wsize;
}
-static struct otpinfo *ipxotp_init(struct si_pub *sih)
+static int ipxotp_init(struct si_pub *sih, struct otpinfo *oi)
{
uint idx;
struct chipcregs *cc;
- struct otpinfo *oi;
/* Make sure we're running IPX OTP */
if (!OTPTYPE_IPX(sih->ccrev))
- return NULL;
+ return -EBADE;
/* Make sure OTP is not disabled */
if (ai_is_otp_disabled(sih))
- return NULL;
-
- /* OTP is always powered */
- oi = &otpinfo;
+ return -EBADE;
/* Check for otp size */
switch ((sih->cccaps & CC_CAP_OTPSIZE) >> CC_CAP_OTPSIZE_SHIFT) {
case 0:
/* Nothing there */
- return NULL;
+ return -EBADE;
case 1: /* 32x64 */
oi->rows = 32;
oi->cols = 64;
@@ -338,7 +277,7 @@ static struct otpinfo *ipxotp_init(struct si_pub *sih)
break;
default:
/* Don't know the geometry */
- return NULL;
+ return -EBADE;
}
/* Retrieve OTP region info */
@@ -349,7 +288,7 @@ static struct otpinfo *ipxotp_init(struct si_pub *sih)
ai_setcoreidx(sih, idx);
- return oi;
+ return 0;
}
static int
@@ -437,56 +376,16 @@ ipxotp_read_region(struct otpinfo *oi, int region, u16 *data, uint *wlen)
return 0;
}
-static int ipxotp_nvread(struct otpinfo *oi, char *data, uint *len)
-{
- return -ENOTSUPP;
-}
-
static const struct otp_fn_s ipxotp_fn = {
- (int (*)(struct otpinfo *)) ipxotp_size,
- (u16 (*)(struct otpinfo *, struct chipcregs *, uint)) ipxotp_read_bit,
-
- (struct otpinfo *(*)(struct si_pub *)) ipxotp_init,
+ (int (*)(struct si_pub *, struct otpinfo *)) ipxotp_init,
(int (*)(struct otpinfo *, int, u16 *, uint *)) ipxotp_read_region,
- (int (*)(struct otpinfo *, char *, uint *)) ipxotp_nvread,
-
- (int (*)(struct otpinfo *)) ipxotp_status
};
-/*
- * otp_status()
- * otp_size()
- * otp_read_bit()
- * otp_init()
- * otp_read_region()
- * otp_nvread()
- */
-
-int otp_status(struct otpinfo *oi)
+static int otp_init(struct si_pub *sih, struct otpinfo *oi)
{
- return oi->fn->status(oi);
-}
-
-int otp_size(struct otpinfo *oi)
-{
- return oi->fn->size(oi);
-}
-u16 otp_read_bit(struct otpinfo *oi, uint offset)
-{
- uint idx = ai_coreidx(oi->sih);
- struct chipcregs *cc = ai_setcoreidx(oi->sih, SI_CC_IDX);
- u16 readBit = (u16) oi->fn->read_bit(oi, cc, offset);
- ai_setcoreidx(oi->sih, idx);
- return readBit;
-}
+ int ret;
-struct otpinfo *otp_init(struct si_pub *sih)
-{
- struct otpinfo *oi;
- struct otpinfo *ret = NULL;
-
- oi = &otpinfo;
memset(oi, 0, sizeof(struct otpinfo));
oi->ccrev = sih->ccrev;
@@ -495,18 +394,19 @@ struct otpinfo *otp_init(struct si_pub *sih)
oi->fn = &ipxotp_fn;
if (oi->fn == NULL)
- return NULL;
+ return -EBADE;
oi->sih = sih;
- ret = (oi->fn->init) (sih);
+ ret = (oi->fn->init) (sih, oi);
return ret;
}
int
otp_read_region(struct si_pub *sih, int region, u16 *data, uint *wlen) {
- struct otpinfo *oi;
+ struct otpinfo otpinfo;
+ struct otpinfo *oi = &otpinfo;
int err = 0;
if (ai_is_otp_disabled(sih)) {
@@ -514,19 +414,12 @@ otp_read_region(struct si_pub *sih, int region, u16 *data, uint *wlen) {
goto out;
}
- oi = otp_init(sih);
- if (oi == NULL) {
- err = -EBADE;
+ err = otp_init(sih, oi);
+ if (err)
goto out;
- }
err = ((oi)->fn->read_region)(oi, region, data, wlen);
out:
return err;
}
-
-int otp_nvread(struct otpinfo *oi, char *data, uint *len)
-{
- return oi->fn->nvread(oi, data, len);
-}
diff --git a/drivers/staging/brcm80211/brcmsmac/otp.h b/drivers/staging/brcm80211/brcmsmac/otp.h
index bf2f76f..6b6d31c 100644
--- a/drivers/staging/brcm80211/brcmsmac/otp.h
+++ b/drivers/staging/brcm80211/brcmsmac/otp.h
@@ -30,15 +30,7 @@
/* OTP Size */
#define OTP_SZ_MAX (6144/8) /* maximum bytes in one CIS */
-struct otpinfo;
-
-/* Exported functions */
-extern int otp_status(struct otpinfo *oi);
-extern int otp_size(struct otpinfo *oi);
-extern u16 otp_read_bit(struct otpinfo *oi, uint offset);
-extern struct otpinfo *otp_init(struct si_pub *sih);
extern int otp_read_region(struct si_pub *sih, int region, u16 *data,
uint *wlen);
-extern int otp_nvread(struct otpinfo *oi, char *data, uint *len);
#endif /* _BRCM_OTP_H_ */
--
1.7.1
^ permalink raw reply related
* [PATCH v2 07/26] staging: brcm80211: removed unused softmac workaround
From: Franky Lin @ 2011-09-27 17:45 UTC (permalink / raw)
To: gregkh; +Cc: devel, linux-wireless
In-Reply-To: <1317145530-18839-1-git-send-email-frankyl@broadcom.com>
From: Roland Vossen <rvossen@broadcom.com>
WAR16165 is only used on older PCI chips, the driver does not support
these chips.
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
---
drivers/staging/brcm80211/brcmsmac/aiutils.c | 9 -------
drivers/staging/brcm80211/brcmsmac/aiutils.h | 2 -
drivers/staging/brcm80211/brcmsmac/d11.h | 3 +-
drivers/staging/brcm80211/brcmsmac/main.c | 31 --------------------------
drivers/staging/brcm80211/brcmsmac/main.h | 5 ----
5 files changed, 1 insertions(+), 49 deletions(-)
diff --git a/drivers/staging/brcm80211/brcmsmac/aiutils.c b/drivers/staging/brcm80211/brcmsmac/aiutils.c
index d05c4ba..790fdce 100644
--- a/drivers/staging/brcm80211/brcmsmac/aiutils.c
+++ b/drivers/staging/brcm80211/brcmsmac/aiutils.c
@@ -1852,15 +1852,6 @@ int ai_devpath(struct si_pub *sih, char *path, int size)
return 0;
}
-bool ai_pci_war16165(struct si_pub *sih)
-{
- struct si_info *sii;
-
- sii = (struct si_info *)sih;
-
- return PCI(sii) && (sih->buscorerev <= 10);
-}
-
void ai_pci_up(struct si_pub *sih)
{
struct si_info *sii;
diff --git a/drivers/staging/brcm80211/brcmsmac/aiutils.h b/drivers/staging/brcm80211/brcmsmac/aiutils.h
index a776945..3917192 100644
--- a/drivers/staging/brcm80211/brcmsmac/aiutils.h
+++ b/drivers/staging/brcm80211/brcmsmac/aiutils.h
@@ -322,8 +322,6 @@ extern void ai_write_wrap_reg(struct si_pub *sih, u32 offset, u32 val);
extern struct si_pub *ai_attach(void *regs, struct pci_dev *sdh, char **vars,
uint *varsz);
extern void ai_detach(struct si_pub *sih);
-extern bool ai_pci_war16165(struct si_pub *sih);
-
extern uint ai_coreid(struct si_pub *sih);
extern uint ai_corerev(struct si_pub *sih);
extern uint ai_corereg(struct si_pub *sih, uint coreidx, uint regoff, uint mask,
diff --git a/drivers/staging/brcm80211/brcmsmac/d11.h b/drivers/staging/brcm80211/brcmsmac/d11.h
index 14e60a5..cbb574a 100644
--- a/drivers/staging/brcm80211/brcmsmac/d11.h
+++ b/drivers/staging/brcm80211/brcmsmac/d11.h
@@ -1330,8 +1330,7 @@ struct shm_acparams {
#define MHF1_FORCEFASTCLK 0x0400
/* Flags in M_HOST_FLAGS2 */
-/* PR16165WAR : Enable ucode PCI slow clock WAR */
-#define MHF2_PCISLOWCLKWAR 0x0008
+
/* Flush BCMC FIFO immediately */
#define MHF2_TXBCMC_NOW 0x0040
/* Enable ucode/hw power control */
diff --git a/drivers/staging/brcm80211/brcmsmac/main.c b/drivers/staging/brcm80211/brcmsmac/main.c
index 4d5c842..3ec952c 100644
--- a/drivers/staging/brcm80211/brcmsmac/main.c
+++ b/drivers/staging/brcm80211/brcmsmac/main.c
@@ -829,19 +829,6 @@ brcms_b_recv(struct brcms_hardware *wlc_hw, uint fifo, bool bound)
return n >= bound_limit;
}
-static void brcms_c_war16165(struct brcms_c_info *wlc, bool tx)
-{
- if (tx) {
- /* the post-increment is used in STAY_AWAKE macro */
- if (wlc->txpend16165war++ == 0)
- brcms_c_set_ps_ctrl(wlc);
- } else {
- wlc->txpend16165war--;
- if (wlc->txpend16165war == 0)
- brcms_c_set_ps_ctrl(wlc);
- }
-}
-
/* process an individual struct tx_status */
static bool
brcms_c_dotxstatus(struct brcms_c_info *wlc, struct tx_status *txs)
@@ -879,8 +866,6 @@ brcms_c_dotxstatus(struct brcms_c_info *wlc, struct tx_status *txs)
}
p = dma_getnexttxp(wlc->hw->di[queue], DMA_RANGE_TRANSMITTED);
- if (wlc->war16165)
- brcms_c_war16165(wlc, false);
if (p == NULL)
goto fatal;
@@ -3109,8 +3094,6 @@ static void brcms_c_flushqueues(struct brcms_c_info *wlc)
struct brcms_hardware *wlc_hw = wlc->hw;
uint i;
- wlc->txpend16165war = 0;
-
/* free any posted tx packets */
for (i = 0; i < NFIFO; i++)
if (wlc_hw->di[i]) {
@@ -3532,9 +3515,6 @@ static void brcms_b_coreinit(struct brcms_c_info *wlc)
AND_REG(®s->ifs_ctl, 0x0FFF);
W_REG(®s->ifs_aifsn, EDCF_AIFSN_MIN);
- /* dma initializations */
- wlc->txpend16165war = 0;
-
/* init the tx dma engines */
for (i = 0; i < NFIFO; i++) {
if (wlc_hw->di[i])
@@ -4832,9 +4812,6 @@ static int brcms_b_attach(struct brcms_c_info *wlc, u16 vendor, u16 device,
if (wlc_hw->boardflags & BFL_NOPLLDOWN)
brcms_b_pllreq(wlc_hw, true, BRCMS_PLLREQ_SHARED);
- if (ai_pci_war16165(wlc_hw->sih))
- wlc->war16165 = true;
-
/* check device id(srom, nvram etc.) to set bands */
if (wlc_hw->deviceid == BCM43224_D11N_ID ||
wlc_hw->deviceid == BCM43224_D11N_ID_VEN1)
@@ -5833,10 +5810,6 @@ int brcms_c_up(struct brcms_c_info *wlc)
/* Set EDCF hostflags */
brcms_c_mhf(wlc, MHF1, MHF1_EDCF, MHF1_EDCF, BRCM_BAND_ALL);
- if (wlc->war16165)
- brcms_c_mhf(wlc, MHF2, MHF2_PCISLOWCLKWAR, MHF2_PCISLOWCLKWAR,
- BRCM_BAND_ALL);
-
brcms_init(wlc->wl);
wlc->pub->up = true;
@@ -7816,10 +7789,6 @@ brcms_c_txfifo(struct brcms_c_info *wlc, uint fifo, struct sk_buff *p,
if (fifo == TX_BCMC_FIFO)
frameid = le16_to_cpu(txh->TxFrameID);
- if (wlc->war16165)
- brcms_c_war16165(wlc, true);
-
-
/*
* Bump up pending count for if not using rpc. If rpc is
* used, this will be handled in brcms_b_txfifo()
diff --git a/drivers/staging/brcm80211/brcmsmac/main.h b/drivers/staging/brcm80211/brcmsmac/main.h
index d6de9c3..717843a 100644
--- a/drivers/staging/brcm80211/brcmsmac/main.h
+++ b/drivers/staging/brcm80211/brcmsmac/main.h
@@ -416,8 +416,6 @@ struct brcms_txq_info {
* band: pointer to active per-band state.
* corestate: per-core state (one per hw core).
* bandstate: per-band state (one per phy/radio).
- * war16165: PCI slow clock 16165 war flag.
- * txpend16165war: PCI slow clock 16165 war flag.
* qvalid: DirFrmQValid and BcMcFrmQValid.
* ampdu: ampdu module handler.
* asi: antsel module handler.
@@ -508,9 +506,6 @@ struct brcms_c_info {
struct brcms_core *corestate;
struct brcms_band *bandstate[MAXBANDS];
- bool war16165;
- uint txpend16165war;
-
/* packet queue */
uint qvalid;
--
1.7.1
^ permalink raw reply related
* [PATCH v2 03/26] staging: brcm80211: deleted unused array of bss configurations in softmac
From: Franky Lin @ 2011-09-27 17:45 UTC (permalink / raw)
To: gregkh; +Cc: devel, linux-wireless
In-Reply-To: <1317145530-18839-1-git-send-email-frankyl@broadcom.com>
From: Roland Vossen <rvossen@broadcom.com>
List always had one element. Converted the array to a scalar.
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
---
drivers/staging/brcm80211/brcmsmac/main.c | 139 +++++++++-------------------
drivers/staging/brcm80211/brcmsmac/main.h | 2 +-
drivers/staging/brcm80211/brcmsmac/types.h | 5 -
3 files changed, 43 insertions(+), 103 deletions(-)
diff --git a/drivers/staging/brcm80211/brcmsmac/main.c b/drivers/staging/brcm80211/brcmsmac/main.c
index d160212..138f63b 100644
--- a/drivers/staging/brcm80211/brcmsmac/main.c
+++ b/drivers/staging/brcm80211/brcmsmac/main.c
@@ -342,15 +342,6 @@ static u16 frametype(u32 rspec, u8 mimoframe)
/* Starting corerev for the fifo size table */
#define XMTFIFOTBL_STARTREV 20
-/* iterate through all valid bsscfg entries */
-#define FOREACH_BSS(wlc, idx, cfg) \
- for (idx = 0; (int) idx < BRCMS_MAXBSSCFG; idx++) { \
- cfg = (wlc)->bsscfg[idx]; \
- if (!cfg) \
- continue;
-/* close marker for iterator code block */
-#define END_FOREACH_BSS() }
-
/* currently the best mechanism for determining SIFS is the band in use */
static u16 get_sifs(struct brcms_band *band)
{
@@ -3278,8 +3269,7 @@ static void brcms_b_antsel_set(struct brcms_hardware *wlc_hw, u32 antsel_avail)
*/
bool brcms_c_ps_allowed(struct brcms_c_info *wlc)
{
- int idx;
- struct brcms_bss_cfg *cfg;
+ struct brcms_bss_cfg *cfg = wlc->bsscfg;
/* disallow PS when one of the following global conditions meets */
if (!wlc->pub->associated)
@@ -3289,19 +3279,16 @@ bool brcms_c_ps_allowed(struct brcms_c_info *wlc)
if (wlc->monitor)
return false;
- for (idx = 0; idx < BRCMS_MAXBSSCFG; idx++) {
- cfg = wlc->bsscfg[idx];
- if (cfg && cfg->associated) {
- /*
- * disallow PS when one of the following
- * bsscfg specific conditions meets
- */
- if (!cfg->BSS)
- return false;
+ if (cfg->associated) {
+ /*
+ * disallow PS when one of the following
+ * bsscfg specific conditions meets
+ */
+ if (!cfg->BSS)
+ return false;
- if (!cfg->dtim_programmed)
- return false;
- }
+ if (!cfg->dtim_programmed)
+ return false;
}
return true;
@@ -3779,8 +3766,6 @@ void brcms_c_init(struct brcms_c_info *wlc)
{
struct d11regs *regs;
u16 chanspec;
- int i;
- struct brcms_bss_cfg *bsscfg;
bool mute = false;
BCMMSG(wlc->wiphy, "wl%d\n", wlc->pub->unit);
@@ -3806,32 +3791,24 @@ void brcms_c_init(struct brcms_c_info *wlc)
brcms_c_reprate_init(wlc);
/* write ethernet address to core */
- FOREACH_BSS(wlc, i, bsscfg)
- brcms_c_set_mac(bsscfg);
- brcms_c_set_bssid(bsscfg);
- END_FOREACH_BSS()
+ brcms_c_set_mac(wlc->bsscfg);
+ brcms_c_set_bssid(wlc->bsscfg);
/* Update tsf_cfprep if associated and up */
- if (wlc->pub->associated) {
- FOREACH_BSS(wlc, i, bsscfg)
- if (bsscfg->up) {
- u32 bi;
+ if (wlc->pub->associated && wlc->bsscfg->up) {
+ u32 bi;
- /* get beacon period and convert to uS */
- bi = bsscfg->current_bss->beacon_period << 10;
- /*
- * update since init path would reset
- * to default value
- */
- W_REG(®s->tsf_cfprep,
- (bi << CFPREP_CBI_SHIFT));
-
- /* Update maccontrol PM related bits */
- brcms_c_set_ps_ctrl(wlc);
+ /* get beacon period and convert to uS */
+ bi = wlc->bsscfg->current_bss->beacon_period << 10;
+ /*
+ * update since init path would reset
+ * to default value
+ */
+ W_REG(®s->tsf_cfprep,
+ (bi << CFPREP_CBI_SHIFT));
- break;
- }
- END_FOREACH_BSS()
+ /* Update maccontrol PM related bits */
+ brcms_c_set_ps_ctrl(wlc);
}
brcms_c_bandinit_ordered(wlc, chanspec);
@@ -4021,26 +3998,13 @@ void brcms_c_switch_shortslot(struct brcms_c_info *wlc, bool shortslot)
brcms_b_set_shortslot(wlc->hw, shortslot);
}
-/*
- * propagate home chanspec to all bsscfgs in
- * case bsscfg->current_bss->chanspec is referenced
- */
void brcms_c_set_home_chanspec(struct brcms_c_info *wlc, u16 chanspec)
{
if (wlc->home_chanspec != chanspec) {
- int idx;
- struct brcms_bss_cfg *cfg;
-
wlc->home_chanspec = chanspec;
- FOREACH_BSS(wlc, idx, cfg)
- if (!cfg->associated)
- continue;
-
- cfg->current_bss->chanspec = chanspec;
- END_FOREACH_BSS()
-
-
+ if (wlc->bsscfg->associated)
+ wlc->bsscfg->current_bss->chanspec = chanspec;
}
}
@@ -4092,8 +4056,7 @@ brcms_b_set_chanspec(struct brcms_hardware *wlc_hw, u16 chanspec,
static void brcms_c_setband(struct brcms_c_info *wlc,
uint bandunit)
{
- int idx;
- struct brcms_bss_cfg *cfg;
+ struct brcms_bss_cfg *cfg = wlc->bsscfg;
wlc->band = wlc->bandstate[bandunit];
@@ -4101,11 +4064,9 @@ static void brcms_c_setband(struct brcms_c_info *wlc,
return;
/* wait for at least one beacon before entering sleeping state */
- for (idx = 0; idx < BRCMS_MAXBSSCFG; idx++) {
- cfg = wlc->bsscfg[idx];
- if (cfg && cfg->associated)
- cfg->PMawakebcn = true;
- }
+ if (cfg->associated)
+ cfg->PMawakebcn = true;
+
brcms_c_set_ps_ctrl(wlc);
/* band-specific initializations */
@@ -5427,7 +5388,7 @@ brcms_c_attach(struct brcms_info *wl, u16 vendor, u16 device, uint unit,
goto fail;
}
- wlc->bsscfg[0] = wlc->cfg;
+ wlc->bsscfg = wlc->cfg;
wlc->cfg->_idx = 0;
wlc->cfg->wlc = wlc;
@@ -5840,19 +5801,15 @@ int brcms_c_up(struct brcms_c_info *wlc)
if (status == -ENOMEDIUM) {
if (!mboolisset
(wlc->pub->radio_disabled, WL_RADIO_HW_DISABLE)) {
- int idx;
- struct brcms_bss_cfg *bsscfg;
+ struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
mboolset(wlc->pub->radio_disabled,
WL_RADIO_HW_DISABLE);
- FOREACH_BSS(wlc, idx, bsscfg)
- if (!bsscfg->enable || !bsscfg->BSS)
- continue;
- wiphy_err(wlc->wiphy, "wl%d.%d: up"
+ if (bsscfg->enable && bsscfg->BSS)
+ wiphy_err(wlc->wiphy, "wl%d: up"
": rfdisable -> "
"bsscfg_disable()\n",
- wlc->pub->unit, idx);
- END_FOREACH_BSS()
+ wlc->pub->unit);
}
}
}
@@ -8993,14 +8950,10 @@ void brcms_c_bss_update_beacon(struct brcms_c_info *wlc,
*/
void brcms_c_update_beacon(struct brcms_c_info *wlc)
{
- int idx;
- struct brcms_bss_cfg *bsscfg;
+ struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
- /* update AP or IBSS beacons */
- FOREACH_BSS(wlc, idx, bsscfg)
- if (bsscfg->up && !bsscfg->BSS)
- brcms_c_bss_update_beacon(wlc, bsscfg);
- END_FOREACH_BSS()
+ if (bsscfg->up && !bsscfg->BSS)
+ brcms_c_bss_update_beacon(wlc, bsscfg);
}
/* Write ssid into shared memory */
@@ -9020,14 +8973,11 @@ void brcms_c_shm_ssid_upd(struct brcms_c_info *wlc, struct brcms_bss_cfg *cfg)
void brcms_c_update_probe_resp(struct brcms_c_info *wlc, bool suspend)
{
- int idx;
- struct brcms_bss_cfg *bsscfg;
+ struct brcms_bss_cfg *bsscfg = wlc->bsscfg;
/* update AP or IBSS probe responses */
- FOREACH_BSS(wlc, idx, bsscfg)
- if (bsscfg->up && !bsscfg->BSS)
- brcms_c_bss_update_probe_resp(wlc, bsscfg, suspend);
- END_FOREACH_BSS()
+ if (bsscfg->up && !bsscfg->BSS)
+ brcms_c_bss_update_probe_resp(wlc, bsscfg, suspend);
}
void
@@ -9105,12 +9055,7 @@ int brcms_c_prep_pdu(struct brcms_c_info *wlc, struct sk_buff *pdu, uint *fifop)
/* init tx reported rate mechanism */
void brcms_c_reprate_init(struct brcms_c_info *wlc)
{
- int i;
- struct brcms_bss_cfg *bsscfg;
-
- FOREACH_BSS(wlc, i, bsscfg)
- brcms_c_bsscfg_reprate_init(bsscfg);
- END_FOREACH_BSS()
+ brcms_c_bsscfg_reprate_init(wlc->bsscfg);
}
/* per bsscfg init tx reported rate mechanism */
diff --git a/drivers/staging/brcm80211/brcmsmac/main.h b/drivers/staging/brcm80211/brcmsmac/main.h
index 1572e46..ede4aef 100644
--- a/drivers/staging/brcm80211/brcmsmac/main.h
+++ b/drivers/staging/brcm80211/brcmsmac/main.h
@@ -564,7 +564,7 @@ struct brcms_c_info {
u16 tx_prec_map;
u16 fifo2prec_map[NFIFO];
- struct brcms_bss_cfg *bsscfg[BRCMS_MAXBSSCFG];
+ struct brcms_bss_cfg *bsscfg;
struct brcms_bss_cfg *cfg;
/* tx queue */
diff --git a/drivers/staging/brcm80211/brcmsmac/types.h b/drivers/staging/brcm80211/brcmsmac/types.h
index ace210c..415ab8b 100644
--- a/drivers/staging/brcm80211/brcmsmac/types.h
+++ b/drivers/staging/brcm80211/brcmsmac/types.h
@@ -244,11 +244,6 @@
* ********************************************************************
*/
-/* NetBSD also needs to keep track of this */
-
-/* max # BSS configs */
-#define BRCMS_MAXBSSCFG (1)
-
#define BCMMSG(dev, fmt, args...) \
do { \
if (brcm_msg_level & LOG_TRACE_VAL) \
--
1.7.1
^ permalink raw reply related
* [PATCH v2 22/26] staging: brcm80211: move rssi computation to place we need it
From: Franky Lin @ 2011-09-27 17:45 UTC (permalink / raw)
To: gregkh; +Cc: devel, linux-wireless
In-Reply-To: <1317145530-18839-1-git-send-email-frankyl@broadcom.com>
From: Arend van Spriel <arend@broadcom.com>
The rssi computation was done upon getting the frame from the
queue, but the value is needed when filling in the receive status
data for mac80211. The call to wlc_phy_rssi_compute() has been
deferred.
Reviewed-by: Roland Vossen <rvossen@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
---
drivers/staging/brcm80211/brcmsmac/main.c | 7 +------
1 files changed, 1 insertions(+), 6 deletions(-)
diff --git a/drivers/staging/brcm80211/brcmsmac/main.c b/drivers/staging/brcm80211/brcmsmac/main.c
index 3e39407..bdc0611 100644
--- a/drivers/staging/brcm80211/brcmsmac/main.c
+++ b/drivers/staging/brcm80211/brcmsmac/main.c
@@ -828,11 +828,6 @@ brcms_b_recv(struct brcms_hardware *wlc_hw, uint fifo, bool bound)
rxh->RxTSFTime = le16_to_cpu(rxh_le->RxTSFTime);
rxh->RxChan = le16_to_cpu(rxh_le->RxChan);
- /*
- * compute the RSSI from d11rxhdr and record it in wlc_rxd11hr
- */
- wlc_rxhdr->rssi = (s8)wlc_phy_rssi_compute(wlc_hw->band->pi,
- rxh);
brcms_c_recv(wlc_hw->wlc, p);
}
@@ -8172,7 +8167,7 @@ prep_mac80211_status(struct brcms_c_info *wlc, struct d11rxhdr *rxh,
rx_status->freq = ieee80211_dsss_chan_to_freq(channel);
}
- rx_status->signal = wlc_rxh->rssi;
+ rx_status->signal = wlc_phy_rssi_compute(wlc->hw->band->pi, rxh);
/* noise */
/* qual */
--
1.7.1
^ permalink raw reply related
* [PATCH v2 13/26] staging: brcm80211: remove unnecessary mac80211 callbacks
From: Franky Lin @ 2011-09-27 17:45 UTC (permalink / raw)
To: gregkh; +Cc: devel, linux-wireless
In-Reply-To: <1317145530-18839-1-git-send-email-frankyl@broadcom.com>
From: Arend van Spriel <arend@broadcom.com>
Several callback were implemented without executing any further
function calls into the driver. Review feedback indicated that
these could be removed.
Reported-by: Johannes Berg <johannes@sipsolutions.net>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Roland Vossen <rvossen@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
---
drivers/staging/brcm80211/brcmsmac/mac80211_if.c | 61 ----------------------
1 files changed, 0 insertions(+), 61 deletions(-)
diff --git a/drivers/staging/brcm80211/brcmsmac/mac80211_if.c b/drivers/staging/brcm80211/brcmsmac/mac80211_if.c
index 9bd4b83..11ba061 100644
--- a/drivers/staging/brcm80211/brcmsmac/mac80211_if.c
+++ b/drivers/staging/brcm80211/brcmsmac/mac80211_if.c
@@ -580,12 +580,6 @@ brcms_ops_configure_filter(struct ieee80211_hw *hw,
return;
}
-static int
-brcms_ops_set_tim(struct ieee80211_hw *hw, struct ieee80211_sta *sta, bool set)
-{
- return 0;
-}
-
static void brcms_ops_sw_scan_start(struct ieee80211_hw *hw)
{
struct brcms_info *wl = hw->priv;
@@ -604,42 +598,6 @@ static void brcms_ops_sw_scan_complete(struct ieee80211_hw *hw)
return;
}
-static void brcms_ops_set_tsf(struct ieee80211_hw *hw, u64 tsf)
-{
- wiphy_err(hw->wiphy, "%s: Enter\n", __func__);
- return;
-}
-
-static int
-brcms_ops_get_stats(struct ieee80211_hw *hw,
- struct ieee80211_low_level_stats *stats)
-{
- struct brcms_info *wl = hw->priv;
- struct wl_cnt *cnt;
-
- LOCK(wl);
- cnt = wl->pub->_cnt;
- stats->dot11ACKFailureCount = 0;
- stats->dot11RTSFailureCount = 0;
- stats->dot11FCSErrorCount = 0;
- stats->dot11RTSSuccessCount = 0;
- UNLOCK(wl);
- return 0;
-}
-
-static void
-brcms_ops_sta_notify(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- enum sta_notify_cmd cmd, struct ieee80211_sta *sta)
-{
- switch (cmd) {
- default:
- wiphy_err(hw->wiphy, "%s: Unknown cmd = %d\n", __func__,
- cmd);
- break;
- }
- return;
-}
-
static int
brcms_ops_conf_tx(struct ieee80211_hw *hw, u16 queue,
const struct ieee80211_tx_queue_params *params)
@@ -653,12 +611,6 @@ brcms_ops_conf_tx(struct ieee80211_hw *hw, u16 queue,
return 0;
}
-static u64 brcms_ops_get_tsf(struct ieee80211_hw *hw)
-{
- wiphy_err(hw->wiphy, "%s: Enter\n", __func__);
- return 0;
-}
-
static int
brcms_ops_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
struct ieee80211_sta *sta)
@@ -698,13 +650,6 @@ brcms_ops_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
}
static int
-brcms_ops_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
- struct ieee80211_sta *sta)
-{
- return 0;
-}
-
-static int
brcms_ops_ampdu_action(struct ieee80211_hw *hw,
struct ieee80211_vif *vif,
enum ieee80211_ampdu_mlme_action action,
@@ -800,16 +745,10 @@ static const struct ieee80211_ops brcms_ops = {
.config = brcms_ops_config,
.bss_info_changed = brcms_ops_bss_info_changed,
.configure_filter = brcms_ops_configure_filter,
- .set_tim = brcms_ops_set_tim,
.sw_scan_start = brcms_ops_sw_scan_start,
.sw_scan_complete = brcms_ops_sw_scan_complete,
- .set_tsf = brcms_ops_set_tsf,
- .get_stats = brcms_ops_get_stats,
- .sta_notify = brcms_ops_sta_notify,
.conf_tx = brcms_ops_conf_tx,
- .get_tsf = brcms_ops_get_tsf,
.sta_add = brcms_ops_sta_add,
- .sta_remove = brcms_ops_sta_remove,
.ampdu_action = brcms_ops_ampdu_action,
.rfkill_poll = brcms_ops_rfkill_poll,
.flush = brcms_ops_flush,
--
1.7.1
^ permalink raw reply related
* [PATCH v2 19/26] staging: brcm80211: change interface for common rssi compute function
From: Franky Lin @ 2011-09-27 17:45 UTC (permalink / raw)
To: gregkh; +Cc: devel, linux-wireless
In-Reply-To: <1317145530-18839-1-git-send-email-frankyl@broadcom.com>
From: Arend van Spriel <arend@broadcom.com>
The function wlc_phy_rssi_compute() now uses d11rxhdr struct as
purely input parameter and returns the computed rssi value.
Reviewed-by: Roland Vossen <rvossen@broadcom.com>
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
---
drivers/staging/brcm80211/brcmsmac/main.c | 4 +++-
drivers/staging/brcm80211/brcmsmac/phy/phy_cmn.c | 7 +++----
drivers/staging/brcm80211/brcmsmac/phy/phy_hal.h | 4 ++--
3 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/drivers/staging/brcm80211/brcmsmac/main.c b/drivers/staging/brcm80211/brcmsmac/main.c
index e34b511..ef96358 100644
--- a/drivers/staging/brcm80211/brcmsmac/main.c
+++ b/drivers/staging/brcm80211/brcmsmac/main.c
@@ -806,15 +806,17 @@ brcms_b_recv(struct brcms_hardware *wlc_hw, uint fifo, bool bound)
/* process each frame */
while ((p = head) != NULL) {
+ struct d11rxhdr *rxh;
head = head->prev;
p->prev = NULL;
wlc_rxhdr = (struct brcms_d11rxhdr *) p->data;
+ rxh = (struct d11rxhdr *)p->data;
/*
* compute the RSSI from d11rxhdr and record it in wlc_rxd11hr
*/
- wlc_phy_rssi_compute(wlc_hw->band->pi, wlc_rxhdr);
+ wlc_rxhdr->rssi = wlc_phy_rssi_compute(wlc_hw->band->pi, rxh);
brcms_c_recv(wlc_hw->wlc, p);
}
diff --git a/drivers/staging/brcm80211/brcmsmac/phy/phy_cmn.c b/drivers/staging/brcm80211/brcmsmac/phy/phy_cmn.c
index 8025247..c359a10 100644
--- a/drivers/staging/brcm80211/brcmsmac/phy/phy_cmn.c
+++ b/drivers/staging/brcm80211/brcmsmac/phy/phy_cmn.c
@@ -2610,10 +2610,9 @@ void wlc_phy_compute_dB(u32 *cmplx_pwr, s8 *p_cmplx_pwr_dB, u8 core)
}
}
-void wlc_phy_rssi_compute(struct brcms_phy_pub *pih,
- struct brcms_d11rxhdr *wlc_rxhdr)
+int wlc_phy_rssi_compute(struct brcms_phy_pub *pih,
+ struct d11rxhdr *rxh)
{
- struct d11rxhdr *rxh = &wlc_rxhdr->rxhdr;
int rssi = le16_to_cpu(rxh->PhyRxStatus_1) & PRXS1_JSSI_MASK;
uint radioid = pih->radioid;
struct brcms_phy *pi = (struct brcms_phy *) pih;
@@ -2650,7 +2649,7 @@ void wlc_phy_rssi_compute(struct brcms_phy_pub *pih,
}
end:
- wlc_rxhdr->rssi = (s8) rssi;
+ return rssi;
}
void wlc_phy_freqtrack_start(struct brcms_phy_pub *pih)
diff --git a/drivers/staging/brcm80211/brcmsmac/phy/phy_hal.h b/drivers/staging/brcm80211/brcmsmac/phy/phy_hal.h
index 1dbfaa3..39c3c22 100644
--- a/drivers/staging/brcm80211/brcmsmac/phy/phy_hal.h
+++ b/drivers/staging/brcm80211/brcmsmac/phy/phy_hal.h
@@ -212,8 +212,8 @@ extern void wlc_phy_chanspec_radio_set(struct brcms_phy_pub *ppi,
extern u16 wlc_phy_bw_state_get(struct brcms_phy_pub *ppi);
extern void wlc_phy_bw_state_set(struct brcms_phy_pub *ppi, u16 bw);
-extern void wlc_phy_rssi_compute(struct brcms_phy_pub *pih,
- struct brcms_d11rxhdr *wlc_rxhdr);
+extern int wlc_phy_rssi_compute(struct brcms_phy_pub *pih,
+ struct d11rxhdr *rxh);
extern void wlc_phy_por_inform(struct brcms_phy_pub *ppi);
extern void wlc_phy_noise_sample_intr(struct brcms_phy_pub *ppi);
extern bool wlc_phy_bist_check_phy(struct brcms_phy_pub *ppi);
--
1.7.1
^ permalink raw reply related
* [PATCH v2 06/26] staging: brcm80211: removed global vars in softmac ucode handling
From: Franky Lin @ 2011-09-27 17:45 UTC (permalink / raw)
To: gregkh; +Cc: devel, linux-wireless
In-Reply-To: <1317145530-18839-1-git-send-email-frankyl@broadcom.com>
From: Roland Vossen <rvossen@broadcom.com>
Moved global vars into a per-device structure.
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
---
drivers/staging/brcm80211/brcmsmac/mac80211_if.c | 4 +-
drivers/staging/brcm80211/brcmsmac/mac80211_if.h | 3 +-
drivers/staging/brcm80211/brcmsmac/main.c | 27 ++++--
drivers/staging/brcm80211/brcmsmac/ucode_loader.c | 121 ++++++++++-----------
drivers/staging/brcm80211/brcmsmac/ucode_loader.h | 46 +++++----
5 files changed, 106 insertions(+), 95 deletions(-)
diff --git a/drivers/staging/brcm80211/brcmsmac/mac80211_if.c b/drivers/staging/brcm80211/brcmsmac/mac80211_if.c
index 32d7abf..9bd4b83 100644
--- a/drivers/staging/brcm80211/brcmsmac/mac80211_if.c
+++ b/drivers/staging/brcm80211/brcmsmac/mac80211_if.c
@@ -894,7 +894,7 @@ static int brcms_request_fw(struct brcms_info *wl, struct pci_dev *pdev)
wl->fw.fw_hdr[i]->size / (sizeof(struct firmware_hdr));
}
wl->fw.fw_cnt = i;
- return brcms_ucode_data_init(wl);
+ return brcms_ucode_data_init(wl, &wl->ucode);
}
/*
@@ -925,7 +925,7 @@ static void brcms_free(struct brcms_info *wl)
/* free ucode data */
if (wl->fw.fw_cnt)
- brcms_ucode_data_free();
+ brcms_ucode_data_free(&wl->ucode);
if (wl->irq)
free_irq(wl->irq, wl);
diff --git a/drivers/staging/brcm80211/brcmsmac/mac80211_if.h b/drivers/staging/brcm80211/brcmsmac/mac80211_if.h
index 1eb36ed..2bdcd4c 100644
--- a/drivers/staging/brcm80211/brcmsmac/mac80211_if.h
+++ b/drivers/staging/brcm80211/brcmsmac/mac80211_if.h
@@ -19,7 +19,7 @@
#include <linux/timer.h>
#include <linux/interrupt.h>
-
+#include "ucode_loader.h"
/*
* Starting index for 5G rates in the
* legacy rate table.
@@ -77,6 +77,7 @@ struct brcms_info {
bool resched; /* dpc needs to be and is rescheduled */
struct brcms_firmware fw;
struct wiphy *wiphy;
+ struct brcms_ucode ucode;
};
/* misc callbacks */
diff --git a/drivers/staging/brcm80211/brcmsmac/main.c b/drivers/staging/brcm80211/brcmsmac/main.c
index ee9c322..4d5c842 100644
--- a/drivers/staging/brcm80211/brcmsmac/main.c
+++ b/drivers/staging/brcm80211/brcmsmac/main.c
@@ -342,6 +342,12 @@ static u16 frametype(u32 rspec, u8 mimoframe)
/* Starting corerev for the fifo size table */
#define XMTFIFOTBL_STARTREV 20
+struct d11init {
+ u16 addr;
+ u16 size;
+ u32 value;
+};
+
/* currently the best mechanism for determining SIFS is the band in use */
static u16 get_sifs(struct brcms_band *band)
{
@@ -349,6 +355,7 @@ static u16 get_sifs(struct brcms_band *band)
BPHY_SIFS_TIME;
}
+
/*
* Detect Card removed.
* Even checking an sbconfig register read will not false trigger when the core
@@ -694,6 +701,7 @@ static void brcms_c_write_mhf(struct brcms_hardware *wlc_hw, u16 *mhfs)
static void brcms_c_ucode_bsinit(struct brcms_hardware *wlc_hw)
{
struct wiphy *wiphy = wlc_hw->wlc->wiphy;
+ struct brcms_ucode *ucode = &wlc_hw->wlc->wl->ucode;
/* init microcode host flags */
brcms_c_write_mhf(wlc_hw, wlc_hw->band->mhfs);
@@ -701,7 +709,7 @@ static void brcms_c_ucode_bsinit(struct brcms_hardware *wlc_hw)
/* do band-specific ucode IHR, SHM, and SCR inits */
if (D11REV_IS(wlc_hw->corerev, 23)) {
if (BRCMS_ISNPHY(wlc_hw->band))
- brcms_c_write_inits(wlc_hw, d11n0bsinitvals16);
+ brcms_c_write_inits(wlc_hw, ucode->d11n0bsinitvals16);
else
wiphy_err(wiphy, "%s: wl%d: unsupported phy in corerev"
" %d\n", __func__, wlc_hw->unit,
@@ -710,7 +718,7 @@ static void brcms_c_ucode_bsinit(struct brcms_hardware *wlc_hw)
if (D11REV_IS(wlc_hw->corerev, 24)) {
if (BRCMS_ISLCNPHY(wlc_hw->band))
brcms_c_write_inits(wlc_hw,
- d11lcn0bsinitvals24);
+ ucode->d11lcn0bsinitvals24);
else
wiphy_err(wiphy, "%s: wl%d: unsupported phy in"
" core rev %d\n", __func__,
@@ -2457,6 +2465,8 @@ static void brcms_ucode_write(struct brcms_hardware *wlc_hw, const u32 ucode[],
static void brcms_ucode_download(struct brcms_hardware *wlc_hw)
{
struct brcms_c_info *wlc;
+ struct brcms_ucode *ucode = &wlc_hw->wlc->wl->ucode;
+
wlc = wlc_hw->wlc;
if (wlc_hw->ucode_loaded)
@@ -2464,8 +2474,8 @@ static void brcms_ucode_download(struct brcms_hardware *wlc_hw)
if (D11REV_IS(wlc_hw->corerev, 23)) {
if (BRCMS_ISNPHY(wlc_hw->band)) {
- brcms_ucode_write(wlc_hw, bcm43xx_16_mimo,
- bcm43xx_16_mimosz);
+ brcms_ucode_write(wlc_hw, ucode->bcm43xx_16_mimo,
+ ucode->bcm43xx_16_mimosz);
wlc_hw->ucode_loaded = true;
} else
wiphy_err(wlc->wiphy, "%s: wl%d: unsupported phy in "
@@ -2473,8 +2483,8 @@ static void brcms_ucode_download(struct brcms_hardware *wlc_hw)
__func__, wlc_hw->unit, wlc_hw->corerev);
} else if (D11REV_IS(wlc_hw->corerev, 24)) {
if (BRCMS_ISLCNPHY(wlc_hw->band)) {
- brcms_ucode_write(wlc_hw, bcm43xx_24_lcn,
- bcm43xx_24_lcnsz);
+ brcms_ucode_write(wlc_hw, ucode->bcm43xx_24_lcn,
+ ucode->bcm43xx_24_lcnsz);
wlc_hw->ucode_loaded = true;
} else {
wiphy_err(wlc->wiphy, "%s: wl%d: unsupported phy in "
@@ -3372,6 +3382,7 @@ static void brcms_b_coreinit(struct brcms_c_info *wlc)
int err = 0;
u16 buf[NFIFO];
struct wiphy *wiphy = wlc->wiphy;
+ struct brcms_ucode *ucode = &wlc_hw->wlc->wl->ucode;
regs = wlc_hw->regs;
@@ -3404,14 +3415,14 @@ static void brcms_b_coreinit(struct brcms_c_info *wlc)
if (D11REV_IS(wlc_hw->corerev, 23)) {
if (BRCMS_ISNPHY(wlc_hw->band))
- brcms_c_write_inits(wlc_hw, d11n0initvals16);
+ brcms_c_write_inits(wlc_hw, ucode->d11n0initvals16);
else
wiphy_err(wiphy, "%s: wl%d: unsupported phy in corerev"
" %d\n", __func__, wlc_hw->unit,
wlc_hw->corerev);
} else if (D11REV_IS(wlc_hw->corerev, 24)) {
if (BRCMS_ISLCNPHY(wlc_hw->band))
- brcms_c_write_inits(wlc_hw, d11lcn0initvals24);
+ brcms_c_write_inits(wlc_hw, ucode->d11lcn0initvals24);
else
wiphy_err(wiphy, "%s: wl%d: unsupported phy in corerev"
" %d\n", __func__, wlc_hw->unit,
diff --git a/drivers/staging/brcm80211/brcmsmac/ucode_loader.c b/drivers/staging/brcm80211/brcmsmac/ucode_loader.c
index c14bce8..80e3ccf 100644
--- a/drivers/staging/brcm80211/brcmsmac/ucode_loader.c
+++ b/drivers/staging/brcm80211/brcmsmac/ucode_loader.c
@@ -37,80 +37,73 @@ enum {
D11UCODE_OVERSIGHT_BOMMINOR
};
-struct d11init *d11lcn0bsinitvals24;
-struct d11init *d11lcn0initvals24;
-struct d11init *d11lcn1bsinitvals24;
-struct d11init *d11lcn1initvals24;
-struct d11init *d11lcn2bsinitvals24;
-struct d11init *d11lcn2initvals24;
-struct d11init *d11n0absinitvals16;
-struct d11init *d11n0bsinitvals16;
-struct d11init *d11n0initvals16;
-u32 *bcm43xx_16_mimo;
-u32 bcm43xx_16_mimosz;
-u32 *bcm43xx_24_lcn;
-u32 bcm43xx_24_lcnsz;
-
-static u32 *bcm43xx_bommajor;
-static u32 *bcm43xx_bomminor;
-
-int brcms_ucode_data_init(struct brcms_info *wl)
+int brcms_ucode_data_init(struct brcms_info *wl, struct brcms_ucode *ucode)
{
int rc;
+
rc = brcms_check_firmwares(wl);
rc = rc < 0 ? rc :
- brcms_ucode_init_buf(wl, (void **)&d11lcn0bsinitvals24,
+ brcms_ucode_init_buf(wl, (void **)&ucode->d11lcn0bsinitvals24,
D11LCN0BSINITVALS24);
- rc = rc < 0 ? rc : brcms_ucode_init_buf(wl, (void **)&d11lcn0initvals24,
- D11LCN0INITVALS24);
+ rc = rc < 0 ?
+ rc : brcms_ucode_init_buf(wl, (void **)&ucode->d11lcn0initvals24,
+ D11LCN0INITVALS24);
+ rc = rc < 0 ?
+ rc : brcms_ucode_init_buf(wl, (void **)&ucode->d11lcn1bsinitvals24,
+ D11LCN1BSINITVALS24);
+ rc = rc < 0 ?
+ rc : brcms_ucode_init_buf(wl, (void **)&ucode->d11lcn1initvals24,
+ D11LCN1INITVALS24);
rc = rc < 0 ? rc :
- brcms_ucode_init_buf(wl, (void **)&d11lcn1bsinitvals24,
- D11LCN1BSINITVALS24);
- rc = rc < 0 ? rc : brcms_ucode_init_buf(wl, (void **)&d11lcn1initvals24,
- D11LCN1INITVALS24);
- rc = rc < 0 ? rc :
- brcms_ucode_init_buf(wl, (void **)&d11lcn2bsinitvals24,
+ brcms_ucode_init_buf(wl, (void **)&ucode->d11lcn2bsinitvals24,
D11LCN2BSINITVALS24);
- rc = rc < 0 ? rc : brcms_ucode_init_buf(wl, (void **)&d11lcn2initvals24,
- D11LCN2INITVALS24);
- rc = rc < 0 ? rc :
- brcms_ucode_init_buf(wl, (void **)&d11n0absinitvals16,
- D11N0ABSINITVALS16);
- rc = rc < 0 ? rc : brcms_ucode_init_buf(wl, (void **)&d11n0bsinitvals16,
- D11N0BSINITVALS16);
- rc = rc < 0 ? rc : brcms_ucode_init_buf(wl, (void **)&d11n0initvals16,
- D11N0INITVALS16);
- rc = rc < 0 ? rc : brcms_ucode_init_buf(wl, (void **)&bcm43xx_16_mimo,
- D11UCODE_OVERSIGHT16_MIMO);
- rc = rc < 0 ? rc : brcms_ucode_init_uint(wl, &bcm43xx_16_mimosz,
- D11UCODE_OVERSIGHT16_MIMOSZ);
- rc = rc < 0 ? rc : brcms_ucode_init_buf(wl, (void **)&bcm43xx_24_lcn,
- D11UCODE_OVERSIGHT24_LCN);
- rc = rc < 0 ? rc : brcms_ucode_init_uint(wl, &bcm43xx_24_lcnsz,
- D11UCODE_OVERSIGHT24_LCNSZ);
- rc = rc < 0 ? rc : brcms_ucode_init_buf(wl, (void **)&bcm43xx_bommajor,
- D11UCODE_OVERSIGHT_BOMMAJOR);
- rc = rc < 0 ? rc : brcms_ucode_init_buf(wl, (void **)&bcm43xx_bomminor,
- D11UCODE_OVERSIGHT_BOMMINOR);
+ rc = rc < 0 ?
+ rc : brcms_ucode_init_buf(wl, (void **)&ucode->d11lcn2initvals24,
+ D11LCN2INITVALS24);
+ rc = rc < 0 ?
+ rc : brcms_ucode_init_buf(wl, (void **)&ucode->d11n0absinitvals16,
+ D11N0ABSINITVALS16);
+ rc = rc < 0 ?
+ rc : brcms_ucode_init_buf(wl, (void **)&ucode->d11n0bsinitvals16,
+ D11N0BSINITVALS16);
+ rc = rc < 0 ?
+ rc : brcms_ucode_init_buf(wl, (void **)&ucode->d11n0initvals16,
+ D11N0INITVALS16);
+ rc = rc < 0 ?
+ rc : brcms_ucode_init_buf(wl, (void **)&ucode->bcm43xx_16_mimo,
+ D11UCODE_OVERSIGHT16_MIMO);
+ rc = rc < 0 ?
+ rc : brcms_ucode_init_uint(wl, &ucode->bcm43xx_16_mimosz,
+ D11UCODE_OVERSIGHT16_MIMOSZ);
+ rc = rc < 0 ?
+ rc : brcms_ucode_init_buf(wl, (void **)&ucode->bcm43xx_24_lcn,
+ D11UCODE_OVERSIGHT24_LCN);
+ rc = rc < 0 ?
+ rc : brcms_ucode_init_uint(wl, &ucode->bcm43xx_24_lcnsz,
+ D11UCODE_OVERSIGHT24_LCNSZ);
+ rc = rc < 0 ?
+ rc : brcms_ucode_init_buf(wl, (void **)&ucode->bcm43xx_bommajor,
+ D11UCODE_OVERSIGHT_BOMMAJOR);
+ rc = rc < 0 ?
+ rc : brcms_ucode_init_buf(wl, (void **)&ucode->bcm43xx_bomminor,
+ D11UCODE_OVERSIGHT_BOMMINOR);
return rc;
}
-void brcms_ucode_data_free(void)
+void brcms_ucode_data_free(struct brcms_ucode *ucode)
{
- brcms_ucode_free_buf((void *)d11lcn0bsinitvals24);
- brcms_ucode_free_buf((void *)d11lcn0initvals24);
- brcms_ucode_free_buf((void *)d11lcn1bsinitvals24);
- brcms_ucode_free_buf((void *)d11lcn1initvals24);
- brcms_ucode_free_buf((void *)d11lcn2bsinitvals24);
- brcms_ucode_free_buf((void *)d11lcn2initvals24);
- brcms_ucode_free_buf((void *)d11n0absinitvals16);
- brcms_ucode_free_buf((void *)d11n0bsinitvals16);
- brcms_ucode_free_buf((void *)d11n0initvals16);
- brcms_ucode_free_buf((void *)bcm43xx_16_mimo);
- brcms_ucode_free_buf((void *)bcm43xx_24_lcn);
- brcms_ucode_free_buf((void *)bcm43xx_bommajor);
- brcms_ucode_free_buf((void *)bcm43xx_bomminor);
-
- return;
+ brcms_ucode_free_buf((void *)ucode->d11lcn0bsinitvals24);
+ brcms_ucode_free_buf((void *)ucode->d11lcn0initvals24);
+ brcms_ucode_free_buf((void *)ucode->d11lcn1bsinitvals24);
+ brcms_ucode_free_buf((void *)ucode->d11lcn1initvals24);
+ brcms_ucode_free_buf((void *)ucode->d11lcn2bsinitvals24);
+ brcms_ucode_free_buf((void *)ucode->d11lcn2initvals24);
+ brcms_ucode_free_buf((void *)ucode->d11n0absinitvals16);
+ brcms_ucode_free_buf((void *)ucode->d11n0bsinitvals16);
+ brcms_ucode_free_buf((void *)ucode->d11n0initvals16);
+ brcms_ucode_free_buf((void *)ucode->bcm43xx_16_mimo);
+ brcms_ucode_free_buf((void *)ucode->bcm43xx_24_lcn);
+ brcms_ucode_free_buf((void *)ucode->bcm43xx_bommajor);
+ brcms_ucode_free_buf((void *)ucode->bcm43xx_bomminor);
}
diff --git a/drivers/staging/brcm80211/brcmsmac/ucode_loader.h b/drivers/staging/brcm80211/brcmsmac/ucode_loader.h
index ca53dec..438675a 100644
--- a/drivers/staging/brcm80211/brcmsmac/ucode_loader.h
+++ b/drivers/staging/brcm80211/brcmsmac/ucode_loader.h
@@ -13,6 +13,8 @@
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+#ifndef _BRCM_UCODE_H_
+#define _BRCM_UCODE_H_
#include "types.h" /* forward structure declarations */
@@ -21,28 +23,30 @@
#define UCODE_LOADER_API_VER 0
-struct d11init {
- u16 addr;
- u16 size;
- u32 value;
+struct d11init;
+
+struct brcms_ucode {
+ struct d11init *d11lcn0bsinitvals24;
+ struct d11init *d11lcn0initvals24;
+ struct d11init *d11lcn1bsinitvals24;
+ struct d11init *d11lcn1initvals24;
+ struct d11init *d11lcn2bsinitvals24;
+ struct d11init *d11lcn2initvals24;
+ struct d11init *d11n0absinitvals16;
+ struct d11init *d11n0bsinitvals16;
+ struct d11init *d11n0initvals16;
+ u32 *bcm43xx_16_mimo;
+ u32 bcm43xx_16_mimosz;
+ u32 *bcm43xx_24_lcn;
+ u32 bcm43xx_24_lcnsz;
+ u32 *bcm43xx_bommajor;
+ u32 *bcm43xx_bomminor;
};
-extern struct d11init *d11lcn0bsinitvals24;
-extern struct d11init *d11lcn0initvals24;
-extern struct d11init *d11lcn1bsinitvals24;
-extern struct d11init *d11lcn1initvals24;
-extern struct d11init *d11lcn2bsinitvals24;
-extern struct d11init *d11lcn2initvals24;
-extern struct d11init *d11n0absinitvals16;
-extern struct d11init *d11n0bsinitvals16;
-extern struct d11init *d11n0initvals16;
-extern u32 *bcm43xx_16_mimo;
-extern u32 bcm43xx_16_mimosz;
-extern u32 *bcm43xx_24_lcn;
-extern u32 bcm43xx_24_lcnsz;
-
-extern int brcms_ucode_data_init(struct brcms_info *wl);
-extern void brcms_ucode_data_free(void);
+extern int
+brcms_ucode_data_init(struct brcms_info *wl, struct brcms_ucode *ucode);
+
+extern void brcms_ucode_data_free(struct brcms_ucode *ucode);
extern int brcms_ucode_init_buf(struct brcms_info *wl, void **pbuf,
unsigned int idx);
@@ -50,3 +54,5 @@ extern int brcms_ucode_init_uint(struct brcms_info *wl, unsigned *data,
unsigned int idx);
extern void brcms_ucode_free_buf(void *);
extern int brcms_check_firmwares(struct brcms_info *wl);
+
+#endif /* _BRCM_UCODE_H_ */
--
1.7.1
^ permalink raw reply related
* [PATCH v2 00/26] staging: brcm80211: 8th reaction for mainline patch #2
From: Franky Lin @ 2011-09-27 17:45 UTC (permalink / raw)
To: gregkh; +Cc: devel, linux-wireless
Code clean up for softmac.
V2:
* Rework some patches based on the comments from community
Arend van Spriel (13):
staging: brcm80211: remove uncoditional code blocks from brcmsmac
staging: brcm80211: remove ht_cap field from brcms_c_info structure
staging: brcm80211: use fragment number provided in transmit frame
staging: brcm80211: remove unused function si_pmu_ilp_clock()
staging: brcm80211: make device initializer table for wme constant
staging: brcm80211: remove dongle firmware related debug code
staging: brcm80211: remove unnecessary mac80211 callbacks
staging: brcm80211: changing interface to n-phy rssi compute function
staging: brcm80211: change interface for common rssi compute function
staging: brcm80211: convert endianess before handling the frame
staging: brcm80211: use endian annotated structures in brcmsmac
staging: brcm80211: move rssi computation to place we need it
staging: brcm80211: use d11rxhdr structure in brcms_c_recover_tsf64()
Roland Vossen (13):
staging: brcm80211: removed unused argument from softmac functions
staging: brcm80211: deleted unused array of bss configurations in
softmac
staging: brcm80211: removed redundant wlc->cfg struct member
staging: brcm80211: removed global var from aiutils.c
staging: brcm80211: removed global vars in softmac ucode handling
staging: brcm80211: removed unused softmac workaround
staging: brcm80211: removed band related global vars from softmac
staging: brcm80211: removed global var global_scb from softmac
staging: brcm80211: various global var related changes in softmac
staging: brcm80211: removed global variable in softmac otp
staging: brcm80211: declared global vars in softmac phy as const
staging: brcm80211: simple changes to softmac phy variables
staging: brcm80211: declared global vars in softmac phy as const
drivers/staging/brcm80211/brcmfmac/dhd_sdio.c | 259 +-------
drivers/staging/brcm80211/brcmsmac/Makefile | 3 +-
drivers/staging/brcm80211/brcmsmac/aiutils.c | 15 +-
drivers/staging/brcm80211/brcmsmac/aiutils.h | 2 -
drivers/staging/brcm80211/brcmsmac/ampdu.c | 6 +-
drivers/staging/brcm80211/brcmsmac/d11.h | 91 ++--
drivers/staging/brcm80211/brcmsmac/dma.c | 41 +-
drivers/staging/brcm80211/brcmsmac/mac80211_if.c | 125 +---
drivers/staging/brcm80211/brcmsmac/mac80211_if.h | 3 +-
drivers/staging/brcm80211/brcmsmac/main.c | 747 +++++++++------------
drivers/staging/brcm80211/brcmsmac/main.h | 19 +-
drivers/staging/brcm80211/brcmsmac/otp.c | 147 +----
drivers/staging/brcm80211/brcmsmac/otp.h | 8 -
drivers/staging/brcm80211/brcmsmac/phy/phy_cmn.c | 62 +--
drivers/staging/brcm80211/brcmsmac/phy/phy_hal.h | 4 +-
drivers/staging/brcm80211/brcmsmac/phy/phy_int.h | 25 +-
drivers/staging/brcm80211/brcmsmac/phy/phy_lcn.c | 112 ++--
drivers/staging/brcm80211/brcmsmac/phy/phy_n.c | 75 +--
drivers/staging/brcm80211/brcmsmac/pmu.c | 22 -
drivers/staging/brcm80211/brcmsmac/pmu.h | 1 -
drivers/staging/brcm80211/brcmsmac/pub.h | 1 -
drivers/staging/brcm80211/brcmsmac/rate.h | 1 -
drivers/staging/brcm80211/brcmsmac/srom.c | 19 +-
drivers/staging/brcm80211/brcmsmac/stf.c | 9 -
drivers/staging/brcm80211/brcmsmac/types.h | 6 -
drivers/staging/brcm80211/brcmsmac/ucode_loader.c | 121 ++--
drivers/staging/brcm80211/brcmsmac/ucode_loader.h | 46 +-
27 files changed, 648 insertions(+), 1322 deletions(-)
^ permalink raw reply
* [PATCH v2 04/26] staging: brcm80211: removed redundant wlc->cfg struct member
From: Franky Lin @ 2011-09-27 17:45 UTC (permalink / raw)
To: gregkh; +Cc: devel, linux-wireless
In-Reply-To: <1317145530-18839-1-git-send-email-frankyl@broadcom.com>
From: Roland Vossen <rvossen@broadcom.com>
After initialization ('attach'), this struct member always pointed at
the same memory as wlc->bsscfg.
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
Reviewed-by: Arend van Spriel <arend@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
---
drivers/staging/brcm80211/brcmsmac/main.c | 47 ++++++++++++----------------
drivers/staging/brcm80211/brcmsmac/main.h | 1 -
2 files changed, 20 insertions(+), 28 deletions(-)
diff --git a/drivers/staging/brcm80211/brcmsmac/main.c b/drivers/staging/brcm80211/brcmsmac/main.c
index 138f63b..ee9c322 100644
--- a/drivers/staging/brcm80211/brcmsmac/main.c
+++ b/drivers/staging/brcm80211/brcmsmac/main.c
@@ -486,7 +486,7 @@ static void brcms_c_detach_mfree(struct brcms_c_info *wlc)
if (wlc == NULL)
return;
- brcms_c_bsscfg_mfree(wlc->cfg);
+ brcms_c_bsscfg_mfree(wlc->bsscfg);
kfree(wlc->pub);
kfree(wlc->modulecb);
kfree(wlc->default_bss);
@@ -577,8 +577,8 @@ brcms_c_attach_malloc(uint unit, uint *err, uint devid)
goto fail;
}
- wlc->cfg = brcms_c_bsscfg_malloc(unit);
- if (wlc->cfg == NULL) {
+ wlc->bsscfg = brcms_c_bsscfg_malloc(unit);
+ if (wlc->bsscfg == NULL) {
*err = 1011;
goto fail;
}
@@ -3943,14 +3943,13 @@ void brcms_c_set_ps_ctrl(struct brcms_c_info *wlc)
* Write this BSS config's MAC address to core.
* Updates RXE match engine.
*/
-int brcms_c_set_mac(struct brcms_bss_cfg *cfg)
+int brcms_c_set_mac(struct brcms_bss_cfg *bsscfg)
{
int err = 0;
- struct brcms_c_info *wlc = cfg->wlc;
+ struct brcms_c_info *wlc = bsscfg->wlc;
- if (cfg == wlc->cfg)
- /* enter the MAC addr into the RXE match registers */
- brcms_c_set_addrmatch(wlc, RCM_MAC_OFFSET, cfg->cur_etheraddr);
+ /* enter the MAC addr into the RXE match registers */
+ brcms_c_set_addrmatch(wlc, RCM_MAC_OFFSET, bsscfg->cur_etheraddr);
brcms_c_ampdu_macaddr_upd(wlc);
@@ -3960,13 +3959,10 @@ int brcms_c_set_mac(struct brcms_bss_cfg *cfg)
/* Write the BSS config's BSSID address to core (set_bssid in d11procs.tcl).
* Updates RXE match engine.
*/
-void brcms_c_set_bssid(struct brcms_bss_cfg *cfg)
+void brcms_c_set_bssid(struct brcms_bss_cfg *bsscfg)
{
- struct brcms_c_info *wlc = cfg->wlc;
-
- /* if primary config, we need to update BSSID in RXE match registers */
- if (cfg == wlc->cfg)
- brcms_c_set_addrmatch(wlc, RCM_BSSID_OFFSET, cfg->BSSID);
+ /* we need to update BSSID in RXE match registers */
+ brcms_c_set_addrmatch(bsscfg->wlc, RCM_BSSID_OFFSET, bsscfg->BSSID);
}
static void brcms_b_set_shortslot(struct brcms_hardware *wlc_hw, bool shortslot)
@@ -5388,9 +5384,8 @@ brcms_c_attach(struct brcms_info *wl, u16 vendor, u16 device, uint unit,
goto fail;
}
- wlc->bsscfg = wlc->cfg;
- wlc->cfg->_idx = 0;
- wlc->cfg->wlc = wlc;
+ wlc->bsscfg->_idx = 0;
+ wlc->bsscfg->wlc = wlc;
wlc->mimoft = FT_HT;
wlc->ht_cap.cap_info = HT_CAP;
@@ -6241,8 +6236,8 @@ static void brcms_c_ofdm_rateset_war(struct brcms_c_info *wlc)
u8 r;
bool war = false;
- if (wlc->cfg->associated)
- r = wlc->cfg->current_bss->rateset.rates[0];
+ if (wlc->bsscfg->associated)
+ r = wlc->bsscfg->current_bss->rateset.rates[0];
else
r = wlc->default_bss->rateset.rates[0];
@@ -6311,7 +6306,7 @@ void brcms_c_get_current_rateset(struct brcms_c_info *wlc,
struct brcms_c_rateset *rs;
if (wlc->pub->associated)
- rs = &wlc->cfg->current_bss->rateset;
+ rs = &wlc->bsscfg->current_bss->rateset;
else
rs = &wlc->default_bss->rateset;
@@ -6337,8 +6332,8 @@ int brcms_c_set_rateset(struct brcms_c_info *wlc, struct brcm_rateset *rs)
/* merge rateset coming in with the current mcsset */
if (wlc->pub->_n_enab & SUPPORT_11N) {
struct brcms_bss_info *mcsset_bss;
- if (wlc->cfg->associated)
- mcsset_bss = wlc->cfg->current_bss;
+ if (wlc->bsscfg->associated)
+ mcsset_bss = wlc->bsscfg->current_bss;
else
mcsset_bss = wlc->default_bss;
memcpy(internal_rs.mcs, &mcsset_bss->rateset.mcs[0],
@@ -8096,9 +8091,7 @@ brcms_c_rspec_to_rts_rspec(struct brcms_c_info *wlc, u32 rspec,
void brcms_c_tbtt(struct brcms_c_info *wlc)
{
- struct brcms_bss_cfg *cfg = wlc->cfg;
-
- if (!cfg->BSS)
+ if (!wlc->bsscfg->BSS)
/*
* DirFrmQ is now valid...defer setting until end
* of ATIM window
@@ -9144,7 +9137,7 @@ brcms_c_set_addrmatch(struct brcms_c_info *wlc, int match_reg_offset,
{
brcms_b_set_addrmatch(wlc->hw, match_reg_offset, addr);
if (match_reg_offset == RCM_BSSID_OFFSET)
- memcpy(wlc->cfg->BSSID, addr, ETH_ALEN);
+ memcpy(wlc->bsscfg->BSSID, addr, ETH_ALEN);
}
void brcms_c_pllreq(struct brcms_c_info *wlc, bool set, u32 req_bit)
@@ -9273,7 +9266,7 @@ void brcms_c_scan_stop(struct brcms_c_info *wlc)
void brcms_c_associate_upd(struct brcms_c_info *wlc, bool state)
{
wlc->pub->associated = state;
- wlc->cfg->associated = state;
+ wlc->bsscfg->associated = state;
}
/*
diff --git a/drivers/staging/brcm80211/brcmsmac/main.h b/drivers/staging/brcm80211/brcmsmac/main.h
index ede4aef..d6de9c3 100644
--- a/drivers/staging/brcm80211/brcmsmac/main.h
+++ b/drivers/staging/brcm80211/brcmsmac/main.h
@@ -565,7 +565,6 @@ struct brcms_c_info {
u16 fifo2prec_map[NFIFO];
struct brcms_bss_cfg *bsscfg;
- struct brcms_bss_cfg *cfg;
/* tx queue */
struct brcms_txq_info *tx_queues;
--
1.7.1
^ permalink raw reply related
* [PATCH v2 11/26] staging: brcm80211: make device initializer table for wme constant
From: Franky Lin @ 2011-09-27 17:45 UTC (permalink / raw)
To: gregkh; +Cc: devel, linux-wireless
In-Reply-To: <1317145530-18839-1-git-send-email-frankyl@broadcom.com>
From: Arend van Spriel <arend@broadcom.com>
For chip initialisation of the wme parameters a table is used, but
it was not marked as constant.
Reviewed-by: Roland Vossen <rvossen@broadcom.com>
Signed-off-by: Franky Lin <frankyl@broadcom.com>
---
drivers/staging/brcm80211/brcmsmac/main.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/staging/brcm80211/brcmsmac/main.c b/drivers/staging/brcm80211/brcmsmac/main.c
index dfd67de..a3c0157 100644
--- a/drivers/staging/brcm80211/brcmsmac/main.c
+++ b/drivers/staging/brcm80211/brcmsmac/main.c
@@ -4297,7 +4297,7 @@ void brcms_c_edcf_setparams(struct brcms_c_info *wlc, bool suspend)
int i_ac;
struct ieee80211_tx_queue_params txq_pars;
struct ieee80211_tx_queue_params *params = &txq_pars;
- static struct edcf_acparam default_edcf_acparams[] = {
+ static const struct edcf_acparam default_edcf_acparams[] = {
{EDCF_AC_BE_ACI_STA, EDCF_AC_BE_ECW_STA,
cpu_to_le16(EDCF_AC_BE_TXOP_STA)},
{EDCF_AC_BK_ACI_STA, EDCF_AC_BK_ECW_STA,
@@ -4307,7 +4307,7 @@ void brcms_c_edcf_setparams(struct brcms_c_info *wlc, bool suspend)
{EDCF_AC_VO_ACI_STA, EDCF_AC_VO_ECW_STA,
cpu_to_le16(EDCF_AC_VO_TXOP_STA)}
}; /* ucode needs these parameters during its initialization */
- struct edcf_acparam *edcf_acp = &default_edcf_acparams[0];
+ const struct edcf_acparam *edcf_acp = &default_edcf_acparams[0];
for (i_ac = 0; i_ac < AC_COUNT; i_ac++, edcf_acp++) {
/* find out which ac this set of params applies to */
--
1.7.1
^ permalink raw reply related
* Re: [PATCH] ath6kl: fix TCP corruption
From: Kalle Valo @ 2011-09-27 18:28 UTC (permalink / raw)
To: Kalle Valo; +Cc: linux-wireless
In-Reply-To: <20110927080008.28000.50462.stgit@localhost6.localdomain6>
On 09/27/2011 11:00 AM, Kalle Valo wrote:
> From: Jouni Malinen <jouni@qca.qualcomm.com>
>
> Commit 94e532d1a ("ath6kl: Fix system freeze under heavy data load")
> aligns the skb data without checking if the skb is cloned. Because of
> this ath6kl can corrupt the local TCP stack information that can result
> in TCP retransmission failing and TCP connections stalling.
>
> To avoid the corruption we need to copy the skb. Now the alignment
> in ath6kl_htc_tx_buf_align() doesn't corrupt TCP packets anymore (and is
> not even used for the cloned skb's that got copied since the alignment
> of the data is handled at the copy time).
Applied.
Kalle
^ permalink raw reply
* Re: [PATCH] ath6kl: allow firmware to override firmware patch address
From: Kalle Valo @ 2011-09-27 18:29 UTC (permalink / raw)
To: Kalle Valo; +Cc: linux-wireless
In-Reply-To: <20110927080526.29124.97405.stgit@localhost6.localdomain6>
On 09/27/2011 11:05 AM, Kalle Valo wrote:
> In some firmware versions their patch address has changed. If the firmware
> provides one, use it to override the default address.
Applied.
Kalle
^ permalink raw reply
* Re: [PATCH v2 24/26] staging: brcm80211: declared global vars in softmac phy as const
From: Larry Finger @ 2011-09-27 18:35 UTC (permalink / raw)
To: Franky Lin; +Cc: gregkh, devel, linux-wireless
In-Reply-To: <1317145530-18839-25-git-send-email-frankyl@broadcom.com>
On 09/27/2011 12:45 PM, Franky Lin wrote:
> From: Roland Vossen<rvossen@broadcom.com>
>
> Global variables are undesirable unless they are read only.
>
> Reported-by: Johannes Berg<johannes@sipsolutions.net>
> Reviewed-by: Pieter-Paul Giesberts<pieterpg@broadcom.com>
> Reviewed-by: Arend van Spriel<arend@broadcom.com>
> Signed-off-by: Franky Lin<frankyl@broadcom.com>
> ---
> drivers/staging/brcm80211/brcmsmac/phy/phy_cmn.c | 16 +-----
> drivers/staging/brcm80211/brcmsmac/phy/phy_int.h | 23 --------
> drivers/staging/brcm80211/brcmsmac/phy/phy_lcn.c | 6 +-
> drivers/staging/brcm80211/brcmsmac/phy/phy_n.c | 60 ++++++++++----------
> .../staging/brcm80211/brcmsmac/phy/phytbl_lcn.c | 2 +-
> 5 files changed, 36 insertions(+), 71 deletions(-)
>
> diff --git a/drivers/staging/brcm80211/brcmsmac/phy/phy_cmn.c b/drivers/staging/brcm80211/brcmsmac/phy/phy_cmn.c
> index f9702c0..5b81480 100644
> --- a/drivers/staging/brcm80211/brcmsmac/phy/phy_cmn.c
> +++ b/drivers/staging/brcm80211/brcmsmac/phy/phy_cmn.c
> @@ -52,7 +52,7 @@ struct chan_info_basic {
> u16 freq;
> };
>
> -static struct chan_info_basic chan_info_all[] = {
> +static const struct chan_info_basic chan_info_all[] = {
> {1, 2412},
> {2, 2417},
> {3, 2422},
What are you doing? You make this change here in patch 24, then undo it in #25,
and redo it in #26! Are you guys actually thinking about what you are doing?
This needs to be fixed. In addition, the next time you submit this patch bomb,
change from V2 to V3. That is the standard way to handle resubmissions that are
addressing comments, not by increasing some extra counter in the 00/XX cover
patch. The VX notation helps the maintainer keep track of the patches as he
knows to drop all the V2 ones when V3 arrives. Maintainers are precious and must
be treated very carefully.
Larry
^ permalink raw reply
* [PATCH] cfg80211/mac80211: apply station uAPSD parameters selectively
From: Johannes Berg @ 2011-09-27 18:56 UTC (permalink / raw)
To: John Linville; +Cc: linux-wireless, Eliad Peller
From: Johannes Berg <johannes.berg@intel.com>
Currently, when hostapd sets the station as authorized
we also overwrite its uAPSD parameter. This obviously
leads to buggy behaviour (later, with my patches that
actually add uAPSD support). To fix this, only apply
those parameters if they were actually set in nl80211,
and to achieve that add a bitmap of things to apply.
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
---
So it'd be possible to fix this much simpler by moving the code, but I'm
doing it like this for two reasons:
1) we might later want to implement TSPEC handling and allow them to
change
2) it adds the bitmap that others can build on in the future for other
parameters
include/net/cfg80211.h | 12 ++++++++++++
net/mac80211/cfg.c | 6 ++++--
net/wireless/nl80211.c | 2 ++
3 files changed, 18 insertions(+), 2 deletions(-)
--- a/net/mac80211/cfg.c 2011-09-27 20:37:01.000000000 +0200
+++ b/net/mac80211/cfg.c 2011-09-27 20:37:55.000000000 +0200
@@ -714,8 +714,10 @@ static void sta_apply_parameters(struct
}
spin_unlock_irqrestore(&sta->flaglock, flags);
- sta->sta.uapsd_queues = params->uapsd_queues;
- sta->sta.max_sp = params->max_sp;
+ if (params->sta_modify_mask & STATION_PARAM_APPLY_UAPSD) {
+ sta->sta.uapsd_queues = params->uapsd_queues;
+ sta->sta.max_sp = params->max_sp;
+ }
/*
* cfg80211 validates this (1-2007) and allows setting the AID
--- a/include/net/cfg80211.h 2011-09-27 20:37:00.000000000 +0200
+++ b/include/net/cfg80211.h 2011-09-27 20:37:55.000000000 +0200
@@ -424,6 +424,17 @@ enum plink_actions {
};
/**
+ * enum station_parameters_apply_mask - station parameter values to apply
+ * @STATION_PARAM_APPLY_UAPSD: apply new uAPSD parameters (uapsd_queues, max_sp)
+ *
+ * Not all station parameters have in-band "no change" signalling,
+ * for those that don't these flags will are used.
+ */
+enum station_parameters_apply_mask {
+ STATION_PARAM_APPLY_UAPSD = BIT(0),
+};
+
+/**
* struct station_parameters - station parameters
*
* Used to change and create a new station.
@@ -450,6 +461,7 @@ struct station_parameters {
u8 *supported_rates;
struct net_device *vlan;
u32 sta_flags_mask, sta_flags_set;
+ u32 sta_modify_mask;
int listen_interval;
u16 aid;
u8 supported_rates_len;
--- a/net/wireless/nl80211.c 2011-09-27 20:37:01.000000000 +0200
+++ b/net/wireless/nl80211.c 2011-09-27 20:37:55.000000000 +0200
@@ -2636,6 +2636,8 @@ static int nl80211_new_station(struct sk
if (params.max_sp & ~IEEE80211_WMM_IE_STA_QOSINFO_SP_MASK)
return -EINVAL;
+
+ params.sta_modify_mask |= STATION_PARAM_APPLY_UAPSD;
}
if (dev->ieee80211_ptr->iftype != NL80211_IFTYPE_AP &&
^ permalink raw reply
* Compat-wireless release for 2011-09-27 is baked
From: Compat-wireless cronjob account @ 2011-09-27 19:05 UTC (permalink / raw)
To: linux-wireless
>From git://github.com/sfrothwell/linux-next
+ a4edb65...6a98528 akpm-end -> origin/akpm-end (forced update)
f9d81f6..858b181 akpm-start -> origin/akpm-start
+ 8164e8e...62c9781 master -> origin/master (forced update)
f9d81f6..858b181 stable -> origin/stable
* [new tag] next-20110927 -> next-20110927
compat-wireless code metrics
812397 - Total upstream lines of code being pulled
2397 - backport code changes
2086 - backport code additions
311 - backport code deletions
8559 - backport from compat module
10956 - total backport code
1.3486 - % of code consists of backport work
Host key verification failed.
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(601) [sender=3.0.7]
^ permalink raw reply
* Re: [PATCHv2.1] wireless: at76c50x: use native hex_pack_byte() method
From: Pavel Roskin @ 2011-09-27 19:47 UTC (permalink / raw)
To: Andy Shevchenko; +Cc: John W. Linville, linux-wireless
In-Reply-To: <3feae30d537a79c064495cc834f585192a1e636d.1317124866.git.andriy.shevchenko@linux.intel.com>
On Tue, 27 Sep 2011 15:01:49 +0300
Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote:
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Cc: "John W. Linville" <linville@tuxdriver.com>
> Cc: linux-wireless@vger.kernel.org
> Cc: netdev@vger.kernel.org
> ---
> drivers/net/wireless/at76c50x-usb.c | 18 +++++++-----------
> 1 files changed, 7 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/net/wireless/at76c50x-usb.c
...
> b/drivers/net/wireless/at76c50x-usb.c index 2986014..2dde5f6 100644
> - *obuf++ = BIN2HEX(*ibuf >> 4);
> - *obuf++ = BIN2HEX(*ibuf & 0xf);
> + obuf = pack_hex_byte(obuf, *ibuf++);
> *obuf++ = '-';
> - ibuf++;
> }
> - *(--obuf) = '\0';
> +
> + if (*obuf == '-')
> + obuf--;
This will access uninitialized data and fail to strip the final "-" in
most cases. The check for len being 0 was there for a reason. Please
actually test your code.
NACK
By the way, I don't think it's necessary to copy linux-kernel and
netdev about a change affecting just a wireless driver.
--
Regards,
Pavel Roskin
^ permalink raw reply
* [PATCH] ath6kl: silence "invalid rate" warning
From: Kalle Valo @ 2011-09-27 20:33 UTC (permalink / raw)
To: kvalo; +Cc: linux-wireless
For some reason firmware is sending invalid rates when we try to
query current bitrate from ath6kl_get_station() and a warning is issued:
[ 3810.415720] ath6kl: invalid rate: 1935633515
[ 3811.105493] ath6kl: invalid rate: 1935633515
[ 3811.556063] ath6kl: invalid rate: 1935633515
As the warning happens way too often, convert the warning to a debug
message once we have a proper fix. But to make it easy to follow
how often the problem appears, add a debugfs to print
various statistics about workarounds and make this issue the first WAR.
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
---
drivers/net/wireless/ath/ath6kl/cfg80211.c | 4 ++
drivers/net/wireless/ath/ath6kl/core.h | 4 ++
drivers/net/wireless/ath/ath6kl/debug.c | 48 ++++++++++++++++++++++++++++
drivers/net/wireless/ath/ath6kl/debug.h | 9 +++++
4 files changed, 64 insertions(+), 1 deletions(-)
diff --git a/drivers/net/wireless/ath/ath6kl/cfg80211.c b/drivers/net/wireless/ath/ath6kl/cfg80211.c
index c84f53d..8d9fbd4 100644
--- a/drivers/net/wireless/ath/ath6kl/cfg80211.c
+++ b/drivers/net/wireless/ath/ath6kl/cfg80211.c
@@ -1365,7 +1365,9 @@ static int ath6kl_get_station(struct wiphy *wiphy, struct net_device *dev,
sinfo->txrate.flags |= RATE_INFO_FLAGS_40_MHZ_WIDTH;
sinfo->txrate.flags |= RATE_INFO_FLAGS_MCS;
} else {
- ath6kl_warn("invalid rate: %d\n", rate);
+ ath6kl_dbg(ATH6KL_DBG_WLAN_CFG,
+ "invalid rate from stats: %d\n", rate);
+ ath6kl_debug_war(ar, ATH6KL_WAR_INVALID_RATE);
return 0;
}
diff --git a/drivers/net/wireless/ath/ath6kl/core.h b/drivers/net/wireless/ath/ath6kl/core.h
index 9ecf22b..6d8a484 100644
--- a/drivers/net/wireless/ath/ath6kl/core.h
+++ b/drivers/net/wireless/ath/ath6kl/core.h
@@ -525,6 +525,10 @@ struct ath6kl {
unsigned int dbgfs_diag_reg;
u32 diag_reg_addr_wr;
u32 diag_reg_val_wr;
+
+ struct {
+ unsigned int invalid_rate;
+ } war_stats;
} debug;
#endif /* CONFIG_ATH6KL_DEBUG */
};
diff --git a/drivers/net/wireless/ath/ath6kl/debug.c b/drivers/net/wireless/ath/ath6kl/debug.c
index 4fc83cc..5237369 100644
--- a/drivers/net/wireless/ath/ath6kl/debug.c
+++ b/drivers/net/wireless/ath/ath6kl/debug.c
@@ -192,6 +192,51 @@ static int ath6kl_debugfs_open(struct inode *inode, struct file *file)
return 0;
}
+void ath6kl_debug_war(struct ath6kl *ar, enum ath6kl_war war)
+{
+ switch (war) {
+ case ATH6KL_WAR_INVALID_RATE:
+ ar->debug.war_stats.invalid_rate++;
+ break;
+ }
+}
+
+static ssize_t read_file_war_stats(struct file *file, char __user *user_buf,
+ size_t count, loff_t *ppos)
+{
+ struct ath6kl *ar = file->private_data;
+ char *buf;
+ unsigned int len = 0, buf_len = 1500;
+ ssize_t ret_cnt;
+
+ buf = kzalloc(buf_len, GFP_KERNEL);
+ if (!buf)
+ return -ENOMEM;
+
+ len += scnprintf(buf + len, buf_len - len, "\n");
+ len += scnprintf(buf + len, buf_len - len, "%25s\n",
+ "Workaround stats");
+ len += scnprintf(buf + len, buf_len - len, "%25s\n\n",
+ "=================");
+ len += scnprintf(buf + len, buf_len - len, "%20s %10u\n",
+ "Invalid rates", ar->debug.war_stats.invalid_rate);
+
+ if (WARN_ON(len > buf_len))
+ len = buf_len;
+
+ ret_cnt = simple_read_from_buffer(user_buf, count, ppos, buf, len);
+
+ kfree(buf);
+ return ret_cnt;
+}
+
+static const struct file_operations fops_war_stats = {
+ .read = read_file_war_stats,
+ .open = ath6kl_debugfs_open,
+ .owner = THIS_MODULE,
+ .llseek = default_llseek,
+};
+
static void ath6kl_debug_fwlog_add(struct ath6kl *ar, const void *buf,
size_t buf_len)
{
@@ -873,6 +918,9 @@ int ath6kl_debug_init(struct ath6kl *ar)
debugfs_create_file("reg_write", S_IRUSR | S_IWUSR,
ar->debugfs_phy, ar, &fops_diag_reg_write);
+ debugfs_create_file("war_stats", S_IRUSR, ar->debugfs_phy, ar,
+ &fops_war_stats);
+
return 0;
}
diff --git a/drivers/net/wireless/ath/ath6kl/debug.h b/drivers/net/wireless/ath/ath6kl/debug.h
index 89bf8e1..91f4bc3 100644
--- a/drivers/net/wireless/ath/ath6kl/debug.h
+++ b/drivers/net/wireless/ath/ath6kl/debug.h
@@ -52,6 +52,10 @@ extern int ath6kl_printk(const char *level, const char *fmt, ...)
#define AR_DBG_LVL_CHECK(mask) (debug_mask & mask)
+enum ath6kl_war {
+ ATH6KL_WAR_INVALID_RATE,
+};
+
#ifdef CONFIG_ATH6KL_DEBUG
#define ath6kl_dbg(mask, fmt, ...) \
({ \
@@ -79,6 +83,7 @@ void ath6kl_dump_registers(struct ath6kl_device *dev,
struct ath6kl_irq_enable_reg *irq_en_reg);
void dump_cred_dist_stats(struct htc_target *target);
void ath6kl_debug_fwlog_event(struct ath6kl *ar, const void *buf, size_t len);
+void ath6kl_debug_war(struct ath6kl *ar, enum ath6kl_war war);
int ath6kl_debug_init(struct ath6kl *ar);
void ath6kl_debug_cleanup(struct ath6kl *ar);
@@ -110,6 +115,10 @@ static inline void ath6kl_debug_fwlog_event(struct ath6kl *ar,
{
}
+static inline void ath6kl_debug_war(struct ath6kl *ar, enum ath6kl_war war)
+{
+}
+
static inline int ath6kl_debug_init(struct ath6kl *ar)
{
return 0;
^ permalink raw reply related
* Re: [RFC 04/15] mac80211: split PS buffers into ACs
From: Luis R. Rodriguez @ 2011-09-27 20:51 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless
In-Reply-To: <20110922154849.648785480@sipsolutions.net>
On Thu, Sep 22, 2011 at 8:47 AM, Johannes Berg
<johannes@sipsolutions.net> wrote:
> void sta_info_recalc_tim(struct sta_info *sta)
> {
> struct ieee80211_local *local = sta->local;
> struct ieee80211_if_ap *bss = sta->sdata->bss;
> unsigned long flags;
> - bool have_data;
> + bool indicate_tim = false;
> + u8 ignore_for_tim = sta->sta.uapsd_queues;
> + int ac;
>
> /* No need to do anything if the driver does all */
> if (local->hw.flags & IEEE80211_HW_AP_LINK_PS)
> return;
>
> - have_data = test_sta_flags(sta, WLAN_STA_PS_DRIVER_BUF) ||
> - !skb_queue_empty(&sta->tx_filtered) ||
> - !skb_queue_empty(&sta->ps_tx_buf);
> + /*
> + * If all ACs are delivery-enabled then we should build
> + * the TIM bit for all ACs anyway; if only some are then
> + * we ignore those and build the TIM bit using only the
> + * non-enabled ones.
> + */
As per the documentation uapsd_queues is the "bitmap of queues
configured for uapsd". As I read this we are ignoring setting the TIM
for the STA if an AC queue was marked as uapsd-enabled but had
buffered frames for it, so we'd only set the TIM if we had at least
one AC queue that did not have uapsd enabled and had buffered frames
pending. Is that accurate?
Luis
^ permalink raw reply
* Re: 答复: 答复: 答复: RTL8192SE and 802.11n problem
From: Larry Finger @ 2011-09-27 21:00 UTC (permalink / raw)
To: Stefan Zwanenburg; +Cc: 'Chaoming_Li', linux-wireless
In-Reply-To: <4E820130.7080801@gmail.com>
On 09/27/2011 12:00 PM, Stefan Zwanenburg wrote:
> I've sent the below mail quite some time ago to Larry Finger and Chaoming Li,
> but am now unsure if it has actually arrived. Also, I thought maybe I'm not
> getting a response because of the fact I didn't CC the mailing list (which I
> didn't because of the attachment; I thought that would be frowned upon).
> Now, I don't want to come across as impatient, but it would mean a lot to me if
> the source of the problem were to be found.
>
> My sincerest apologies if attachments don't belong on the mailing list, and/or
> if this message is a duplicate!
>
> Stefan Zwanenburg
>
> -------- Original Message --------
> Subject: Re: 答复: 答复: 答复: RTL8192SE and 802.11n problem
> Date: Mon, 19 Sep 2011 23:06:23 +0200
> From: Stefan Zwanenburg <stefanhetzwaantje@gmail.com>
> To: 李朝明 <chaoming_li@realsil.com.cn>
> CC: 'Larry Finger' <Larry.Finger@lwfinger.net>
>
>
>
> On 09/19/2011 10:04 PM, Stefan Zwanenburg wrote:
>> On 09/19/2011 06:41 AM, 李朝明 wrote:
>>> Dear Sir:
>>>
>>> Yes, sniffer can help, Could you help to catch the authentication
>>> and association packet and send it to me。
>>>
>>> Best Regards,
>>> lizhaoming
>>>
>> Find below the output of wpa_supplicant with the -ddd switch. If that is
>> not the information you required (ie: you need even rawer logging or
>> somesuch), please tell me what I need to do, or where I might find the
>> information to do what I need to do.
> So I got some help on how to sniff the association process. Please find
> attached a dump of said process.
Sorry to not answer earlier. I was busy and I also hoped that Chaoming would
handle this part.
I did a dump of the authentication and association process with my RTL8191SE and
my AP. For both systems, the authentication packets are identical, as are the
association request and response. The capability flags are identical.
This is where the two sequences differ: My AP sends an action frame with
No. Time Source Destination Protocol Info
9 0.010970 Netgear_be:2b:44 RealtekS_72:02:18 IEEE 802.11
Action, SN=2120, FN=0, Flags=........
Frame 9: 33 bytes on wire (264 bits), 33 bytes captured (264 bits)
Arrival Time: Sep 27, 2011 14:47:33.529328000 CDT
Epoch Time: 1317152853.529328000 seconds
[Time delta from previous captured frame: 0.004135000 seconds]
[Time delta from previous displayed frame: 0.004135000 seconds]
[Time since reference or first frame: 0.010970000 seconds]
Frame Number: 9
Frame Length: 33 bytes (264 bits)
Capture Length: 33 bytes (264 bits)
[Frame is marked: False]
[Frame is ignored: False]
[Protocols in frame: wlan]
IEEE 802.11 Action, Flags: ........
Type/Subtype: Action (0x0d)
Frame Control: 0x00D0 (Normal)
Version: 0
Type: Management frame (0)
Subtype: 13
Flags: 0x0
Duration: 314
Destination address: RealtekS_72:02:18 (00:e0:4c:72:02:18)
Source address: Netgear_be:2b:44 (c0:3f:0e:be:2b:44)
BSS Id: Netgear_be:2b:44 (c0:3f:0e:be:2b:44)
Fragment number: 0
Sequence number: 2120
IEEE 802.11 wireless LAN management frame
Fixed parameters
Action: 0x03
Category code: Block Ack (3)
Action code: Add Block Ack Request (0x00)
Dialog token: 0xee
Block Ack Parameters: 0x1002
.... .... .... ...0 = A-MSDUs: Not Permitted
.... .... .... ..1. = Block Ack Policy: Immediate Block Ack
..00 00.. = Traffic Identifier: 0x00
0001 0000 00.. .... = Number of Buffers (1 Buffer = 2304 Bytes): 64
Block Ack Timeout: 0x0000
Block Ack Starting Sequence Control (SSC): 0x0000
Your AP does not send such a packet. My STA responds with an ACK and another
action frame:
No. Time Source Destination Protocol Info
11 0.025115 RealtekS_72:02:18 Netgear_be:2b:44 IEEE 802.11
Action, SN=28, FN=0, Flags=........
Frame 11: 33 bytes on wire (264 bits), 33 bytes captured (264 bits)
Arrival Time: Sep 27, 2011 14:47:33.543473000 CDT
Epoch Time: 1317152853.543473000 seconds
[Time delta from previous captured frame: 0.013897000 seconds]
[Time delta from previous displayed frame: 0.013897000 seconds]
[Time since reference or first frame: 0.025115000 seconds]
Frame Number: 11
Frame Length: 33 bytes (264 bits)
Capture Length: 33 bytes (264 bits)
[Frame is marked: False]
[Frame is ignored: False]
[Protocols in frame: wlan]
IEEE 802.11 Action, Flags: ........
Type/Subtype: Action (0x0d)
Frame Control: 0x00D0 (Normal)
Version: 0
Type: Management frame (0)
Subtype: 13
Flags: 0x0
Duration: 0
Destination address: Netgear_be:2b:44 (c0:3f:0e:be:2b:44)
Source address: RealtekS_72:02:18 (00:e0:4c:72:02:18)
BSS Id: Netgear_be:2b:44 (c0:3f:0e:be:2b:44)
Fragment number: 0
Sequence number: 28
IEEE 802.11 wireless LAN management frame
Fixed parameters
Action: 0x03
Category code: Block Ack (3)
Action code: Add Block Ack Response (0x01)
Dialog token: 0xee
Status code: Successful (0x0000)
Block Ack Parameters: 0x1002
.... .... .... ...0 = A-MSDUs: Not Permitted
.... .... .... ..1. = Block Ack Policy: Immediate Block Ack
..00 00.. = Traffic Identifier: 0x00
0001 0000 00.. .... = Number of Buffers (1 Buffer = 2304 Bytes): 64
Block Ack Timeout: 0x0000
This packet is followed by a Block Ack in both directions and then the EAPOL 1/4
is sent.
I'm not familiar enough to know the significance of these differences, but I'm
guessing that they may be the source of your problem.
I have to go now, but if no one describes what we are seeing, I'll review the
802.11n specs and get back to you tomorrow.
Larry
^ permalink raw reply
* Re: [PATCH 2/5] mac80211: standardize adding supported rates IEs
From: Arik Nemtsov @ 2011-09-27 21:08 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless, Kalyan C Gaddam
In-Reply-To: <1317123991.4082.17.camel@jlt3.sipsolutions.net>
On Tue, Sep 27, 2011 at 14:46, Johannes Berg <johannes@sipsolutions.net> wrote:
>> +EXPORT_SYMBOL(ieee80211_add_srates_ie);
>
>> +EXPORT_SYMBOL(ieee80211_add_ext_srates_ie);
>
> You shouldn't export these.
>
>> \ No newline at end of file
>
> And it's a good idea to have "\n" be the last character of the file :)
>
Will do.
Arik
^ permalink raw reply
* Re: [PATCH v2 24/26] staging: brcm80211: declared global vars in softmac phy as const
From: Arend van Spriel @ 2011-09-27 21:10 UTC (permalink / raw)
To: Larry Finger
Cc: Franky (Zhenhui) Lin, gregkh@suse.de,
devel@linuxdriverproject.org, linux-wireless@vger.kernel.org
In-Reply-To: <4E82175A.7020504@lwfinger.net>
On 09/27/2011 08:35 PM, Larry Finger wrote:
> On 09/27/2011 12:45 PM, Franky Lin wrote:
>> From: Roland Vossen<rvossen@broadcom.com>
>>
>> Global variables are undesirable unless they are read only.
>>
>> Reported-by: Johannes Berg<johannes@sipsolutions.net>
>> Reviewed-by: Pieter-Paul Giesberts<pieterpg@broadcom.com>
>> Reviewed-by: Arend van Spriel<arend@broadcom.com>
>> Signed-off-by: Franky Lin<frankyl@broadcom.com>
>> ---
>> drivers/staging/brcm80211/brcmsmac/phy/phy_cmn.c | 16 +-----
>> drivers/staging/brcm80211/brcmsmac/phy/phy_int.h | 23 --------
>> drivers/staging/brcm80211/brcmsmac/phy/phy_lcn.c | 6 +-
>> drivers/staging/brcm80211/brcmsmac/phy/phy_n.c | 60 ++++++++++----------
>> .../staging/brcm80211/brcmsmac/phy/phytbl_lcn.c | 2 +-
>> 5 files changed, 36 insertions(+), 71 deletions(-)
>>
>> diff --git a/drivers/staging/brcm80211/brcmsmac/phy/phy_cmn.c b/drivers/staging/brcm80211/brcmsmac/phy/phy_cmn.c
>> index f9702c0..5b81480 100644
>> --- a/drivers/staging/brcm80211/brcmsmac/phy/phy_cmn.c
>> +++ b/drivers/staging/brcm80211/brcmsmac/phy/phy_cmn.c
>> @@ -52,7 +52,7 @@ struct chan_info_basic {
>> u16 freq;
>> };
>>
>> -static struct chan_info_basic chan_info_all[] = {
>> +static const struct chan_info_basic chan_info_all[] = {
>> {1, 2412},
>> {2, 2417},
>> {3, 2422},
> What are you doing? You make this change here in patch 24, then undo it in #25,
> and redo it in #26! Are you guys actually thinking about what you are doing?
We reordered the patches a little to move the ones we got feedback about
at the end for rework. My bet is that you see rebase at work although I
agree this is pretty tricky. I am glad the net result is that the const
qualifier is added. There was some thinking involved in what we did
today ;-)
> This needs to be fixed. In addition, the next time you submit this patch bomb,
> change from V2 to V3. That is the standard way to handle resubmissions that are
> addressing comments, not by increasing some extra counter in the 00/XX cover
> patch. The VX notation helps the maintainer keep track of the patches as he
> knows to drop all the V2 ones when V3 arrives. Maintainers are precious and must
> be treated very carefully.
And here we were thinking we would have learned all tricks about
submitting patches in our staging year ;-)
So to be sure I have it right: Only the cover letter should say: [PATCH
v2 00/20] with the same headline as the orignal. Or should each patch
say [PATCH v2 xx/20] even when there are 26 patches?
> Larry
It would not have hurt if the cover letter of this series would indicate
it replaces the previous series by refering to its message-id. Would
that be an alternative approach or just a good addition.
Gr. AvS
^ permalink raw reply
* Re: [PATCH 3/5] mac80211: handle TDLS high-level commands and frames
From: Arik Nemtsov @ 2011-09-27 21:12 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless, Kalyan C Gaddam
In-Reply-To: <1317124207.4082.20.camel@jlt3.sipsolutions.net>
On Tue, Sep 27, 2011 at 14:50, Johannes Berg <johannes@sipsolutions.net> wrote:
> On Mon, 2011-09-26 at 13:54 +0300, Arik Nemtsov wrote:
>
>> +/*
>> + * TDLS capabililites to be enabled in the 5th byte of the
>> + * @WLAN_EID_EXT_CAPABILITY information element
>> + */
>> +#define WLAN_EXT_CAPA_TDLS_ENABLED BIT(5)
>> +#define WLAN_EXT_CAPA_TDLS_PROHIBITED BIT(6)
>
> Would it be useful to have the IE declared as a struct somewhere?
It's really just a bit-mask, and a variable length one as it is. But
I'll change the name to make it more palatable. Something like
WLAN_EXT_CAPA5_TDLS_ENABLED :)
>
>
>> +static int
>> +ieee80211_prep_tdls_encap_data(struct wiphy *wiphy, struct net_device *dev,
>> + u8 *peer, u8 action_code, u8 dialog_token,
>> + u16 status_code, struct sk_buff *skb)
>
> All the code addition here makes me wonder if it'd be useful to move it
> into a new tdls.c file and just call the right hooks from cfg.c? the cfg
> file is pretty large already ... tdls wouldn't be huge, but still might
> make sense?
As discussed on IRC, this code is pretty much stateless, and it's not
a lot of code. We agreed we can keep it in cfg.c for now.
Arik
^ permalink raw reply
* pull request: wireless 2011-09-27
From: John W. Linville @ 2011-09-27 21:00 UTC (permalink / raw)
To: davem; +Cc: linux-wireless, netdev, linux-kernel
Dave,
Here is another last (?) batch of fixes intended for 3.1. Included is a
scanning-related regression fix that avoids a potential crash, a buffer
overflow fix in cfg80211, an fix for an uninitialized variable in
rtlwifi, a fix for a DMA-related WARNING in ath9k, a fix for a DMA hang
in ath9k, and two iwlegacy fixes backported from prior iwlagn fixes, one
for avoiding interruptible waits and another for avoiding a command
queue timeout.
Please let me know if there are problems!
Thanks,
John
---
The following changes since commit d93dc5c4478c1fd5de85a3e8aece9aad7bbae044:
Linux 3.1-rc7 (2011-09-21 16:58:15 -0700)
are available in the git repository at:
git://git.infradead.org/users/linville/wireless.git for-davem
Johannes Berg (1):
iwlagn: fix dangling scan request
John W. Linville (1):
Merge branch 'master' of git://git.infradead.org/users/linville/wireless into for-davem
Jouni Malinen (1):
cfg80211: Fix validation of AKM suites
Larry Finger (1):
rtlwifi: rtl8192cu: Fix unitialized struct
Mohammed Shafi Shajakhan (1):
ath9k: Fix a dma warning/memory leak
Rajkumar Manoharan (1):
ath9k_hw: Fix Rx DMA stuck for AR9003 chips
Stanislaw Gruszka (2):
iwlegacy: fix command queue timeout
iwlegacy: do not use interruptible waits
.../net/wireless/ath/ath9k/ar9003_2p2_initvals.h | 2 +-
drivers/net/wireless/ath/ath9k/recv.c | 10 ++++++-
drivers/net/wireless/iwlegacy/iwl-core.c | 4 +-
drivers/net/wireless/iwlegacy/iwl-hcmd.c | 2 +-
drivers/net/wireless/iwlegacy/iwl-tx.c | 4 ++-
drivers/net/wireless/iwlegacy/iwl3945-base.c | 8 ++--
drivers/net/wireless/iwlegacy/iwl4965-base.c | 10 +++---
drivers/net/wireless/iwlwifi/iwl-scan.c | 30 ++++++++++---------
drivers/net/wireless/rtlwifi/usb.c | 1 +
net/wireless/nl80211.c | 5 ++-
10 files changed, 46 insertions(+), 30 deletions(-)
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
index 2339728..3e69c63 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
+++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
@@ -1514,7 +1514,7 @@ static const u32 ar9300_2p2_mac_core[][2] = {
{0x00008258, 0x00000000},
{0x0000825c, 0x40000000},
{0x00008260, 0x00080922},
- {0x00008264, 0x9bc00010},
+ {0x00008264, 0x9d400010},
{0x00008268, 0xffffffff},
{0x0000826c, 0x0000ffff},
{0x00008270, 0x00000000},
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
index 9a48501..4c21f8c 100644
--- a/drivers/net/wireless/ath/ath9k/recv.c
+++ b/drivers/net/wireless/ath/ath9k/recv.c
@@ -205,14 +205,22 @@ static void ath_rx_remove_buffer(struct ath_softc *sc,
static void ath_rx_edma_cleanup(struct ath_softc *sc)
{
+ struct ath_hw *ah = sc->sc_ah;
+ struct ath_common *common = ath9k_hw_common(ah);
struct ath_buf *bf;
ath_rx_remove_buffer(sc, ATH9K_RX_QUEUE_LP);
ath_rx_remove_buffer(sc, ATH9K_RX_QUEUE_HP);
list_for_each_entry(bf, &sc->rx.rxbuf, list) {
- if (bf->bf_mpdu)
+ if (bf->bf_mpdu) {
+ dma_unmap_single(sc->dev, bf->bf_buf_addr,
+ common->rx_bufsize,
+ DMA_BIDIRECTIONAL);
dev_kfree_skb_any(bf->bf_mpdu);
+ bf->bf_buf_addr = 0;
+ bf->bf_mpdu = NULL;
+ }
}
INIT_LIST_HEAD(&sc->rx.rxbuf);
diff --git a/drivers/net/wireless/iwlegacy/iwl-core.c b/drivers/net/wireless/iwlegacy/iwl-core.c
index 35cd253..e5971fe 100644
--- a/drivers/net/wireless/iwlegacy/iwl-core.c
+++ b/drivers/net/wireless/iwlegacy/iwl-core.c
@@ -937,7 +937,7 @@ void iwl_legacy_irq_handle_error(struct iwl_priv *priv)
&priv->contexts[IWL_RXON_CTX_BSS]);
#endif
- wake_up_interruptible(&priv->wait_command_queue);
+ wake_up(&priv->wait_command_queue);
/* Keep the restart process from trying to send host
* commands by clearing the INIT status bit */
@@ -1746,7 +1746,7 @@ int iwl_legacy_force_reset(struct iwl_priv *priv, bool external)
/* Set the FW error flag -- cleared on iwl_down */
set_bit(STATUS_FW_ERROR, &priv->status);
- wake_up_interruptible(&priv->wait_command_queue);
+ wake_up(&priv->wait_command_queue);
/*
* Keep the restart process from trying to send host
* commands by clearing the INIT status bit
diff --git a/drivers/net/wireless/iwlegacy/iwl-hcmd.c b/drivers/net/wireless/iwlegacy/iwl-hcmd.c
index 62b4b09..ce1fc9f 100644
--- a/drivers/net/wireless/iwlegacy/iwl-hcmd.c
+++ b/drivers/net/wireless/iwlegacy/iwl-hcmd.c
@@ -167,7 +167,7 @@ int iwl_legacy_send_cmd_sync(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
goto out;
}
- ret = wait_event_interruptible_timeout(priv->wait_command_queue,
+ ret = wait_event_timeout(priv->wait_command_queue,
!test_bit(STATUS_HCMD_ACTIVE, &priv->status),
HOST_COMPLETE_TIMEOUT);
if (!ret) {
diff --git a/drivers/net/wireless/iwlegacy/iwl-tx.c b/drivers/net/wireless/iwlegacy/iwl-tx.c
index 4fff995..ef9e268 100644
--- a/drivers/net/wireless/iwlegacy/iwl-tx.c
+++ b/drivers/net/wireless/iwlegacy/iwl-tx.c
@@ -625,6 +625,8 @@ iwl_legacy_tx_cmd_complete(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb)
cmd = txq->cmd[cmd_index];
meta = &txq->meta[cmd_index];
+ txq->time_stamp = jiffies;
+
pci_unmap_single(priv->pci_dev,
dma_unmap_addr(meta, mapping),
dma_unmap_len(meta, len),
@@ -645,7 +647,7 @@ iwl_legacy_tx_cmd_complete(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb)
clear_bit(STATUS_HCMD_ACTIVE, &priv->status);
IWL_DEBUG_INFO(priv, "Clearing HCMD_ACTIVE for command %s\n",
iwl_legacy_get_cmd_string(cmd->hdr.cmd));
- wake_up_interruptible(&priv->wait_command_queue);
+ wake_up(&priv->wait_command_queue);
}
/* Mark as unmapped */
diff --git a/drivers/net/wireless/iwlegacy/iwl3945-base.c b/drivers/net/wireless/iwlegacy/iwl3945-base.c
index 795826a..66ee1562 100644
--- a/drivers/net/wireless/iwlegacy/iwl3945-base.c
+++ b/drivers/net/wireless/iwlegacy/iwl3945-base.c
@@ -841,7 +841,7 @@ static void iwl3945_rx_card_state_notif(struct iwl_priv *priv,
wiphy_rfkill_set_hw_state(priv->hw->wiphy,
test_bit(STATUS_RF_KILL_HW, &priv->status));
else
- wake_up_interruptible(&priv->wait_command_queue);
+ wake_up(&priv->wait_command_queue);
}
/**
@@ -2269,7 +2269,7 @@ static void iwl3945_alive_start(struct iwl_priv *priv)
iwl3945_reg_txpower_periodic(priv);
IWL_DEBUG_INFO(priv, "ALIVE processing complete.\n");
- wake_up_interruptible(&priv->wait_command_queue);
+ wake_up(&priv->wait_command_queue);
return;
@@ -2300,7 +2300,7 @@ static void __iwl3945_down(struct iwl_priv *priv)
iwl_legacy_clear_driver_stations(priv);
/* Unblock any waiting calls */
- wake_up_interruptible_all(&priv->wait_command_queue);
+ wake_up_all(&priv->wait_command_queue);
/* Wipe out the EXIT_PENDING status bit if we are not actually
* exiting the module */
@@ -2853,7 +2853,7 @@ static int iwl3945_mac_start(struct ieee80211_hw *hw)
/* Wait for START_ALIVE from ucode. Otherwise callbacks from
* mac80211 will not be run successfully. */
- ret = wait_event_interruptible_timeout(priv->wait_command_queue,
+ ret = wait_event_timeout(priv->wait_command_queue,
test_bit(STATUS_READY, &priv->status),
UCODE_READY_TIMEOUT);
if (!ret) {
diff --git a/drivers/net/wireless/iwlegacy/iwl4965-base.c b/drivers/net/wireless/iwlegacy/iwl4965-base.c
index 1433466..aa0c253 100644
--- a/drivers/net/wireless/iwlegacy/iwl4965-base.c
+++ b/drivers/net/wireless/iwlegacy/iwl4965-base.c
@@ -576,7 +576,7 @@ static void iwl4965_rx_card_state_notif(struct iwl_priv *priv,
wiphy_rfkill_set_hw_state(priv->hw->wiphy,
test_bit(STATUS_RF_KILL_HW, &priv->status));
else
- wake_up_interruptible(&priv->wait_command_queue);
+ wake_up(&priv->wait_command_queue);
}
/**
@@ -926,7 +926,7 @@ static void iwl4965_irq_tasklet(struct iwl_priv *priv)
handled |= CSR_INT_BIT_FH_TX;
/* Wake up uCode load routine, now that load is complete */
priv->ucode_write_complete = 1;
- wake_up_interruptible(&priv->wait_command_queue);
+ wake_up(&priv->wait_command_queue);
}
if (inta & ~handled) {
@@ -1795,7 +1795,7 @@ static void iwl4965_alive_start(struct iwl_priv *priv)
iwl4965_rf_kill_ct_config(priv);
IWL_DEBUG_INFO(priv, "ALIVE processing complete.\n");
- wake_up_interruptible(&priv->wait_command_queue);
+ wake_up(&priv->wait_command_queue);
iwl_legacy_power_update_mode(priv, true);
IWL_DEBUG_INFO(priv, "Updated power mode\n");
@@ -1828,7 +1828,7 @@ static void __iwl4965_down(struct iwl_priv *priv)
iwl_legacy_clear_driver_stations(priv);
/* Unblock any waiting calls */
- wake_up_interruptible_all(&priv->wait_command_queue);
+ wake_up_all(&priv->wait_command_queue);
/* Wipe out the EXIT_PENDING status bit if we are not actually
* exiting the module */
@@ -2266,7 +2266,7 @@ int iwl4965_mac_start(struct ieee80211_hw *hw)
/* Wait for START_ALIVE from Run Time ucode. Otherwise callbacks from
* mac80211 will not be run successfully. */
- ret = wait_event_interruptible_timeout(priv->wait_command_queue,
+ ret = wait_event_timeout(priv->wait_command_queue,
test_bit(STATUS_READY, &priv->status),
UCODE_READY_TIMEOUT);
if (!ret) {
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c
index dd6937e..77e528f 100644
--- a/drivers/net/wireless/iwlwifi/iwl-scan.c
+++ b/drivers/net/wireless/iwlwifi/iwl-scan.c
@@ -405,31 +405,33 @@ int iwl_mac_hw_scan(struct ieee80211_hw *hw,
mutex_lock(&priv->mutex);
- if (test_bit(STATUS_SCANNING, &priv->status) &&
- priv->scan_type != IWL_SCAN_NORMAL) {
- IWL_DEBUG_SCAN(priv, "Scan already in progress.\n");
- ret = -EAGAIN;
- goto out_unlock;
- }
-
- /* mac80211 will only ask for one band at a time */
- priv->scan_request = req;
- priv->scan_vif = vif;
-
/*
* If an internal scan is in progress, just set
* up the scan_request as per above.
*/
if (priv->scan_type != IWL_SCAN_NORMAL) {
- IWL_DEBUG_SCAN(priv, "SCAN request during internal scan\n");
+ IWL_DEBUG_SCAN(priv,
+ "SCAN request during internal scan - defer\n");
+ priv->scan_request = req;
+ priv->scan_vif = vif;
ret = 0;
- } else
+ } else {
+ priv->scan_request = req;
+ priv->scan_vif = vif;
+ /*
+ * mac80211 will only ask for one band at a time
+ * so using channels[0] here is ok
+ */
ret = iwl_scan_initiate(priv, vif, IWL_SCAN_NORMAL,
req->channels[0]->band);
+ if (ret) {
+ priv->scan_request = NULL;
+ priv->scan_vif = NULL;
+ }
+ }
IWL_DEBUG_MAC80211(priv, "leave\n");
-out_unlock:
mutex_unlock(&priv->mutex);
return ret;
diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c
index 8b1cef0..4bf3cf4 100644
--- a/drivers/net/wireless/rtlwifi/usb.c
+++ b/drivers/net/wireless/rtlwifi/usb.c
@@ -863,6 +863,7 @@ static void _rtl_usb_tx_preprocess(struct ieee80211_hw *hw, struct sk_buff *skb,
u8 tid = 0;
u16 seq_number = 0;
+ memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc));
if (ieee80211_is_auth(fc)) {
RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, ("MAC80211_LINKING\n"));
rtl_ips_nic_on(hw);
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index e83e7fe..ea40d54 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -4113,9 +4113,12 @@ static int nl80211_crypto_settings(struct cfg80211_registered_device *rdev,
if (len % sizeof(u32))
return -EINVAL;
+ if (settings->n_akm_suites > NL80211_MAX_NR_AKM_SUITES)
+ return -EINVAL;
+
memcpy(settings->akm_suites, data, len);
- for (i = 0; i < settings->n_ciphers_pairwise; i++)
+ for (i = 0; i < settings->n_akm_suites; i++)
if (!nl80211_valid_akm_suite(settings->akm_suites[i]))
return -EINVAL;
}
--
John W. Linville Someday the world will need a hero, and you
linville@tuxdriver.com might be all we have. Be ready.
^ permalink raw reply related
* Re: [PATCH 4/5] nl80211/mac80211: allow adding TDLS peers as stations
From: Arik Nemtsov @ 2011-09-27 21:24 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless, Kalyan C Gaddam
In-Reply-To: <1317124553.4082.26.camel@jlt3.sipsolutions.net>
On Tue, Sep 27, 2011 at 14:55, Johannes Berg <johannes@sipsolutions.net> wrote:
> On Mon, 2011-09-26 at 13:54 +0300, Arik Nemtsov wrote:
>
>> @@ -811,6 +817,11 @@ static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev,
>>
>> sta_apply_parameters(local, sta, params);
>>
>> + if (!(wiphy->flags & WIPHY_FLAG_SUPPORTS_TDLS) &&
>> + (sta->flags & WLAN_STA_TDLS_PEER)) {
>> + return -ENOTSUPP;
>> + }
>
> I think this should maybe also make sure that the interface is in
> station mode? Otherwise it could get somewhat confusing. Also changes to
> the TDLS flag probably shouldn't be allowed.
Sure. I'll add some more guards.
>
> And this code might also be better in cfg80211, although this is only
> with external management, right?
There's a similar check in cfg80211 code, in nl80211_new_station().
>
>> --- a/net/wireless/nl80211.c
>> +++ b/net/wireless/nl80211.c
>> @@ -2521,18 +2521,18 @@ static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
>> - if (params.sta_flags_mask & ~BIT(NL80211_STA_FLAG_AUTHORIZED))
>> + if (params.sta_flags_mask &
>> + ~(BIT(NL80211_STA_FLAG_AUTHORIZED) |
>> + BIT(NL80211_STA_FLAG_TDLS_PEER)))
>
> Why is the TDLS flag allowed to change?
I'll add some more TDLS specific guards in set_station as well.
>
>
>> + /*
>> + * Managed stations can only add TDLS peers, and only when the
>> + * wiphy supports it.
>> + */
>> + if (dev->ieee80211_ptr->iftype == NL80211_IFTYPE_STATION &&
>> + (!(params.sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER)) ||
>> + !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_TDLS)))
>> return -EINVAL;
>
> If the device does full TDLS by itself I don't think we should be
> allowed to add/remove stations?
Fair point. I'll add a EXTERNAL_SETUP check here.
>
> Maybe you need to describe the command sequences a little bit somewhere.
> I'm getting a bad feeling about adding stations without supported rates,
> and this is only when we have external management etc.
>
> Part of your argument for having the frame sending etc. in the kernel
> was that then it's more like managed mode, but all the manual station
> handling is very much unlike that.
>
> I'm beginning to think that maybe it should be handled through the TDLS
> operations instead, more implicitly?
>
As discussed on IRC, the added station is convenient for implementing
the TDLS Tx-lock during link setup. Stations are (almost)
automatically purged when disassociating, thereby clearing TDLS state.
It's also already part of the mac80211 Tx path, so no need to add
other elements.
Adding a station with no supported rates is a bit strange, but it is
clearly flagged as a TDLS peer sta and checks are in place in the Tx
path to prevent abuse.
Arik
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox