linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Holger Schurig <holgerschurig@gmail.com>
To: linux-wireless@vger.kernel.org,
	John Linville <linville@tuxdriver.com>,
	Dan Williams <dcbw@redhat.com>
Subject: [PATCH] libertas: move scan-related code into scan.c
Date: Thu, 26 Nov 2009 13:28:28 +0100	[thread overview]
Message-ID: <200911261328.28811.holgerschurig@gmail.com> (raw)

As libertas + cfg80211 will have it's own scan code, it's nicer
when scan-related code piece don't remain in main.c.

Signed-off-by: Holger Schurig <holgerschurig@gmail.com>


--- linux-wl.orig/drivers/net/wireless/libertas/cmd.c
+++ linux-wl/drivers/net/wireless/libertas/cmd.c
@@ -174,11 +174,6 @@ int lbs_update_hw_spec(struct lbs_privat
 	if (priv->mesh_dev)
 		memcpy(priv->mesh_dev->dev_addr, priv->current_addr, ETH_ALEN);
 
-	if (lbs_set_regiontable(priv)) {
-		ret = -1;
-		goto out;
-	}
-
 out:
 	lbs_deb_leave(LBS_DEB_CMD);
 	return ret;
--- linux-wl.orig/drivers/net/wireless/libertas/scan.c
+++ linux-wl/drivers/net/wireless/libertas/scan.c
@@ -648,7 +648,7 @@ out:
 	return ret;
 }
 
-void lbs_scan_worker(struct work_struct *work)
+static void lbs_scan_worker(struct work_struct *work)
 {
 	struct lbs_private *priv =
 		container_of(work, struct lbs_private, scan_work.work);
@@ -1354,3 +1354,74 @@ done:
 	lbs_deb_leave_args(LBS_DEB_SCAN, "ret %d", ret);
 	return ret;
 }
+
+
+
+/*
+ * called at lbs_add_card() time
+ *
+ * At this time no firmware command execution has been done, nor is command
+ * execution already possible.
+ *
+ */
+int lbs_scan_alloc(struct lbs_private *priv)
+{
+	int i, ret = 0;
+	size_t bufsize;
+
+	lbs_deb_enter(LBS_DEB_SCAN);
+
+	INIT_DELAYED_WORK(&priv->scan_work, lbs_scan_worker);
+
+	/* Allocate buffer to store the BSSID list */
+	bufsize = MAX_NETWORK_COUNT * sizeof(struct bss_descriptor);
+	priv->networks = kzalloc(bufsize, GFP_KERNEL);
+	if (!priv->networks) {
+		lbs_pr_err("Out of memory allocating beacons\n");
+		ret = -ENOMEM;
+		goto done;
+	}
+
+	/* Initialize scan result lists */
+	INIT_LIST_HEAD(&priv->network_free_list);
+	INIT_LIST_HEAD(&priv->network_list);
+	for (i = 0; i < MAX_NETWORK_COUNT; i++) {
+		list_add_tail(&priv->networks[i].list,
+			      &priv->network_free_list);
+	}
+done:
+	lbs_deb_leave_args(LBS_DEB_SCAN, "ret %d", ret);
+	return ret;
+}
+
+
+/*
+ * called via lbs_start_card(), after lbs_set_regiontable() has been run
+ */
+int lbs_scan_init(struct lbs_private *priv)
+{
+	int ret;
+
+	lbs_deb_enter(LBS_DEB_SCAN);
+
+	ret = lbs_set_regiontable(priv);
+
+	lbs_deb_leave_args(LBS_DEB_SCAN, "ret %d", ret);
+	return ret;
+}
+
+
+/*
+ * Called at lbs_stop_card() / lbs_remove_card() time.
+ */
+void lbs_scan_deinit(struct lbs_private *priv)
+{
+	lbs_deb_enter(LBS_DEB_SCAN);
+
+	cancel_delayed_work_sync(&priv->scan_work);
+
+	kfree(priv->networks);
+	priv->networks = NULL;
+
+	lbs_deb_leave(LBS_DEB_SCAN);
+}
--- linux-wl.orig/drivers/net/wireless/libertas/scan.h
+++ linux-wl/drivers/net/wireless/libertas/scan.h
@@ -58,6 +58,8 @@ int lbs_set_scan(struct net_device *dev,
 
 int lbs_scan_networks(struct lbs_private *priv, int full_scan);
 
-void lbs_scan_worker(struct work_struct *work);
+int lbs_scan_alloc(struct lbs_private *priv);
+int lbs_scan_init(struct lbs_private *priv);
+void lbs_scan_deinit(struct lbs_private *priv);
 
 #endif
--- linux-wl.orig/drivers/net/wireless/libertas/main.c
+++ linux-wl/drivers/net/wireless/libertas/main.c
@@ -808,27 +808,13 @@ int lbs_exit_auto_deep_sleep(struct lbs_
 
 static int lbs_init_adapter(struct lbs_private *priv)
 {
-	size_t bufsize;
-	int i, ret = 0;
+	int ret;
 
 	lbs_deb_enter(LBS_DEB_MAIN);
 
-	/* Allocate buffer to store the BSSID list */
-	bufsize = MAX_NETWORK_COUNT * sizeof(struct bss_descriptor);
-	priv->networks = kzalloc(bufsize, GFP_KERNEL);
-	if (!priv->networks) {
-		lbs_pr_err("Out of memory allocating beacons\n");
-		ret = -1;
+	ret = lbs_scan_alloc(priv);
+	if (ret)
 		goto out;
-	}
-
-	/* Initialize scan result lists */
-	INIT_LIST_HEAD(&priv->network_free_list);
-	INIT_LIST_HEAD(&priv->network_list);
-	for (i = 0; i < MAX_NETWORK_COUNT; i++) {
-		list_add_tail(&priv->networks[i].list,
-			      &priv->network_free_list);
-	}
 
 	memset(priv->current_addr, 0xff, ETH_ALEN);
 
@@ -891,8 +877,6 @@ static void lbs_free_adapter(struct lbs_
 		kfifo_free(priv->event_fifo);
 	del_timer(&priv->command_timer);
 	del_timer(&priv->auto_deepsleep_timer);
-	kfree(priv->networks);
-	priv->networks = NULL;
 
 	lbs_deb_leave(LBS_DEB_MAIN);
 }
@@ -981,7 +965,6 @@ struct lbs_private *lbs_add_card(void *c
 
 	priv->work_thread = create_singlethread_workqueue("lbs_worker");
 	INIT_DELAYED_WORK(&priv->assoc_work, lbs_association_worker);
-	INIT_DELAYED_WORK(&priv->scan_work, lbs_scan_worker);
 	INIT_WORK(&priv->mcast_work, lbs_set_mcast_worker);
 
 	priv->wol_criteria = 0xffffffff;
@@ -1015,10 +998,10 @@ void lbs_remove_card(struct lbs_private 
 
 	lbs_remove_mesh(priv);
 	lbs_remove_rtap(priv);
+	lbs_scan_deinit(priv);
 
 	dev = priv->dev;
 
-	cancel_delayed_work_sync(&priv->scan_work);
 	cancel_delayed_work_sync(&priv->assoc_work);
 	cancel_work_sync(&priv->mcast_work);
 
@@ -1084,6 +1067,10 @@ int lbs_start_card(struct lbs_private *p
 		goto done;
 	}
 
+	ret = lbs_scan_init(priv);
+	if (ret)
+		goto done;
+
 	lbs_update_channel(priv);
 
 	lbs_init_mesh(priv);
--- linux-wl.orig/drivers/net/wireless/libertas/cfg.h
+++ linux-wl/drivers/net/wireless/libertas/cfg.h
@@ -10,7 +10,6 @@ void lbs_cfg_free(struct lbs_private *pr
 int lbs_send_specific_ssid_scan(struct lbs_private *priv, u8 *ssid,
 	u8 ssid_len);
 int lbs_scan_networks(struct lbs_private *priv, int full_scan);
-void lbs_cfg_scan_worker(struct work_struct *work);
 
 
 #endif
--- linux-wl.orig/drivers/net/wireless/libertas/dev.h
+++ linux-wl/drivers/net/wireless/libertas/dev.h
@@ -161,6 +161,9 @@ struct lbs_private {
 
 	/** Scanning */
 	struct delayed_work scan_work;
+	struct list_head network_list;
+	struct list_head network_free_list;
+	struct bss_descriptor *networks;
 	int scan_channel;
 	/* remember which channel was scanned last, != 0 if currently scanning */
 	u8 scan_ssid[IEEE80211_MAX_SSID_LEN + 1];
@@ -170,11 +173,8 @@ struct lbs_private {
 	struct delayed_work assoc_work;
 	struct current_bss_params curbssparams;
 	u8 mode;
-	struct list_head network_list;
-	struct list_head network_free_list;
-	struct bss_descriptor *networks;
-	struct assoc_request * pending_assoc_req;
-	struct assoc_request * in_progress_assoc_req;
+	struct assoc_request *pending_assoc_req;
+	struct assoc_request *in_progress_assoc_req;
 	uint16_t enablehwauto;
 
 	/* ADHOC */

-- 
http://www.holgerschurig.de

                 reply	other threads:[~2009-11-26 12:28 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200911261328.28811.holgerschurig@gmail.com \
    --to=holgerschurig@gmail.com \
    --cc=dcbw@redhat.com \
    --cc=linux-wireless@vger.kernel.org \
    --cc=linville@tuxdriver.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).