diff options
author | Felix Fietkau <nbd@openwrt.org> | 2007-11-11 11:44:59 +0000 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2007-11-11 11:44:59 +0000 |
commit | 1eb35dd1c8098556de0c174f780cff15eb212d4f (patch) | |
tree | 5041c300eadaa3d1ea18f435f7c98ee17ddaee8b /package/b43 | |
parent | 1bca0cc51704b5ef57c5e3a9d7a1b80633486d16 (diff) | |
download | mtk-20170518-1eb35dd1c8098556de0c174f780cff15eb212d4f.zip mtk-20170518-1eb35dd1c8098556de0c174f780cff15eb212d4f.tar.gz mtk-20170518-1eb35dd1c8098556de0c174f780cff15eb212d4f.tar.bz2 |
add b43 fixes from #2677
SVN-Revision: 9535
Diffstat (limited to 'package/b43')
-rw-r--r-- | package/b43/Makefile | 42 | ||||
-rw-r--r-- | package/b43/src/debugfs.c | 31 | ||||
-rw-r--r-- | package/b43/src/leds.c | 1 | ||||
-rw-r--r-- | package/b43/src/leds.h | 1 | ||||
-rw-r--r-- | package/b43/src/main.c | 49 | ||||
-rw-r--r-- | package/b43/src/pcmcia.c | 3 | ||||
-rw-r--r-- | package/b43/src/phy.c | 1 | ||||
-rw-r--r-- | package/b43/src/pio.c | 18 | ||||
-rw-r--r-- | package/b43/src/pio.h | 4 | ||||
-rw-r--r-- | package/b43/src/sysfs.c | 5 | ||||
-rw-r--r-- | package/b43/src/xmit.c | 8 |
11 files changed, 126 insertions, 37 deletions
diff --git a/package/b43/Makefile b/package/b43/Makefile index 86b8621..756e83b 100644 --- a/package/b43/Makefile +++ b/package/b43/Makefile @@ -3,7 +3,7 @@ # # This is free software, licensed under the GNU General Public License v2. # See /LICENSE for more information. -# +# # $Id: Makefile 7440 2007-06-02 02:22:01Z nbd $ include $(TOPDIR)/rules.mk @@ -14,12 +14,27 @@ PKG_RELEASE:=1 include $(INCLUDE_DIR)/package.mk +PKG_FWV4_NAME:=broadcom-wl +PKG_FWV4_VERSION=4.80.53.0 +PKG_FWV4_OBJECT:=kmod/wl_apsta.o + +PKG_FWV4_SOURCE:=$(PKG_FWV4_NAME)-$(PKG_FWV4_VERSION).tar.bz2 +PKG_FWV4_SOURCE_URL:=http://downloads.openwrt.org/sources/ +PKG_FWV4_MD5SUM:=a7d8dde3ce474c361143b83e1d9890b1 + +PKG_FWCUTTER_NAME:=b43-fwcutter +PKG_FWCUTTER_VERSION=008 + +PKG_FWCUTTER_SOURCE:=$(PKG_FWCUTTER_NAME)-$(PKG_FWCUTTER_VERSION).tar.bz2 +PKG_FWCUTTER_SOURCE_URL:=http://download.berlios.de/bcm43xx/ +PKG_FWCUTTER_MD5SUM:=3f7fbf4f8dcd296c6d1b0d42eab0f9ac + define KernelPackage/b43 SUBMENU:=Wireless Drivers TITLE:=Broadcom 43xx wireless support - DEPENDS:=@TARGET_brcm47xx +kmod-mac80211 @BROKEN + DEPENDS:=@TARGET_brcm47xx +kmod-mac80211 FILES:=$(PKG_BUILD_DIR)/b43.$(LINUX_KMOD_SUFFIX) -# AUTOLOAD:=$(call AutoLoad,30,b43) + AUTOLOAD:=$(call AutoLoad,30,b43) endef define KernelPackage/b43/description @@ -44,9 +59,20 @@ MAKE_OPTS:= \ LINUXINCLUDE="-I$(STAGING_DIR)/usr/include/mac80211 -I$(LINUX_DIR)/include -include linux/autoconf.h" \ $(EXTRA_KCONFIG) +$(STAMP_PREPARED): $(DL_DIR)/$(PKG_FWV4_SOURCE) $(DL_DIR)/$(PKG_FWCUTTER_SOURCE) + +$(DL_DIR)/$(PKG_FWV4_SOURCE): + $(SCRIPT_DIR)/download.pl "$(DL_DIR)" "$(PKG_FWV4_SOURCE)" "$(PKG_FWV4_MD5SUM)" $(PKG_FWV4_SOURCE_URL) + +$(DL_DIR)/$(PKG_FWCUTTER_SOURCE): + $(SCRIPT_DIR)/download.pl "$(DL_DIR)" "$(PKG_FWCUTTER_SOURCE)" "$(PKG_FWCUTTER_MD5SUM)" $(PKG_FWCUTTER_SOURCE_URL) + + define Build/Prepare mkdir -p $(PKG_BUILD_DIR) $(CP) ./src/* $(PKG_BUILD_DIR)/ + tar xjf "$(DL_DIR)/$(PKG_FWV4_SOURCE)" -C "$(PKG_BUILD_DIR)" + tar xjf "$(DL_DIR)/$(PKG_FWCUTTER_SOURCE)" -C "$(PKG_BUILD_DIR)" endef define Build/Configure @@ -56,6 +82,16 @@ define Build/Compile $(MAKE) -C "$(LINUX_DIR)" \ $(MAKE_OPTS) \ modules + + $(MAKE) -C "$(PKG_BUILD_DIR)/$(PKG_FWCUTTER_NAME)-$(PKG_FWCUTTER_VERSION)" +endef + +define KernelPackage/b43/install + $(INSTALL_DIR) $(1)/lib/firmware/ + + $(PKG_BUILD_DIR)/$(PKG_FWCUTTER_NAME)-$(PKG_FWCUTTER_VERSION)/b43-fwcutter \ + -w $(1)/lib/firmware/ \ + $(PKG_BUILD_DIR)/$(PKG_FWV4_NAME)-$(PKG_FWV4_VERSION)/$(PKG_FWV4_OBJECT) endef $(eval $(call KernelPackage,b43)) diff --git a/package/b43/src/debugfs.c b/package/b43/src/debugfs.c index b5c589e..734e70e 100644 --- a/package/b43/src/debugfs.c +++ b/package/b43/src/debugfs.c @@ -39,7 +39,7 @@ /* The root directory. */ -struct dentry *rootdir; +static struct dentry *rootdir; struct b43_debugfs_fops { ssize_t (*read)(struct b43_wldev *dev, char *buf, size_t bufsize); @@ -76,7 +76,8 @@ struct b43_dfs_file * fops_to_dfs_file(struct b43_wldev *dev, /* wl->irq_lock is locked */ -ssize_t tsf_read_file(struct b43_wldev *dev, char *buf, size_t bufsize) +static ssize_t tsf_read_file(struct b43_wldev *dev, + char *buf, size_t bufsize) { ssize_t count = 0; u64 tsf; @@ -90,7 +91,8 @@ ssize_t tsf_read_file(struct b43_wldev *dev, char *buf, size_t bufsize) } /* wl->irq_lock is locked */ -int tsf_write_file(struct b43_wldev *dev, const char *buf, size_t count) +static int tsf_write_file(struct b43_wldev *dev, + const char *buf, size_t count) { u64 tsf; @@ -102,7 +104,8 @@ int tsf_write_file(struct b43_wldev *dev, const char *buf, size_t count) } /* wl->irq_lock is locked */ -ssize_t ucode_regs_read_file(struct b43_wldev *dev, char *buf, size_t bufsize) +static ssize_t ucode_regs_read_file(struct b43_wldev *dev, + char *buf, size_t bufsize) { ssize_t count = 0; int i; @@ -116,7 +119,8 @@ ssize_t ucode_regs_read_file(struct b43_wldev *dev, char *buf, size_t bufsize) } /* wl->irq_lock is locked */ -ssize_t shm_read_file(struct b43_wldev *dev, char *buf, size_t bufsize) +static ssize_t shm_read_file(struct b43_wldev *dev, + char *buf, size_t bufsize) { ssize_t count = 0; int i; @@ -135,7 +139,8 @@ ssize_t shm_read_file(struct b43_wldev *dev, char *buf, size_t bufsize) return count; } -ssize_t txstat_read_file(struct b43_wldev *dev, char *buf, size_t bufsize) +static ssize_t txstat_read_file(struct b43_wldev *dev, + char *buf, size_t bufsize) { struct b43_txstatus_log *log = &dev->dfsentry->txstatlog; ssize_t count = 0; @@ -182,7 +187,8 @@ out_unlock: return count; } -ssize_t txpower_g_read_file(struct b43_wldev *dev, char *buf, size_t bufsize) +static ssize_t txpower_g_read_file(struct b43_wldev *dev, + char *buf, size_t bufsize) { ssize_t count = 0; @@ -214,7 +220,8 @@ out: return count; } -int txpower_g_write_file(struct b43_wldev *dev, const char *buf, size_t count) +static int txpower_g_write_file(struct b43_wldev *dev, + const char *buf, size_t count) { unsigned long phy_flags; @@ -253,7 +260,8 @@ int txpower_g_write_file(struct b43_wldev *dev, const char *buf, size_t count) } /* wl->irq_lock is locked */ -int restart_write_file(struct b43_wldev *dev, const char *buf, size_t count) +static int restart_write_file(struct b43_wldev *dev, + const char *buf, size_t count) { int err = 0; @@ -285,7 +293,8 @@ static ssize_t append_lo_table(ssize_t count, char *buf, const size_t bufsize, return count; } -ssize_t loctls_read_file(struct b43_wldev *dev, char *buf, size_t bufsize) +static ssize_t loctls_read_file(struct b43_wldev *dev, + char *buf, size_t bufsize) { ssize_t count = 0; struct b43_txpower_lo_control *lo; @@ -374,6 +383,8 @@ static ssize_t b43_debugfs_read(struct file *file, char __user *userbuf, err = -ENOMEM; goto out_unlock; } + /* Sparse warns about the following memset, because it has a big + * size value. That warning is bogus, so I will ignore it. --mb */ memset(buf, 0, bufsize); if (dfops->take_irqlock) { spin_lock_irq(&dev->wl->irq_lock); diff --git a/package/b43/src/leds.c b/package/b43/src/leds.c index 3099e62..19e5885 100644 --- a/package/b43/src/leds.c +++ b/package/b43/src/leds.c @@ -29,6 +29,7 @@ #include "b43.h" #include "leds.h" + static void b43_led_turn_on(struct b43_wldev *dev, u8 led_index, bool activelow) { diff --git a/package/b43/src/leds.h b/package/b43/src/leds.h index 713e180..b8b1dd5 100644 --- a/package/b43/src/leds.h +++ b/package/b43/src/leds.h @@ -23,7 +23,6 @@ struct b43_led { /* The unique name string for this LED device. */ char name[B43_LED_MAX_NAME_LEN + 1]; }; -#define b43_led_index(led) ((int)((led) - (led)->dev->leds)) #define B43_LED_BEHAVIOUR 0x7F #define B43_LED_ACTIVELOW 0x80 diff --git a/package/b43/src/main.c b/package/b43/src/main.c index 4146fdf..9f8175c 100644 --- a/package/b43/src/main.c +++ b/package/b43/src/main.c @@ -49,7 +49,6 @@ #include "pio.h" #include "sysfs.h" #include "xmit.h" -#include "sysfs.h" #include "lo.h" #include "pcmcia.h" @@ -107,6 +106,23 @@ static const struct ssb_device_id b43_ssb_tbl[] = { MODULE_DEVICE_TABLE(ssb, b43_ssb_tbl); +static const struct pci_device_id b43_pci_bridge_tbl[] = { + { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4311) }, + { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4312) }, + { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4318) }, + { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4319) }, + { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4320) }, + { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4321) }, + { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4324) }, + { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4325) }, + { 0, }, +}; +MODULE_DEVICE_TABLE(pci, b43_pci_bridge_tbl); + +static struct pci_driver b43_pci_bridge_driver = { + .name = "b43-pci-bridge", + .id_table = b43_pci_bridge_tbl, +}; /* Channel and ratetables are shared for all devices. * They can't be const, because ieee80211 puts some precalculated * data in there. This data is the same for all devices, so we don't @@ -1045,7 +1061,7 @@ static void handle_irq_noise(struct b43_wldev *dev) B43_WARN_ON(!dev->noisecalc.calculation_running); if (dev->noisecalc.channel_at_start != phy->channel) goto drop_calculation; - *((u32 *) noise) = cpu_to_le32(b43_jssi_read(dev)); + *((__le32 *)noise) = cpu_to_le32(b43_jssi_read(dev)); if (noise[0] == 0x7F || noise[1] == 0x7F || noise[2] == 0x7F || noise[3] == 0x7F) goto generate_new; @@ -1575,8 +1591,7 @@ static int do_request_fw(struct b43_wldev *dev, const char *name, const struct firmware **fw) { - const size_t plen = sizeof(modparam_fwpostfix) + 32; - char path[plen]; + char path[sizeof(modparam_fwpostfix) + 32]; struct b43_fw_header *hdr; u32 size; int err; @@ -2393,7 +2408,7 @@ out_requeue: if (b43_debug(dev, B43_DBG_PWORK_FAST)) delay = msecs_to_jiffies(50); else - delay = round_jiffies(HZ * 15); + delay = round_jiffies_relative(HZ * 15); queue_delayed_work(wl->hw->workqueue, &dev->periodic_work, delay); out: mutex_unlock(&wl->mutex); @@ -3495,7 +3510,7 @@ static int b43_start(struct ieee80211_hw *hw) struct b43_wl *wl = hw_to_b43_wl(hw); struct b43_wldev *dev = wl->current_dev; int did_init = 0; - int err; + int err = 0; mutex_lock(&wl->mutex); @@ -3521,7 +3536,7 @@ static int b43_start(struct ieee80211_hw *hw) return err; } -void b43_stop(struct ieee80211_hw *hw) +static void b43_stop(struct ieee80211_hw *hw) { struct b43_wl *wl = hw_to_b43_wl(hw); struct b43_wldev *dev = wl->current_dev; @@ -4038,6 +4053,16 @@ static struct ssb_driver b43_ssb_driver = { .resume = b43_resume, }; +inline int b43_pci_ssb_bridge_init(void) +{ + return ssb_pcihost_register(&b43_pci_bridge_driver); +} + +inline void b43_pci_ssb_bridge_exit(void) +{ + ssb_pcihost_unregister(&b43_pci_bridge_driver); +} + static int __init b43_init(void) { int err; @@ -4046,12 +4071,19 @@ static int __init b43_init(void) err = b43_pcmcia_init(); if (err) goto err_dfs_exit; - err = ssb_driver_register(&b43_ssb_driver); + + err = b43_pci_ssb_bridge_init(); if (err) goto err_pcmcia_exit; + err = ssb_driver_register(&b43_ssb_driver); + if (err) + goto err_pci_exit; + return err; +err_pci_exit: + b43_pci_ssb_bridge_exit(); err_pcmcia_exit: b43_pcmcia_exit(); err_dfs_exit: @@ -4062,6 +4094,7 @@ err_dfs_exit: static void __exit b43_exit(void) { ssb_driver_unregister(&b43_ssb_driver); + b43_pci_ssb_bridge_exit(); b43_pcmcia_exit(); b43_debugfs_exit(); } diff --git a/package/b43/src/pcmcia.c b/package/b43/src/pcmcia.c index 3e75a8a..b242a9a 100644 --- a/package/b43/src/pcmcia.c +++ b/package/b43/src/pcmcia.c @@ -21,6 +21,8 @@ */ +#include "pcmcia.h" + #include <linux/ssb/ssb.h> #include <pcmcia/cs_types.h> @@ -30,6 +32,7 @@ #include <pcmcia/ds.h> #include <pcmcia/cisreg.h> + static /*const */ struct pcmcia_device_id b43_pcmcia_tbl[] = { PCMCIA_DEVICE_MANF_CARD(0x2D0, 0x448), PCMCIA_DEVICE_NULL, diff --git a/package/b43/src/phy.c b/package/b43/src/phy.c index 5f7ffa0..3d4ed64 100644 --- a/package/b43/src/phy.c +++ b/package/b43/src/phy.c @@ -26,6 +26,7 @@ */ #include <linux/delay.h> +#include <linux/io.h> #include <linux/types.h> #include "b43.h" diff --git a/package/b43/src/pio.c b/package/b43/src/pio.c index 4ac91fd..67752a2 100644 --- a/package/b43/src/pio.c +++ b/package/b43/src/pio.c @@ -60,7 +60,7 @@ static u16 tx_get_next_word(const u8 * txhdr, source = packet; i -= txhdr_size; } - ret = le16_to_cpu(*((u16 *) (source + i))); + ret = le16_to_cpu(*((__le16 *)(source + i))); *pos += 2; return ret; @@ -104,7 +104,7 @@ static u16 generate_cookie(struct b43_pioqueue *queue, struct b43_pio_txpacket *packet) { u16 cookie = 0x0000; - int packetindex; + u16 packetindex; /* We use the upper 4 bits for the PIO * controller ID and the lower 12 bits @@ -125,7 +125,7 @@ static u16 generate_cookie(struct b43_pioqueue *queue, default: B43_WARN_ON(1); } - packetindex = pio_txpacket_getindex(packet); + packetindex = packet->index; B43_WARN_ON(packetindex & ~0x0FFF); cookie |= (u16) packetindex; @@ -286,6 +286,7 @@ static void setup_txqueues(struct b43_pioqueue *queue) packet->queue = queue; INIT_LIST_HEAD(&packet->list); + packet->index = i; list_add(&packet->list, &queue->txfree); } @@ -518,9 +519,10 @@ static void pio_rx_error(struct b43_pioqueue *queue, void b43_pio_rx(struct b43_pioqueue *queue) { - u16 preamble[21] = { 0 }; + __le16 preamble[21] = { 0 }; struct b43_rxhdr_fw4 *rxhdr; - u16 tmp, len, macstat; + u16 tmp, len; + u32 macstat; int i, preamble_readwords; struct sk_buff *skb; @@ -537,7 +539,7 @@ void b43_pio_rx(struct b43_pioqueue *queue) } b43dbg(queue->dev->wl, "PIO RX timed out\n"); return; - data_ready: +data_ready: len = b43_pio_read(queue, B43_PIO_RXDATA); if (unlikely(len > 0x700)) { @@ -558,7 +560,7 @@ void b43_pio_rx(struct b43_pioqueue *queue) preamble[i + 1] = cpu_to_le16(tmp); } rxhdr = (struct b43_rxhdr_fw4 *)preamble; - macstat = le16_to_cpu(rxhdr->mac_status); + macstat = le32_to_cpu(rxhdr->mac_status); if (macstat & B43_RX_MAC_FCSERR) { pio_rx_error(queue, (queue->mmio_base == B43_MMIO_PIO1_BASE), @@ -583,7 +585,7 @@ void b43_pio_rx(struct b43_pioqueue *queue) skb_put(skb, len); for (i = 0; i < len - 1; i += 2) { tmp = b43_pio_read(queue, B43_PIO_RXDATA); - *((u16 *) (skb->data + i)) = cpu_to_le16(tmp); + *((__le16 *)(skb->data + i)) = cpu_to_le16(tmp); } if (len % 2) { tmp = b43_pio_read(queue, B43_PIO_RXDATA); diff --git a/package/b43/src/pio.h b/package/b43/src/pio.h index 46d6d2e..3488f24 100644 --- a/package/b43/src/pio.h +++ b/package/b43/src/pio.h @@ -4,6 +4,7 @@ #include "b43.h" #include <linux/interrupt.h> +#include <linux/io.h> #include <linux/list.h> #include <linux/skbuff.h> @@ -39,10 +40,9 @@ struct b43_pio_txpacket { struct sk_buff *skb; struct ieee80211_tx_status txstat; struct list_head list; + u16 index; /* Index in the tx_packets_cache */ }; -#define pio_txpacket_getindex(packet) ((int)((packet) - (packet)->queue->tx_packets_cache)) - struct b43_pioqueue { struct b43_wldev *dev; u16 mmio_base; diff --git a/package/b43/src/sysfs.c b/package/b43/src/sysfs.c index fcb7773..f4faff6 100644 --- a/package/b43/src/sysfs.c +++ b/package/b43/src/sysfs.c @@ -23,13 +23,14 @@ */ +#include <linux/capability.h> +#include <linux/io.h> + #include "b43.h" #include "sysfs.h" #include "main.h" #include "phy.h" -#include <linux/capability.h> - #define GENERIC_FILESIZE 64 static int get_integer(const char *buf, size_t count) diff --git a/package/b43/src/xmit.c b/package/b43/src/xmit.c index e6174b6..0bd6f8a 100644 --- a/package/b43/src/xmit.c +++ b/package/b43/src/xmit.c @@ -121,10 +121,12 @@ void b43_generate_plcp_hdr(struct b43_plcp_hdr4 *plcp, __u8 *raw = plcp->raw; if (b43_is_ofdm_rate(bitrate)) { - *data = b43_plcp_get_ratecode_ofdm(bitrate); + u32 d; + + d = b43_plcp_get_ratecode_ofdm(bitrate); B43_WARN_ON(octets & 0xF000); - *data |= (octets << 5); - *data = cpu_to_le32(*data); + d |= (octets << 5); + *data = cpu_to_le32(d); } else { u32 plen; |