linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [RFT 0/3] driver rfkill to cfg80211 ports
@ 2009-06-02 11:10 Johannes Berg
  2009-06-02 11:10 ` [RFT 1/3] iwlwifi: port to cfg80211 rfkill Johannes Berg
                   ` (2 more replies)
  0 siblings, 3 replies; 24+ messages in thread
From: Johannes Berg @ 2009-06-02 11:10 UTC (permalink / raw)
  To: linux-wireless

This ports all drivers that have rfkill to cfg80211's rfkill integration.

johannes


^ permalink raw reply	[flat|nested] 24+ messages in thread

* [RFT 1/3] iwlwifi: port to cfg80211 rfkill
  2009-06-02 11:10 [RFT 0/3] driver rfkill to cfg80211 ports Johannes Berg
@ 2009-06-02 11:10 ` Johannes Berg
  2009-06-03 21:12   ` reinette chatre
  2009-06-02 11:10 ` [RFT 2/3] ath9k: " Johannes Berg
  2009-06-02 11:10 ` [RFT 3/3] b43/legacy: " Johannes Berg
  2 siblings, 1 reply; 24+ messages in thread
From: Johannes Berg @ 2009-06-02 11:10 UTC (permalink / raw)
  To: linux-wireless; +Cc: Reinette Chatre

This ports the iwlwifi rfkill code to the new API offered by
cfg80211 and thus removes a lot of useless stuff. The soft-
rfkill is completely removed since that is now handled by
setting the interfaces down.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Cc: Reinette Chatre <reinette.chatre@intel.com>
---
 drivers/net/wireless/iwlwifi/Kconfig        |    4 
 drivers/net/wireless/iwlwifi/Makefile       |    1 
 drivers/net/wireless/iwlwifi/iwl-3945.h     |    5 -
 drivers/net/wireless/iwlwifi/iwl-agn.c      |   42 ++------
 drivers/net/wireless/iwlwifi/iwl-core.c     |  138 ----------------------------
 drivers/net/wireless/iwlwifi/iwl-core.h     |   16 ---
 drivers/net/wireless/iwlwifi/iwl-debugfs.c  |    2 
 drivers/net/wireless/iwlwifi/iwl-dev.h      |    5 -
 drivers/net/wireless/iwlwifi/iwl-rfkill.c   |  131 --------------------------
 drivers/net/wireless/iwlwifi/iwl-rfkill.h   |   48 ---------
 drivers/net/wireless/iwlwifi/iwl3945-base.c |   41 +-------
 11 files changed, 19 insertions(+), 414 deletions(-)

--- wireless-testing.orig/drivers/net/wireless/iwlwifi/Kconfig	2009-06-02 12:53:44.000000000 +0200
+++ wireless-testing/drivers/net/wireless/iwlwifi/Kconfig	2009-06-02 12:56:07.000000000 +0200
@@ -10,10 +10,6 @@ config IWLWIFI_LEDS
 	bool "Enable LED support in iwlagn and iwl3945 drivers"
 	depends on IWLWIFI
 
-config IWLWIFI_RFKILL
-	def_bool y
-	depends on IWLWIFI && RFKILL
-
 config IWLWIFI_SPECTRUM_MEASUREMENT
 	bool "Enable Spectrum Measurement in iwlagn driver"
 	depends on IWLWIFI
--- wireless-testing.orig/drivers/net/wireless/iwlwifi/iwl-3945.h	2009-06-02 12:53:58.000000000 +0200
+++ wireless-testing/drivers/net/wireless/iwlwifi/iwl-3945.h	2009-06-02 12:56:07.000000000 +0200
@@ -36,10 +36,6 @@
 #include <linux/kernel.h>
 #include <net/ieee80211_radiotap.h>
 
-/*used for rfkill*/
-#include <linux/rfkill.h>
-#include <linux/input.h>
-
 /* Hardware specific file defines the PCI IDs table for that hardware module */
 extern struct pci_device_id iwl3945_hw_card_ids[];
 
@@ -155,7 +151,6 @@ struct iwl3945_frame {
 #define STATUS_HCMD_SYNC_ACTIVE	1	/* sync host command in progress */
 #define STATUS_INT_ENABLED	2
 #define STATUS_RF_KILL_HW	3
-#define STATUS_RF_KILL_SW	4
 #define STATUS_INIT		5
 #define STATUS_ALIVE		6
 #define STATUS_READY		7
--- wireless-testing.orig/drivers/net/wireless/iwlwifi/iwl-agn.c	2009-06-02 12:53:58.000000000 +0200
+++ wireless-testing/drivers/net/wireless/iwlwifi/iwl-agn.c	2009-06-02 12:56:07.000000000 +0200
@@ -737,19 +737,13 @@ static void iwl_rx_card_state_notif(stru
 		clear_bit(STATUS_RF_KILL_HW, &priv->status);
 
 
-	if (flags & SW_CARD_DISABLED)
-		set_bit(STATUS_RF_KILL_SW, &priv->status);
-	else
-		clear_bit(STATUS_RF_KILL_SW, &priv->status);
-
 	if (!(flags & RXON_CARD_DISABLED))
 		iwl_scan_cancel(priv);
 
 	if ((test_bit(STATUS_RF_KILL_HW, &status) !=
-	     test_bit(STATUS_RF_KILL_HW, &priv->status)) ||
-	    (test_bit(STATUS_RF_KILL_SW, &status) !=
-	     test_bit(STATUS_RF_KILL_SW, &priv->status)))
-		queue_work(priv->workqueue, &priv->rf_kill);
+	     test_bit(STATUS_RF_KILL_HW, &priv->status)))
+		wiphy_rfkill_set_hw_state(priv->hw->wiphy,
+			test_bit(STATUS_RF_KILL_HW, &priv->status));
 	else
 		wake_up_interruptible(&priv->wait_command_queue);
 }
@@ -1045,7 +1039,7 @@ static void iwl_irq_tasklet_legacy(struc
 				set_bit(STATUS_RF_KILL_HW, &priv->status);
 			else
 				clear_bit(STATUS_RF_KILL_HW, &priv->status);
-			queue_work(priv->workqueue, &priv->rf_kill);
+			wiphy_rfkill_set_hw_state(priv->hw->wiphy, hw_rf_kill);
 		}
 
 		handled |= CSR_INT_BIT_RF_KILL;
@@ -1218,7 +1212,7 @@ static void iwl_irq_tasklet(struct iwl_p
 				set_bit(STATUS_RF_KILL_HW, &priv->status);
 			else
 				clear_bit(STATUS_RF_KILL_HW, &priv->status);
-			queue_work(priv->workqueue, &priv->rf_kill);
+			wiphy_rfkill_set_hw_state(priv->hw->wiphy, hw_rf_kill);
 		}
 
 		handled |= CSR_INT_BIT_RF_KILL;
@@ -1726,12 +1720,10 @@ static void __iwl_down(struct iwl_priv *
 		ieee80211_stop_queues(priv->hw);
 
 	/* If we have not previously called iwl_init() then
-	 * clear all bits but the RF Kill bits and return */
+	 * clear all bits but the RF Kill bit and return */
 	if (!iwl_is_init(priv)) {
 		priv->status = test_bit(STATUS_RF_KILL_HW, &priv->status) <<
 					STATUS_RF_KILL_HW |
-			       test_bit(STATUS_RF_KILL_SW, &priv->status) <<
-					STATUS_RF_KILL_SW |
 			       test_bit(STATUS_GEO_CONFIGURED, &priv->status) <<
 					STATUS_GEO_CONFIGURED |
 			       test_bit(STATUS_EXIT_PENDING, &priv->status) <<
@@ -1740,11 +1732,9 @@ static void __iwl_down(struct iwl_priv *
 	}
 
 	/* ...otherwise clear out all the status bits but the RF Kill
-	 * bits and continue taking the NIC down. */
+	 * bit and continue taking the NIC down. */
 	priv->status &= test_bit(STATUS_RF_KILL_HW, &priv->status) <<
 				STATUS_RF_KILL_HW |
-			test_bit(STATUS_RF_KILL_SW, &priv->status) <<
-				STATUS_RF_KILL_SW |
 			test_bit(STATUS_GEO_CONFIGURED, &priv->status) <<
 				STATUS_GEO_CONFIGURED |
 			test_bit(STATUS_FW_ERROR, &priv->status) <<
@@ -1866,9 +1856,10 @@ static int __iwl_up(struct iwl_priv *pri
 		set_bit(STATUS_RF_KILL_HW, &priv->status);
 
 	if (iwl_is_rfkill(priv)) {
+		wiphy_rfkill_set_hw_state(priv->hw->wiphy, true);
+
 		iwl_enable_interrupts(priv);
-		IWL_WARN(priv, "Radio disabled by %s RF Kill switch\n",
-		    test_bit(STATUS_RF_KILL_HW, &priv->status) ? "HW" : "SW");
+		IWL_WARN(priv, "Radio disabled by HW RF Kill switch\n");
 		return 0;
 	}
 
@@ -2000,7 +1991,6 @@ static void iwl_bg_up(struct work_struct
 	mutex_lock(&priv->mutex);
 	__iwl_up(priv);
 	mutex_unlock(&priv->mutex);
-	iwl_rfkill_set_hw_state(priv);
 }
 
 static void iwl_bg_restart(struct work_struct *data)
@@ -2178,8 +2168,6 @@ static int iwl_mac_start(struct ieee8021
 
 	mutex_unlock(&priv->mutex);
 
-	iwl_rfkill_set_hw_state(priv);
-
 	if (ret)
 		return ret;
 
@@ -2774,7 +2762,6 @@ static void iwl_setup_deferred_work(stru
 	INIT_WORK(&priv->up, iwl_bg_up);
 	INIT_WORK(&priv->restart, iwl_bg_restart);
 	INIT_WORK(&priv->rx_replenish, iwl_bg_rx_replenish);
-	INIT_WORK(&priv->rf_kill, iwl_bg_rf_kill);
 	INIT_WORK(&priv->beacon_update, iwl_bg_beacon_update);
 	INIT_WORK(&priv->run_time_calib_work, iwl_bg_run_time_calib_work);
 	INIT_DELAYED_WORK(&priv->init_alive_start, iwl_bg_init_alive_start);
@@ -3045,12 +3032,8 @@ static int iwl_pci_probe(struct pci_dev 
 	else
 		set_bit(STATUS_RF_KILL_HW, &priv->status);
 
-	err = iwl_rfkill_init(priv);
-	if (err)
-		IWL_ERR(priv, "Unable to initialize RFKILL system. "
-				  "Ignoring error: %d\n", err);
-	else
-		iwl_rfkill_set_hw_state(priv);
+	wiphy_rfkill_set_hw_state(priv->hw->wiphy,
+		test_bit(STATUS_RF_KILL_HW, &priv->status));
 
 	iwl_power_initialize(priv);
 	return 0;
@@ -3114,7 +3097,6 @@ static void __devexit iwl_pci_remove(str
 
 	iwl_synchronize_irq(priv);
 
-	iwl_rfkill_unregister(priv);
 	iwl_dealloc_ucode_pci(priv);
 
 	if (priv->rxq.bd)
--- wireless-testing.orig/drivers/net/wireless/iwlwifi/iwl-core.c	2009-06-02 12:53:59.000000000 +0200
+++ wireless-testing/drivers/net/wireless/iwlwifi/iwl-core.c	2009-06-02 12:56:07.000000000 +0200
@@ -36,7 +36,6 @@
 #include "iwl-debug.h"
 #include "iwl-core.h"
 #include "iwl-io.h"
-#include "iwl-rfkill.h"
 #include "iwl-power.h"
 #include "iwl-sta.h"
 #include "iwl-helpers.h"
@@ -2211,126 +2210,6 @@ int iwl_send_card_state(struct iwl_priv 
 }
 EXPORT_SYMBOL(iwl_send_card_state);
 
-void iwl_radio_kill_sw_disable_radio(struct iwl_priv *priv)
-{
-	unsigned long flags;
-
-	if (test_bit(STATUS_RF_KILL_SW, &priv->status))
-		return;
-
-	IWL_DEBUG_RF_KILL(priv, "Manual SW RF KILL set to: RADIO OFF\n");
-
-	iwl_scan_cancel(priv);
-	/* FIXME: This is a workaround for AP */
-	if (priv->iw_mode != NL80211_IFTYPE_AP) {
-		spin_lock_irqsave(&priv->lock, flags);
-		iwl_write32(priv, CSR_UCODE_DRV_GP1_SET,
-			    CSR_UCODE_SW_BIT_RFKILL);
-		spin_unlock_irqrestore(&priv->lock, flags);
-		/* call the host command only if no hw rf-kill set */
-		if (!test_bit(STATUS_RF_KILL_HW, &priv->status) &&
-		    iwl_is_ready(priv))
-			iwl_send_card_state(priv,
-				CARD_STATE_CMD_DISABLE, 0);
-		set_bit(STATUS_RF_KILL_SW, &priv->status);
-			/* make sure mac80211 stop sending Tx frame */
-		if (priv->mac80211_registered)
-			ieee80211_stop_queues(priv->hw);
-	}
-}
-EXPORT_SYMBOL(iwl_radio_kill_sw_disable_radio);
-
-int iwl_radio_kill_sw_enable_radio(struct iwl_priv *priv)
-{
-	unsigned long flags;
-
-	if (!test_bit(STATUS_RF_KILL_SW, &priv->status))
-		return 0;
-
-	IWL_DEBUG_RF_KILL(priv, "Manual SW RF KILL set to: RADIO ON\n");
-
-	spin_lock_irqsave(&priv->lock, flags);
-	iwl_write32(priv, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL);
-
-	/* If the driver is up it will receive CARD_STATE_NOTIFICATION
-	 * notification where it will clear SW rfkill status.
-	 * Setting it here would break the handler. Only if the
-	 * interface is down we can set here since we don't
-	 * receive any further notification.
-	 */
-	if (!priv->is_open)
-		clear_bit(STATUS_RF_KILL_SW, &priv->status);
-	spin_unlock_irqrestore(&priv->lock, flags);
-
-	/* wake up ucode */
-	msleep(10);
-
-	iwl_read32(priv, CSR_UCODE_DRV_GP1);
-	spin_lock_irqsave(&priv->reg_lock, flags);
-	if (!iwl_grab_nic_access(priv))
-		iwl_release_nic_access(priv);
-	spin_unlock_irqrestore(&priv->reg_lock, flags);
-
-	if (test_bit(STATUS_RF_KILL_HW, &priv->status)) {
-		IWL_DEBUG_RF_KILL(priv, "Can not turn radio back on - "
-				  "disabled by HW switch\n");
-		return 0;
-	}
-
-	/* when driver is up while rfkill is on, it wont receive
-	 * any CARD_STATE_NOTIFICATION notifications so we have to
-	 * restart it in here
-	 */
-	if (priv->is_open && !test_bit(STATUS_ALIVE, &priv->status)) {
-		clear_bit(STATUS_RF_KILL_SW, &priv->status);
-		if (!iwl_is_rfkill(priv))
-			queue_work(priv->workqueue, &priv->up);
-	}
-
-	/* If the driver is already loaded, it will receive
-	 * CARD_STATE_NOTIFICATION notifications and the handler will
-	 * call restart to reload the driver.
-	 */
-	return 1;
-}
-EXPORT_SYMBOL(iwl_radio_kill_sw_enable_radio);
-
-void iwl_bg_rf_kill(struct work_struct *work)
-{
-	struct iwl_priv *priv = container_of(work, struct iwl_priv, rf_kill);
-
-	wake_up_interruptible(&priv->wait_command_queue);
-
-	if (test_bit(STATUS_EXIT_PENDING, &priv->status))
-		return;
-
-	mutex_lock(&priv->mutex);
-
-	if (!iwl_is_rfkill(priv)) {
-		IWL_DEBUG_RF_KILL(priv,
-			  "HW and/or SW RF Kill no longer active, restarting "
-			  "device\n");
-		if (!test_bit(STATUS_EXIT_PENDING, &priv->status) &&
-		    priv->is_open)
-			queue_work(priv->workqueue, &priv->restart);
-	} else {
-		/* make sure mac80211 stop sending Tx frame */
-		if (priv->mac80211_registered)
-			ieee80211_stop_queues(priv->hw);
-
-		if (!test_bit(STATUS_RF_KILL_HW, &priv->status))
-			IWL_DEBUG_RF_KILL(priv, "Can not turn radio back on - "
-					  "disabled by SW switch\n");
-		else
-			IWL_WARN(priv, "Radio Frequency Kill Switch is On:\n"
-				    "Kill switch must be turned off for "
-				    "wireless networking to work.\n");
-	}
-	mutex_unlock(&priv->mutex);
-	iwl_rfkill_set_hw_state(priv);
-}
-EXPORT_SYMBOL(iwl_bg_rf_kill);
-
 void iwl_rx_pm_sleep_notif(struct iwl_priv *priv,
 			   struct iwl_rx_mem_buffer *rxb)
 {
@@ -2849,23 +2728,6 @@ int iwl_mac_config(struct ieee80211_hw *
 	if (priv->cfg->ops->hcmd->set_rxon_chain)
 		priv->cfg->ops->hcmd->set_rxon_chain(priv);
 
-	if (changed & IEEE80211_CONF_CHANGE_RADIO_ENABLED) {
-		if (conf->radio_enabled &&
-			iwl_radio_kill_sw_enable_radio(priv)) {
-			IWL_DEBUG_MAC80211(priv, "leave - RF-KILL - "
-						"waiting for uCode\n");
-			goto out;
-		}
-
-		if (!conf->radio_enabled)
-			iwl_radio_kill_sw_disable_radio(priv);
-	}
-
-	if (!conf->radio_enabled) {
-		IWL_DEBUG_MAC80211(priv, "leave - radio disabled\n");
-		goto out;
-	}
-
 	if (!iwl_is_ready(priv)) {
 		IWL_DEBUG_MAC80211(priv, "leave - not ready\n");
 		goto out;
--- wireless-testing.orig/drivers/net/wireless/iwlwifi/iwl-core.h	2009-06-02 12:53:58.000000000 +0200
+++ wireless-testing/drivers/net/wireless/iwlwifi/iwl-core.h	2009-06-02 12:56:07.000000000 +0200
@@ -358,14 +358,6 @@ int iwl_txq_check_empty(struct iwl_priv 
  ****************************************************/
 int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force);
 
-/*****************************************************
- * RF -Kill - here and not in iwl-rfkill.h to be available when
- * RF-kill subsystem is not compiled.
- ****************************************************/
-void iwl_bg_rf_kill(struct work_struct *work);
-void iwl_radio_kill_sw_disable_radio(struct iwl_priv *priv);
-int iwl_radio_kill_sw_enable_radio(struct iwl_priv *priv);
-
 /*******************************************************************************
  * Rate
  ******************************************************************************/
@@ -508,7 +500,6 @@ void iwlcore_free_geos(struct iwl_priv *
 #define STATUS_HCMD_SYNC_ACTIVE	1	/* sync host command in progress */
 #define STATUS_INT_ENABLED	2
 #define STATUS_RF_KILL_HW	3
-#define STATUS_RF_KILL_SW	4
 #define STATUS_INIT		5
 #define STATUS_ALIVE		6
 #define STATUS_READY		7
@@ -543,11 +534,6 @@ static inline int iwl_is_init(struct iwl
 	return test_bit(STATUS_INIT, &priv->status);
 }
 
-static inline int iwl_is_rfkill_sw(struct iwl_priv *priv)
-{
-	return test_bit(STATUS_RF_KILL_SW, &priv->status);
-}
-
 static inline int iwl_is_rfkill_hw(struct iwl_priv *priv)
 {
 	return test_bit(STATUS_RF_KILL_HW, &priv->status);
@@ -555,7 +541,7 @@ static inline int iwl_is_rfkill_hw(struc
 
 static inline int iwl_is_rfkill(struct iwl_priv *priv)
 {
-	return iwl_is_rfkill_hw(priv) || iwl_is_rfkill_sw(priv);
+	return iwl_is_rfkill_hw(priv);
 }
 
 static inline int iwl_is_ready_rf(struct iwl_priv *priv)
--- wireless-testing.orig/drivers/net/wireless/iwlwifi/iwl-debugfs.c	2009-06-02 12:53:45.000000000 +0200
+++ wireless-testing/drivers/net/wireless/iwlwifi/iwl-debugfs.c	2009-06-02 12:56:07.000000000 +0200
@@ -449,8 +449,6 @@ static ssize_t iwl_dbgfs_status_read(str
 		test_bit(STATUS_INT_ENABLED, &priv->status));
 	pos += scnprintf(buf + pos, bufsz - pos, "STATUS_RF_KILL_HW:\t %d\n",
 		test_bit(STATUS_RF_KILL_HW, &priv->status));
-	pos += scnprintf(buf + pos, bufsz - pos, "STATUS_RF_KILL_SW:\t %d\n",
-		test_bit(STATUS_RF_KILL_SW, &priv->status));
 	pos += scnprintf(buf + pos, bufsz - pos, "STATUS_INIT:\t\t %d\n",
 		test_bit(STATUS_INIT, &priv->status));
 	pos += scnprintf(buf + pos, bufsz - pos, "STATUS_ALIVE:\t\t %d\n",
--- wireless-testing.orig/drivers/net/wireless/iwlwifi/iwl-dev.h	2009-06-02 12:53:58.000000000 +0200
+++ wireless-testing/drivers/net/wireless/iwlwifi/iwl-dev.h	2009-06-02 12:56:07.000000000 +0200
@@ -41,7 +41,6 @@
 #include "iwl-prph.h"
 #include "iwl-fh.h"
 #include "iwl-debug.h"
-#include "iwl-rfkill.h"
 #include "iwl-4965-hw.h"
 #include "iwl-3945-hw.h"
 #include "iwl-3945-led.h"
@@ -937,9 +936,6 @@ struct iwl_priv {
 	 * 4965's initialize alive response contains some calibration data. */
 	struct iwl_init_alive_resp card_alive_init;
 	struct iwl_alive_resp card_alive;
-#if defined(CONFIG_IWLWIFI_RFKILL)
-	struct rfkill *rfkill;
-#endif
 
 #ifdef CONFIG_IWLWIFI_LEDS
 	unsigned long last_blink_time;
@@ -1073,7 +1069,6 @@ struct iwl_priv {
 	struct work_struct calibrated_work;
 	struct work_struct scan_completed;
 	struct work_struct rx_replenish;
-	struct work_struct rf_kill;
 	struct work_struct abort_scan;
 	struct work_struct update_link_led;
 	struct work_struct auth_work;
--- wireless-testing.orig/drivers/net/wireless/iwlwifi/iwl3945-base.c	2009-06-02 12:53:58.000000000 +0200
+++ wireless-testing/drivers/net/wireless/iwlwifi/iwl3945-base.c	2009-06-02 12:56:07.000000000 +0200
@@ -1149,18 +1149,12 @@ static void iwl3945_rx_card_state_notif(
 		clear_bit(STATUS_RF_KILL_HW, &priv->status);
 
 
-	if (flags & SW_CARD_DISABLED)
-		set_bit(STATUS_RF_KILL_SW, &priv->status);
-	else
-		clear_bit(STATUS_RF_KILL_SW, &priv->status);
-
 	iwl_scan_cancel(priv);
 
 	if ((test_bit(STATUS_RF_KILL_HW, &status) !=
-	     test_bit(STATUS_RF_KILL_HW, &priv->status)) ||
-	    (test_bit(STATUS_RF_KILL_SW, &status) !=
-	     test_bit(STATUS_RF_KILL_SW, &priv->status)))
-		queue_work(priv->workqueue, &priv->rf_kill);
+	     test_bit(STATUS_RF_KILL_HW, &priv->status)))
+		wiphy_rfkill_set_hw_state(priv->hw->wiphy,
+				test_bit(STATUS_RF_KILL_HW, &priv->status));
 	else
 		wake_up_interruptible(&priv->wait_command_queue);
 }
@@ -2708,8 +2702,6 @@ static void __iwl3945_down(struct iwl_pr
 	if (!iwl_is_init(priv)) {
 		priv->status = test_bit(STATUS_RF_KILL_HW, &priv->status) <<
 					STATUS_RF_KILL_HW |
-			       test_bit(STATUS_RF_KILL_SW, &priv->status) <<
-					STATUS_RF_KILL_SW |
 			       test_bit(STATUS_GEO_CONFIGURED, &priv->status) <<
 					STATUS_GEO_CONFIGURED |
 				test_bit(STATUS_EXIT_PENDING, &priv->status) <<
@@ -2718,11 +2710,9 @@ static void __iwl3945_down(struct iwl_pr
 	}
 
 	/* ...otherwise clear out all the status bits but the RF Kill
-	 * bits and continue taking the NIC down. */
+	 * bit and continue taking the NIC down. */
 	priv->status &= test_bit(STATUS_RF_KILL_HW, &priv->status) <<
 				STATUS_RF_KILL_HW |
-			test_bit(STATUS_RF_KILL_SW, &priv->status) <<
-				STATUS_RF_KILL_SW |
 			test_bit(STATUS_GEO_CONFIGURED, &priv->status) <<
 				STATUS_GEO_CONFIGURED |
 			test_bit(STATUS_FW_ERROR, &priv->status) <<
@@ -2779,12 +2769,6 @@ static int __iwl3945_up(struct iwl_priv 
 		return -EIO;
 	}
 
-	if (test_bit(STATUS_RF_KILL_SW, &priv->status)) {
-		IWL_WARN(priv, "Radio disabled by SW RF kill (module "
-			    "parameter)\n");
-		return -ENODEV;
-	}
-
 	if (!priv->ucode_data_backup.v_addr || !priv->ucode_data.v_addr) {
 		IWL_ERR(priv, "ucode not available for device bring up\n");
 		return -EIO;
@@ -2901,15 +2885,14 @@ static void iwl3945_rfkill_poll(struct w
 {
 	struct iwl_priv *priv =
 	    container_of(data, struct iwl_priv, rfkill_poll.work);
-	unsigned long status = priv->status;
 
 	if (iwl_read32(priv, CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW)
 		clear_bit(STATUS_RF_KILL_HW, &priv->status);
 	else
 		set_bit(STATUS_RF_KILL_HW, &priv->status);
 
-	if (test_bit(STATUS_RF_KILL_HW, &status) != test_bit(STATUS_RF_KILL_HW, &priv->status))
-		queue_work(priv->workqueue, &priv->rf_kill);
+	wiphy_rfkill_set_hw_state(priv->hw->wiphy,
+			test_bit(STATUS_RF_KILL_HW, &priv->status));
 
 	queue_delayed_work(priv->workqueue, &priv->rfkill_poll,
 			   round_jiffies_relative(2 * HZ));
@@ -3141,7 +3124,6 @@ static void iwl3945_bg_up(struct work_st
 	mutex_lock(&priv->mutex);
 	__iwl3945_up(priv);
 	mutex_unlock(&priv->mutex);
-	iwl_rfkill_set_hw_state(priv);
 }
 
 static void iwl3945_bg_restart(struct work_struct *data)
@@ -3304,8 +3286,6 @@ static int iwl3945_mac_start(struct ieee
 
 	mutex_unlock(&priv->mutex);
 
-	iwl_rfkill_set_hw_state(priv);
-
 	if (ret)
 		goto out_release_irq;
 
@@ -3958,7 +3938,6 @@ static void iwl3945_setup_deferred_work(
 	INIT_WORK(&priv->up, iwl3945_bg_up);
 	INIT_WORK(&priv->restart, iwl3945_bg_restart);
 	INIT_WORK(&priv->rx_replenish, iwl3945_bg_rx_replenish);
-	INIT_WORK(&priv->rf_kill, iwl_bg_rf_kill);
 	INIT_WORK(&priv->beacon_update, iwl3945_bg_beacon_update);
 	INIT_DELAYED_WORK(&priv->init_alive_start, iwl3945_bg_init_alive_start);
 	INIT_DELAYED_WORK(&priv->alive_start, iwl3945_bg_alive_start);
@@ -4325,13 +4304,6 @@ static int iwl3945_pci_probe(struct pci_
 	if (err)
 		IWL_ERR(priv, "failed to create debugfs files. Ignoring error: %d\n", err);
 
-	err = iwl_rfkill_init(priv);
-	if (err)
-		IWL_ERR(priv, "Unable to initialize RFKILL system. "
-				  "Ignoring error: %d\n", err);
-	else
-		iwl_rfkill_set_hw_state(priv);
-
 	/* Start monitoring the killswitch */
 	queue_delayed_work(priv->workqueue, &priv->rfkill_poll,
 			   2 * HZ);
@@ -4397,7 +4369,6 @@ static void __devexit iwl3945_pci_remove
 
 	sysfs_remove_group(&pdev->dev.kobj, &iwl3945_attribute_group);
 
-	iwl_rfkill_unregister(priv);
 	cancel_delayed_work_sync(&priv->rfkill_poll);
 
 	iwl3945_dealloc_ucode_pci(priv);
--- wireless-testing.orig/drivers/net/wireless/iwlwifi/iwl-rfkill.c	2009-06-02 12:53:44.000000000 +0200
+++ /dev/null	1970-01-01 00:00:00.000000000 +0000
@@ -1,131 +0,0 @@
-/******************************************************************************
- *
- * Copyright(c) 2003 - 2009 Intel Corporation. All rights reserved.
- *
- * Portions of this file are derived from the ipw3945 project, as well
- * as portions of the ieee80211 subsystem header files.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
- *
- * The full GNU General Public License is included in this distribution in the
- * file called LICENSE.
- *
- * Contact Information:
- *  Intel Linux Wireless <ilw@linux.intel.com>
- * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
- *****************************************************************************/
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/init.h>
-
-#include <net/mac80211.h>
-
-#include "iwl-eeprom.h"
-#include "iwl-dev.h"
-#include "iwl-core.h"
-
-/* software rf-kill from user */
-static int iwl_rfkill_soft_rf_kill(void *data, bool blocked)
-{
-	struct iwl_priv *priv = data;
-
-	if (!priv->rfkill)
-		return -EINVAL;
-
-	if (test_bit(STATUS_EXIT_PENDING, &priv->status))
-		return 0;
-
-	IWL_DEBUG_RF_KILL(priv, "received soft RFKILL: block=%d\n", blocked);
-
-	mutex_lock(&priv->mutex);
-
-	if (iwl_is_rfkill_hw(priv))
-		goto out_unlock;
-
-	if (!blocked)
-		iwl_radio_kill_sw_enable_radio(priv);
-	else
-		iwl_radio_kill_sw_disable_radio(priv);
-
-out_unlock:
-	mutex_unlock(&priv->mutex);
-	return 0;
-}
-
-static const struct rfkill_ops iwl_rfkill_ops = {
-	.set_block = iwl_rfkill_soft_rf_kill,
-};
-
-int iwl_rfkill_init(struct iwl_priv *priv)
-{
-	struct device *device = wiphy_dev(priv->hw->wiphy);
-	int ret = 0;
-
-	BUG_ON(device == NULL);
-
-	IWL_DEBUG_RF_KILL(priv, "Initializing RFKILL.\n");
-	priv->rfkill = rfkill_alloc(priv->cfg->name,
-				    device,
-				    RFKILL_TYPE_WLAN,
-				    &iwl_rfkill_ops, priv);
-	if (!priv->rfkill) {
-		IWL_ERR(priv, "Unable to allocate RFKILL device.\n");
-		ret = -ENOMEM;
-		goto error;
-	}
-
-	ret = rfkill_register(priv->rfkill);
-	if (ret) {
-		IWL_ERR(priv, "Unable to register RFKILL: %d\n", ret);
-		goto free_rfkill;
-	}
-
-	IWL_DEBUG_RF_KILL(priv, "RFKILL initialization complete.\n");
-	return 0;
-
-free_rfkill:
-	rfkill_destroy(priv->rfkill);
-	priv->rfkill = NULL;
-
-error:
-	IWL_DEBUG_RF_KILL(priv, "RFKILL initialization complete.\n");
-	return ret;
-}
-EXPORT_SYMBOL(iwl_rfkill_init);
-
-void iwl_rfkill_unregister(struct iwl_priv *priv)
-{
-
-	if (priv->rfkill) {
-		rfkill_unregister(priv->rfkill);
-		rfkill_destroy(priv->rfkill);
-	}
-
-	priv->rfkill = NULL;
-}
-EXPORT_SYMBOL(iwl_rfkill_unregister);
-
-/* set RFKILL to the right state. */
-void iwl_rfkill_set_hw_state(struct iwl_priv *priv)
-{
-	if (!priv->rfkill)
-		return;
-
-	if (rfkill_set_hw_state(priv->rfkill,
-				!!iwl_is_rfkill_hw(priv)))
-		iwl_radio_kill_sw_disable_radio(priv);
-	else
-		iwl_radio_kill_sw_enable_radio(priv);
-}
-EXPORT_SYMBOL(iwl_rfkill_set_hw_state);
--- wireless-testing.orig/drivers/net/wireless/iwlwifi/iwl-rfkill.h	2009-06-02 12:53:45.000000000 +0200
+++ /dev/null	1970-01-01 00:00:00.000000000 +0000
@@ -1,48 +0,0 @@
-/******************************************************************************
- *
- * Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.
- *
- * Portions of this file are derived from the ipw3945 project, as well
- * as portions of the ieee80211 subsystem header files.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of version 2 of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
- *
- * The full GNU General Public License is included in this distribution in the
- * file called LICENSE.
- *
- * Contact Information:
- *  Intel Linux Wireless <ilw@linux.intel.com>
- * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
- *****************************************************************************/
-#ifndef __iwl_rf_kill_h__
-#define __iwl_rf_kill_h__
-
-struct iwl_priv;
-
-#include <linux/rfkill.h>
-
-#ifdef CONFIG_IWLWIFI_RFKILL
-
-void iwl_rfkill_set_hw_state(struct iwl_priv *priv);
-void iwl_rfkill_unregister(struct iwl_priv *priv);
-int iwl_rfkill_init(struct iwl_priv *priv);
-#else
-static inline void iwl_rfkill_set_hw_state(struct iwl_priv *priv) {}
-static inline void iwl_rfkill_unregister(struct iwl_priv *priv) {}
-static inline int iwl_rfkill_init(struct iwl_priv *priv) { return 0; }
-#endif
-
-
-
-#endif  /* __iwl_rf_kill_h__ */
--- wireless-testing.orig/drivers/net/wireless/iwlwifi/Makefile	2009-06-02 12:53:44.000000000 +0200
+++ wireless-testing/drivers/net/wireless/iwlwifi/Makefile	2009-06-02 12:56:07.000000000 +0200
@@ -4,7 +4,6 @@ iwlcore-objs 		+= iwl-rx.o iwl-tx.o iwl-
 iwlcore-objs 		+= iwl-scan.o
 iwlcore-$(CONFIG_IWLWIFI_DEBUGFS) += iwl-debugfs.o
 iwlcore-$(CONFIG_IWLWIFI_LEDS) += iwl-led.o
-iwlcore-$(CONFIG_IWLWIFI_RFKILL) += iwl-rfkill.o
 iwlcore-$(CONFIG_IWLWIFI_SPECTRUM_MEASUREMENT) += iwl-spectrum.o
 
 obj-$(CONFIG_IWLAGN)	+= iwlagn.o

-- 


^ permalink raw reply	[flat|nested] 24+ messages in thread

* [RFT 2/3] ath9k: port to cfg80211 rfkill
  2009-06-02 11:10 [RFT 0/3] driver rfkill to cfg80211 ports Johannes Berg
  2009-06-02 11:10 ` [RFT 1/3] iwlwifi: port to cfg80211 rfkill Johannes Berg
@ 2009-06-02 11:10 ` Johannes Berg
  2009-06-10 13:20   ` Vasanthakumar Thiagarajan
  2009-06-02 11:10 ` [RFT 3/3] b43/legacy: " Johannes Berg
  2 siblings, 1 reply; 24+ messages in thread
From: Johannes Berg @ 2009-06-02 11:10 UTC (permalink / raw)
  To: linux-wireless; +Cc: Luis Rodriguez

This ports the ath9k rfkill code to the new API offered by
cfg80211 and thus removes a lot of useless stuff.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Cc: Luis Rodriguez <mcgrof@gmail.com>
---
 drivers/net/wireless/ath/ath9k/Kconfig |    1 
 drivers/net/wireless/ath/ath9k/ath9k.h |    9 ---
 drivers/net/wireless/ath/ath9k/hw.c    |   29 ++++------
 drivers/net/wireless/ath/ath9k/hw.h    |    3 -
 drivers/net/wireless/ath/ath9k/main.c  |   93 ++++-----------------------------
 5 files changed, 26 insertions(+), 109 deletions(-)

--- wireless-testing.orig/drivers/net/wireless/ath/ath9k/Kconfig	2009-06-02 12:53:43.000000000 +0200
+++ wireless-testing/drivers/net/wireless/ath/ath9k/Kconfig	2009-06-02 12:56:10.000000000 +0200
@@ -1,7 +1,6 @@
 config ATH9K
 	tristate "Atheros 802.11n wireless cards support"
 	depends on PCI && MAC80211 && WLAN_80211
-	depends on RFKILL || RFKILL=n
 	select ATH_COMMON
 	select MAC80211_LEDS
 	select LEDS_CLASS
--- wireless-testing.orig/drivers/net/wireless/ath/ath9k/ath9k.h	2009-06-02 12:53:43.000000000 +0200
+++ wireless-testing/drivers/net/wireless/ath/ath9k/ath9k.h	2009-06-02 12:56:10.000000000 +0200
@@ -21,7 +21,6 @@
 #include <linux/device.h>
 #include <net/mac80211.h>
 #include <linux/leds.h>
-#include <linux/rfkill.h>
 
 #include "hw.h"
 #include "rc.h"
@@ -464,12 +463,6 @@ struct ath_led {
 	bool registered;
 };
 
-struct ath_rfkill {
-	struct rfkill *rfkill;
-	struct rfkill_ops ops;
-	char rfkill_name[32];
-};
-
 /********************/
 /* Main driver core */
 /********************/
@@ -509,7 +502,6 @@ struct ath_rfkill {
 #define SC_OP_PROTECT_ENABLE    BIT(6)
 #define SC_OP_RXFLUSH           BIT(7)
 #define SC_OP_LED_ASSOCIATED    BIT(8)
-#define SC_OP_RFKILL_REGISTERED BIT(9)
 #define SC_OP_WAIT_FOR_BEACON   BIT(12)
 #define SC_OP_LED_ON            BIT(13)
 #define SC_OP_SCANNING          BIT(14)
@@ -595,7 +587,6 @@ struct ath_softc {
 
 	int beacon_interval;
 
-	struct ath_rfkill rf_kill;
 	struct ath_ani ani;
 	struct ath9k_node_stats nodestats;
 #ifdef CONFIG_ATH9K_DEBUG
--- wireless-testing.orig/drivers/net/wireless/ath/ath9k/hw.c	2009-06-02 12:53:43.000000000 +0200
+++ wireless-testing/drivers/net/wireless/ath/ath9k/hw.c	2009-06-02 12:56:10.000000000 +0200
@@ -2186,6 +2186,18 @@ static void ath9k_hw_spur_mitigate(struc
 	REG_WRITE(ah, AR_PHY_MASK2_P_61_45, tmp_mask);
 }
 
+static void ath9k_enable_rfkill(struct ath_hw *ah)
+{
+	REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL,
+		    AR_GPIO_INPUT_EN_VAL_RFSILENT_BB);
+
+	REG_CLR_BIT(ah, AR_GPIO_INPUT_MUX2,
+		    AR_GPIO_INPUT_MUX2_RFSILENT);
+
+	ath9k_hw_cfg_gpio_input(ah, ah->rfkill_gpio);
+	REG_SET_BIT(ah, AR_PHY_TEST, RFSILENT_BB);
+}
+
 int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
 		    bool bChannelChange)
 {
@@ -2313,10 +2325,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st
 	ath9k_hw_init_interrupt_masks(ah, ah->opmode);
 	ath9k_hw_init_qos(ah);
 
-#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
 	if (ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT)
 		ath9k_enable_rfkill(ah);
-#endif
+
 	ath9k_hw_init_user_settings(ah);
 
 	REG_WRITE(ah, AR_STA_ID1,
@@ -3613,20 +3624,6 @@ void ath9k_hw_set_gpio(struct ath_hw *ah
 		AR_GPIO_BIT(gpio));
 }
 
-#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
-void ath9k_enable_rfkill(struct ath_hw *ah)
-{
-	REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL,
-		    AR_GPIO_INPUT_EN_VAL_RFSILENT_BB);
-
-	REG_CLR_BIT(ah, AR_GPIO_INPUT_MUX2,
-		    AR_GPIO_INPUT_MUX2_RFSILENT);
-
-	ath9k_hw_cfg_gpio_input(ah, ah->rfkill_gpio);
-	REG_SET_BIT(ah, AR_PHY_TEST, RFSILENT_BB);
-}
-#endif
-
 u32 ath9k_hw_getdefantenna(struct ath_hw *ah)
 {
 	return REG_READ(ah, AR_DEF_ANTENNA) & 0x7;
--- wireless-testing.orig/drivers/net/wireless/ath/ath9k/hw.h	2009-06-02 12:53:43.000000000 +0200
+++ wireless-testing/drivers/net/wireless/ath/ath9k/hw.h	2009-06-02 12:56:10.000000000 +0200
@@ -565,9 +565,6 @@ u32 ath9k_hw_gpio_get(struct ath_hw *ah,
 void ath9k_hw_cfg_output(struct ath_hw *ah, u32 gpio,
 			 u32 ah_signal_type);
 void ath9k_hw_set_gpio(struct ath_hw *ah, u32 gpio, u32 val);
-#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
-void ath9k_enable_rfkill(struct ath_hw *ah);
-#endif
 u32 ath9k_hw_getdefantenna(struct ath_hw *ah);
 void ath9k_hw_setantenna(struct ath_hw *ah, u32 antenna);
 bool ath9k_hw_setantennaswitch(struct ath_hw *ah,
--- wireless-testing.orig/drivers/net/wireless/ath/ath9k/main.c	2009-06-02 12:53:43.000000000 +0200
+++ wireless-testing/drivers/net/wireless/ath/ath9k/main.c	2009-06-02 12:56:10.000000000 +0200
@@ -1178,8 +1178,6 @@ void ath_radio_disable(struct ath_softc 
 	ath9k_ps_restore(sc);
 }
 
-#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
-
 /*******************/
 /*	Rfkill	   */
 /*******************/
@@ -1192,81 +1190,27 @@ static bool ath_is_rfkill_set(struct ath
 				  ah->rfkill_polarity;
 }
 
-/* s/w rfkill handlers */
-static int ath_rfkill_set_block(void *data, bool blocked)
-{
-	struct ath_softc *sc = data;
-
-	if (blocked)
-		ath_radio_disable(sc);
-	else
-		ath_radio_enable(sc);
-
-	return 0;
-}
-
-static void ath_rfkill_poll_state(struct rfkill *rfkill, void *data)
+static void ath9k_rfkill_poll_state(struct ieee80211_hw *hw)
 {
-	struct ath_softc *sc = data;
+	struct ath_wiphy *aphy = hw->priv;
+	struct ath_softc *sc = aphy->sc;
 	bool blocked = !!ath_is_rfkill_set(sc);
 
-	if (rfkill_set_hw_state(rfkill, blocked))
+	wiphy_rfkill_set_hw_state(hw->wiphy, blocked);
+
+	if (blocked)
 		ath_radio_disable(sc);
 	else
 		ath_radio_enable(sc);
 }
 
-/* Init s/w rfkill */
-static int ath_init_sw_rfkill(struct ath_softc *sc)
+static void ath_start_rfkill_poll(struct ath_softc *sc)
 {
-	sc->rf_kill.ops.set_block = ath_rfkill_set_block;
-	if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT)
-		sc->rf_kill.ops.poll = ath_rfkill_poll_state;
-
-	snprintf(sc->rf_kill.rfkill_name, sizeof(sc->rf_kill.rfkill_name),
-		"ath9k-%s::rfkill", wiphy_name(sc->hw->wiphy));
-
-	sc->rf_kill.rfkill = rfkill_alloc(sc->rf_kill.rfkill_name,
-					  wiphy_dev(sc->hw->wiphy),
-					  RFKILL_TYPE_WLAN,
-					  &sc->rf_kill.ops, sc);
-	if (!sc->rf_kill.rfkill) {
-		DPRINTF(sc, ATH_DBG_FATAL, "Failed to allocate rfkill\n");
-		return -ENOMEM;
-	}
-
-	return 0;
-}
-
-/* Deinitialize rfkill */
-static void ath_deinit_rfkill(struct ath_softc *sc)
-{
-	if (sc->sc_flags & SC_OP_RFKILL_REGISTERED) {
-		rfkill_unregister(sc->rf_kill.rfkill);
-		rfkill_destroy(sc->rf_kill.rfkill);
-		sc->sc_flags &= ~SC_OP_RFKILL_REGISTERED;
-	}
-}
-
-static int ath_start_rfkill_poll(struct ath_softc *sc)
-{
-	if (!(sc->sc_flags & SC_OP_RFKILL_REGISTERED)) {
-		if (rfkill_register(sc->rf_kill.rfkill)) {
-			DPRINTF(sc, ATH_DBG_FATAL,
-				"Unable to register rfkill\n");
-			rfkill_destroy(sc->rf_kill.rfkill);
-
-			/* Deinitialize the device */
-			ath_cleanup(sc);
-			return -EIO;
-		} else {
-			sc->sc_flags |= SC_OP_RFKILL_REGISTERED;
-		}
-	}
+	struct ath_hw *ah = sc->sc_ah;
 
-	return 0;
+	if (ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT)
+		wiphy_rfkill_start_polling(sc->hw->wiphy);
 }
-#endif /* CONFIG_RFKILL */
 
 void ath_cleanup(struct ath_softc *sc)
 {
@@ -1286,9 +1230,6 @@ void ath_detach(struct ath_softc *sc)
 
 	DPRINTF(sc, ATH_DBG_CONFIG, "Detach ATH hw\n");
 
-#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
-	ath_deinit_rfkill(sc);
-#endif
 	ath_deinit_leds(sc);
 	cancel_work_sync(&sc->chan_work);
 	cancel_delayed_work_sync(&sc->wiphy_work);
@@ -1626,13 +1567,6 @@ int ath_attach(u16 devid, struct ath_sof
 	if (error != 0)
 		goto error_attach;
 
-#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
-	/* Initialize s/w rfkill */
-	error = ath_init_sw_rfkill(sc);
-	if (error)
-		goto error_attach;
-#endif
-
 	INIT_WORK(&sc->chan_work, ath9k_wiphy_chan_work);
 	INIT_DELAYED_WORK(&sc->wiphy_work, ath9k_wiphy_work);
 	sc->wiphy_scheduler_int = msecs_to_jiffies(500);
@@ -2018,9 +1952,7 @@ static int ath9k_start(struct ieee80211_
 
 	ieee80211_wake_queues(hw);
 
-#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
-	r = ath_start_rfkill_poll(sc);
-#endif
+	ath_start_rfkill_poll(sc);
 
 mutex_unlock:
 	mutex_unlock(&sc->mutex);
@@ -2159,7 +2091,7 @@ static void ath9k_stop(struct ieee80211_
 	} else
 		sc->rx.rxlink = NULL;
 
-	rfkill_pause_polling(sc->rf_kill.rfkill);
+	wiphy_rfkill_stop_polling(sc->hw->wiphy);
 
 	/* disable HAL and put h/w to sleep */
 	ath9k_hw_disable(sc->sc_ah);
@@ -2765,6 +2697,7 @@ struct ieee80211_ops ath9k_ops = {
 	.ampdu_action       = ath9k_ampdu_action,
 	.sw_scan_start      = ath9k_sw_scan_start,
 	.sw_scan_complete   = ath9k_sw_scan_complete,
+	.rfkill_poll        = ath9k_rfkill_poll_state,
 };
 
 static struct {

-- 


^ permalink raw reply	[flat|nested] 24+ messages in thread

* [RFT 3/3] b43/legacy: port to cfg80211 rfkill
  2009-06-02 11:10 [RFT 0/3] driver rfkill to cfg80211 ports Johannes Berg
  2009-06-02 11:10 ` [RFT 1/3] iwlwifi: port to cfg80211 rfkill Johannes Berg
  2009-06-02 11:10 ` [RFT 2/3] ath9k: " Johannes Berg
@ 2009-06-02 11:10 ` Johannes Berg
  2009-06-02 14:41   ` Michael Buesch
  2 siblings, 1 reply; 24+ messages in thread
From: Johannes Berg @ 2009-06-02 11:10 UTC (permalink / raw)
  To: linux-wireless; +Cc: Michael Buesch, Larry Finger

This ports the b43/legacy rfkill code to the new API offered
by cfg80211 and thus removes a lot of useless stuff.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Cc: Michael Buesch <mb@bu3sch.de>
Cc: Larry Finger <Larry.Finger@lwfinger.net>
---
 drivers/net/wireless/b43/Kconfig           |    7 --
 drivers/net/wireless/b43/Makefile          |    2 
 drivers/net/wireless/b43/b43.h             |    3 
 drivers/net/wireless/b43/leds.c            |    2 
 drivers/net/wireless/b43/main.c            |   27 ++-----
 drivers/net/wireless/b43/phy_common.h      |    2 
 drivers/net/wireless/b43/rfkill.c          |   94 +--------------------------
 drivers/net/wireless/b43/rfkill.h          |   46 -------------
 drivers/net/wireless/b43legacy/Kconfig     |    8 --
 drivers/net/wireless/b43legacy/Makefile    |    2 
 drivers/net/wireless/b43legacy/b43legacy.h |    3 
 drivers/net/wireless/b43legacy/leds.c      |    2 
 drivers/net/wireless/b43legacy/main.c      |   17 +---
 drivers/net/wireless/b43legacy/rfkill.c    |   99 +----------------------------
 drivers/net/wireless/b43legacy/rfkill.h    |   51 --------------
 15 files changed, 29 insertions(+), 336 deletions(-)

--- wireless-testing.orig/drivers/net/wireless/b43/Kconfig	2009-06-02 12:53:36.000000000 +0200
+++ wireless-testing/drivers/net/wireless/b43/Kconfig	2009-06-02 12:56:11.000000000 +0200
@@ -98,13 +98,6 @@ config B43_LEDS
 	depends on B43 && MAC80211_LEDS && (LEDS_CLASS = y || LEDS_CLASS = B43)
 	default y
 
-# This config option automatically enables b43 RFKILL support,
-# if it's possible.
-config B43_RFKILL
-	bool
-	depends on B43 && (RFKILL = y || RFKILL = B43)
-	default y
-
 # This config option automatically enables b43 HW-RNG support,
 # if the HW-RNG core is enabled.
 config B43_HWRNG
--- wireless-testing.orig/drivers/net/wireless/b43/b43.h	2009-06-02 12:53:36.000000000 +0200
+++ wireless-testing/drivers/net/wireless/b43/b43.h	2009-06-02 12:56:11.000000000 +0200
@@ -631,9 +631,6 @@ struct b43_wl {
 	char rng_name[30 + 1];
 #endif /* CONFIG_B43_HWRNG */
 
-	/* The RF-kill button */
-	struct b43_rfkill rfkill;
-
 	/* List of all wireless devices on this chip */
 	struct list_head devlist;
 	u8 nr_devs;
--- wireless-testing.orig/drivers/net/wireless/b43/main.c	2009-06-02 12:53:36.000000000 +0200
+++ wireless-testing/drivers/net/wireless/b43/main.c	2009-06-02 12:56:11.000000000 +0200
@@ -4298,7 +4298,6 @@ static int b43_op_start(struct ieee80211
 	struct b43_wldev *dev = wl->current_dev;
 	int did_init = 0;
 	int err = 0;
-	bool do_rfkill_exit = 0;
 
 	/* Kill all old instance specific information to make sure
 	 * the card won't use it in the short timeframe between start
@@ -4312,18 +4311,12 @@ static int b43_op_start(struct ieee80211
 	wl->beacon1_uploaded = 0;
 	wl->beacon_templates_virgin = 1;
 
-	/* First register RFkill.
-	 * LEDs that are registered later depend on it. */
-	b43_rfkill_init(dev);
-
 	mutex_lock(&wl->mutex);
 
 	if (b43_status(dev) < B43_STAT_INITIALIZED) {
 		err = b43_wireless_core_init(dev);
-		if (err) {
-			do_rfkill_exit = 1;
+		if (err)
 			goto out_mutex_unlock;
-		}
 		did_init = 1;
 	}
 
@@ -4332,17 +4325,16 @@ static int b43_op_start(struct ieee80211
 		if (err) {
 			if (did_init)
 				b43_wireless_core_exit(dev);
-			do_rfkill_exit = 1;
 			goto out_mutex_unlock;
 		}
 	}
 
+	/* XXX: only do if device doesn't support rfkill irq */
+	wiphy_rfkill_start_polling(hw->wiphy);
+
  out_mutex_unlock:
 	mutex_unlock(&wl->mutex);
 
-	if (do_rfkill_exit)
-		b43_rfkill_exit(dev);
-
 	return err;
 }
 
@@ -4351,7 +4343,6 @@ static void b43_op_stop(struct ieee80211
 	struct b43_wl *wl = hw_to_b43_wl(hw);
 	struct b43_wldev *dev = wl->current_dev;
 
-	b43_rfkill_exit(dev);
 	cancel_work_sync(&(wl->beacon_update_trigger));
 
 	mutex_lock(&wl->mutex);
@@ -4433,6 +4424,7 @@ static const struct ieee80211_ops b43_hw
 	.sta_notify		= b43_op_sta_notify,
 	.sw_scan_start		= b43_op_sw_scan_start_notifier,
 	.sw_scan_complete	= b43_op_sw_scan_complete_notifier,
+	.rfkill_poll		= b43_rfkill_poll,
 };
 
 /* Hard-reset the chip. Do not call this directly.
@@ -4920,7 +4912,7 @@ static struct ssb_driver b43_ssb_driver 
 static void b43_print_driverinfo(void)
 {
 	const char *feat_pci = "", *feat_pcmcia = "", *feat_nphy = "",
-		   *feat_leds = "", *feat_rfkill = "";
+		   *feat_leds = "";
 
 #ifdef CONFIG_B43_PCI_AUTOSELECT
 	feat_pci = "P";
@@ -4934,14 +4926,11 @@ static void b43_print_driverinfo(void)
 #ifdef CONFIG_B43_LEDS
 	feat_leds = "L";
 #endif
-#ifdef CONFIG_B43_RFKILL
-	feat_rfkill = "R";
-#endif
 	printk(KERN_INFO "Broadcom 43xx driver loaded "
-	       "[ Features: %s%s%s%s%s, Firmware-ID: "
+	       "[ Features: %s%s%s%s, Firmware-ID: "
 	       B43_SUPPORTED_FIRMWARE_ID " ]\n",
 	       feat_pci, feat_pcmcia, feat_nphy,
-	       feat_leds, feat_rfkill);
+	       feat_leds);
 }
 
 static int __init b43_init(void)
--- wireless-testing.orig/drivers/net/wireless/b43/rfkill.c	2009-06-02 12:53:36.000000000 +0200
+++ wireless-testing/drivers/net/wireless/b43/rfkill.c	2009-06-02 12:56:11.000000000 +0200
@@ -22,7 +22,6 @@
 
 */
 
-#include "rfkill.h"
 #include "b43.h"
 #include "phy_common.h"
 
@@ -45,10 +44,10 @@ static bool b43_is_hw_radio_enabled(stru
 }
 
 /* The poll callback for the hardware button. */
-static void b43_rfkill_poll(struct rfkill *rfkill, void *data)
+void b43_rfkill_poll(struct ieee80211_hw *hw)
 {
-	struct b43_wldev *dev = data;
-	struct b43_wl *wl = dev->wl;
+	struct b43_wl *wl = hw_to_b43_wl(hw);
+	struct b43_wldev *dev = wl->current_dev;
 	bool enabled;
 
 	mutex_lock(&wl->mutex);
@@ -61,94 +60,9 @@ static void b43_rfkill_poll(struct rfkil
 		dev->radio_hw_enable = enabled;
 		b43info(wl, "Radio hardware status changed to %s\n",
 			enabled ? "ENABLED" : "DISABLED");
-		enabled = !rfkill_set_hw_state(rfkill, !enabled);
+		wiphy_rfkill_set_hw_state(hw->wiphy, !enabled);
 		if (enabled != dev->phy.radio_on)
 			b43_software_rfkill(dev, !enabled);
 	}
 	mutex_unlock(&wl->mutex);
 }
-
-/* Called when the RFKILL toggled in software. */
-static int b43_rfkill_soft_set(void *data, bool blocked)
-{
-	struct b43_wldev *dev = data;
-	struct b43_wl *wl = dev->wl;
-	int err = -EINVAL;
-
-	if (WARN_ON(!wl->rfkill.registered))
-		return -EINVAL;
-
-	mutex_lock(&wl->mutex);
-
-	if (b43_status(dev) < B43_STAT_INITIALIZED)
-		goto out_unlock;
-
-	if (!dev->radio_hw_enable)
-		goto out_unlock;
-
-	if (!blocked != dev->phy.radio_on)
-		b43_software_rfkill(dev, blocked);
-	err = 0;
-out_unlock:
-	mutex_unlock(&wl->mutex);
-	return err;
-}
-
-const char *b43_rfkill_led_name(struct b43_wldev *dev)
-{
-	struct b43_rfkill *rfk = &(dev->wl->rfkill);
-
-	if (!rfk->registered)
-		return NULL;
-	return rfkill_get_led_trigger_name(rfk->rfkill);
-}
-
-static const struct rfkill_ops b43_rfkill_ops = {
-	.set_block = b43_rfkill_soft_set,
-	.poll = b43_rfkill_poll,
-};
-
-void b43_rfkill_init(struct b43_wldev *dev)
-{
-	struct b43_wl *wl = dev->wl;
-	struct b43_rfkill *rfk = &(wl->rfkill);
-	int err;
-
-	rfk->registered = 0;
-
-	snprintf(rfk->name, sizeof(rfk->name),
-		 "b43-%s", wiphy_name(wl->hw->wiphy));
-
-	rfk->rfkill = rfkill_alloc(rfk->name,
-				   dev->dev->dev,
-				   RFKILL_TYPE_WLAN,
-				   &b43_rfkill_ops, dev);
-	if (!rfk->rfkill)
-		goto out_error;
-
-	err = rfkill_register(rfk->rfkill);
-	if (err)
-		goto err_free;
-
-	rfk->registered = 1;
-
-	return;
- err_free:
-	rfkill_destroy(rfk->rfkill);
- out_error:
-	rfk->registered = 0;
-	b43warn(wl, "RF-kill button init failed\n");
-}
-
-void b43_rfkill_exit(struct b43_wldev *dev)
-{
-	struct b43_rfkill *rfk = &(dev->wl->rfkill);
-
-	if (!rfk->registered)
-		return;
-	rfk->registered = 0;
-
-	rfkill_unregister(rfk->rfkill);
-	rfkill_destroy(rfk->rfkill);
-	rfk->rfkill = NULL;
-}
--- wireless-testing.orig/drivers/net/wireless/b43/rfkill.h	2009-06-02 12:53:36.000000000 +0200
+++ wireless-testing/drivers/net/wireless/b43/rfkill.h	2009-06-02 12:56:11.000000000 +0200
@@ -1,49 +1,7 @@
 #ifndef B43_RFKILL_H_
 #define B43_RFKILL_H_
 
-struct b43_wldev;
-
-
-#ifdef CONFIG_B43_RFKILL
-
-#include <linux/rfkill.h>
-
-
-struct b43_rfkill {
-	/* The RFKILL subsystem data structure */
-	struct rfkill *rfkill;
-	/* Did initialization succeed? Used for freeing. */
-	bool registered;
-	/* The unique name of this rfkill switch */
-	char name[sizeof("b43-phy4294967295")];
-};
-
-/* The init function returns void, because we are not interested
- * in failing the b43 init process when rfkill init failed. */
-void b43_rfkill_init(struct b43_wldev *dev);
-void b43_rfkill_exit(struct b43_wldev *dev);
-
-const char *b43_rfkill_led_name(struct b43_wldev *dev);
-
-
-#else /* CONFIG_B43_RFKILL */
-/* No RFKILL support. */
-
-struct b43_rfkill {
-	/* empty */
-};
-
-static inline void b43_rfkill_init(struct b43_wldev *dev)
-{
-}
-static inline void b43_rfkill_exit(struct b43_wldev *dev)
-{
-}
-static inline char * b43_rfkill_led_name(struct b43_wldev *dev)
-{
-	return NULL;
-}
-
-#endif /* CONFIG_B43_RFKILL */
+struct ieee80211_hw;
 
+void b43_rfkill_poll(struct ieee80211_hw *hw);
 #endif /* B43_RFKILL_H_ */
--- wireless-testing.orig/drivers/net/wireless/b43/Makefile	2009-06-02 12:53:36.000000000 +0200
+++ wireless-testing/drivers/net/wireless/b43/Makefile	2009-06-02 12:56:11.000000000 +0200
@@ -13,7 +13,7 @@ b43-y				+= lo.o
 b43-y				+= wa.o
 b43-y				+= dma.o
 b43-$(CONFIG_B43_PIO)		+= pio.o
-b43-$(CONFIG_B43_RFKILL)	+= rfkill.o
+b43-y				+= rfkill.o
 b43-$(CONFIG_B43_LEDS)		+= leds.o
 b43-$(CONFIG_B43_PCMCIA)	+= pcmcia.o
 b43-$(CONFIG_B43_DEBUG)		+= debugfs.o
--- wireless-testing.orig/drivers/net/wireless/b43legacy/Kconfig	2009-06-02 12:53:37.000000000 +0200
+++ wireless-testing/drivers/net/wireless/b43legacy/Kconfig	2009-06-02 12:56:11.000000000 +0200
@@ -42,14 +42,6 @@ config B43LEGACY_LEDS
 	depends on B43LEGACY && MAC80211_LEDS && (LEDS_CLASS = y || LEDS_CLASS = B43LEGACY)
 	default y
 
-# RFKILL support
-# This config option automatically enables b43legacy RFKILL support,
-# if it's possible.
-config B43LEGACY_RFKILL
-	bool
-	depends on B43LEGACY && (RFKILL = y || RFKILL = B43LEGACY)
-	default y
-
 # This config option automatically enables b43 HW-RNG support,
 # if the HW-RNG core is enabled.
 config B43LEGACY_HWRNG
--- wireless-testing.orig/drivers/net/wireless/b43legacy/Makefile	2009-06-02 12:53:37.000000000 +0200
+++ wireless-testing/drivers/net/wireless/b43legacy/Makefile	2009-06-02 12:56:11.000000000 +0200
@@ -6,7 +6,7 @@ b43legacy-y				+= radio.o
 b43legacy-y				+= sysfs.o
 b43legacy-y				+= xmit.o
 # b43 RFKILL button support
-b43legacy-$(CONFIG_B43LEGACY_RFKILL)	+= rfkill.o
+b43legacy-y				+= rfkill.o
 # b43legacy LED support
 b43legacy-$(CONFIG_B43LEGACY_LEDS)	+= leds.o
 # b43legacy debugging
--- wireless-testing.orig/drivers/net/wireless/b43legacy/main.c	2009-06-02 12:53:37.000000000 +0200
+++ wireless-testing/drivers/net/wireless/b43legacy/main.c	2009-06-02 12:56:11.000000000 +0200
@@ -3431,11 +3431,6 @@ static int b43legacy_op_start(struct iee
 	struct b43legacy_wldev *dev = wl->current_dev;
 	int did_init = 0;
 	int err = 0;
-	bool do_rfkill_exit = 0;
-
-	/* First register RFkill.
-	 * LEDs that are registered later depend on it. */
-	b43legacy_rfkill_init(dev);
 
 	/* Kill all old instance specific information to make sure
 	 * the card won't use it in the short timeframe between start
@@ -3451,10 +3446,8 @@ static int b43legacy_op_start(struct iee
 
 	if (b43legacy_status(dev) < B43legacy_STAT_INITIALIZED) {
 		err = b43legacy_wireless_core_init(dev);
-		if (err) {
-			do_rfkill_exit = 1;
+		if (err)
 			goto out_mutex_unlock;
-		}
 		did_init = 1;
 	}
 
@@ -3463,17 +3456,15 @@ static int b43legacy_op_start(struct iee
 		if (err) {
 			if (did_init)
 				b43legacy_wireless_core_exit(dev);
-			do_rfkill_exit = 1;
 			goto out_mutex_unlock;
 		}
 	}
 
+	wiphy_rfkill_start_polling(hw->wiphy);
+
 out_mutex_unlock:
 	mutex_unlock(&wl->mutex);
 
-	if (do_rfkill_exit)
-		b43legacy_rfkill_exit(dev);
-
 	return err;
 }
 
@@ -3482,7 +3473,6 @@ static void b43legacy_op_stop(struct iee
 	struct b43legacy_wl *wl = hw_to_b43legacy_wl(hw);
 	struct b43legacy_wldev *dev = wl->current_dev;
 
-	b43legacy_rfkill_exit(dev);
 	cancel_work_sync(&(wl->beacon_update_trigger));
 
 	mutex_lock(&wl->mutex);
@@ -3518,6 +3508,7 @@ static const struct ieee80211_ops b43leg
 	.start			= b43legacy_op_start,
 	.stop			= b43legacy_op_stop,
 	.set_tim		= b43legacy_op_beacon_set_tim,
+	.rfkill_poll		= b43legacy_rfkill_poll,
 };
 
 /* Hard-reset the chip. Do not call this directly.
--- wireless-testing.orig/drivers/net/wireless/b43legacy/rfkill.c	2009-06-02 12:53:37.000000000 +0200
+++ wireless-testing/drivers/net/wireless/b43legacy/rfkill.c	2009-06-02 12:56:11.000000000 +0200
@@ -22,7 +22,6 @@
 
 */
 
-#include "rfkill.h"
 #include "radio.h"
 #include "b43legacy.h"
 
@@ -45,10 +44,10 @@ static bool b43legacy_is_hw_radio_enable
 }
 
 /* The poll callback for the hardware button. */
-static void b43legacy_rfkill_poll(struct rfkill *rfkill, void *data)
+void b43legacy_rfkill_poll(struct ieee80211_hw *hw)
 {
-	struct b43legacy_wldev *dev = data;
-	struct b43legacy_wl *wl = dev->wl;
+	struct b43legacy_wl *wl = hw_to_b43legacy_wl(hw);
+	struct b43legacy_wldev *dev = wl->current_dev;
 	bool enabled;
 
 	mutex_lock(&wl->mutex);
@@ -61,7 +60,7 @@ static void b43legacy_rfkill_poll(struct
 		dev->radio_hw_enable = enabled;
 		b43legacyinfo(wl, "Radio hardware status changed to %s\n",
 			enabled ? "ENABLED" : "DISABLED");
-		enabled = !rfkill_set_hw_state(rfkill, !enabled);
+		wiphy_rfkill_set_hw_state(hw->wiphy, !enabled);
 		if (enabled != dev->phy.radio_on) {
 			if (enabled)
 				b43legacy_radio_turn_on(dev);
@@ -71,93 +70,3 @@ static void b43legacy_rfkill_poll(struct
 	}
 	mutex_unlock(&wl->mutex);
 }
-
-/* Called when the RFKILL toggled in software.
- * This is called without locking. */
-static int b43legacy_rfkill_soft_set(void *data, bool blocked)
-{
-	struct b43legacy_wldev *dev = data;
-	struct b43legacy_wl *wl = dev->wl;
-	int ret = -EINVAL;
-
-	if (!wl->rfkill.registered)
-		return -EINVAL;
-
-	mutex_lock(&wl->mutex);
-	if (b43legacy_status(dev) < B43legacy_STAT_INITIALIZED)
-		goto out_unlock;
-
-	if (!dev->radio_hw_enable)
-		goto out_unlock;
-
-	if (!blocked != dev->phy.radio_on) {
-		if (!blocked)
-			b43legacy_radio_turn_on(dev);
-		else
-			b43legacy_radio_turn_off(dev, 0);
-	}
-	ret = 0;
-
-out_unlock:
-	mutex_unlock(&wl->mutex);
-	return ret;
-}
-
-const char *b43legacy_rfkill_led_name(struct b43legacy_wldev *dev)
-{
-	struct b43legacy_rfkill *rfk = &(dev->wl->rfkill);
-
-	if (!rfk->registered)
-		return NULL;
-	return rfkill_get_led_trigger_name(rfk->rfkill);
-}
-
-static const struct rfkill_ops b43legacy_rfkill_ops = {
-	.set_block = b43legacy_rfkill_soft_set,
-	.poll = b43legacy_rfkill_poll,
-};
-
-void b43legacy_rfkill_init(struct b43legacy_wldev *dev)
-{
-	struct b43legacy_wl *wl = dev->wl;
-	struct b43legacy_rfkill *rfk = &(wl->rfkill);
-	int err;
-
-	rfk->registered = 0;
-
-	snprintf(rfk->name, sizeof(rfk->name),
-		 "b43legacy-%s", wiphy_name(wl->hw->wiphy));
-	rfk->rfkill = rfkill_alloc(rfk->name,
-				   dev->dev->dev,
-				   RFKILL_TYPE_WLAN,
-				   &b43legacy_rfkill_ops, dev);
-	if (!rfk->rfkill)
-		goto out_error;
-
-	err = rfkill_register(rfk->rfkill);
-	if (err)
-		goto err_free;
-
-	rfk->registered = 1;
-
-	return;
- err_free:
-	rfkill_destroy(rfk->rfkill);
- out_error:
-	rfk->registered = 0;
-	b43legacywarn(wl, "RF-kill button init failed\n");
-}
-
-void b43legacy_rfkill_exit(struct b43legacy_wldev *dev)
-{
-	struct b43legacy_rfkill *rfk = &(dev->wl->rfkill);
-
-	if (!rfk->registered)
-		return;
-	rfk->registered = 0;
-
-	rfkill_unregister(rfk->rfkill);
-	rfkill_destroy(rfk->rfkill);
-	rfk->rfkill = NULL;
-}
-
--- wireless-testing.orig/drivers/net/wireless/b43legacy/rfkill.h	2009-06-02 12:53:37.000000000 +0200
+++ wireless-testing/drivers/net/wireless/b43legacy/rfkill.h	2009-06-02 12:56:11.000000000 +0200
@@ -1,55 +1,8 @@
 #ifndef B43legacy_RFKILL_H_
 #define B43legacy_RFKILL_H_
 
-struct b43legacy_wldev;
+struct ieee80211_hw;
 
-#ifdef CONFIG_B43LEGACY_RFKILL
-
-#include <linux/rfkill.h>
-
-
-
-struct b43legacy_rfkill {
-	/* The RFKILL subsystem data structure */
-	struct rfkill *rfkill;
-	/* Did initialization succeed? Used for freeing. */
-	bool registered;
-	/* The unique name of this rfkill switch */
-	char name[sizeof("b43legacy-phy4294967295")];
-};
-
-/* The init function returns void, because we are not interested
- * in failing the b43 init process when rfkill init failed. */
-void b43legacy_rfkill_init(struct b43legacy_wldev *dev);
-void b43legacy_rfkill_exit(struct b43legacy_wldev *dev);
-
-const char *b43legacy_rfkill_led_name(struct b43legacy_wldev *dev);
-
-
-#else /* CONFIG_B43LEGACY_RFKILL */
-/* No RFKILL support. */
-
-struct b43legacy_rfkill {
-	/* empty */
-};
-
-static inline void b43legacy_rfkill_alloc(struct b43legacy_wldev *dev)
-{
-}
-static inline void b43legacy_rfkill_free(struct b43legacy_wldev *dev)
-{
-}
-static inline void b43legacy_rfkill_init(struct b43legacy_wldev *dev)
-{
-}
-static inline void b43legacy_rfkill_exit(struct b43legacy_wldev *dev)
-{
-}
-static inline char *b43legacy_rfkill_led_name(struct b43legacy_wldev *dev)
-{
-	return NULL;
-}
-
-#endif /* CONFIG_B43LEGACY_RFKILL */
+void b43legacy_rfkill_poll(struct ieee80211_hw *hw);
 
 #endif /* B43legacy_RFKILL_H_ */
--- wireless-testing.orig/drivers/net/wireless/b43legacy/b43legacy.h	2009-06-02 12:53:37.000000000 +0200
+++ wireless-testing/drivers/net/wireless/b43legacy/b43legacy.h	2009-06-02 12:56:11.000000000 +0200
@@ -602,9 +602,6 @@ struct b43legacy_wl {
 	char rng_name[30 + 1];
 #endif
 
-	/* The RF-kill button */
-	struct b43legacy_rfkill rfkill;
-
 	/* List of all wireless devices on this chip */
 	struct list_head devlist;
 	u8 nr_devs;
--- wireless-testing.orig/drivers/net/wireless/b43/phy_common.h	2009-06-02 12:53:36.000000000 +0200
+++ wireless-testing/drivers/net/wireless/b43/phy_common.h	2009-06-02 12:56:11.000000000 +0200
@@ -1,7 +1,7 @@
 #ifndef LINUX_B43_PHY_COMMON_H_
 #define LINUX_B43_PHY_COMMON_H_
 
-#include <linux/rfkill.h>
+#include <linux/types.h>
 
 struct b43_wldev;
 
--- wireless-testing.orig/drivers/net/wireless/b43/leds.c	2009-06-02 12:53:36.000000000 +0200
+++ wireless-testing/drivers/net/wireless/b43/leds.c	2009-06-02 12:56:11.000000000 +0200
@@ -164,7 +164,7 @@ static void b43_map_led(struct b43_wldev
 		snprintf(name, sizeof(name),
 			 "b43-%s::radio", wiphy_name(hw->wiphy));
 		b43_register_led(dev, &dev->led_radio, name,
-				 b43_rfkill_led_name(dev),
+				 ieee80211_get_radio_led_name(hw),
 				 led_index, activelow);
 		/* Sync the RF-kill LED state with the switch state. */
 		if (dev->radio_hw_enable)
--- wireless-testing.orig/drivers/net/wireless/b43legacy/leds.c	2009-06-02 12:53:37.000000000 +0200
+++ wireless-testing/drivers/net/wireless/b43legacy/leds.c	2009-06-02 12:56:11.000000000 +0200
@@ -164,7 +164,7 @@ static void b43legacy_map_led(struct b43
 		snprintf(name, sizeof(name),
 			 "b43legacy-%s::radio", wiphy_name(hw->wiphy));
 		b43legacy_register_led(dev, &dev->led_radio, name,
-				 b43legacy_rfkill_led_name(dev),
+				 ieee80211_get_radio_led_name(hw),
 				 led_index, activelow);
 		/* Sync the RF-kill LED state with the switch state. */
 		if (dev->radio_hw_enable)

-- 


^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFT 3/3] b43/legacy: port to cfg80211 rfkill
  2009-06-02 11:10 ` [RFT 3/3] b43/legacy: " Johannes Berg
@ 2009-06-02 14:41   ` Michael Buesch
  2009-06-02 20:04     ` Johannes Berg
  0 siblings, 1 reply; 24+ messages in thread
From: Michael Buesch @ 2009-06-02 14:41 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless, Larry Finger

On Tuesday 02 June 2009 13:10:30 Johannes Berg wrote:
> This ports the b43/legacy rfkill code to the new API offered
> by cfg80211 and thus removes a lot of useless stuff.
> 
> Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
> Cc: Michael Buesch <mb@bu3sch.de>
> Cc: Larry Finger <Larry.Finger@lwfinger.net>
> ---
>  drivers/net/wireless/b43/Kconfig           |    7 --
>  drivers/net/wireless/b43/Makefile          |    2 
>  drivers/net/wireless/b43/b43.h             |    3 
>  drivers/net/wireless/b43/leds.c            |    2 
>  drivers/net/wireless/b43/main.c            |   27 ++-----
>  drivers/net/wireless/b43/phy_common.h      |    2 
>  drivers/net/wireless/b43/rfkill.c          |   94 +--------------------------
>  drivers/net/wireless/b43/rfkill.h          |   46 -------------
>  drivers/net/wireless/b43legacy/Kconfig     |    8 --
>  drivers/net/wireless/b43legacy/Makefile    |    2 
>  drivers/net/wireless/b43legacy/b43legacy.h |    3 
>  drivers/net/wireless/b43legacy/leds.c      |    2 
>  drivers/net/wireless/b43legacy/main.c      |   17 +---
>  drivers/net/wireless/b43legacy/rfkill.c    |   99 +----------------------------
>  drivers/net/wireless/b43legacy/rfkill.h    |   51 --------------
>  15 files changed, 29 insertions(+), 336 deletions(-)
> 
> --- wireless-testing.orig/drivers/net/wireless/b43/Kconfig	2009-06-02 12:53:36.000000000 +0200
> +++ wireless-testing/drivers/net/wireless/b43/Kconfig	2009-06-02 12:56:11.000000000 +0200
> @@ -98,13 +98,6 @@ config B43_LEDS
>  	depends on B43 && MAC80211_LEDS && (LEDS_CLASS = y || LEDS_CLASS = B43)
>  	default y
>  
> -# This config option automatically enables b43 RFKILL support,
> -# if it's possible.
> -config B43_RFKILL
> -	bool
> -	depends on B43 && (RFKILL = y || RFKILL = B43)
> -	default y

Don't you need to add a new "depends on" to "B43", if you remove this?
Or is rfkill always compiled in if wireless is present?

-- 
Greetings, Michael.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFT 3/3] b43/legacy: port to cfg80211 rfkill
  2009-06-02 14:41   ` Michael Buesch
@ 2009-06-02 20:04     ` Johannes Berg
  2009-06-02 20:08       ` Michael Buesch
  0 siblings, 1 reply; 24+ messages in thread
From: Johannes Berg @ 2009-06-02 20:04 UTC (permalink / raw)
  To: Michael Buesch; +Cc: linux-wireless, Larry Finger

[-- Attachment #1: Type: text/plain, Size: 819 bytes --]

On Tue, 2009-06-02 at 16:41 +0200, Michael Buesch wrote:

> > --- wireless-testing.orig/drivers/net/wireless/b43/Kconfig	2009-06-02 12:53:36.000000000 +0200
> > +++ wireless-testing/drivers/net/wireless/b43/Kconfig	2009-06-02 12:56:11.000000000 +0200
> > @@ -98,13 +98,6 @@ config B43_LEDS
> >  	depends on B43 && MAC80211_LEDS && (LEDS_CLASS = y || LEDS_CLASS = B43)
> >  	default y
> >  
> > -# This config option automatically enables b43 RFKILL support,
> > -# if it's possible.
> > -config B43_RFKILL
> > -	bool
> > -	depends on B43 && (RFKILL = y || RFKILL = B43)
> > -	default y
> 
> Don't you need to add a new "depends on" to "B43", if you remove this?
> Or is rfkill always compiled in if wireless is present?

Well, rfkill isn't always present but the APIs are always present.

johannes

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 801 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFT 3/3] b43/legacy: port to cfg80211 rfkill
  2009-06-02 20:04     ` Johannes Berg
@ 2009-06-02 20:08       ` Michael Buesch
  2009-06-02 20:11         ` Johannes Berg
  0 siblings, 1 reply; 24+ messages in thread
From: Michael Buesch @ 2009-06-02 20:08 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless, Larry Finger

On Tuesday 02 June 2009 22:04:39 Johannes Berg wrote:
> On Tue, 2009-06-02 at 16:41 +0200, Michael Buesch wrote:
> 
> > > --- wireless-testing.orig/drivers/net/wireless/b43/Kconfig	2009-06-02 12:53:36.000000000 +0200
> > > +++ wireless-testing/drivers/net/wireless/b43/Kconfig	2009-06-02 12:56:11.000000000 +0200
> > > @@ -98,13 +98,6 @@ config B43_LEDS
> > >  	depends on B43 && MAC80211_LEDS && (LEDS_CLASS = y || LEDS_CLASS = B43)
> > >  	default y
> > >  
> > > -# This config option automatically enables b43 RFKILL support,
> > > -# if it's possible.
> > > -config B43_RFKILL
> > > -	bool
> > > -	depends on B43 && (RFKILL = y || RFKILL = B43)
> > > -	default y
> > 
> > Don't you need to add a new "depends on" to "B43", if you remove this?
> > Or is rfkill always compiled in if wireless is present?
> 
> Well, rfkill isn't always present but the APIs are always present.

Ok, makes sense, so I guess you rewrote the API. ;)

I'll ack this, if somebody with rfkill device tests it.
Unfortunately I don't have such a device.

-- 
Greetings, Michael.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFT 3/3] b43/legacy: port to cfg80211 rfkill
  2009-06-02 20:08       ` Michael Buesch
@ 2009-06-02 20:11         ` Johannes Berg
  2009-06-02 20:59           ` Larry Finger
  0 siblings, 1 reply; 24+ messages in thread
From: Johannes Berg @ 2009-06-02 20:11 UTC (permalink / raw)
  To: Michael Buesch; +Cc: linux-wireless, Larry Finger

[-- Attachment #1: Type: text/plain, Size: 734 bytes --]

On Tue, 2009-06-02 at 22:08 +0200, Michael Buesch wrote:

> > Well, rfkill isn't always present but the APIs are always present.
> 
> Ok, makes sense, so I guess you rewrote the API. ;)
> 
> I'll ack this, if somebody with rfkill device tests it.
> Unfortunately I don't have such a device.

Me neither, so I really need somebody to test this... I suspect there
will be problems when the device is set down because of rfkill, and then
we can no longer poll the rfkill hw state? But that might have been a
problem before too, since if my suspicion is right we could never do:
 * hw rfkill
 * set if down
 * hw un-rfkill
 * set if up

and have it show the events to userspace as expected, or something...

johannes

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 801 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFT 3/3] b43/legacy: port to cfg80211 rfkill
  2009-06-02 20:11         ` Johannes Berg
@ 2009-06-02 20:59           ` Larry Finger
  2009-06-02 21:01             ` Johannes Berg
  2009-06-03  7:52             ` Johannes Berg
  0 siblings, 2 replies; 24+ messages in thread
From: Larry Finger @ 2009-06-02 20:59 UTC (permalink / raw)
  To: Johannes Berg; +Cc: Michael Buesch, linux-wireless

Johannes Berg wrote:
> 
> Me neither, so I really need somebody to test this... I suspect there
> will be problems when the device is set down because of rfkill, and then
> we can no longer poll the rfkill hw state? But that might have been a
> problem before too, since if my suspicion is right we could never do:
>  * hw rfkill
>  * set if down
>  * hw un-rfkill
>  * set if up
> 
> and have it show the events to userspace as expected, or something...

I'm trying to test, but I get an oops on boot. I'm still tracking it
and I lose the reason off the top of the screen, but the trace is:

queue_work + 0x1a
schedule_work + 0x16
rfkill_resume_polling + 0x23
wiphy_rfkill_start_polling + 0x35 (Line 452 of net/wireless/core.c)
b43_op_start + 0x172  (Line 4336 of drivers/net/wireless/b43/main.c)

The offsets are appropriate for wireless-testing and x86_64. The line
in b43_op_start is the one just before the mutex_unlock.

Is it possible that we reached this point without hw->wiphy being set?

Larry


^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFT 3/3] b43/legacy: port to cfg80211 rfkill
  2009-06-02 20:59           ` Larry Finger
@ 2009-06-02 21:01             ` Johannes Berg
  2009-06-02 23:26               ` Larry Finger
  2009-06-03  7:52             ` Johannes Berg
  1 sibling, 1 reply; 24+ messages in thread
From: Johannes Berg @ 2009-06-02 21:01 UTC (permalink / raw)
  To: Larry Finger; +Cc: Michael Buesch, linux-wireless

[-- Attachment #1: Type: text/plain, Size: 792 bytes --]

On Tue, 2009-06-02 at 15:59 -0500, Larry Finger wrote:

> I'm trying to test, but I get an oops on boot. I'm still tracking it
> and I lose the reason off the top of the screen, but the trace is:
> 
> queue_work + 0x1a
> schedule_work + 0x16
> rfkill_resume_polling + 0x23
> wiphy_rfkill_start_polling + 0x35 (Line 452 of net/wireless/core.c)
> b43_op_start + 0x172  (Line 4336 of drivers/net/wireless/b43/main.c)
> 
> The offsets are appropriate for wireless-testing and x86_64. The line
> in b43_op_start is the one just before the mutex_unlock.
> 
> Is it possible that we reached this point without hw->wiphy being set?

Thanks for testing. This doesn't happen on a current wireless-testing
tree I hope? I'll look more into it tomorrow, need some sleep now.

johannes

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 801 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFT 3/3] b43/legacy: port to cfg80211 rfkill
  2009-06-02 21:01             ` Johannes Berg
@ 2009-06-02 23:26               ` Larry Finger
  0 siblings, 0 replies; 24+ messages in thread
From: Larry Finger @ 2009-06-02 23:26 UTC (permalink / raw)
  To: Johannes Berg; +Cc: Michael Buesch, linux-wireless, John Linville

Johannes Berg wrote:
> 
> Thanks for testing. This doesn't happen on a current wireless-testing
> tree I hope? I'll look more into it tomorrow, need some sleep now.

Unfortunately it does happen on the current w-t tree.

The oops is the statement BUG_ON(!list_empty(&work->entry)); at
kernel/workqueue.c:192.

The following hack lets the computer boot with the BCM43XX device
working, but obviously the radio kill switch does not work.

Larry

Index: wireless-testing/drivers/net/wireless/b43/main.c
===================================================================
--- wireless-testing.orig/drivers/net/wireless/b43/main.c
+++ wireless-testing/drivers/net/wireless/b43/main.c
@@ -4330,7 +4330,7 @@ static int b43_op_start(struct ieee80211
        }

        /* XXX: only do if device doesn't support rfkill irq */
-       wiphy_rfkill_start_polling(hw->wiphy);
+//     wiphy_rfkill_start_polling(hw->wiphy);

  out_mutex_unlock:
        mutex_unlock(&wl->mutex);



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFT 3/3] b43/legacy: port to cfg80211 rfkill
  2009-06-02 20:59           ` Larry Finger
  2009-06-02 21:01             ` Johannes Berg
@ 2009-06-03  7:52             ` Johannes Berg
  1 sibling, 0 replies; 24+ messages in thread
From: Johannes Berg @ 2009-06-03  7:52 UTC (permalink / raw)
  To: Larry Finger; +Cc: Michael Buesch, linux-wireless

[-- Attachment #1: Type: text/plain, Size: 738 bytes --]

On Tue, 2009-06-02 at 15:59 -0500, Larry Finger wrote:

> I'm trying to test, but I get an oops on boot. I'm still tracking it
> and I lose the reason off the top of the screen, but the trace is:
> 
> queue_work + 0x1a
> schedule_work + 0x16
> rfkill_resume_polling + 0x23
> wiphy_rfkill_start_polling + 0x35 (Line 452 of net/wireless/core.c)
> b43_op_start + 0x172  (Line 4336 of drivers/net/wireless/b43/main.c)
> 
> The offsets are appropriate for wireless-testing and x86_64. The line
> in b43_op_start is the one just before the mutex_unlock.

Thanks for the hint about the BUG_ON() -- that was easy, I'm kinda
abusing the rfkill API in cfg80211 but I think that ought to be
possible. I'll send a patch.

johannes

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 801 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFT 1/3] iwlwifi: port to cfg80211 rfkill
  2009-06-02 11:10 ` [RFT 1/3] iwlwifi: port to cfg80211 rfkill Johannes Berg
@ 2009-06-03 21:12   ` reinette chatre
  2009-06-04  9:03     ` Johannes Berg
  0 siblings, 1 reply; 24+ messages in thread
From: reinette chatre @ 2009-06-03 21:12 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless@vger.kernel.org

Johannes,

On Tue, 2009-06-02 at 04:10 -0700, Johannes Berg wrote:
> This ports the iwlwifi rfkill code to the new API offered by
> cfg80211 and thus removes a lot of useless stuff. The soft-
> rfkill is completely removed since that is now handled by
> setting the interfaces down.
> 
> Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
> Cc: Reinette Chatre <reinette.chatre@intel.com>
> ---

* I tried this patch on top of latest wireless-testing (rc8 based) on a
Sony laptop. After I bring the interface up I enabled rfkill and saw a
gpf in the sony-laptop module (log is below). I tried this test many
times after this and did not see this gpf again.

* I tried to load the modules with rfkill enabled and then disabled
rfkill after interface up - that worked fine.

* In another test I had rfkill disabled and successfully associated with
AP. I then enabled rfkill and was disassociated as expected. I then
disabled rfkill again and used "iwconfig" to reassociate successfully. 

* In another test rfkill was disabled and I associated with AP. I then
enabled and disabled rfkill rapidly and did not loose association.

In summary the testing went very well. There was that one gpf that
clouded the testing a bit. I have no idea how it can be connected to the
rfkill work though because the error appear to be contained in the
sony-laptop module.

Reinette


[  680.856249] PM: Adding info for platform:regulatory.0
[  680.856351] cfg80211: Using static regulatory domain info
[  680.856358] cfg80211: Regulatory domain: US
[  680.856362] 	(start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[  680.856371] 	(2402000 KHz - 2472000 KHz @ 40000 KHz), (600 mBi, 2700 mBm)
[  680.856378] 	(5170000 KHz - 5190000 KHz @ 40000 KHz), (600 mBi, 2300 mBm)
[  680.856386] 	(5190000 KHz - 5210000 KHz @ 40000 KHz), (600 mBi, 2300 mBm)
[  680.856393] 	(5210000 KHz - 5230000 KHz @ 40000 KHz), (600 mBi, 2300 mBm)
[  680.856400] 	(5230000 KHz - 5330000 KHz @ 40000 KHz), (600 mBi, 2300 mBm)
[  680.856407] 	(5735000 KHz - 5835000 KHz @ 40000 KHz), (600 mBi, 3000 mBm)
[  680.856897] cfg80211: Calling CRDA for country: US
[  680.946854] cfg80211: Regulatory domain changed to country: US
[  680.946862] 	(start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp)
[  680.946871] 	(2402000 KHz - 2472000 KHz @ 40000 KHz), (300 mBi, 2700 mBm)
[  680.946878] 	(5170000 KHz - 5250000 KHz @ 40000 KHz), (300 mBi, 1700 mBm)
[  680.946886] 	(5250000 KHz - 5330000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[  680.946893] 	(5490000 KHz - 5710000 KHz @ 40000 KHz), (300 mBi, 2000 mBm)
[  680.946901] 	(5735000 KHz - 5835000 KHz @ 40000 KHz), (300 mBi, 3000 mBm)
[  681.002106] iwlagn: Intel(R) Wireless WiFi Link AGN driver for Linux, 1.3.27kds
[  681.002109] iwlagn: Copyright(c) 2003-2009 Intel Corporation
[  681.002262] iwlagn 0000:06:00.0: PCI INT A -> GSI 17 (level, low) -> IRQ 17
[  681.002301] iwlagn 0000:06:00.0: setting latency timer to 64
[  681.002356] iwlagn 0000:06:00.0: Detected Intel Wireless WiFi Link 5100AGN REV=0x54
[  681.042422] iwlagn 0000:06:00.0: Tunable channels: 13 802.11bg, 24 802.11a channels
[  681.042514] iwlagn 0000:06:00.0: irq 30 for MSI/MSI-X
[  681.042840] PM: Adding info for No Bus:phy0
[  681.043112] PM: Adding info for No Bus:rfkill4
[  681.046709] PM: Adding info for No Bus:wmaster0
[  681.047776] phy0: Selected rate control algorithm 'iwl-agn-rs'
[  681.049477] PM: Adding info for No Bus:wlan0
[  681.050843] PM: Adding info for No Bus:rfkill5
[  688.674007] iwlagn 0000:06:00.0: firmware: requesting iwlwifi-5000-2.ucode
[  688.674495] PM: Adding info for No Bus:0000:06:00.0
[  688.706155] PM: Removing info for No Bus:0000:06:00.0
[  688.706893] iwlagn 0000:06:00.0: loaded firmware version 8.24.2.12
[  688.966303] PM: Adding info for No Bus:iwl-phy0::radio
[  688.967144] Registered led device: iwl-phy0::radio
[  688.967231] PM: Adding info for No Bus:iwl-phy0::assoc
[  688.967341] Registered led device: iwl-phy0::assoc
[  688.967453] PM: Adding info for No Bus:iwl-phy0::RX
[  688.967561] Registered led device: iwl-phy0::RX
[  688.967642] PM: Adding info for No Bus:iwl-phy0::TX
[  688.967749] Registered led device: iwl-phy0::TX
[  689.180640] phy0: device now idle
[  689.182350] ADDRCONF(NETDEV_UP): wlan0: link is not ready
[  692.451576] phy0: device no longer idle - scanning
[  692.997766] cfg80211: Found new beacon on frequency: 5180 MHz (Ch 36) on phy0
[  693.031112] cfg80211: Found new beacon on frequency: 5200 MHz (Ch 40) on phy0
[  693.077197] cfg80211: Found new beacon on frequency: 5220 MHz (Ch 44) on phy0
[  693.142511] cfg80211: Found new beacon on frequency: 5240 MHz (Ch 48) on phy0
[  694.820445] cfg80211: Found new beacon on frequency: 5745 MHz (Ch 149) on phy0
[  694.851276] cfg80211: Found new beacon on frequency: 5765 MHz (Ch 153) on phy0
[  694.887420] cfg80211: Found new beacon on frequency: 5785 MHz (Ch 157) on phy0
[  694.911855] cfg80211: Found new beacon on frequency: 5805 MHz (Ch 161) on phy0
[  695.050393] phy0: device now idle
[  709.268874] iwlagn 0000:06:00.0: Radio Frequency Kill Switch is On:
[  709.268879] Kill switch must be turned off for wireless networking to work.
[  709.366404] general protection fault: 0000 [#1] SMP 
[  709.366551] last sysfs file: /sys/class/rfkill/rfkill5/state
[  709.366616] CPU 1 
[  709.366707] Modules linked in: iwlagn iwlcore led_class mac80211 cfg80211 i915 drm i2c_algo_bit i2c_core ppdev ipv6 acpi_cpufreq cpufreq_userspace cpufreq_powersave cpufreq_ondemand cpufreq_conservative cpufreq_stats freq_table container sbs sbshc lp parport arc4 ecb pcmcia joydev yenta_socket rsrc_nonstatic af_packet tpm_infineon sony_laptop psmouse iTCO_wdt iTCO_vendor_support pcmcia_core intel_agp video output tpm tpm_bios rfkill pcspkr serio_raw processor battery button ac evdev ext3 jbd mbcache sg sr_mod sd_mod cdrom ahci libata scsi_mod ehci_hcd uhci_hcd usbcore thermal fan thermal_sys fuse [last unloaded: cfg80211]
[  709.369182] Pid: 66, comm: kacpi_notify Not tainted 2.6.30-rc8-wl #40 VGN-Z540N
[  709.369182] RIP: 0010:[<ffffffffa0200dda>]  [<ffffffffa0200dda>] sony_nc_rfkill_set+0xa/0x40 [sony_laptop]
[  709.369182] RSP: 0018:ffff8800bb663dc0  EFLAGS: 00010286
[  709.369182] RAX: 0000000000000001 RBX: 0000000000000000 RCX: 0000000000000001
[  709.369182] RDX: 0000000000000001 RSI: 0000000000000001 RDI: ffff880036f74480
[  709.369182] RBP: ffff8800bb663dd0 R08: 0000000000000000 R09: 0000000000000000
[  709.369182] R10: 0000000000000001 R11: 0000000000000001 R12: 0000000000000000
[  709.369182] R13: 0000000000000000 R14: 0000000000000000 R15: ffff8800bb663df0
[  709.369182] FS:  0000000000000000(0000) GS:ffff88000105e000(0000) knlGS:0000000000000000
[  709.369182] CS:  0010 DS: 0018 ES: 0018 CR0: 000000008005003b
[  709.369182] CR2: 00007ffff2051000 CR3: 00000000ba6b6000 CR4: 00000000000006e0
[  709.369182] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[  709.369182] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
[  709.369182] Process kacpi_notify (pid: 66, threadinfo ffff8800bb662000, task ffff8800bb658f40)
[  709.369182] Stack:
[  709.369182]  0000000000000000 0000000000000000 ffff8800bb663e20 ffffffffa0203292
[  709.369182]  ffff8800bb659548 0000000000000246 0000000000000202 ffff8800b729e2f8
[  709.369182]  ffff8800b5371898 ffff8800bb658f40 ffff880001058ec0 ffffffff803b5596
[  709.369182] Call Trace:
[  709.369182]  [<ffffffffa0203292>] sony_nc_notify+0x222/0x260 [sony_laptop]
[  709.369182]  [<ffffffff803b5596>] ? acpi_os_execute_deferred+0x0/0x39
[  709.369182]  [<ffffffff803b8192>] acpi_device_notify+0x14/0x16
[  709.369182]  [<ffffffff803c5690>] acpi_ev_notify_dispatch+0x5f/0x6b
[  709.369182]  [<ffffffff803b55c2>] acpi_os_execute_deferred+0x2c/0x39
[  709.369182]  [<ffffffff8024d720>] worker_thread+0x1f0/0x340
[  709.369182]  [<ffffffff8024d6cd>] ? worker_thread+0x19d/0x340
[  709.369182]  [<ffffffff802525a0>] ? autoremove_wake_function+0x0/0x40
[  709.369182]  [<ffffffff80263a8d>] ? trace_hardirqs_on+0xd/0x10
[  709.369182]  [<ffffffff8024d530>] ? worker_thread+0x0/0x340
[  709.369182]  [<ffffffff8024d530>] ? worker_thread+0x0/0x340
[  709.369182]  [<ffffffff80252156>] kthread+0x56/0x90
[  709.369182]  [<ffffffff8020ce7a>] child_rip+0xa/0x20
[  709.369182]  [<ffffffff8020c87c>] ? restore_args+0x0/0x30
[  709.369182]  [<ffffffff80252100>] ? kthread+0x0/0x90
[  709.369182]  [<ffffffff8020ce70>] ? child_rip+0x0/0x20
[  709.369182] Code: e1 89 c2 48 c7 c6 36 4e 20 a0 e8 b2 fe ff ff 89 c2 89 d0 48 8b 1c 24 4c 8b 64 24 08 c9 c3 0f 1f 00 55 89 f2 48 89 e5 48 83 ec 10 <8b> 34 bd 80 3e 20 a0 bf 24 01 00 00 81 c6 00 01 00 00 89 f0 0d 
[  709.369182] RIP  [<ffffffffa0200dda>] sony_nc_rfkill_set+0xa/0x40 [sony_laptop]
[  709.369182]  RSP <ffff8800bb663dc0>
[  709.375883] ---[ end trace 6c116875da7d6347 ]---
[  709.432645] usb 6-2: USB disconnect, address 2
[  709.432753] PM: Removing info for No Bus:usbdev6.2_ep81
[  709.433263] PM: Removing info for No Bus:usbdev6.2_ep82
[  709.433600] PM: Removing info for No Bus:usbdev6.2_ep02
[  709.433922] PM: Removing info for usb:6-2:1.0
[  709.434237] PM: Removing info for No Bus:usbdev6.2_ep83
[  709.434548] PM: Removing info for No Bus:usbdev6.2_ep03
[  709.435449] PM: Removing info for usb:6-2:1.1
[  709.435886] PM: Removing info for No Bus:usbdev6.2_ep84
[  709.436237] PM: Removing info for No Bus:usbdev6.2_ep04
[  709.436596] PM: Removing info for usb:6-2:1.2
[  709.436932] PM: Removing info for usb:6-2:1.3
[  709.437280] PM: Removing info for No Bus:usbdev6.2_ep00
[  709.437654] PM: Removing info for usb:6-2



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFT 1/3] iwlwifi: port to cfg80211 rfkill
  2009-06-03 21:12   ` reinette chatre
@ 2009-06-04  9:03     ` Johannes Berg
  2009-06-04 16:02       ` reinette chatre
  0 siblings, 1 reply; 24+ messages in thread
From: Johannes Berg @ 2009-06-04  9:03 UTC (permalink / raw)
  To: reinette chatre; +Cc: linux-wireless@vger.kernel.org

[-- Attachment #1: Type: text/plain, Size: 3139 bytes --]

Reinette,

Thanks for the comprehensive test.

> * I tried this patch on top of latest wireless-testing (rc8 based) on a
> Sony laptop. After I bring the interface up I enabled rfkill and saw a
> gpf in the sony-laptop module (log is below). I tried this test many
> times after this and did not see this gpf again.
> 
> * I tried to load the modules with rfkill enabled and then disabled
> rfkill after interface up - that worked fine.
> 
> * In another test I had rfkill disabled and successfully associated with
> AP. I then enabled rfkill and was disassociated as expected. I then
> disabled rfkill again and used "iwconfig" to reassociate successfully. 
> 
> * In another test rfkill was disabled and I associated with AP. I then
> enabled and disabled rfkill rapidly and did not loose association.
> 
> In summary the testing went very well. There was that one gpf that
> clouded the testing a bit. I have no idea how it can be connected to the
> rfkill work though because the error appear to be contained in the
> sony-laptop module.

That looks like an error in sony-laptop, indeed. Should we go ahead with
the iwlwifi part then?

> [  709.366404] general protection fault: 0000 [#1] SMP 
> [  709.366551] last sysfs file: /sys/class/rfkill/rfkill5/state
> [  709.366616] CPU 1 

> [  709.369182] Pid: 66, comm: kacpi_notify Not tainted 2.6.30-rc8-wl #40 VGN-Z540N
> [  709.369182] RIP: 0010:[<ffffffffa0200dda>]  [<ffffffffa0200dda>] sony_nc_rfkill_set+0xa/0x40 [sony_laptop]
> [  709.369182] RSP: 0018:ffff8800bb663dc0  EFLAGS: 00010286
> [  709.369182] RAX: 0000000000000001 RBX: 0000000000000000 RCX: 0000000000000001
> [  709.369182] RDX: 0000000000000001 RSI: 0000000000000001 RDI: ffff880036f74480
> [  709.369182] RBP: ffff8800bb663dd0 R08: 0000000000000000 R09: 0000000000000000
> [  709.369182] R10: 0000000000000001 R11: 0000000000000001 R12: 0000000000000000
> [  709.369182] R13: 0000000000000000 R14: 0000000000000000 R15: ffff8800bb663df0
> [  709.369182] FS:  0000000000000000(0000) GS:ffff88000105e000(0000) knlGS:0000000000000000
> [  709.369182] CS:  0010 DS: 0018 ES: 0018 CR0: 000000008005003b
> [  709.369182] CR2: 00007ffff2051000 CR3: 00000000ba6b6000 CR4: 00000000000006e0
> [  709.369182] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> [  709.369182] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
> [  709.369182] Process kacpi_notify (pid: 66, threadinfo ffff8800bb662000, task ffff8800bb658f40)
> [  709.369182] Stack:
> [  709.369182]  0000000000000000 0000000000000000 ffff8800bb663e20 ffffffffa0203292
> [  709.369182]  ffff8800bb659548 0000000000000246 0000000000000202 ffff8800b729e2f8
> [  709.369182]  ffff8800b5371898 ffff8800bb658f40 ffff880001058ec0 ffffffff803b5596
> [  709.369182] Call Trace:
> [  709.369182]  [<ffffffffa0203292>] sony_nc_notify+0x222/0x260 [sony_laptop]
> [  709.369182]  [<ffffffff803b5596>] ? acpi_os_execute_deferred+0x0/0x39
> [  709.369182]  [<ffffffff803b8192>] acpi_device_notify+0x14/0x16

I wonder if sony has a race condition somewhere against itself.

johannes

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 801 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFT 1/3] iwlwifi: port to cfg80211 rfkill
  2009-06-04  9:03     ` Johannes Berg
@ 2009-06-04 16:02       ` reinette chatre
  0 siblings, 0 replies; 24+ messages in thread
From: reinette chatre @ 2009-06-04 16:02 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless@vger.kernel.org

Hi Johannes,

On Thu, 2009-06-04 at 02:03 -0700, Johannes Berg wrote:
> > In summary the testing went very well. There was that one gpf that
> > clouded the testing a bit. I have no idea how it can be connected to the
> > rfkill work though because the error appear to be contained in the
> > sony-laptop module.
> 
> That looks like an error in sony-laptop, indeed. Should we go ahead with
> the iwlwifi part then?

Please do. Please feel free to add my "tested-by" when you do so. Is it
possible to get this into 2.6.31?

I'll submit a bug for the issue I saw in sony-laptop and try to help to
get it resolved independently.

Reinette



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFT 2/3] ath9k: port to cfg80211 rfkill
  2009-06-02 11:10 ` [RFT 2/3] ath9k: " Johannes Berg
@ 2009-06-10 13:20   ` Vasanthakumar Thiagarajan
  2009-06-10 13:32     ` Vasanthakumar Thiagarajan
  2009-06-10 14:38     ` Johannes Berg
  0 siblings, 2 replies; 24+ messages in thread
From: Vasanthakumar Thiagarajan @ 2009-06-10 13:20 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless@vger.kernel.org, Luis Rodriguez

On Tue, Jun 02, 2009 at 04:40:29PM +0530, Johannes Berg wrote:
> This ports the ath9k rfkill code to the new API offered by
> cfg80211 and thus removes a lot of useless stuff.
> 

I get the following lockdep warning few times when tried to scan
after rfkill on/off. One more issue is, when rfkill is enabled before
reboot, I could not bring up the interface when the rfkill is turned
off after reboot. Apart from this it looks good, fixes a panic which
used to happen during module unload.

757.714408] 
[  757.714410]
=======================================================
[  757.714414] [ INFO: possible circular locking dependency detected
]
[  757.714418] 2.6.30-rc8-wl #87
[  757.714420]
-------------------------------------------------------
[  757.714423] iwlist/3121 is trying to acquire lock:
[  757.714425]  (cfg80211_mutex){+.+.+.}, at: [<f8952c1d>]
cfg80211_get_dev_from_ifindex+0x1d/0x80 [cfg80211]
[  757.714439] 
[  757.714440] but task is already holding lock:
[  757.714443]  (rtnl_mutex){+.+.+.}, at: [<c0307824>]
rtnl_lock+0x14/0x20
[  757.714453] 
[  757.714453] which lock already depends on the new lock.
[  757.714454] 
[  757.714457] 
[  757.714457] the existing dependency chain (in reverse order) is:
[  757.714460] 
[  757.714461] -> #2 (rtnl_mutex){+.+.+.}:
[  757.714466]        [<c015e17e>] __lock_acquire+0xece/0x1780
[  757.714473]        [<c015eb10>] lock_acquire+0xe0/0x110
[  757.714477]        [<c03bac0e>] mutex_lock_nested+0x5e/0x360
[  757.714484]        [<c0307824>] rtnl_lock+0x14/0x20
[  757.714488]        [<fbfc99cd>] 0xfbfc99cd
[  757.714501]        [<f9d2d975>] rfkill_set_block+0x65/0xd0
[rfkill]
[  757.714509]        [<f9d2dcd4>] rfkill_epo+0x44/0xa0 [rfkill]
[  757.714515]        [<f9d2e7ed>] rfkill_op_handler+0x5d/0x1c0
[rfkill]
[  757.714522]        [<c01459b0>] worker_thread+0x1c0/0x2f0
[  757.714528]        [<c0149deb>] kthread+0x4b/0x80
[  757.714532]        [<c01045e3>] kernel_thread_helper+0x7/0x10
[  757.714538]        [<ffffffff>] 0xffffffff
[  757.714545] 
[  757.714545] -> #1 (rfkill_global_mutex){+.+.+.}:
[  757.714550]        [<c015e17e>] __lock_acquire+0xece/0x1780
[  757.714555]        [<c015eb10>] lock_acquire+0xe0/0x110
[  757.714559]        [<c03bac0e>] mutex_lock_nested+0x5e/0x360
[  757.714564]        [<f9d2e3c4>] rfkill_register+0x24/0x270
[rfkill]
[  757.714572]        [<f89526e1>] wiphy_register+0x181/0x230
[cfg80211]
[  757.714579]        [<f8a05376>] ieee80211_register_hw+0x136/0x4d0
[mac80211]
[  757.714593]        [<f8a6b02c>] ath_attach+0x74c/0xa20 [ath9k]
[  757.714605]        [<f8a7300c>] ath_pci_probe+0x12c/0x2e0 [ath9k]
[  757.714614]        [<c02650c3>] local_pci_probe+0x13/0x20
[  757.714620]        [<c0265f78>] pci_device_probe+0x68/0x90
[  757.714625]        [<c02ce131>] driver_probe_device+0x71/0x170
[  757.714631]        [<c02ce2b9>] __driver_attach+0x89/0xa0
[  757.714635]        [<c02cd9bb>] bus_for_each_dev+0x5b/0x80
[  757.714639]        [<c02cdfde>] driver_attach+0x1e/0x20
[  757.714644]        [<c02cd2f7>] bus_add_driver+0x237/0x2f0
[  757.714648]        [<c02ce59a>] driver_register+0x7a/0x150
[  757.714652]        [<c02663d3>] __pci_register_driver+0x53/0xc0
[  757.714657]        [<f8a731dc>] ath_pci_init+0x1c/0x20 [ath9k]
[  757.714666]        [<f88c0022>] 0xf88c0022
[  757.714678]        [<c010112b>] do_one_initcall+0x2b/0x1c0
[  757.714682]        [<c0167c2a>] sys_init_module+0x8a/0x1d0
[  757.714687]        [<c0103b08>] sysenter_do_call+0x12/0x3c
[  757.714691]        [<ffffffff>] 0xffffffff
[  757.714709] 
[  757.714710] -> #0 (cfg80211_mutex){+.+.+.}:
[  757.714715]        [<c015e2b3>] __lock_acquire+0x1003/0x1780
[  757.714720]        [<c015eb10>] lock_acquire+0xe0/0x110
[  757.714724]        [<c03bac0e>] mutex_lock_nested+0x5e/0x360
[  757.714729]        [<f8952c1d>]
cfg80211_get_dev_from_ifindex+0x1d/0x80 [cfg80211]
[  757.714737]        [<f8956053>] cfg80211_wext_siwscan+0x43/0x210
[cfg80211]
[  757.714746]        [<c03a32a1>] ioctl_standard_call+0x1a1/0x3a0
[  757.714751]        [<c03a2daf>] wext_handle_ioctl+0x14f/0x220
[  757.714756]        [<c02ff325>] dev_ioctl+0x485/0x560
[  757.714760]        [<c02ec105>] sock_ioctl+0xf5/0x270
[  757.714765]        [<c01d22dd>] vfs_ioctl+0x2d/0x90
[  757.714771]        [<c01d23ba>] do_vfs_ioctl+0x7a/0x590
[  757.714775]        [<c01d293b>] sys_ioctl+0x6b/0x70
[  757.714779]        [<c0103b08>] sysenter_do_call+0x12/0x3c
[  757.714784]        [<ffffffff>] 0xffffffff
[  757.714795] 
[  757.714796] other info that might help us debug this:
[  757.714797] 
[  757.714799] 1 lock held by iwlist/3121:
[  757.714802]  #0:  (rtnl_mutex){+.+.+.}, at: [<c0307824>]
rtnl_lock+0x14/0x20
[  757.714809] 
[  757.714810] stack backtrace:
[  757.714813] Pid: 3121, comm: iwlist Not tainted 2.6.30-rc8-wl #87
[  757.714816] Call Trace:
[  757.714820]  [<c03b8f7f>] ? printk+0x1d/0x26
[  757.714825]  [<c015cddc>] print_circular_bug_tail+0xbc/0xc0
[  757.714829]  [<c015cb1b>] ? print_circular_bug_entry+0x4b/0x50
[  757.714834]  [<c015e2b3>] __lock_acquire+0x1003/0x1780
[  757.714839]  [<c015d3fd>] ? __lock_acquire+0x14d/0x1780
[  757.714848]  [<f8952c1d>] ?
cfg80211_get_dev_from_ifindex+0x1d/0x80 [cfg80211]
[  757.714852]  [<c015eb10>] lock_acquire+0xe0/0x110
[  757.714859]  [<f8952c1d>] ?
cfg80211_get_dev_from_ifindex+0x1d/0x80 [cfg80211]
[  757.714867]  [<f8952c1d>] ?
cfg80211_get_dev_from_ifindex+0x1d/0x80 [cfg80211]
[  757.714871]  [<c03bac0e>] mutex_lock_nested+0x5e/0x360
[  757.714878]  [<f8952c1d>] ?
cfg80211_get_dev_from_ifindex+0x1d/0x80 [cfg80211]
[  757.714883]  [<c015c282>] ? mark_held_locks+0x62/0x80
[  757.714888]  [<c01bf89c>] ? __kmalloc+0x9c/0x250
[  757.714895]  [<f8952c1d>] cfg80211_get_dev_from_ifindex+0x1d/0x80
[cfg80211]
[  757.714903]  [<f8956053>] cfg80211_wext_siwscan+0x43/0x210
[cfg80211]
[  757.714907]  [<c03a326b>] ? ioctl_standard_call+0x16b/0x3a0
[  757.714912]  [<c03a326b>] ? ioctl_standard_call+0x16b/0x3a0
[  757.714916]  [<c03a32a1>] ioctl_standard_call+0x1a1/0x3a0
[  757.714920]  [<c0307824>] ? rtnl_lock+0x14/0x20
[  757.714926]  [<c02fa905>] ? __dev_get_by_name+0x85/0xb0
[  757.714930]  [<c03a2daf>] wext_handle_ioctl+0x14f/0x220
[  757.714938]  [<f8956010>] ? cfg80211_wext_siwscan+0x0/0x210
[cfg80211]
[  757.714942]  [<c02ff325>] dev_ioctl+0x485/0x560
[  757.714947]  [<c02ec010>] ? sock_ioctl+0x0/0x270
[  757.714951]  [<c02ec105>] sock_ioctl+0xf5/0x270
[  757.714955]  [<c02ec010>] ? sock_ioctl+0x0/0x270
[  757.714959]  [<c01d22dd>] vfs_ioctl+0x2d/0x90
[  757.714964]  [<c01d23ba>] do_vfs_ioctl+0x7a/0x590
[  757.714969]  [<c01abf26>] ? handle_mm_fault+0x126/0x740
[  757.714975]  [<c0120bce>] ? do_page_fault+0x17e/0x2c0
[  757.714980]  [<c02555fc>] ? trace_hardirqs_off_thunk+0xc/0x10
[  757.714984]  [<c02555ec>] ? trace_hardirqs_on_thunk+0xc/0x10
[  757.714989]  [<c014e8bb>] ? up_read+0x1b/0x30
[  757.714993]  [<c0103b41>] ? sysenter_exit+0xf/0x1a
[  757.714997]  [<c01d293b>] sys_ioctl+0x6b/0x70
[  757.715001]  [<c0103b08>] sysenter_do_call+0x12/0x3c
[  757.715011] phy0: device no longer idle - scanning
[  758.876667] wlan0: dropped data frame to not associated station
00:00:00:00:00:00
[  763.813869] phy0: device now idle



^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFT 2/3] ath9k: port to cfg80211 rfkill
  2009-06-10 13:20   ` Vasanthakumar Thiagarajan
@ 2009-06-10 13:32     ` Vasanthakumar Thiagarajan
  2009-06-10 14:38     ` Johannes Berg
  1 sibling, 0 replies; 24+ messages in thread
From: Vasanthakumar Thiagarajan @ 2009-06-10 13:32 UTC (permalink / raw)
  To: Johannes Berg; +Cc: linux-wireless@vger.kernel.org, Luis Rodriguez

On Wed, Jun 10, 2009 at 06:50:16PM +0530, Vasanth Thiagarajan wrote:
> On Tue, Jun 02, 2009 at 04:40:29PM +0530, Johannes Berg wrote:
> > This ports the ath9k rfkill code to the new API offered by
> > cfg80211 and thus removes a lot of useless stuff.
> >
> 
> I get the following lockdep warning few times when tried to scan
> after rfkill on/off. One more issue is, when rfkill is enabled before
> reboot, I could not bring up the interface when the rfkill is turned
> off after reboot. Apart from this it looks good, fixes a panic which
> used to happen during module unload.
> 
> [  757.714466]        [<c015e17e>] __lock_acquire+0xece/0x1780
> [  757.714473]        [<c015eb10>] lock_acquire+0xe0/0x110
> [  757.714477]        [<c03bac0e>] mutex_lock_nested+0x5e/0x360
> [  757.714484]        [<c0307824>] rtnl_lock+0x14/0x20
> [  757.714488]        [<fbfc99cd>] 0xfbfc99cd
> [  757.714501]        [<f9d2d975>] rfkill_set_block+0x65/0xd0
> [rfkill]
> [  757.714509]        [<f9d2dcd4>] rfkill_epo+0x44/0xa0 [rfkill]
> [  757.714515]        [<f9d2e7ed>] rfkill_op_handler+0x5d/0x1c0
> [rfkill]
> [  757.714522]        [<c01459b0>] worker_thread+0x1c0/0x2f0
> [  757.714528]        [<c0149deb>] kthread+0x4b/0x80
> [  757.714532]        [<c01045e3>] kernel_thread_helper+0x7/0x10
> [  757.714538]        [<ffffffff>] 0xffffffff
> [  757.714545]
> [  757.714545] -> #1 (rfkill_global_mutex){+.+.+.}:
> [  757.714550]        [<c015e17e>] __lock_acquire+0xece/0x1780
> [  757.714555]        [<c015eb10>] lock_acquire+0xe0/0x110
> [  757.714559]        [<c03bac0e>] mutex_lock_nested+0x5e/0x360
> [  757.714564]        [<f9d2e3c4>] rfkill_register+0x24/0x270
> [rfkill]
> [  757.714572]        [<f89526e1>] wiphy_register+0x181/0x230
> [cfg80211]
> [  757.714579]        [<f8a05376>] ieee80211_register_hw+0x136/0x4d0
> [mac80211]
> [  757.714593]        [<f8a6b02c>] ath_attach+0x74c/0xa20 [ath9k]
> [  757.714605]        [<f8a7300c>] ath_pci_probe+0x12c/0x2e0 [ath9k]
> [  757.714614]        [<c02650c3>] local_pci_probe+0x13/0x20
> [  757.714620]        [<c0265f78>] pci_device_probe+0x68/0x90
> [  757.714625]        [<c02ce131>] driver_probe_device+0x71/0x170
> [  757.714631]        [<c02ce2b9>] __driver_attach+0x89/0xa0
> [  757.714635]        [<c02cd9bb>] bus_for_each_dev+0x5b/0x80
> [  757.714639]        [<c02cdfde>] driver_attach+0x1e/0x20
> [  757.714644]        [<c02cd2f7>] bus_add_driver+0x237/0x2f0
> [  757.714648]        [<c02ce59a>] driver_register+0x7a/0x150
> [  757.714652]        [<c02663d3>] __pci_register_driver+0x53/0xc0
> [  757.714657]        [<f8a731dc>] ath_pci_init+0x1c/0x20 [ath9k]
> [  757.714666]        [<f88c0022>] 0xf88c0022
> [  757.714678]        [<c010112b>] do_one_initcall+0x2b/0x1c0
> [  757.714682]        [<c0167c2a>] sys_init_module+0x8a/0x1d0
> [  757.714687]        [<c0103b08>] sysenter_do_call+0x12/0x3c
> [  757.714691]        [<ffffffff>] 0xffffffff
> [  757.714709]


I was doing load/unload along with rf on/off and scan.

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFT 2/3] ath9k: port to cfg80211 rfkill
  2009-06-10 13:20   ` Vasanthakumar Thiagarajan
  2009-06-10 13:32     ` Vasanthakumar Thiagarajan
@ 2009-06-10 14:38     ` Johannes Berg
  2009-06-11  6:52       ` Vasanthakumar Thiagarajan
  1 sibling, 1 reply; 24+ messages in thread
From: Johannes Berg @ 2009-06-10 14:38 UTC (permalink / raw)
  To: Vasanthakumar Thiagarajan; +Cc: linux-wireless@vger.kernel.org, Luis Rodriguez

[-- Attachment #1: Type: text/plain, Size: 966 bytes --]

On Wed, 2009-06-10 at 18:50 +0530, Vasanthakumar Thiagarajan wrote:
> On Tue, Jun 02, 2009 at 04:40:29PM +0530, Johannes Berg wrote:
> > This ports the ath9k rfkill code to the new API offered by
> > cfg80211 and thus removes a lot of useless stuff.
> > 
> 
> I get the following lockdep warning few times when tried to scan
> after rfkill on/off. 

Thanks, will fix, this doesn't seem to be ath9k specific. It's the
dreaded locking in rfkill. I can work around it easily in cfg80211, or
fix rfkill, will see what's easier.

> One more issue is, when rfkill is enabled before
> reboot, I could not bring up the interface when the rfkill is turned
> off after reboot. 

Sounds like the driver doesn't initialise properly. Hmm, maybe we just
need to move ath_start_rfkill_poll() to ath_attach(), could you please
try that?

> Apart from this it looks good, fixes a panic which
> used to happen during module unload.

Heh.

Thanks,
johannes

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 801 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFT 2/3] ath9k: port to cfg80211 rfkill
  2009-06-10 14:38     ` Johannes Berg
@ 2009-06-11  6:52       ` Vasanthakumar Thiagarajan
  2009-06-11  9:57         ` Johannes Berg
  0 siblings, 1 reply; 24+ messages in thread
From: Vasanthakumar Thiagarajan @ 2009-06-11  6:52 UTC (permalink / raw)
  To: Johannes Berg
  Cc: Vasanth Thiagarajan, linux-wireless@vger.kernel.org,
	Luis Rodriguez

On Wed, Jun 10, 2009 at 08:08:32PM +0530, Johannes Berg wrote:
> 
> Thanks, will fix, this doesn't seem to be ath9k specific. It's the
> dreaded locking in rfkill. I can work around it easily in cfg80211, or
> fix rfkill, will see what's easier.

Thanks.
> 
> > One more issue is, when rfkill is enabled before
> > reboot, I could not bring up the interface when the rfkill is turned
> > off after reboot. 
> 
> Sounds like the driver doesn't initialise properly.

I dont think this one is driver specific as this happens
only when module is loaded at boot time. I works fine after ath9k
is reloaded.

> need to move ath_start_rfkill_poll() to ath_attach(), could you please
> try that?

We do hw reset during radio enable/disable, this needs current
channel to be configured but i'm not sure if we need to do all these
during attach time.

Thanks,

Vasanth


^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFT 2/3] ath9k: port to cfg80211 rfkill
  2009-06-11  6:52       ` Vasanthakumar Thiagarajan
@ 2009-06-11  9:57         ` Johannes Berg
  2009-06-11  9:59           ` Vasanthakumar Thiagarajan
  0 siblings, 1 reply; 24+ messages in thread
From: Johannes Berg @ 2009-06-11  9:57 UTC (permalink / raw)
  To: Vasanthakumar Thiagarajan
  Cc: Vasanth Thiagarajan, linux-wireless@vger.kernel.org,
	Luis Rodriguez

[-- Attachment #1: Type: text/plain, Size: 951 bytes --]

On Thu, 2009-06-11 at 12:22 +0530, Vasanthakumar Thiagarajan wrote:

> > > One more issue is, when rfkill is enabled before
> > > reboot, I could not bring up the interface when the rfkill is turned
> > > off after reboot. 
> > 
> > Sounds like the driver doesn't initialise properly.
> 
> I dont think this one is driver specific as this happens
> only when module is loaded at boot time. I works fine after ath9k
> is reloaded.

That's strange. I don't see anything in the core that would behave
differently between those two paths.

> > need to move ath_start_rfkill_poll() to ath_attach(), could you please
> > try that?
> 
> We do hw reset during radio enable/disable, this needs current
> channel to be configured but i'm not sure if we need to do all these
> during attach time.

Well, the thing is that currently ath_start_rfkill_poll() will never be
called until you try bringing the interface up, afaict?

johannes

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 801 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFT 2/3] ath9k: port to cfg80211 rfkill
  2009-06-11  9:57         ` Johannes Berg
@ 2009-06-11  9:59           ` Vasanthakumar Thiagarajan
  2009-06-11 10:10             ` Johannes Berg
  0 siblings, 1 reply; 24+ messages in thread
From: Vasanthakumar Thiagarajan @ 2009-06-11  9:59 UTC (permalink / raw)
  To: Johannes Berg
  Cc: Vasanth Thiagarajan, linux-wireless@vger.kernel.org,
	Luis Rodriguez

On Thu, Jun 11, 2009 at 03:27:41PM +0530, Johannes Berg wrote:
> 
> Well, the thing is that currently ath_start_rfkill_poll() will never be
> called until you try bringing the interface up, afaict?

right.

Vasanth

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFT 2/3] ath9k: port to cfg80211 rfkill
  2009-06-11  9:59           ` Vasanthakumar Thiagarajan
@ 2009-06-11 10:10             ` Johannes Berg
  2009-06-11 10:39               ` Vasanthakumar Thiagarajan
  0 siblings, 1 reply; 24+ messages in thread
From: Johannes Berg @ 2009-06-11 10:10 UTC (permalink / raw)
  To: Vasanthakumar Thiagarajan
  Cc: Vasanth Thiagarajan, linux-wireless@vger.kernel.org,
	Luis Rodriguez

[-- Attachment #1: Type: text/plain, Size: 636 bytes --]

On Thu, 2009-06-11 at 15:29 +0530, Vasanthakumar Thiagarajan wrote:
> On Thu, Jun 11, 2009 at 03:27:41PM +0530, Johannes Berg wrote:
> > 
> > Well, the thing is that currently ath_start_rfkill_poll() will never be
> > called until you try bringing the interface up, afaict?
> 
> right.

But that's undesirable, especially if for some reason we already know
it's in rfkill, we really want to know about the rfkill state even when
the interface is down so userspace can properly react to it and not even
give the user the option of bringing the interfaces up.

Hence my suggestion of moving the start_polling().

johannes

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 801 bytes --]

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFT 2/3] ath9k: port to cfg80211 rfkill
  2009-06-11 10:10             ` Johannes Berg
@ 2009-06-11 10:39               ` Vasanthakumar Thiagarajan
  2009-06-11 10:40                 ` Vasanthakumar Thiagarajan
  0 siblings, 1 reply; 24+ messages in thread
From: Vasanthakumar Thiagarajan @ 2009-06-11 10:39 UTC (permalink / raw)
  To: Johannes Berg
  Cc: Vasanth Thiagarajan, linux-wireless@vger.kernel.org,
	Luis Rodriguez

On Thu, Jun 11, 2009 at 03:40:03PM +0530, Johannes Berg wrote:
> 
> But that's undesirable, especially if for some reason we already know
> it's in rfkill, we really want to know about the rfkill state even when
> the interface is down so userspace can properly react to it and not even
> give the user the option of bringing the interfaces up.
> 
> Hence my suggestion of moving the start_polling().

I agree, will move it to ath9k_start().


Vasanth

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [RFT 2/3] ath9k: port to cfg80211 rfkill
  2009-06-11 10:39               ` Vasanthakumar Thiagarajan
@ 2009-06-11 10:40                 ` Vasanthakumar Thiagarajan
  0 siblings, 0 replies; 24+ messages in thread
From: Vasanthakumar Thiagarajan @ 2009-06-11 10:40 UTC (permalink / raw)
  To: Vasanth Thiagarajan
  Cc: Johannes Berg, linux-wireless@vger.kernel.org, Luis Rodriguez

On Thu, Jun 11, 2009 at 04:09:55PM +0530, Vasanth Thiagarajan wrote:
> On Thu, Jun 11, 2009 at 03:40:03PM +0530, Johannes Berg wrote:
> >
> > But that's undesirable, especially if for some reason we already know
> > it's in rfkill, we really want to know about the rfkill state even when
> > the interface is down so userspace can properly react to it and not even
> > give the user the option of bringing the interfaces up.
> >
> > Hence my suggestion of moving the start_polling().
> 
> I agree, will move it to ath9k_start().
> 
sorry, to ath_attach();

^ permalink raw reply	[flat|nested] 24+ messages in thread

end of thread, other threads:[~2009-06-11 10:42 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-06-02 11:10 [RFT 0/3] driver rfkill to cfg80211 ports Johannes Berg
2009-06-02 11:10 ` [RFT 1/3] iwlwifi: port to cfg80211 rfkill Johannes Berg
2009-06-03 21:12   ` reinette chatre
2009-06-04  9:03     ` Johannes Berg
2009-06-04 16:02       ` reinette chatre
2009-06-02 11:10 ` [RFT 2/3] ath9k: " Johannes Berg
2009-06-10 13:20   ` Vasanthakumar Thiagarajan
2009-06-10 13:32     ` Vasanthakumar Thiagarajan
2009-06-10 14:38     ` Johannes Berg
2009-06-11  6:52       ` Vasanthakumar Thiagarajan
2009-06-11  9:57         ` Johannes Berg
2009-06-11  9:59           ` Vasanthakumar Thiagarajan
2009-06-11 10:10             ` Johannes Berg
2009-06-11 10:39               ` Vasanthakumar Thiagarajan
2009-06-11 10:40                 ` Vasanthakumar Thiagarajan
2009-06-02 11:10 ` [RFT 3/3] b43/legacy: " Johannes Berg
2009-06-02 14:41   ` Michael Buesch
2009-06-02 20:04     ` Johannes Berg
2009-06-02 20:08       ` Michael Buesch
2009-06-02 20:11         ` Johannes Berg
2009-06-02 20:59           ` Larry Finger
2009-06-02 21:01             ` Johannes Berg
2009-06-02 23:26               ` Larry Finger
2009-06-03  7:52             ` Johannes Berg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).