diff options
author | John W. Linville <linville@tuxdriver.com> | 2012-08-22 14:15:47 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-08-22 14:15:47 -0400 |
commit | 6de3f7e911d27d6737c79b3f6b5069044ea408ec (patch) | |
tree | 186dcf1897be76a4155f5a22a7f242c29f328c5a /drivers/net/wireless/iwlwifi/dvm | |
parent | 33dd7699cefd175c3a5d3d6077db9c8d8322c9a7 (diff) | |
parent | 40503f7b48260a91ab65a4f8b00a2c6f004fa807 (diff) |
Merge branch 'for-john' of git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next
Diffstat (limited to 'drivers/net/wireless/iwlwifi/dvm')
-rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/agn.h | 9 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/debugfs.c | 56 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/mac80211.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/main.c | 24 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/sta.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/tx.c | 2 |
6 files changed, 50 insertions, 45 deletions
diff --git a/drivers/net/wireless/iwlwifi/dvm/agn.h b/drivers/net/wireless/iwlwifi/dvm/agn.h index f0b8c1f7591c..75e12f29d9eb 100644 --- a/drivers/net/wireless/iwlwifi/dvm/agn.h +++ b/drivers/net/wireless/iwlwifi/dvm/agn.h | |||
@@ -487,16 +487,13 @@ static inline void iwl_dvm_set_pmi(struct iwl_priv *priv, bool state) | |||
487 | } | 487 | } |
488 | 488 | ||
489 | #ifdef CONFIG_IWLWIFI_DEBUGFS | 489 | #ifdef CONFIG_IWLWIFI_DEBUGFS |
490 | int iwl_dbgfs_register(struct iwl_priv *priv, const char *name); | 490 | int iwl_dbgfs_register(struct iwl_priv *priv, struct dentry *dbgfs_dir); |
491 | void iwl_dbgfs_unregister(struct iwl_priv *priv); | ||
492 | #else | 491 | #else |
493 | static inline int iwl_dbgfs_register(struct iwl_priv *priv, const char *name) | 492 | static inline int iwl_dbgfs_register(struct iwl_priv *priv, |
493 | struct dentry *dbgfs_dir) | ||
494 | { | 494 | { |
495 | return 0; | 495 | return 0; |
496 | } | 496 | } |
497 | static inline void iwl_dbgfs_unregister(struct iwl_priv *priv) | ||
498 | { | ||
499 | } | ||
500 | #endif /* CONFIG_IWLWIFI_DEBUGFS */ | 497 | #endif /* CONFIG_IWLWIFI_DEBUGFS */ |
501 | 498 | ||
502 | #ifdef CONFIG_IWLWIFI_DEBUG | 499 | #ifdef CONFIG_IWLWIFI_DEBUG |
diff --git a/drivers/net/wireless/iwlwifi/dvm/debugfs.c b/drivers/net/wireless/iwlwifi/dvm/debugfs.c index 46782f1102ac..ce826bc5f111 100644 --- a/drivers/net/wireless/iwlwifi/dvm/debugfs.c +++ b/drivers/net/wireless/iwlwifi/dvm/debugfs.c | |||
@@ -2349,24 +2349,19 @@ DEBUGFS_READ_WRITE_FILE_OPS(calib_disabled); | |||
2349 | * Create the debugfs files and directories | 2349 | * Create the debugfs files and directories |
2350 | * | 2350 | * |
2351 | */ | 2351 | */ |
2352 | int iwl_dbgfs_register(struct iwl_priv *priv, const char *name) | 2352 | int iwl_dbgfs_register(struct iwl_priv *priv, struct dentry *dbgfs_dir) |
2353 | { | 2353 | { |
2354 | struct dentry *phyd = priv->hw->wiphy->debugfsdir; | 2354 | struct dentry *dir_data, *dir_rf, *dir_debug; |
2355 | struct dentry *dir_drv, *dir_data, *dir_rf, *dir_debug; | ||
2356 | 2355 | ||
2357 | dir_drv = debugfs_create_dir(name, phyd); | 2356 | priv->debugfs_dir = dbgfs_dir; |
2358 | if (!dir_drv) | ||
2359 | return -ENOMEM; | ||
2360 | |||
2361 | priv->debugfs_dir = dir_drv; | ||
2362 | 2357 | ||
2363 | dir_data = debugfs_create_dir("data", dir_drv); | 2358 | dir_data = debugfs_create_dir("data", dbgfs_dir); |
2364 | if (!dir_data) | 2359 | if (!dir_data) |
2365 | goto err; | 2360 | goto err; |
2366 | dir_rf = debugfs_create_dir("rf", dir_drv); | 2361 | dir_rf = debugfs_create_dir("rf", dbgfs_dir); |
2367 | if (!dir_rf) | 2362 | if (!dir_rf) |
2368 | goto err; | 2363 | goto err; |
2369 | dir_debug = debugfs_create_dir("debug", dir_drv); | 2364 | dir_debug = debugfs_create_dir("debug", dbgfs_dir); |
2370 | if (!dir_debug) | 2365 | if (!dir_debug) |
2371 | goto err; | 2366 | goto err; |
2372 | 2367 | ||
@@ -2412,25 +2407,30 @@ int iwl_dbgfs_register(struct iwl_priv *priv, const char *name) | |||
2412 | /* Calibrations disabled/enabled status*/ | 2407 | /* Calibrations disabled/enabled status*/ |
2413 | DEBUGFS_ADD_FILE(calib_disabled, dir_rf, S_IWUSR | S_IRUSR); | 2408 | DEBUGFS_ADD_FILE(calib_disabled, dir_rf, S_IWUSR | S_IRUSR); |
2414 | 2409 | ||
2415 | if (iwl_trans_dbgfs_register(priv->trans, dir_debug)) | 2410 | /* |
2416 | goto err; | 2411 | * Create a symlink with mac80211. This is not very robust, as it does |
2412 | * not remove the symlink created. The implicit assumption is that | ||
2413 | * when the opmode exits, mac80211 will also exit, and will remove | ||
2414 | * this symlink as part of its cleanup. | ||
2415 | */ | ||
2416 | if (priv->mac80211_registered) { | ||
2417 | char buf[100]; | ||
2418 | struct dentry *mac80211_dir, *dev_dir, *root_dir; | ||
2419 | |||
2420 | dev_dir = dbgfs_dir->d_parent; | ||
2421 | root_dir = dev_dir->d_parent; | ||
2422 | mac80211_dir = priv->hw->wiphy->debugfsdir; | ||
2423 | |||
2424 | snprintf(buf, 100, "../../%s/%s", root_dir->d_name.name, | ||
2425 | dev_dir->d_name.name); | ||
2426 | |||
2427 | if (!debugfs_create_symlink("iwlwifi", mac80211_dir, buf)) | ||
2428 | goto err; | ||
2429 | } | ||
2430 | |||
2417 | return 0; | 2431 | return 0; |
2418 | 2432 | ||
2419 | err: | 2433 | err: |
2420 | IWL_ERR(priv, "Can't create the debugfs directory\n"); | 2434 | IWL_ERR(priv, "failed to create the dvm debugfs entries\n"); |
2421 | iwl_dbgfs_unregister(priv); | ||
2422 | return -ENOMEM; | 2435 | return -ENOMEM; |
2423 | } | 2436 | } |
2424 | |||
2425 | /** | ||
2426 | * Remove the debugfs files and directories | ||
2427 | * | ||
2428 | */ | ||
2429 | void iwl_dbgfs_unregister(struct iwl_priv *priv) | ||
2430 | { | ||
2431 | if (!priv->debugfs_dir) | ||
2432 | return; | ||
2433 | |||
2434 | debugfs_remove_recursive(priv->debugfs_dir); | ||
2435 | priv->debugfs_dir = NULL; | ||
2436 | } | ||
diff --git a/drivers/net/wireless/iwlwifi/dvm/mac80211.c b/drivers/net/wireless/iwlwifi/dvm/mac80211.c index e64af60a37c1..ff8162d4c454 100644 --- a/drivers/net/wireless/iwlwifi/dvm/mac80211.c +++ b/drivers/net/wireless/iwlwifi/dvm/mac80211.c | |||
@@ -195,7 +195,7 @@ int iwlagn_mac_setup_register(struct iwl_priv *priv, | |||
195 | ARRAY_SIZE(iwlagn_iface_combinations_dualmode); | 195 | ARRAY_SIZE(iwlagn_iface_combinations_dualmode); |
196 | } | 196 | } |
197 | 197 | ||
198 | hw->wiphy->max_remain_on_channel_duration = 1000; | 198 | hw->wiphy->max_remain_on_channel_duration = 500; |
199 | 199 | ||
200 | hw->wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY | | 200 | hw->wiphy->flags |= WIPHY_FLAG_CUSTOM_REGULATORY | |
201 | WIPHY_FLAG_DISABLE_BEACON_HINTS | | 201 | WIPHY_FLAG_DISABLE_BEACON_HINTS | |
diff --git a/drivers/net/wireless/iwlwifi/dvm/main.c b/drivers/net/wireless/iwlwifi/dvm/main.c index 84d3db5aa506..7ff3f1430678 100644 --- a/drivers/net/wireless/iwlwifi/dvm/main.c +++ b/drivers/net/wireless/iwlwifi/dvm/main.c | |||
@@ -862,7 +862,8 @@ void iwl_down(struct iwl_priv *priv) | |||
862 | * No race since we hold the mutex here and a new one | 862 | * No race since we hold the mutex here and a new one |
863 | * can't come in at this time. | 863 | * can't come in at this time. |
864 | */ | 864 | */ |
865 | ieee80211_remain_on_channel_expired(priv->hw); | 865 | if (priv->ucode_loaded && priv->cur_ucode != IWL_UCODE_INIT) |
866 | ieee80211_remain_on_channel_expired(priv->hw); | ||
866 | 867 | ||
867 | exit_pending = | 868 | exit_pending = |
868 | test_and_set_bit(STATUS_EXIT_PENDING, &priv->status); | 869 | test_and_set_bit(STATUS_EXIT_PENDING, &priv->status); |
@@ -994,7 +995,11 @@ static void iwl_bg_restart(struct work_struct *data) | |||
994 | iwlagn_prepare_restart(priv); | 995 | iwlagn_prepare_restart(priv); |
995 | mutex_unlock(&priv->mutex); | 996 | mutex_unlock(&priv->mutex); |
996 | iwl_cancel_deferred_work(priv); | 997 | iwl_cancel_deferred_work(priv); |
997 | ieee80211_restart_hw(priv->hw); | 998 | if (priv->mac80211_registered) |
999 | ieee80211_restart_hw(priv->hw); | ||
1000 | else | ||
1001 | IWL_ERR(priv, | ||
1002 | "Cannot request restart before registrating with mac80211"); | ||
998 | } else { | 1003 | } else { |
999 | WARN_ON(1); | 1004 | WARN_ON(1); |
1000 | } | 1005 | } |
@@ -1222,7 +1227,8 @@ static int iwl_eeprom_init_hw_params(struct iwl_priv *priv) | |||
1222 | 1227 | ||
1223 | static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans, | 1228 | static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans, |
1224 | const struct iwl_cfg *cfg, | 1229 | const struct iwl_cfg *cfg, |
1225 | const struct iwl_fw *fw) | 1230 | const struct iwl_fw *fw, |
1231 | struct dentry *dbgfs_dir) | ||
1226 | { | 1232 | { |
1227 | struct iwl_priv *priv; | 1233 | struct iwl_priv *priv; |
1228 | struct ieee80211_hw *hw; | 1234 | struct ieee80211_hw *hw; |
@@ -1466,13 +1472,17 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans, | |||
1466 | if (iwlagn_mac_setup_register(priv, &fw->ucode_capa)) | 1472 | if (iwlagn_mac_setup_register(priv, &fw->ucode_capa)) |
1467 | goto out_destroy_workqueue; | 1473 | goto out_destroy_workqueue; |
1468 | 1474 | ||
1469 | if (iwl_dbgfs_register(priv, DRV_NAME)) | 1475 | if (iwl_dbgfs_register(priv, dbgfs_dir)) |
1470 | IWL_ERR(priv, | 1476 | goto out_mac80211_unregister; |
1471 | "failed to create debugfs files. Ignoring error\n"); | ||
1472 | 1477 | ||
1473 | return op_mode; | 1478 | return op_mode; |
1474 | 1479 | ||
1480 | out_mac80211_unregister: | ||
1481 | iwlagn_mac_unregister(priv); | ||
1475 | out_destroy_workqueue: | 1482 | out_destroy_workqueue: |
1483 | iwl_tt_exit(priv); | ||
1484 | iwl_testmode_free(priv); | ||
1485 | iwl_cancel_deferred_work(priv); | ||
1476 | destroy_workqueue(priv->workqueue); | 1486 | destroy_workqueue(priv->workqueue); |
1477 | priv->workqueue = NULL; | 1487 | priv->workqueue = NULL; |
1478 | iwl_uninit_drv(priv); | 1488 | iwl_uninit_drv(priv); |
@@ -1493,8 +1503,6 @@ static void iwl_op_mode_dvm_stop(struct iwl_op_mode *op_mode) | |||
1493 | 1503 | ||
1494 | IWL_DEBUG_INFO(priv, "*** UNLOAD DRIVER ***\n"); | 1504 | IWL_DEBUG_INFO(priv, "*** UNLOAD DRIVER ***\n"); |
1495 | 1505 | ||
1496 | iwl_dbgfs_unregister(priv); | ||
1497 | |||
1498 | iwl_testmode_free(priv); | 1506 | iwl_testmode_free(priv); |
1499 | iwlagn_mac_unregister(priv); | 1507 | iwlagn_mac_unregister(priv); |
1500 | 1508 | ||
diff --git a/drivers/net/wireless/iwlwifi/dvm/sta.c b/drivers/net/wireless/iwlwifi/dvm/sta.c index b29b798f7550..fe36a38f3505 100644 --- a/drivers/net/wireless/iwlwifi/dvm/sta.c +++ b/drivers/net/wireless/iwlwifi/dvm/sta.c | |||
@@ -150,7 +150,7 @@ int iwl_send_add_sta(struct iwl_priv *priv, | |||
150 | sta_id, sta->sta.addr, flags & CMD_ASYNC ? "a" : ""); | 150 | sta_id, sta->sta.addr, flags & CMD_ASYNC ? "a" : ""); |
151 | 151 | ||
152 | if (!(flags & CMD_ASYNC)) { | 152 | if (!(flags & CMD_ASYNC)) { |
153 | cmd.flags |= CMD_WANT_SKB; | 153 | cmd.flags |= CMD_WANT_SKB | CMD_WANT_HCMD; |
154 | might_sleep(); | 154 | might_sleep(); |
155 | } | 155 | } |
156 | 156 | ||
diff --git a/drivers/net/wireless/iwlwifi/dvm/tx.c b/drivers/net/wireless/iwlwifi/dvm/tx.c index d17799b316d7..f5ca73a89870 100644 --- a/drivers/net/wireless/iwlwifi/dvm/tx.c +++ b/drivers/net/wireless/iwlwifi/dvm/tx.c | |||
@@ -433,7 +433,7 @@ int iwlagn_tx_skb(struct iwl_priv *priv, | |||
433 | * only. Check this here. | 433 | * only. Check this here. |
434 | */ | 434 | */ |
435 | if (WARN_ONCE(tid_data->agg.state != IWL_AGG_ON && | 435 | if (WARN_ONCE(tid_data->agg.state != IWL_AGG_ON && |
436 | tid_data->agg.state != IWL_AGG_OFF, | 436 | tid_data->agg.state != IWL_AGG_OFF, |
437 | "Tx while agg.state = %d", tid_data->agg.state)) | 437 | "Tx while agg.state = %d", tid_data->agg.state)) |
438 | goto drop_unlock_sta; | 438 | goto drop_unlock_sta; |
439 | 439 | ||