diff options
-rw-r--r-- | target/linux/image/Makefile | 4 | ||||
-rw-r--r-- | target/linux/image/ar7/Makefile | 16 | ||||
-rw-r--r-- | target/linux/image/brcm/Makefile | 5 | ||||
-rw-r--r-- | target/linux/package/wlcompat/wlcompat.c | 77 | ||||
-rw-r--r-- | target/utils/src/addpattern.c | 7 |
5 files changed, 89 insertions, 20 deletions
diff --git a/target/linux/image/Makefile b/target/linux/image/Makefile index 6509952fac..b6a6c56914 100644 --- a/target/linux/image/Makefile +++ b/target/linux/image/Makefile @@ -1,9 +1,5 @@ include $(TOPDIR)/rules.mk -ifeq ($(BOARD),) -BOARD:=brcm -endif - KDIR:=$(BUILD_DIR)/linux-$(KERNEL)-$(BOARD) ifeq ($(BR2_TARGET_ROOTFS_JFFS2),y) diff --git a/target/linux/image/ar7/Makefile b/target/linux/image/ar7/Makefile index 1d1aea725b..4436fa9ba9 100644 --- a/target/linux/image/ar7/Makefile +++ b/target/linux/image/ar7/Makefile @@ -31,16 +31,14 @@ $(PKG_BUILD_DIR)/LzmaDecode.o: src/LzmaDecode.c $(PKG_BUILD_DIR)/loader.o: src/loader.c $(TARGET_CC) $(CFLAGS) -c -o $@ $< -$(PKG_BUILD_DIR)/srec2bin: src/srec2bin.c +$(STAGING_DIR)/bin/srec2bin: src/srec2bin.c $(HOSTCC) -o $@ $< -$(KDIR)/vmlinux.gz: $(KDIR)/vmlinux - gzip -c -vf9 < $< > $@ - $(KDIR)/vmlinux.lzma: $(KDIR)/vmlinux cat $^ | $(STAGING_DIR)/bin/lzma e -si -so -eos -lc1 -lp2 -pb2 > $@ || (rm -f $@ && false) -$(BIN_DIR)/openwrt-ar7-2.4-kernel.bin: $(KDIR)/vmlinux.lzma compile +ifeq ($(IB),) +$(KDIR)/vmlinux.bin: $(KDIR)/vmlinux.lzma $(TARGET_CROSS)ld -T $(PKG_BUILD_DIR)/zimage.script -r -b binary $< -o $(KDIR)/zimage.o $(TARGET_CROSS)ld -static -G 0 --defsym kernel_entry=$(KERNEL_ENTRY) -T $(PKG_BUILD_DIR)/ld.script \ $(PKG_BUILD_DIR)/loader.o \ @@ -48,7 +46,11 @@ $(BIN_DIR)/openwrt-ar7-2.4-kernel.bin: $(KDIR)/vmlinux.lzma compile $(KDIR)/zimage.o \ -o $(KDIR)/loader $(TARGET_CROSS)objcopy -O srec $(KDIR)/loader $(KDIR)/ram_zimage.sre - $(PKG_BUILD_DIR)/srec2bin $(KDIR)/ram_zimage.sre $@ + $(STAGING_DIR)/bin/srec2bin $(KDIR)/ram_zimage.sre $@ +endif + +$(BIN_DIR)/openwrt-ar7-2.4-kernel.bin: $(KDIR)/vmlinux.bin + cp $< $@ ifeq ($(FS),jffs2-8MB) ALIGN:=bs=131072 conv=sync @@ -79,6 +81,6 @@ clean: rm -f $(BIN_DIR)/openwrt-ar7* prepare: $(PKG_BUILD_DIR) $(PKG_BUILD_DIR)/zimage.script $(PKG_BUILD_DIR)/ld.script -compile: prepare $(PKG_BUILD_DIR)/loader.o $(PKG_BUILD_DIR)/LzmaDecode.o $(PKG_BUILD_DIR)/srec2bin +compile: prepare $(PKG_BUILD_DIR)/loader.o $(PKG_BUILD_DIR)/LzmaDecode.o $(STAGING_DIR)/bin/srec2bin install: $(BIN_DIR)/openwrt-ar7-2.4-kernel.bin $(BIN_DIR)/openwrt-ar7-$(KERNEL)-$(FS).bin diff --git a/target/linux/image/brcm/Makefile b/target/linux/image/brcm/Makefile index 3399047438..ec8f72ccac 100644 --- a/target/linux/image/brcm/Makefile +++ b/target/linux/image/brcm/Makefile @@ -29,15 +29,14 @@ FSNAME:=$(patsubst jffs2-%,jffs2,$(FS)) ifneq ($(FS),jffs2-8MB) $(BIN_DIR)/openwrt-wrt54g-$(FSNAME).bin: $(BIN_DIR)/openwrt-brcm-$(KERNEL)-$(FS).trx - $(STAGING_DIR)/bin/addpattern -2 -i $< -o $@ -g - $(SED) "1s,^W54S,W54G," $@ + $(STAGING_DIR)/bin/addpattern -4 -p W54G -v v4.20.6 -i $< -o $@ -g install: $(BIN_DIR)/openwrt-wrt54g-$(FSNAME).bin endif ifneq ($(FS),jffs2-4MB) $(BIN_DIR)/openwrt-wrt54gs-$(FSNAME).bin: $(BIN_DIR)/openwrt-brcm-$(KERNEL)-$(FS).trx - $(STAGING_DIR)/bin/addpattern -2 -i $< -o $@ -g + $(STAGING_DIR)/bin/addpattern -4 -p W54S -v v4.70.6 -i $< -o $@ -g install: $(BIN_DIR)/openwrt-wrt54gs-$(FSNAME).bin endif diff --git a/target/linux/package/wlcompat/wlcompat.c b/target/linux/package/wlcompat/wlcompat.c index 037d9ce0f8..aaccc7bceb 100644 --- a/target/linux/package/wlcompat/wlcompat.c +++ b/target/linux/package/wlcompat/wlcompat.c @@ -2,7 +2,7 @@ * wlcompat.c * * Copyright (C) 2005 Mike Baker, - * Felix Fietkau <nbd@vd-s.ath.cx> + * Felix Fietkau <openwrt@nbd.name> * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -31,9 +31,9 @@ #include <net/iw_handler.h> #include <wlioctl.h> -#include <wlcompat.h> static struct net_device *dev; +static unsigned short bss_force; char buf[WLC_IOCTL_MAXLEN]; /* The frequency of each channel in MHz */ @@ -341,20 +341,53 @@ static int wlcompat_ioctl(struct net_device *dev, case SIOCSIWAP: { int ap = 0; - + int infra = 0; + rw_reg_t reg; + + memset(®, 0, sizeof(reg)); + if (wrqu->ap_addr.sa_family != ARPHRD_ETHER) return -EINVAL; if (wl_ioctl(dev, WLC_GET_AP, &ap, sizeof(ap)) < 0) return -EINVAL; - - if (wl_ioctl(dev, (ap ? WLC_SET_BSSID : WLC_REASSOC), wrqu->ap_addr.sa_data, 6) < 0) + + if (wl_ioctl(dev, WLC_GET_INFRA, &infra, sizeof(infra)) < 0) + return -EINVAL; + + if (!infra) { + wl_ioctl(dev, WLC_SET_BSSID, wrqu->ap_addr.sa_data, 6); + + reg.size = 4; + reg.byteoff = 0x184; + wl_ioctl(dev, WLC_R_REG, ®, sizeof(reg)); + + reg.val &= 0x0000ffff; + reg.val |= bss_force << 16; + wl_ioctl(dev, WLC_W_REG, ®, sizeof(reg)); + } + + if (wl_ioctl(dev, ((ap || !infra) ? WLC_SET_BSSID : WLC_REASSOC), wrqu->ap_addr.sa_data, 6) < 0) return -EINVAL; break; } case SIOCGIWAP: { +#ifdef DEBUG + rw_reg_t reg; + memset(®, 0, sizeof(reg)); + + reg.size = 4; + reg.byteoff = 0x184; + wl_ioctl(dev, WLC_R_REG, ®, sizeof(reg)); + printk("bss time = 0x%08x", reg.val); + + reg.byteoff = 0x180; + wl_ioctl(dev, WLC_R_REG, ®, sizeof(reg)); + printk("%08x\n", reg.val); +#endif + wrqu->ap_addr.sa_family = ARPHRD_ETHER; if (wl_ioctl(dev,WLC_GET_BSSID,wrqu->ap_addr.sa_data,6) < 0) return -EINVAL; @@ -661,6 +694,19 @@ static const iw_handler wlcompat_handler[] = { wlcompat_ioctl, /* SIOCGIWENCODE */ }; + +#define WLCOMPAT_SET_MONITOR SIOCIWFIRSTPRIV + 0 +#define WLCOMPAT_GET_MONITOR SIOCIWFIRSTPRIV + 1 +#define WLCOMPAT_SET_TXPWR_LIMIT SIOCIWFIRSTPRIV + 2 +#define WLCOMPAT_GET_TXPWR_LIMIT SIOCIWFIRSTPRIV + 3 +#define WLCOMPAT_SET_ANTDIV SIOCIWFIRSTPRIV + 4 +#define WLCOMPAT_GET_ANTDIV SIOCIWFIRSTPRIV + 5 +#define WLCOMPAT_SET_TXANT SIOCIWFIRSTPRIV + 6 +#define WLCOMPAT_GET_TXANT SIOCIWFIRSTPRIV + 7 +#define WLCOMPAT_SET_BSS_FORCE SIOCIWFIRSTPRIV + 8 +#define WLCOMPAT_GET_BSS_FORCE SIOCIWFIRSTPRIV + 9 + + static int wlcompat_private_ioctl(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, @@ -738,6 +784,16 @@ static int wlcompat_private_ioctl(struct net_device *dev, break; } + case WLCOMPAT_SET_BSS_FORCE: + { + bss_force = (unsigned short) *value; + break; + } + case WLCOMPAT_GET_BSS_FORCE: + { + *extra = (int) bss_force; + break; + } default: { return -EINVAL; @@ -789,6 +845,16 @@ static const struct iw_priv_args wlcompat_private_args[] = IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, "get_txant" }, + { WLCOMPAT_SET_BSS_FORCE, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + 0, + "set_bss_force" + }, + { WLCOMPAT_GET_BSS_FORCE, + 0, + IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, + "get_bss_force" + }, }; static const iw_handler wlcompat_private[] = @@ -861,6 +927,7 @@ static int __init wlcompat_init() { int found = 0, i; char *devname = "eth0"; + bss_force = 0; while (!found && (dev = dev_get_by_name(devname))) { if ((dev->wireless_handlers == NULL) && ((wl_ioctl(dev, WLC_GET_MAGIC, &i, sizeof(i)) == 0) && i == WLC_IOCTL_MAGIC)) diff --git a/target/utils/src/addpattern.c b/target/utils/src/addpattern.c index 084ecf29a5..5298f7b003 100644 --- a/target/utils/src/addpattern.c +++ b/target/utils/src/addpattern.c @@ -76,7 +76,7 @@ void usage(void) __attribute__ (( __noreturn__ )); void usage(void) { - fprintf(stderr, "Usage: addpattern [-i trxfile] [-o binfile] [-p pattern] [-g] [-b] [-v v#.#.#] [-{0|1|2}]\n"); + fprintf(stderr, "Usage: addpattern [-i trxfile] [-o binfile] [-p pattern] [-g] [-b] [-v v#.#.#] [-{0|1|2|4}]\n"); exit(EXIT_FAILURE); } @@ -136,6 +136,11 @@ int main(int argc, char **argv) hdr->flags |= SUPPORT_INTEL_FLASH; hdr->flags |= SUPPORT_5325E_SWITCH; break; + case '4': + /* V4 firmware sets the flags to 0x1f */ + hdr->hw_ver = 1; + hdr->flags = 0x1f; + break; default: usage(); |