Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless into for-davem
This commit is contained in:
commit
81ca2ff945
|
@ -448,6 +448,7 @@ static void ath9k_htc_tx_process(struct ath9k_htc_priv *priv,
|
||||||
struct ieee80211_conf *cur_conf = &priv->hw->conf;
|
struct ieee80211_conf *cur_conf = &priv->hw->conf;
|
||||||
bool txok;
|
bool txok;
|
||||||
int slot;
|
int slot;
|
||||||
|
int hdrlen, padsize;
|
||||||
|
|
||||||
slot = strip_drv_header(priv, skb);
|
slot = strip_drv_header(priv, skb);
|
||||||
if (slot < 0) {
|
if (slot < 0) {
|
||||||
|
@ -504,6 +505,15 @@ send_mac80211:
|
||||||
|
|
||||||
ath9k_htc_tx_clear_slot(priv, slot);
|
ath9k_htc_tx_clear_slot(priv, slot);
|
||||||
|
|
||||||
|
/* Remove padding before handing frame back to mac80211 */
|
||||||
|
hdrlen = ieee80211_get_hdrlen_from_skb(skb);
|
||||||
|
|
||||||
|
padsize = hdrlen & 3;
|
||||||
|
if (padsize && skb->len > hdrlen + padsize) {
|
||||||
|
memmove(skb->data + padsize, skb->data, hdrlen);
|
||||||
|
skb_pull(skb, padsize);
|
||||||
|
}
|
||||||
|
|
||||||
/* Send status to mac80211 */
|
/* Send status to mac80211 */
|
||||||
ieee80211_tx_status(priv->hw, skb);
|
ieee80211_tx_status(priv->hw, skb);
|
||||||
}
|
}
|
||||||
|
|
|
@ -802,7 +802,8 @@ void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
|
||||||
IEEE80211_HW_PS_NULLFUNC_STACK |
|
IEEE80211_HW_PS_NULLFUNC_STACK |
|
||||||
IEEE80211_HW_SPECTRUM_MGMT |
|
IEEE80211_HW_SPECTRUM_MGMT |
|
||||||
IEEE80211_HW_REPORTS_TX_ACK_STATUS |
|
IEEE80211_HW_REPORTS_TX_ACK_STATUS |
|
||||||
IEEE80211_HW_SUPPORTS_RC_TABLE;
|
IEEE80211_HW_SUPPORTS_RC_TABLE |
|
||||||
|
IEEE80211_HW_SUPPORTS_HT_CCK_RATES;
|
||||||
|
|
||||||
if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) {
|
if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) {
|
||||||
hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
|
hw->flags |= IEEE80211_HW_AMPDU_AGGREGATION;
|
||||||
|
|
|
@ -173,8 +173,7 @@ static void ath_restart_work(struct ath_softc *sc)
|
||||||
{
|
{
|
||||||
ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0);
|
ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0);
|
||||||
|
|
||||||
if (AR_SREV_9340(sc->sc_ah) || AR_SREV_9485(sc->sc_ah) ||
|
if (AR_SREV_9340(sc->sc_ah) || AR_SREV_9330(sc->sc_ah))
|
||||||
AR_SREV_9550(sc->sc_ah))
|
|
||||||
ieee80211_queue_delayed_work(sc->hw, &sc->hw_pll_work,
|
ieee80211_queue_delayed_work(sc->hw, &sc->hw_pll_work,
|
||||||
msecs_to_jiffies(ATH_PLL_WORK_INTERVAL));
|
msecs_to_jiffies(ATH_PLL_WORK_INTERVAL));
|
||||||
|
|
||||||
|
|
|
@ -1860,7 +1860,8 @@ void *carl9170_alloc(size_t priv_size)
|
||||||
IEEE80211_HW_PS_NULLFUNC_STACK |
|
IEEE80211_HW_PS_NULLFUNC_STACK |
|
||||||
IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC |
|
IEEE80211_HW_NEED_DTIM_BEFORE_ASSOC |
|
||||||
IEEE80211_HW_SUPPORTS_RC_TABLE |
|
IEEE80211_HW_SUPPORTS_RC_TABLE |
|
||||||
IEEE80211_HW_SIGNAL_DBM;
|
IEEE80211_HW_SIGNAL_DBM |
|
||||||
|
IEEE80211_HW_SUPPORTS_HT_CCK_RATES;
|
||||||
|
|
||||||
if (!modparam_noht) {
|
if (!modparam_noht) {
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -4464,9 +4464,9 @@ il4965_irq_tasklet(struct il_priv *il)
|
||||||
set_bit(S_RFKILL, &il->status);
|
set_bit(S_RFKILL, &il->status);
|
||||||
} else {
|
} else {
|
||||||
clear_bit(S_RFKILL, &il->status);
|
clear_bit(S_RFKILL, &il->status);
|
||||||
wiphy_rfkill_set_hw_state(il->hw->wiphy, hw_rf_kill);
|
|
||||||
il_force_reset(il, true);
|
il_force_reset(il, true);
|
||||||
}
|
}
|
||||||
|
wiphy_rfkill_set_hw_state(il->hw->wiphy, hw_rf_kill);
|
||||||
|
|
||||||
handled |= CSR_INT_BIT_RF_KILL;
|
handled |= CSR_INT_BIT_RF_KILL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6133,7 +6133,8 @@ static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
|
||||||
IEEE80211_HW_SUPPORTS_PS |
|
IEEE80211_HW_SUPPORTS_PS |
|
||||||
IEEE80211_HW_PS_NULLFUNC_STACK |
|
IEEE80211_HW_PS_NULLFUNC_STACK |
|
||||||
IEEE80211_HW_AMPDU_AGGREGATION |
|
IEEE80211_HW_AMPDU_AGGREGATION |
|
||||||
IEEE80211_HW_REPORTS_TX_ACK_STATUS;
|
IEEE80211_HW_REPORTS_TX_ACK_STATUS |
|
||||||
|
IEEE80211_HW_SUPPORTS_HT_CCK_RATES;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Don't set IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING for USB devices
|
* Don't set IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING for USB devices
|
||||||
|
|
|
@ -1499,6 +1499,7 @@ enum ieee80211_hw_flags {
|
||||||
IEEE80211_HW_SUPPORTS_RC_TABLE = 1<<24,
|
IEEE80211_HW_SUPPORTS_RC_TABLE = 1<<24,
|
||||||
IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF = 1<<25,
|
IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF = 1<<25,
|
||||||
IEEE80211_HW_TIMING_BEACON_ONLY = 1<<26,
|
IEEE80211_HW_TIMING_BEACON_ONLY = 1<<26,
|
||||||
|
IEEE80211_HW_SUPPORTS_HT_CCK_RATES = 1<<27,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
|
|
||||||
static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
||||||
const u8 *bssid, const int beacon_int,
|
const u8 *bssid, const int beacon_int,
|
||||||
struct ieee80211_channel *chan,
|
struct cfg80211_chan_def *req_chandef,
|
||||||
const u32 basic_rates,
|
const u32 basic_rates,
|
||||||
const u16 capability, u64 tsf,
|
const u16 capability, u64 tsf,
|
||||||
bool creator)
|
bool creator)
|
||||||
|
@ -51,6 +51,7 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
||||||
u32 bss_change;
|
u32 bss_change;
|
||||||
u8 supp_rates[IEEE80211_MAX_SUPP_RATES];
|
u8 supp_rates[IEEE80211_MAX_SUPP_RATES];
|
||||||
struct cfg80211_chan_def chandef;
|
struct cfg80211_chan_def chandef;
|
||||||
|
struct ieee80211_channel *chan;
|
||||||
struct beacon_data *presp;
|
struct beacon_data *presp;
|
||||||
int frame_len;
|
int frame_len;
|
||||||
|
|
||||||
|
@ -81,7 +82,9 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
||||||
|
|
||||||
sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0;
|
sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0;
|
||||||
|
|
||||||
chandef = ifibss->chandef;
|
/* make a copy of the chandef, it could be modified below. */
|
||||||
|
chandef = *req_chandef;
|
||||||
|
chan = chandef.chan;
|
||||||
if (!cfg80211_reg_can_beacon(local->hw.wiphy, &chandef)) {
|
if (!cfg80211_reg_can_beacon(local->hw.wiphy, &chandef)) {
|
||||||
chandef.width = NL80211_CHAN_WIDTH_20;
|
chandef.width = NL80211_CHAN_WIDTH_20;
|
||||||
chandef.center_freq1 = chan->center_freq;
|
chandef.center_freq1 = chan->center_freq;
|
||||||
|
@ -259,10 +262,12 @@ static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
||||||
struct cfg80211_bss *cbss =
|
struct cfg80211_bss *cbss =
|
||||||
container_of((void *)bss, struct cfg80211_bss, priv);
|
container_of((void *)bss, struct cfg80211_bss, priv);
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
|
struct cfg80211_chan_def chandef;
|
||||||
u32 basic_rates;
|
u32 basic_rates;
|
||||||
int i, j;
|
int i, j;
|
||||||
u16 beacon_int = cbss->beacon_interval;
|
u16 beacon_int = cbss->beacon_interval;
|
||||||
const struct cfg80211_bss_ies *ies;
|
const struct cfg80211_bss_ies *ies;
|
||||||
|
enum nl80211_channel_type chan_type;
|
||||||
u64 tsf;
|
u64 tsf;
|
||||||
|
|
||||||
sdata_assert_lock(sdata);
|
sdata_assert_lock(sdata);
|
||||||
|
@ -270,6 +275,26 @@ static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
||||||
if (beacon_int < 10)
|
if (beacon_int < 10)
|
||||||
beacon_int = 10;
|
beacon_int = 10;
|
||||||
|
|
||||||
|
switch (sdata->u.ibss.chandef.width) {
|
||||||
|
case NL80211_CHAN_WIDTH_20_NOHT:
|
||||||
|
case NL80211_CHAN_WIDTH_20:
|
||||||
|
case NL80211_CHAN_WIDTH_40:
|
||||||
|
chan_type = cfg80211_get_chandef_type(&sdata->u.ibss.chandef);
|
||||||
|
cfg80211_chandef_create(&chandef, cbss->channel, chan_type);
|
||||||
|
break;
|
||||||
|
case NL80211_CHAN_WIDTH_5:
|
||||||
|
case NL80211_CHAN_WIDTH_10:
|
||||||
|
cfg80211_chandef_create(&chandef, cbss->channel,
|
||||||
|
NL80211_CHAN_WIDTH_20_NOHT);
|
||||||
|
chandef.width = sdata->u.ibss.chandef.width;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* fall back to 20 MHz for unsupported modes */
|
||||||
|
cfg80211_chandef_create(&chandef, cbss->channel,
|
||||||
|
NL80211_CHAN_WIDTH_20_NOHT);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
sband = sdata->local->hw.wiphy->bands[cbss->channel->band];
|
sband = sdata->local->hw.wiphy->bands[cbss->channel->band];
|
||||||
|
|
||||||
basic_rates = 0;
|
basic_rates = 0;
|
||||||
|
@ -294,7 +319,7 @@ static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
|
||||||
|
|
||||||
__ieee80211_sta_join_ibss(sdata, cbss->bssid,
|
__ieee80211_sta_join_ibss(sdata, cbss->bssid,
|
||||||
beacon_int,
|
beacon_int,
|
||||||
cbss->channel,
|
&chandef,
|
||||||
basic_rates,
|
basic_rates,
|
||||||
cbss->capability,
|
cbss->capability,
|
||||||
tsf, false);
|
tsf, false);
|
||||||
|
@ -736,7 +761,7 @@ static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata)
|
||||||
sdata->drop_unencrypted = 0;
|
sdata->drop_unencrypted = 0;
|
||||||
|
|
||||||
__ieee80211_sta_join_ibss(sdata, bssid, sdata->vif.bss_conf.beacon_int,
|
__ieee80211_sta_join_ibss(sdata, bssid, sdata->vif.bss_conf.beacon_int,
|
||||||
ifibss->chandef.chan, ifibss->basic_rates,
|
&ifibss->chandef, ifibss->basic_rates,
|
||||||
capability, 0, true);
|
capability, 0, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1138,6 +1163,7 @@ int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata)
|
||||||
clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state);
|
clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state);
|
||||||
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED |
|
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED |
|
||||||
BSS_CHANGED_IBSS);
|
BSS_CHANGED_IBSS);
|
||||||
|
ieee80211_vif_release_channel(sdata);
|
||||||
synchronize_rcu();
|
synchronize_rcu();
|
||||||
kfree(presp);
|
kfree(presp);
|
||||||
|
|
||||||
|
|
|
@ -828,6 +828,9 @@ minstrel_ht_update_cck(struct minstrel_priv *mp, struct minstrel_ht_sta *mi,
|
||||||
if (sband->band != IEEE80211_BAND_2GHZ)
|
if (sband->band != IEEE80211_BAND_2GHZ)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (!(mp->hw->flags & IEEE80211_HW_SUPPORTS_HT_CCK_RATES))
|
||||||
|
return;
|
||||||
|
|
||||||
mi->cck_supported = 0;
|
mi->cck_supported = 0;
|
||||||
mi->cck_supported_short = 0;
|
mi->cck_supported_short = 0;
|
||||||
for (i = 0; i < 4; i++) {
|
for (i = 0; i < 4; i++) {
|
||||||
|
|
Loading…
Reference in New Issue