Commit 482f0538 authored by Rafał Miłecki's avatar Rafał Miłecki Committed by John W. Linville

b43: add bus device abstraction layer

Signed-off-by: default avatarRafał Miłecki <zajec5@gmail.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent aa63418a
b43-y += main.o b43-y += main.o
b43-y += bus.o
b43-y += tables.o b43-y += tables.o
b43-$(CONFIG_B43_PHY_N) += tables_nphy.o b43-$(CONFIG_B43_PHY_N) += tables_nphy.o
b43-$(CONFIG_B43_PHY_N) += radio_2055.o b43-$(CONFIG_B43_PHY_N) += radio_2055.o
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
#include "debugfs.h" #include "debugfs.h"
#include "leds.h" #include "leds.h"
#include "rfkill.h" #include "rfkill.h"
#include "bus.h"
#include "lo.h" #include "lo.h"
#include "phy_common.h" #include "phy_common.h"
...@@ -707,7 +708,8 @@ enum { ...@@ -707,7 +708,8 @@ enum {
/* Data structure for one wireless device (802.11 core) */ /* Data structure for one wireless device (802.11 core) */
struct b43_wldev { struct b43_wldev {
struct ssb_device *sdev; struct ssb_device *sdev; /* TODO: remove when b43_bus_dev is ready */
struct b43_bus_dev *dev;
struct b43_wl *wl; struct b43_wl *wl;
/* The device initialization status. /* The device initialization status.
......
/*
Broadcom B43 wireless driver
Bus abstraction layer
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
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; see the file COPYING. If not, write to
the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "b43.h"
#include "bus.h"
/* SSB */
struct b43_bus_dev *b43_bus_dev_ssb_init(struct ssb_device *sdev)
{
struct b43_bus_dev *dev = kzalloc(sizeof(*dev), GFP_KERNEL);
dev->bus_type = B43_BUS_SSB;
dev->sdev = sdev;
return dev;
}
#ifndef B43_BUS_H_
#define B43_BUS_H_
enum b43_bus_type {
B43_BUS_SSB,
};
struct b43_bus_dev {
enum b43_bus_type bus_type;
union {
struct ssb_device *sdev;
};
};
struct b43_bus_dev *b43_bus_dev_ssb_init(struct ssb_device *sdev);
#endif /* B43_BUS_H_ */
...@@ -4845,7 +4845,7 @@ static int b43_wireless_core_attach(struct b43_wldev *dev) ...@@ -4845,7 +4845,7 @@ static int b43_wireless_core_attach(struct b43_wldev *dev)
return err; return err;
} }
static void b43_one_core_detach(struct ssb_device *dev) static void b43_one_core_detach(struct b43_bus_dev *dev)
{ {
struct b43_wldev *wldev; struct b43_wldev *wldev;
struct b43_wl *wl; struct b43_wl *wl;
...@@ -4853,17 +4853,17 @@ static void b43_one_core_detach(struct ssb_device *dev) ...@@ -4853,17 +4853,17 @@ static void b43_one_core_detach(struct ssb_device *dev)
/* Do not cancel ieee80211-workqueue based work here. /* Do not cancel ieee80211-workqueue based work here.
* See comment in b43_remove(). */ * See comment in b43_remove(). */
wldev = ssb_get_drvdata(dev); wldev = ssb_get_drvdata(dev->sdev);
wl = wldev->wl; wl = wldev->wl;
b43_debugfs_remove_device(wldev); b43_debugfs_remove_device(wldev);
b43_wireless_core_detach(wldev); b43_wireless_core_detach(wldev);
list_del(&wldev->list); list_del(&wldev->list);
wl->nr_devs--; wl->nr_devs--;
ssb_set_drvdata(dev, NULL); ssb_set_drvdata(dev->sdev, NULL);
kfree(wldev); kfree(wldev);
} }
static int b43_one_core_attach(struct ssb_device *dev, struct b43_wl *wl) static int b43_one_core_attach(struct b43_bus_dev *dev, struct b43_wl *wl)
{ {
struct b43_wldev *wldev; struct b43_wldev *wldev;
int err = -ENOMEM; int err = -ENOMEM;
...@@ -4873,7 +4873,8 @@ static int b43_one_core_attach(struct ssb_device *dev, struct b43_wl *wl) ...@@ -4873,7 +4873,8 @@ static int b43_one_core_attach(struct ssb_device *dev, struct b43_wl *wl)
goto out; goto out;
wldev->use_pio = b43_modparam_pio; wldev->use_pio = b43_modparam_pio;
wldev->sdev = dev; wldev->dev = dev;
wldev->sdev = dev->sdev; /* TODO: Remove when not needed */
wldev->wl = wl; wldev->wl = wl;
b43_set_status(wldev, B43_STAT_UNINIT); b43_set_status(wldev, B43_STAT_UNINIT);
wldev->bad_frames_preempt = modparam_bad_frames_preempt; 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,7 +4886,7 @@ static int b43_one_core_attach(struct ssb_device *dev, struct b43_wl *wl)
list_add(&wldev->list, &wl->devlist); list_add(&wldev->list, &wl->devlist);
wl->nr_devs++; wl->nr_devs++;
ssb_set_drvdata(dev, wldev); ssb_set_drvdata(dev->sdev, wldev);
b43_debugfs_add_device(wldev); b43_debugfs_add_device(wldev);
out: out:
...@@ -4926,11 +4927,11 @@ static void b43_sprom_fixup(struct ssb_bus *bus) ...@@ -4926,11 +4927,11 @@ static void b43_sprom_fixup(struct ssb_bus *bus)
} }
} }
static void b43_wireless_exit(struct ssb_device *dev, struct b43_wl *wl) static void b43_wireless_exit(struct b43_bus_dev *dev, struct b43_wl *wl)
{ {
struct ieee80211_hw *hw = wl->hw; struct ieee80211_hw *hw = wl->hw;
ssb_set_devtypedata(dev, NULL); ssb_set_devtypedata(dev->sdev, NULL);
ieee80211_free_hw(hw); ieee80211_free_hw(hw);
} }
...@@ -4985,10 +4986,13 @@ static struct b43_wl *b43_wireless_init(struct ssb_device *dev) ...@@ -4985,10 +4986,13 @@ static struct b43_wl *b43_wireless_init(struct ssb_device *dev)
static static
int b43_ssb_probe(struct ssb_device *sdev, const struct ssb_device_id *id) int b43_ssb_probe(struct ssb_device *sdev, const struct ssb_device_id *id)
{ {
struct b43_bus_dev *dev;
struct b43_wl *wl; struct b43_wl *wl;
int err; int err;
int first = 0; int first = 0;
dev = b43_bus_dev_ssb_init(sdev);
wl = ssb_get_devtypedata(sdev); wl = ssb_get_devtypedata(sdev);
if (!wl) { if (!wl) {
/* Probing the first core. Must setup common struct b43_wl */ /* 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,7 +5006,7 @@ int b43_ssb_probe(struct ssb_device *sdev, const struct ssb_device_id *id)
ssb_set_devtypedata(sdev, wl); ssb_set_devtypedata(sdev, wl);
B43_WARN_ON(ssb_get_devtypedata(sdev) != wl); B43_WARN_ON(ssb_get_devtypedata(sdev) != wl);
} }
err = b43_one_core_attach(sdev, wl); err = b43_one_core_attach(dev, wl);
if (err) if (err)
goto err_wireless_exit; goto err_wireless_exit;
...@@ -5017,10 +5021,10 @@ int b43_ssb_probe(struct ssb_device *sdev, const struct ssb_device_id *id) ...@@ -5017,10 +5021,10 @@ int b43_ssb_probe(struct ssb_device *sdev, const struct ssb_device_id *id)
return err; return err;
err_one_core_detach: err_one_core_detach:
b43_one_core_detach(sdev); b43_one_core_detach(dev);
err_wireless_exit: err_wireless_exit:
if (first) if (first)
b43_wireless_exit(sdev, wl); b43_wireless_exit(dev, wl);
return err; return err;
} }
...@@ -5043,14 +5047,14 @@ static void b43_ssb_remove(struct ssb_device *sdev) ...@@ -5043,14 +5047,14 @@ static void b43_ssb_remove(struct ssb_device *sdev)
ieee80211_unregister_hw(wl->hw); ieee80211_unregister_hw(wl->hw);
} }
b43_one_core_detach(sdev); b43_one_core_detach(wldev->dev);
if (list_empty(&wl->devlist)) { if (list_empty(&wl->devlist)) {
b43_leds_unregister(wl); b43_leds_unregister(wl);
/* Last core on the chip unregistered. /* Last core on the chip unregistered.
* We can destroy common struct b43_wl. * We can destroy common struct b43_wl.
*/ */
b43_wireless_exit(sdev, wl); b43_wireless_exit(wldev->dev, wl);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment