Commit 78fd9c44 authored by David S. Miller's avatar David S. Miller
parents b9958a95 822395b5
...@@ -3580,6 +3580,7 @@ ath5k_pci_probe(struct pci_dev *pdev, ...@@ -3580,6 +3580,7 @@ ath5k_pci_probe(struct pci_dev *pdev,
common->ah = sc->ah; common->ah = sc->ah;
common->hw = hw; common->hw = hw;
common->cachelsz = csz << 2; /* convert to bytes */ common->cachelsz = csz << 2; /* convert to bytes */
spin_lock_init(&common->cc_lock);
/* Initialize device */ /* Initialize device */
ret = ath5k_hw_attach(sc); ret = ath5k_hw_attach(sc);
......
...@@ -347,6 +347,10 @@ static bool create_pa_curve(u32 *data_L, u32 *data_U, u32 *pa_table, u16 *gain) ...@@ -347,6 +347,10 @@ static bool create_pa_curve(u32 *data_L, u32 *data_U, u32 *pa_table, u16 *gain)
(((Y[6] - Y[3]) * 1 << scale_factor) + (((Y[6] - Y[3]) * 1 << scale_factor) +
(x_est[6] - x_est[3])) / (x_est[6] - x_est[3]); (x_est[6] - x_est[3])) / (x_est[6] - x_est[3]);
/* prevent division by zero */
if (G_fxp == 0)
return false;
Y_intercept = Y_intercept =
(G_fxp * (x_est[0] - x_est[3]) + (G_fxp * (x_est[0] - x_est[3]) +
(1 << scale_factor)) / (1 << scale_factor) + Y[3]; (1 << scale_factor)) / (1 << scale_factor) + Y[3];
...@@ -356,14 +360,12 @@ static bool create_pa_curve(u32 *data_L, u32 *data_U, u32 *pa_table, u16 *gain) ...@@ -356,14 +360,12 @@ static bool create_pa_curve(u32 *data_L, u32 *data_U, u32 *pa_table, u16 *gain)
for (i = 0; i <= 3; i++) { for (i = 0; i <= 3; i++) {
y_est[i] = i * 32; y_est[i] = i * 32;
/* prevent division by zero */
if (G_fxp == 0)
return false;
x_est[i] = ((y_est[i] * 1 << scale_factor) + G_fxp) / G_fxp; x_est[i] = ((y_est[i] * 1 << scale_factor) + G_fxp) / G_fxp;
} }
if (y_est[max_index] == 0)
return false;
x_est_fxp1_nonlin = x_est_fxp1_nonlin =
x_est[max_index] - ((1 << scale_factor) * y_est[max_index] + x_est[max_index] - ((1 << scale_factor) * y_est[max_index] +
G_fxp) / G_fxp; G_fxp) / G_fxp;
...@@ -457,6 +459,8 @@ static bool create_pa_curve(u32 *data_L, u32 *data_U, u32 *pa_table, u16 *gain) ...@@ -457,6 +459,8 @@ static bool create_pa_curve(u32 *data_L, u32 *data_U, u32 *pa_table, u16 *gain)
Q_scale_B = find_proper_scale(find_expn(abs(scale_B)), 10); Q_scale_B = find_proper_scale(find_expn(abs(scale_B)), 10);
scale_B = scale_B / (1 << Q_scale_B); scale_B = scale_B / (1 << Q_scale_B);
if (scale_B == 0)
return false;
Q_beta = find_proper_scale(find_expn(abs(beta_raw)), 10); Q_beta = find_proper_scale(find_expn(abs(beta_raw)), 10);
Q_alpha = find_proper_scale(find_expn(abs(alpha_raw)), 10); Q_alpha = find_proper_scale(find_expn(abs(alpha_raw)), 10);
beta_raw = beta_raw / (1 << Q_beta); beta_raw = beta_raw / (1 << Q_beta);
......
...@@ -370,7 +370,7 @@ void ath_beacon_tasklet(unsigned long data) ...@@ -370,7 +370,7 @@ void ath_beacon_tasklet(unsigned long data)
ath_print(common, ATH_DBG_BSTUCK, ath_print(common, ATH_DBG_BSTUCK,
"beacon is officially stuck\n"); "beacon is officially stuck\n");
sc->sc_flags |= SC_OP_TSF_RESET; sc->sc_flags |= SC_OP_TSF_RESET;
ath_reset(sc, false); ath_reset(sc, true);
} }
return; return;
......
...@@ -577,6 +577,7 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid, ...@@ -577,6 +577,7 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid,
common->hw = sc->hw; common->hw = sc->hw;
common->priv = sc; common->priv = sc;
common->debug_mask = ath9k_debug; common->debug_mask = ath9k_debug;
spin_lock_init(&common->cc_lock);
spin_lock_init(&sc->wiphy_lock); spin_lock_init(&sc->wiphy_lock);
spin_lock_init(&sc->sc_resetlock); spin_lock_init(&sc->sc_resetlock);
......
...@@ -182,6 +182,9 @@ static void ath_update_survey_stats(struct ath_softc *sc) ...@@ -182,6 +182,9 @@ static void ath_update_survey_stats(struct ath_softc *sc)
struct ath_cycle_counters *cc = &common->cc_survey; struct ath_cycle_counters *cc = &common->cc_survey;
unsigned int div = common->clockrate * 1000; unsigned int div = common->clockrate * 1000;
if (!ah->curchan)
return;
if (ah->power_mode == ATH9K_PM_AWAKE) if (ah->power_mode == ATH9K_PM_AWAKE)
ath_hw_cycle_counters_update(common); ath_hw_cycle_counters_update(common);
...@@ -577,7 +580,7 @@ void ath_hw_check(struct work_struct *work) ...@@ -577,7 +580,7 @@ void ath_hw_check(struct work_struct *work)
msleep(1); msleep(1);
} }
ath_reset(sc, false); ath_reset(sc, true);
out: out:
ath9k_ps_restore(sc); ath9k_ps_restore(sc);
...@@ -595,7 +598,7 @@ void ath9k_tasklet(unsigned long data) ...@@ -595,7 +598,7 @@ void ath9k_tasklet(unsigned long data)
ath9k_ps_wakeup(sc); ath9k_ps_wakeup(sc);
if (status & ATH9K_INT_FATAL) { if (status & ATH9K_INT_FATAL) {
ath_reset(sc, false); ath_reset(sc, true);
ath9k_ps_restore(sc); ath9k_ps_restore(sc);
return; return;
} }
......
...@@ -673,6 +673,7 @@ static enum ATH_AGGR_STATUS ath_tx_form_aggr(struct ath_softc *sc, ...@@ -673,6 +673,7 @@ static enum ATH_AGGR_STATUS ath_tx_form_aggr(struct ath_softc *sc,
u16 aggr_limit = 0, al = 0, bpad = 0, u16 aggr_limit = 0, al = 0, bpad = 0,
al_delta, h_baw = tid->baw_size / 2; al_delta, h_baw = tid->baw_size / 2;
enum ATH_AGGR_STATUS status = ATH_AGGR_DONE; enum ATH_AGGR_STATUS status = ATH_AGGR_DONE;
struct ieee80211_tx_info *tx_info;
bf_first = list_first_entry(&tid->buf_q, struct ath_buf, list); bf_first = list_first_entry(&tid->buf_q, struct ath_buf, list);
...@@ -699,6 +700,11 @@ static enum ATH_AGGR_STATUS ath_tx_form_aggr(struct ath_softc *sc, ...@@ -699,6 +700,11 @@ static enum ATH_AGGR_STATUS ath_tx_form_aggr(struct ath_softc *sc,
break; break;
} }
tx_info = IEEE80211_SKB_CB(bf->bf_mpdu);
if (nframes && ((tx_info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE) ||
!(tx_info->control.rates[0].flags & IEEE80211_TX_RC_MCS)))
break;
/* do not exceed subframe limit */ /* do not exceed subframe limit */
if (nframes >= min((int)h_baw, ATH_AMPDU_SUBFRAME_DEFAULT)) { if (nframes >= min((int)h_baw, ATH_AMPDU_SUBFRAME_DEFAULT)) {
status = ATH_AGGR_LIMITED; status = ATH_AGGR_LIMITED;
...@@ -2157,7 +2163,7 @@ static void ath_tx_complete_poll_work(struct work_struct *work) ...@@ -2157,7 +2163,7 @@ static void ath_tx_complete_poll_work(struct work_struct *work)
ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_RESET, ath_print(ath9k_hw_common(sc->sc_ah), ATH_DBG_RESET,
"tx hung, resetting the chip\n"); "tx hung, resetting the chip\n");
ath9k_ps_wakeup(sc); ath9k_ps_wakeup(sc);
ath_reset(sc, false); ath_reset(sc, true);
ath9k_ps_restore(sc); ath9k_ps_restore(sc);
} }
......
...@@ -116,8 +116,9 @@ __regwrite_out : \ ...@@ -116,8 +116,9 @@ __regwrite_out : \
} while (0); } while (0);
#define carl9170_async_get_buf() \ #define carl9170_async_regwrite_get_buf() \
do { \ do { \
__nreg = 0; \
__cmd = carl9170_cmd_buf(__carl, CARL9170_CMD_WREG_ASYNC, \ __cmd = carl9170_cmd_buf(__carl, CARL9170_CMD_WREG_ASYNC, \
CARL9170_MAX_CMD_PAYLOAD_LEN); \ CARL9170_MAX_CMD_PAYLOAD_LEN); \
if (__cmd == NULL) { \ if (__cmd == NULL) { \
...@@ -128,38 +129,42 @@ do { \ ...@@ -128,38 +129,42 @@ do { \
#define carl9170_async_regwrite_begin(carl) \ #define carl9170_async_regwrite_begin(carl) \
do { \ do { \
int __nreg = 0, __err = 0; \
struct ar9170 *__carl = carl; \ struct ar9170 *__carl = carl; \
struct carl9170_cmd *__cmd; \ struct carl9170_cmd *__cmd; \
carl9170_async_get_buf(); \ unsigned int __nreg; \
int __err = 0; \
carl9170_async_regwrite_get_buf(); \
#define carl9170_async_regwrite_flush() \
do { \
if (__cmd == NULL || __nreg == 0) \
break; \
\
if (IS_ACCEPTING_CMD(__carl) && __nreg) { \
__cmd->hdr.len = 8 * __nreg; \
__err = __carl9170_exec_cmd(__carl, __cmd, true); \
__cmd = NULL; \
break; \
} \
goto __async_regwrite_out; \
} while (0)
#define carl9170_async_regwrite(r, v) do { \ #define carl9170_async_regwrite(r, v) do { \
if (__cmd == NULL) \
carl9170_async_regwrite_get_buf(); \
__cmd->wreg.regs[__nreg].addr = cpu_to_le32(r); \ __cmd->wreg.regs[__nreg].addr = cpu_to_le32(r); \
__cmd->wreg.regs[__nreg].val = cpu_to_le32(v); \ __cmd->wreg.regs[__nreg].val = cpu_to_le32(v); \
__nreg++; \ __nreg++; \
if ((__nreg >= PAYLOAD_MAX/2)) { \ if ((__nreg >= PAYLOAD_MAX / 2)) \
if (IS_ACCEPTING_CMD(__carl)) { \ carl9170_async_regwrite_flush(); \
__cmd->hdr.len = 8 * __nreg; \
__err = __carl9170_exec_cmd(__carl, __cmd, true);\
__cmd = NULL; \
carl9170_async_get_buf(); \
} else { \
goto __async_regwrite_out; \
} \
__nreg = 0; \
if (__err) \
goto __async_regwrite_out; \
} \
} while (0) } while (0)
#define carl9170_async_regwrite_finish() \ #define carl9170_async_regwrite_finish() do { \
__async_regwrite_out : \ __async_regwrite_out : \
if (__err == 0 && __nreg) { \ if (__cmd != NULL && __err == 0) \
__cmd->hdr.len = 8 * __nreg; \ carl9170_async_regwrite_flush(); \
if (IS_ACCEPTING_CMD(__carl)) \ kfree(__cmd); \
__err = __carl9170_exec_cmd(__carl, __cmd, true);\ } while (0) \
__nreg = 0; \
}
#define carl9170_async_regwrite_result() \ #define carl9170_async_regwrite_result() \
__err; \ __err; \
......
...@@ -639,8 +639,8 @@ static int carl9170_op_add_interface(struct ieee80211_hw *hw, ...@@ -639,8 +639,8 @@ static int carl9170_op_add_interface(struct ieee80211_hw *hw,
if (err) if (err)
goto unlock; goto unlock;
} else { } else {
err = carl9170_mod_virtual_mac(ar, vif_id, vif->addr);
rcu_read_unlock(); rcu_read_unlock();
err = carl9170_mod_virtual_mac(ar, vif_id, vif->addr);
if (err) if (err)
goto unlock; goto unlock;
......
...@@ -591,16 +591,23 @@ int __carl9170_exec_cmd(struct ar9170 *ar, struct carl9170_cmd *cmd, ...@@ -591,16 +591,23 @@ int __carl9170_exec_cmd(struct ar9170 *ar, struct carl9170_cmd *cmd,
const bool free_buf) const bool free_buf)
{ {
struct urb *urb; struct urb *urb;
int err = 0;
if (!IS_INITIALIZED(ar)) if (!IS_INITIALIZED(ar)) {
return -EPERM; err = -EPERM;
goto err_free;
}
if (WARN_ON(cmd->hdr.len > CARL9170_MAX_CMD_LEN - 4)) if (WARN_ON(cmd->hdr.len > CARL9170_MAX_CMD_LEN - 4)) {
return -EINVAL; err = -EINVAL;
goto err_free;
}
urb = usb_alloc_urb(0, GFP_ATOMIC); urb = usb_alloc_urb(0, GFP_ATOMIC);
if (!urb) if (!urb) {
return -ENOMEM; err = -ENOMEM;
goto err_free;
}
usb_fill_int_urb(urb, ar->udev, usb_sndintpipe(ar->udev, usb_fill_int_urb(urb, ar->udev, usb_sndintpipe(ar->udev,
AR9170_USB_EP_CMD), cmd, cmd->hdr.len + 4, AR9170_USB_EP_CMD), cmd, cmd->hdr.len + 4,
...@@ -613,6 +620,12 @@ int __carl9170_exec_cmd(struct ar9170 *ar, struct carl9170_cmd *cmd, ...@@ -613,6 +620,12 @@ int __carl9170_exec_cmd(struct ar9170 *ar, struct carl9170_cmd *cmd,
usb_free_urb(urb); usb_free_urb(urb);
return carl9170_usb_submit_cmd_urb(ar); return carl9170_usb_submit_cmd_urb(ar);
err_free:
if (free_buf)
kfree(cmd);
return err;
} }
int carl9170_exec_cmd(struct ar9170 *ar, const enum carl9170_cmd_oids cmd, int carl9170_exec_cmd(struct ar9170 *ar, const enum carl9170_cmd_oids cmd,
......
...@@ -2964,7 +2964,7 @@ static int b43_nphy_rev2_cal_rx_iq(struct b43_wldev *dev, ...@@ -2964,7 +2964,7 @@ static int b43_nphy_rev2_cal_rx_iq(struct b43_wldev *dev,
(2 - i)); (2 - i));
} }
for (j = 0; i < 4; j++) { for (j = 0; j < 4; j++) {
if (j < 3) { if (j < 3) {
cur_lna = lna[j]; cur_lna = lna[j];
cur_hpf1 = hpf1[j]; cur_hpf1 = hpf1[j];
......
...@@ -1227,7 +1227,8 @@ static int iwlagn_tx_status_reply_compressed_ba(struct iwl_priv *priv, ...@@ -1227,7 +1227,8 @@ static int iwlagn_tx_status_reply_compressed_ba(struct iwl_priv *priv,
struct ieee80211_tx_info *info; struct ieee80211_tx_info *info;
if (unlikely(!agg->wait_for_ba)) { if (unlikely(!agg->wait_for_ba)) {
IWL_ERR(priv, "Received BA when not expected\n"); if (unlikely(ba_resp->bitmap))
IWL_ERR(priv, "Received BA when not expected\n");
return -EINVAL; return -EINVAL;
} }
......
wl1251-objs = main.o event.o tx.o rx.o ps.o cmd.o \ wl1251-objs = main.o event.o tx.o rx.o ps.o cmd.o \
acx.o boot.o init.o debugfs.o io.o acx.o boot.o init.o debugfs.o io.o
wl1251_spi-objs += spi.o
wl1251_sdio-objs += sdio.o
obj-$(CONFIG_WL1251) += wl1251.o obj-$(CONFIG_WL1251) += wl1251.o
obj-$(CONFIG_WL1251_SPI) += spi.o obj-$(CONFIG_WL1251_SPI) += wl1251_spi.o
obj-$(CONFIG_WL1251_SDIO) += sdio.o obj-$(CONFIG_WL1251_SDIO) += wl1251_sdio.o
...@@ -456,6 +456,7 @@ struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, ...@@ -456,6 +456,7 @@ struct sta_info *ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata,
if (!sta) if (!sta)
return NULL; return NULL;
sta->last_rx = jiffies;
set_sta_flags(sta, WLAN_STA_AUTHORIZED); set_sta_flags(sta, WLAN_STA_AUTHORIZED);
/* make sure mandatory rates are always added */ /* make sure mandatory rates are always added */
......
...@@ -748,7 +748,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw) ...@@ -748,7 +748,7 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
hw->queues = IEEE80211_MAX_QUEUES; hw->queues = IEEE80211_MAX_QUEUES;
local->workqueue = local->workqueue =
create_singlethread_workqueue(wiphy_name(local->hw.wiphy)); alloc_ordered_workqueue(wiphy_name(local->hw.wiphy), 0);
if (!local->workqueue) { if (!local->workqueue) {
result = -ENOMEM; result = -ENOMEM;
goto fail_workqueue; goto fail_workqueue;
...@@ -962,12 +962,6 @@ static void __exit ieee80211_exit(void) ...@@ -962,12 +962,6 @@ static void __exit ieee80211_exit(void)
rc80211_minstrel_ht_exit(); rc80211_minstrel_ht_exit();
rc80211_minstrel_exit(); rc80211_minstrel_exit();
/*
* For key todo, it'll be empty by now but the work
* might still be scheduled.
*/
flush_scheduled_work();
if (mesh_allocated) if (mesh_allocated)
ieee80211s_stop(); ieee80211s_stop();
......
...@@ -329,6 +329,9 @@ void rate_control_get_rate(struct ieee80211_sub_if_data *sdata, ...@@ -329,6 +329,9 @@ void rate_control_get_rate(struct ieee80211_sub_if_data *sdata,
* if needed. * if needed.
*/ */
for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) { for (i = 0; i < IEEE80211_TX_MAX_RATES; i++) {
/* Skip invalid rates */
if (info->control.rates[i].idx < 0)
break;
/* Rate masking supports only legacy rates for now */ /* Rate masking supports only legacy rates for now */
if (info->control.rates[i].flags & IEEE80211_TX_RC_MCS) if (info->control.rates[i].flags & IEEE80211_TX_RC_MCS)
continue; continue;
......
...@@ -1167,7 +1167,7 @@ static int ignore_request(struct wiphy *wiphy, ...@@ -1167,7 +1167,7 @@ static int ignore_request(struct wiphy *wiphy,
return 0; return 0;
return -EALREADY; return -EALREADY;
} }
return REG_INTERSECT; return 0;
case NL80211_REGDOM_SET_BY_DRIVER: case NL80211_REGDOM_SET_BY_DRIVER:
if (last_request->initiator == NL80211_REGDOM_SET_BY_CORE) { if (last_request->initiator == NL80211_REGDOM_SET_BY_CORE) {
if (regdom_changes(pending_request->alpha2)) if (regdom_changes(pending_request->alpha2))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment