diff options
author | David S. Miller <davem@davemloft.net> | 2010-02-27 05:05:54 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-02-27 05:05:54 -0500 |
commit | ce300c7ffa61165f9bfd16e511ee0cd4114977ab (patch) | |
tree | 874b57409bad0c9620a431272e6bf5c94e270253 /drivers/net | |
parent | 8266d7127c1b0bdf924066c19c71be4d351e9583 (diff) | |
parent | 9e3bd9190800e8209b4a3e1d724c35f0738dcad2 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/hw.c | 10 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/phy.h | 3 | ||||
-rw-r--r-- | drivers/net/wireless/b43/Kconfig | 17 | ||||
-rw-r--r-- | drivers/net/wireless/b43/b43.h | 7 | ||||
-rw-r--r-- | drivers/net/wireless/b43/main.c | 14 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 14 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-commands.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-dev.h | 3 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-rx.c | 46 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-tx.c | 11 |
10 files changed, 53 insertions, 73 deletions
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index f00f5c744f48..2e767cf22f1e 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
@@ -1310,6 +1310,16 @@ static void ath9k_hw_override_ini(struct ath_hw *ah, | |||
1310 | * Necessary to avoid issues on AR5416 2.0 | 1310 | * Necessary to avoid issues on AR5416 2.0 |
1311 | */ | 1311 | */ |
1312 | REG_WRITE(ah, 0x9800 + (651 << 2), 0x11); | 1312 | REG_WRITE(ah, 0x9800 + (651 << 2), 0x11); |
1313 | |||
1314 | /* | ||
1315 | * Disable RIFS search on some chips to avoid baseband | ||
1316 | * hang issues. | ||
1317 | */ | ||
1318 | if (AR_SREV_9100(ah) || AR_SREV_9160(ah)) { | ||
1319 | val = REG_READ(ah, AR_PHY_HEAVY_CLIP_FACTOR_RIFS); | ||
1320 | val &= ~AR_PHY_RIFS_INIT_DELAY; | ||
1321 | REG_WRITE(ah, AR_PHY_HEAVY_CLIP_FACTOR_RIFS, val); | ||
1322 | } | ||
1313 | } | 1323 | } |
1314 | 1324 | ||
1315 | static u32 ath9k_hw_def_ini_fixup(struct ath_hw *ah, | 1325 | static u32 ath9k_hw_def_ini_fixup(struct ath_hw *ah, |
diff --git a/drivers/net/wireless/ath/ath9k/phy.h b/drivers/net/wireless/ath/ath9k/phy.h index 31de27dc0c4a..0999a495fd46 100644 --- a/drivers/net/wireless/ath/ath9k/phy.h +++ b/drivers/net/wireless/ath/ath9k/phy.h | |||
@@ -384,6 +384,9 @@ bool ath9k_hw_set_rf_regs(struct ath_hw *ah, | |||
384 | 384 | ||
385 | #define AR_PHY_HEAVY_CLIP_ENABLE 0x99E0 | 385 | #define AR_PHY_HEAVY_CLIP_ENABLE 0x99E0 |
386 | 386 | ||
387 | #define AR_PHY_HEAVY_CLIP_FACTOR_RIFS 0x99EC | ||
388 | #define AR_PHY_RIFS_INIT_DELAY 0x03ff0000 | ||
389 | |||
387 | #define AR_PHY_M_SLEEP 0x99f0 | 390 | #define AR_PHY_M_SLEEP 0x99f0 |
388 | #define AR_PHY_REFCLKDLY 0x99f4 | 391 | #define AR_PHY_REFCLKDLY 0x99f4 |
389 | #define AR_PHY_REFCLKPD 0x99f8 | 392 | #define AR_PHY_REFCLKPD 0x99f8 |
diff --git a/drivers/net/wireless/b43/Kconfig b/drivers/net/wireless/b43/Kconfig index 073be566d05e..0a00d42642cd 100644 --- a/drivers/net/wireless/b43/Kconfig +++ b/drivers/net/wireless/b43/Kconfig | |||
@@ -3,7 +3,6 @@ config B43 | |||
3 | depends on SSB_POSSIBLE && MAC80211 && HAS_DMA | 3 | depends on SSB_POSSIBLE && MAC80211 && HAS_DMA |
4 | select SSB | 4 | select SSB |
5 | select FW_LOADER | 5 | select FW_LOADER |
6 | select SSB_BLOCKIO | ||
7 | ---help--- | 6 | ---help--- |
8 | b43 is a driver for the Broadcom 43xx series wireless devices. | 7 | b43 is a driver for the Broadcom 43xx series wireless devices. |
9 | 8 | ||
@@ -79,6 +78,14 @@ config B43_SDIO | |||
79 | 78 | ||
80 | If unsure, say N. | 79 | If unsure, say N. |
81 | 80 | ||
81 | #Data transfers to the device via PIO. We want it as a fallback even | ||
82 | # if we can do DMA. | ||
83 | config B43_PIO | ||
84 | bool | ||
85 | depends on B43 | ||
86 | select SSB_BLOCKIO | ||
87 | default y | ||
88 | |||
82 | config B43_NPHY | 89 | config B43_NPHY |
83 | bool "Pre IEEE 802.11n support (BROKEN)" | 90 | bool "Pre IEEE 802.11n support (BROKEN)" |
84 | depends on B43 && EXPERIMENTAL && BROKEN | 91 | depends on B43 && EXPERIMENTAL && BROKEN |
@@ -130,4 +137,12 @@ config B43_DEBUG | |||
130 | for production use. | 137 | for production use. |
131 | Only say Y, if you are debugging a problem in the b43 driver sourcecode. | 138 | Only say Y, if you are debugging a problem in the b43 driver sourcecode. |
132 | 139 | ||
140 | config B43_FORCE_PIO | ||
141 | bool "Force usage of PIO instead of DMA" | ||
142 | depends on B43 && B43_DEBUG | ||
143 | ---help--- | ||
144 | This will disable DMA and always enable PIO instead. | ||
133 | 145 | ||
146 | Say N! | ||
147 | This is only for debugging the PIO engine code. You do | ||
148 | _NOT_ want to enable this. | ||
diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h index 6a6ab0f630e5..b8807fb12c92 100644 --- a/drivers/net/wireless/b43/b43.h +++ b/drivers/net/wireless/b43/b43.h | |||
@@ -702,6 +702,7 @@ struct b43_wldev { | |||
702 | bool radio_hw_enable; /* saved state of radio hardware enabled state */ | 702 | bool radio_hw_enable; /* saved state of radio hardware enabled state */ |
703 | bool qos_enabled; /* TRUE, if QoS is used. */ | 703 | bool qos_enabled; /* TRUE, if QoS is used. */ |
704 | bool hwcrypto_enabled; /* TRUE, if HW crypto acceleration is enabled. */ | 704 | bool hwcrypto_enabled; /* TRUE, if HW crypto acceleration is enabled. */ |
705 | bool use_pio; /* TRUE if next init should use PIO */ | ||
705 | 706 | ||
706 | /* PHY/Radio device. */ | 707 | /* PHY/Radio device. */ |
707 | struct b43_phy phy; | 708 | struct b43_phy phy; |
@@ -886,6 +887,12 @@ static inline bool b43_using_pio_transfers(struct b43_wldev *dev) | |||
886 | return dev->__using_pio_transfers; | 887 | return dev->__using_pio_transfers; |
887 | } | 888 | } |
888 | 889 | ||
890 | #ifdef CONFIG_B43_FORCE_PIO | ||
891 | # define B43_PIO_DEFAULT 1 | ||
892 | #else | ||
893 | # define B43_PIO_DEFAULT 0 | ||
894 | #endif | ||
895 | |||
889 | /* Message printing */ | 896 | /* Message printing */ |
890 | void b43info(struct b43_wl *wl, const char *fmt, ...) | 897 | void b43info(struct b43_wl *wl, const char *fmt, ...) |
891 | __attribute__ ((format(printf, 2, 3))); | 898 | __attribute__ ((format(printf, 2, 3))); |
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index aa33d741e5e6..1521b1e78d21 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
@@ -107,9 +107,9 @@ int b43_modparam_verbose = B43_VERBOSITY_DEFAULT; | |||
107 | module_param_named(verbose, b43_modparam_verbose, int, 0644); | 107 | module_param_named(verbose, b43_modparam_verbose, int, 0644); |
108 | MODULE_PARM_DESC(verbose, "Log message verbosity: 0=error, 1=warn, 2=info(default), 3=debug"); | 108 | MODULE_PARM_DESC(verbose, "Log message verbosity: 0=error, 1=warn, 2=info(default), 3=debug"); |
109 | 109 | ||
110 | static int modparam_pio; | 110 | int b43_modparam_pio = B43_PIO_DEFAULT; |
111 | module_param_named(pio, modparam_pio, int, 0444); | 111 | module_param_named(pio, b43_modparam_pio, int, 0644); |
112 | MODULE_PARM_DESC(pio, "enable(1) / disable(0) PIO mode"); | 112 | MODULE_PARM_DESC(pio, "Use PIO accesses by default: 0=DMA, 1=PIO"); |
113 | 113 | ||
114 | static const struct ssb_device_id b43_ssb_tbl[] = { | 114 | static const struct ssb_device_id b43_ssb_tbl[] = { |
115 | SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 5), | 115 | SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 5), |
@@ -1804,8 +1804,9 @@ static void b43_do_interrupt_thread(struct b43_wldev *dev) | |||
1804 | dma_reason[4], dma_reason[5]); | 1804 | dma_reason[4], dma_reason[5]); |
1805 | b43err(dev->wl, "This device does not support DMA " | 1805 | b43err(dev->wl, "This device does not support DMA " |
1806 | "on your system. Please use PIO instead.\n"); | 1806 | "on your system. Please use PIO instead.\n"); |
1807 | b43err(dev->wl, "Unload the b43 module and reload " | 1807 | /* Fall back to PIO transfers if we get fatal DMA errors! */ |
1808 | "with 'pio=1'\n"); | 1808 | dev->use_pio = 1; |
1809 | b43_controller_restart(dev, "DMA error"); | ||
1809 | return; | 1810 | return; |
1810 | } | 1811 | } |
1811 | if (merged_dma_reason & B43_DMAIRQ_NONFATALMASK) { | 1812 | if (merged_dma_reason & B43_DMAIRQ_NONFATALMASK) { |
@@ -4357,7 +4358,7 @@ static int b43_wireless_core_init(struct b43_wldev *dev) | |||
4357 | 4358 | ||
4358 | if ((dev->dev->bus->bustype == SSB_BUSTYPE_PCMCIA) || | 4359 | if ((dev->dev->bus->bustype == SSB_BUSTYPE_PCMCIA) || |
4359 | (dev->dev->bus->bustype == SSB_BUSTYPE_SDIO) || | 4360 | (dev->dev->bus->bustype == SSB_BUSTYPE_SDIO) || |
4360 | modparam_pio) { | 4361 | dev->use_pio) { |
4361 | dev->__using_pio_transfers = 1; | 4362 | dev->__using_pio_transfers = 1; |
4362 | err = b43_pio_init(dev); | 4363 | err = b43_pio_init(dev); |
4363 | } else { | 4364 | } else { |
@@ -4824,6 +4825,7 @@ static int b43_one_core_attach(struct ssb_device *dev, struct b43_wl *wl) | |||
4824 | if (!wldev) | 4825 | if (!wldev) |
4825 | goto out; | 4826 | goto out; |
4826 | 4827 | ||
4828 | wldev->use_pio = b43_modparam_pio; | ||
4827 | wldev->dev = dev; | 4829 | wldev->dev = dev; |
4828 | wldev->wl = wl; | 4830 | wldev->wl = wl; |
4829 | b43_set_status(wldev, B43_STAT_UNINIT); | 4831 | b43_set_status(wldev, B43_STAT_UNINIT); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index af60b178ad4b..6aeb82b6992f 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -2941,21 +2941,10 @@ static int iwl_mac_ampdu_action(struct ieee80211_hw *hw, | |||
2941 | return ret; | 2941 | return ret; |
2942 | case IEEE80211_AMPDU_TX_START: | 2942 | case IEEE80211_AMPDU_TX_START: |
2943 | IWL_DEBUG_HT(priv, "start Tx\n"); | 2943 | IWL_DEBUG_HT(priv, "start Tx\n"); |
2944 | ret = iwl_tx_agg_start(priv, sta->addr, tid, ssn); | 2944 | return iwl_tx_agg_start(priv, sta->addr, tid, ssn); |
2945 | if (ret == 0) { | ||
2946 | priv->agg_tids_count++; | ||
2947 | IWL_DEBUG_HT(priv, "priv->agg_tids_count = %u\n", | ||
2948 | priv->agg_tids_count); | ||
2949 | } | ||
2950 | return ret; | ||
2951 | case IEEE80211_AMPDU_TX_STOP: | 2945 | case IEEE80211_AMPDU_TX_STOP: |
2952 | IWL_DEBUG_HT(priv, "stop Tx\n"); | 2946 | IWL_DEBUG_HT(priv, "stop Tx\n"); |
2953 | ret = iwl_tx_agg_stop(priv, sta->addr, tid); | 2947 | ret = iwl_tx_agg_stop(priv, sta->addr, tid); |
2954 | if ((ret == 0) && (priv->agg_tids_count > 0)) { | ||
2955 | priv->agg_tids_count--; | ||
2956 | IWL_DEBUG_HT(priv, "priv->agg_tids_count = %u\n", | ||
2957 | priv->agg_tids_count); | ||
2958 | } | ||
2959 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) | 2948 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) |
2960 | return 0; | 2949 | return 0; |
2961 | else | 2950 | else |
@@ -3376,7 +3365,6 @@ static int iwl_init_drv(struct iwl_priv *priv) | |||
3376 | priv->iw_mode = NL80211_IFTYPE_STATION; | 3365 | priv->iw_mode = NL80211_IFTYPE_STATION; |
3377 | priv->current_ht_config.smps = IEEE80211_SMPS_STATIC; | 3366 | priv->current_ht_config.smps = IEEE80211_SMPS_STATIC; |
3378 | priv->missed_beacon_threshold = IWL_MISSED_BEACON_THRESHOLD_DEF; | 3367 | priv->missed_beacon_threshold = IWL_MISSED_BEACON_THRESHOLD_DEF; |
3379 | priv->agg_tids_count = 0; | ||
3380 | 3368 | ||
3381 | /* initialize force reset */ | 3369 | /* initialize force reset */ |
3382 | priv->force_reset[IWL_RF_RESET].reset_duration = | 3370 | priv->force_reset[IWL_RF_RESET].reset_duration = |
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h index ab3c77b92cc8..6383d9f8c9b3 100644 --- a/drivers/net/wireless/iwlwifi/iwl-commands.h +++ b/drivers/net/wireless/iwlwifi/iwl-commands.h | |||
@@ -2623,6 +2623,7 @@ struct iwl_ssid_ie { | |||
2623 | #define TX_CMD_LIFE_TIME_INFINITE cpu_to_le32(0xFFFFFFFF) | 2623 | #define TX_CMD_LIFE_TIME_INFINITE cpu_to_le32(0xFFFFFFFF) |
2624 | #define IWL_GOOD_CRC_TH cpu_to_le16(1) | 2624 | #define IWL_GOOD_CRC_TH cpu_to_le16(1) |
2625 | #define IWL_MAX_SCAN_SIZE 1024 | 2625 | #define IWL_MAX_SCAN_SIZE 1024 |
2626 | #define IWL_MAX_CMD_SIZE 4096 | ||
2626 | #define IWL_MAX_PROBE_REQUEST 200 | 2627 | #define IWL_MAX_PROBE_REQUEST 200 |
2627 | 2628 | ||
2628 | /* | 2629 | /* |
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index 7914d65a5a55..ab891b958042 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | |||
@@ -1084,9 +1084,6 @@ struct iwl_priv { | |||
1084 | /* storing the jiffies when the plcp error rate is received */ | 1084 | /* storing the jiffies when the plcp error rate is received */ |
1085 | unsigned long plcp_jiffies; | 1085 | unsigned long plcp_jiffies; |
1086 | 1086 | ||
1087 | /* reporting the number of tids has AGG on. 0 means no AGGREGATION */ | ||
1088 | u8 agg_tids_count; | ||
1089 | |||
1090 | /* force reset */ | 1087 | /* force reset */ |
1091 | struct iwl_force_reset force_reset[IWL_MAX_FORCE_RESET]; | 1088 | struct iwl_force_reset force_reset[IWL_MAX_FORCE_RESET]; |
1092 | 1089 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c index 0d09f571e185..df257bc15f49 100644 --- a/drivers/net/wireless/iwlwifi/iwl-rx.c +++ b/drivers/net/wireless/iwlwifi/iwl-rx.c | |||
@@ -616,11 +616,6 @@ static void iwl_accumulative_statistics(struct iwl_priv *priv, | |||
616 | 616 | ||
617 | #define REG_RECALIB_PERIOD (60) | 617 | #define REG_RECALIB_PERIOD (60) |
618 | 618 | ||
619 | /* the threshold ratio of actual_ack_cnt to expected_ack_cnt in percent */ | ||
620 | #define ACK_CNT_RATIO (50) | ||
621 | #define BA_TIMEOUT_CNT (5) | ||
622 | #define BA_TIMEOUT_MAX (16) | ||
623 | |||
624 | #define PLCP_MSG "plcp_err exceeded %u, %u, %u, %u, %u, %d, %u mSecs\n" | 619 | #define PLCP_MSG "plcp_err exceeded %u, %u, %u, %u, %u, %d, %u mSecs\n" |
625 | void iwl_rx_statistics(struct iwl_priv *priv, | 620 | void iwl_rx_statistics(struct iwl_priv *priv, |
626 | struct iwl_rx_mem_buffer *rxb) | 621 | struct iwl_rx_mem_buffer *rxb) |
@@ -630,9 +625,6 @@ void iwl_rx_statistics(struct iwl_priv *priv, | |||
630 | int combined_plcp_delta; | 625 | int combined_plcp_delta; |
631 | unsigned int plcp_msec; | 626 | unsigned int plcp_msec; |
632 | unsigned long plcp_received_jiffies; | 627 | unsigned long plcp_received_jiffies; |
633 | int actual_ack_cnt_delta; | ||
634 | int expected_ack_cnt_delta; | ||
635 | int ba_timeout_delta; | ||
636 | 628 | ||
637 | IWL_DEBUG_RX(priv, "Statistics notification received (%d vs %d).\n", | 629 | IWL_DEBUG_RX(priv, "Statistics notification received (%d vs %d).\n", |
638 | (int)sizeof(priv->statistics), | 630 | (int)sizeof(priv->statistics), |
@@ -647,44 +639,6 @@ void iwl_rx_statistics(struct iwl_priv *priv, | |||
647 | #ifdef CONFIG_IWLWIFI_DEBUG | 639 | #ifdef CONFIG_IWLWIFI_DEBUG |
648 | iwl_accumulative_statistics(priv, (__le32 *)&pkt->u.stats); | 640 | iwl_accumulative_statistics(priv, (__le32 *)&pkt->u.stats); |
649 | #endif | 641 | #endif |
650 | actual_ack_cnt_delta = le32_to_cpu(pkt->u.stats.tx.actual_ack_cnt) - | ||
651 | le32_to_cpu(priv->statistics.tx.actual_ack_cnt); | ||
652 | expected_ack_cnt_delta = le32_to_cpu( | ||
653 | pkt->u.stats.tx.expected_ack_cnt) - | ||
654 | le32_to_cpu(priv->statistics.tx.expected_ack_cnt); | ||
655 | ba_timeout_delta = le32_to_cpu( | ||
656 | pkt->u.stats.tx.agg.ba_timeout) - | ||
657 | le32_to_cpu(priv->statistics.tx.agg.ba_timeout); | ||
658 | if ((priv->agg_tids_count > 0) && | ||
659 | (expected_ack_cnt_delta > 0) && | ||
660 | (((actual_ack_cnt_delta * 100) / expected_ack_cnt_delta) < | ||
661 | ACK_CNT_RATIO) && | ||
662 | (ba_timeout_delta > BA_TIMEOUT_CNT)) { | ||
663 | IWL_DEBUG_RADIO(priv, | ||
664 | "actual_ack_cnt delta = %d, expected_ack_cnt = %d\n", | ||
665 | actual_ack_cnt_delta, expected_ack_cnt_delta); | ||
666 | |||
667 | #ifdef CONFIG_IWLWIFI_DEBUG | ||
668 | IWL_DEBUG_RADIO(priv, "rx_detected_cnt delta = %d\n", | ||
669 | priv->delta_statistics.tx.rx_detected_cnt); | ||
670 | IWL_DEBUG_RADIO(priv, | ||
671 | "ack_or_ba_timeout_collision delta = %d\n", | ||
672 | priv->delta_statistics.tx.ack_or_ba_timeout_collision); | ||
673 | #endif | ||
674 | IWL_DEBUG_RADIO(priv, "agg ba_timeout delta = %d\n", | ||
675 | ba_timeout_delta); | ||
676 | if ((actual_ack_cnt_delta == 0) && | ||
677 | (ba_timeout_delta >= | ||
678 | BA_TIMEOUT_MAX)) { | ||
679 | IWL_DEBUG_RADIO(priv, | ||
680 | "call iwl_force_reset(IWL_FW_RESET)\n"); | ||
681 | iwl_force_reset(priv, IWL_FW_RESET); | ||
682 | } else { | ||
683 | IWL_DEBUG_RADIO(priv, | ||
684 | "call iwl_force_reset(IWL_RF_RESET)\n"); | ||
685 | iwl_force_reset(priv, IWL_RF_RESET); | ||
686 | } | ||
687 | } | ||
688 | /* | 642 | /* |
689 | * check for plcp_err and trigger radio reset if it exceeds | 643 | * check for plcp_err and trigger radio reset if it exceeds |
690 | * the plcp error threshold plcp_delta. | 644 | * the plcp error threshold plcp_delta. |
diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c index 10701b8eef23..1ed5206721ec 100644 --- a/drivers/net/wireless/iwlwifi/iwl-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-tx.c | |||
@@ -364,7 +364,7 @@ int iwl_tx_queue_init(struct iwl_priv *priv, struct iwl_tx_queue *txq, | |||
364 | for (i = 0; i < actual_slots; i++) { | 364 | for (i = 0; i < actual_slots; i++) { |
365 | /* only happens for cmd queue */ | 365 | /* only happens for cmd queue */ |
366 | if (i == slots_num) | 366 | if (i == slots_num) |
367 | len += IWL_MAX_SCAN_SIZE; | 367 | len = IWL_MAX_CMD_SIZE; |
368 | 368 | ||
369 | txq->cmd[i] = kmalloc(len, GFP_KERNEL); | 369 | txq->cmd[i] = kmalloc(len, GFP_KERNEL); |
370 | if (!txq->cmd[i]) | 370 | if (!txq->cmd[i]) |
@@ -1023,9 +1023,12 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) | |||
1023 | 1023 | ||
1024 | /* If any of the command structures end up being larger than | 1024 | /* If any of the command structures end up being larger than |
1025 | * the TFD_MAX_PAYLOAD_SIZE, and it sent as a 'small' command then | 1025 | * the TFD_MAX_PAYLOAD_SIZE, and it sent as a 'small' command then |
1026 | * we will need to increase the size of the TFD entries */ | 1026 | * we will need to increase the size of the TFD entries |
1027 | * Also, check to see if command buffer should not exceed the size | ||
1028 | * of device_cmd and max_cmd_size. */ | ||
1027 | BUG_ON((fix_size > TFD_MAX_PAYLOAD_SIZE) && | 1029 | BUG_ON((fix_size > TFD_MAX_PAYLOAD_SIZE) && |
1028 | !(cmd->flags & CMD_SIZE_HUGE)); | 1030 | !(cmd->flags & CMD_SIZE_HUGE)); |
1031 | BUG_ON(fix_size > IWL_MAX_CMD_SIZE); | ||
1029 | 1032 | ||
1030 | if (iwl_is_rfkill(priv) || iwl_is_ctkill(priv)) { | 1033 | if (iwl_is_rfkill(priv) || iwl_is_ctkill(priv)) { |
1031 | IWL_WARN(priv, "Not sending command - %s KILL\n", | 1034 | IWL_WARN(priv, "Not sending command - %s KILL\n", |
@@ -1069,8 +1072,8 @@ int iwl_enqueue_hcmd(struct iwl_priv *priv, struct iwl_host_cmd *cmd) | |||
1069 | if (cmd->flags & CMD_SIZE_HUGE) | 1072 | if (cmd->flags & CMD_SIZE_HUGE) |
1070 | out_cmd->hdr.sequence |= SEQ_HUGE_FRAME; | 1073 | out_cmd->hdr.sequence |= SEQ_HUGE_FRAME; |
1071 | len = sizeof(struct iwl_device_cmd); | 1074 | len = sizeof(struct iwl_device_cmd); |
1072 | len += (idx == TFD_CMD_SLOTS) ? IWL_MAX_SCAN_SIZE : 0; | 1075 | if (idx == TFD_CMD_SLOTS) |
1073 | 1076 | len = IWL_MAX_CMD_SIZE; | |
1074 | 1077 | ||
1075 | #ifdef CONFIG_IWLWIFI_DEBUG | 1078 | #ifdef CONFIG_IWLWIFI_DEBUG |
1076 | switch (out_cmd->hdr.cmd) { | 1079 | switch (out_cmd->hdr.cmd) { |