1299751Sadrian/*-
2299751Sadrian * Copyright (c) 2009-2010 Weongyo Jeong <weongyo@freebsd.org>
3299751Sadrian * All rights reserved.
4299751Sadrian *
5299751Sadrian * Redistribution and use in source and binary forms, with or without
6299751Sadrian * modification, are permitted provided that the following conditions
7299751Sadrian * are met:
8299751Sadrian * 1. Redistributions of source code must retain the above copyright
9299751Sadrian *    notice, this list of conditions and the following disclaimer,
10299751Sadrian *    without modification.
11299751Sadrian * 2. Redistributions in binary form must reproduce at minimum a disclaimer
12299751Sadrian *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
13299751Sadrian *    redistribution must be conditioned upon including a substantially
14299751Sadrian *    similar Disclaimer requirement for further binary redistribution.
15299751Sadrian *
16299751Sadrian * NO WARRANTY
17299751Sadrian * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18299751Sadrian * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19299751Sadrian * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
20299751Sadrian * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21299751Sadrian * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
22299751Sadrian * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23299751Sadrian * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24299751Sadrian * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25299751Sadrian * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26299751Sadrian * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
27299751Sadrian * THE POSSIBILITY OF SUCH DAMAGES.
28299751Sadrian */
29299751Sadrian
30299751Sadrian#include <sys/cdefs.h>
31299751Sadrian__FBSDID("$FreeBSD$");
32299751Sadrian
33299751Sadrian/*
34299751Sadrian * The Broadcom Wireless LAN controller driver.
35299751Sadrian */
36299751Sadrian
37299984Sadrian#include "opt_bwn.h"
38299984Sadrian#include "opt_wlan.h"
39299984Sadrian
40299751Sadrian#include <sys/param.h>
41299751Sadrian#include <sys/systm.h>
42299751Sadrian#include <sys/kernel.h>
43299751Sadrian#include <sys/malloc.h>
44299751Sadrian#include <sys/module.h>
45299751Sadrian#include <sys/endian.h>
46299751Sadrian#include <sys/errno.h>
47299751Sadrian#include <sys/firmware.h>
48299751Sadrian#include <sys/lock.h>
49299751Sadrian#include <sys/mutex.h>
50299751Sadrian#include <machine/bus.h>
51299751Sadrian#include <machine/resource.h>
52299751Sadrian#include <sys/bus.h>
53299751Sadrian#include <sys/rman.h>
54299751Sadrian#include <sys/socket.h>
55299751Sadrian#include <sys/sockio.h>
56299751Sadrian
57299751Sadrian#include <net/ethernet.h>
58299751Sadrian#include <net/if.h>
59299751Sadrian#include <net/if_var.h>
60299751Sadrian#include <net/if_arp.h>
61299751Sadrian#include <net/if_dl.h>
62299751Sadrian#include <net/if_llc.h>
63299751Sadrian#include <net/if_media.h>
64299751Sadrian#include <net/if_types.h>
65299751Sadrian
66299751Sadrian#include <dev/pci/pcivar.h>
67299751Sadrian#include <dev/pci/pcireg.h>
68299751Sadrian#include <dev/siba/siba_ids.h>
69299751Sadrian#include <dev/siba/sibareg.h>
70299751Sadrian#include <dev/siba/sibavar.h>
71299751Sadrian
72299751Sadrian#include <net80211/ieee80211_var.h>
73299751Sadrian#include <net80211/ieee80211_radiotap.h>
74299751Sadrian#include <net80211/ieee80211_regdomain.h>
75299751Sadrian#include <net80211/ieee80211_phy.h>
76299751Sadrian#include <net80211/ieee80211_ratectl.h>
77299751Sadrian
78299751Sadrian#include <dev/bwn/if_bwnreg.h>
79299751Sadrian#include <dev/bwn/if_bwnvar.h>
80299751Sadrian
81299751Sadrian#include <dev/bwn/if_bwn_chipid.h>
82299751Sadrian#include <dev/bwn/if_bwn_debug.h>
83299751Sadrian#include <dev/bwn/if_bwn_misc.h>
84299751Sadrian#include <dev/bwn/if_bwn_util.h>
85299751Sadrian
86299751Sadrianunsigned int
87299751Sadrianbwn_sqrt(struct bwn_mac *mac, unsigned int x)
88299751Sadrian{
89299751Sadrian	/* Table holding (10 * sqrt(x)) for x between 1 and 256. */
90299751Sadrian	static uint8_t sqrt_table[256] = {
91299751Sadrian		10, 14, 17, 20, 22, 24, 26, 28,
92299751Sadrian		30, 31, 33, 34, 36, 37, 38, 40,
93299751Sadrian		41, 42, 43, 44, 45, 46, 47, 48,
94299751Sadrian		50, 50, 51, 52, 53, 54, 55, 56,
95299751Sadrian		57, 58, 59, 60, 60, 61, 62, 63,
96299751Sadrian		64, 64, 65, 66, 67, 67, 68, 69,
97299751Sadrian		70, 70, 71, 72, 72, 73, 74, 74,
98299751Sadrian		75, 76, 76, 77, 78, 78, 79, 80,
99299751Sadrian		80, 81, 81, 82, 83, 83, 84, 84,
100299751Sadrian		85, 86, 86, 87, 87, 88, 88, 89,
101299751Sadrian		90, 90, 91, 91, 92, 92, 93, 93,
102299751Sadrian		94, 94, 95, 95, 96, 96, 97, 97,
103299751Sadrian		98, 98, 99, 100, 100, 100, 101, 101,
104299751Sadrian		102, 102, 103, 103, 104, 104, 105, 105,
105299751Sadrian		106, 106, 107, 107, 108, 108, 109, 109,
106299751Sadrian		110, 110, 110, 111, 111, 112, 112, 113,
107299751Sadrian		113, 114, 114, 114, 115, 115, 116, 116,
108299751Sadrian		117, 117, 117, 118, 118, 119, 119, 120,
109299751Sadrian		120, 120, 121, 121, 122, 122, 122, 123,
110299751Sadrian		123, 124, 124, 124, 125, 125, 126, 126,
111299751Sadrian		126, 127, 127, 128, 128, 128, 129, 129,
112299751Sadrian		130, 130, 130, 131, 131, 131, 132, 132,
113299751Sadrian		133, 133, 133, 134, 134, 134, 135, 135,
114299751Sadrian		136, 136, 136, 137, 137, 137, 138, 138,
115299751Sadrian		138, 139, 139, 140, 140, 140, 141, 141,
116299751Sadrian		141, 142, 142, 142, 143, 143, 143, 144,
117299751Sadrian		144, 144, 145, 145, 145, 146, 146, 146,
118299751Sadrian		147, 147, 147, 148, 148, 148, 149, 149,
119299751Sadrian		150, 150, 150, 150, 151, 151, 151, 152,
120299751Sadrian		152, 152, 153, 153, 153, 154, 154, 154,
121299751Sadrian		155, 155, 155, 156, 156, 156, 157, 157,
122299751Sadrian		157, 158, 158, 158, 159, 159, 159, 160
123299751Sadrian	};
124299751Sadrian
125299751Sadrian	if (x == 0)
126299751Sadrian		return (0);
127299751Sadrian	if (x >= 256) {
128299751Sadrian		unsigned int tmp;
129299751Sadrian
130299751Sadrian		for (tmp = 0; x >= (2 * tmp) + 1; x -= (2 * tmp++) + 1)
131299751Sadrian			/* do nothing */ ;
132299751Sadrian		return (tmp);
133299751Sadrian	}
134299751Sadrian	return (sqrt_table[x - 1] / 10);
135299751Sadrian}
136