diff options
author | Holger Schurig <hs4233@mail.mn-solutions.de> | 2007-05-25 12:04:31 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2007-06-11 14:28:38 -0400 |
commit | 32a74b7c8f7b883b532e0e4333b7c3014d3d8fe8 (patch) | |
tree | ef19ed4732bfd73818f6ddfc83b90e2b3eb4363d /drivers/net/wireless/libertas | |
parent | 3874d0fefd965eedfc7f8e0a5459ddf914eb4306 (diff) |
[PATCH] libertas: split wlan_add_card()
Split wlan_add_card() into a part that just setups kernel parameters and
into the function libertas_activate_card(), which will implizitly use
hardware functions by the started thread.
This allows us later to do something like this:
priv = libertas_add_card();
priv->hw_command_to_host = if_usb_command_to_host;
priv->hw_xxxx = if_usb_xxxx;
priv->hw_yyyy = if_usb_yyyy;
wlan_activate_card()
and of course the CF driver can set it's own functions.
Signed-off-by: Holger Schurig <hs4233@mail.mn-solutions.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/libertas')
-rw-r--r-- | drivers/net/wireless/libertas/decl.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/libertas/if_usb.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/libertas/main.c | 26 |
3 files changed, 24 insertions, 6 deletions
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h index b0694fe20f3..96d22b1f25d 100644 --- a/drivers/net/wireless/libertas/decl.h +++ b/drivers/net/wireless/libertas/decl.h @@ -77,6 +77,7 @@ void libertas_send_iwevcustom_event(wlan_private * priv, s8 * str); extern struct chan_freq_power *libertas_get_region_cfp_table(u8 region, u8 band, int *cfp_no); wlan_private *wlan_add_card(void *card); +int libertas_activate_card(wlan_private *priv); int wlan_remove_card(wlan_private *priv); int wlan_add_mesh(wlan_private *priv); void wlan_remove_mesh(wlan_private *priv); diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c index 99f4ba35d6e..e4caf3e4b35 100644 --- a/drivers/net/wireless/libertas/if_usb.c +++ b/drivers/net/wireless/libertas/if_usb.c @@ -195,6 +195,9 @@ static int if_usb_probe(struct usb_interface *intf, if (!(priv = wlan_add_card(usb_cardp))) goto dealloc; + if (libertas_activate_card(priv)) + goto dealloc; + if (libertas_found < MAX_DEVS) { libertas_devs[libertas_found] = priv->wlan_dev.netdev; libertas_found++; diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c index 417f9277137..44a632e4ce4 100644 --- a/drivers/net/wireless/libertas/main.c +++ b/drivers/net/wireless/libertas/main.c @@ -812,6 +812,21 @@ wlan_private *wlan_add_card(void *card) spin_lock_init(&priv->adapter->driver_lock); init_waitqueue_head(&priv->adapter->cmd_pending); priv->adapter->nr_cmd_pending = 0; + goto done; + +err_kzalloc: + free_netdev(dev); +done: + lbs_deb_leave_args(LBS_DEB_NET, "priv %p", priv); + return priv; +} + +int libertas_activate_card(wlan_private *priv) +{ + struct net_device *dev = priv->wlan_dev.netdev; + int ret = -1; + + lbs_deb_enter(LBS_DEB_MAIN); lbs_deb_thread("Starting kthread...\n"); priv->mainthread.priv = priv; @@ -847,8 +862,8 @@ wlan_private *wlan_add_card(void *card) libertas_debugfs_init_one(priv, dev); - lbs_deb_leave_args(LBS_DEB_NET, "priv %p", priv); - return priv; + ret = 0; + goto done; err_init_fw: libertas_sbi_unregister_dev(priv); @@ -858,11 +873,10 @@ err_registerdev: wake_up_interruptible(&priv->mainthread.waitq); wlan_terminate_thread(&priv->mainthread); kfree(priv->adapter); -err_kzalloc: free_netdev(dev); - - lbs_deb_leave_args(LBS_DEB_NET, "priv NULL"); - return NULL; +done: + lbs_deb_leave_args(LBS_DEB_NET, "ret %d", ret); + return ret; } /** |