| 1 | --- a/ath/Makefile |
| 2 | +++ b/ath/Makefile |
| 3 | @@ -41,7 +41,6 @@ |
| 4 | # |
| 5 | |
| 6 | obj := $(firstword $(obj) $(SUBDIRS) .) |
| 7 | -TOP = $(obj)/.. |
| 8 | |
| 9 | ifeq ($(strip $(BUS)),AHB) |
| 10 | BUSNAME=ahb |
| 11 | @@ -57,7 +56,24 @@ COPTS += -DDFS_DOMAIN_ETSI -DDFS_DOMAIN_ |
| 12 | include $(TOP)/Makefile.inc |
| 13 | |
| 14 | obj-m += ath_$(BUSNAME).o |
| 15 | -ath_$(BUSNAME)-objs := if_ath.o if_ath_radar.o if_ath_$(BUSNAME).o |
| 16 | +ath_objs := if_ath.o if_ath_radar.o if_ath_$(BUSNAME).o |
| 17 | +ath_$(BUSNAME)-objs := $(ath_objs) |
| 18 | + |
| 19 | +ifneq ($(SINGLE_MODULE),) |
| 20 | +include $(TOP)/net80211/Makefile |
| 21 | +include $(TOP)/ath_rate/sample/Makefile |
| 22 | +include $(TOP)/ath_rate/minstrel/Makefile |
| 23 | +RC_DECLARE=$(foreach R,$(ATH_RATE),extern void ath_rate_$(R)_init(void);extern void ath_rate_$(R)_exit(void);) |
| 24 | +RC_INIT=$(foreach R,$(ATH_RATE),ath_rate_$(R)_init();) |
| 25 | +RC_EXIT=$(foreach R,$(ATH_RATE),ath_rate_$(R)_exit();) |
| 26 | + |
| 27 | +ath_$(BUSNAME)-objs += $(patsubst %,../net80211/%,$(wlan-objs) $(foreach var,wep tkip ccmp acl xauth scan_sta scan_ap,$(wlan_$(var)-objs))) $(foreach RC,$(ATH_RATE),$(patsubst %,../ath_rate/$(RC)/%,$(ath_rate_$(RC)-objs))) |
| 28 | +ifdef LINUX24 |
| 29 | + ath_$(BUSNAME)-linkobjs := $(ath_objs) $(wlan-objs) $(foreach var,wep tkip ccmp acl xauth scan_sta scan_ap,$(wlan_$(var)-objs)) $(foreach RC,$(ATH_RATE),$(ath_rate_$(RC)-objs)) |
| 30 | +endif |
| 31 | + |
| 32 | +EXTRA_CFLAGS += -DSINGLE_MODULE -DRC_INIT="$(RC_INIT)" -DRC_EXIT="$(RC_EXIT)" -DRC_DECLARE="$(RC_DECLARE)" |
| 33 | +endif |
| 34 | |
| 35 | INCS += -I$(TOP) -I$(ATH_HAL) -I$(HAL) -I$(WLAN) |
| 36 | |
| 37 | @@ -72,13 +88,8 @@ install: |
| 38 | test -d $(DESTDIR)/$(KMODPATH) || mkdir -p $(DESTDIR)/$(KMODPATH) |
| 39 | install -m 0644 ath_$(BUSNAME).$(KMODSUF) $(DESTDIR)/$(KMODPATH) |
| 40 | |
| 41 | -clean: |
| 42 | - rm -f *~ *.o *.ko *.mod.c .*.cmd |
| 43 | - rm -f .depend .version .*.o.flags .*.o.d |
| 44 | - rm -rf .tmp_versions |
| 45 | - |
| 46 | ath_$(BUSNAME).o: $(ath_$(BUSNAME)-objs) |
| 47 | - $(LD) $(LDOPTS) -o ath_$(BUSNAME).$(KMODSUF) -r $(ath_$(BUSNAME)-objs) |
| 48 | + $(LD) $(LDOPTS) -o ath_$(BUSNAME).$(KMODSUF) -r $(if $(ath_$(BUSNAME)-linkobjs),$(ath_$(BUSNAME)-linkobjs),$(ath_$(BUSNAME)-objs)) |
| 49 | |
| 50 | if_ath_hal.h: $(HAL)/ah.h |
| 51 | $(TOP)/scripts/if_ath_hal_generator.pl $< $@ |
| 52 | --- a/net80211/ieee80211_acl.c |
| 53 | +++ b/net80211/ieee80211_acl.c |
| 54 | @@ -281,16 +281,6 @@ acl_getpolicy(struct ieee80211vap *vap) |
| 55 | return as->as_policy; |
| 56 | } |
| 57 | |
| 58 | -/* |
| 59 | - * Module glue. |
| 60 | - */ |
| 61 | - |
| 62 | -MODULE_AUTHOR("Errno Consulting, Sam Leffler"); |
| 63 | -MODULE_DESCRIPTION("802.11 wireless support: MAC-based ACL policy"); |
| 64 | -#ifdef MODULE_LICENSE |
| 65 | -MODULE_LICENSE("Dual BSD/GPL"); |
| 66 | -#endif |
| 67 | - |
| 68 | static const struct ieee80211_aclator mac = { |
| 69 | .iac_name = "mac", |
| 70 | .iac_attach = acl_attach, |
| 71 | @@ -303,6 +293,18 @@ static const struct ieee80211_aclator ma |
| 72 | .iac_getpolicy = acl_getpolicy, |
| 73 | }; |
| 74 | |
| 75 | +#include "module.h" |
| 76 | +/* |
| 77 | + * Module glue. |
| 78 | + */ |
| 79 | + |
| 80 | +MODULE_AUTHOR("Errno Consulting, Sam Leffler"); |
| 81 | +MODULE_DESCRIPTION("802.11 wireless support: MAC-based ACL policy"); |
| 82 | +#ifdef MODULE_LICENSE |
| 83 | +MODULE_LICENSE("Dual BSD/GPL"); |
| 84 | +#endif |
| 85 | + |
| 86 | + |
| 87 | static int __init |
| 88 | init_ieee80211_acl(void) |
| 89 | { |
| 90 | --- a/net80211/ieee80211_crypto_ccmp.c |
| 91 | +++ b/net80211/ieee80211_crypto_ccmp.c |
| 92 | @@ -686,6 +686,8 @@ ccmp_decrypt(struct ieee80211_key *key, |
| 93 | } |
| 94 | #undef CCMP_DECRYPT |
| 95 | |
| 96 | +#include "module.h" |
| 97 | + |
| 98 | /* |
| 99 | * Module glue. |
| 100 | */ |
| 101 | --- a/net80211/ieee80211_crypto_tkip.c |
| 102 | +++ b/net80211/ieee80211_crypto_tkip.c |
| 103 | @@ -1046,6 +1046,8 @@ tkip_decrypt(struct tkip_ctx *ctx, struc |
| 104 | return 1; |
| 105 | } |
| 106 | |
| 107 | +#include "module.h" |
| 108 | + |
| 109 | /* |
| 110 | * Module glue. |
| 111 | */ |
| 112 | --- a/net80211/ieee80211_crypto_wep.c |
| 113 | +++ b/net80211/ieee80211_crypto_wep.c |
| 114 | @@ -497,6 +497,8 @@ wep_decrypt(struct ieee80211_key *key, s |
| 115 | * Module glue. |
| 116 | */ |
| 117 | |
| 118 | +#include "module.h" |
| 119 | + |
| 120 | MODULE_AUTHOR("Errno Consulting, Sam Leffler"); |
| 121 | MODULE_DESCRIPTION("802.11 wireless support: WEP cipher"); |
| 122 | #ifdef MODULE_LICENSE |
| 123 | --- a/net80211/ieee80211_linux.c |
| 124 | +++ b/net80211/ieee80211_linux.c |
| 125 | @@ -1015,6 +1015,10 @@ static struct notifier_block ieee80211_e |
| 126 | static char *version = RELEASE_VERSION; |
| 127 | static char *dev_info = "wlan"; |
| 128 | |
| 129 | +extern void ieee80211_auth_setup(void); |
| 130 | + |
| 131 | +#include "module.h" |
| 132 | + |
| 133 | MODULE_AUTHOR("Errno Consulting, Sam Leffler"); |
| 134 | MODULE_DESCRIPTION("802.11 wireless LAN protocol support"); |
| 135 | #ifdef MODULE_VERSION |
| 136 | @@ -1024,8 +1028,6 @@ MODULE_VERSION(RELEASE_VERSION); |
| 137 | MODULE_LICENSE("Dual BSD/GPL"); |
| 138 | #endif |
| 139 | |
| 140 | -extern void ieee80211_auth_setup(void); |
| 141 | - |
| 142 | static int __init |
| 143 | init_wlan(void) |
| 144 | { |
| 145 | --- a/net80211/ieee80211_scan_ap.c |
| 146 | +++ b/net80211/ieee80211_scan_ap.c |
| 147 | @@ -763,15 +763,6 @@ action_tasklet(IEEE80211_TQUEUE_ARG data |
| 148 | (*ss->ss_ops->scan_default)(vap, &as->as_selbss); |
| 149 | } |
| 150 | |
| 151 | -/* |
| 152 | - * Module glue. |
| 153 | - */ |
| 154 | -MODULE_AUTHOR("Errno Consulting, Sam Leffler"); |
| 155 | -MODULE_DESCRIPTION("802.11 wireless support: default ap scanner"); |
| 156 | -#ifdef MODULE_LICENSE |
| 157 | -MODULE_LICENSE("Dual BSD/GPL"); |
| 158 | -#endif |
| 159 | - |
| 160 | static const struct ieee80211_scanner ap_default = { |
| 161 | .scan_name = "default", |
| 162 | .scan_attach = ap_attach, |
| 163 | @@ -789,6 +780,16 @@ static const struct ieee80211_scanner ap |
| 164 | .scan_default = ap_default_action, |
| 165 | }; |
| 166 | |
| 167 | +#include "module.h" |
| 168 | + |
| 169 | +/* |
| 170 | + * Module glue. |
| 171 | + */ |
| 172 | +MODULE_AUTHOR("Errno Consulting, Sam Leffler"); |
| 173 | +MODULE_DESCRIPTION("802.11 wireless support: default ap scanner"); |
| 174 | +#ifdef MODULE_LICENSE |
| 175 | +MODULE_LICENSE("Dual BSD/GPL"); |
| 176 | +#endif |
| 177 | |
| 178 | static int __init |
| 179 | init_scanner_ap(void) |
| 180 | --- a/net80211/ieee80211_scan_sta.c |
| 181 | +++ b/net80211/ieee80211_scan_sta.c |
| 182 | @@ -1208,6 +1208,8 @@ action_tasklet(IEEE80211_TQUEUE_ARG data |
| 183 | ieee80211_start_scan(vap, ss->ss_flags, ss->ss_duration, ss->ss_nssid, ss->ss_ssid); |
| 184 | } |
| 185 | |
| 186 | +#include "module.h" |
| 187 | + |
| 188 | /* |
| 189 | * Module glue. |
| 190 | */ |
| 191 | @@ -1217,6 +1219,7 @@ MODULE_DESCRIPTION("802.11 wireless supp |
| 192 | MODULE_LICENSE("Dual BSD/GPL"); |
| 193 | #endif |
| 194 | |
| 195 | + |
| 196 | static int __init |
| 197 | init_scanner_sta(void) |
| 198 | { |
| 199 | --- a/net80211/ieee80211_xauth.c |
| 200 | +++ b/net80211/ieee80211_xauth.c |
| 201 | @@ -65,15 +65,6 @@ |
| 202 | #include <net80211/ieee80211_var.h> |
| 203 | |
| 204 | /* |
| 205 | - * Module glue. |
| 206 | - */ |
| 207 | -MODULE_AUTHOR("Errno Consulting, Sam Leffler"); |
| 208 | -MODULE_DESCRIPTION("802.11 wireless support: external (user mode) authenticator"); |
| 209 | -#ifdef MODULE_LICENSE |
| 210 | -MODULE_LICENSE("Dual BSD/GPL"); |
| 211 | -#endif |
| 212 | - |
| 213 | -/* |
| 214 | * One module handles everything for now. May want |
| 215 | * to split things up for embedded applications. |
| 216 | */ |
| 217 | @@ -85,6 +76,18 @@ static const struct ieee80211_authentica |
| 218 | .ia_node_leave = NULL, |
| 219 | }; |
| 220 | |
| 221 | +#include "module.h" |
| 222 | + |
| 223 | +/* |
| 224 | + * Module glue. |
| 225 | + */ |
| 226 | +MODULE_AUTHOR("Errno Consulting, Sam Leffler"); |
| 227 | +MODULE_DESCRIPTION("802.11 wireless support: external (user mode) authenticator"); |
| 228 | +#ifdef MODULE_LICENSE |
| 229 | +MODULE_LICENSE("Dual BSD/GPL"); |
| 230 | +#endif |
| 231 | + |
| 232 | + |
| 233 | static int __init |
| 234 | init_ieee80211_xauth(void) |
| 235 | { |
| 236 | --- a/net80211/Makefile |
| 237 | +++ b/net80211/Makefile |
| 238 | @@ -40,7 +40,11 @@ |
| 239 | # Makefile for the 802.11 WLAN modules. |
| 240 | # |
| 241 | obj := $(firstword $(obj) $(SUBDIRS) .) |
| 242 | -TOP = $(obj)/.. |
| 243 | + |
| 244 | +include $(TOP)/Makefile.inc |
| 245 | + |
| 246 | +ifeq ($(SINGLE_MODULE),) |
| 247 | + |
| 248 | # |
| 249 | # There is one authenticator mechanism: an in-kernel implementation |
| 250 | # (wlan_xauth). |
| 251 | @@ -59,29 +63,8 @@ MOD_INSTALL := wlan.o wlan_wep.o wlan_tk |
| 252 | |
| 253 | obj-m += $(MOD_INSTALL) |
| 254 | |
| 255 | -wlan-objs := if_media.o \ |
| 256 | - ieee80211_skb.o \ |
| 257 | - ieee80211.o ieee80211_beacon.o ieee80211_crypto.o \ |
| 258 | - ieee80211_crypto_none.o ieee80211_input.o ieee80211_node.o \ |
| 259 | - ieee80211_output.o ieee80211_power.o ieee80211_proto.o \ |
| 260 | - ieee80211_scan.o ieee80211_wireless.o ieee80211_linux.o \ |
| 261 | - ieee80211_monitor.o ieee80211_rate.o |
| 262 | -wlan_wep-objs := ieee80211_crypto_wep.o |
| 263 | -wlan_tkip-objs := ieee80211_crypto_tkip.o |
| 264 | -wlan_ccmp-objs := ieee80211_crypto_ccmp.o |
| 265 | -wlan_acl-objs := ieee80211_acl.o |
| 266 | -wlan_xauth-objs := ieee80211_xauth.o |
| 267 | -wlan_scan_sta-objs :=ieee80211_scan_sta.o |
| 268 | -wlan_scan_ap-objs := ieee80211_scan_ap.o |
| 269 | - |
| 270 | -include $(TOP)/Makefile.inc |
| 271 | - |
| 272 | INCS += -I$(TOP) -I$(ATH_HAL) -I$(HAL) |
| 273 | |
| 274 | -EXTRA_CFLAGS+=$(INCS) $(COPTS) -DOPT_AH_H=\"public/$(TARGET).opt_ah.h\" |
| 275 | - |
| 276 | --include $(TOPDIR)/Rules.make |
| 277 | - |
| 278 | all: |
| 279 | $(MAKE) -C $(KERNELPATH) SUBDIRS=$(shell pwd) modules |
| 280 | |
| 281 | @@ -108,8 +91,28 @@ install: |
| 282 | f=`basename $$i .o`; \ |
| 283 | install -m 0644 $$f.$(KMODSUF) $(DESTDIR)/$(KMODPATH); \ |
| 284 | done |
| 285 | +else |
| 286 | +all: |
| 287 | +endif |
| 288 | + |
| 289 | +wlan-objs := if_media.o \ |
| 290 | + ieee80211_skb.o \ |
| 291 | + ieee80211.o ieee80211_beacon.o ieee80211_crypto.o \ |
| 292 | + ieee80211_crypto_none.o ieee80211_input.o ieee80211_node.o \ |
| 293 | + ieee80211_output.o ieee80211_power.o ieee80211_proto.o \ |
| 294 | + ieee80211_scan.o ieee80211_wireless.o ieee80211_linux.o \ |
| 295 | + ieee80211_monitor.o ieee80211_rate.o |
| 296 | +wlan_wep-objs := ieee80211_crypto_wep.o |
| 297 | +wlan_tkip-objs := ieee80211_crypto_tkip.o |
| 298 | +wlan_ccmp-objs := ieee80211_crypto_ccmp.o |
| 299 | +wlan_acl-objs := ieee80211_acl.o |
| 300 | +wlan_xauth-objs := ieee80211_xauth.o |
| 301 | +wlan_scan_sta-objs :=ieee80211_scan_sta.o |
| 302 | +wlan_scan_ap-objs := ieee80211_scan_ap.o |
| 303 | + |
| 304 | + |
| 305 | +EXTRA_CFLAGS+=$(INCS) $(COPTS) -DOPT_AH_H=\"public/$(TARGET).opt_ah.h\" |
| 306 | + |
| 307 | +-include $(TOPDIR)/Rules.make |
| 308 | + |
| 309 | |
| 310 | -clean: |
| 311 | - -rm -f *~ *.o *.ko *.mod.c |
| 312 | - -rm -f .depend .version .*.o.flags .*.o.d .*.o.cmd .*.ko.cmd |
| 313 | - -rm -rf .tmp_versions |
| 314 | --- /dev/null |
| 315 | +++ b/net80211/module.h |
| 316 | @@ -0,0 +1,19 @@ |
| 317 | +#ifdef SINGLE_MODULE |
| 318 | + |
| 319 | +#undef static |
| 320 | +#define static |
| 321 | +#undef module_init |
| 322 | +#undef module_exit |
| 323 | +#define module_init(...) |
| 324 | +#define module_exit(...) |
| 325 | + |
| 326 | +#undef MODULE_AUTHOR |
| 327 | +#undef MODULE_LICENSE |
| 328 | +#undef MODULE_VERSION |
| 329 | +#undef MODULE_DESCRIPTION |
| 330 | +#define MODULE_AUTHOR(...) |
| 331 | +#define MODULE_LICENSE(...) |
| 332 | +#define MODULE_VERSION(...) |
| 333 | +#define MODULE_DESCRIPTION(...) |
| 334 | + |
| 335 | +#endif |
| 336 | --- a/ath/if_ath.c |
| 337 | +++ b/ath/if_ath.c |
| 338 | @@ -13780,3 +13780,5 @@ cleanup_ath_buf(struct ath_softc *sc, st |
| 339 | return bf; |
| 340 | } |
| 341 | |
| 342 | + |
| 343 | + |
| 344 | --- a/net80211/ieee80211.c |
| 345 | +++ b/net80211/ieee80211.c |
| 346 | @@ -42,6 +42,7 @@ |
| 347 | #include <linux/config.h> |
| 348 | #endif |
| 349 | #include <linux/version.h> |
| 350 | +#include <linux/init.h> |
| 351 | #include <linux/module.h> |
| 352 | #include <linux/skbuff.h> |
| 353 | #include <linux/netdevice.h> |
| 354 | @@ -2015,3 +2016,65 @@ ieee80211_build_sc_ie(struct ieee80211co |
| 355 | int ath_debug_global = 0; |
| 356 | EXPORT_SYMBOL(ath_debug_global); |
| 357 | |
| 358 | +#ifdef SINGLE_MODULE |
| 359 | +typedef void (*initfunc)(void); |
| 360 | + |
| 361 | +extern void init_ieee80211_acl(void); |
| 362 | +extern void init_crypto_ccmp(void); |
| 363 | +extern void init_crypto_tkip(void); |
| 364 | +extern void init_crypto_wep(void); |
| 365 | +extern void init_wlan(void); |
| 366 | +extern void init_scanner_ap(void); |
| 367 | +extern void init_scanner_sta(void); |
| 368 | +extern void init_ieee80211_xauth(void); |
| 369 | + |
| 370 | +extern void exit_ieee80211_acl(void); |
| 371 | +extern void exit_crypto_ccmp(void); |
| 372 | +extern void exit_crypto_tkip(void); |
| 373 | +extern void exit_crypto_wep(void); |
| 374 | +extern void exit_wlan(void); |
| 375 | +extern void exit_scanner_ap(void); |
| 376 | +extern void exit_scanner_sta(void); |
| 377 | +extern void exit_ieee80211_xauth(void); |
| 378 | + |
| 379 | +static __initdata initfunc net80211_init[] = { |
| 380 | + init_wlan, |
| 381 | + init_ieee80211_acl, |
| 382 | + init_crypto_ccmp, |
| 383 | + init_crypto_tkip, |
| 384 | + init_crypto_wep, |
| 385 | + init_ieee80211_xauth, |
| 386 | + init_scanner_ap, |
| 387 | + init_scanner_sta, |
| 388 | +}; |
| 389 | + |
| 390 | +static __exitdata initfunc net80211_exit[] = { |
| 391 | + exit_crypto_ccmp, |
| 392 | + exit_crypto_tkip, |
| 393 | + exit_crypto_wep, |
| 394 | + exit_scanner_ap, |
| 395 | + exit_scanner_sta, |
| 396 | + exit_ieee80211_xauth, |
| 397 | + exit_ieee80211_acl, |
| 398 | + exit_wlan, |
| 399 | +}; |
| 400 | + |
| 401 | +void net80211_init_module(void) |
| 402 | +{ |
| 403 | + int i; |
| 404 | + for (i = 0; i < sizeof(net80211_init)/sizeof(net80211_init[0]); i++) { |
| 405 | + if (net80211_init[i]) |
| 406 | + net80211_init[i](); |
| 407 | + } |
| 408 | +} |
| 409 | + |
| 410 | +void net80211_exit_module(void) |
| 411 | +{ |
| 412 | + int i; |
| 413 | + for (i = 0; i < sizeof(net80211_exit)/sizeof(net80211_exit[0]); i++) { |
| 414 | + if (net80211_exit[i]) |
| 415 | + net80211_exit[i](); |
| 416 | + } |
| 417 | +} |
| 418 | + |
| 419 | +#endif |
| 420 | --- a/ath/if_ath_ahb.c |
| 421 | +++ b/ath/if_ath_ahb.c |
| 422 | @@ -447,10 +447,18 @@ MODULE_SUPPORTED_DEVICE("Atheros WLAN ca |
| 423 | MODULE_LICENSE("Dual BSD/GPL"); |
| 424 | #endif |
| 425 | |
| 426 | +#ifdef SINGLE_MODULE |
| 427 | +RC_DECLARE |
| 428 | +#endif |
| 429 | + |
| 430 | static int __init |
| 431 | init_ath_ahb(void) |
| 432 | { |
| 433 | printk(KERN_INFO "%s: %s\n", dev_info, version); |
| 434 | +#ifdef SINGLE_MODULE |
| 435 | + net80211_init_module(); |
| 436 | + RC_INIT |
| 437 | +#endif |
| 438 | platform_driver_register(&ahb_wmac_driver); |
| 439 | ath_sysctl_register(); |
| 440 | |
| 441 | @@ -463,6 +471,10 @@ exit_ath_ahb(void) |
| 442 | { |
| 443 | ath_sysctl_unregister(); |
| 444 | platform_driver_unregister(&ahb_wmac_driver); |
| 445 | +#ifdef SINGLE_MODULE |
| 446 | + RC_EXIT |
| 447 | + net80211_exit_module(); |
| 448 | +#endif |
| 449 | printk(KERN_INFO "%s: driver unloaded\n", dev_info); |
| 450 | } |
| 451 | module_exit(exit_ath_ahb); |
| 452 | --- a/ath/if_ath_pci.c |
| 453 | +++ b/ath/if_ath_pci.c |
| 454 | @@ -415,11 +415,19 @@ MODULE_SUPPORTED_DEVICE("Atheros WLAN ca |
| 455 | MODULE_LICENSE("Dual BSD/GPL"); |
| 456 | #endif |
| 457 | |
| 458 | +#ifdef SINGLE_MODULE |
| 459 | +RC_DECLARE |
| 460 | +#endif |
| 461 | + |
| 462 | static int __init |
| 463 | init_ath_pci(void) |
| 464 | { |
| 465 | printk(KERN_INFO "%s: %s\n", dev_info, version); |
| 466 | |
| 467 | +#ifdef SINGLE_MODULE |
| 468 | + net80211_init_module(); |
| 469 | + RC_INIT |
| 470 | +#endif |
| 471 | if (pci_register_driver(&ath_pci_driver) < 0) { |
| 472 | printk(KERN_ERR "%s: No devices found, driver not installed.\n", dev_info); |
| 473 | return (-ENODEV); |
| 474 | @@ -434,6 +442,10 @@ exit_ath_pci(void) |
| 475 | { |
| 476 | ath_sysctl_unregister(); |
| 477 | pci_unregister_driver(&ath_pci_driver); |
| 478 | +#ifdef SINGLE_MODULE |
| 479 | + RC_EXIT |
| 480 | + net80211_exit_module(); |
| 481 | +#endif |
| 482 | |
| 483 | printk(KERN_INFO "%s: driver unloaded\n", dev_info); |
| 484 | } |
| 485 | --- a/ath_rate/minstrel/Makefile |
| 486 | +++ b/ath_rate/minstrel/Makefile |
| 487 | @@ -39,9 +39,7 @@ |
| 488 | # Makefile for the Atheros Rate Control Support. |
| 489 | # |
| 490 | obj := $(firstword $(obj) $(SUBDIRS) .) |
| 491 | -TOP = $(obj)/../.. |
| 492 | |
| 493 | -obj-m += ath_rate_minstrel.o |
| 494 | ath_rate_minstrel-objs := minstrel.o |
| 495 | |
| 496 | include $(TOP)/Makefile.inc |
| 497 | @@ -50,6 +48,10 @@ INCS += -I$(TOP) -I$(ATH) -I$(ATH_HAL) - |
| 498 | |
| 499 | EXTRA_CFLAGS+= $(INCS) $(COPTS) -DOPT_AH_H=\"public/$(TARGET).opt_ah.h\" |
| 500 | |
| 501 | +ifeq ($(SINGLE_MODULE),) |
| 502 | + |
| 503 | +obj-m += ath_rate_minstrel.o |
| 504 | + |
| 505 | -include $(TOPDIR)/Rules.make |
| 506 | |
| 507 | all: |
| 508 | @@ -59,10 +61,9 @@ install: |
| 509 | test -d $(DESTDIR)/$(KMODPATH) || mkdir -p $(DESTDIR)/$(KMODPATH) |
| 510 | install -m 0644 ath_rate_minstrel.$(KMODSUF) $(DESTDIR)/$(KMODPATH) |
| 511 | |
| 512 | -clean: |
| 513 | - -rm -f *~ *.o *.ko *.mod.c |
| 514 | - -rm -f .depend .version .*.o.flags .*.o.d .*.o.cmd .*.ko.cmd |
| 515 | - -rm -rf .tmp_versions |
| 516 | - |
| 517 | ath_rate_minstrel.o: $(ath_rate_minstrel-objs) |
| 518 | $(LD) $(LDOPTS) -o ath_rate_minstrel.$(KMODSUF) -r $(ath_rate_minstrel-objs) |
| 519 | +else |
| 520 | +all: |
| 521 | +install: |
| 522 | +endif |
| 523 | --- a/ath_rate/minstrel/minstrel.c |
| 524 | +++ b/ath_rate/minstrel/minstrel.c |
| 525 | @@ -945,6 +945,8 @@ static struct ieee80211_rate_ops ath_rat |
| 526 | .dynamic_proc_register = ath_rate_dynamic_proc_register, |
| 527 | }; |
| 528 | |
| 529 | +#include <net80211/module.h> |
| 530 | + |
| 531 | MODULE_AUTHOR("John Bicket/Derek Smithies"); |
| 532 | MODULE_DESCRIPTION("Minstrel Rate bit-rate selection algorithm for Atheros devices"); |
| 533 | #ifdef MODULE_VERSION |
| 534 | --- a/net80211/ieee80211_var.h |
| 535 | +++ b/net80211/ieee80211_var.h |
| 536 | @@ -47,6 +47,7 @@ |
| 537 | #include <net80211/ieee80211_power.h> |
| 538 | #include <net80211/ieee80211_proto.h> |
| 539 | #include <net80211/ieee80211_scan.h> |
| 540 | +#include "symbol.h" |
| 541 | |
| 542 | /* NB: |
| 543 | * - Atheros chips use 6 bits when power is specified in whole dBm units, with |
| 544 | @@ -740,6 +741,8 @@ void ieee80211_dfs_action(struct ieee802 |
| 545 | void ieee80211_expire_channel_excl_restrictions(struct ieee80211com *); |
| 546 | void ieee80211_setpuregbasicrates(struct ieee80211_rateset *rs); |
| 547 | int ieee80211_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd); |
| 548 | +void net80211_init_module(void); |
| 549 | +void net80211_exit_module(void); |
| 550 | |
| 551 | /* |
| 552 | * Iterate through ic_channels to enumerate all distinct ic_ieee channel numbers. |
| 553 | --- a/net80211/ieee80211_linux.h |
| 554 | +++ b/net80211/ieee80211_linux.h |
| 555 | @@ -521,7 +521,10 @@ extern struct sk_buff * ieee80211_getmgt |
| 556 | #define IF_DRAIN(_q) skb_queue_drain(_q) |
| 557 | extern void skb_queue_drain(struct sk_buff_head *q); |
| 558 | |
| 559 | -#ifndef __MOD_INC_USE_COUNT |
| 560 | +#ifdef SINGLE_MODULE |
| 561 | +#define _MOD_DEC_USE(_m) do {} while(0) |
| 562 | +#define _MOD_INC_USE(_m, _err) do {} while(0) |
| 563 | +#elif !defined(__MOD_INC_USE_COUNT) |
| 564 | #define _MOD_INC_USE(_m, _err) \ |
| 565 | if (!try_module_get(_m)) { \ |
| 566 | printk(KERN_WARNING "%s: try_module_get failed\n", \ |
| 567 | --- a/ath_rate/sample/Makefile |
| 568 | +++ b/ath_rate/sample/Makefile |
| 569 | @@ -39,9 +39,7 @@ |
| 570 | # Makefile for the Atheros Rate Control Support. |
| 571 | # |
| 572 | obj := $(firstword $(obj) $(SUBDIRS) .) |
| 573 | -TOP = $(obj)/../.. |
| 574 | |
| 575 | -obj-m += ath_rate_sample.o |
| 576 | ath_rate_sample-objs := sample.o |
| 577 | |
| 578 | include $(TOP)/Makefile.inc |
| 579 | @@ -50,6 +48,9 @@ INCS += -I$(TOP) -I$(ATH) -I$(ATH_HAL) - |
| 580 | |
| 581 | EXTRA_CFLAGS+= $(INCS) $(COPTS) -DOPT_AH_H=\"public/$(TARGET).opt_ah.h\" |
| 582 | |
| 583 | +ifeq ($(SINGLE_MODULE),) |
| 584 | +obj-m += ath_rate_sample.o |
| 585 | + |
| 586 | -include $(TOPDIR)/Rules.make |
| 587 | |
| 588 | all: |
| 589 | @@ -59,10 +60,9 @@ install: |
| 590 | test -d $(DESTDIR)/$(KMODPATH) || mkdir -p $(DESTDIR)/$(KMODPATH) |
| 591 | install -m 0644 ath_rate_sample.$(KMODSUF) $(DESTDIR)/$(KMODPATH) |
| 592 | |
| 593 | -clean: |
| 594 | - -rm -f *~ *.o *.ko *.mod.c |
| 595 | - -rm -f .depend .version .*.o.flags .*.o.d .*.o.cmd .*.ko.cmd |
| 596 | - -rm -rf .tmp_versions |
| 597 | - |
| 598 | ath_rate_sample.o: $(ath_rate_sample-objs) |
| 599 | $(LD) $(LDOPTS) -o ath_rate_sample.$(KMODSUF) -r $(ath_rate_sample-objs) |
| 600 | +else |
| 601 | +all: |
| 602 | +install: |
| 603 | +endif |
| 604 | --- a/Makefile |
| 605 | +++ b/Makefile |
| 606 | @@ -41,7 +41,7 @@ |
| 607 | # |
| 608 | |
| 609 | obj := $(firstword $(obj) $(SUBDIRS) .) |
| 610 | -TOP = $(obj) |
| 611 | +export TOP:=$(if $(wildcard $(firstword $(SUBDIRS))/Makefile.inc),$(firstword $(SUBDIRS)),$(CURDIR)) |
| 612 | |
| 613 | ifneq (svnversion.h,$(MAKECMDGOALS)) |
| 614 | include $(TOP)/Makefile.inc |
| 615 | @@ -54,7 +54,7 @@ all: modules tools |
| 616 | modules: configcheck svnversion.h |
| 617 | ifdef LINUX24 |
| 618 | for i in $(obj-y); do \ |
| 619 | - $(MAKE) -C $$i || exit 1; \ |
| 620 | + $(MAKE) -C $$i TOP="$(TOP)" || exit 1; \ |
| 621 | done |
| 622 | else |
| 623 | $(MAKE) -C $(KERNELPATH) SUBDIRS=$(shell pwd) modules |
| 624 | @@ -89,7 +89,7 @@ install-modules: modules |
| 625 | sh scripts/find-madwifi-modules.sh -r $(KERNELRELEASE) $(DESTDIR) |
| 626 | |
| 627 | for i in $(obj-y); do \ |
| 628 | - $(MAKE) -C $$i install || exit 1; \ |
| 629 | + $(MAKE) -C $$i install TOP="$(TOP)" || exit 1; \ |
| 630 | done |
| 631 | ifeq ($(DESTDIR),) |
| 632 | (export KMODPATH=$(KMODPATH); /sbin/depmod -ae $(KERNELRELEASE)) |
| 633 | @@ -114,12 +114,21 @@ reinstall-tools: uninstall-tools install |
| 634 | reinstall-modules: uninstall-modules install-modules |
| 635 | |
| 636 | clean: |
| 637 | - for i in $(obj-y); do \ |
| 638 | - $(MAKE) -C $$i clean; \ |
| 639 | - done |
| 640 | - -$(MAKE) -C $(TOOLS) clean |
| 641 | - rm -rf .tmp_versions |
| 642 | + -find $(obj-y) -name '*~' \ |
| 643 | + -or -name '*.o' \ |
| 644 | + -or -name '*.o.d' \ |
| 645 | + -or -name '*.o.cmd' \ |
| 646 | + -or -name '*.o.flags' \ |
| 647 | + -or -name '*.ko' \ |
| 648 | + -or -name '*.ko.cmd' \ |
| 649 | + -or -name '*.mod.c' \ |
| 650 | + -or -name '.depend' \ |
| 651 | + -or -name '.version' \ |
| 652 | + -or -name '.symvers' | \ |
| 653 | + xargs -r rm -f |
| 654 | rm -f *.symvers svnversion.h |
| 655 | + rm -rf .tmp_versions |
| 656 | + make -C tools clean |
| 657 | |
| 658 | info: |
| 659 | @echo "The following settings will be used for compilation:" |
| 660 | @@ -135,18 +144,6 @@ info: |
| 661 | @echo "KMODPATH : $(KMODPATH)" |
| 662 | @echo "KMODSUF : $(KMODSUF)" |
| 663 | |
| 664 | -sanitycheck: |
| 665 | - @echo -n "Checking requirements... " |
| 666 | - |
| 667 | - @# check if specified rate control is available |
| 668 | - @if [ ! -d $(ATH_RATE) ]; then \ |
| 669 | - echo "FAILED"; \ |
| 670 | - echo "Selected rate control $(ATH_RATE) not available."; \ |
| 671 | - exit 1; \ |
| 672 | - fi |
| 673 | - |
| 674 | - @echo "ok." |
| 675 | - |
| 676 | .PHONY: release |
| 677 | release: |
| 678 | sh scripts/make-release.bash |
| 679 | @@ -155,7 +152,7 @@ release: |
| 680 | unload: |
| 681 | bash scripts/madwifi-unload |
| 682 | |
| 683 | -configcheck: sanitycheck |
| 684 | +configcheck: |
| 685 | @echo -n "Checking kernel configuration... " |
| 686 | |
| 687 | @# check version of kernel |
| 688 | --- a/Makefile.inc |
| 689 | +++ b/Makefile.inc |
| 690 | @@ -68,6 +68,9 @@ endif |
| 691 | export KERNELPATH |
| 692 | endif |
| 693 | |
| 694 | +# build net80211 and ath_ahb/ath_pci into a single module |
| 695 | +export SINGLE_MODULE=1 |
| 696 | + |
| 697 | # KERNELRELEASE is the target kernel's version. It's always taken from |
| 698 | # the kernel build tree. Kernel Makefile doesn't always know the exact |
| 699 | # kernel version (especially for vendor stock kernels), so we get it |
| 700 | @@ -100,6 +103,7 @@ export ARCH |
| 701 | include $(TOP)/ath_hal/ah_target.inc |
| 702 | export TARGET |
| 703 | COPTS += -DTARGET='"$(TARGET)"' |
| 704 | +COPTS += -DCONFIG_ATHEROS_RATE_DEFAULT='"$(firstword $(ATH_RATE))"' |
| 705 | |
| 706 | # KMODPATH nominates the directory where the modules will be |
| 707 | # installed to |
| 708 | @@ -141,7 +145,7 @@ ATH= $(TOP)/ath |
| 709 | # |
| 710 | # Path to the rate control algorithms. |
| 711 | # |
| 712 | -ATH_RATE= $(TOP)/ath_rate |
| 713 | +ATH_RATE= minstrel |
| 714 | # |
| 715 | # Path to the userspace utilities. |
| 716 | # |
| 717 | --- a/ath_rate/sample/sample.c |
| 718 | +++ b/ath_rate/sample/sample.c |
| 719 | @@ -991,6 +991,8 @@ static struct ieee80211_rate_ops ath_rat |
| 720 | .dynamic_proc_register = ath_rate_dynamic_proc_register, |
| 721 | }; |
| 722 | |
| 723 | +#include <net80211/module.h> |
| 724 | + |
| 725 | MODULE_AUTHOR("John Bicket"); |
| 726 | MODULE_DESCRIPTION("SampleRate bit-rate selection algorithm for Atheros devices"); |
| 727 | #ifdef MODULE_VERSION |
| 728 | @@ -1000,18 +1002,17 @@ MODULE_VERSION(RELEASE_VERSION); |
| 729 | MODULE_LICENSE("Dual BSD/GPL"); |
| 730 | #endif |
| 731 | |
| 732 | -static int __init |
| 733 | -init_ath_rate_sample(void) |
| 734 | +static int __init ath_rate_sample_init(void) |
| 735 | { |
| 736 | printk(KERN_INFO "%s: %s\n", dev_info, version); |
| 737 | return ieee80211_rate_register(&ath_rate_ops); |
| 738 | } |
| 739 | -module_init(init_ath_rate_sample); |
| 740 | +module_init(ath_rate_sample_init); |
| 741 | |
| 742 | static void __exit |
| 743 | -exit_ath_rate_sample(void) |
| 744 | +ath_rate_sample_exit(void) |
| 745 | { |
| 746 | ieee80211_rate_unregister(&ath_rate_ops); |
| 747 | printk(KERN_INFO "%s: unloaded\n", dev_info); |
| 748 | } |
| 749 | -module_exit(exit_ath_rate_sample); |
| 750 | +module_exit(ath_rate_sample_exit); |
| 751 | --- a/net80211/if_media.h |
| 752 | +++ b/net80211/if_media.h |
| 753 | @@ -42,6 +42,7 @@ |
| 754 | #define _NET_IF_MEDIA_H_ |
| 755 | |
| 756 | #include <net80211/ieee80211_linux.h> |
| 757 | +#include "symbol.h" |
| 758 | |
| 759 | /* |
| 760 | * Prototypes and definitions for BSD/OS-compatible network interface |
| 761 | --- /dev/null |
| 762 | +++ b/net80211/symbol.h |
| 763 | @@ -0,0 +1,4 @@ |
| 764 | +#ifdef SINGLE_MODULE |
| 765 | +#undef EXPORT_SYMBOL |
| 766 | +#define EXPORT_SYMBOL(...) |
| 767 | +#endif |
| 768 | --- a/ath_rate/Makefile |
| 769 | +++ b/ath_rate/Makefile |
| 770 | @@ -1,7 +1,7 @@ |
| 771 | obj := $(firstword $(obj) $(SUBDIRS) .) |
| 772 | TOP = $(obj)/.. |
| 773 | |
| 774 | -obj-y := amrr/ onoe/ sample/ minstrel/ |
| 775 | +obj-y := sample/ minstrel/ |
| 776 | |
| 777 | include $(TOP)/Makefile.inc |
| 778 | |
| 779 | |