forked from Minki/linux
Merge tag 'master-2014-10-08' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next
John W. Linville says: ==================== pull request: wireless-next 2014-10-09 Please pull this batch of fixes intended for the 3.18 stream! Andrea Merello makes rtl818x_pci use a more reasonable transmission rate for HW generated frames. Fabian Frederick tweaks some kernel-doc bits to avoid warnings. Larry Finger corrects a possible unaligned access in the rtlwifi code. Marek Puzyniak avoids a kernel panic in ath9k_hw_reset. Sujith Manoharan goes for the hat trick -- he fixes a smatch warning in the shared ath code, he fixes a crash in ath9k, and he corrects a sequence number assignment problem in ath9k too. For ease of merging, I pulled the last bits of the wireless tree as well... Please let me know if there are problems! ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
4511a4a50e
@ -294,7 +294,6 @@ struct ath_tx_control {
|
||||
* (axq_qnum).
|
||||
*/
|
||||
struct ath_tx {
|
||||
u16 seq_no;
|
||||
u32 txqsetup;
|
||||
spinlock_t txbuflock;
|
||||
struct list_head txbuf;
|
||||
@ -563,6 +562,7 @@ int ath_tx_init(struct ath_softc *sc, int nbufs);
|
||||
int ath_txq_update(struct ath_softc *sc, int qnum,
|
||||
struct ath9k_tx_queue_info *q);
|
||||
void ath_update_max_aggr_framelen(struct ath_softc *sc, int queue, int txop);
|
||||
void ath_assign_seq(struct ath_common *common, struct sk_buff *skb);
|
||||
int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb,
|
||||
struct ath_tx_control *txctl);
|
||||
void ath_tx_cabq(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
@ -592,6 +592,8 @@ void ath9k_release_buffered_frames(struct ieee80211_hw *hw,
|
||||
struct ath_vif {
|
||||
struct list_head list;
|
||||
|
||||
u16 seq_no;
|
||||
|
||||
/* BSS info */
|
||||
u8 bssid[ETH_ALEN];
|
||||
u16 aid;
|
||||
|
@ -144,16 +144,8 @@ static struct ath_buf *ath9k_beacon_generate(struct ieee80211_hw *hw,
|
||||
mgmt_hdr->u.beacon.timestamp = avp->tsf_adjust;
|
||||
|
||||
info = IEEE80211_SKB_CB(skb);
|
||||
if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) {
|
||||
/*
|
||||
* TODO: make sure the seq# gets assigned properly (vs. other
|
||||
* TX frames)
|
||||
*/
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
sc->tx.seq_no += 0x10;
|
||||
hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
|
||||
hdr->seq_ctrl |= cpu_to_le16(sc->tx.seq_no);
|
||||
}
|
||||
|
||||
ath_assign_seq(common, skb);
|
||||
|
||||
if (vif->p2p)
|
||||
ath9k_beacon_add_noa(sc, avp, skb);
|
||||
|
@ -464,6 +464,7 @@ static int ath9k_init_priv(struct ath9k_htc_priv *priv,
|
||||
return -ENOMEM;
|
||||
|
||||
ah->dev = priv->dev;
|
||||
ah->hw = priv->hw;
|
||||
ah->hw_version.devid = devid;
|
||||
ah->hw_version.usbdev = drv_info;
|
||||
ah->ah_flags |= AH_USE_EEPROM;
|
||||
|
@ -2332,7 +2332,7 @@ static void ath9k_remove_chanctx(struct ieee80211_hw *hw,
|
||||
conf->def.chan->center_freq);
|
||||
|
||||
ctx->assigned = false;
|
||||
ctx->hw_queue_base = -1;
|
||||
ctx->hw_queue_base = 0;
|
||||
ath_chanctx_event(sc, NULL, ATH_CHANCTX_EVENT_UNASSIGN);
|
||||
|
||||
mutex_unlock(&sc->mutex);
|
||||
|
@ -54,6 +54,12 @@ static struct sk_buff *ath9k_build_tx99_skb(struct ath_softc *sc)
|
||||
struct ieee80211_hdr *hdr;
|
||||
struct ieee80211_tx_info *tx_info;
|
||||
struct sk_buff *skb;
|
||||
struct ath_vif *avp;
|
||||
|
||||
if (!sc->tx99_vif)
|
||||
return NULL;
|
||||
|
||||
avp = (struct ath_vif *)sc->tx99_vif->drv_priv;
|
||||
|
||||
skb = alloc_skb(len, GFP_KERNEL);
|
||||
if (!skb)
|
||||
@ -71,7 +77,7 @@ static struct sk_buff *ath9k_build_tx99_skb(struct ath_softc *sc)
|
||||
memcpy(hdr->addr2, hw->wiphy->perm_addr, ETH_ALEN);
|
||||
memcpy(hdr->addr3, hw->wiphy->perm_addr, ETH_ALEN);
|
||||
|
||||
hdr->seq_ctrl |= cpu_to_le16(sc->tx.seq_no);
|
||||
hdr->seq_ctrl |= cpu_to_le16(avp->seq_no);
|
||||
|
||||
tx_info = IEEE80211_SKB_CB(skb);
|
||||
memset(tx_info, 0, sizeof(*tx_info));
|
||||
|
@ -2139,6 +2139,28 @@ static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc,
|
||||
return bf;
|
||||
}
|
||||
|
||||
void ath_assign_seq(struct ath_common *common, struct sk_buff *skb)
|
||||
{
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
struct ieee80211_vif *vif = info->control.vif;
|
||||
struct ath_vif *avp;
|
||||
|
||||
if (!(info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ))
|
||||
return;
|
||||
|
||||
if (!vif)
|
||||
return;
|
||||
|
||||
avp = (struct ath_vif *)vif->drv_priv;
|
||||
|
||||
if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)
|
||||
avp->seq_no += 0x10;
|
||||
|
||||
hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
|
||||
hdr->seq_ctrl |= cpu_to_le16(avp->seq_no);
|
||||
}
|
||||
|
||||
static int ath_tx_prepare(struct ieee80211_hw *hw, struct sk_buff *skb,
|
||||
struct ath_tx_control *txctl)
|
||||
{
|
||||
@ -2162,17 +2184,7 @@ static int ath_tx_prepare(struct ieee80211_hw *hw, struct sk_buff *skb,
|
||||
if (info->control.hw_key)
|
||||
frmlen += info->control.hw_key->icv_len;
|
||||
|
||||
/*
|
||||
* As a temporary workaround, assign seq# here; this will likely need
|
||||
* to be cleaned up to work better with Beacon transmission and virtual
|
||||
* BSSes.
|
||||
*/
|
||||
if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) {
|
||||
if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)
|
||||
sc->tx.seq_no += 0x10;
|
||||
hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
|
||||
hdr->seq_ctrl |= cpu_to_le16(sc->tx.seq_no);
|
||||
}
|
||||
ath_assign_seq(ath9k_hw_common(sc->sc_ah), skb);
|
||||
|
||||
if ((vif && vif->type != NL80211_IFTYPE_AP &&
|
||||
vif->type != NL80211_IFTYPE_AP_VLAN) ||
|
||||
|
@ -79,13 +79,13 @@ void ath_printk(const char *level, const struct ath_common* common,
|
||||
vaf.fmt = fmt;
|
||||
vaf.va = &args;
|
||||
|
||||
if (common && common->hw && common->hw->wiphy)
|
||||
if (common && common->hw && common->hw->wiphy) {
|
||||
printk("%sath: %s: %pV",
|
||||
level, wiphy_name(common->hw->wiphy), &vaf);
|
||||
else
|
||||
trace_ath_log(common->hw->wiphy, &vaf);
|
||||
} else {
|
||||
printk("%sath: %pV", level, &vaf);
|
||||
|
||||
trace_ath_log(common->hw->wiphy, &vaf);
|
||||
}
|
||||
|
||||
va_end(args);
|
||||
}
|
||||
|
@ -742,35 +742,49 @@ static void rtl8180_int_disable(struct ieee80211_hw *dev)
|
||||
}
|
||||
|
||||
static void rtl8180_conf_basic_rates(struct ieee80211_hw *dev,
|
||||
u32 rates_mask)
|
||||
u32 basic_mask)
|
||||
{
|
||||
struct rtl8180_priv *priv = dev->priv;
|
||||
|
||||
u8 max, min;
|
||||
u16 reg;
|
||||
u32 resp_mask;
|
||||
u8 basic_max;
|
||||
u8 resp_max, resp_min;
|
||||
|
||||
max = fls(rates_mask) - 1;
|
||||
min = ffs(rates_mask) - 1;
|
||||
resp_mask = basic_mask;
|
||||
/* IEEE80211 says the response rate should be equal to the highest basic
|
||||
* rate that is not faster than received frame. But it says also that if
|
||||
* the basic rate set does not contains any rate for the current
|
||||
* modulation class then mandatory rate set must be used for that
|
||||
* modulation class. Eventually add OFDM mandatory rates..
|
||||
*/
|
||||
if ((resp_mask & 0xf) == resp_mask)
|
||||
resp_mask |= 0x150; /* 6, 12, 24Mbps */
|
||||
|
||||
switch (priv->chip_family) {
|
||||
|
||||
case RTL818X_CHIP_FAMILY_RTL8180:
|
||||
/* in 8180 this is NOT a BITMAP */
|
||||
basic_max = fls(basic_mask) - 1;
|
||||
reg = rtl818x_ioread16(priv, &priv->map->BRSR);
|
||||
reg &= ~3;
|
||||
reg |= max;
|
||||
reg |= basic_max;
|
||||
rtl818x_iowrite16(priv, &priv->map->BRSR, reg);
|
||||
break;
|
||||
|
||||
case RTL818X_CHIP_FAMILY_RTL8185:
|
||||
resp_max = fls(resp_mask) - 1;
|
||||
resp_min = ffs(resp_mask) - 1;
|
||||
/* in 8185 this is a BITMAP */
|
||||
rtl818x_iowrite16(priv, &priv->map->BRSR, rates_mask);
|
||||
rtl818x_iowrite8(priv, &priv->map->RESP_RATE, (max << 4) | min);
|
||||
rtl818x_iowrite16(priv, &priv->map->BRSR, basic_mask);
|
||||
rtl818x_iowrite8(priv, &priv->map->RESP_RATE, (resp_max << 4) |
|
||||
resp_min);
|
||||
break;
|
||||
|
||||
case RTL818X_CHIP_FAMILY_RTL8187SE:
|
||||
/* in 8187se this is a BITMAP */
|
||||
rtl818x_iowrite16(priv, &priv->map->BRSR_8187SE, rates_mask);
|
||||
/* in 8187se this is a BITMAP. BRSR reg actually sets
|
||||
* response rates.
|
||||
*/
|
||||
rtl818x_iowrite16(priv, &priv->map->BRSR_8187SE, resp_mask);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1370,7 +1370,7 @@ struct rtl_mac {
|
||||
bool rdg_en;
|
||||
|
||||
/*AP*/
|
||||
u8 bssid[6];
|
||||
u8 bssid[ETH_ALEN] __aligned(2);
|
||||
u32 vendor;
|
||||
u8 mcs[16]; /* 16 bytes mcs for HT rates. */
|
||||
u32 basic_rates; /* b/g rates */
|
||||
|
@ -329,7 +329,7 @@ static atomic_t rfkill_input_disabled = ATOMIC_INIT(0);
|
||||
/**
|
||||
* __rfkill_switch_all - Toggle state of all switches of given type
|
||||
* @type: type of interfaces to be affected
|
||||
* @state: the new state
|
||||
* @blocked: the new state
|
||||
*
|
||||
* This function sets the state of all switches of given type,
|
||||
* unless a specific switch is claimed by userspace (in which case,
|
||||
@ -353,7 +353,7 @@ static void __rfkill_switch_all(const enum rfkill_type type, bool blocked)
|
||||
/**
|
||||
* rfkill_switch_all - Toggle state of all switches of given type
|
||||
* @type: type of interfaces to be affected
|
||||
* @state: the new state
|
||||
* @blocked: the new state
|
||||
*
|
||||
* Acquires rfkill_global_mutex and calls __rfkill_switch_all(@type, @state).
|
||||
* Please refer to __rfkill_switch_all() for details.
|
||||
|
Loading…
Reference in New Issue
Block a user