aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/b43/Makefile1
-rw-r--r--drivers/net/wireless/b43/b43.h4
-rw-r--r--drivers/net/wireless/b43/bus.c36
-rw-r--r--drivers/net/wireless/b43/bus.h17
-rw-r--r--drivers/net/wireless/b43/main.c30
5 files changed, 74 insertions, 14 deletions
diff --git a/drivers/net/wireless/b43/Makefile b/drivers/net/wireless/b43/Makefile
index cef334a8c669..95f7c001fda1 100644
--- a/drivers/net/wireless/b43/Makefile
+++ b/drivers/net/wireless/b43/Makefile
@@ -1,4 +1,5 @@
1b43-y += main.o 1b43-y += main.o
2b43-y += bus.o
2b43-y += tables.o 3b43-y += tables.o
3b43-$(CONFIG_B43_PHY_N) += tables_nphy.o 4b43-$(CONFIG_B43_PHY_N) += tables_nphy.o
4b43-$(CONFIG_B43_PHY_N) += radio_2055.o 5b43-$(CONFIG_B43_PHY_N) += radio_2055.o
diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h
index 25a78cfb7d15..bb81ebcf512e 100644
--- a/drivers/net/wireless/b43/b43.h
+++ b/drivers/net/wireless/b43/b43.h
@@ -11,6 +11,7 @@
11#include "debugfs.h" 11#include "debugfs.h"
12#include "leds.h" 12#include "leds.h"
13#include "rfkill.h" 13#include "rfkill.h"
14#include "bus.h"
14#include "lo.h" 15#include "lo.h"
15#include "phy_common.h" 16#include "phy_common.h"
16 17
@@ -707,7 +708,8 @@ enum {
707 708
708/* Data structure for one wireless device (802.11 core) */ 709/* Data structure for one wireless device (802.11 core) */
709struct b43_wldev { 710struct b43_wldev {
710 struct ssb_device *sdev; 711 struct ssb_device *sdev; /* TODO: remove when b43_bus_dev is ready */
712 struct b43_bus_dev *dev;
711 struct b43_wl *wl; 713 struct b43_wl *wl;
712 714
713 /* The device initialization status. 715 /* The device initialization status.
diff --git a/drivers/net/wireless/b43/bus.c b/drivers/net/wireless/b43/bus.c
new file mode 100644
index 000000000000..f8ccd2cea3f9
--- /dev/null
+++ b/drivers/net/wireless/b43/bus.c
@@ -0,0 +1,36 @@
1/*
2
3 Broadcom B43 wireless driver
4 Bus abstraction layer
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
19 Boston, MA 02110-1301, USA.
20
21*/
22
23#include "b43.h"
24#include "bus.h"
25
26
27/* SSB */
28struct b43_bus_dev *b43_bus_dev_ssb_init(struct ssb_device *sdev)
29{
30 struct b43_bus_dev *dev = kzalloc(sizeof(*dev), GFP_KERNEL);
31
32 dev->bus_type = B43_BUS_SSB;
33 dev->sdev = sdev;
34
35 return dev;
36}
diff --git a/drivers/net/wireless/b43/bus.h b/drivers/net/wireless/b43/bus.h
new file mode 100644
index 000000000000..68bc00a7458e
--- /dev/null
+++ b/drivers/net/wireless/b43/bus.h
@@ -0,0 +1,17 @@
1#ifndef B43_BUS_H_
2#define B43_BUS_H_
3
4enum b43_bus_type {
5 B43_BUS_SSB,
6};
7
8struct b43_bus_dev {
9 enum b43_bus_type bus_type;
10 union {
11 struct ssb_device *sdev;
12 };
13};
14
15struct b43_bus_dev *b43_bus_dev_ssb_init(struct ssb_device *sdev);
16
17#endif /* B43_BUS_H_ */
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index 1e81a0d6f543..6356fbc8aec1 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -4845,7 +4845,7 @@ err_powerdown:
4845 return err; 4845 return err;
4846} 4846}
4847 4847
4848static void b43_one_core_detach(struct ssb_device *dev) 4848static void b43_one_core_detach(struct b43_bus_dev *dev)
4849{ 4849{
4850 struct b43_wldev *wldev; 4850 struct b43_wldev *wldev;
4851 struct b43_wl *wl; 4851 struct b43_wl *wl;
@@ -4853,17 +4853,17 @@ static void b43_one_core_detach(struct ssb_device *dev)
4853 /* Do not cancel ieee80211-workqueue based work here. 4853 /* Do not cancel ieee80211-workqueue based work here.
4854 * See comment in b43_remove(). */ 4854 * See comment in b43_remove(). */
4855 4855
4856 wldev = ssb_get_drvdata(dev); 4856 wldev = ssb_get_drvdata(dev->sdev);
4857 wl = wldev->wl; 4857 wl = wldev->wl;
4858 b43_debugfs_remove_device(wldev); 4858 b43_debugfs_remove_device(wldev);
4859 b43_wireless_core_detach(wldev); 4859 b43_wireless_core_detach(wldev);
4860 list_del(&wldev->list); 4860 list_del(&wldev->list);
4861 wl->nr_devs--; 4861 wl->nr_devs--;
4862 ssb_set_drvdata(dev, NULL); 4862 ssb_set_drvdata(dev->sdev, NULL);
4863 kfree(wldev); 4863 kfree(wldev);
4864} 4864}
4865 4865
4866static int b43_one_core_attach(struct ssb_device *dev, struct b43_wl *wl) 4866static int b43_one_core_attach(struct b43_bus_dev *dev, struct b43_wl *wl)
4867{ 4867{
4868 struct b43_wldev *wldev; 4868 struct b43_wldev *wldev;
4869 int err = -ENOMEM; 4869 int err = -ENOMEM;
@@ -4873,7 +4873,8 @@ static int b43_one_core_attach(struct ssb_device *dev, struct b43_wl *wl)
4873 goto out; 4873 goto out;
4874 4874
4875 wldev->use_pio = b43_modparam_pio; 4875 wldev->use_pio = b43_modparam_pio;
4876 wldev->sdev = dev; 4876 wldev->dev = dev;
4877 wldev->sdev = dev->sdev; /* TODO: Remove when not needed */
4877 wldev->wl = wl; 4878 wldev->wl = wl;
4878 b43_set_status(wldev, B43_STAT_UNINIT); 4879 b43_set_status(wldev, B43_STAT_UNINIT);
4879 wldev->bad_frames_preempt = modparam_bad_frames_preempt; 4880 wldev->bad_frames_preempt = modparam_bad_frames_preempt;
@@ -4885,7 +4886,7 @@ static int b43_one_core_attach(struct ssb_device *dev, struct b43_wl *wl)
4885 4886
4886 list_add(&wldev->list, &wl->devlist); 4887 list_add(&wldev->list, &wl->devlist);
4887 wl->nr_devs++; 4888 wl->nr_devs++;
4888 ssb_set_drvdata(dev, wldev); 4889 ssb_set_drvdata(dev->sdev, wldev);
4889 b43_debugfs_add_device(wldev); 4890 b43_debugfs_add_device(wldev);
4890 4891
4891 out: 4892 out:
@@ -4926,11 +4927,11 @@ static void b43_sprom_fixup(struct ssb_bus *bus)
4926 } 4927 }
4927} 4928}
4928 4929
4929static void b43_wireless_exit(struct ssb_device *dev, struct b43_wl *wl) 4930static void b43_wireless_exit(struct b43_bus_dev *dev, struct b43_wl *wl)
4930{ 4931{
4931 struct ieee80211_hw *hw = wl->hw; 4932 struct ieee80211_hw *hw = wl->hw;
4932 4933
4933 ssb_set_devtypedata(dev, NULL); 4934 ssb_set_devtypedata(dev->sdev, NULL);
4934 ieee80211_free_hw(hw); 4935 ieee80211_free_hw(hw);
4935} 4936}
4936 4937
@@ -4985,10 +4986,13 @@ static struct b43_wl *b43_wireless_init(struct ssb_device *dev)
4985static 4986static
4986int b43_ssb_probe(struct ssb_device *sdev, const struct ssb_device_id *id) 4987int b43_ssb_probe(struct ssb_device *sdev, const struct ssb_device_id *id)
4987{ 4988{
4989 struct b43_bus_dev *dev;
4988 struct b43_wl *wl; 4990 struct b43_wl *wl;
4989 int err; 4991 int err;
4990 int first = 0; 4992 int first = 0;
4991 4993
4994 dev = b43_bus_dev_ssb_init(sdev);
4995
4992 wl = ssb_get_devtypedata(sdev); 4996 wl = ssb_get_devtypedata(sdev);
4993 if (!wl) { 4997 if (!wl) {
4994 /* Probing the first core. Must setup common struct b43_wl */ 4998 /* Probing the first core. Must setup common struct b43_wl */
@@ -5002,7 +5006,7 @@ int b43_ssb_probe(struct ssb_device *sdev, const struct ssb_device_id *id)
5002 ssb_set_devtypedata(sdev, wl); 5006 ssb_set_devtypedata(sdev, wl);
5003 B43_WARN_ON(ssb_get_devtypedata(sdev) != wl); 5007 B43_WARN_ON(ssb_get_devtypedata(sdev) != wl);
5004 } 5008 }
5005 err = b43_one_core_attach(sdev, wl); 5009 err = b43_one_core_attach(dev, wl);
5006 if (err) 5010 if (err)
5007 goto err_wireless_exit; 5011 goto err_wireless_exit;
5008 5012
@@ -5017,10 +5021,10 @@ int b43_ssb_probe(struct ssb_device *sdev, const struct ssb_device_id *id)
5017 return err; 5021 return err;
5018 5022
5019 err_one_core_detach: 5023 err_one_core_detach:
5020 b43_one_core_detach(sdev); 5024 b43_one_core_detach(dev);
5021 err_wireless_exit: 5025 err_wireless_exit:
5022 if (first) 5026 if (first)
5023 b43_wireless_exit(sdev, wl); 5027 b43_wireless_exit(dev, wl);
5024 return err; 5028 return err;
5025} 5029}
5026 5030
@@ -5043,14 +5047,14 @@ static void b43_ssb_remove(struct ssb_device *sdev)
5043 ieee80211_unregister_hw(wl->hw); 5047 ieee80211_unregister_hw(wl->hw);
5044 } 5048 }
5045 5049
5046 b43_one_core_detach(sdev); 5050 b43_one_core_detach(wldev->dev);
5047 5051
5048 if (list_empty(&wl->devlist)) { 5052 if (list_empty(&wl->devlist)) {
5049 b43_leds_unregister(wl); 5053 b43_leds_unregister(wl);
5050 /* Last core on the chip unregistered. 5054 /* Last core on the chip unregistered.
5051 * We can destroy common struct b43_wl. 5055 * We can destroy common struct b43_wl.
5052 */ 5056 */
5053 b43_wireless_exit(sdev, wl); 5057 b43_wireless_exit(wldev->dev, wl);
5054 } 5058 }
5055} 5059}
5056 5060