[RFC][PATCH] b43: add bus abstraction layer
Rafał Miłecki
zajec5 at gmail.com
Thu Apr 7 18:46:50 EDT 2011
Signed-off-by: Rafał Miłecki <zajec5 at gmail.com>
---
drivers/net/wireless/b43/Makefile | 1 +
drivers/net/wireless/b43/b43.h | 11 ++++--
drivers/net/wireless/b43/bus.c | 59 +++++++++++++++++++++++++++++++++++++
drivers/net/wireless/b43/bus.h | 13 ++++++++
drivers/net/wireless/b43/main.c | 1 +
5 files changed, 81 insertions(+), 4 deletions(-)
create mode 100644 drivers/net/wireless/b43/bus.c
create mode 100644 drivers/net/wireless/b43/bus.h
diff --git a/drivers/net/wireless/b43/Makefile b/drivers/net/wireless/b43/Makefile
index cef334a..95f7c00 100644
--- a/drivers/net/wireless/b43/Makefile
+++ b/drivers/net/wireless/b43/Makefile
@@ -1,4 +1,5 @@
b43-y += main.o
+b43-y += bus.o
b43-y += tables.o
b43-$(CONFIG_B43_PHY_N) += tables_nphy.o
b43-$(CONFIG_B43_PHY_N) += radio_2055.o
diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h
index bd4cb75..d137c64 100644
--- a/drivers/net/wireless/b43/b43.h
+++ b/drivers/net/wireless/b43/b43.h
@@ -12,6 +12,7 @@
#include "leds.h"
#include "rfkill.h"
#include "lo.h"
+#include "bus.h"
#include "phy_common.h"
@@ -774,6 +775,8 @@ struct b43_wldev {
/* Data structure for the WLAN parts (802.11 cores) of the b43 chip. */
struct b43_wl {
+ /* Bus abstraction */
+ const struct b43_bus_ops *bus_ops;
/* Pointer to the active wireless device on this chip */
struct b43_wldev *current_dev;
/* Pointer to the ieee80211 hardware data structure */
@@ -879,22 +882,22 @@ static inline enum ieee80211_band b43_current_band(struct b43_wl *wl)
static inline u16 b43_read16(struct b43_wldev *dev, u16 offset)
{
- return ssb_read16(dev->dev, offset);
+ return dev->wl->bus_ops->read16(dev, offset);
}
static inline void b43_write16(struct b43_wldev *dev, u16 offset, u16 value)
{
- ssb_write16(dev->dev, offset, value);
+ dev->wl->bus_ops->write16(dev, offset, value);
}
static inline u32 b43_read32(struct b43_wldev *dev, u16 offset)
{
- return ssb_read32(dev->dev, offset);
+ return dev->wl->bus_ops->read32(dev, offset);
}
static inline void b43_write32(struct b43_wldev *dev, u16 offset, u32 value)
{
- ssb_write32(dev->dev, offset, value);
+ dev->wl->bus_ops->write32(dev, offset, value);
}
static inline bool b43_using_pio_transfers(struct b43_wldev *dev)
diff --git a/drivers/net/wireless/b43/bus.c b/drivers/net/wireless/b43/bus.c
new file mode 100644
index 0000000..fbad27d
--- /dev/null
+++ b/drivers/net/wireless/b43/bus.c
@@ -0,0 +1,59 @@
+/*
+
+ 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 */
+
+static inline u16 b43_bus_ssb_read16(struct b43_wldev *dev, u16 offset)
+{
+ return ssb_read16(dev->dev, offset);
+}
+
+static inline u32 b43_bus_ssb_read32(struct b43_wldev *dev, u16 offset)
+{
+ return ssb_read32(dev->dev, offset);
+}
+
+static inline void b43_bus_ssb_write16(struct b43_wldev *dev, u16 offset, u16 value)
+{
+ ssb_write16(dev->dev, offset, value);
+}
+
+static inline void b43_bus_ssb_write32(struct b43_wldev *dev, u16 offset, u32 value)
+{
+ ssb_write32(dev->dev, offset, value);
+}
+
+static const struct b43_bus_ops b43_bus_ssb_ops = {
+ .read16 = b43_bus_ssb_read16,
+ .read32 = b43_bus_ssb_read32,
+ .write16 = b43_bus_ssb_write16,
+ .write32 = b43_bus_ssb_write32,
+
+};
+
+void b43_bus_ssb_init(struct b43_wl *wl)
+{
+ wl->bus_ops = &b43_bus_ssb_ops;
+}
diff --git a/drivers/net/wireless/b43/bus.h b/drivers/net/wireless/b43/bus.h
new file mode 100644
index 0000000..d1c55c4
--- /dev/null
+++ b/drivers/net/wireless/b43/bus.h
@@ -0,0 +1,13 @@
+#ifndef B43_BUS_H_
+#define B43_BUS_H_
+
+struct b43_bus_ops {
+ u16 (*read16)(struct b43_wldev *dev, u16 offset);
+ u32 (*read32)(struct b43_wldev *dev, u16 offset);
+ void (*write16)(struct b43_wldev *dev, u16 offset, u16 value);
+ void (*write32)(struct b43_wldev *dev, u16 offset, u32 value);
+};
+
+void b43_bus_ssb_init(struct b43_wl *wl);
+
+#endif /* B43_BUS_H_ */
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index 57eb5b6..906dfe6 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -4985,6 +4985,7 @@ static int b43_wireless_init(struct ssb_device *dev)
/* Initialize struct b43_wl */
wl->hw = hw;
+ b43_bus_ssb_init(wl);
mutex_init(&wl->mutex);
spin_lock_init(&wl->hardirq_lock);
INIT_LIST_HEAD(&wl->devlist);
--
1.7.3.4
More information about the b43-dev
mailing list