Commit b41f5bff authored by David S. Miller's avatar David S. Miller
parents bcf0dda8 e91e9d49
...@@ -11577,6 +11577,7 @@ static int ipw_prom_alloc(struct ipw_priv *priv) ...@@ -11577,6 +11577,7 @@ static int ipw_prom_alloc(struct ipw_priv *priv)
priv->prom_priv->priv = priv; priv->prom_priv->priv = priv;
strcpy(priv->prom_net_dev->name, "rtap%d"); strcpy(priv->prom_net_dev->name, "rtap%d");
memcpy(priv->prom_net_dev->dev_addr, priv->mac_addr, ETH_ALEN);
priv->prom_net_dev->type = ARPHRD_IEEE80211_RADIOTAP; priv->prom_net_dev->type = ARPHRD_IEEE80211_RADIOTAP;
priv->prom_net_dev->open = ipw_prom_open; priv->prom_net_dev->open = ipw_prom_open;
......
...@@ -35,7 +35,6 @@ config IWL4965_HT ...@@ -35,7 +35,6 @@ config IWL4965_HT
bool "Enable 802.11n HT features in iwl4965 driver" bool "Enable 802.11n HT features in iwl4965 driver"
depends on EXPERIMENTAL depends on EXPERIMENTAL
depends on IWL4965 && IWL4965_QOS depends on IWL4965 && IWL4965_QOS
depends on n
---help--- ---help---
This option enables IEEE 802.11n High Throughput features This option enables IEEE 802.11n High Throughput features
for the iwl4965 driver. for the iwl4965 driver.
......
...@@ -541,7 +541,7 @@ void lbs_association_worker(struct work_struct *work) ...@@ -541,7 +541,7 @@ void lbs_association_worker(struct work_struct *work)
} }
if (find_any_ssid) { if (find_any_ssid) {
u8 new_mode; u8 new_mode = assoc_req->mode;
ret = lbs_find_best_network_ssid(priv, assoc_req->ssid, ret = lbs_find_best_network_ssid(priv, assoc_req->ssid,
&assoc_req->ssid_len, assoc_req->mode, &new_mode); &assoc_req->ssid_len, assoc_req->mode, &new_mode);
......
...@@ -2399,10 +2399,8 @@ static int rt61pci_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb, ...@@ -2399,10 +2399,8 @@ static int rt61pci_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb,
* beacon frame. * beacon frame.
*/ */
if (skb_headroom(skb) < TXD_DESC_SIZE) { if (skb_headroom(skb) < TXD_DESC_SIZE) {
if (pskb_expand_head(skb, TXD_DESC_SIZE, 0, GFP_ATOMIC)) { if (pskb_expand_head(skb, TXD_DESC_SIZE, 0, GFP_ATOMIC))
dev_kfree_skb(skb);
return -ENOMEM; return -ENOMEM;
}
} }
/* /*
......
...@@ -109,12 +109,13 @@ static void set_irq(struct ssb_device *dev, unsigned int irq) ...@@ -109,12 +109,13 @@ static void set_irq(struct ssb_device *dev, unsigned int irq)
clear_irq(bus, oldirq); clear_irq(bus, oldirq);
/* assign the new one */ /* assign the new one */
if (irq == 0) if (irq == 0) {
ssb_write32(mdev, SSB_INTVEC, ((1 << irqflag) & ssb_read32(mdev, SSB_INTVEC))); ssb_write32(mdev, SSB_INTVEC, ((1 << irqflag) | ssb_read32(mdev, SSB_INTVEC)));
} else {
irqflag <<= ipsflag_irq_shift[irq]; irqflag <<= ipsflag_irq_shift[irq];
irqflag |= (ssb_read32(mdev, SSB_IPSFLAG) & ~ipsflag_irq_mask[irq]); irqflag |= (ssb_read32(mdev, SSB_IPSFLAG) & ~ipsflag_irq_mask[irq]);
ssb_write32(mdev, SSB_IPSFLAG, irqflag); ssb_write32(mdev, SSB_IPSFLAG, irqflag);
}
} }
static void ssb_mips_serial_init(struct ssb_mipscore *mcore) static void ssb_mips_serial_init(struct ssb_mipscore *mcore)
......
...@@ -551,7 +551,7 @@ int ssb_pcicore_dev_irqvecs_enable(struct ssb_pcicore *pc, ...@@ -551,7 +551,7 @@ int ssb_pcicore_dev_irqvecs_enable(struct ssb_pcicore *pc,
} else { } else {
tmp = ssb_read32(dev, SSB_TPSFLAG); tmp = ssb_read32(dev, SSB_TPSFLAG);
tmp &= SSB_TPSFLAG_BPFLAG; tmp &= SSB_TPSFLAG_BPFLAG;
intvec |= tmp; intvec |= (1 << tmp);
} }
ssb_write32(pdev, SSB_INTVEC, intvec); ssb_write32(pdev, SSB_INTVEC, intvec);
} }
......
...@@ -1044,6 +1044,12 @@ int ssb_bus_may_powerdown(struct ssb_bus *bus) ...@@ -1044,6 +1044,12 @@ int ssb_bus_may_powerdown(struct ssb_bus *bus)
goto out; goto out;
cc = &bus->chipco; cc = &bus->chipco;
if (!cc->dev)
goto out;
if (cc->dev->id.revision < 5)
goto out;
ssb_chipco_set_clockmode(cc, SSB_CLKMODE_SLOW); ssb_chipco_set_clockmode(cc, SSB_CLKMODE_SLOW);
err = ssb_pci_xtal(bus, SSB_GPIO_XTAL | SSB_GPIO_PLL, 0); err = ssb_pci_xtal(bus, SSB_GPIO_XTAL | SSB_GPIO_PLL, 0);
if (err) if (err)
......
...@@ -312,14 +312,12 @@ static void ieee80211_sta_wmm_params(struct net_device *dev, ...@@ -312,14 +312,12 @@ static void ieee80211_sta_wmm_params(struct net_device *dev,
} }
} }
static u32 ieee80211_handle_protect_preamb(struct ieee80211_sub_if_data *sdata,
static u32 ieee80211_handle_erp_ie(struct ieee80211_sub_if_data *sdata, bool use_protection,
u8 erp_value) bool use_short_preamble)
{ {
struct ieee80211_bss_conf *bss_conf = &sdata->bss_conf; struct ieee80211_bss_conf *bss_conf = &sdata->bss_conf;
struct ieee80211_if_sta *ifsta = &sdata->u.sta; struct ieee80211_if_sta *ifsta = &sdata->u.sta;
bool use_protection = (erp_value & WLAN_ERP_USE_PROTECTION) != 0;
bool use_short_preamble = (erp_value & WLAN_ERP_BARKER_PREAMBLE) == 0;
DECLARE_MAC_BUF(mac); DECLARE_MAC_BUF(mac);
u32 changed = 0; u32 changed = 0;
...@@ -350,6 +348,32 @@ static u32 ieee80211_handle_erp_ie(struct ieee80211_sub_if_data *sdata, ...@@ -350,6 +348,32 @@ static u32 ieee80211_handle_erp_ie(struct ieee80211_sub_if_data *sdata,
return changed; return changed;
} }
static u32 ieee80211_handle_erp_ie(struct ieee80211_sub_if_data *sdata,
u8 erp_value)
{
bool use_protection = (erp_value & WLAN_ERP_USE_PROTECTION) != 0;
bool use_short_preamble = (erp_value & WLAN_ERP_BARKER_PREAMBLE) == 0;
return ieee80211_handle_protect_preamb(sdata,
use_protection, use_short_preamble);
}
static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata,
struct ieee80211_sta_bss *bss)
{
u32 changed = 0;
if (bss->has_erp_value)
changed |= ieee80211_handle_erp_ie(sdata, bss->erp_value);
else {
u16 capab = bss->capability;
changed |= ieee80211_handle_protect_preamb(sdata, false,
(capab & WLAN_CAPABILITY_SHORT_PREAMBLE) != 0);
}
return changed;
}
int ieee80211_ht_cap_ie_to_ht_info(struct ieee80211_ht_cap *ht_cap_ie, int ieee80211_ht_cap_ie_to_ht_info(struct ieee80211_ht_cap *ht_cap_ie,
struct ieee80211_ht_info *ht_info) struct ieee80211_ht_info *ht_info)
{ {
...@@ -468,9 +492,7 @@ static void ieee80211_set_associated(struct net_device *dev, ...@@ -468,9 +492,7 @@ static void ieee80211_set_associated(struct net_device *dev,
local->hw.conf.channel, local->hw.conf.channel,
ifsta->ssid, ifsta->ssid_len); ifsta->ssid, ifsta->ssid_len);
if (bss) { if (bss) {
if (bss->has_erp_value) changed |= ieee80211_handle_bss_capability(sdata, bss);
changed |= ieee80211_handle_erp_ie(
sdata, bss->erp_value);
ieee80211_rx_bss_put(dev, bss); ieee80211_rx_bss_put(dev, bss);
} }
...@@ -2116,6 +2138,11 @@ static void ieee80211_rx_mgmt_beacon(struct net_device *dev, ...@@ -2116,6 +2138,11 @@ static void ieee80211_rx_mgmt_beacon(struct net_device *dev,
if (elems.erp_info && elems.erp_info_len >= 1) if (elems.erp_info && elems.erp_info_len >= 1)
changed |= ieee80211_handle_erp_ie(sdata, elems.erp_info[0]); changed |= ieee80211_handle_erp_ie(sdata, elems.erp_info[0]);
else {
u16 capab = le16_to_cpu(mgmt->u.beacon.capab_info);
changed |= ieee80211_handle_protect_preamb(sdata, false,
(capab & WLAN_CAPABILITY_SHORT_PREAMBLE) != 0);
}
if (elems.ht_cap_elem && elems.ht_info_elem && if (elems.ht_cap_elem && elems.ht_info_elem &&
elems.wmm_param && local->ops->conf_ht && elems.wmm_param && local->ops->conf_ht &&
......
...@@ -945,7 +945,7 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info) ...@@ -945,7 +945,7 @@ static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]); nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
params.listen_interval = params.listen_interval =
nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]); nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
params.listen_interval = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]); params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
if (parse_station_flags(info->attrs[NL80211_ATTR_STA_FLAGS], if (parse_station_flags(info->attrs[NL80211_ATTR_STA_FLAGS],
&params.station_flags)) &params.station_flags))
......
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