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 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_CmnInfoInit_Debug ==>\n")); 327 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportPlatform =%d\n", pDM_Odm->SupportPlatform)); 328 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportAbility = 0x%x\n", pDM_Odm->SupportAbility)); 329 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportInterface =%d\n", pDM_Odm->SupportInterface)); 330 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("SupportICType = 0x%x\n", pDM_Odm->SupportICType)); 331 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("CutVersion =%d\n", pDM_Odm->CutVersion)); 332 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("FabVersion =%d\n", pDM_Odm->FabVersion)); 333 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("RFType =%d\n", pDM_Odm->RFType)); 334 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("BoardType =%d\n", pDM_Odm->BoardType)); 335 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("ExtLNA =%d\n", pDM_Odm->ExtLNA)); 336 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("ExtPA =%d\n", pDM_Odm->ExtPA)); 337 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("ExtTRSW =%d\n", pDM_Odm->ExtTRSW)); 338 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("PatchID =%d\n", pDM_Odm->PatchID)); 339 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("bInHctTest =%d\n", pDM_Odm->bInHctTest)); 340 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("bWIFITest =%d\n", pDM_Odm->bWIFITest)); 341 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("bDualMacSmartConcurrent =%d\n", pDM_Odm->bDualMacSmartConcurrent)); 342 343 } 344 345 static void odm_BasicDbgMessage(struct dm_odm_t *pDM_Odm) 346 { 347 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("odm_BasicDbgMsg ==>\n")); 348 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("bLinked = %d, RSSI_Min = %d,\n", 349 pDM_Odm->bLinked, pDM_Odm->RSSI_Min)); 350 ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("RxRate = 0x%x, RSSI_A = %d, RSSI_B = %d\n", 351 pDM_Odm->RxRate, pDM_Odm->RSSI_A, pDM_Odm->RSSI_B)); 352 } 353 354 /* 3 ============================================================ */ 355 /* 3 RATR MASK */ 356 /* 3 ============================================================ */ 357 /* 3 ============================================================ */ 358 /* 3 Rate Adaptive */ 359 /* 3 ============================================================ */ 360 361 static void odm_RateAdaptiveMaskInit(struct dm_odm_t *pDM_Odm) 362 { 363 struct odm_rate_adaptive *pOdmRA = &pDM_Odm->RateAdaptive; 364 365 pOdmRA->Type = DM_Type_ByDriver; 366 if (pOdmRA->Type == DM_Type_ByDriver) 367 pDM_Odm->bUseRAMask = true; 368 else 369 pDM_Odm->bUseRAMask = false; 370 371 pOdmRA->RATRState = DM_RATR_STA_INIT; 372 pOdmRA->LdpcThres = 35; 373 pOdmRA->bUseLdpc = false; 374 pOdmRA->HighRSSIThresh = 50; 375 pOdmRA->LowRSSIThresh = 20; 376 } 377 378 u32 ODM_Get_Rate_Bitmap( 379 struct dm_odm_t *pDM_Odm, 380 u32 macid, 381 u32 ra_mask, 382 u8 rssi_level 383 ) 384 { 385 PSTA_INFO_T pEntry; 386 u32 rate_bitmap = 0; 387 u8 WirelessMode; 388 389 pEntry = pDM_Odm->pODM_StaInfo[macid]; 390 if (!IS_STA_VALID(pEntry)) 391 return ra_mask; 392 393 WirelessMode = pEntry->wireless_mode; 394 395 switch (WirelessMode) { 396 case ODM_WM_B: 397 if (ra_mask & 0x0000000c) /* 11M or 5.5M enable */ 398 rate_bitmap = 0x0000000d; 399 else 400 rate_bitmap = 0x0000000f; 401 break; 402 403 case (ODM_WM_G): 404 case (ODM_WM_A): 405 if (rssi_level == DM_RATR_STA_HIGH) 406 rate_bitmap = 0x00000f00; 407 else 408 rate_bitmap = 0x00000ff0; 409 break; 410 411 case (ODM_WM_B|ODM_WM_G): 412 if (rssi_level == DM_RATR_STA_HIGH) 413 rate_bitmap = 0x00000f00; 414 else if (rssi_level == DM_RATR_STA_MIDDLE) 415 rate_bitmap = 0x00000ff0; 416 else 417 rate_bitmap = 0x00000ff5; 418 break; 419 420 case (ODM_WM_B|ODM_WM_G|ODM_WM_N24G): 421 case (ODM_WM_B|ODM_WM_N24G): 422 case (ODM_WM_G|ODM_WM_N24G): 423 case (ODM_WM_A|ODM_WM_N5G): 424 if (pDM_Odm->RFType == ODM_1T2R || pDM_Odm->RFType == ODM_1T1R) { 425 if (rssi_level == DM_RATR_STA_HIGH) 426 rate_bitmap = 0x000f0000; 427 else if (rssi_level == DM_RATR_STA_MIDDLE) 428 rate_bitmap = 0x000ff000; 429 else { 430 if (*(pDM_Odm->pBandWidth) == ODM_BW40M) 431 rate_bitmap = 0x000ff015; 432 else 433 rate_bitmap = 0x000ff005; 434 } 435 } else { 436 if (rssi_level == DM_RATR_STA_HIGH) 437 rate_bitmap = 0x0f8f0000; 438 else if (rssi_level == DM_RATR_STA_MIDDLE) 439 rate_bitmap = 0x0f8ff000; 440 else { 441 if (*(pDM_Odm->pBandWidth) == ODM_BW40M) 442 rate_bitmap = 0x0f8ff015; 443 else 444 rate_bitmap = 0x0f8ff005; 445 } 446 } 447 break; 448 449 case (ODM_WM_AC|ODM_WM_G): 450 if (rssi_level == 1) 451 rate_bitmap = 0xfc3f0000; 452 else if (rssi_level == 2) 453 rate_bitmap = 0xfffff000; 454 else 455 rate_bitmap = 0xffffffff; 456 break; 457 458 case (ODM_WM_AC|ODM_WM_A): 459 460 if (pDM_Odm->RFType == RF_1T1R) { 461 if (rssi_level == 1) /* add by Gary for ac-series */ 462 rate_bitmap = 0x003f8000; 463 else if (rssi_level == 2) 464 rate_bitmap = 0x003ff000; 465 else 466 rate_bitmap = 0x003ff010; 467 } else { 468 if (rssi_level == 1) /* add by Gary for ac-series */ 469 rate_bitmap = 0xfe3f8000; /* VHT 2SS MCS3~9 */ 470 else if (rssi_level == 2) 471 rate_bitmap = 0xfffff000; /* VHT 2SS MCS0~9 */ 472 else 473 rate_bitmap = 0xfffff010; /* All */ 474 } 475 break; 476 477 default: 478 if (pDM_Odm->RFType == RF_1T2R) 479 rate_bitmap = 0x000fffff; 480 else 481 rate_bitmap = 0x0fffffff; 482 break; 483 } 484 485 /* printk("%s ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%08x\n", __func__, rssi_level, WirelessMode, rate_bitmap); */ 486 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (" ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%08x\n", rssi_level, WirelessMode, rate_bitmap)); 487 488 return ra_mask & rate_bitmap; 489 490 } 491 492 static void odm_RefreshRateAdaptiveMaskCE(struct dm_odm_t *pDM_Odm) 493 { 494 u8 i; 495 struct adapter *padapter = pDM_Odm->Adapter; 496 497 if (padapter->bDriverStopped) { 498 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\n")); 499 return; 500 } 501 502 if (!pDM_Odm->bUseRAMask) { 503 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n")); 504 return; 505 } 506 507 for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) { 508 PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i]; 509 510 if (IS_STA_VALID(pstat)) { 511 if (IS_MCAST(pstat->hwaddr)) /* if (psta->mac_id == 1) */ 512 continue; 513 514 if (true == ODM_RAStateCheck(pDM_Odm, pstat->rssi_stat.UndecoratedSmoothedPWDB, false, &pstat->rssi_level)) { 515 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi_stat.UndecoratedSmoothedPWDB, pstat->rssi_level)); 516 /* printk("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi_stat.UndecoratedSmoothedPWDB, pstat->rssi_level); */ 517 rtw_hal_update_ra_mask(pstat, pstat->rssi_level); 518 } 519 520 } 521 } 522 } 523 524 /*----------------------------------------------------------------------------- 525 * Function: odm_RefreshRateAdaptiveMask() 526 * 527 * Overview: Update rate table mask according to rssi 528 * 529 * Input: NONE 530 * 531 * Output: NONE 532 * 533 * Return: NONE 534 * 535 * Revised History: 536 *When Who Remark 537 *05/27/2009 hpfan Create Version 0. 538 * 539 * -------------------------------------------------------------------------- 540 */ 541 static void odm_RefreshRateAdaptiveMask(struct dm_odm_t *pDM_Odm) 542 { 543 544 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("odm_RefreshRateAdaptiveMask()---------->\n")); 545 if (!(pDM_Odm->SupportAbility & ODM_BB_RA_MASK)) { 546 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("odm_RefreshRateAdaptiveMask(): Return cos not supported\n")); 547 return; 548 } 549 odm_RefreshRateAdaptiveMaskCE(pDM_Odm); 550 } 551 552 /* Return Value: bool */ 553 /* - true: RATRState is changed. */ 554 bool ODM_RAStateCheck( 555 struct dm_odm_t *pDM_Odm, 556 s32 RSSI, 557 bool bForceUpdate, 558 u8 *pRATRState 559 ) 560 { 561 struct odm_rate_adaptive *pRA = &pDM_Odm->RateAdaptive; 562 const u8 GoUpGap = 5; 563 u8 HighRSSIThreshForRA = pRA->HighRSSIThresh; 564 u8 LowRSSIThreshForRA = pRA->LowRSSIThresh; 565 u8 RATRState; 566 567 /* Threshold Adjustment: */ 568 /* when RSSI state trends to go up one or two levels, make sure RSSI is high enough. */ 569 /* Here GoUpGap is added to solve the boundary's level alternation issue. */ 570 switch (*pRATRState) { 571 case DM_RATR_STA_INIT: 572 case DM_RATR_STA_HIGH: 573 break; 574 575 case DM_RATR_STA_MIDDLE: 576 HighRSSIThreshForRA += GoUpGap; 577 break; 578 579 case DM_RATR_STA_LOW: 580 HighRSSIThreshForRA += GoUpGap; 581 LowRSSIThreshForRA += GoUpGap; 582 break; 583 584 default: 585 ODM_RT_ASSERT(pDM_Odm, false, ("wrong rssi level setting %d !", *pRATRState)); 586 break; 587 } 588 589 /* Decide RATRState by RSSI. */ 590 if (RSSI > HighRSSIThreshForRA) 591 RATRState = DM_RATR_STA_HIGH; 592 else if (RSSI > LowRSSIThreshForRA) 593 RATRState = DM_RATR_STA_MIDDLE; 594 else 595 RATRState = DM_RATR_STA_LOW; 596 /* printk("==>%s, RATRState:0x%02x , RSSI:%d\n", __func__, RATRState, RSSI); */ 597 598 if (*pRATRState != RATRState || bForceUpdate) { 599 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI Level %d -> %d\n", *pRATRState, RATRState)); 600 *pRATRState = RATRState; 601 return true; 602 } 603 604 return false; 605 } 606 607 /* */ 608 609 /* 3 ============================================================ */ 610 /* 3 RSSI Monitor */ 611 /* 3 ============================================================ */ 612 613 static void odm_RSSIMonitorInit(struct dm_odm_t *pDM_Odm) 614 { 615 struct ra_t *pRA_Table = &pDM_Odm->DM_RA_Table; 616 617 pRA_Table->firstconnect = false; 618 619 } 620 621 static void FindMinimumRSSI(struct adapter *padapter) 622 { 623 struct hal_com_data *pHalData = GET_HAL_DATA(padapter); 624 struct dm_priv *pdmpriv = &pHalData->dmpriv; 625 struct dm_odm_t *pDM_Odm = &pHalData->odmpriv; 626 627 /* 1 1.Determine the minimum RSSI */ 628 629 if ( 630 (pDM_Odm->bLinked != true) && 631 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0) 632 ) { 633 pdmpriv->MinUndecoratedPWDBForDM = 0; 634 /* ODM_RT_TRACE(pDM_Odm, COMP_BB_POWERSAVING, DBG_LOUD, ("Not connected to any\n")); */ 635 } else 636 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB; 637 638 /* ODM_RT_TRACE(pDM_Odm, COMP_DIG, DBG_LOUD, ("MinUndecoratedPWDBForDM =%d\n", pHalData->MinUndecoratedPWDBForDM)); */ 639 } 640 641 static void odm_RSSIMonitorCheckCE(struct dm_odm_t *pDM_Odm) 642 { 643 struct adapter *Adapter = pDM_Odm->Adapter; 644 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter); 645 struct dm_priv *pdmpriv = &pHalData->dmpriv; 646 int i; 647 int tmpEntryMaxPWDB = 0, tmpEntryMinPWDB = 0xff; 648 u8 sta_cnt = 0; 649 u32 PWDB_rssi[NUM_STA] = {0};/* 0~15]:MACID, [16~31]:PWDB_rssi */ 650 struct ra_t *pRA_Table = &pDM_Odm->DM_RA_Table; 651 652 if (pDM_Odm->bLinked != true) 653 return; 654 655 pRA_Table->firstconnect = pDM_Odm->bLinked; 656 657 /* if (check_fwstate(&Adapter->mlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == true) */ 658 { 659 struct sta_info *psta; 660 661 for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) { 662 psta = pDM_Odm->pODM_StaInfo[i]; 663 if (IS_STA_VALID(psta)) { 664 if (IS_MCAST(psta->hwaddr)) /* if (psta->mac_id == 1) */ 665 continue; 666 667 if (psta->rssi_stat.UndecoratedSmoothedPWDB == (-1)) 668 continue; 669 670 if (psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB) 671 tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; 672 673 if (psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB) 674 tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; 675 676 if (psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)) 677 PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16)); 678 } 679 } 680 681 /* printk("%s ==> sta_cnt(%d)\n", __func__, sta_cnt); */ 682 683 for (i = 0; i < sta_cnt; i++) { 684 if (PWDB_rssi[i] != (0)) { 685 if (pHalData->fw_ractrl == true)/* Report every sta's RSSI to FW */ 686 rtl8723b_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i])); 687 } 688 } 689 } 690 691 692 693 if (tmpEntryMaxPWDB != 0) /* If associated entry is found */ 694 pdmpriv->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB; 695 else 696 pdmpriv->EntryMaxUndecoratedSmoothedPWDB = 0; 697 698 if (tmpEntryMinPWDB != 0xff) /* If associated entry is found */ 699 pdmpriv->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB; 700 else 701 pdmpriv->EntryMinUndecoratedSmoothedPWDB = 0; 702 703 FindMinimumRSSI(Adapter);/* get pdmpriv->MinUndecoratedPWDBForDM */ 704 705 pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM; 706 /* ODM_CmnInfoUpdate(&pHalData->odmpriv , ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM); */ 707 } 708 709 static void odm_RSSIMonitorCheck(struct dm_odm_t *pDM_Odm) 710 { 711 if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR)) 712 return; 713 714 odm_RSSIMonitorCheckCE(pDM_Odm); 715 716 } /* odm_RSSIMonitorCheck */ 717 718 /* 3 ============================================================ */ 719 /* 3 SW Antenna Diversity */ 720 /* 3 ============================================================ */ 721 static void odm_SwAntDetectInit(struct dm_odm_t *pDM_Odm) 722 { 723 struct swat_t *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; 724 725 pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = rtw_read32(pDM_Odm->Adapter, rDPDT_control); 726 pDM_SWAT_Table->PreAntenna = MAIN_ANT; 727 pDM_SWAT_Table->CurAntenna = MAIN_ANT; 728 pDM_SWAT_Table->SWAS_NoLink_State = 0; 729 } 730 731 /* 3 ============================================================ */ 732 /* 3 Tx Power Tracking */ 733 /* 3 ============================================================ */ 734 735 static u8 getSwingIndex(struct dm_odm_t *pDM_Odm) 736 { 737 struct adapter *Adapter = pDM_Odm->Adapter; 738 u8 i = 0; 739 u32 bbSwing; 740 u32 swingTableSize; 741 u32 *pSwingTable; 742 743 bbSwing = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, 0xFFC00000); 744 745 pSwingTable = OFDMSwingTable_New; 746 swingTableSize = OFDM_TABLE_SIZE; 747 748 for (i = 0; i < swingTableSize; ++i) { 749 u32 tableValue = pSwingTable[i]; 750 751 if (tableValue >= 0x100000) 752 tableValue >>= 22; 753 if (bbSwing == tableValue) 754 break; 755 } 756 return i; 757 } 758 759 void odm_TXPowerTrackingInit(struct dm_odm_t *pDM_Odm) 760 { 761 u8 defaultSwingIndex = getSwingIndex(pDM_Odm); 762 u8 p = 0; 763 struct adapter *Adapter = pDM_Odm->Adapter; 764 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter); 765 766 767 struct dm_priv *pdmpriv = &pHalData->dmpriv; 768 769 pdmpriv->bTXPowerTracking = true; 770 pdmpriv->TXPowercount = 0; 771 pdmpriv->bTXPowerTrackingInit = false; 772 773 if (*(pDM_Odm->mp_mode) != 1) 774 pdmpriv->TxPowerTrackControl = true; 775 else 776 pdmpriv->TxPowerTrackControl = false; 777 778 /* pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = true; */ 779 pDM_Odm->RFCalibrateInfo.ThermalValue = pHalData->EEPROMThermalMeter; 780 pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = pHalData->EEPROMThermalMeter; 781 pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = pHalData->EEPROMThermalMeter; 782 783 /* The index of "0 dB" in SwingTable. */ 784 pDM_Odm->DefaultOfdmIndex = (defaultSwingIndex >= OFDM_TABLE_SIZE) ? 30 : defaultSwingIndex; 785 pDM_Odm->DefaultCckIndex = 20; 786 787 pDM_Odm->BbSwingIdxCckBase = pDM_Odm->DefaultCckIndex; 788 pDM_Odm->RFCalibrateInfo.CCK_index = pDM_Odm->DefaultCckIndex; 789 790 for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p) { 791 pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->DefaultOfdmIndex; 792 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->DefaultOfdmIndex; 793 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = 0; 794 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = 0; 795 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0; 796 } 797 798 } 799 800 void ODM_TXPowerTrackingCheck(struct dm_odm_t *pDM_Odm) 801 { 802 struct adapter *Adapter = pDM_Odm->Adapter; 803 804 if (!(pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK)) 805 return; 806 807 if (!pDM_Odm->RFCalibrateInfo.TM_Trigger) { /* at least delay 1 sec */ 808 PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_T_METER_NEW, (BIT17 | BIT16), 0x03); 809 810 pDM_Odm->RFCalibrateInfo.TM_Trigger = 1; 811 return; 812 } else { 813 ODM_TXPowerTrackingCallback_ThermalMeter(Adapter); 814 pDM_Odm->RFCalibrateInfo.TM_Trigger = 0; 815 } 816 } 817 818 /* */ 819 /* 3 Export Interface */ 820 /* */ 821 822 /* */ 823 /* 2011/09/21 MH Add to describe different team necessary resource allocate?? */ 824 /* */ 825 void ODM_DMInit(struct dm_odm_t *pDM_Odm) 826 { 827 828 odm_CommonInfoSelfInit(pDM_Odm); 829 odm_CmnInfoInit_Debug(pDM_Odm); 830 odm_DIGInit(pDM_Odm); 831 odm_NHMCounterStatisticsInit(pDM_Odm); 832 odm_AdaptivityInit(pDM_Odm); 833 odm_RateAdaptiveMaskInit(pDM_Odm); 834 ODM_CfoTrackingInit(pDM_Odm); 835 ODM_EdcaTurboInit(pDM_Odm); 836 odm_RSSIMonitorInit(pDM_Odm); 837 odm_TXPowerTrackingInit(pDM_Odm); 838 839 ODM_ClearTxPowerTrackingState(pDM_Odm); 840 841 if (*(pDM_Odm->mp_mode) != 1) 842 odm_PathDiversityInit(pDM_Odm); 843 844 odm_DynamicBBPowerSavingInit(pDM_Odm); 845 odm_DynamicTxPowerInit(pDM_Odm); 846 847 odm_SwAntDetectInit(pDM_Odm); 848 } 849 850 /* */ 851 /* 2011/09/20 MH This is the entry pointer for all team to execute HW out source DM. */ 852 /* You can not add any dummy function here, be care, you can only use DM structure */ 853 /* to perform any new ODM_DM. */ 854 /* */ 855 void ODM_DMWatchdog(struct dm_odm_t *pDM_Odm) 856 { 857 odm_CommonInfoSelfUpdate(pDM_Odm); 858 odm_BasicDbgMessage(pDM_Odm); 859 odm_FalseAlarmCounterStatistics(pDM_Odm); 860 odm_NHMCounterStatistics(pDM_Odm); 861 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): RSSI = 0x%x\n", pDM_Odm->RSSI_Min)); 862 863 odm_RSSIMonitorCheck(pDM_Odm); 864 865 /* For CE Platform(SPRD or Tablet) */ 866 /* 8723A or 8189ES platform */ 867 /* NeilChen--2012--08--24-- */ 868 /* Fix Leave LPS issue */ 869 if ((adapter_to_pwrctl(pDM_Odm->Adapter)->pwr_mode != PS_MODE_ACTIVE) /* in LPS mode */ 870 /* */ 871 /* (pDM_Odm->SupportICType & (ODM_RTL8723A))|| */ 872 /* (pDM_Odm->SupportICType & (ODM_RTL8188E) &&(&&(((pDM_Odm->SupportInterface == ODM_ITRF_SDIO))) */ 873 /* */ 874 ) { 875 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("----Step1: odm_DIG is in LPS mode\n")); 876 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("---Step2: 8723AS is in LPS mode\n")); 877 odm_DIGbyRSSI_LPS(pDM_Odm); 878 } else 879 odm_DIG(pDM_Odm); 880 881 { 882 struct dig_t *pDM_DigTable = &pDM_Odm->DM_DigTable; 883 884 odm_Adaptivity(pDM_Odm, pDM_DigTable->CurIGValue); 885 } 886 odm_CCKPacketDetectionThresh(pDM_Odm); 887 888 if (*(pDM_Odm->pbPowerSaving) == true) 889 return; 890 891 892 odm_RefreshRateAdaptiveMask(pDM_Odm); 893 odm_EdcaTurboCheck(pDM_Odm); 894 odm_PathDiversity(pDM_Odm); 895 ODM_CfoTracking(pDM_Odm); 896 897 ODM_TXPowerTrackingCheck(pDM_Odm); 898 899 /* odm_EdcaTurboCheck(pDM_Odm); */ 900 901 /* 2010.05.30 LukeLee: For CE platform, files in IC subfolders may not be included to be compiled, */ 902 /* so compile flags must be left here to prevent from compile errors */ 903 pDM_Odm->PhyDbgInfo.NumQryBeaconPkt = 0; 904 } 905 906 907 /* */ 908 /* Init /.. Fixed HW value. Only init time. */ 909 /* */ 910 void ODM_CmnInfoInit(struct dm_odm_t *pDM_Odm, enum odm_cmninfo_e CmnInfo, u32 Value) 911 { 912 /* */ 913 /* This section is used for init value */ 914 /* */ 915 switch (CmnInfo) { 916 /* */ 917 /* Fixed ODM value. */ 918 /* */ 919 case ODM_CMNINFO_ABILITY: 920 pDM_Odm->SupportAbility = (u32)Value; 921 break; 922 923 case ODM_CMNINFO_RF_TYPE: 924 pDM_Odm->RFType = (u8)Value; 925 break; 926 927 case ODM_CMNINFO_PLATFORM: 928 pDM_Odm->SupportPlatform = (u8)Value; 929 break; 930 931 case ODM_CMNINFO_INTERFACE: 932 pDM_Odm->SupportInterface = (u8)Value; 933 break; 934 935 case ODM_CMNINFO_MP_TEST_CHIP: 936 pDM_Odm->bIsMPChip = (u8)Value; 937 break; 938 939 case ODM_CMNINFO_IC_TYPE: 940 pDM_Odm->SupportICType = Value; 941 break; 942 943 case ODM_CMNINFO_CUT_VER: 944 pDM_Odm->CutVersion = (u8)Value; 945 break; 946 947 case ODM_CMNINFO_FAB_VER: 948 pDM_Odm->FabVersion = (u8)Value; 949 break; 950 951 case ODM_CMNINFO_RFE_TYPE: 952 pDM_Odm->RFEType = (u8)Value; 953 break; 954 955 case ODM_CMNINFO_RF_ANTENNA_TYPE: 956 pDM_Odm->AntDivType = (u8)Value; 957 break; 958 959 case ODM_CMNINFO_BOARD_TYPE: 960 pDM_Odm->BoardType = (u8)Value; 961 break; 962 963 case ODM_CMNINFO_PACKAGE_TYPE: 964 pDM_Odm->PackageType = (u8)Value; 965 break; 966 967 case ODM_CMNINFO_EXT_LNA: 968 pDM_Odm->ExtLNA = (u8)Value; 969 break; 970 971 case ODM_CMNINFO_5G_EXT_LNA: 972 pDM_Odm->ExtLNA5G = (u8)Value; 973 break; 974 975 case ODM_CMNINFO_EXT_PA: 976 pDM_Odm->ExtPA = (u8)Value; 977 break; 978 979 case ODM_CMNINFO_5G_EXT_PA: 980 pDM_Odm->ExtPA5G = (u8)Value; 981 break; 982 983 case ODM_CMNINFO_GPA: 984 pDM_Odm->TypeGPA = (enum odm_type_gpa_e)Value; 985 break; 986 case ODM_CMNINFO_APA: 987 pDM_Odm->TypeAPA = (enum odm_type_apa_e)Value; 988 break; 989 case ODM_CMNINFO_GLNA: 990 pDM_Odm->TypeGLNA = (enum odm_type_glna_e)Value; 991 break; 992 case ODM_CMNINFO_ALNA: 993 pDM_Odm->TypeALNA = (enum odm_type_alna_e)Value; 994 break; 995 996 case ODM_CMNINFO_EXT_TRSW: 997 pDM_Odm->ExtTRSW = (u8)Value; 998 break; 999 case ODM_CMNINFO_PATCH_ID: 1000 pDM_Odm->PatchID = (u8)Value; 1001 break; 1002 case ODM_CMNINFO_BINHCT_TEST: 1003 pDM_Odm->bInHctTest = (bool)Value; 1004 break; 1005 case ODM_CMNINFO_BWIFI_TEST: 1006 pDM_Odm->bWIFITest = (bool)Value; 1007 break; 1008 1009 case ODM_CMNINFO_SMART_CONCURRENT: 1010 pDM_Odm->bDualMacSmartConcurrent = (bool)Value; 1011 break; 1012 1013 /* To remove the compiler warning, must add an empty default statement to handle the other values. */ 1014 default: 1015 /* do nothing */ 1016 break; 1017 } 1018 1019 } 1020 1021 1022 void ODM_CmnInfoHook(struct dm_odm_t *pDM_Odm, enum odm_cmninfo_e CmnInfo, void *pValue) 1023 { 1024 /* */ 1025 /* Hook call by reference pointer. */ 1026 /* */ 1027 switch (CmnInfo) { 1028 /* */ 1029 /* Dynamic call by reference pointer. */ 1030 /* */ 1031 case ODM_CMNINFO_MAC_PHY_MODE: 1032 pDM_Odm->pMacPhyMode = pValue; 1033 break; 1034 1035 case ODM_CMNINFO_TX_UNI: 1036 pDM_Odm->pNumTxBytesUnicast = pValue; 1037 break; 1038 1039 case ODM_CMNINFO_RX_UNI: 1040 pDM_Odm->pNumRxBytesUnicast = pValue; 1041 break; 1042 1043 case ODM_CMNINFO_WM_MODE: 1044 pDM_Odm->pwirelessmode = pValue; 1045 break; 1046 1047 case ODM_CMNINFO_BAND: 1048 pDM_Odm->pBandType = pValue; 1049 break; 1050 1051 case ODM_CMNINFO_SEC_CHNL_OFFSET: 1052 pDM_Odm->pSecChOffset = pValue; 1053 break; 1054 1055 case ODM_CMNINFO_SEC_MODE: 1056 pDM_Odm->pSecurity = pValue; 1057 break; 1058 1059 case ODM_CMNINFO_BW: 1060 pDM_Odm->pBandWidth = pValue; 1061 break; 1062 1063 case ODM_CMNINFO_CHNL: 1064 pDM_Odm->pChannel = pValue; 1065 break; 1066 1067 case ODM_CMNINFO_DMSP_GET_VALUE: 1068 pDM_Odm->pbGetValueFromOtherMac = pValue; 1069 break; 1070 1071 case ODM_CMNINFO_BUDDY_ADAPTOR: 1072 pDM_Odm->pBuddyAdapter = pValue; 1073 break; 1074 1075 case ODM_CMNINFO_DMSP_IS_MASTER: 1076 pDM_Odm->pbMasterOfDMSP = pValue; 1077 break; 1078 1079 case ODM_CMNINFO_SCAN: 1080 pDM_Odm->pbScanInProcess = pValue; 1081 break; 1082 1083 case ODM_CMNINFO_POWER_SAVING: 1084 pDM_Odm->pbPowerSaving = pValue; 1085 break; 1086 1087 case ODM_CMNINFO_ONE_PATH_CCA: 1088 pDM_Odm->pOnePathCCA = pValue; 1089 break; 1090 1091 case ODM_CMNINFO_DRV_STOP: 1092 pDM_Odm->pbDriverStopped = pValue; 1093 break; 1094 1095 case ODM_CMNINFO_PNP_IN: 1096 pDM_Odm->pbDriverIsGoingToPnpSetPowerSleep = pValue; 1097 break; 1098 1099 case ODM_CMNINFO_INIT_ON: 1100 pDM_Odm->pinit_adpt_in_progress = pValue; 1101 break; 1102 1103 case ODM_CMNINFO_ANT_TEST: 1104 pDM_Odm->pAntennaTest = pValue; 1105 break; 1106 1107 case ODM_CMNINFO_NET_CLOSED: 1108 pDM_Odm->pbNet_closed = pValue; 1109 break; 1110 1111 case ODM_CMNINFO_FORCED_RATE: 1112 pDM_Odm->pForcedDataRate = pValue; 1113 break; 1114 1115 case ODM_CMNINFO_FORCED_IGI_LB: 1116 pDM_Odm->pu1ForcedIgiLb = pValue; 1117 break; 1118 1119 case ODM_CMNINFO_MP_MODE: 1120 pDM_Odm->mp_mode = pValue; 1121 break; 1122 1123 /* case ODM_CMNINFO_RTSTA_AID: */ 1124 /* pDM_Odm->pAidMap = (u8 *)pValue; */ 1125 /* break; */ 1126 1127 /* case ODM_CMNINFO_BT_COEXIST: */ 1128 /* pDM_Odm->BTCoexist = (bool *)pValue; */ 1129 1130 /* case ODM_CMNINFO_STA_STATUS: */ 1131 /* pDM_Odm->pODM_StaInfo[] = (PSTA_INFO_T)pValue; */ 1132 /* break; */ 1133 1134 /* case ODM_CMNINFO_PHY_STATUS: */ 1135 /* pDM_Odm->pPhyInfo = (ODM_PHY_INFO *)pValue; */ 1136 /* break; */ 1137 1138 /* case ODM_CMNINFO_MAC_STATUS: */ 1139 /* pDM_Odm->pMacInfo = (struct odm_mac_status_info *)pValue; */ 1140 /* break; */ 1141 /* To remove the compiler warning, must add an empty default statement to handle the other values. */ 1142 default: 1143 /* do nothing */ 1144 break; 1145 } 1146 1147 } 1148 1149 1150 void ODM_CmnInfoPtrArrayHook( 1151 struct dm_odm_t *pDM_Odm, 1152 enum odm_cmninfo_e CmnInfo, 1153 u16 Index, 1154 void *pValue 1155 ) 1156 { 1157 /* */ 1158 /* Hook call by reference pointer. */ 1159 /* */ 1160 switch (CmnInfo) { 1161 /* */ 1162 /* Dynamic call by reference pointer. */ 1163 /* */ 1164 case ODM_CMNINFO_STA_STATUS: 1165 pDM_Odm->pODM_StaInfo[Index] = (PSTA_INFO_T)pValue; 1166 break; 1167 /* To remove the compiler warning, must add an empty default statement to handle the other values. */ 1168 default: 1169 /* do nothing */ 1170 break; 1171 } 1172 1173 } 1174 1175 1176 /* */ 1177 /* Update Band/CHannel/.. The values are dynamic but non-per-packet. */ 1178 /* */ 1179 void ODM_CmnInfoUpdate(struct dm_odm_t *pDM_Odm, u32 CmnInfo, u64 Value) 1180 { 1181 /* */ 1182 /* This init variable may be changed in run time. */ 1183 /* */ 1184 switch (CmnInfo) { 1185 case ODM_CMNINFO_LINK_IN_PROGRESS: 1186 pDM_Odm->bLinkInProcess = (bool)Value; 1187 break; 1188 1189 case ODM_CMNINFO_ABILITY: 1190 pDM_Odm->SupportAbility = (u32)Value; 1191 break; 1192 1193 case ODM_CMNINFO_RF_TYPE: 1194 pDM_Odm->RFType = (u8)Value; 1195 break; 1196 1197 case ODM_CMNINFO_WIFI_DIRECT: 1198 pDM_Odm->bWIFI_Direct = (bool)Value; 1199 break; 1200 1201 case ODM_CMNINFO_WIFI_DISPLAY: 1202 pDM_Odm->bWIFI_Display = (bool)Value; 1203 break; 1204 1205 case ODM_CMNINFO_LINK: 1206 pDM_Odm->bLinked = (bool)Value; 1207 break; 1208 1209 case ODM_CMNINFO_STATION_STATE: 1210 pDM_Odm->bsta_state = (bool)Value; 1211 break; 1212 1213 case ODM_CMNINFO_RSSI_MIN: 1214 pDM_Odm->RSSI_Min = (u8)Value; 1215 break; 1216 1217 case ODM_CMNINFO_DBG_COMP: 1218 pDM_Odm->DebugComponents = Value; 1219 break; 1220 1221 case ODM_CMNINFO_DBG_LEVEL: 1222 pDM_Odm->DebugLevel = (u32)Value; 1223 break; 1224 case ODM_CMNINFO_RA_THRESHOLD_HIGH: 1225 pDM_Odm->RateAdaptive.HighRSSIThresh = (u8)Value; 1226 break; 1227 1228 case ODM_CMNINFO_RA_THRESHOLD_LOW: 1229 pDM_Odm->RateAdaptive.LowRSSIThresh = (u8)Value; 1230 break; 1231 /* The following is for BT HS mode and BT coexist mechanism. */ 1232 case ODM_CMNINFO_BT_ENABLED: 1233 pDM_Odm->bBtEnabled = (bool)Value; 1234 break; 1235 1236 case ODM_CMNINFO_BT_HS_CONNECT_PROCESS: 1237 pDM_Odm->bBtConnectProcess = (bool)Value; 1238 break; 1239 1240 case ODM_CMNINFO_BT_HS_RSSI: 1241 pDM_Odm->btHsRssi = (u8)Value; 1242 break; 1243 1244 case ODM_CMNINFO_BT_OPERATION: 1245 pDM_Odm->bBtHsOperation = (bool)Value; 1246 break; 1247 1248 case ODM_CMNINFO_BT_LIMITED_DIG: 1249 pDM_Odm->bBtLimitedDig = (bool)Value; 1250 break; 1251 1252 case ODM_CMNINFO_BT_DISABLE_EDCA: 1253 pDM_Odm->bBtDisableEdcaTurbo = (bool)Value; 1254 break; 1255 1256 /* 1257 case ODM_CMNINFO_OP_MODE: 1258 pDM_Odm->OPMode = (u8)Value; 1259 break; 1260 1261 case ODM_CMNINFO_WM_MODE: 1262 pDM_Odm->WirelessMode = (u8)Value; 1263 break; 1264 1265 case ODM_CMNINFO_BAND: 1266 pDM_Odm->BandType = (u8)Value; 1267 break; 1268 1269 case ODM_CMNINFO_SEC_CHNL_OFFSET: 1270 pDM_Odm->SecChOffset = (u8)Value; 1271 break; 1272 1273 case ODM_CMNINFO_SEC_MODE: 1274 pDM_Odm->Security = (u8)Value; 1275 break; 1276 1277 case ODM_CMNINFO_BW: 1278 pDM_Odm->BandWidth = (u8)Value; 1279 break; 1280 1281 case ODM_CMNINFO_CHNL: 1282 pDM_Odm->Channel = (u8)Value; 1283 break; 1284 */ 1285 default: 1286 /* do nothing */ 1287 break; 1288 } 1289 1290 1291 } 1292 1293 /* 3 ============================================================ */ 1294 /* 3 DIG */ 1295 /* 3 ============================================================ */ 1296 /*----------------------------------------------------------------------------- 1297 * Function: odm_DIGInit() 1298 * 1299 * Overview: Set DIG scheme init value. 1300 * 1301 * Input: NONE 1302 * 1303 * Output: NONE 1304 * 1305 * Return: NONE 1306 * 1307 * Revised History: 1308 *When Who Remark 1309 * 1310 *--------------------------------------------------------------------------- 1311 */ 1312 1313 /* Remove DIG by yuchen */ 1314 1315 /* Remove DIG and FA check by Yu Chen */ 1316 1317 /* 3 ============================================================ */ 1318 /* 3 BB Power Save */ 1319 /* 3 ============================================================ */ 1320 1321 /* Remove BB power saving by Yuchen */ 1322 1323 /* 3 ============================================================ */ 1324 /* 3 Dynamic Tx Power */ 1325 /* 3 ============================================================ */ 1326 1327 /* Remove BY YuChen */ 1328 1329