17780dd71SAdrian Chadd /*- 27780dd71SAdrian Chadd * Copyright (c) 2009-2010 Weongyo Jeong <weongyo@freebsd.org> 37780dd71SAdrian Chadd * All rights reserved. 47780dd71SAdrian Chadd * 57780dd71SAdrian Chadd * Redistribution and use in source and binary forms, with or without 67780dd71SAdrian Chadd * modification, are permitted provided that the following conditions 77780dd71SAdrian Chadd * are met: 87780dd71SAdrian Chadd * 1. Redistributions of source code must retain the above copyright 97780dd71SAdrian Chadd * notice, this list of conditions and the following disclaimer, 107780dd71SAdrian Chadd * without modification. 117780dd71SAdrian Chadd * 2. Redistributions in binary form must reproduce at minimum a disclaimer 127780dd71SAdrian Chadd * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any 137780dd71SAdrian Chadd * redistribution must be conditioned upon including a substantially 147780dd71SAdrian Chadd * similar Disclaimer requirement for further binary redistribution. 157780dd71SAdrian Chadd * 167780dd71SAdrian Chadd * NO WARRANTY 177780dd71SAdrian Chadd * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 187780dd71SAdrian Chadd * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 197780dd71SAdrian Chadd * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY 207780dd71SAdrian Chadd * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 217780dd71SAdrian Chadd * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, 227780dd71SAdrian Chadd * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 237780dd71SAdrian Chadd * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 247780dd71SAdrian Chadd * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 257780dd71SAdrian Chadd * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 267780dd71SAdrian Chadd * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 277780dd71SAdrian Chadd * THE POSSIBILITY OF SUCH DAMAGES. 287780dd71SAdrian Chadd */ 297780dd71SAdrian Chadd 307780dd71SAdrian Chadd #include <sys/cdefs.h> 317780dd71SAdrian Chadd __FBSDID("$FreeBSD$"); 327780dd71SAdrian Chadd 337780dd71SAdrian Chadd /* 347780dd71SAdrian Chadd * The Broadcom Wireless LAN controller driver. 357780dd71SAdrian Chadd */ 367780dd71SAdrian Chadd 37*5025b8d5SAdrian Chadd #include "opt_bwn.h" 38*5025b8d5SAdrian Chadd #include "opt_wlan.h" 39*5025b8d5SAdrian Chadd 407780dd71SAdrian Chadd #include <sys/param.h> 417780dd71SAdrian Chadd #include <sys/systm.h> 427780dd71SAdrian Chadd #include <sys/kernel.h> 437780dd71SAdrian Chadd #include <sys/malloc.h> 447780dd71SAdrian Chadd #include <sys/module.h> 457780dd71SAdrian Chadd #include <sys/endian.h> 467780dd71SAdrian Chadd #include <sys/errno.h> 477780dd71SAdrian Chadd #include <sys/firmware.h> 487780dd71SAdrian Chadd #include <sys/lock.h> 497780dd71SAdrian Chadd #include <sys/mutex.h> 507780dd71SAdrian Chadd #include <machine/bus.h> 517780dd71SAdrian Chadd #include <machine/resource.h> 527780dd71SAdrian Chadd #include <sys/bus.h> 537780dd71SAdrian Chadd #include <sys/rman.h> 547780dd71SAdrian Chadd #include <sys/socket.h> 557780dd71SAdrian Chadd #include <sys/sockio.h> 567780dd71SAdrian Chadd 577780dd71SAdrian Chadd #include <net/ethernet.h> 587780dd71SAdrian Chadd #include <net/if.h> 597780dd71SAdrian Chadd #include <net/if_var.h> 607780dd71SAdrian Chadd #include <net/if_arp.h> 617780dd71SAdrian Chadd #include <net/if_dl.h> 627780dd71SAdrian Chadd #include <net/if_llc.h> 637780dd71SAdrian Chadd #include <net/if_media.h> 647780dd71SAdrian Chadd #include <net/if_types.h> 657780dd71SAdrian Chadd 667780dd71SAdrian Chadd #include <dev/pci/pcivar.h> 677780dd71SAdrian Chadd #include <dev/pci/pcireg.h> 687780dd71SAdrian Chadd #include <dev/siba/siba_ids.h> 697780dd71SAdrian Chadd #include <dev/siba/sibareg.h> 707780dd71SAdrian Chadd #include <dev/siba/sibavar.h> 717780dd71SAdrian Chadd 727780dd71SAdrian Chadd #include <net80211/ieee80211_var.h> 737780dd71SAdrian Chadd #include <net80211/ieee80211_radiotap.h> 747780dd71SAdrian Chadd #include <net80211/ieee80211_regdomain.h> 757780dd71SAdrian Chadd #include <net80211/ieee80211_phy.h> 767780dd71SAdrian Chadd #include <net80211/ieee80211_ratectl.h> 777780dd71SAdrian Chadd 787780dd71SAdrian Chadd #include <dev/bwn/if_bwnreg.h> 797780dd71SAdrian Chadd #include <dev/bwn/if_bwnvar.h> 807780dd71SAdrian Chadd 817780dd71SAdrian Chadd #include <dev/bwn/if_bwn_chipid.h> 827780dd71SAdrian Chadd #include <dev/bwn/if_bwn_debug.h> 837780dd71SAdrian Chadd #include <dev/bwn/if_bwn_misc.h> 847780dd71SAdrian Chadd #include <dev/bwn/if_bwn_util.h> 857780dd71SAdrian Chadd 867780dd71SAdrian Chadd unsigned int 877780dd71SAdrian Chadd bwn_sqrt(struct bwn_mac *mac, unsigned int x) 887780dd71SAdrian Chadd { 897780dd71SAdrian Chadd /* Table holding (10 * sqrt(x)) for x between 1 and 256. */ 907780dd71SAdrian Chadd static uint8_t sqrt_table[256] = { 917780dd71SAdrian Chadd 10, 14, 17, 20, 22, 24, 26, 28, 927780dd71SAdrian Chadd 30, 31, 33, 34, 36, 37, 38, 40, 937780dd71SAdrian Chadd 41, 42, 43, 44, 45, 46, 47, 48, 947780dd71SAdrian Chadd 50, 50, 51, 52, 53, 54, 55, 56, 957780dd71SAdrian Chadd 57, 58, 59, 60, 60, 61, 62, 63, 967780dd71SAdrian Chadd 64, 64, 65, 66, 67, 67, 68, 69, 977780dd71SAdrian Chadd 70, 70, 71, 72, 72, 73, 74, 74, 987780dd71SAdrian Chadd 75, 76, 76, 77, 78, 78, 79, 80, 997780dd71SAdrian Chadd 80, 81, 81, 82, 83, 83, 84, 84, 1007780dd71SAdrian Chadd 85, 86, 86, 87, 87, 88, 88, 89, 1017780dd71SAdrian Chadd 90, 90, 91, 91, 92, 92, 93, 93, 1027780dd71SAdrian Chadd 94, 94, 95, 95, 96, 96, 97, 97, 1037780dd71SAdrian Chadd 98, 98, 99, 100, 100, 100, 101, 101, 1047780dd71SAdrian Chadd 102, 102, 103, 103, 104, 104, 105, 105, 1057780dd71SAdrian Chadd 106, 106, 107, 107, 108, 108, 109, 109, 1067780dd71SAdrian Chadd 110, 110, 110, 111, 111, 112, 112, 113, 1077780dd71SAdrian Chadd 113, 114, 114, 114, 115, 115, 116, 116, 1087780dd71SAdrian Chadd 117, 117, 117, 118, 118, 119, 119, 120, 1097780dd71SAdrian Chadd 120, 120, 121, 121, 122, 122, 122, 123, 1107780dd71SAdrian Chadd 123, 124, 124, 124, 125, 125, 126, 126, 1117780dd71SAdrian Chadd 126, 127, 127, 128, 128, 128, 129, 129, 1127780dd71SAdrian Chadd 130, 130, 130, 131, 131, 131, 132, 132, 1137780dd71SAdrian Chadd 133, 133, 133, 134, 134, 134, 135, 135, 1147780dd71SAdrian Chadd 136, 136, 136, 137, 137, 137, 138, 138, 1157780dd71SAdrian Chadd 138, 139, 139, 140, 140, 140, 141, 141, 1167780dd71SAdrian Chadd 141, 142, 142, 142, 143, 143, 143, 144, 1177780dd71SAdrian Chadd 144, 144, 145, 145, 145, 146, 146, 146, 1187780dd71SAdrian Chadd 147, 147, 147, 148, 148, 148, 149, 149, 1197780dd71SAdrian Chadd 150, 150, 150, 150, 151, 151, 151, 152, 1207780dd71SAdrian Chadd 152, 152, 153, 153, 153, 154, 154, 154, 1217780dd71SAdrian Chadd 155, 155, 155, 156, 156, 156, 157, 157, 1227780dd71SAdrian Chadd 157, 158, 158, 158, 159, 159, 159, 160 1237780dd71SAdrian Chadd }; 1247780dd71SAdrian Chadd 1257780dd71SAdrian Chadd if (x == 0) 1267780dd71SAdrian Chadd return (0); 1277780dd71SAdrian Chadd if (x >= 256) { 1287780dd71SAdrian Chadd unsigned int tmp; 1297780dd71SAdrian Chadd 1307780dd71SAdrian Chadd for (tmp = 0; x >= (2 * tmp) + 1; x -= (2 * tmp++) + 1) 1317780dd71SAdrian Chadd /* do nothing */ ; 1327780dd71SAdrian Chadd return (tmp); 1337780dd71SAdrian Chadd } 1347780dd71SAdrian Chadd return (sqrt_table[x - 1] / 10); 1357780dd71SAdrian Chadd } 136