Commit a80f509f authored by David S. Miller's avatar David S. Miller

Merge branch 'fixes' of master.kernel.org:/pub/scm/linux/kernel/git/linville/wireless-2.6

parents 246f19d1 04a9e451
...@@ -153,7 +153,7 @@ static int ath5k_pci_resume(struct pci_dev *pdev); ...@@ -153,7 +153,7 @@ static int ath5k_pci_resume(struct pci_dev *pdev);
#define ath5k_pci_resume NULL #define ath5k_pci_resume NULL
#endif /* CONFIG_PM */ #endif /* CONFIG_PM */
static struct pci_driver ath5k_pci_drv_id = { static struct pci_driver ath5k_pci_driver = {
.name = "ath5k_pci", .name = "ath5k_pci",
.id_table = ath5k_pci_id_table, .id_table = ath5k_pci_id_table,
.probe = ath5k_pci_probe, .probe = ath5k_pci_probe,
...@@ -329,7 +329,7 @@ init_ath5k_pci(void) ...@@ -329,7 +329,7 @@ init_ath5k_pci(void)
ath5k_debug_init(); ath5k_debug_init();
ret = pci_register_driver(&ath5k_pci_drv_id); ret = pci_register_driver(&ath5k_pci_driver);
if (ret) { if (ret) {
printk(KERN_ERR "ath5k_pci: can't register pci driver\n"); printk(KERN_ERR "ath5k_pci: can't register pci driver\n");
return ret; return ret;
...@@ -341,7 +341,7 @@ init_ath5k_pci(void) ...@@ -341,7 +341,7 @@ init_ath5k_pci(void)
static void __exit static void __exit
exit_ath5k_pci(void) exit_ath5k_pci(void)
{ {
pci_unregister_driver(&ath5k_pci_drv_id); pci_unregister_driver(&ath5k_pci_driver);
ath5k_debug_finish(); ath5k_debug_finish();
} }
......
...@@ -238,7 +238,8 @@ void iwl3945_hw_rx_statistics(struct iwl3945_priv *priv, struct iwl3945_rx_mem_b ...@@ -238,7 +238,8 @@ void iwl3945_hw_rx_statistics(struct iwl3945_priv *priv, struct iwl3945_rx_mem_b
priv->last_statistics_time = jiffies; priv->last_statistics_time = jiffies;
} }
void iwl3945_add_radiotap(struct iwl3945_priv *priv, struct sk_buff *skb, static void iwl3945_add_radiotap(struct iwl3945_priv *priv,
struct sk_buff *skb,
struct iwl3945_rx_frame_hdr *rx_hdr, struct iwl3945_rx_frame_hdr *rx_hdr,
struct ieee80211_rx_status *stats) struct ieee80211_rx_status *stats)
{ {
......
...@@ -4658,17 +4658,30 @@ void iwl4965_set_ht_add_station(struct iwl4965_priv *priv, u8 index, ...@@ -4658,17 +4658,30 @@ void iwl4965_set_ht_add_station(struct iwl4965_priv *priv, u8 index,
struct ieee80211_ht_info *sta_ht_inf) struct ieee80211_ht_info *sta_ht_inf)
{ {
__le32 sta_flags; __le32 sta_flags;
u8 mimo_ps_mode;
if (!sta_ht_inf || !sta_ht_inf->ht_supported) if (!sta_ht_inf || !sta_ht_inf->ht_supported)
goto done; goto done;
mimo_ps_mode = (sta_ht_inf->cap & IEEE80211_HT_CAP_MIMO_PS) >> 2;
sta_flags = priv->stations[index].sta.station_flags; sta_flags = priv->stations[index].sta.station_flags;
if (((sta_ht_inf->cap & IEEE80211_HT_CAP_MIMO_PS >> 2)) sta_flags &= ~(STA_FLG_RTS_MIMO_PROT_MSK | STA_FLG_MIMO_DIS_MSK);
== IWL_MIMO_PS_DYNAMIC)
switch (mimo_ps_mode) {
case WLAN_HT_CAP_MIMO_PS_STATIC:
sta_flags |= STA_FLG_MIMO_DIS_MSK;
break;
case WLAN_HT_CAP_MIMO_PS_DYNAMIC:
sta_flags |= STA_FLG_RTS_MIMO_PROT_MSK; sta_flags |= STA_FLG_RTS_MIMO_PROT_MSK;
else break;
sta_flags &= ~STA_FLG_RTS_MIMO_PROT_MSK; case WLAN_HT_CAP_MIMO_PS_DISABLED:
break;
default:
IWL_WARNING("Invalid MIMO PS mode %d", mimo_ps_mode);
break;
}
sta_flags |= cpu_to_le32( sta_flags |= cpu_to_le32(
(u32)sta_ht_inf->ampdu_factor << STA_FLG_MAX_AGG_SIZE_POS); (u32)sta_ht_inf->ampdu_factor << STA_FLG_MAX_AGG_SIZE_POS);
...@@ -4679,7 +4692,7 @@ void iwl4965_set_ht_add_station(struct iwl4965_priv *priv, u8 index, ...@@ -4679,7 +4692,7 @@ void iwl4965_set_ht_add_station(struct iwl4965_priv *priv, u8 index,
if (iwl4965_is_fat_tx_allowed(priv, sta_ht_inf)) if (iwl4965_is_fat_tx_allowed(priv, sta_ht_inf))
sta_flags |= STA_FLG_FAT_EN_MSK; sta_flags |= STA_FLG_FAT_EN_MSK;
else else
sta_flags &= (~STA_FLG_FAT_EN_MSK); sta_flags &= ~STA_FLG_FAT_EN_MSK;
priv->stations[index].sta.station_flags = sta_flags; priv->stations[index].sta.station_flags = sta_flags;
done: done:
......
...@@ -147,9 +147,6 @@ static inline struct ieee80211_conf *ieee80211_get_hw_conf( ...@@ -147,9 +147,6 @@ static inline struct ieee80211_conf *ieee80211_get_hw_conf(
#define QOS_CONTROL_LEN 2 #define QOS_CONTROL_LEN 2
#define IEEE80211_STYPE_BACK_REQ 0x0080
#define IEEE80211_STYPE_BACK 0x0090
static inline int ieee80211_is_management(u16 fc) static inline int ieee80211_is_management(u16 fc)
{ {
......
...@@ -6330,6 +6330,11 @@ static int __iwl3945_up(struct iwl3945_priv *priv) ...@@ -6330,6 +6330,11 @@ static int __iwl3945_up(struct iwl3945_priv *priv)
return -ENODEV; return -ENODEV;
} }
if (!priv->ucode_data_backup.v_addr || !priv->ucode_data.v_addr) {
IWL_ERROR("ucode not available for device bringup\n");
return -EIO;
}
/* If platform's RF_KILL switch is NOT set to KILL */ /* If platform's RF_KILL switch is NOT set to KILL */
if (iwl3945_read32(priv, CSR_GP_CNTRL) & if (iwl3945_read32(priv, CSR_GP_CNTRL) &
CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW) CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW)
...@@ -6342,11 +6347,6 @@ static int __iwl3945_up(struct iwl3945_priv *priv) ...@@ -6342,11 +6347,6 @@ static int __iwl3945_up(struct iwl3945_priv *priv)
} }
} }
if (!priv->ucode_data_backup.v_addr || !priv->ucode_data.v_addr) {
IWL_ERROR("ucode not available for device bringup\n");
return -EIO;
}
iwl3945_write32(priv, CSR_INT, 0xFFFFFFFF); iwl3945_write32(priv, CSR_INT, 0xFFFFFFFF);
rc = iwl3945_hw_nic_init(priv); rc = iwl3945_hw_nic_init(priv);
......
...@@ -6755,6 +6755,11 @@ static int __iwl4965_up(struct iwl4965_priv *priv) ...@@ -6755,6 +6755,11 @@ static int __iwl4965_up(struct iwl4965_priv *priv)
return -ENODEV; return -ENODEV;
} }
if (!priv->ucode_data_backup.v_addr || !priv->ucode_data.v_addr) {
IWL_ERROR("ucode not available for device bringup\n");
return -EIO;
}
/* If platform's RF_KILL switch is NOT set to KILL */ /* If platform's RF_KILL switch is NOT set to KILL */
if (iwl4965_read32(priv, CSR_GP_CNTRL) & if (iwl4965_read32(priv, CSR_GP_CNTRL) &
CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW) CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW)
...@@ -6767,11 +6772,6 @@ static int __iwl4965_up(struct iwl4965_priv *priv) ...@@ -6767,11 +6772,6 @@ static int __iwl4965_up(struct iwl4965_priv *priv)
} }
} }
if (!priv->ucode_data_backup.v_addr || !priv->ucode_data.v_addr) {
IWL_ERROR("ucode not available for device bringup\n");
return -EIO;
}
iwl4965_write32(priv, CSR_INT, 0xFFFFFFFF); iwl4965_write32(priv, CSR_INT, 0xFFFFFFFF);
rc = iwl4965_hw_nic_init(priv); rc = iwl4965_hw_nic_init(priv);
......
...@@ -287,6 +287,12 @@ struct ieee80211_ht_addt_info { ...@@ -287,6 +287,12 @@ struct ieee80211_ht_addt_info {
#define IEEE80211_HT_IE_NON_GF_STA_PRSNT 0x0004 #define IEEE80211_HT_IE_NON_GF_STA_PRSNT 0x0004
#define IEEE80211_HT_IE_NON_HT_STA_PRSNT 0x0010 #define IEEE80211_HT_IE_NON_HT_STA_PRSNT 0x0010
/* MIMO Power Save Modes */
#define WLAN_HT_CAP_MIMO_PS_STATIC 0
#define WLAN_HT_CAP_MIMO_PS_DYNAMIC 1
#define WLAN_HT_CAP_MIMO_PS_INVALID 2
#define WLAN_HT_CAP_MIMO_PS_DISABLED 3
/* Authentication algorithms */ /* Authentication algorithms */
#define WLAN_AUTH_OPEN 0 #define WLAN_AUTH_OPEN 0
#define WLAN_AUTH_SHARED_KEY 1 #define WLAN_AUTH_SHARED_KEY 1
......
...@@ -98,6 +98,18 @@ config MAC80211_DEBUGFS ...@@ -98,6 +98,18 @@ config MAC80211_DEBUGFS
Say N unless you know you need this. Say N unless you know you need this.
config MAC80211_DEBUG_PACKET_ALIGNMENT
bool "Enable packet alignment debugging"
depends on MAC80211
help
This option is recommended for driver authors and strongly
discouraged for everybody else, it will trigger a warning
when a driver hands mac80211 a buffer that is aligned in
a way that will cause problems with the IP stack on some
architectures.
Say N unless you're writing a mac80211 based driver.
config MAC80211_DEBUG config MAC80211_DEBUG
bool "Enable debugging output" bool "Enable debugging output"
depends on MAC80211 depends on MAC80211
......
...@@ -1344,17 +1344,17 @@ static int __init ieee80211_init(void) ...@@ -1344,17 +1344,17 @@ static int __init ieee80211_init(void)
ret = rc80211_simple_init(); ret = rc80211_simple_init();
if (ret) if (ret)
goto fail; goto out;
ret = rc80211_pid_init(); ret = rc80211_pid_init();
if (ret) if (ret)
goto fail_simple; goto out_cleanup_simple;
ret = ieee80211_wme_register(); ret = ieee80211_wme_register();
if (ret) { if (ret) {
printk(KERN_DEBUG "ieee80211_init: failed to " printk(KERN_DEBUG "ieee80211_init: failed to "
"initialize WME (err=%d)\n", ret); "initialize WME (err=%d)\n", ret);
goto fail_pid; goto out_cleanup_pid;
} }
ieee80211_debugfs_netdev_init(); ieee80211_debugfs_netdev_init();
...@@ -1362,11 +1362,11 @@ static int __init ieee80211_init(void) ...@@ -1362,11 +1362,11 @@ static int __init ieee80211_init(void)
return 0; return 0;
fail_pid: out_cleanup_pid:
rc80211_simple_exit();
fail_simple:
rc80211_pid_exit(); rc80211_pid_exit();
fail: out_cleanup_simple:
rc80211_simple_exit();
out:
return ret; return ret;
} }
......
...@@ -538,7 +538,7 @@ int __init rc80211_pid_init(void) ...@@ -538,7 +538,7 @@ int __init rc80211_pid_init(void)
return ieee80211_rate_control_register(&mac80211_rcpid); return ieee80211_rate_control_register(&mac80211_rcpid);
} }
void __exit rc80211_pid_exit(void) void rc80211_pid_exit(void)
{ {
ieee80211_rate_control_unregister(&mac80211_rcpid); ieee80211_rate_control_unregister(&mac80211_rcpid);
} }
......
...@@ -389,7 +389,7 @@ int __init rc80211_simple_init(void) ...@@ -389,7 +389,7 @@ int __init rc80211_simple_init(void)
return ieee80211_rate_control_register(&mac80211_rcsimple); return ieee80211_rate_control_register(&mac80211_rcsimple);
} }
void __exit rc80211_simple_exit(void) void rc80211_simple_exit(void)
{ {
ieee80211_rate_control_unregister(&mac80211_rcsimple); ieee80211_rate_control_unregister(&mac80211_rcsimple);
} }
......
...@@ -340,11 +340,15 @@ static u32 ieee80211_rx_load_stats(struct ieee80211_local *local, ...@@ -340,11 +340,15 @@ static u32 ieee80211_rx_load_stats(struct ieee80211_local *local,
return load; return load;
} }
#ifdef CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT
static ieee80211_txrx_result static ieee80211_txrx_result
ieee80211_rx_h_verify_ip_alignment(struct ieee80211_txrx_data *rx) ieee80211_rx_h_verify_ip_alignment(struct ieee80211_txrx_data *rx)
{ {
int hdrlen; int hdrlen;
if (!WLAN_FC_DATA_PRESENT(rx->fc))
return TXRX_CONTINUE;
/* /*
* Drivers are required to align the payload data in a way that * Drivers are required to align the payload data in a way that
* guarantees that the contained IP header is aligned to a four- * guarantees that the contained IP header is aligned to a four-
...@@ -371,11 +375,14 @@ ieee80211_rx_h_verify_ip_alignment(struct ieee80211_txrx_data *rx) ...@@ -371,11 +375,14 @@ ieee80211_rx_h_verify_ip_alignment(struct ieee80211_txrx_data *rx)
return TXRX_CONTINUE; return TXRX_CONTINUE;
} }
#endif
ieee80211_rx_handler ieee80211_rx_pre_handlers[] = ieee80211_rx_handler ieee80211_rx_pre_handlers[] =
{ {
ieee80211_rx_h_parse_qos, ieee80211_rx_h_parse_qos,
#ifdef CONFIG_MAC80211_DEBUG_PACKET_ALIGNMENT
ieee80211_rx_h_verify_ip_alignment, ieee80211_rx_h_verify_ip_alignment,
#endif
NULL NULL
}; };
......
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