mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6
Conflicts: drivers/net/wireless/libertas/host.h
This commit is contained in:
commit
05318bc905
111 changed files with 3635 additions and 7662 deletions
|
|
@ -69,6 +69,7 @@ endchoice
|
|||
|
||||
config MAC80211_RC_DEFAULT
|
||||
string
|
||||
default "minstrel_ht" if MAC80211_RC_DEFAULT_MINSTREL && MAC80211_RC_MINSTREL_HT
|
||||
default "minstrel" if MAC80211_RC_DEFAULT_MINSTREL
|
||||
default "pid" if MAC80211_RC_DEFAULT_PID
|
||||
default ""
|
||||
|
|
|
|||
|
|
@ -413,9 +413,6 @@ static int ieee80211_dump_survey(struct wiphy *wiphy, struct net_device *dev,
|
|||
{
|
||||
struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
|
||||
|
||||
if (!local->ops->get_survey)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
return drv_get_survey(local, idx, survey);
|
||||
}
|
||||
|
||||
|
|
@ -1329,28 +1326,28 @@ static int ieee80211_set_wiphy_params(struct wiphy *wiphy, u32 changed)
|
|||
}
|
||||
|
||||
static int ieee80211_set_tx_power(struct wiphy *wiphy,
|
||||
enum tx_power_setting type, int dbm)
|
||||
enum nl80211_tx_power_setting type, int mbm)
|
||||
{
|
||||
struct ieee80211_local *local = wiphy_priv(wiphy);
|
||||
struct ieee80211_channel *chan = local->hw.conf.channel;
|
||||
u32 changes = 0;
|
||||
|
||||
switch (type) {
|
||||
case TX_POWER_AUTOMATIC:
|
||||
case NL80211_TX_POWER_AUTOMATIC:
|
||||
local->user_power_level = -1;
|
||||
break;
|
||||
case TX_POWER_LIMITED:
|
||||
if (dbm < 0)
|
||||
return -EINVAL;
|
||||
local->user_power_level = dbm;
|
||||
case NL80211_TX_POWER_LIMITED:
|
||||
if (mbm < 0 || (mbm % 100))
|
||||
return -EOPNOTSUPP;
|
||||
local->user_power_level = MBM_TO_DBM(mbm);
|
||||
break;
|
||||
case TX_POWER_FIXED:
|
||||
if (dbm < 0)
|
||||
return -EINVAL;
|
||||
case NL80211_TX_POWER_FIXED:
|
||||
if (mbm < 0 || (mbm % 100))
|
||||
return -EOPNOTSUPP;
|
||||
/* TODO: move to cfg80211 when it knows the channel */
|
||||
if (dbm > chan->max_power)
|
||||
if (MBM_TO_DBM(mbm) > chan->max_power)
|
||||
return -EINVAL;
|
||||
local->user_power_level = dbm;
|
||||
local->user_power_level = MBM_TO_DBM(mbm);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -375,9 +375,14 @@ static inline int drv_get_survey(struct ieee80211_local *local, int idx,
|
|||
struct survey_info *survey)
|
||||
{
|
||||
int ret = -EOPNOTSUPP;
|
||||
|
||||
trace_drv_get_survey(local, idx, survey);
|
||||
|
||||
if (local->ops->get_survey)
|
||||
ret = local->ops->get_survey(&local->hw, idx, survey);
|
||||
/* trace_drv_get_survey(local, idx, survey, ret); */
|
||||
|
||||
trace_drv_return_int(local, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -761,6 +761,28 @@ TRACE_EVENT(drv_ampdu_action,
|
|||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(drv_get_survey,
|
||||
TP_PROTO(struct ieee80211_local *local, int idx,
|
||||
struct survey_info *survey),
|
||||
|
||||
TP_ARGS(local, idx, survey),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
LOCAL_ENTRY
|
||||
__field(int, idx)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
LOCAL_ASSIGN;
|
||||
__entry->idx = idx;
|
||||
),
|
||||
|
||||
TP_printk(
|
||||
LOCAL_PR_FMT " idx:%d",
|
||||
LOCAL_PR_ARG, __entry->idx
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(drv_flush,
|
||||
TP_PROTO(struct ieee80211_local *local, bool drop),
|
||||
|
||||
|
|
|
|||
|
|
@ -855,6 +855,8 @@ struct ieee80211_local {
|
|||
* this will override whatever chosen by mac80211 internally.
|
||||
*/
|
||||
int dynamic_ps_forced_timeout;
|
||||
int dynamic_ps_user_timeout;
|
||||
bool disable_dynamic_ps;
|
||||
|
||||
int user_power_level; /* in dBm */
|
||||
int power_constr_level; /* in dBm */
|
||||
|
|
|
|||
|
|
@ -65,7 +65,6 @@ void mesh_plink_inc_estab_count(struct ieee80211_sub_if_data *sdata)
|
|||
{
|
||||
atomic_inc(&sdata->u.mesh.mshstats.estab_plinks);
|
||||
mesh_accept_plinks_update(sdata);
|
||||
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON);
|
||||
}
|
||||
|
||||
static inline
|
||||
|
|
@ -73,7 +72,6 @@ void mesh_plink_dec_estab_count(struct ieee80211_sub_if_data *sdata)
|
|||
{
|
||||
atomic_dec(&sdata->u.mesh.mshstats.estab_plinks);
|
||||
mesh_accept_plinks_update(sdata);
|
||||
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -115,7 +113,7 @@ static struct sta_info *mesh_plink_alloc(struct ieee80211_sub_if_data *sdata,
|
|||
}
|
||||
|
||||
/**
|
||||
* mesh_plink_deactivate - deactivate mesh peer link
|
||||
* __mesh_plink_deactivate - deactivate mesh peer link
|
||||
*
|
||||
* @sta: mesh peer link to deactivate
|
||||
*
|
||||
|
|
@ -123,18 +121,23 @@ static struct sta_info *mesh_plink_alloc(struct ieee80211_sub_if_data *sdata,
|
|||
*
|
||||
* Locking: the caller must hold sta->lock
|
||||
*/
|
||||
static void __mesh_plink_deactivate(struct sta_info *sta)
|
||||
static bool __mesh_plink_deactivate(struct sta_info *sta)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = sta->sdata;
|
||||
bool deactivated = false;
|
||||
|
||||
if (sta->plink_state == PLINK_ESTAB)
|
||||
if (sta->plink_state == PLINK_ESTAB) {
|
||||
mesh_plink_dec_estab_count(sdata);
|
||||
deactivated = true;
|
||||
}
|
||||
sta->plink_state = PLINK_BLOCKED;
|
||||
mesh_path_flush_by_nexthop(sta);
|
||||
|
||||
return deactivated;
|
||||
}
|
||||
|
||||
/**
|
||||
* __mesh_plink_deactivate - deactivate mesh peer link
|
||||
* mesh_plink_deactivate - deactivate mesh peer link
|
||||
*
|
||||
* @sta: mesh peer link to deactivate
|
||||
*
|
||||
|
|
@ -142,9 +145,15 @@ static void __mesh_plink_deactivate(struct sta_info *sta)
|
|||
*/
|
||||
void mesh_plink_deactivate(struct sta_info *sta)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = sta->sdata;
|
||||
bool deactivated;
|
||||
|
||||
spin_lock_bh(&sta->lock);
|
||||
__mesh_plink_deactivate(sta);
|
||||
deactivated = __mesh_plink_deactivate(sta);
|
||||
spin_unlock_bh(&sta->lock);
|
||||
|
||||
if (deactivated)
|
||||
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON);
|
||||
}
|
||||
|
||||
static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata,
|
||||
|
|
@ -381,10 +390,16 @@ int mesh_plink_open(struct sta_info *sta)
|
|||
|
||||
void mesh_plink_block(struct sta_info *sta)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = sta->sdata;
|
||||
bool deactivated;
|
||||
|
||||
spin_lock_bh(&sta->lock);
|
||||
__mesh_plink_deactivate(sta);
|
||||
deactivated = __mesh_plink_deactivate(sta);
|
||||
sta->plink_state = PLINK_BLOCKED;
|
||||
spin_unlock_bh(&sta->lock);
|
||||
|
||||
if (deactivated)
|
||||
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -397,6 +412,7 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
|
|||
enum plink_event event;
|
||||
enum plink_frame_type ftype;
|
||||
size_t baselen;
|
||||
bool deactivated;
|
||||
u8 ie_len;
|
||||
u8 *baseaddr;
|
||||
__le16 plid, llid, reason;
|
||||
|
|
@ -651,8 +667,9 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
|
|||
case CNF_ACPT:
|
||||
del_timer(&sta->plink_timer);
|
||||
sta->plink_state = PLINK_ESTAB;
|
||||
mesh_plink_inc_estab_count(sdata);
|
||||
spin_unlock_bh(&sta->lock);
|
||||
mesh_plink_inc_estab_count(sdata);
|
||||
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON);
|
||||
mpl_dbg("Mesh plink with %pM ESTABLISHED\n",
|
||||
sta->sta.addr);
|
||||
break;
|
||||
|
|
@ -684,8 +701,9 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
|
|||
case OPN_ACPT:
|
||||
del_timer(&sta->plink_timer);
|
||||
sta->plink_state = PLINK_ESTAB;
|
||||
mesh_plink_inc_estab_count(sdata);
|
||||
spin_unlock_bh(&sta->lock);
|
||||
mesh_plink_inc_estab_count(sdata);
|
||||
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON);
|
||||
mpl_dbg("Mesh plink with %pM ESTABLISHED\n",
|
||||
sta->sta.addr);
|
||||
mesh_plink_frame_tx(sdata, PLINK_CONFIRM, sta->sta.addr, llid,
|
||||
|
|
@ -702,11 +720,13 @@ void mesh_rx_plink_frame(struct ieee80211_sub_if_data *sdata, struct ieee80211_m
|
|||
case CLS_ACPT:
|
||||
reason = cpu_to_le16(MESH_CLOSE_RCVD);
|
||||
sta->reason = reason;
|
||||
__mesh_plink_deactivate(sta);
|
||||
deactivated = __mesh_plink_deactivate(sta);
|
||||
sta->plink_state = PLINK_HOLDING;
|
||||
llid = sta->llid;
|
||||
mod_plink_timer(sta, dot11MeshHoldingTimeout(sdata));
|
||||
spin_unlock_bh(&sta->lock);
|
||||
if (deactivated)
|
||||
ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON);
|
||||
mesh_plink_frame_tx(sdata, PLINK_CLOSE, sta->sta.addr, llid,
|
||||
plid, reason);
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -478,6 +478,39 @@ static void ieee80211_handle_pwr_constr(struct ieee80211_sub_if_data *sdata,
|
|||
}
|
||||
}
|
||||
|
||||
void ieee80211_enable_dyn_ps(struct ieee80211_vif *vif)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct ieee80211_conf *conf = &local->hw.conf;
|
||||
|
||||
WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION ||
|
||||
!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS) ||
|
||||
(local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS));
|
||||
|
||||
local->disable_dynamic_ps = false;
|
||||
conf->dynamic_ps_timeout = local->dynamic_ps_user_timeout;
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_enable_dyn_ps);
|
||||
|
||||
void ieee80211_disable_dyn_ps(struct ieee80211_vif *vif)
|
||||
{
|
||||
struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct ieee80211_conf *conf = &local->hw.conf;
|
||||
|
||||
WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION ||
|
||||
!(local->hw.flags & IEEE80211_HW_SUPPORTS_PS) ||
|
||||
(local->hw.flags & IEEE80211_HW_SUPPORTS_DYNAMIC_PS));
|
||||
|
||||
local->disable_dynamic_ps = true;
|
||||
conf->dynamic_ps_timeout = 0;
|
||||
del_timer_sync(&local->dynamic_ps_timer);
|
||||
ieee80211_queue_work(&local->hw,
|
||||
&local->dynamic_ps_enable_work);
|
||||
}
|
||||
EXPORT_SYMBOL(ieee80211_disable_dyn_ps);
|
||||
|
||||
/* powersave */
|
||||
static void ieee80211_enable_ps(struct ieee80211_local *local,
|
||||
struct ieee80211_sub_if_data *sdata)
|
||||
|
|
@ -553,6 +586,7 @@ void ieee80211_recalc_ps(struct ieee80211_local *local, s32 latency)
|
|||
found->u.mgd.associated->beacon_ies &&
|
||||
!(found->u.mgd.flags & (IEEE80211_STA_BEACON_POLL |
|
||||
IEEE80211_STA_CONNECTION_POLL))) {
|
||||
struct ieee80211_conf *conf = &local->hw.conf;
|
||||
s32 beaconint_us;
|
||||
|
||||
if (latency < 0)
|
||||
|
|
@ -575,7 +609,10 @@ void ieee80211_recalc_ps(struct ieee80211_local *local, s32 latency)
|
|||
else
|
||||
timeout = 100;
|
||||
}
|
||||
local->hw.conf.dynamic_ps_timeout = timeout;
|
||||
local->dynamic_ps_user_timeout = timeout;
|
||||
if (!local->disable_dynamic_ps)
|
||||
conf->dynamic_ps_timeout =
|
||||
local->dynamic_ps_user_timeout;
|
||||
|
||||
if (beaconint_us > latency) {
|
||||
local->ps_sdata = NULL;
|
||||
|
|
|
|||
|
|
@ -328,7 +328,8 @@ minstrel_next_sample_idx(struct minstrel_ht_sta *mi)
|
|||
}
|
||||
|
||||
static void
|
||||
minstrel_downgrade_rate(struct minstrel_ht_sta *mi, int *idx, bool primary)
|
||||
minstrel_downgrade_rate(struct minstrel_ht_sta *mi, unsigned int *idx,
|
||||
bool primary)
|
||||
{
|
||||
int group, orig_group;
|
||||
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@ struct mcs_group {
|
|||
unsigned int duration[MCS_GROUP_RATES];
|
||||
};
|
||||
|
||||
extern const struct mcs_group minstrel_mcs_groups[];
|
||||
|
||||
struct minstrel_rate_stats {
|
||||
/* current / last sampling period attempts/success counters */
|
||||
unsigned int attempts, last_attempts;
|
||||
|
|
|
|||
|
|
@ -14,8 +14,6 @@
|
|||
#include "rc80211_minstrel.h"
|
||||
#include "rc80211_minstrel_ht.h"
|
||||
|
||||
extern const struct mcs_group minstrel_mcs_groups[];
|
||||
|
||||
static int
|
||||
minstrel_ht_stats_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -293,7 +293,7 @@ ieee80211_rx_monitor(struct ieee80211_local *local, struct sk_buff *origskb,
|
|||
skb2 = skb_clone(skb, GFP_ATOMIC);
|
||||
if (skb2) {
|
||||
skb2->dev = prev_dev;
|
||||
netif_rx(skb2);
|
||||
netif_receive_skb(skb2);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -304,7 +304,7 @@ ieee80211_rx_monitor(struct ieee80211_local *local, struct sk_buff *origskb,
|
|||
|
||||
if (prev_dev) {
|
||||
skb->dev = prev_dev;
|
||||
netif_rx(skb);
|
||||
netif_receive_skb(skb);
|
||||
} else
|
||||
dev_kfree_skb(skb);
|
||||
|
||||
|
|
@ -1578,7 +1578,7 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx)
|
|||
/* deliver to local stack */
|
||||
skb->protocol = eth_type_trans(skb, dev);
|
||||
memset(skb->cb, 0, sizeof(skb->cb));
|
||||
netif_rx(skb);
|
||||
netif_receive_skb(skb);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2056,11 +2056,11 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx)
|
|||
nskb = skb_copy_expand(rx->skb, local->hw.extra_tx_headroom, 0,
|
||||
GFP_ATOMIC);
|
||||
if (nskb) {
|
||||
struct ieee80211_mgmt *mgmt = (void *)nskb->data;
|
||||
struct ieee80211_mgmt *nmgmt = (void *)nskb->data;
|
||||
|
||||
mgmt->u.action.category |= 0x80;
|
||||
memcpy(mgmt->da, mgmt->sa, ETH_ALEN);
|
||||
memcpy(mgmt->sa, rx->sdata->vif.addr, ETH_ALEN);
|
||||
nmgmt->u.action.category |= 0x80;
|
||||
memcpy(nmgmt->da, nmgmt->sa, ETH_ALEN);
|
||||
memcpy(nmgmt->sa, rx->sdata->vif.addr, ETH_ALEN);
|
||||
|
||||
memset(nskb->cb, 0, sizeof(nskb->cb));
|
||||
|
||||
|
|
@ -2244,7 +2244,7 @@ static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx,
|
|||
skb2 = skb_clone(skb, GFP_ATOMIC);
|
||||
if (skb2) {
|
||||
skb2->dev = prev_dev;
|
||||
netif_rx(skb2);
|
||||
netif_receive_skb(skb2);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2255,7 +2255,7 @@ static void ieee80211_rx_cooked_monitor(struct ieee80211_rx_data *rx,
|
|||
|
||||
if (prev_dev) {
|
||||
skb->dev = prev_dev;
|
||||
netif_rx(skb);
|
||||
netif_receive_skb(skb);
|
||||
skb = NULL;
|
||||
} else
|
||||
goto out_free_skb;
|
||||
|
|
|
|||
|
|
@ -286,6 +286,8 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)
|
|||
local->scanning = 0;
|
||||
local->scan_channel = NULL;
|
||||
|
||||
drv_sw_scan_complete(local);
|
||||
|
||||
/* we only have to protect scan_req and hw/sw scan */
|
||||
mutex_unlock(&local->scan_mtx);
|
||||
|
||||
|
|
@ -295,8 +297,6 @@ void ieee80211_scan_completed(struct ieee80211_hw *hw, bool aborted)
|
|||
|
||||
ieee80211_configure_filter(local);
|
||||
|
||||
drv_sw_scan_complete(local);
|
||||
|
||||
ieee80211_offchannel_return(local, true);
|
||||
|
||||
done:
|
||||
|
|
@ -734,7 +734,7 @@ int ieee80211_request_internal_scan(struct ieee80211_sub_if_data *sdata,
|
|||
{
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
int ret = -EBUSY;
|
||||
enum nl80211_band band;
|
||||
enum ieee80211_band band;
|
||||
|
||||
mutex_lock(&local->scan_mtx);
|
||||
|
||||
|
|
|
|||
|
|
@ -427,20 +427,20 @@ void for_each_sta_info_type_check(struct ieee80211_local *local,
|
|||
{
|
||||
}
|
||||
|
||||
#define for_each_sta_info(local, _addr, sta, nxt) \
|
||||
#define for_each_sta_info(local, _addr, _sta, nxt) \
|
||||
for ( /* initialise loop */ \
|
||||
sta = rcu_dereference(local->sta_hash[STA_HASH(_addr)]),\
|
||||
nxt = sta ? rcu_dereference(sta->hnext) : NULL; \
|
||||
_sta = rcu_dereference(local->sta_hash[STA_HASH(_addr)]),\
|
||||
nxt = _sta ? rcu_dereference(_sta->hnext) : NULL; \
|
||||
/* typecheck */ \
|
||||
for_each_sta_info_type_check(local, (_addr), sta, nxt), \
|
||||
for_each_sta_info_type_check(local, (_addr), _sta, nxt),\
|
||||
/* continue condition */ \
|
||||
sta; \
|
||||
_sta; \
|
||||
/* advance loop */ \
|
||||
sta = nxt, \
|
||||
nxt = sta ? rcu_dereference(sta->hnext) : NULL \
|
||||
_sta = nxt, \
|
||||
nxt = _sta ? rcu_dereference(_sta->hnext) : NULL \
|
||||
) \
|
||||
/* compare address and run code only if it matches */ \
|
||||
if (memcmp(sta->sta.addr, (_addr), ETH_ALEN) == 0)
|
||||
if (memcmp(_sta->sta.addr, (_addr), ETH_ALEN) == 0)
|
||||
|
||||
/*
|
||||
* Get STA info by index, BROKEN!
|
||||
|
|
|
|||
|
|
@ -377,7 +377,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
|
|||
skb2 = skb_clone(skb, GFP_ATOMIC);
|
||||
if (skb2) {
|
||||
skb2->dev = prev_dev;
|
||||
netif_rx(skb2);
|
||||
netif_receive_skb(skb2);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -386,7 +386,7 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
|
|||
}
|
||||
if (prev_dev) {
|
||||
skb->dev = prev_dev;
|
||||
netif_rx(skb);
|
||||
netif_receive_skb(skb);
|
||||
skb = NULL;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
|
|
|||
Loading…
Reference in a new issue