xref: /illumos-gate/usr/src/uts/common/io/iwk/iwk_calibration.h (revision cdc64593cc1046229f4ac4daf5ead688b5efe6eb)
1  /*
2   * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
3   * Use is subject to license terms.
4   */
5  
6  /*
7   * Copyright (c) 2008, Intel Corporation
8   * All rights reserved.
9   */
10  
11  /*
12   * Sun elects to have this file available under and governed by the BSD
13   * license (see below for full license text). However, the following
14   * notice accompanied the original version of this file:
15   */
16  
17  /*
18   * This file is provided under a dual BSD/GPLv2 license.  When using or
19   * redistributing this file, you may do so under either license.
20   *
21   * GPL LICENSE SUMMARY
22   *
23   * Copyright(c) 2005 - 2007 Intel Corporation. All rights reserved.
24   *
25   * This program is free software; you can redistribute it and/or modify
26   * it under the terms of version 2 of the GNU Geeral Public License as
27   * published by the Free Software Foundation.
28   *
29   * This program is distributed in the hope that it will be useful, but
30   * WITHOUT ANY WARRANTY; without even the implied warranty of
31   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
32   * General Public License for more details.
33   *
34   * You should have received a copy of the GNU General Public License
35   * along with this program; if not, write to the Free Software
36   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110,
37   * USA
38   *
39   * The full GNU General Public License is included in this distribution
40   * in the file called LICENSE.GPL.
41   *
42   * Contact Information:
43   * James P. Ketrenos <ipw2100-admin@linux.intel.com>
44   * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
45   *
46   * BSD LICENSE
47   *
48   * Copyright(c) 2005 - 2007 Intel Corporation. All rights reserved.
49   * All rights reserved.
50   *
51   * Redistribution and use in source and binary forms, with or without
52   * modification, are permitted provided that the following conditions
53   * are met:
54   *
55   *  * Redistributions of source code must retain the above copyright
56   *    notice, this list of conditions and the following disclaimer.
57   *  * Redistributions in binary form must reproduce the above copyright
58   *    notice, this list of conditions and the following disclaimer in
59   *    the documentation and/or other materials provided with the
60   *    distribution.
61   *  * Neither the name Intel Corporation nor the names of its
62   *    contributors may be used to endorse or promote products derived
63   *    from this software without specific prior written permission.
64   *
65   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
66   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
67   * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
68   * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
69   * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
70   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
71   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
72   * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
73   * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
74   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
75   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
76   */
77  
78  
79  #ifndef _IWK_CALIBRATION_H_
80  #define	_IWK_CALIBRATION_H_
81  
82  /*
83   * Most Tx and Rx calibration is done by uCode during the initialization
84   * phase of uCode boot. Driver must calibrate only:
85   *
86   * 1)  Tx power (depends on temperature)
87   * 2)  Receiver gain balance (and detect disconnected antennas)
88   * 3)  Receiver sensitivity (to optimize signal detection)
89   */
90  
91  /* START TEMPERATURE */
92  
93  /*
94   * 4965 temperature calculation.
95   *
96   * The driver must calculate the device temperature before calculating
97   * a txpower setting (amplifier gain is temperature dependent).  The
98   * calculation uses 4 measurements, 3 of which (R1, R2, R3) are calibration
99   * values used for the life of the driver, and one of which (R4) is the
100   * real-time temperature indicator.
101   *
102   * uCode provides all 4 values to the driver via the "initialize alive"
103   * notification (see struct iwk_init_alive_resp).  After the runtime uCode
104   * image loads, uCode updates the R4 value via statistics notifications
105   * (see STATISTICS_NOTIFICATION), which occur after each received beacon
106   * when associated, or can be requested via REPLY_STATISTICS_CMD.
107   *
108   * NOTE:  uCode provides the R4 value as a 23-bit signed value.  Driver
109   *        must sign-extend to 32 bits before applying formula below.
110   *
111   * Formula:
112   *
113   * degrees Kelvin = ((97 * 259 * (R4 - R2) / (R3 - R1)) / 100) + 8
114   *
115   * NOTE:  The basic formula is 259 * (R4-R2) / (R3-R1).  The 97/100 is
116   * an additional correction, which should be centered around 0 degrees
117   * Celsius (273 degrees Kelvin).  The 8 (3 percent of 273) compensates for
118   * centering the 97/100 correction around 0 degrees K.
119   *
120   * Add 273 to Kelvin value to find degrees Celsius, for comparing current
121   * temperature with factory-measured temperatures when calculating txpower
122   * settings.
123   */
124  
125  /* END TEMPERATURE */
126  
127  /* START TXPOWER */
128  
129  /*
130   * 4965 txpower calculations rely on information from three sources:
131   *
132   *     1) EEPROM
133   *     2) "initialize" alive notification
134   *     3) statistics notifications
135   *
136   * EEPROM data consists of:
137   *
138   * 1)  Regulatory information (max txpower and channel usage flags) is provided
139   *     separately for each channel that can possibly supported by 4965.
140   *     40 MHz wide (.11n fat) channels are listed separately from 20 MHz
141   *     (legacy) channels.
142   *
143   *     See struct iwk_eep_channel for format, and struct iwk_eep for
144   *     locations in EEPROM.
145   *
146   * 2)  Factory txpower calibration information is provided separately for
147   *     sub-bands of contiguous channels.  2.4GHz has just one sub-band,
148   *     but 5 GHz has several sub-bands.
149   *
150   *     In addition, per-band (2.4 and 5 Ghz) saturation txpowers are provided.
151   *
152   *     See struct iwk_eep_calib_info (and the tree of structures contained
153   *     within it) for format, and struct iwk_eep for locations in EEPROM.
154   *
155   * "Initialization alive" notification (see struct iwk_init_alive_resp)
156   * consists of:
157   *
158   * 1)  Temperature calculation parameters.
159   *
160   * 2)  Power supply voltage measurement.
161   *
162   * 3)  Tx gain compensation to balance 2 transmitters for MIMO use.
163   *
164   * Statistics notifications deliver:
165   *
166   * 1)  Current values for temperature param R4.
167   */
168  
169  /*
170   * To calculate a txpower setting for a given desired target txpower, channel,
171   * modulation bit rate, and transmitter chain (4965 has 2 transmitters to
172   * support MIMO and transmit diversity), driver must do the following:
173   *
174   * 1)  Compare desired txpower vs. (EEPROM) regulatory limit for this channel.
175   *     Do not exceed regulatory limit; reduce target txpower if necessary.
176   *
177   *     If setting up txpowers for MIMO rates (rate indexes 8-15, 24-31),
178   *     2 transmitters will be used simultaneously; driver must reduce the
179   *     regulatory limit by 3 dB (half-power) for each transmitter, so the
180   *     combined total output of the 2 transmitters is within regulatory limits.
181   *
182   *
183   * 2)  Compare target txpower vs. (EEPROM) saturation txpower *reduced by
184   *     backoff for this bit rate*.  Do not exceed (saturation - backoff[rate]);
185   *     reduce target txpower if necessary.
186   *
187   *     Backoff values below are in 1/2 dB units (equivalent to steps in
188   *     txpower gain tables):
189   *
190   *     OFDM 6 - 36 MBit:  10 steps (5 dB)
191   *     OFDM 48 MBit:      15 steps (7.5 dB)
192   *     OFDM 54 MBit:      17 steps (8.5 dB)
193   *     OFDM 60 MBit:      20 steps (10 dB)
194   *     CCK all rates:     10 steps (5 dB)
195   *
196   *     Backoff values apply to saturation txpower on a per-transmitter basis;
197   *     when using MIMO (2 transmitters), each transmitter uses the same
198   *     saturation level provided in EEPROM, and the same backoff values;
199   *     no reduction (such as with regulatory txpower limits) is required.
200   *
201   *     Saturation and Backoff values apply equally to 20 Mhz (legacy) channel
202   *     widths and 40 Mhz (.11n fat) channel widths; there is no separate
203   *     factory measurement for fat channels.
204   *
205   *     The result of this step is the final target txpower.  The rest of
206   *     the steps figure out the proper settings for the device.
207   *
208   *
209   * 3)  Determine (EEPROM) calibration subband for the target channel, by
210   *     comparing against first and last channels in each subband
211   *     (see struct iwk_eep_calib_subband_info).
212   *
213   *
214   * 4)  Linearly interpolate (EEPROM) factory calibration measurement sets,
215   *     referencing the 2 factory-measured (sample) channels within the subband.
216   *
217   *     Interpolation is based on difference between target channel's frequency
218   *     and the sample channels' frequencies.  Since channel numbers are based
219   *     on frequency (5 MHz between each channel number), this is equivalent
220   *     to interpolating based on channel number differences.
221   *
222   *     Note that the sample channels may or may not be the channels at the
223   *     edges of the subband.  The target channel may be "outside" of the
224   *     span of the sampled channels.
225   *
226   *     Driver may choose the pair (for 2 Tx chains) of measurements (see
227   *     struct iwk_eep_calib_channel_info) for which the actual measured
228   *     txpower comes closest to the desired txpower.  Usually, though,
229   *     the middle set of measurements is closest to the regulatory limits,
230   *     and is therefore a good choice for all txpower calculations.
231   *
232   *     Driver should interpolate both members of the chosen measurement pair,
233   *     i.e. for both Tx chains (radio transmitters), unless the driver knows
234   *     that only one of the chains will be used (e.g. only one tx antenna
235   *     connected, but this should be unusual).
236   *
237   *     Driver should interpolate factory values for temperature, gain table
238   *     index, and actual power.  The power amplifier detector values are
239   *     not used by the driver.
240   *
241   *     If the target channel happens to be one of the sample channels, the
242   *     results should agree with the sample channel's measurements!
243   *
244   *
245   * 5)  Find difference between desired txpower and (interpolated)
246   *     factory-measured txpower.  Using (interpolated) factory gain table index
247   *     as a starting point, adjust this index lower to increase txpower,
248   *     or higher to decrease txpower, until the target txpower is reached.
249   *     Each step in the gain table is 1/2 dB.
250   *
251   *     For example, if factory measured txpower is 16 dBm, and target txpower
252   *     is 13 dBm, add 6 steps to the factory gain index to reduce txpower
253   *     by 3 dB.
254   *
255   *
256   * 6)  Find difference between current device temperature and (interpolated)
257   *     factory-measured temperature for sub-band.  Factory values are in
258   *     degrees Celsius.  To calculate current temperature, see comments for
259   *     "4965 temperature calculation".
260   *
261   *     If current temperature is higher than factory temperature, driver must
262   *     increase gain (lower gain table index), and vice versa.
263   *
264   *     Temperature affects gain differently for different channels:
265   *
266   *     2.4 GHz all channels:  3.5 degrees per half-dB step
267   *     5 GHz channels 34-43:  4.5 degrees per half-dB step
268   *     5 GHz channels >= 44:  4.0 degrees per half-dB step
269   *
270   *     NOTE:  Temperature can increase rapidly when transmitting, especially
271   *            with heavy traffic at high txpowers.  Driver should update
272   *            temperature calculations often under these conditions to
273   *            maintain strong txpower in the face of rising temperature.
274   *
275   *
276   * 7)  Find difference between current power supply voltage indicator
277   *     (from "initialize alive") and factory-measured power supply voltage
278   *     indicator (EEPROM).
279   *
280   *     If the current voltage is higher (indicator is lower) than factory
281   *     voltage, gain should be reduced (gain table index increased) by:
282   *
283   *     (eeprom - current) / 7
284   *
285   *     If the current voltage is lower (indicator is higher) than factory
286   *     voltage, gain should be increased (gain table index decreased) by:
287   *
288   *     2 * (current - eeprom) / 7
289   *
290   *     If number of index steps in either direction turns out to be > 2,
291   *     something is wrong ... just use 0.
292   *
293   *     NOTE:  Voltage compensation is independent of band/channel.
294   *
295   *     NOTE:  "Initialize" uCode measures current voltage, which is assumed
296   *            to be constant after this initial measurement.  Voltage
297   *            compensation for txpower (number of steps in gain table)
298   *            may be calculated once and used until the next uCode bootload.
299   *
300   *
301   * 8)  If setting up txpowers for MIMO rates (rate indexes 8-15, 24-31),
302   *     adjust txpower for each transmitter chain, so txpower is balanced
303   *     between the two chains.  There are 5 pairs of tx_atten[group][chain]
304   *     values in "initialize alive", one pair for each of 5 channel ranges:
305   *
306   *     Group 0:  5 GHz channel 34-43
307   *     Group 1:  5 GHz channel 44-70
308   *     Group 2:  5 GHz channel 71-124
309   *     Group 3:  5 GHz channel 125-200
310   *     Group 4:  2.4 GHz all channels
311   *
312   *     Add the tx_atten[group][chain] value to the index for the target chain.
313   *     The values are signed, but are in pairs of 0 and a non-negative number,
314   *     so as to reduce gain (if necessary) of the "hotter" channel.  This
315   *     avoids any need to double-check for regulatory compliance after
316   *     this step.
317   *
318   *
319   * 9)  If setting up for a CCK rate, lower the gain by adding a CCK compensation
320   *     value to the index:
321   *
322   *     Hardware rev B:  9 steps (4.5 dB)
323   *     Hardware rev C:  5 steps (2.5 dB)
324   *
325   *     Hardware rev for 4965 can be determined by reading CSR_HW_REV_WA_REG,
326   *     bits [3:2], 1 = B, 2 = C.
327   *
328   *     NOTE:  This compensation is in addition to any saturation backoff that
329   *            might have been applied in an earlier step.
330   *
331   *
332   * 10) Select the gain table, based on band (2.4 vs 5 GHz).
333   *
334   *     Limit the adjusted index to stay within the table!
335   *
336   *
337   * 11) Read gain table entries for DSP and radio gain, place into appropriate
338   *     location(s) in command.
339   */
340  
341  /* Temperature calibration offset is 3% 0C in Kelvin */
342  #define	TEMPERATURE_CALIB_KELVIN_OFFSET 8
343  #define	TEMPERATURE_CALIB_A_VAL 259
344  
345  #define	KELVIN_TO_CELSIUS(x) ((x)-273)
346  #define	CELSIUS_TO_KELVIN(x) ((x)+273)
347  
348  /* First and last channels of all groups */
349  #define	CALIB_IWK_TX_ATTEN_GR1_FCH 34
350  #define	CALIB_IWK_TX_ATTEN_GR1_LCH 43
351  #define	CALIB_IWK_TX_ATTEN_GR2_FCH 44
352  #define	CALIB_IWK_TX_ATTEN_GR2_LCH 70
353  #define	CALIB_IWK_TX_ATTEN_GR3_FCH 71
354  #define	CALIB_IWK_TX_ATTEN_GR3_LCH 124
355  #define	CALIB_IWK_TX_ATTEN_GR4_FCH 125
356  #define	CALIB_IWK_TX_ATTEN_GR4_LCH 200
357  #define	CALIB_IWK_TX_ATTEN_GR5_FCH 1
358  #define	CALIB_IWK_TX_ATTEN_GR5_LCH 20
359  
360  /* Limit range of txpower output target to be between these values */
361  #define	IWK_TX_POWER_TARGET_POWER_MIN  (0)   /* 0 dBm = 1 milliwatt */
362  #define	IWK_TX_POWER_TARGET_POWER_MAX  (16)  /* 16 dBm */
363  
364  #define	TX_POWER_IWK_ILLEGAL_VOLTAGE  (-10000)
365  
366  /*
367   * 4965 power supply voltage compensation
368   */
369  #define	TX_POWER_IWK_VOLTAGE_CODES_PER_03V  (7)
370  
371  /* Limit range of calculated temperature to be between these Kelvin values */
372  #define	IWK_TX_POWER_TEMPERATURE_MIN  (263)
373  #define	IWK_TX_POWER_TEMPERATURE_MAX  (410)
374  
375  union iwk_tx_power_dual_stream {
376  	struct {
377  		uint8_t radio_tx_gain[2];
378  		uint8_t dsp_predis_atten[2];
379  	} s;
380  	uint32_t dw;
381  };
382  
383  #define	POWER_TABLE_NUM_ENTRIES	(33)
384  #define	POWER_TABLE_CCK_ENTRY	(32)
385  
386  /*
387   * When MIMO is used (2 transmitters operating simultaneously), driver should
388   * limit each transmitter to deliver a max of 3 dB below the regulatory limit
389   * for the device.  That is, half power for each transmitter, so total power
390   * is within regulatory limits.
391   *
392   * The value "6" represents number of steps in gain table to reduce power.
393   * Each step is 1/2 dB.
394   */
395  #define	IWK_TX_POWER_MIMO_REGULATORY_COMPENSATION	(6)
396  
397  /*
398   * CCK gain compensation.
399   *
400   * When calculating txpowers for CCK, after making sure that the target power
401   * is within regulatory and saturation limits, driver must additionally
402   * back off gain by adding these values to the gain table index.
403   */
404  #define	IWK_TX_POWER_CCK_COMPENSATION_C_STEP	(5)
405  
406  /*
407   * Gain tables.
408   *
409   * The following tables contain pair of values for setting txpower, i.e.
410   * gain settings for the output of the device's digital signal processor (DSP),
411   * and for the analog gain structure of the transmitter.
412   *
413   * Each entry in the gain tables represents a step of 1/2 dB.  Note that these
414   * are *relative* steps, not indications of absolute output power.  Output
415   * power varies with temperature, voltage, and channel frequency, and also
416   * requires consideration of average power (to satisfy regulatory constraints),
417   * and peak power (to avoid distortion of the output signal).
418   *
419   * Each entry contains two values:
420   * 1)  DSP gain (or sometimes called DSP attenuation).  This is a fine-grained
421   *     linear value that multiplies the output of the digital signal processor,
422   *     before being sent to the analog radio.
423   * 2)  Radio gain.  This sets the analog gain of the radio Tx path.
424   *     It is a coarser setting, and behaves in a logarithmic (dB) fashion.
425   *
426   * EEPROM contains factory calibration data for txpower.  This maps actual
427   * measured txpower levels to gain settings in the "well known" tables
428   * below ("well-known" means here that both factory calibration *and* the
429   * driver work with the same table).
430   *
431   * There are separate tables for 2.4 GHz and 5 GHz bands.  The 5 GHz table
432   * has an extension (into negative indexes), in case the driver needs to
433   * boost power setting for high device temperatures (higher than would be
434   * present during factory calibration).  A 5 Ghz EEPROM index of "40"
435   * corresponds to the 49th entry in the table used by the driver.
436   */
437  #define	MIN_TX_GAIN_INDEX	(0) /* highest gain, lowest idx, 2.4 */
438  #define	MIN_TX_GAIN_INDEX_52GHZ_EXT	(-9) /* highest gain, lowest idx, 5 */
439  
440  struct gain_entry {
441  	uint8_t	dsp;
442  	uint8_t	radio;
443  };
444  
445  static const struct gain_entry gains_table[2][108] = {
446  	/* 5.2GHz power gain index table */
447  	{
448  		{123, 0x3F},	/* highest txpower */
449  		{117, 0x3F},
450  		{110, 0x3F},
451  		{104, 0x3F},
452  		{98, 0x3F},
453  		{110, 0x3E},
454  		{104, 0x3E},
455  		{98, 0x3E},
456  		{110, 0x3D},
457  		{104, 0x3D},
458  		{98, 0x3D},
459  		{110, 0x3C},
460  		{104, 0x3C},
461  		{98, 0x3C},
462  		{110, 0x3B},
463  		{104, 0x3B},
464  		{98, 0x3B},
465  		{110, 0x3A},
466  		{104, 0x3A},
467  		{98, 0x3A},
468  		{110, 0x39},
469  		{104, 0x39},
470  		{98, 0x39},
471  		{110, 0x38},
472  		{104, 0x38},
473  		{98, 0x38},
474  		{110, 0x37},
475  		{104, 0x37},
476  		{98, 0x37},
477  		{110, 0x36},
478  		{104, 0x36},
479  		{98, 0x36},
480  		{110, 0x35},
481  		{104, 0x35},
482  		{98, 0x35},
483  		{110, 0x34},
484  		{104, 0x34},
485  		{98, 0x34},
486  		{110, 0x33},
487  		{104, 0x33},
488  		{98, 0x33},
489  		{110, 0x32},
490  		{104, 0x32},
491  		{98, 0x32},
492  		{110, 0x31},
493  		{104, 0x31},
494  		{98, 0x31},
495  		{110, 0x30},
496  		{104, 0x30},
497  		{98, 0x30},
498  		{110, 0x25},
499  		{104, 0x25},
500  		{98, 0x25},
501  		{110, 0x24},
502  		{104, 0x24},
503  		{98, 0x24},
504  		{110, 0x23},
505  		{104, 0x23},
506  		{98, 0x23},
507  		{110, 0x22},
508  		{104, 0x18},
509  		{98, 0x18},
510  		{110, 0x17},
511  		{104, 0x17},
512  		{98, 0x17},
513  		{110, 0x16},
514  		{104, 0x16},
515  		{98, 0x16},
516  		{110, 0x15},
517  		{104, 0x15},
518  		{98, 0x15},
519  		{110, 0x14},
520  		{104, 0x14},
521  		{98, 0x14},
522  		{110, 0x13},
523  		{104, 0x13},
524  		{98, 0x13},
525  		{110, 0x12},
526  		{104, 0x08},
527  		{98, 0x08},
528  		{110, 0x07},
529  		{104, 0x07},
530  		{98, 0x07},
531  		{110, 0x06},
532  		{104, 0x06},
533  		{98, 0x06},
534  		{110, 0x05},
535  		{104, 0x05},
536  		{98, 0x05},
537  		{110, 0x04},
538  		{104, 0x04},
539  		{98, 0x04},
540  		{110, 0x03},
541  		{104, 0x03},
542  		{98, 0x03},
543  		{110, 0x02},
544  		{104, 0x02},
545  		{98, 0x02},
546  		{110, 0x01},
547  		{104, 0x01},
548  		{98, 0x01},
549  		{110, 0x00},
550  		{104, 0x00},
551  		{98, 0x00},
552  		{93, 0x00},
553  		{88, 0x00},
554  		{83, 0x00},
555  		{78, 0x00},
556  	},
557  	/* 2.4GHz power gain index table */
558  	{
559  		{110, 0x3f},	/* highest txpower */
560  		{104, 0x3f},
561  		{98, 0x3f},
562  		{110, 0x3e},
563  		{104, 0x3e},
564  		{98, 0x3e},
565  		{110, 0x3d},
566  		{104, 0x3d},
567  		{98, 0x3d},
568  		{110, 0x3c},
569  		{104, 0x3c},
570  		{98, 0x3c},
571  		{110, 0x3b},
572  		{104, 0x3b},
573  		{98, 0x3b},
574  		{110, 0x3a},
575  		{104, 0x3a},
576  		{98, 0x3a},
577  		{110, 0x39},
578  		{104, 0x39},
579  		{98, 0x39},
580  		{110, 0x38},
581  		{104, 0x38},
582  		{98, 0x38},
583  		{110, 0x37},
584  		{104, 0x37},
585  		{98, 0x37},
586  		{110, 0x36},
587  		{104, 0x36},
588  		{98, 0x36},
589  		{110, 0x35},
590  		{104, 0x35},
591  		{98, 0x35},
592  		{110, 0x34},
593  		{104, 0x34},
594  		{98, 0x34},
595  		{110, 0x33},
596  		{104, 0x33},
597  		{98, 0x33},
598  		{110, 0x32},
599  		{104, 0x32},
600  		{98, 0x32},
601  		{110, 0x31},
602  		{104, 0x31},
603  		{98, 0x31},
604  		{110, 0x30},
605  		{104, 0x30},
606  		{98, 0x30},
607  		{110, 0x6},
608  		{104, 0x6},
609  		{98, 0x6},
610  		{110, 0x5},
611  		{104, 0x5},
612  		{98, 0x5},
613  		{110, 0x4},
614  		{104, 0x4},
615  		{98, 0x4},
616  		{110, 0x3},
617  		{104, 0x3},
618  		{98, 0x3},
619  		{110, 0x2},
620  		{104, 0x2},
621  		{98, 0x2},
622  		{110, 0x1},
623  		{104, 0x1},
624  		{98, 0x1},
625  		{110, 0x0},
626  		{104, 0x0},
627  		{98, 0x0},
628  		{97, 0},
629  		{96, 0},
630  		{95, 0},
631  		{94, 0},
632  		{93, 0},
633  		{92, 0},
634  		{91, 0},
635  		{90, 0},
636  		{89, 0},
637  		{88, 0},
638  		{87, 0},
639  		{86, 0},
640  		{85, 0},
641  		{84, 0},
642  		{83, 0},
643  		{82, 0},
644  		{81, 0},
645  		{80, 0},
646  		{79, 0},
647  		{78, 0},
648  		{77, 0},
649  		{76, 0},
650  		{75, 0},
651  		{74, 0},
652  		{73, 0},
653  		{72, 0},
654  		{71, 0},
655  		{70, 0},
656  		{69, 0},
657  		{68, 0},
658  		{67, 0},
659  		{66, 0},
660  		{65, 0},
661  		{64, 0},
662  		{63, 0},
663  		{62, 0},
664  		{61, 0},
665  		{60, 0},
666  		{59, 0},
667  	}
668  };
669  
670  /* END TXPOWER */
671  
672  struct statistics_div {
673  	uint32_t tx_on_a;
674  	uint32_t tx_on_b;
675  	uint32_t exec_time;
676  	uint32_t probe_time;
677  	uint32_t reserved1;
678  	uint32_t reserved2;
679  };
680  
681  struct statistics_dbg {
682  	uint32_t burst_check;
683  	uint32_t burst_count;
684  	uint32_t reserved[4];
685  };
686  
687  
688  struct statistics_general {
689  	uint32_t temperature;
690  	uint32_t temperature_m;
691  	struct statistics_dbg dbg;
692  	uint32_t sleep_time;
693  	uint32_t slots_out;
694  	uint32_t slots_idle;
695  	uint32_t ttl_timestamp;
696  	struct statistics_div div;
697  	uint32_t rx_enable_counter;
698  	uint32_t reserved1;
699  	uint32_t reserved2;
700  	uint32_t reserved3;
701  };
702  
703  
704  struct statistics_tx_non_phy_agg {
705  	uint32_t ba_timeout;
706  	uint32_t ba_reschedule_frames;
707  	uint32_t scd_query_agg_frame_cnt;
708  	uint32_t scd_query_no_agg;
709  	uint32_t scd_query_agg;
710  	uint32_t scd_query_mismatch;
711  	uint32_t frame_not_ready;
712  	uint32_t underrun;
713  	uint32_t bt_prio_kill;
714  	uint32_t rx_ba_rsp_cnt;
715  	uint32_t reserved2;
716  	uint32_t reserved3;
717  };
718  
719  
720  struct statistics_tx {
721  	uint32_t preamble_cnt;
722  	uint32_t rx_detected_cnt;
723  	uint32_t bt_prio_defer_cnt;
724  	uint32_t bt_prio_kill_cnt;
725  	uint32_t few_bytes_cnt;
726  	uint32_t cts_timeout;
727  	uint32_t ack_timeout;
728  	uint32_t expected_ack_cnt;
729  	uint32_t actual_ack_cnt;
730  	uint32_t dump_msdu_cnt;
731  	uint32_t burst_abort_next_frame_mismatch_cnt;
732  	uint32_t burst_abort_missing_next_frame_cnt;
733  	uint32_t cts_timeout_collision;
734  	uint32_t ack_or_ba_timeout_collision;
735  	struct statistics_tx_non_phy_agg agg;
736  };
737  
738  
739  struct statistics_rx_ht_phy {
740  	uint32_t plcp_err;
741  	uint32_t overrun_err;
742  	uint32_t early_overrun_err;
743  	uint32_t crc32_good;
744  	uint32_t crc32_err;
745  	uint32_t mh_format_err;
746  	uint32_t agg_crc32_good;
747  	uint32_t agg_mpdu_cnt;
748  	uint32_t agg_cnt;
749  	uint32_t reserved2;
750  };
751  
752  struct statistics_rx_non_phy {
753  	uint32_t bogus_cts; /* CTS received when not expecting CTS */
754  	uint32_t bogus_ack; /* ACK received when not expecting ACK */
755  	uint32_t non_bssid_frames; /* number of frames with BSSID that */
756  					/* doesn't belong to the STA BSSID */
757  	uint32_t filtered_frames; /* count frames that were dumped in the */
758  					/* filtering process */
759  	uint32_t non_channel_beacons; /* beacons with our bss id but not on */
760  					/* our serving channel */
761  	uint32_t channel_beacons; /* beacons with our bss id and in our */
762  					/* serving channel */
763  	uint32_t num_missed_bcon; /* number of missed beacons */
764  	uint32_t adc_rx_saturation_time; /* count in 0.8us units the time */
765  					/* the ADC was in saturation */
766  	uint32_t ina_detection_search_time; /* total time (in 0.8us) */
767  						/* searched for INA */
768  	uint32_t beacon_silence_rssi_a; /* RSSI silence after beacon frame */
769  	uint32_t beacon_silence_rssi_b; /* RSSI silence after beacon frame */
770  	uint32_t beacon_silence_rssi_c; /* RSSI silence after beacon frame */
771  	uint32_t interference_data_flag; /* flag for interference data */
772  					/* availability. 1 when data is */
773  					/* available. */
774  	uint32_t channel_load; /* counts RX Enable time */
775  	uint32_t dsp_false_alarms; /* DSP false alarm (both OFDM */
776  					/* and CCK) counter */
777  	uint32_t beacon_rssi_a;
778  	uint32_t beacon_rssi_b;
779  	uint32_t beacon_rssi_c;
780  	uint32_t beacon_energy_a;
781  	uint32_t beacon_energy_b;
782  	uint32_t beacon_energy_c;
783  };
784  
785  struct statistics_rx_phy {
786  	uint32_t ina_cnt;
787  	uint32_t fina_cnt;
788  	uint32_t plcp_err;
789  	uint32_t crc32_err;
790  	uint32_t overrun_err;
791  	uint32_t early_overrun_err;
792  	uint32_t crc32_good;
793  	uint32_t false_alarm_cnt;
794  	uint32_t fina_sync_err_cnt;
795  	uint32_t sfd_timeout;
796  	uint32_t fina_timeout;
797  	uint32_t unresponded_rts;
798  	uint32_t rxe_frame_limit_overrun;
799  	uint32_t sent_ack_cnt;
800  	uint32_t sent_cts_cnt;
801  	uint32_t sent_ba_rsp_cnt;
802  	uint32_t dsp_self_kill;
803  	uint32_t mh_format_err;
804  	uint32_t re_acq_main_rssi_sum;
805  	uint32_t reserved3;
806  };
807  
808  struct statistics_rx {
809  	struct statistics_rx_phy ofdm;
810  	struct statistics_rx_phy cck;
811  	struct statistics_rx_non_phy general;
812  	struct statistics_rx_ht_phy ofdm_ht;
813  };
814  
815  struct iwk_notif_statistics {
816  	uint32_t flag;
817  	struct statistics_rx rx;
818  	struct statistics_tx tx;
819  	struct statistics_general general;
820  };
821  
822  /* START Receiver gain balance */
823  
824  /*
825   * REPLY_PHY_CALIBRATION_CMD = 0xb0 (command, has simple generic response)
826   *
827   * This command sets the relative gains of 4965's 3 radio receiver chains.
828   *
829   * After the first association, driver should accumulate signal and noise
830   * statistics from the STATISTICS_NOTIFICATIONs that follow the first 20
831   * beacons from the associated network (don't collect statistics that come
832   * in from scanning, or any other non-network source).
833   *
834   * DISCONNECTED ANTENNA:
835   *
836   * Driver should determine which antennas are actually connected, by comparing
837   * average beacon signal levels for the 3 Rx chains.  Accumulate (add) the
838   * following values over 20 beacons, one accumulator for each of the chains
839   * a/b/c, from struct statistics_rx_non_phy:
840   *
841   * beacon_rssi_[abc] & 0x0FF (unsigned, units in dB)
842   *
843   * Find the strongest signal from among a/b/c.  Compare the other two to the
844   * strongest.  If any signal is more than 15 dB (times 20, unless you
845   * divide the accumulated values by 20) below the strongest, the driver
846   * considers that antenna to be disconnected, and should not try to use that
847   * antenna/chain for Rx or Tx.  If both A and B seem to be disconnected,
848   * driver should declare the stronger one as connected, and attempt to use it
849   * (A and B are the only 2 Tx chains!).
850   *
851   *
852   * RX BALANCE:
853   *
854   * Driver should balance the 3 receivers (but just the ones that are connected
855   * to antennas, see above) for gain, by comparing the average signal levels
856   * detected during the silence after each beacon (background noise).
857   * Accumulate (add) the following values over 20 beacons, one accumulator for
858   * each of the chains a/b/c, from struct statistics_rx_non_phy:
859   *
860   * beacon_silence_rssi_[abc] & 0x0FF (unsigned, units in dB)
861   *
862   * Find the weakest background noise level from among a/b/c.  This Rx chain
863   * will be the reference, with 0 gain adjustment.  Attenuate other channels by
864   * finding noise difference:
865   *
866   * (accum_noise[i] - accum_noise[reference]) / 30
867   *
868   * The "30" adjusts the dB in the 20 accumulated samples to units of 1.5 dB.
869   * For use in diff_gain_[abc] fields of struct iwk_calibration_cmd, the
870   * driver should limit the difference results to a range of 0-3 (0-4.5 dB),
871   * and set bit 2 to indicate "reduce gain".  The value for the reference
872   * (weakest) chain should be "0".
873   *
874   * diff_gain_[abc] bit fields:
875   *   2: (1) reduce gain, (0) increase gain
876   * 1-0: amount of gain, units of 1.5 dB
877   */
878  
879  #define	RX_CHAINS_NUM  (3)
880  #define	CHAIN_GAIN_DIFF_INIT_VAL  (4)
881  
882  #define	IWK_GAIN_DIFF_ALIVE (0)
883  #define	IWK_GAIN_DIFF_ACCUMULATE (1)
884  #define	IWK_GAIN_DIFF_CALIBRATED (2)
885  
886  #define	INTERFERENCE_DATA_AVAILABLE  (1)
887  #define	BEACON_NUM_20  (20)
888  #define	MAX_ALLOWED_DIFF  (15)
889  
890  struct iwk_rx_gain_diff {
891  	uint8_t		state;
892  	uint16_t	beacon_count;
893  	uint8_t		gain_diff_send;
894  	uint32_t	beacon_stren_a;
895  	uint32_t	beacon_stren_b;
896  	uint32_t	beacon_stren_c;
897  	uint32_t	noise_stren_a;
898  	uint32_t	noise_stren_b;
899  	uint32_t	noise_stren_c;
900  	uint8_t		disconnect_chain[RX_CHAINS_NUM];
901  	uint8_t		connected_chains;
902  	uint8_t		gain_diff_chain[RX_CHAINS_NUM];
903  };
904  
905  /* END Receiver gain balance */
906  
907  /* START Receiver sensitivity */
908  
909  /*
910   * SENSITIVITY_CMD = 0xa8
911   *
912   * This command sets up the Rx signal detector for a sensitivity level that
913   * is high enough to lock onto all signals within the associated network,
914   * but low enough to ignore signals that are below a certain threshold, so as
915   * not to have too many "false alarms".  False alarms are signals that the
916   * Rx DSP tries to lock onto, but then discards after determining that they
917   * are noise.
918   *
919   * The optimum number of false alarms is between 5 and 50 per 200 TUs
920   * (200 * 1024 uSecs, i.e. 204.8 milliseconds) of actual Rx time (i.e.
921   * time listening, not transmitting).  Driver must adjust sensitivity so that
922   * the ratio of actual false alarms to actual Rx time falls within this range.
923   *
924   * While associated, uCode delivers STATISTICS_NOTIFICATIONs after each
925   * received beacon.  These provide information to the driver to analyze the
926   * sensitivity.  Don't analyze statistics that come in from scanning, or any
927   * other non-associated-network source.  Pertinent statistics include:
928   *
929   * From "general" statistics (struct statistics_rx_non_phy):
930   *
931   * (beacon_energy_[abc] & 0x0FF00) >> 8 (unsigned, higher value is lower level)
932   *   Measure of energy of desired signal.  Used for establishing a level
933   *   below which the device does not detect signals.
934   *
935   * (beacon_silence_rssi_[abc] & 0x0FF00) >> 8 (unsigned, units in dB)
936   *   Measure of background noise in silent period after beacon.
937   *
938   * channel_load
939   *   uSecs of actual Rx time during beacon period (varies according to
940   *   how much time was spent transmitting).
941   *
942   * From "cck" and "ofdm" statistics (struct statistics_rx_phy), separately:
943   *
944   * false_alarm_cnt
945   *   Signal locks abandoned early (before phy-level header).
946   *
947   * plcp_err
948   *   Signal locks abandoned late (during phy-level header).
949   *
950   * NOTE:  Both false_alarm_cnt and plcp_err increment monotonically from
951   *        beacon to beacon, i.e. each value is an accumulation of all errors
952   *        before and including the latest beacon.  Values will wrap around to 0
953   *        after counting up to 2^32 - 1.  Driver must differentiate vs.
954   *        previous beacon's values to determine # false alarms in the current
955   *        beacon period.
956   *
957   * Total number of false alarms = false_alarms + plcp_errs
958   *
959   * For OFDM, adjust the following table entries in struct iwk_rx_sensitivity_cmd
960   * (notice that the start points for OFDM are at or close to settings for
961   * maximum sensitivity):
962   *
963   *                                             START  /  MIN  /  MAX
964   *   HD_AUTO_CORR32_X1_TH_ADD_MIN_INDEX          90   /   85  /  120
965   *   HD_AUTO_CORR32_X1_TH_ADD_MIN_MRC_INDEX     170   /  170  /  210
966   *   HD_AUTO_CORR32_X4_TH_ADD_MIN_INDEX         105   /  105  /  140
967   *   HD_AUTO_CORR32_X4_TH_ADD_MIN_MRC_INDEX     220   /  220  /  270
968   *
969   *   If actual rate of OFDM false alarms (+ plcp_errors) is too high
970   *   (greater than 50 for each 204.8 msecs listening), reduce sensitivity
971   *   by *adding* 1 to all 4 of the table entries above, up to the max for
972   *   each entry.  Conversely, if false alarm rate is too low (less than 5
973   *   for each 204.8 msecs listening), *subtract* 1 from each entry to
974   *   increase sensitivity.
975   *
976   * For CCK sensitivity, keep track of the following:
977   *
978   *   1).  20-beacon history of maximum background noise, indicated by
979   *        (beacon_silence_rssi_[abc] & 0x0FF00), units in dB, across the
980   *        3 receivers.  For any given beacon, the "silence reference" is
981   *        the maximum of last 60 samples (20 beacons * 3 receivers).
982   *
983   *   2).  10-beacon history of strongest signal level, as indicated
984   *        by (beacon_energy_[abc] & 0x0FF00) >> 8, across the 3 receivers,
985   *        i.e. the strength of the signal through the best receiver at the
986   *        moment.  These measurements are "upside down", with lower values
987   *        for stronger signals, so max energy will be *minimum* value.
988   *
989   *        Then for any given beacon, the driver must determine the *weakest*
990   *        of the strongest signals; this is the minimum level that needs to be
991   *        successfully detected, when using the best receiver at the moment.
992   *        "Max cck energy" is the maximum (higher value means lower energy!)
993   *        of the last 10 minima.  Once this is determined, driver must add
994   *        a little margin by adding "6" to it.
995   *
996   *   3).  Number of consecutive beacon periods with too few false alarms.
997   *        Reset this to 0 at the first beacon period that falls within the
998   *        "good" range (5 to 50 false alarms per 204.8 milliseconds rx).
999   *
1000   * Then, adjust the following CCK table entries in struct iwk_rx_sensitivity_cmd
1001   * (notice that the start points for CCK are at maximum sensitivity):
1002   *
1003   *                                             START  /  MIN  /  MAX
1004   *   HD_AUTO_CORR40_X4_TH_ADD_MIN_INDEX         125   /  125  /  200
1005   *   HD_AUTO_CORR40_X4_TH_ADD_MIN_MRC_INDEX     200   /  200  /  400
1006   *   HD_MIN_ENERGY_CCK_DET_INDEX                100   /    0  /  100
1007   *
1008   *   If actual rate of CCK false alarms (+ plcp_errors) is too high
1009   *   (greater than 50 for each 204.8 msecs listening), method for reducing
1010   *   sensitivity is:
1011   *
1012   *   1)  *Add* 3 to value in HD_AUTO_CORR40_X4_TH_ADD_MIN_MRC_INDEX,
1013   *       up to max 400.
1014   *
1015   *   2)  If current value in HD_AUTO_CORR40_X4_TH_ADD_MIN_INDEX is < 160,
1016   *       sensitivity has been reduced a significant amount; bring it up to
1017   *       a moderate 161.  Otherwise, *add* 3, up to max 200.
1018   *
1019   *   3)  a)  If current value in HD_AUTO_CORR40_X4_TH_ADD_MIN_INDEX is > 160,
1020   *       sensitivity has been reduced only a moderate or small amount;
1021   *       *subtract* 2 from value in HD_MIN_ENERGY_CCK_DET_INDEX,
1022   *       down to min 0.  Otherwise (if gain has been significantly reduced),
1023   *       don't change the HD_MIN_ENERGY_CCK_DET_INDEX value.
1024   *
1025   *       b)  Save a snapshot of the "silence reference".
1026   *
1027   *   If actual rate of CCK false alarms (+ plcp_errors) is too low
1028   *   (less than 5 for each 204.8 msecs listening), method for increasing
1029   *   sensitivity is used only if:
1030   *
1031   *   1a)  Previous beacon did not have too many false alarms
1032   *   1b)  AND difference between previous "silence reference" and current
1033   *        "silence reference" (prev - current) is 2 or more,
1034   *   OR 2)  100 or more consecutive beacon periods have had rate of
1035   *          less than 5 false alarms per 204.8 milliseconds rx time.
1036   *
1037   *   Method for increasing sensitivity:
1038   *
1039   *   1)  *Subtract* 3 from value in HD_AUTO_CORR40_X4_TH_ADD_MIN_INDEX,
1040   *       down to min 125.
1041   *
1042   *   2)  *Subtract* 3 from value in HD_AUTO_CORR40_X4_TH_ADD_MIN_MRC_INDEX,
1043   *       down to min 200.
1044   *
1045   *   3)  *Add* 2 to value in HD_MIN_ENERGY_CCK_DET_INDEX, up to max 100.
1046   *
1047   *   If actual rate of CCK false alarms (+ plcp_errors) is within good range
1048   *   (between 5 and 50 for each 204.8 msecs listening):
1049   *
1050   *   1)  Save a snapshot of the silence reference.
1051   *
1052   *   2)  If previous beacon had too many CCK false alarms (+ plcp_errors),
1053   *       give some extra margin to energy threshold by *subtracting* 8
1054   *       from value in HD_MIN_ENERGY_CCK_DET_INDEX.
1055   *
1056   *   For all cases (too few, too many, good range), make sure that the CCK
1057   *   detection threshold (energy) is below the energy level for robust
1058   *   detection over the past 10 beacon periods, the "Max cck energy".
1059   *   Lower values mean higher energy; this means making sure that the value
1060   *   in HD_MIN_ENERGY_CCK_DET_INDEX is at or *above* "Max cck energy".
1061   *
1062   * Driver should set the following entries to fixed values:
1063   *
1064   *   HD_MIN_ENERGY_OFDM_DET_INDEX               100
1065   *   HD_BARKER_CORR_TH_ADD_MIN_INDEX            190
1066   *   HD_BARKER_CORR_TH_ADD_MIN_MRC_INDEX        390
1067   *   HD_OFDM_ENERGY_TH_IN_INDEX                  62
1068   */
1069  
1070  #define	IWK_SENSITIVITY_CALIB_ALLOW_MSK  (1 << 0)
1071  #define	IWK_SENSITIVITY_OFDM_UPDATE_MSK  (1 << 1)
1072  #define	IWK_SENSITIVITY_CCK_UPDATE_MSK   (1 << 2)
1073  
1074  #define	MIN_ENERGY_CCK_DET_IDX			(0)
1075  #define	MIN_ENERGY_OFDM_DET_IDX			(1)
1076  #define	AUTO_CORR32_X1_TH_ADD_MIN_IDX		(2)
1077  #define	AUTO_CORR32_X1_TH_ADD_MIN_MRC_IDX	(3)
1078  #define	AUTO_CORR40_X4_TH_ADD_MIN_MRC_IDX	(4)
1079  #define	AUTO_CORR32_X4_TH_ADD_MIN_IDX		(5)
1080  #define	AUTO_CORR32_X4_TH_ADD_MIN_MRC_IDX	(6)
1081  #define	BARKER_CORR_TH_ADD_MIN_IDX		(7)
1082  #define	BARKER_CORR_TH_ADD_MIN_MRC_IDX		(8)
1083  #define	AUTO_CORR40_X4_TH_ADD_MIN_IDX		(9)
1084  #define	PTAM_ENERGY_TH_IDX			(10)
1085  
1086  #define	IWK_GOOD_RANGE_FALSE_ALARM	(0)
1087  #define	IWK_TOO_MANY_FALSE_ALARM	(1)
1088  #define	IWK_TOO_FEW_FALSE_ALARM		(2)
1089  
1090  #define	IWK_SENSITIVITY_CONTROL_DEFAULT_TABLE	(0)
1091  #define	IWK_SENSITIVITY_CONTROL_WORK_TABLE	(1)
1092  
1093  struct iwk_rx_sensitivity_cmd {
1094  	uint16_t  control;
1095  	uint16_t  table[11];
1096  };
1097  
1098  struct iwk_rx_sensitivity {
1099  	uint16_t  auto_corr_ofdm_x4;
1100  	uint16_t  auto_corr_mrc_ofdm_x4;
1101  	uint16_t  auto_corr_ofdm_x1;
1102  	uint16_t  auto_corr_mrc_ofdm_x1;
1103  
1104  	uint16_t  auto_corr_cck_x4;
1105  	uint16_t  auto_corr_mrc_cck_x4;
1106  	uint16_t  min_energy_det_cck;
1107  
1108  	uint16_t  flags;
1109  
1110  	uint32_t  last_bad_plcp_cnt_ofdm;
1111  	uint32_t  last_false_alarm_cnt_ofdm;
1112  	uint32_t  last_bad_plcp_cnt_cck;
1113  	uint32_t  last_false_alarm_cnt_cck;
1114  
1115  	uint32_t  cck_curr_state;
1116  	uint32_t  cck_prev_state;
1117  	uint32_t  cck_beacon_min[10];
1118  	uint32_t  cck_beacon_idx;
1119  	uint8_t   cck_noise_max[20];
1120  	uint32_t  cck_noise_ref;
1121  	uint32_t  cck_noise_idx;
1122  	int32_t   cck_noise_diff;
1123  	uint32_t  cck_no_false_alarm_num;
1124  };
1125  
1126  /* END Receiver sensitivity */
1127  
1128  #endif /* _IWK_CALIBRATION_H_ */
1129