1 // SPDX-License-Identifier: GPL-2.0 2 /****************************************************************************** 3 * 4 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. 5 * 6 ******************************************************************************/ 7 8 #include "odm_precomp.h" 9 10 /* Global var */ 11 12 u32 OFDMSwingTable[OFDM_TABLE_SIZE] = { 13 0x7f8001fe, /* 0, +6.0dB */ 14 0x788001e2, /* 1, +5.5dB */ 15 0x71c001c7, /* 2, +5.0dB */ 16 0x6b8001ae, /* 3, +4.5dB */ 17 0x65400195, /* 4, +4.0dB */ 18 0x5fc0017f, /* 5, +3.5dB */ 19 0x5a400169, /* 6, +3.0dB */ 20 0x55400155, /* 7, +2.5dB */ 21 0x50800142, /* 8, +2.0dB */ 22 0x4c000130, /* 9, +1.5dB */ 23 0x47c0011f, /* 10, +1.0dB */ 24 0x43c0010f, /* 11, +0.5dB */ 25 0x40000100, /* 12, +0dB */ 26 0x3c8000f2, /* 13, -0.5dB */ 27 0x390000e4, /* 14, -1.0dB */ 28 0x35c000d7, /* 15, -1.5dB */ 29 0x32c000cb, /* 16, -2.0dB */ 30 0x300000c0, /* 17, -2.5dB */ 31 0x2d4000b5, /* 18, -3.0dB */ 32 0x2ac000ab, /* 19, -3.5dB */ 33 0x288000a2, /* 20, -4.0dB */ 34 0x26000098, /* 21, -4.5dB */ 35 0x24000090, /* 22, -5.0dB */ 36 0x22000088, /* 23, -5.5dB */ 37 0x20000080, /* 24, -6.0dB */ 38 0x1e400079, /* 25, -6.5dB */ 39 0x1c800072, /* 26, -7.0dB */ 40 0x1b00006c, /* 27. -7.5dB */ 41 0x19800066, /* 28, -8.0dB */ 42 0x18000060, /* 29, -8.5dB */ 43 0x16c0005b, /* 30, -9.0dB */ 44 0x15800056, /* 31, -9.5dB */ 45 0x14400051, /* 32, -10.0dB */ 46 0x1300004c, /* 33, -10.5dB */ 47 0x12000048, /* 34, -11.0dB */ 48 0x11000044, /* 35, -11.5dB */ 49 0x10000040, /* 36, -12.0dB */ 50 }; 51 52 u8 CCKSwingTable_Ch1_Ch13[CCK_TABLE_SIZE][8] = { 53 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04}, /* 0, +0dB */ 54 {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, /* 1, -0.5dB */ 55 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, /* 2, -1.0dB */ 56 {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, /* 3, -1.5dB */ 57 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, /* 4, -2.0dB */ 58 {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, /* 5, -2.5dB */ 59 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, /* 6, -3.0dB */ 60 {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, /* 7, -3.5dB */ 61 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, /* 8, -4.0dB */ 62 {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, /* 9, -4.5dB */ 63 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, /* 10, -5.0dB */ 64 {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, /* 11, -5.5dB */ 65 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, /* 12, -6.0dB <== default */ 66 {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, /* 13, -6.5dB */ 67 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, /* 14, -7.0dB */ 68 {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, /* 15, -7.5dB */ 69 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, /* 16, -8.0dB */ 70 {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, /* 17, -8.5dB */ 71 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, /* 18, -9.0dB */ 72 {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 19, -9.5dB */ 73 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 20, -10.0dB */ 74 {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 21, -10.5dB */ 75 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 22, -11.0dB */ 76 {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, /* 23, -11.5dB */ 77 {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, /* 24, -12.0dB */ 78 {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, /* 25, -12.5dB */ 79 {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, /* 26, -13.0dB */ 80 {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 27, -13.5dB */ 81 {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 28, -14.0dB */ 82 {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 29, -14.5dB */ 83 {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 30, -15.0dB */ 84 {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, /* 31, -15.5dB */ 85 {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01} /* 32, -16.0dB */ 86 }; 87 88 u8 CCKSwingTable_Ch14[CCK_TABLE_SIZE][8] = { 89 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00}, /* 0, +0dB */ 90 {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, /* 1, -0.5dB */ 91 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, /* 2, -1.0dB */ 92 {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, /* 3, -1.5dB */ 93 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, /* 4, -2.0dB */ 94 {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, /* 5, -2.5dB */ 95 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, /* 6, -3.0dB */ 96 {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, /* 7, -3.5dB */ 97 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, /* 8, -4.0dB */ 98 {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, /* 9, -4.5dB */ 99 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, /* 10, -5.0dB */ 100 {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 11, -5.5dB */ 101 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 12, -6.0dB <== default */ 102 {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, /* 13, -6.5dB */ 103 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, /* 14, -7.0dB */ 104 {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 15, -7.5dB */ 105 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 16, -8.0dB */ 106 {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 17, -8.5dB */ 107 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 18, -9.0dB */ 108 {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 19, -9.5dB */ 109 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 20, -10.0dB */ 110 {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, /* 21, -10.5dB */ 111 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, /* 22, -11.0dB */ 112 {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 23, -11.5dB */ 113 {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 24, -12.0dB */ 114 {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 25, -12.5dB */ 115 {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 26, -13.0dB */ 116 {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 27, -13.5dB */ 117 {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 28, -14.0dB */ 118 {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 29, -14.5dB */ 119 {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 30, -15.0dB */ 120 {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 31, -15.5dB */ 121 {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00} /* 32, -16.0dB */ 122 }; 123 124 u32 OFDMSwingTable_New[OFDM_TABLE_SIZE] = { 125 0x0b40002d, /* 0, -15.0dB */ 126 0x0c000030, /* 1, -14.5dB */ 127 0x0cc00033, /* 2, -14.0dB */ 128 0x0d800036, /* 3, -13.5dB */ 129 0x0e400039, /* 4, -13.0dB */ 130 0x0f00003c, /* 5, -12.5dB */ 131 0x10000040, /* 6, -12.0dB */ 132 0x11000044, /* 7, -11.5dB */ 133 0x12000048, /* 8, -11.0dB */ 134 0x1300004c, /* 9, -10.5dB */ 135 0x14400051, /* 10, -10.0dB */ 136 0x15800056, /* 11, -9.5dB */ 137 0x16c0005b, /* 12, -9.0dB */ 138 0x18000060, /* 13, -8.5dB */ 139 0x19800066, /* 14, -8.0dB */ 140 0x1b00006c, /* 15, -7.5dB */ 141 0x1c800072, /* 16, -7.0dB */ 142 0x1e400079, /* 17, -6.5dB */ 143 0x20000080, /* 18, -6.0dB */ 144 0x22000088, /* 19, -5.5dB */ 145 0x24000090, /* 20, -5.0dB */ 146 0x26000098, /* 21, -4.5dB */ 147 0x288000a2, /* 22, -4.0dB */ 148 0x2ac000ab, /* 23, -3.5dB */ 149 0x2d4000b5, /* 24, -3.0dB */ 150 0x300000c0, /* 25, -2.5dB */ 151 0x32c000cb, /* 26, -2.0dB */ 152 0x35c000d7, /* 27, -1.5dB */ 153 0x390000e4, /* 28, -1.0dB */ 154 0x3c8000f2, /* 29, -0.5dB */ 155 0x40000100, /* 30, +0dB */ 156 0x43c0010f, /* 31, +0.5dB */ 157 0x47c0011f, /* 32, +1.0dB */ 158 0x4c000130, /* 33, +1.5dB */ 159 0x50800142, /* 34, +2.0dB */ 160 0x55400155, /* 35, +2.5dB */ 161 0x5a400169, /* 36, +3.0dB */ 162 0x5fc0017f, /* 37, +3.5dB */ 163 0x65400195, /* 38, +4.0dB */ 164 0x6b8001ae, /* 39, +4.5dB */ 165 0x71c001c7, /* 40, +5.0dB */ 166 0x788001e2, /* 41, +5.5dB */ 167 0x7f8001fe /* 42, +6.0dB */ 168 }; 169 170 u8 CCKSwingTable_Ch1_Ch13_New[CCK_TABLE_SIZE][8] = { 171 {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01}, /* 0, -16.0dB */ 172 {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, /* 1, -15.5dB */ 173 {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 2, -15.0dB */ 174 {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 3, -14.5dB */ 175 {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 4, -14.0dB */ 176 {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 5, -13.5dB */ 177 {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, /* 6, -13.0dB */ 178 {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, /* 7, -12.5dB */ 179 {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, /* 8, -12.0dB */ 180 {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, /* 9, -11.5dB */ 181 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 10, -11.0dB */ 182 {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 11, -10.5dB */ 183 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 12, -10.0dB */ 184 {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 13, -9.5dB */ 185 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, /* 14, -9.0dB */ 186 {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, /* 15, -8.5dB */ 187 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, /* 16, -8.0dB */ 188 {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, /* 17, -7.5dB */ 189 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, /* 18, -7.0dB */ 190 {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, /* 19, -6.5dB */ 191 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, /* 20, -6.0dB */ 192 {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, /* 21, -5.5dB */ 193 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, /* 22, -5.0dB */ 194 {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, /* 23, -4.5dB */ 195 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, /* 24, -4.0dB */ 196 {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, /* 25, -3.5dB */ 197 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, /* 26, -3.0dB */ 198 {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, /* 27, -2.5dB */ 199 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, /* 28, -2.0dB */ 200 {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, /* 29, -1.5dB */ 201 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, /* 30, -1.0dB */ 202 {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, /* 31, -0.5dB */ 203 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04} /* 32, +0dB */ 204 }; 205 206 u8 CCKSwingTable_Ch14_New[CCK_TABLE_SIZE][8] = { 207 {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}, /* 0, -16.0dB */ 208 {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 1, -15.5dB */ 209 {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 2, -15.0dB */ 210 {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 3, -14.5dB */ 211 {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 4, -14.0dB */ 212 {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 5, -13.5dB */ 213 {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 6, -13.0dB */ 214 {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 7, -12.5dB */ 215 {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 8, -12.0dB */ 216 {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 9, -11.5dB */ 217 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, /* 10, -11.0dB */ 218 {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, /* 11, -10.5dB */ 219 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 12, -10.0dB */ 220 {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 13, -9.5dB */ 221 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 14, -9.0dB */ 222 {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 15, -8.5dB */ 223 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 16, -8.0dB */ 224 {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 17, -7.5dB */ 225 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, /* 18, -7.0dB */ 226 {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, /* 19, -6.5dB */ 227 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 20, -6.0dB */ 228 {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 21, -5.5dB */ 229 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, /* 22, -5.0dB */ 230 {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, /* 23, -4.5dB */ 231 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, /* 24, -4.0dB */ 232 {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, /* 25, -3.5dB */ 233 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, /* 26, -3.0dB */ 234 {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, /* 27, -2.5dB */ 235 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, /* 28, -2.0dB */ 236 {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, /* 29, -1.5dB */ 237 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, /* 30, -1.0dB */ 238 {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, /* 31, -0.5dB */ 239 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00} /* 32, +0dB */ 240 }; 241 242 u32 TxScalingTable_Jaguar[TXSCALE_TABLE_SIZE] = { 243 0x081, /* 0, -12.0dB */ 244 0x088, /* 1, -11.5dB */ 245 0x090, /* 2, -11.0dB */ 246 0x099, /* 3, -10.5dB */ 247 0x0A2, /* 4, -10.0dB */ 248 0x0AC, /* 5, -9.5dB */ 249 0x0B6, /* 6, -9.0dB */ 250 0x0C0, /* 7, -8.5dB */ 251 0x0CC, /* 8, -8.0dB */ 252 0x0D8, /* 9, -7.5dB */ 253 0x0E5, /* 10, -7.0dB */ 254 0x0F2, /* 11, -6.5dB */ 255 0x101, /* 12, -6.0dB */ 256 0x110, /* 13, -5.5dB */ 257 0x120, /* 14, -5.0dB */ 258 0x131, /* 15, -4.5dB */ 259 0x143, /* 16, -4.0dB */ 260 0x156, /* 17, -3.5dB */ 261 0x16A, /* 18, -3.0dB */ 262 0x180, /* 19, -2.5dB */ 263 0x197, /* 20, -2.0dB */ 264 0x1AF, /* 21, -1.5dB */ 265 0x1C8, /* 22, -1.0dB */ 266 0x1E3, /* 23, -0.5dB */ 267 0x200, /* 24, +0 dB */ 268 0x21E, /* 25, +0.5dB */ 269 0x23E, /* 26, +1.0dB */ 270 0x261, /* 27, +1.5dB */ 271 0x285, /* 28, +2.0dB */ 272 0x2AB, /* 29, +2.5dB */ 273 0x2D3, /* 30, +3.0dB */ 274 0x2FE, /* 31, +3.5dB */ 275 0x32B, /* 32, +4.0dB */ 276 0x35C, /* 33, +4.5dB */ 277 0x38E, /* 34, +5.0dB */ 278 0x3C4, /* 35, +5.5dB */ 279 0x3FE /* 36, +6.0dB */ 280 }; 281 282 /* Remove Edca by Yu Chen */ 283 284 285 #define RxDefaultAnt1 0x65a9 286 #define RxDefaultAnt2 0x569a 287 288 static void odm_CommonInfoSelfInit(struct dm_odm_t *pDM_Odm) 289 { 290 pDM_Odm->bCckHighPower = (bool) PHY_QueryBBReg(pDM_Odm->Adapter, ODM_REG(CCK_RPT_FORMAT, pDM_Odm), ODM_BIT(CCK_RPT_FORMAT, pDM_Odm)); 291 pDM_Odm->RFPathRxEnable = (u8) PHY_QueryBBReg(pDM_Odm->Adapter, ODM_REG(BB_RX_PATH, pDM_Odm), ODM_BIT(BB_RX_PATH, pDM_Odm)); 292 293 ODM_InitDebugSetting(pDM_Odm); 294 295 pDM_Odm->TxRate = 0xFF; 296 } 297 298 static void odm_CommonInfoSelfUpdate(struct dm_odm_t *pDM_Odm) 299 { 300 u8 EntryCnt = 0; 301 u8 i; 302 PSTA_INFO_T pEntry; 303 304 if (*(pDM_Odm->pBandWidth) == ODM_BW40M) { 305 if (*(pDM_Odm->pSecChOffset) == 1) 306 pDM_Odm->ControlChannel = *(pDM_Odm->pChannel)-2; 307 else if (*(pDM_Odm->pSecChOffset) == 2) 308 pDM_Odm->ControlChannel = *(pDM_Odm->pChannel)+2; 309 } else 310 pDM_Odm->ControlChannel = *(pDM_Odm->pChannel); 311 312 for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) { 313 pEntry = pDM_Odm->pODM_StaInfo[i]; 314 if (IS_STA_VALID(pEntry)) 315 EntryCnt++; 316 } 317 318 if (EntryCnt == 1) 319 pDM_Odm->bOneEntryOnly = true; 320 else 321 pDM_Odm->bOneEntryOnly = false; 322 } 323 324 static void odm_CmnInfoInit_Debug(struct dm_odm_t *pDM_Odm) 325 { 326 } 327 328 static void odm_BasicDbgMessage(struct dm_odm_t *pDM_Odm) 329 { 330 } 331 332 /* 3 ============================================================ */ 333 /* 3 RATR MASK */ 334 /* 3 ============================================================ */ 335 /* 3 ============================================================ */ 336 /* 3 Rate Adaptive */ 337 /* 3 ============================================================ */ 338 339 static void odm_RateAdaptiveMaskInit(struct dm_odm_t *pDM_Odm) 340 { 341 struct odm_rate_adaptive *pOdmRA = &pDM_Odm->RateAdaptive; 342 343 pOdmRA->Type = DM_Type_ByDriver; 344 if (pOdmRA->Type == DM_Type_ByDriver) 345 pDM_Odm->bUseRAMask = true; 346 else 347 pDM_Odm->bUseRAMask = false; 348 349 pOdmRA->RATRState = DM_RATR_STA_INIT; 350 pOdmRA->LdpcThres = 35; 351 pOdmRA->bUseLdpc = false; 352 pOdmRA->HighRSSIThresh = 50; 353 pOdmRA->LowRSSIThresh = 20; 354 } 355 356 u32 ODM_Get_Rate_Bitmap( 357 struct dm_odm_t *pDM_Odm, 358 u32 macid, 359 u32 ra_mask, 360 u8 rssi_level 361 ) 362 { 363 PSTA_INFO_T pEntry; 364 u32 rate_bitmap = 0; 365 u8 WirelessMode; 366 367 pEntry = pDM_Odm->pODM_StaInfo[macid]; 368 if (!IS_STA_VALID(pEntry)) 369 return ra_mask; 370 371 WirelessMode = pEntry->wireless_mode; 372 373 switch (WirelessMode) { 374 case ODM_WM_B: 375 if (ra_mask & 0x0000000c) /* 11M or 5.5M enable */ 376 rate_bitmap = 0x0000000d; 377 else 378 rate_bitmap = 0x0000000f; 379 break; 380 381 case (ODM_WM_G): 382 case (ODM_WM_A): 383 if (rssi_level == DM_RATR_STA_HIGH) 384 rate_bitmap = 0x00000f00; 385 else 386 rate_bitmap = 0x00000ff0; 387 break; 388 389 case (ODM_WM_B|ODM_WM_G): 390 if (rssi_level == DM_RATR_STA_HIGH) 391 rate_bitmap = 0x00000f00; 392 else if (rssi_level == DM_RATR_STA_MIDDLE) 393 rate_bitmap = 0x00000ff0; 394 else 395 rate_bitmap = 0x00000ff5; 396 break; 397 398 case (ODM_WM_B|ODM_WM_G|ODM_WM_N24G): 399 case (ODM_WM_B|ODM_WM_N24G): 400 case (ODM_WM_G|ODM_WM_N24G): 401 case (ODM_WM_A|ODM_WM_N5G): 402 if (pDM_Odm->RFType == ODM_1T2R || pDM_Odm->RFType == ODM_1T1R) { 403 if (rssi_level == DM_RATR_STA_HIGH) 404 rate_bitmap = 0x000f0000; 405 else if (rssi_level == DM_RATR_STA_MIDDLE) 406 rate_bitmap = 0x000ff000; 407 else { 408 if (*(pDM_Odm->pBandWidth) == ODM_BW40M) 409 rate_bitmap = 0x000ff015; 410 else 411 rate_bitmap = 0x000ff005; 412 } 413 } else { 414 if (rssi_level == DM_RATR_STA_HIGH) 415 rate_bitmap = 0x0f8f0000; 416 else if (rssi_level == DM_RATR_STA_MIDDLE) 417 rate_bitmap = 0x0f8ff000; 418 else { 419 if (*(pDM_Odm->pBandWidth) == ODM_BW40M) 420 rate_bitmap = 0x0f8ff015; 421 else 422 rate_bitmap = 0x0f8ff005; 423 } 424 } 425 break; 426 427 case (ODM_WM_AC|ODM_WM_G): 428 if (rssi_level == 1) 429 rate_bitmap = 0xfc3f0000; 430 else if (rssi_level == 2) 431 rate_bitmap = 0xfffff000; 432 else 433 rate_bitmap = 0xffffffff; 434 break; 435 436 case (ODM_WM_AC|ODM_WM_A): 437 438 if (pDM_Odm->RFType == RF_1T1R) { 439 if (rssi_level == 1) /* add by Gary for ac-series */ 440 rate_bitmap = 0x003f8000; 441 else if (rssi_level == 2) 442 rate_bitmap = 0x003ff000; 443 else 444 rate_bitmap = 0x003ff010; 445 } else { 446 if (rssi_level == 1) /* add by Gary for ac-series */ 447 rate_bitmap = 0xfe3f8000; /* VHT 2SS MCS3~9 */ 448 else if (rssi_level == 2) 449 rate_bitmap = 0xfffff000; /* VHT 2SS MCS0~9 */ 450 else 451 rate_bitmap = 0xfffff010; /* All */ 452 } 453 break; 454 455 default: 456 if (pDM_Odm->RFType == RF_1T2R) 457 rate_bitmap = 0x000fffff; 458 else 459 rate_bitmap = 0x0fffffff; 460 break; 461 } 462 463 return ra_mask & rate_bitmap; 464 465 } 466 467 static void odm_RefreshRateAdaptiveMaskCE(struct dm_odm_t *pDM_Odm) 468 { 469 u8 i; 470 struct adapter *padapter = pDM_Odm->Adapter; 471 472 if (padapter->bDriverStopped) { 473 return; 474 } 475 476 if (!pDM_Odm->bUseRAMask) { 477 return; 478 } 479 480 for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) { 481 PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i]; 482 483 if (IS_STA_VALID(pstat)) { 484 if (IS_MCAST(pstat->hwaddr)) /* if (psta->mac_id == 1) */ 485 continue; 486 487 if (true == ODM_RAStateCheck(pDM_Odm, pstat->rssi_stat.UndecoratedSmoothedPWDB, false, &pstat->rssi_level)) { 488 /* printk("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi_stat.UndecoratedSmoothedPWDB, pstat->rssi_level); */ 489 rtw_hal_update_ra_mask(pstat, pstat->rssi_level); 490 } 491 492 } 493 } 494 } 495 496 /*----------------------------------------------------------------------------- 497 * Function: odm_RefreshRateAdaptiveMask() 498 * 499 * Overview: Update rate table mask according to rssi 500 * 501 * Input: NONE 502 * 503 * Output: NONE 504 * 505 * Return: NONE 506 * 507 * Revised History: 508 *When Who Remark 509 *05/27/2009 hpfan Create Version 0. 510 * 511 * -------------------------------------------------------------------------- 512 */ 513 static void odm_RefreshRateAdaptiveMask(struct dm_odm_t *pDM_Odm) 514 { 515 516 if (!(pDM_Odm->SupportAbility & ODM_BB_RA_MASK)) { 517 return; 518 } 519 odm_RefreshRateAdaptiveMaskCE(pDM_Odm); 520 } 521 522 /* Return Value: bool */ 523 /* - true: RATRState is changed. */ 524 bool ODM_RAStateCheck( 525 struct dm_odm_t *pDM_Odm, 526 s32 RSSI, 527 bool bForceUpdate, 528 u8 *pRATRState 529 ) 530 { 531 struct odm_rate_adaptive *pRA = &pDM_Odm->RateAdaptive; 532 const u8 GoUpGap = 5; 533 u8 HighRSSIThreshForRA = pRA->HighRSSIThresh; 534 u8 LowRSSIThreshForRA = pRA->LowRSSIThresh; 535 u8 RATRState; 536 537 /* Threshold Adjustment: */ 538 /* when RSSI state trends to go up one or two levels, make sure RSSI is high enough. */ 539 /* Here GoUpGap is added to solve the boundary's level alternation issue. */ 540 switch (*pRATRState) { 541 case DM_RATR_STA_INIT: 542 case DM_RATR_STA_HIGH: 543 break; 544 545 case DM_RATR_STA_MIDDLE: 546 HighRSSIThreshForRA += GoUpGap; 547 break; 548 549 case DM_RATR_STA_LOW: 550 HighRSSIThreshForRA += GoUpGap; 551 LowRSSIThreshForRA += GoUpGap; 552 break; 553 554 default: 555 ODM_RT_ASSERT(pDM_Odm, false, ("wrong rssi level setting %d !", *pRATRState)); 556 break; 557 } 558 559 /* Decide RATRState by RSSI. */ 560 if (RSSI > HighRSSIThreshForRA) 561 RATRState = DM_RATR_STA_HIGH; 562 else if (RSSI > LowRSSIThreshForRA) 563 RATRState = DM_RATR_STA_MIDDLE; 564 else 565 RATRState = DM_RATR_STA_LOW; 566 /* printk("==>%s, RATRState:0x%02x , RSSI:%d\n", __func__, RATRState, RSSI); */ 567 568 if (*pRATRState != RATRState || bForceUpdate) { 569 *pRATRState = RATRState; 570 return true; 571 } 572 573 return false; 574 } 575 576 /* */ 577 578 /* 3 ============================================================ */ 579 /* 3 RSSI Monitor */ 580 /* 3 ============================================================ */ 581 582 static void odm_RSSIMonitorInit(struct dm_odm_t *pDM_Odm) 583 { 584 struct ra_t *pRA_Table = &pDM_Odm->DM_RA_Table; 585 586 pRA_Table->firstconnect = false; 587 588 } 589 590 static void FindMinimumRSSI(struct adapter *padapter) 591 { 592 struct hal_com_data *pHalData = GET_HAL_DATA(padapter); 593 struct dm_priv *pdmpriv = &pHalData->dmpriv; 594 struct dm_odm_t *pDM_Odm = &pHalData->odmpriv; 595 596 /* 1 1.Determine the minimum RSSI */ 597 598 if ( 599 (pDM_Odm->bLinked != true) && 600 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0) 601 ) { 602 pdmpriv->MinUndecoratedPWDBForDM = 0; 603 /* ODM_RT_TRACE(pDM_Odm, COMP_BB_POWERSAVING, DBG_LOUD, ("Not connected to any\n")); */ 604 } else 605 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB; 606 607 /* ODM_RT_TRACE(pDM_Odm, COMP_DIG, DBG_LOUD, ("MinUndecoratedPWDBForDM =%d\n", pHalData->MinUndecoratedPWDBForDM)); */ 608 } 609 610 static void odm_RSSIMonitorCheckCE(struct dm_odm_t *pDM_Odm) 611 { 612 struct adapter *Adapter = pDM_Odm->Adapter; 613 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter); 614 struct dm_priv *pdmpriv = &pHalData->dmpriv; 615 int i; 616 int tmpEntryMaxPWDB = 0, tmpEntryMinPWDB = 0xff; 617 u8 sta_cnt = 0; 618 u32 PWDB_rssi[NUM_STA] = {0};/* 0~15]:MACID, [16~31]:PWDB_rssi */ 619 struct ra_t *pRA_Table = &pDM_Odm->DM_RA_Table; 620 621 if (pDM_Odm->bLinked != true) 622 return; 623 624 pRA_Table->firstconnect = pDM_Odm->bLinked; 625 626 /* if (check_fwstate(&Adapter->mlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == true) */ 627 { 628 struct sta_info *psta; 629 630 for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) { 631 psta = pDM_Odm->pODM_StaInfo[i]; 632 if (IS_STA_VALID(psta)) { 633 if (IS_MCAST(psta->hwaddr)) /* if (psta->mac_id == 1) */ 634 continue; 635 636 if (psta->rssi_stat.UndecoratedSmoothedPWDB == (-1)) 637 continue; 638 639 if (psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB) 640 tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; 641 642 if (psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB) 643 tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; 644 645 if (psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)) 646 PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16)); 647 } 648 } 649 650 /* printk("%s ==> sta_cnt(%d)\n", __func__, sta_cnt); */ 651 652 for (i = 0; i < sta_cnt; i++) { 653 if (PWDB_rssi[i] != (0)) { 654 if (pHalData->fw_ractrl == true)/* Report every sta's RSSI to FW */ 655 rtl8723b_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i])); 656 } 657 } 658 } 659 660 661 662 if (tmpEntryMaxPWDB != 0) /* If associated entry is found */ 663 pdmpriv->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB; 664 else 665 pdmpriv->EntryMaxUndecoratedSmoothedPWDB = 0; 666 667 if (tmpEntryMinPWDB != 0xff) /* If associated entry is found */ 668 pdmpriv->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB; 669 else 670 pdmpriv->EntryMinUndecoratedSmoothedPWDB = 0; 671 672 FindMinimumRSSI(Adapter);/* get pdmpriv->MinUndecoratedPWDBForDM */ 673 674 pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM; 675 /* ODM_CmnInfoUpdate(&pHalData->odmpriv , ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM); */ 676 } 677 678 static void odm_RSSIMonitorCheck(struct dm_odm_t *pDM_Odm) 679 { 680 if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR)) 681 return; 682 683 odm_RSSIMonitorCheckCE(pDM_Odm); 684 685 } /* odm_RSSIMonitorCheck */ 686 687 /* 3 ============================================================ */ 688 /* 3 SW Antenna Diversity */ 689 /* 3 ============================================================ */ 690 static void odm_SwAntDetectInit(struct dm_odm_t *pDM_Odm) 691 { 692 struct swat_t *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; 693 694 pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = rtw_read32(pDM_Odm->Adapter, rDPDT_control); 695 pDM_SWAT_Table->PreAntenna = MAIN_ANT; 696 pDM_SWAT_Table->CurAntenna = MAIN_ANT; 697 pDM_SWAT_Table->SWAS_NoLink_State = 0; 698 } 699 700 /* 3 ============================================================ */ 701 /* 3 Tx Power Tracking */ 702 /* 3 ============================================================ */ 703 704 static u8 getSwingIndex(struct dm_odm_t *pDM_Odm) 705 { 706 struct adapter *Adapter = pDM_Odm->Adapter; 707 u8 i = 0; 708 u32 bbSwing; 709 u32 swingTableSize; 710 u32 *pSwingTable; 711 712 bbSwing = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, 0xFFC00000); 713 714 pSwingTable = OFDMSwingTable_New; 715 swingTableSize = OFDM_TABLE_SIZE; 716 717 for (i = 0; i < swingTableSize; ++i) { 718 u32 tableValue = pSwingTable[i]; 719 720 if (tableValue >= 0x100000) 721 tableValue >>= 22; 722 if (bbSwing == tableValue) 723 break; 724 } 725 return i; 726 } 727 728 void odm_TXPowerTrackingInit(struct dm_odm_t *pDM_Odm) 729 { 730 u8 defaultSwingIndex = getSwingIndex(pDM_Odm); 731 u8 p = 0; 732 struct adapter *Adapter = pDM_Odm->Adapter; 733 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter); 734 735 736 struct dm_priv *pdmpriv = &pHalData->dmpriv; 737 738 pdmpriv->bTXPowerTracking = true; 739 pdmpriv->TXPowercount = 0; 740 pdmpriv->bTXPowerTrackingInit = false; 741 742 if (*(pDM_Odm->mp_mode) != 1) 743 pdmpriv->TxPowerTrackControl = true; 744 else 745 pdmpriv->TxPowerTrackControl = false; 746 747 /* pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = true; */ 748 pDM_Odm->RFCalibrateInfo.ThermalValue = pHalData->EEPROMThermalMeter; 749 pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = pHalData->EEPROMThermalMeter; 750 pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = pHalData->EEPROMThermalMeter; 751 752 /* The index of "0 dB" in SwingTable. */ 753 pDM_Odm->DefaultOfdmIndex = (defaultSwingIndex >= OFDM_TABLE_SIZE) ? 30 : defaultSwingIndex; 754 pDM_Odm->DefaultCckIndex = 20; 755 756 pDM_Odm->BbSwingIdxCckBase = pDM_Odm->DefaultCckIndex; 757 pDM_Odm->RFCalibrateInfo.CCK_index = pDM_Odm->DefaultCckIndex; 758 759 for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p) { 760 pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->DefaultOfdmIndex; 761 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->DefaultOfdmIndex; 762 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = 0; 763 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = 0; 764 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0; 765 } 766 767 } 768 769 void ODM_TXPowerTrackingCheck(struct dm_odm_t *pDM_Odm) 770 { 771 struct adapter *Adapter = pDM_Odm->Adapter; 772 773 if (!(pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK)) 774 return; 775 776 if (!pDM_Odm->RFCalibrateInfo.TM_Trigger) { /* at least delay 1 sec */ 777 PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_T_METER_NEW, (BIT17 | BIT16), 0x03); 778 779 pDM_Odm->RFCalibrateInfo.TM_Trigger = 1; 780 return; 781 } else { 782 ODM_TXPowerTrackingCallback_ThermalMeter(Adapter); 783 pDM_Odm->RFCalibrateInfo.TM_Trigger = 0; 784 } 785 } 786 787 /* */ 788 /* 3 Export Interface */ 789 /* */ 790 791 /* */ 792 /* 2011/09/21 MH Add to describe different team necessary resource allocate?? */ 793 /* */ 794 void ODM_DMInit(struct dm_odm_t *pDM_Odm) 795 { 796 797 odm_CommonInfoSelfInit(pDM_Odm); 798 odm_CmnInfoInit_Debug(pDM_Odm); 799 odm_DIGInit(pDM_Odm); 800 odm_NHMCounterStatisticsInit(pDM_Odm); 801 odm_AdaptivityInit(pDM_Odm); 802 odm_RateAdaptiveMaskInit(pDM_Odm); 803 ODM_CfoTrackingInit(pDM_Odm); 804 ODM_EdcaTurboInit(pDM_Odm); 805 odm_RSSIMonitorInit(pDM_Odm); 806 odm_TXPowerTrackingInit(pDM_Odm); 807 808 ODM_ClearTxPowerTrackingState(pDM_Odm); 809 810 if (*(pDM_Odm->mp_mode) != 1) 811 odm_PathDiversityInit(pDM_Odm); 812 813 odm_DynamicBBPowerSavingInit(pDM_Odm); 814 odm_DynamicTxPowerInit(pDM_Odm); 815 816 odm_SwAntDetectInit(pDM_Odm); 817 } 818 819 /* */ 820 /* 2011/09/20 MH This is the entry pointer for all team to execute HW out source DM. */ 821 /* You can not add any dummy function here, be care, you can only use DM structure */ 822 /* to perform any new ODM_DM. */ 823 /* */ 824 void ODM_DMWatchdog(struct dm_odm_t *pDM_Odm) 825 { 826 odm_CommonInfoSelfUpdate(pDM_Odm); 827 odm_BasicDbgMessage(pDM_Odm); 828 odm_FalseAlarmCounterStatistics(pDM_Odm); 829 odm_NHMCounterStatistics(pDM_Odm); 830 831 odm_RSSIMonitorCheck(pDM_Odm); 832 833 /* For CE Platform(SPRD or Tablet) */ 834 /* 8723A or 8189ES platform */ 835 /* NeilChen--2012--08--24-- */ 836 /* Fix Leave LPS issue */ 837 if ((adapter_to_pwrctl(pDM_Odm->Adapter)->pwr_mode != PS_MODE_ACTIVE) /* in LPS mode */ 838 /* */ 839 /* (pDM_Odm->SupportICType & (ODM_RTL8723A))|| */ 840 /* (pDM_Odm->SupportICType & (ODM_RTL8188E) &&(&&(((pDM_Odm->SupportInterface == ODM_ITRF_SDIO))) */ 841 /* */ 842 ) { 843 odm_DIGbyRSSI_LPS(pDM_Odm); 844 } else 845 odm_DIG(pDM_Odm); 846 847 { 848 struct dig_t *pDM_DigTable = &pDM_Odm->DM_DigTable; 849 850 odm_Adaptivity(pDM_Odm, pDM_DigTable->CurIGValue); 851 } 852 odm_CCKPacketDetectionThresh(pDM_Odm); 853 854 if (*(pDM_Odm->pbPowerSaving) == true) 855 return; 856 857 858 odm_RefreshRateAdaptiveMask(pDM_Odm); 859 odm_EdcaTurboCheck(pDM_Odm); 860 odm_PathDiversity(pDM_Odm); 861 ODM_CfoTracking(pDM_Odm); 862 863 ODM_TXPowerTrackingCheck(pDM_Odm); 864 865 /* odm_EdcaTurboCheck(pDM_Odm); */ 866 867 /* 2010.05.30 LukeLee: For CE platform, files in IC subfolders may not be included to be compiled, */ 868 /* so compile flags must be left here to prevent from compile errors */ 869 pDM_Odm->PhyDbgInfo.NumQryBeaconPkt = 0; 870 } 871 872 873 /* */ 874 /* Init /.. Fixed HW value. Only init time. */ 875 /* */ 876 void ODM_CmnInfoInit(struct dm_odm_t *pDM_Odm, enum odm_cmninfo_e CmnInfo, u32 Value) 877 { 878 /* */ 879 /* This section is used for init value */ 880 /* */ 881 switch (CmnInfo) { 882 /* */ 883 /* Fixed ODM value. */ 884 /* */ 885 case ODM_CMNINFO_ABILITY: 886 pDM_Odm->SupportAbility = (u32)Value; 887 break; 888 889 case ODM_CMNINFO_RF_TYPE: 890 pDM_Odm->RFType = (u8)Value; 891 break; 892 893 case ODM_CMNINFO_PLATFORM: 894 pDM_Odm->SupportPlatform = (u8)Value; 895 break; 896 897 case ODM_CMNINFO_INTERFACE: 898 pDM_Odm->SupportInterface = (u8)Value; 899 break; 900 901 case ODM_CMNINFO_MP_TEST_CHIP: 902 pDM_Odm->bIsMPChip = (u8)Value; 903 break; 904 905 case ODM_CMNINFO_IC_TYPE: 906 pDM_Odm->SupportICType = Value; 907 break; 908 909 case ODM_CMNINFO_CUT_VER: 910 pDM_Odm->CutVersion = (u8)Value; 911 break; 912 913 case ODM_CMNINFO_FAB_VER: 914 pDM_Odm->FabVersion = (u8)Value; 915 break; 916 917 case ODM_CMNINFO_RFE_TYPE: 918 pDM_Odm->RFEType = (u8)Value; 919 break; 920 921 case ODM_CMNINFO_RF_ANTENNA_TYPE: 922 pDM_Odm->AntDivType = (u8)Value; 923 break; 924 925 case ODM_CMNINFO_BOARD_TYPE: 926 pDM_Odm->BoardType = (u8)Value; 927 break; 928 929 case ODM_CMNINFO_PACKAGE_TYPE: 930 pDM_Odm->PackageType = (u8)Value; 931 break; 932 933 case ODM_CMNINFO_EXT_LNA: 934 pDM_Odm->ExtLNA = (u8)Value; 935 break; 936 937 case ODM_CMNINFO_5G_EXT_LNA: 938 pDM_Odm->ExtLNA5G = (u8)Value; 939 break; 940 941 case ODM_CMNINFO_EXT_PA: 942 pDM_Odm->ExtPA = (u8)Value; 943 break; 944 945 case ODM_CMNINFO_5G_EXT_PA: 946 pDM_Odm->ExtPA5G = (u8)Value; 947 break; 948 949 case ODM_CMNINFO_GPA: 950 pDM_Odm->TypeGPA = (enum odm_type_gpa_e)Value; 951 break; 952 case ODM_CMNINFO_APA: 953 pDM_Odm->TypeAPA = (enum odm_type_apa_e)Value; 954 break; 955 case ODM_CMNINFO_GLNA: 956 pDM_Odm->TypeGLNA = (enum odm_type_glna_e)Value; 957 break; 958 case ODM_CMNINFO_ALNA: 959 pDM_Odm->TypeALNA = (enum odm_type_alna_e)Value; 960 break; 961 962 case ODM_CMNINFO_EXT_TRSW: 963 pDM_Odm->ExtTRSW = (u8)Value; 964 break; 965 case ODM_CMNINFO_PATCH_ID: 966 pDM_Odm->PatchID = (u8)Value; 967 break; 968 case ODM_CMNINFO_BINHCT_TEST: 969 pDM_Odm->bInHctTest = (bool)Value; 970 break; 971 case ODM_CMNINFO_BWIFI_TEST: 972 pDM_Odm->bWIFITest = (bool)Value; 973 break; 974 975 case ODM_CMNINFO_SMART_CONCURRENT: 976 pDM_Odm->bDualMacSmartConcurrent = (bool)Value; 977 break; 978 979 /* To remove the compiler warning, must add an empty default statement to handle the other values. */ 980 default: 981 /* do nothing */ 982 break; 983 } 984 985 } 986 987 988 void ODM_CmnInfoHook(struct dm_odm_t *pDM_Odm, enum odm_cmninfo_e CmnInfo, void *pValue) 989 { 990 /* */ 991 /* Hook call by reference pointer. */ 992 /* */ 993 switch (CmnInfo) { 994 /* */ 995 /* Dynamic call by reference pointer. */ 996 /* */ 997 case ODM_CMNINFO_MAC_PHY_MODE: 998 pDM_Odm->pMacPhyMode = pValue; 999 break; 1000 1001 case ODM_CMNINFO_TX_UNI: 1002 pDM_Odm->pNumTxBytesUnicast = pValue; 1003 break; 1004 1005 case ODM_CMNINFO_RX_UNI: 1006 pDM_Odm->pNumRxBytesUnicast = pValue; 1007 break; 1008 1009 case ODM_CMNINFO_WM_MODE: 1010 pDM_Odm->pwirelessmode = pValue; 1011 break; 1012 1013 case ODM_CMNINFO_BAND: 1014 pDM_Odm->pBandType = pValue; 1015 break; 1016 1017 case ODM_CMNINFO_SEC_CHNL_OFFSET: 1018 pDM_Odm->pSecChOffset = pValue; 1019 break; 1020 1021 case ODM_CMNINFO_SEC_MODE: 1022 pDM_Odm->pSecurity = pValue; 1023 break; 1024 1025 case ODM_CMNINFO_BW: 1026 pDM_Odm->pBandWidth = pValue; 1027 break; 1028 1029 case ODM_CMNINFO_CHNL: 1030 pDM_Odm->pChannel = pValue; 1031 break; 1032 1033 case ODM_CMNINFO_DMSP_GET_VALUE: 1034 pDM_Odm->pbGetValueFromOtherMac = pValue; 1035 break; 1036 1037 case ODM_CMNINFO_BUDDY_ADAPTOR: 1038 pDM_Odm->pBuddyAdapter = pValue; 1039 break; 1040 1041 case ODM_CMNINFO_DMSP_IS_MASTER: 1042 pDM_Odm->pbMasterOfDMSP = pValue; 1043 break; 1044 1045 case ODM_CMNINFO_SCAN: 1046 pDM_Odm->pbScanInProcess = pValue; 1047 break; 1048 1049 case ODM_CMNINFO_POWER_SAVING: 1050 pDM_Odm->pbPowerSaving = pValue; 1051 break; 1052 1053 case ODM_CMNINFO_ONE_PATH_CCA: 1054 pDM_Odm->pOnePathCCA = pValue; 1055 break; 1056 1057 case ODM_CMNINFO_DRV_STOP: 1058 pDM_Odm->pbDriverStopped = pValue; 1059 break; 1060 1061 case ODM_CMNINFO_PNP_IN: 1062 pDM_Odm->pbDriverIsGoingToPnpSetPowerSleep = pValue; 1063 break; 1064 1065 case ODM_CMNINFO_INIT_ON: 1066 pDM_Odm->pinit_adpt_in_progress = pValue; 1067 break; 1068 1069 case ODM_CMNINFO_ANT_TEST: 1070 pDM_Odm->pAntennaTest = pValue; 1071 break; 1072 1073 case ODM_CMNINFO_NET_CLOSED: 1074 pDM_Odm->pbNet_closed = pValue; 1075 break; 1076 1077 case ODM_CMNINFO_FORCED_RATE: 1078 pDM_Odm->pForcedDataRate = pValue; 1079 break; 1080 1081 case ODM_CMNINFO_FORCED_IGI_LB: 1082 pDM_Odm->pu1ForcedIgiLb = pValue; 1083 break; 1084 1085 case ODM_CMNINFO_MP_MODE: 1086 pDM_Odm->mp_mode = pValue; 1087 break; 1088 1089 /* case ODM_CMNINFO_RTSTA_AID: */ 1090 /* pDM_Odm->pAidMap = (u8 *)pValue; */ 1091 /* break; */ 1092 1093 /* case ODM_CMNINFO_BT_COEXIST: */ 1094 /* pDM_Odm->BTCoexist = (bool *)pValue; */ 1095 1096 /* case ODM_CMNINFO_STA_STATUS: */ 1097 /* pDM_Odm->pODM_StaInfo[] = (PSTA_INFO_T)pValue; */ 1098 /* break; */ 1099 1100 /* case ODM_CMNINFO_PHY_STATUS: */ 1101 /* pDM_Odm->pPhyInfo = (ODM_PHY_INFO *)pValue; */ 1102 /* break; */ 1103 1104 /* case ODM_CMNINFO_MAC_STATUS: */ 1105 /* pDM_Odm->pMacInfo = (struct odm_mac_status_info *)pValue; */ 1106 /* break; */ 1107 /* To remove the compiler warning, must add an empty default statement to handle the other values. */ 1108 default: 1109 /* do nothing */ 1110 break; 1111 } 1112 1113 } 1114 1115 1116 void ODM_CmnInfoPtrArrayHook( 1117 struct dm_odm_t *pDM_Odm, 1118 enum odm_cmninfo_e CmnInfo, 1119 u16 Index, 1120 void *pValue 1121 ) 1122 { 1123 /* */ 1124 /* Hook call by reference pointer. */ 1125 /* */ 1126 switch (CmnInfo) { 1127 /* */ 1128 /* Dynamic call by reference pointer. */ 1129 /* */ 1130 case ODM_CMNINFO_STA_STATUS: 1131 pDM_Odm->pODM_StaInfo[Index] = (PSTA_INFO_T)pValue; 1132 break; 1133 /* To remove the compiler warning, must add an empty default statement to handle the other values. */ 1134 default: 1135 /* do nothing */ 1136 break; 1137 } 1138 1139 } 1140 1141 1142 /* */ 1143 /* Update Band/CHannel/.. The values are dynamic but non-per-packet. */ 1144 /* */ 1145 void ODM_CmnInfoUpdate(struct dm_odm_t *pDM_Odm, u32 CmnInfo, u64 Value) 1146 { 1147 /* */ 1148 /* This init variable may be changed in run time. */ 1149 /* */ 1150 switch (CmnInfo) { 1151 case ODM_CMNINFO_LINK_IN_PROGRESS: 1152 pDM_Odm->bLinkInProcess = (bool)Value; 1153 break; 1154 1155 case ODM_CMNINFO_ABILITY: 1156 pDM_Odm->SupportAbility = (u32)Value; 1157 break; 1158 1159 case ODM_CMNINFO_RF_TYPE: 1160 pDM_Odm->RFType = (u8)Value; 1161 break; 1162 1163 case ODM_CMNINFO_WIFI_DIRECT: 1164 pDM_Odm->bWIFI_Direct = (bool)Value; 1165 break; 1166 1167 case ODM_CMNINFO_WIFI_DISPLAY: 1168 pDM_Odm->bWIFI_Display = (bool)Value; 1169 break; 1170 1171 case ODM_CMNINFO_LINK: 1172 pDM_Odm->bLinked = (bool)Value; 1173 break; 1174 1175 case ODM_CMNINFO_STATION_STATE: 1176 pDM_Odm->bsta_state = (bool)Value; 1177 break; 1178 1179 case ODM_CMNINFO_RSSI_MIN: 1180 pDM_Odm->RSSI_Min = (u8)Value; 1181 break; 1182 1183 case ODM_CMNINFO_DBG_COMP: 1184 pDM_Odm->DebugComponents = Value; 1185 break; 1186 1187 case ODM_CMNINFO_DBG_LEVEL: 1188 pDM_Odm->DebugLevel = (u32)Value; 1189 break; 1190 case ODM_CMNINFO_RA_THRESHOLD_HIGH: 1191 pDM_Odm->RateAdaptive.HighRSSIThresh = (u8)Value; 1192 break; 1193 1194 case ODM_CMNINFO_RA_THRESHOLD_LOW: 1195 pDM_Odm->RateAdaptive.LowRSSIThresh = (u8)Value; 1196 break; 1197 /* The following is for BT HS mode and BT coexist mechanism. */ 1198 case ODM_CMNINFO_BT_ENABLED: 1199 pDM_Odm->bBtEnabled = (bool)Value; 1200 break; 1201 1202 case ODM_CMNINFO_BT_HS_CONNECT_PROCESS: 1203 pDM_Odm->bBtConnectProcess = (bool)Value; 1204 break; 1205 1206 case ODM_CMNINFO_BT_HS_RSSI: 1207 pDM_Odm->btHsRssi = (u8)Value; 1208 break; 1209 1210 case ODM_CMNINFO_BT_OPERATION: 1211 pDM_Odm->bBtHsOperation = (bool)Value; 1212 break; 1213 1214 case ODM_CMNINFO_BT_LIMITED_DIG: 1215 pDM_Odm->bBtLimitedDig = (bool)Value; 1216 break; 1217 1218 case ODM_CMNINFO_BT_DISABLE_EDCA: 1219 pDM_Odm->bBtDisableEdcaTurbo = (bool)Value; 1220 break; 1221 1222 /* 1223 case ODM_CMNINFO_OP_MODE: 1224 pDM_Odm->OPMode = (u8)Value; 1225 break; 1226 1227 case ODM_CMNINFO_WM_MODE: 1228 pDM_Odm->WirelessMode = (u8)Value; 1229 break; 1230 1231 case ODM_CMNINFO_BAND: 1232 pDM_Odm->BandType = (u8)Value; 1233 break; 1234 1235 case ODM_CMNINFO_SEC_CHNL_OFFSET: 1236 pDM_Odm->SecChOffset = (u8)Value; 1237 break; 1238 1239 case ODM_CMNINFO_SEC_MODE: 1240 pDM_Odm->Security = (u8)Value; 1241 break; 1242 1243 case ODM_CMNINFO_BW: 1244 pDM_Odm->BandWidth = (u8)Value; 1245 break; 1246 1247 case ODM_CMNINFO_CHNL: 1248 pDM_Odm->Channel = (u8)Value; 1249 break; 1250 */ 1251 default: 1252 /* do nothing */ 1253 break; 1254 } 1255 1256 1257 } 1258 1259 /* 3 ============================================================ */ 1260 /* 3 DIG */ 1261 /* 3 ============================================================ */ 1262 /*----------------------------------------------------------------------------- 1263 * Function: odm_DIGInit() 1264 * 1265 * Overview: Set DIG scheme init value. 1266 * 1267 * Input: NONE 1268 * 1269 * Output: NONE 1270 * 1271 * Return: NONE 1272 * 1273 * Revised History: 1274 *When Who Remark 1275 * 1276 *--------------------------------------------------------------------------- 1277 */ 1278 1279 /* Remove DIG by yuchen */ 1280 1281 /* Remove DIG and FA check by Yu Chen */ 1282 1283 /* 3 ============================================================ */ 1284 /* 3 BB Power Save */ 1285 /* 3 ============================================================ */ 1286 1287 /* Remove BB power saving by Yuchen */ 1288 1289 /* 3 ============================================================ */ 1290 /* 3 Dynamic Tx Power */ 1291 /* 3 ============================================================ */ 1292 1293 /* Remove BY YuChen */ 1294 1295