aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-4965.c15
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-5000.c7
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-commands.h26
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-core.h2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-dev.h6
-rw-r--r--drivers/net/wireless/iwlwifi/iwl4965-base.c25
7 files changed, 65 insertions, 18 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c
index 2bb0075a807f..83876a07fe2e 100644
--- a/drivers/net/wireless/iwlwifi/iwl-4965.c
+++ b/drivers/net/wireless/iwlwifi/iwl-4965.c
@@ -1857,8 +1857,8 @@ static int iwl4965_send_rxon_assoc(struct iwl_priv *priv)
1857{ 1857{
1858 int ret = 0; 1858 int ret = 0;
1859 struct iwl4965_rxon_assoc_cmd rxon_assoc; 1859 struct iwl4965_rxon_assoc_cmd rxon_assoc;
1860 const struct iwl4965_rxon_cmd *rxon1 = &priv->staging_rxon; 1860 const struct iwl_rxon_cmd *rxon1 = &priv->staging_rxon;
1861 const struct iwl4965_rxon_cmd *rxon2 = &priv->active_rxon; 1861 const struct iwl_rxon_cmd *rxon2 = &priv->active_rxon;
1862 1862
1863 if ((rxon1->flags == rxon2->flags) && 1863 if ((rxon1->flags == rxon2->flags) &&
1864 (rxon1->filter_flags == rxon2->filter_flags) && 1864 (rxon1->filter_flags == rxon2->filter_flags) &&
@@ -3743,6 +3743,16 @@ int iwl4965_mac_ampdu_action(struct ieee80211_hw *hw,
3743#endif /* CONFIG_IWL4965_HT */ 3743#endif /* CONFIG_IWL4965_HT */
3744 3744
3745 3745
3746static u16 iwl4965_get_hcmd_size(u8 cmd_id, u16 len)
3747{
3748 switch (cmd_id) {
3749 case REPLY_RXON:
3750 return (u16) sizeof(struct iwl4965_rxon_cmd);
3751 default:
3752 return len;
3753 }
3754}
3755
3746static u16 iwl4965_build_addsta_hcmd(const struct iwl_addsta_cmd *cmd, u8 *data) 3756static u16 iwl4965_build_addsta_hcmd(const struct iwl_addsta_cmd *cmd, u8 *data)
3747{ 3757{
3748 struct iwl4965_addsta_cmd *addsta = (struct iwl4965_addsta_cmd *)data; 3758 struct iwl4965_addsta_cmd *addsta = (struct iwl4965_addsta_cmd *)data;
@@ -3802,6 +3812,7 @@ static struct iwl_hcmd_ops iwl4965_hcmd = {
3802}; 3812};
3803 3813
3804static struct iwl_hcmd_utils_ops iwl4965_hcmd_utils = { 3814static struct iwl_hcmd_utils_ops iwl4965_hcmd_utils = {
3815 .get_hcmd_size = iwl4965_get_hcmd_size,
3805 .enqueue_hcmd = iwl4965_enqueue_hcmd, 3816 .enqueue_hcmd = iwl4965_enqueue_hcmd,
3806 .build_addsta_hcmd = iwl4965_build_addsta_hcmd, 3817 .build_addsta_hcmd = iwl4965_build_addsta_hcmd,
3807#ifdef CONFIG_IWL4965_RUN_TIME_CALIB 3818#ifdef CONFIG_IWL4965_RUN_TIME_CALIB
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c
index b5e28b811796..72d655c59fba 100644
--- a/drivers/net/wireless/iwlwifi/iwl-5000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-5000.c
@@ -459,10 +459,17 @@ static int iwl5000_disable_tx_fifo(struct iwl_priv *priv)
459 return 0; 459 return 0;
460} 460}
461 461
462/* Currently 5000 is the supperset of everything */
463static u16 iwl5000_get_hcmd_size(u8 cmd_id, u16 len)
464{
465 return len;
466}
467
462static struct iwl_hcmd_ops iwl5000_hcmd = { 468static struct iwl_hcmd_ops iwl5000_hcmd = {
463}; 469};
464 470
465static struct iwl_hcmd_utils_ops iwl5000_hcmd_utils = { 471static struct iwl_hcmd_utils_ops iwl5000_hcmd_utils = {
472 .get_hcmd_size = iwl5000_get_hcmd_size,
466 .build_addsta_hcmd = iwl5000_build_addsta_hcmd, 473 .build_addsta_hcmd = iwl5000_build_addsta_hcmd,
467#ifdef CONFIG_IWL5000_RUN_TIME_CALIB 474#ifdef CONFIG_IWL5000_RUN_TIME_CALIB
468 .gain_computation = iwl5000_gain_computation, 475 .gain_computation = iwl5000_gain_computation,
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h
index d16a853f376a..350af1be6e35 100644
--- a/drivers/net/wireless/iwlwifi/iwl-commands.h
+++ b/drivers/net/wireless/iwlwifi/iwl-commands.h
@@ -600,6 +600,32 @@ struct iwl4965_rxon_cmd {
600 u8 ofdm_ht_dual_stream_basic_rates; 600 u8 ofdm_ht_dual_stream_basic_rates;
601} __attribute__ ((packed)); 601} __attribute__ ((packed));
602 602
603/* 5000 HW just extend this cmmand */
604struct iwl_rxon_cmd {
605 u8 node_addr[6];
606 __le16 reserved1;
607 u8 bssid_addr[6];
608 __le16 reserved2;
609 u8 wlap_bssid_addr[6];
610 __le16 reserved3;
611 u8 dev_type;
612 u8 air_propagation;
613 __le16 rx_chain;
614 u8 ofdm_basic_rates;
615 u8 cck_basic_rates;
616 __le16 assoc_id;
617 __le32 flags;
618 __le32 filter_flags;
619 __le16 channel;
620 u8 ofdm_ht_single_stream_basic_rates;
621 u8 ofdm_ht_dual_stream_basic_rates;
622 u8 ofdm_ht_triple_stream_basic_rates;
623 u8 reserved5;
624 __le16 acquisition_data;
625 __le16 reserved6;
626} __attribute__ ((packed));
627
628
603/* 629/*
604 * REPLY_RXON_ASSOC = 0x11 (command, has simple generic response) 630 * REPLY_RXON_ASSOC = 0x11 (command, has simple generic response)
605 */ 631 */
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
index a2f4f288375a..b800031ecca5 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.c
+++ b/drivers/net/wireless/iwlwifi/iwl-core.c
@@ -588,7 +588,7 @@ EXPORT_SYMBOL(iwl_is_fat_tx_allowed);
588 588
589void iwl_set_rxon_ht(struct iwl_priv *priv, struct iwl_ht_info *ht_info) 589void iwl_set_rxon_ht(struct iwl_priv *priv, struct iwl_ht_info *ht_info)
590{ 590{
591 struct iwl4965_rxon_cmd *rxon = &priv->staging_rxon; 591 struct iwl_rxon_cmd *rxon = &priv->staging_rxon;
592 u32 val; 592 u32 val;
593 593
594 if (!ht_info->is_ht) 594 if (!ht_info->is_ht)
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
index e139c8ffa9a2..dcf1e562af32 100644
--- a/drivers/net/wireless/iwlwifi/iwl-core.h
+++ b/drivers/net/wireless/iwlwifi/iwl-core.h
@@ -86,6 +86,7 @@ struct iwl_hcmd_ops {
86 int (*rxon_assoc)(struct iwl_priv *priv); 86 int (*rxon_assoc)(struct iwl_priv *priv);
87}; 87};
88struct iwl_hcmd_utils_ops { 88struct iwl_hcmd_utils_ops {
89 u16 (*get_hcmd_size)(u8 cmd_id, u16 len);
89 int (*enqueue_hcmd)(struct iwl_priv *priv, struct iwl_host_cmd *cmd); 90 int (*enqueue_hcmd)(struct iwl_priv *priv, struct iwl_host_cmd *cmd);
90 u16 (*build_addsta_hcmd)(const struct iwl_addsta_cmd *cmd, u8 *data); 91 u16 (*build_addsta_hcmd)(const struct iwl_addsta_cmd *cmd, u8 *data);
91#ifdef CONFIG_IWLWIFI_RUN_TIME_CALIB 92#ifdef CONFIG_IWLWIFI_RUN_TIME_CALIB
@@ -303,5 +304,4 @@ static inline int iwl_send_rxon_assoc(struct iwl_priv *priv)
303 return priv->cfg->ops->hcmd->rxon_assoc(priv); 304 return priv->cfg->ops->hcmd->rxon_assoc(priv);
304} 305}
305 306
306
307#endif /* __iwl_core_h__ */ 307#endif /* __iwl_core_h__ */
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
index ae18a803d034..9a842fd047d4 100644
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
@@ -1009,11 +1009,11 @@ struct iwl_priv {
1009 * changed via explicit cast within the 1009 * changed via explicit cast within the
1010 * routines that actually update the physical 1010 * routines that actually update the physical
1011 * hardware */ 1011 * hardware */
1012 const struct iwl4965_rxon_cmd active_rxon; 1012 const struct iwl_rxon_cmd active_rxon;
1013 struct iwl4965_rxon_cmd staging_rxon; 1013 struct iwl_rxon_cmd staging_rxon;
1014 1014
1015 int error_recovering; 1015 int error_recovering;
1016 struct iwl4965_rxon_cmd recovery_rxon; 1016 struct iwl_rxon_cmd recovery_rxon;
1017 1017
1018 /* 1st responses from initialize and runtime uCode images. 1018 /* 1st responses from initialize and runtime uCode images.
1019 * 4965's initialize alive response contains some calibration data. */ 1019 * 4965's initialize alive response contains some calibration data. */
diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c b/drivers/net/wireless/iwlwifi/iwl4965-base.c
index 6e70405d4416..45b6b5234eef 100644
--- a/drivers/net/wireless/iwlwifi/iwl4965-base.c
+++ b/drivers/net/wireless/iwlwifi/iwl4965-base.c
@@ -353,11 +353,14 @@ int iwl4965_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
353 u32 *control_flags; 353 u32 *control_flags;
354 struct iwl_cmd *out_cmd; 354 struct iwl_cmd *out_cmd;
355 u32 idx; 355 u32 idx;
356 u16 fix_size = (u16)(cmd->len + sizeof(out_cmd->hdr)); 356 u16 fix_size;
357 dma_addr_t phys_addr; 357 dma_addr_t phys_addr;
358 int ret; 358 int ret;
359 unsigned long flags; 359 unsigned long flags;
360 360
361 cmd->len = priv->cfg->ops->utils->get_hcmd_size(cmd->id, cmd->len);
362 fix_size = (u16)(cmd->len + sizeof(out_cmd->hdr));
363
361 /* If any of the command structures end up being larger than 364 /* If any of the command structures end up being larger than
362 * the TFD_MAX_PAYLOAD_SIZE, and it sent as a 'small' command then 365 * the TFD_MAX_PAYLOAD_SIZE, and it sent as a 'small' command then
363 * we will need to increase the size of the TFD entries */ 366 * we will need to increase the size of the TFD entries */
@@ -422,7 +425,7 @@ int iwl4965_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd)
422 425
423static void iwl4965_set_rxon_hwcrypto(struct iwl_priv *priv, int hw_decrypt) 426static void iwl4965_set_rxon_hwcrypto(struct iwl_priv *priv, int hw_decrypt)
424{ 427{
425 struct iwl4965_rxon_cmd *rxon = &priv->staging_rxon; 428 struct iwl_rxon_cmd *rxon = &priv->staging_rxon;
426 429
427 if (hw_decrypt) 430 if (hw_decrypt)
428 rxon->filter_flags &= ~RXON_FILTER_DIS_DECRYPT_MSK; 431 rxon->filter_flags &= ~RXON_FILTER_DIS_DECRYPT_MSK;
@@ -470,7 +473,7 @@ static int iwl4965_rxon_add_station(struct iwl_priv *priv,
470 * be #ifdef'd out once the driver is stable and folks aren't actively 473 * be #ifdef'd out once the driver is stable and folks aren't actively
471 * making changes 474 * making changes
472 */ 475 */
473static int iwl4965_check_rxon_cmd(struct iwl4965_rxon_cmd *rxon) 476static int iwl4965_check_rxon_cmd(struct iwl_rxon_cmd *rxon)
474{ 477{
475 int error = 0; 478 int error = 0;
476 int counter = 1; 479 int counter = 1;
@@ -595,7 +598,7 @@ static int iwl4965_full_rxon_required(struct iwl_priv *priv)
595static int iwl4965_commit_rxon(struct iwl_priv *priv) 598static int iwl4965_commit_rxon(struct iwl_priv *priv)
596{ 599{
597 /* cast away the const for active_rxon in this function */ 600 /* cast away the const for active_rxon in this function */
598 struct iwl4965_rxon_cmd *active_rxon = (void *)&priv->active_rxon; 601 struct iwl_rxon_cmd *active_rxon = (void *)&priv->active_rxon;
599 DECLARE_MAC_BUF(mac); 602 DECLARE_MAC_BUF(mac);
600 int rc = 0; 603 int rc = 0;
601 604
@@ -640,7 +643,7 @@ static int iwl4965_commit_rxon(struct iwl_priv *priv)
640 active_rxon->filter_flags &= ~RXON_FILTER_ASSOC_MSK; 643 active_rxon->filter_flags &= ~RXON_FILTER_ASSOC_MSK;
641 644
642 rc = iwl_send_cmd_pdu(priv, REPLY_RXON, 645 rc = iwl_send_cmd_pdu(priv, REPLY_RXON,
643 sizeof(struct iwl4965_rxon_cmd), 646 sizeof(struct iwl_rxon_cmd),
644 &priv->active_rxon); 647 &priv->active_rxon);
645 648
646 /* If the mask clearing failed then we set 649 /* If the mask clearing failed then we set
@@ -665,7 +668,7 @@ static int iwl4965_commit_rxon(struct iwl_priv *priv)
665 iwl4965_set_rxon_hwcrypto(priv, !priv->hw_params.sw_crypto); 668 iwl4965_set_rxon_hwcrypto(priv, !priv->hw_params.sw_crypto);
666 /* Apply the new configuration */ 669 /* Apply the new configuration */
667 rc = iwl_send_cmd_pdu(priv, REPLY_RXON, 670 rc = iwl_send_cmd_pdu(priv, REPLY_RXON,
668 sizeof(struct iwl4965_rxon_cmd), &priv->staging_rxon); 671 sizeof(struct iwl_rxon_cmd), &priv->staging_rxon);
669 if (rc) { 672 if (rc) {
670 IWL_ERROR("Error setting new configuration (%d).\n", rc); 673 IWL_ERROR("Error setting new configuration (%d).\n", rc);
671 return rc; 674 return rc;
@@ -2699,7 +2702,7 @@ static void iwl4965_rx_reply_error(struct iwl_priv *priv,
2699static void iwl4965_rx_csa(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb) 2702static void iwl4965_rx_csa(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb)
2700{ 2703{
2701 struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data; 2704 struct iwl_rx_packet *pkt = (struct iwl_rx_packet *)rxb->skb->data;
2702 struct iwl4965_rxon_cmd *rxon = (void *)&priv->active_rxon; 2705 struct iwl_rxon_cmd *rxon = (void *)&priv->active_rxon;
2703 struct iwl4965_csa_notification *csa = &(pkt->u.csa_notif); 2706 struct iwl4965_csa_notification *csa = &(pkt->u.csa_notif);
2704 IWL_DEBUG_11H("CSA notif: channel %d, status %d\n", 2707 IWL_DEBUG_11H("CSA notif: channel %d, status %d\n",
2705 le16_to_cpu(csa->channel), le32_to_cpu(csa->status)); 2708 le16_to_cpu(csa->channel), le32_to_cpu(csa->status));
@@ -3317,7 +3320,7 @@ static int iwl4965_tx_queue_update_write_ptr(struct iwl_priv *priv,
3317#ifdef CONFIG_IWLWIFI_DEBUG 3320#ifdef CONFIG_IWLWIFI_DEBUG
3318static void iwl4965_print_rx_config_cmd(struct iwl_priv *priv) 3321static void iwl4965_print_rx_config_cmd(struct iwl_priv *priv)
3319{ 3322{
3320 struct iwl4965_rxon_cmd *rxon = &priv->staging_rxon; 3323 struct iwl_rxon_cmd *rxon = &priv->staging_rxon;
3321 DECLARE_MAC_BUF(mac); 3324 DECLARE_MAC_BUF(mac);
3322 3325
3323 IWL_DEBUG_RADIO("RX CONFIG:\n"); 3326 IWL_DEBUG_RADIO("RX CONFIG:\n");
@@ -4213,8 +4216,8 @@ static void iwl4965_alive_start(struct iwl_priv *priv)
4213 priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK; 4216 priv->active_rate_basic = priv->rates_mask & IWL_BASIC_RATES_MASK;
4214 4217
4215 if (iwl_is_associated(priv)) { 4218 if (iwl_is_associated(priv)) {
4216 struct iwl4965_rxon_cmd *active_rxon = 4219 struct iwl_rxon_cmd *active_rxon =
4217 (struct iwl4965_rxon_cmd *)(&priv->active_rxon); 4220 (struct iwl_rxon_cmd *)&priv->active_rxon;
4218 4221
4219 memcpy(&priv->staging_rxon, &priv->active_rxon, 4222 memcpy(&priv->staging_rxon, &priv->active_rxon,
4220 sizeof(priv->staging_rxon)); 4223 sizeof(priv->staging_rxon));
@@ -5021,7 +5024,7 @@ static int iwl4965_mac_start(struct ieee80211_hw *hw)
5021 /* we should be verifying the device is ready to be opened */ 5024 /* we should be verifying the device is ready to be opened */
5022 mutex_lock(&priv->mutex); 5025 mutex_lock(&priv->mutex);
5023 5026
5024 memset(&priv->staging_rxon, 0, sizeof(struct iwl4965_rxon_cmd)); 5027 memset(&priv->staging_rxon, 0, sizeof(struct iwl_rxon_cmd));
5025 /* fetch ucode file from disk, alloc and copy to bus-master buffers ... 5028 /* fetch ucode file from disk, alloc and copy to bus-master buffers ...
5026 * ucode filename and max sizes are card-specific. */ 5029 * ucode filename and max sizes are card-specific. */
5027 5030