diff options
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-agn.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-commands.h | 25 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-debug.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-debugfs.c | 46 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-dev.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-rx.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl3945-base.c | 1 |
7 files changed, 74 insertions, 6 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 62b6939df52e..e9f786443d1f 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -3372,6 +3372,7 @@ static int iwl_init_drv(struct iwl_priv *priv) | |||
3372 | 3372 | ||
3373 | priv->iw_mode = NL80211_IFTYPE_STATION; | 3373 | priv->iw_mode = NL80211_IFTYPE_STATION; |
3374 | priv->current_ht_config.smps = IEEE80211_SMPS_STATIC; | 3374 | priv->current_ht_config.smps = IEEE80211_SMPS_STATIC; |
3375 | priv->missed_beacon_threshold = IWL_MISSED_BEACON_THRESHOLD_DEF; | ||
3375 | 3376 | ||
3376 | /* Choose which receivers/antennas to use */ | 3377 | /* Choose which receivers/antennas to use */ |
3377 | if (priv->cfg->ops->hcmd->set_rxon_chain) | 3378 | if (priv->cfg->ops->hcmd->set_rxon_chain) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h index cee5fb2187c8..8823d18b9f43 100644 --- a/drivers/net/wireless/iwlwifi/iwl-commands.h +++ b/drivers/net/wireless/iwlwifi/iwl-commands.h | |||
@@ -3165,13 +3165,30 @@ struct iwl_notif_statistics { | |||
3165 | 3165 | ||
3166 | /* | 3166 | /* |
3167 | * MISSED_BEACONS_NOTIFICATION = 0xa2 (notification only, not a command) | 3167 | * MISSED_BEACONS_NOTIFICATION = 0xa2 (notification only, not a command) |
3168 | * | ||
3169 | * uCode send MISSED_BEACONS_NOTIFICATION to driver when detect beacon missed | ||
3170 | * in regardless of how many missed beacons, which mean when driver receive the | ||
3171 | * notification, inside the command, it can find all the beacons information | ||
3172 | * which include number of total missed beacons, number of consecutive missed | ||
3173 | * beacons, number of beacons received and number of beacons expected to | ||
3174 | * receive. | ||
3175 | * | ||
3176 | * If uCode detected consecutive_missed_beacons > 5, it will reset the radio | ||
3177 | * in order to bring the radio/PHY back to working state; which has no relation | ||
3178 | * to when driver will perform sensitivity calibration. | ||
3179 | * | ||
3180 | * Driver should set it own missed_beacon_threshold to decide when to perform | ||
3181 | * sensitivity calibration based on number of consecutive missed beacons in | ||
3182 | * order to improve overall performance, especially in noisy environment. | ||
3183 | * | ||
3168 | */ | 3184 | */ |
3169 | /* if ucode missed CONSECUTIVE_MISSED_BCONS_TH beacons in a row, | 3185 | |
3170 | * then this notification will be sent. */ | 3186 | #define IWL_MISSED_BEACON_THRESHOLD_MIN (1) |
3171 | #define CONSECUTIVE_MISSED_BCONS_TH 20 | 3187 | #define IWL_MISSED_BEACON_THRESHOLD_DEF (5) |
3188 | #define IWL_MISSED_BEACON_THRESHOLD_MAX IWL_MISSED_BEACON_THRESHOLD_DEF | ||
3172 | 3189 | ||
3173 | struct iwl_missed_beacon_notif { | 3190 | struct iwl_missed_beacon_notif { |
3174 | __le32 consequtive_missed_beacons; | 3191 | __le32 consecutive_missed_beacons; |
3175 | __le32 total_missed_becons; | 3192 | __le32 total_missed_becons; |
3176 | __le32 num_expected_beacons; | 3193 | __le32 num_expected_beacons; |
3177 | __le32 num_recvd_beacons; | 3194 | __le32 num_recvd_beacons; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-debug.h b/drivers/net/wireless/iwlwifi/iwl-debug.h index 0facaca9b40b..36b558f23325 100644 --- a/drivers/net/wireless/iwlwifi/iwl-debug.h +++ b/drivers/net/wireless/iwlwifi/iwl-debug.h | |||
@@ -112,6 +112,7 @@ struct iwl_debugfs { | |||
112 | struct dentry *file_csr; | 112 | struct dentry *file_csr; |
113 | struct dentry *file_ucode_tracing; | 113 | struct dentry *file_ucode_tracing; |
114 | struct dentry *file_fh_reg; | 114 | struct dentry *file_fh_reg; |
115 | struct dentry *file_missed_beacon; | ||
115 | } dbgfs_debug_files; | 116 | } dbgfs_debug_files; |
116 | u32 sram_offset; | 117 | u32 sram_offset; |
117 | u32 sram_len; | 118 | u32 sram_len; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-debugfs.c b/drivers/net/wireless/iwlwifi/iwl-debugfs.c index af00ad2afa14..02f80bc21307 100644 --- a/drivers/net/wireless/iwlwifi/iwl-debugfs.c +++ b/drivers/net/wireless/iwlwifi/iwl-debugfs.c | |||
@@ -2131,6 +2131,49 @@ static ssize_t iwl_dbgfs_fh_reg_read(struct file *file, | |||
2131 | return ret; | 2131 | return ret; |
2132 | } | 2132 | } |
2133 | 2133 | ||
2134 | static ssize_t iwl_dbgfs_missed_beacon_read(struct file *file, | ||
2135 | char __user *user_buf, | ||
2136 | size_t count, loff_t *ppos) { | ||
2137 | |||
2138 | struct iwl_priv *priv = file->private_data; | ||
2139 | int pos = 0; | ||
2140 | char buf[12]; | ||
2141 | const size_t bufsz = sizeof(buf); | ||
2142 | ssize_t ret; | ||
2143 | |||
2144 | pos += scnprintf(buf + pos, bufsz - pos, "%d\n", | ||
2145 | priv->missed_beacon_threshold); | ||
2146 | |||
2147 | ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); | ||
2148 | return ret; | ||
2149 | } | ||
2150 | |||
2151 | static ssize_t iwl_dbgfs_missed_beacon_write(struct file *file, | ||
2152 | const char __user *user_buf, | ||
2153 | size_t count, loff_t *ppos) | ||
2154 | { | ||
2155 | struct iwl_priv *priv = file->private_data; | ||
2156 | char buf[8]; | ||
2157 | int buf_size; | ||
2158 | int missed; | ||
2159 | |||
2160 | memset(buf, 0, sizeof(buf)); | ||
2161 | buf_size = min(count, sizeof(buf) - 1); | ||
2162 | if (copy_from_user(buf, user_buf, buf_size)) | ||
2163 | return -EFAULT; | ||
2164 | if (sscanf(buf, "%d", &missed) != 1) | ||
2165 | return -EINVAL; | ||
2166 | |||
2167 | if (missed < IWL_MISSED_BEACON_THRESHOLD_MIN || | ||
2168 | missed > IWL_MISSED_BEACON_THRESHOLD_MAX) | ||
2169 | priv->missed_beacon_threshold = | ||
2170 | IWL_MISSED_BEACON_THRESHOLD_DEF; | ||
2171 | else | ||
2172 | priv->missed_beacon_threshold = missed; | ||
2173 | |||
2174 | return count; | ||
2175 | } | ||
2176 | |||
2134 | DEBUGFS_READ_FILE_OPS(rx_statistics); | 2177 | DEBUGFS_READ_FILE_OPS(rx_statistics); |
2135 | DEBUGFS_READ_FILE_OPS(tx_statistics); | 2178 | DEBUGFS_READ_FILE_OPS(tx_statistics); |
2136 | DEBUGFS_READ_WRITE_FILE_OPS(traffic_log); | 2179 | DEBUGFS_READ_WRITE_FILE_OPS(traffic_log); |
@@ -2148,6 +2191,7 @@ DEBUGFS_WRITE_FILE_OPS(clear_traffic_statistics); | |||
2148 | DEBUGFS_WRITE_FILE_OPS(csr); | 2191 | DEBUGFS_WRITE_FILE_OPS(csr); |
2149 | DEBUGFS_READ_WRITE_FILE_OPS(ucode_tracing); | 2192 | DEBUGFS_READ_WRITE_FILE_OPS(ucode_tracing); |
2150 | DEBUGFS_READ_FILE_OPS(fh_reg); | 2193 | DEBUGFS_READ_FILE_OPS(fh_reg); |
2194 | DEBUGFS_READ_WRITE_FILE_OPS(missed_beacon); | ||
2151 | 2195 | ||
2152 | /* | 2196 | /* |
2153 | * Create the debugfs files and directories | 2197 | * Create the debugfs files and directories |
@@ -2200,6 +2244,7 @@ int iwl_dbgfs_register(struct iwl_priv *priv, const char *name) | |||
2200 | DEBUGFS_ADD_FILE(clear_traffic_statistics, debug, S_IWUSR); | 2244 | DEBUGFS_ADD_FILE(clear_traffic_statistics, debug, S_IWUSR); |
2201 | DEBUGFS_ADD_FILE(csr, debug, S_IWUSR); | 2245 | DEBUGFS_ADD_FILE(csr, debug, S_IWUSR); |
2202 | DEBUGFS_ADD_FILE(fh_reg, debug, S_IRUSR); | 2246 | DEBUGFS_ADD_FILE(fh_reg, debug, S_IRUSR); |
2247 | DEBUGFS_ADD_FILE(missed_beacon, debug, S_IWUSR); | ||
2203 | if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) != CSR_HW_REV_TYPE_3945) { | 2248 | if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) != CSR_HW_REV_TYPE_3945) { |
2204 | DEBUGFS_ADD_FILE(ucode_rx_stats, debug, S_IRUSR); | 2249 | DEBUGFS_ADD_FILE(ucode_rx_stats, debug, S_IRUSR); |
2205 | DEBUGFS_ADD_FILE(ucode_tx_stats, debug, S_IRUSR); | 2250 | DEBUGFS_ADD_FILE(ucode_tx_stats, debug, S_IRUSR); |
@@ -2260,6 +2305,7 @@ void iwl_dbgfs_unregister(struct iwl_priv *priv) | |||
2260 | file_clear_traffic_statistics); | 2305 | file_clear_traffic_statistics); |
2261 | DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_csr); | 2306 | DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_csr); |
2262 | DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_fh_reg); | 2307 | DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_fh_reg); |
2308 | DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files.file_missed_beacon); | ||
2263 | if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) != CSR_HW_REV_TYPE_3945) { | 2309 | if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) != CSR_HW_REV_TYPE_3945) { |
2264 | DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files. | 2310 | DEBUGFS_REMOVE(priv->dbgfs->dbgfs_debug_files. |
2265 | file_ucode_rx_stats); | 2311 | file_ucode_rx_stats); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index c6310b0b2f12..5e06e666f176 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | |||
@@ -1053,6 +1053,7 @@ struct iwl_priv { | |||
1053 | #endif | 1053 | #endif |
1054 | /* ucode beacon time */ | 1054 | /* ucode beacon time */ |
1055 | u32 ucode_beacon_time; | 1055 | u32 ucode_beacon_time; |
1056 | int missed_beacon_threshold; | ||
1056 | 1057 | ||
1057 | /* we allocate array of iwl4965_channel_info for NIC's valid channels. | 1058 | /* we allocate array of iwl4965_channel_info for NIC's valid channels. |
1058 | * Access via channel # using indirect index array */ | 1059 | * Access via channel # using indirect index array */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c index eb45f8be0746..dc06c7bb0f5c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-rx.c +++ b/drivers/net/wireless/iwlwifi/iwl-rx.c | |||
@@ -499,9 +499,10 @@ void iwl_rx_missed_beacon_notif(struct iwl_priv *priv, | |||
499 | struct iwl_missed_beacon_notif *missed_beacon; | 499 | struct iwl_missed_beacon_notif *missed_beacon; |
500 | 500 | ||
501 | missed_beacon = &pkt->u.missed_beacon; | 501 | missed_beacon = &pkt->u.missed_beacon; |
502 | if (le32_to_cpu(missed_beacon->consequtive_missed_beacons) > 5) { | 502 | if (le32_to_cpu(missed_beacon->consecutive_missed_beacons) > |
503 | priv->missed_beacon_threshold) { | ||
503 | IWL_DEBUG_CALIB(priv, "missed bcn cnsq %d totl %d rcd %d expctd %d\n", | 504 | IWL_DEBUG_CALIB(priv, "missed bcn cnsq %d totl %d rcd %d expctd %d\n", |
504 | le32_to_cpu(missed_beacon->consequtive_missed_beacons), | 505 | le32_to_cpu(missed_beacon->consecutive_missed_beacons), |
505 | le32_to_cpu(missed_beacon->total_missed_becons), | 506 | le32_to_cpu(missed_beacon->total_missed_becons), |
506 | le32_to_cpu(missed_beacon->num_recvd_beacons), | 507 | le32_to_cpu(missed_beacon->num_recvd_beacons), |
507 | le32_to_cpu(missed_beacon->num_expected_beacons)); | 508 | le32_to_cpu(missed_beacon->num_expected_beacons)); |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index c46f988d0a5b..9c0b6ebbdc59 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -3881,6 +3881,7 @@ static int iwl3945_init_drv(struct iwl_priv *priv) | |||
3881 | priv->band = IEEE80211_BAND_2GHZ; | 3881 | priv->band = IEEE80211_BAND_2GHZ; |
3882 | 3882 | ||
3883 | priv->iw_mode = NL80211_IFTYPE_STATION; | 3883 | priv->iw_mode = NL80211_IFTYPE_STATION; |
3884 | priv->missed_beacon_threshold = IWL_MISSED_BEACON_THRESHOLD_DEF; | ||
3884 | 3885 | ||
3885 | iwl_reset_qos(priv); | 3886 | iwl_reset_qos(priv); |
3886 | 3887 | ||