hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
 * Copyright (c) 2008-2011 Atheros Communications Inc.
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */
 
#ifndef CALIB_H
#define CALIB_H
 
#include "hw.h"
 
#define AR_PHY_CCA_FILTERWINDOW_LENGTH          5
 
/* Internal noise floor can vary by about 6db depending on the frequency */
#define ATH9K_NF_CAL_NOISE_THRESH        6
 
#define NUM_NF_READINGS       6
#define ATH9K_NF_CAL_HIST_MAX 5
 
struct ar5416IniArray {
   u32 *ia_array;
   u32 ia_rows;
   u32 ia_columns;
};
 
#define STATIC_INI_ARRAY(array) {            \
       .ia_array = (u32 *)(array),        \
       .ia_rows = ARRAY_SIZE(array),        \
       .ia_columns = ARRAY_SIZE(array[0]),    \
   }
 
#define INIT_INI_ARRAY(iniarray, array) do {    \
       (iniarray)->ia_array = (u32 *)(array);        \
       (iniarray)->ia_rows = ARRAY_SIZE(array);    \
       (iniarray)->ia_columns = ARRAY_SIZE(array[0]);    \
   } while (0)
 
#define INI_RA(iniarray, row, column) \
   (((iniarray)->ia_array)[(row) *    ((iniarray)->ia_columns) + (column)])
 
#define INIT_CAL(_perCal) do {                \
       (_perCal)->calState = CAL_WAITING;    \
       (_perCal)->calNext = NULL;        \
   } while (0)
 
#define INSERT_CAL(_ahp, _perCal)                    \
   do {                                \
       if ((_ahp)->cal_list_last == NULL) {            \
           (_ahp)->cal_list =                \
               (_ahp)->cal_list_last = (_perCal);    \
           ((_ahp)->cal_list_last)->calNext = (_perCal); \
       } else {                        \
           ((_ahp)->cal_list_last)->calNext = (_perCal); \
           (_ahp)->cal_list_last = (_perCal);        \
           (_perCal)->calNext = (_ahp)->cal_list;    \
       }                            \
   } while (0)
 
enum ath9k_cal_state {
   CAL_INACTIVE,
   CAL_WAITING,
   CAL_RUNNING,
   CAL_DONE
};
 
#define MIN_CAL_SAMPLES     1
#define MAX_CAL_SAMPLES    64
#define INIT_LOG_COUNT      5
#define PER_MIN_LOG_COUNT   2
#define PER_MAX_LOG_COUNT  10
 
struct ath9k_percal_data {
   u32 calType;
   u32 calNumSamples;
   u32 calCountMax;
   void (*calCollect) (struct ath_hw *);
   void (*calPostProc) (struct ath_hw *, u8);
};
 
struct ath9k_cal_list {
   const struct ath9k_percal_data *calData;
   enum ath9k_cal_state calState;
   struct ath9k_cal_list *calNext;
};
 
struct ath9k_nfcal_hist {
   int16_t nfCalBuffer[ATH9K_NF_CAL_HIST_MAX];
   u8 currIndex;
   int16_t privNF;
   u8 invalidNFcount;
};
 
#define MAX_PACAL_SKIPCOUNT 8
struct ath9k_pacal_info{
   int32_t prev_offset;    /* Previous value of PA offset value */
   int8_t max_skipcount;    /* Max No. of times PACAL can be skipped */
   int8_t skipcount;    /* No. of times the PACAL to be skipped */
};
 
bool ath9k_hw_reset_calvalid(struct ath_hw *ah);
void ath9k_hw_start_nfcal(struct ath_hw *ah, bool update);
int ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan);
bool ath9k_hw_getnf(struct ath_hw *ah, struct ath9k_channel *chan);
void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah,
                 struct ath9k_channel *chan);
void ath9k_hw_bstuck_nfcal(struct ath_hw *ah);
void ath9k_hw_reset_calibration(struct ath_hw *ah,
               struct ath9k_cal_list *currCal);
s16 ath9k_hw_getchan_noise(struct ath_hw *ah, struct ath9k_channel *chan,
              s16 nf);
 
 
#endif /* CALIB_H */