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 /* DBG_8192C("%s =>MinUndecoratedPWDBForDM(%d)\n", __func__, pdmpriv->MinUndecoratedPWDBForDM); */ 639 /* ODM_RT_TRACE(pDM_Odm, COMP_DIG, DBG_LOUD, ("MinUndecoratedPWDBForDM =%d\n", pHalData->MinUndecoratedPWDBForDM)); */ 640 } 641 642 static void odm_RSSIMonitorCheckCE(struct dm_odm_t *pDM_Odm) 643 { 644 struct adapter *Adapter = pDM_Odm->Adapter; 645 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter); 646 struct dm_priv *pdmpriv = &pHalData->dmpriv; 647 int i; 648 int tmpEntryMaxPWDB = 0, tmpEntryMinPWDB = 0xff; 649 u8 sta_cnt = 0; 650 u32 PWDB_rssi[NUM_STA] = {0};/* 0~15]:MACID, [16~31]:PWDB_rssi */ 651 struct ra_t *pRA_Table = &pDM_Odm->DM_RA_Table; 652 653 if (pDM_Odm->bLinked != true) 654 return; 655 656 pRA_Table->firstconnect = pDM_Odm->bLinked; 657 658 /* if (check_fwstate(&Adapter->mlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == true) */ 659 { 660 struct sta_info *psta; 661 662 for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) { 663 psta = pDM_Odm->pODM_StaInfo[i]; 664 if (IS_STA_VALID(psta)) { 665 if (IS_MCAST(psta->hwaddr)) /* if (psta->mac_id == 1) */ 666 continue; 667 668 if (psta->rssi_stat.UndecoratedSmoothedPWDB == (-1)) 669 continue; 670 671 if (psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB) 672 tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; 673 674 if (psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB) 675 tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB; 676 677 if (psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)) 678 PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16)); 679 } 680 } 681 682 /* printk("%s ==> sta_cnt(%d)\n", __func__, sta_cnt); */ 683 684 for (i = 0; i < sta_cnt; i++) { 685 if (PWDB_rssi[i] != (0)) { 686 if (pHalData->fw_ractrl == true)/* Report every sta's RSSI to FW */ 687 rtl8723b_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i])); 688 } 689 } 690 } 691 692 693 694 if (tmpEntryMaxPWDB != 0) /* If associated entry is found */ 695 pdmpriv->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB; 696 else 697 pdmpriv->EntryMaxUndecoratedSmoothedPWDB = 0; 698 699 if (tmpEntryMinPWDB != 0xff) /* If associated entry is found */ 700 pdmpriv->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB; 701 else 702 pdmpriv->EntryMinUndecoratedSmoothedPWDB = 0; 703 704 FindMinimumRSSI(Adapter);/* get pdmpriv->MinUndecoratedPWDBForDM */ 705 706 pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM; 707 /* ODM_CmnInfoUpdate(&pHalData->odmpriv , ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM); */ 708 } 709 710 static void odm_RSSIMonitorCheck(struct dm_odm_t *pDM_Odm) 711 { 712 if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR)) 713 return; 714 715 odm_RSSIMonitorCheckCE(pDM_Odm); 716 717 } /* odm_RSSIMonitorCheck */ 718 719 /* 3 ============================================================ */ 720 /* 3 SW Antenna Diversity */ 721 /* 3 ============================================================ */ 722 static void odm_SwAntDetectInit(struct dm_odm_t *pDM_Odm) 723 { 724 struct swat_t *pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table; 725 726 pDM_SWAT_Table->SWAS_NoLink_BK_Reg92c = rtw_read32(pDM_Odm->Adapter, rDPDT_control); 727 pDM_SWAT_Table->PreAntenna = MAIN_ANT; 728 pDM_SWAT_Table->CurAntenna = MAIN_ANT; 729 pDM_SWAT_Table->SWAS_NoLink_State = 0; 730 } 731 732 /* 3 ============================================================ */ 733 /* 3 Tx Power Tracking */ 734 /* 3 ============================================================ */ 735 736 static u8 getSwingIndex(struct dm_odm_t *pDM_Odm) 737 { 738 struct adapter *Adapter = pDM_Odm->Adapter; 739 u8 i = 0; 740 u32 bbSwing; 741 u32 swingTableSize; 742 u32 *pSwingTable; 743 744 bbSwing = PHY_QueryBBReg(Adapter, rOFDM0_XATxIQImbalance, 0xFFC00000); 745 746 pSwingTable = OFDMSwingTable_New; 747 swingTableSize = OFDM_TABLE_SIZE; 748 749 for (i = 0; i < swingTableSize; ++i) { 750 u32 tableValue = pSwingTable[i]; 751 752 if (tableValue >= 0x100000) 753 tableValue >>= 22; 754 if (bbSwing == tableValue) 755 break; 756 } 757 return i; 758 } 759 760 void odm_TXPowerTrackingInit(struct dm_odm_t *pDM_Odm) 761 { 762 u8 defaultSwingIndex = getSwingIndex(pDM_Odm); 763 u8 p = 0; 764 struct adapter *Adapter = pDM_Odm->Adapter; 765 struct hal_com_data *pHalData = GET_HAL_DATA(Adapter); 766 767 768 struct dm_priv *pdmpriv = &pHalData->dmpriv; 769 770 pdmpriv->bTXPowerTracking = true; 771 pdmpriv->TXPowercount = 0; 772 pdmpriv->bTXPowerTrackingInit = false; 773 774 if (*(pDM_Odm->mp_mode) != 1) 775 pdmpriv->TxPowerTrackControl = true; 776 else 777 pdmpriv->TxPowerTrackControl = false; 778 779 780 /* MSG_8192C("pdmpriv->TxPowerTrackControl = %d\n", pdmpriv->TxPowerTrackControl); */ 781 782 /* pDM_Odm->RFCalibrateInfo.TxPowerTrackControl = true; */ 783 pDM_Odm->RFCalibrateInfo.ThermalValue = pHalData->EEPROMThermalMeter; 784 pDM_Odm->RFCalibrateInfo.ThermalValue_IQK = pHalData->EEPROMThermalMeter; 785 pDM_Odm->RFCalibrateInfo.ThermalValue_LCK = pHalData->EEPROMThermalMeter; 786 787 /* The index of "0 dB" in SwingTable. */ 788 pDM_Odm->DefaultOfdmIndex = (defaultSwingIndex >= OFDM_TABLE_SIZE) ? 30 : defaultSwingIndex; 789 pDM_Odm->DefaultCckIndex = 20; 790 791 pDM_Odm->BbSwingIdxCckBase = pDM_Odm->DefaultCckIndex; 792 pDM_Odm->RFCalibrateInfo.CCK_index = pDM_Odm->DefaultCckIndex; 793 794 for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p) { 795 pDM_Odm->BbSwingIdxOfdmBase[p] = pDM_Odm->DefaultOfdmIndex; 796 pDM_Odm->RFCalibrateInfo.OFDM_index[p] = pDM_Odm->DefaultOfdmIndex; 797 pDM_Odm->RFCalibrateInfo.DeltaPowerIndex[p] = 0; 798 pDM_Odm->RFCalibrateInfo.DeltaPowerIndexLast[p] = 0; 799 pDM_Odm->RFCalibrateInfo.PowerIndexOffset[p] = 0; 800 } 801 802 } 803 804 void ODM_TXPowerTrackingCheck(struct dm_odm_t *pDM_Odm) 805 { 806 struct adapter *Adapter = pDM_Odm->Adapter; 807 808 if (!(pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK)) 809 return; 810 811 if (!pDM_Odm->RFCalibrateInfo.TM_Trigger) { /* at least delay 1 sec */ 812 PHY_SetRFReg(pDM_Odm->Adapter, ODM_RF_PATH_A, RF_T_METER_NEW, (BIT17 | BIT16), 0x03); 813 814 /* DBG_871X("Trigger Thermal Meter!!\n"); */ 815 816 pDM_Odm->RFCalibrateInfo.TM_Trigger = 1; 817 return; 818 } else { 819 /* DBG_871X("Schedule TxPowerTracking direct call!!\n"); */ 820 ODM_TXPowerTrackingCallback_ThermalMeter(Adapter); 821 pDM_Odm->RFCalibrateInfo.TM_Trigger = 0; 822 } 823 } 824 825 /* */ 826 /* 3 Export Interface */ 827 /* */ 828 829 /* */ 830 /* 2011/09/21 MH Add to describe different team necessary resource allocate?? */ 831 /* */ 832 void ODM_DMInit(struct dm_odm_t *pDM_Odm) 833 { 834 835 odm_CommonInfoSelfInit(pDM_Odm); 836 odm_CmnInfoInit_Debug(pDM_Odm); 837 odm_DIGInit(pDM_Odm); 838 odm_NHMCounterStatisticsInit(pDM_Odm); 839 odm_AdaptivityInit(pDM_Odm); 840 odm_RateAdaptiveMaskInit(pDM_Odm); 841 ODM_CfoTrackingInit(pDM_Odm); 842 ODM_EdcaTurboInit(pDM_Odm); 843 odm_RSSIMonitorInit(pDM_Odm); 844 odm_TXPowerTrackingInit(pDM_Odm); 845 846 ODM_ClearTxPowerTrackingState(pDM_Odm); 847 848 if (*(pDM_Odm->mp_mode) != 1) 849 odm_PathDiversityInit(pDM_Odm); 850 851 odm_DynamicBBPowerSavingInit(pDM_Odm); 852 odm_DynamicTxPowerInit(pDM_Odm); 853 854 odm_SwAntDetectInit(pDM_Odm); 855 } 856 857 /* */ 858 /* 2011/09/20 MH This is the entry pointer for all team to execute HW out source DM. */ 859 /* You can not add any dummy function here, be care, you can only use DM structure */ 860 /* to perform any new ODM_DM. */ 861 /* */ 862 void ODM_DMWatchdog(struct dm_odm_t *pDM_Odm) 863 { 864 odm_CommonInfoSelfUpdate(pDM_Odm); 865 odm_BasicDbgMessage(pDM_Odm); 866 odm_FalseAlarmCounterStatistics(pDM_Odm); 867 odm_NHMCounterStatistics(pDM_Odm); 868 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("odm_DIG(): RSSI = 0x%x\n", pDM_Odm->RSSI_Min)); 869 870 odm_RSSIMonitorCheck(pDM_Odm); 871 872 /* For CE Platform(SPRD or Tablet) */ 873 /* 8723A or 8189ES platform */ 874 /* NeilChen--2012--08--24-- */ 875 /* Fix Leave LPS issue */ 876 if ((adapter_to_pwrctl(pDM_Odm->Adapter)->pwr_mode != PS_MODE_ACTIVE) /* in LPS mode */ 877 /* */ 878 /* (pDM_Odm->SupportICType & (ODM_RTL8723A))|| */ 879 /* (pDM_Odm->SupportICType & (ODM_RTL8188E) &&(&&(((pDM_Odm->SupportInterface == ODM_ITRF_SDIO))) */ 880 /* */ 881 ) { 882 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("----Step1: odm_DIG is in LPS mode\n")); 883 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DIG, ODM_DBG_LOUD, ("---Step2: 8723AS is in LPS mode\n")); 884 odm_DIGbyRSSI_LPS(pDM_Odm); 885 } else 886 odm_DIG(pDM_Odm); 887 888 { 889 struct dig_t *pDM_DigTable = &pDM_Odm->DM_DigTable; 890 891 odm_Adaptivity(pDM_Odm, pDM_DigTable->CurIGValue); 892 } 893 odm_CCKPacketDetectionThresh(pDM_Odm); 894 895 if (*(pDM_Odm->pbPowerSaving) == true) 896 return; 897 898 899 odm_RefreshRateAdaptiveMask(pDM_Odm); 900 odm_EdcaTurboCheck(pDM_Odm); 901 odm_PathDiversity(pDM_Odm); 902 ODM_CfoTracking(pDM_Odm); 903 904 ODM_TXPowerTrackingCheck(pDM_Odm); 905 906 /* odm_EdcaTurboCheck(pDM_Odm); */ 907 908 /* 2010.05.30 LukeLee: For CE platform, files in IC subfolders may not be included to be compiled, */ 909 /* so compile flags must be left here to prevent from compile errors */ 910 pDM_Odm->PhyDbgInfo.NumQryBeaconPkt = 0; 911 } 912 913 914 /* */ 915 /* Init /.. Fixed HW value. Only init time. */ 916 /* */ 917 void ODM_CmnInfoInit(struct dm_odm_t *pDM_Odm, enum odm_cmninfo_e CmnInfo, u32 Value) 918 { 919 /* */ 920 /* This section is used for init value */ 921 /* */ 922 switch (CmnInfo) { 923 /* */ 924 /* Fixed ODM value. */ 925 /* */ 926 case ODM_CMNINFO_ABILITY: 927 pDM_Odm->SupportAbility = (u32)Value; 928 break; 929 930 case ODM_CMNINFO_RF_TYPE: 931 pDM_Odm->RFType = (u8)Value; 932 break; 933 934 case ODM_CMNINFO_PLATFORM: 935 pDM_Odm->SupportPlatform = (u8)Value; 936 break; 937 938 case ODM_CMNINFO_INTERFACE: 939 pDM_Odm->SupportInterface = (u8)Value; 940 break; 941 942 case ODM_CMNINFO_MP_TEST_CHIP: 943 pDM_Odm->bIsMPChip = (u8)Value; 944 break; 945 946 case ODM_CMNINFO_IC_TYPE: 947 pDM_Odm->SupportICType = Value; 948 break; 949 950 case ODM_CMNINFO_CUT_VER: 951 pDM_Odm->CutVersion = (u8)Value; 952 break; 953 954 case ODM_CMNINFO_FAB_VER: 955 pDM_Odm->FabVersion = (u8)Value; 956 break; 957 958 case ODM_CMNINFO_RFE_TYPE: 959 pDM_Odm->RFEType = (u8)Value; 960 break; 961 962 case ODM_CMNINFO_RF_ANTENNA_TYPE: 963 pDM_Odm->AntDivType = (u8)Value; 964 break; 965 966 case ODM_CMNINFO_BOARD_TYPE: 967 pDM_Odm->BoardType = (u8)Value; 968 break; 969 970 case ODM_CMNINFO_PACKAGE_TYPE: 971 pDM_Odm->PackageType = (u8)Value; 972 break; 973 974 case ODM_CMNINFO_EXT_LNA: 975 pDM_Odm->ExtLNA = (u8)Value; 976 break; 977 978 case ODM_CMNINFO_5G_EXT_LNA: 979 pDM_Odm->ExtLNA5G = (u8)Value; 980 break; 981 982 case ODM_CMNINFO_EXT_PA: 983 pDM_Odm->ExtPA = (u8)Value; 984 break; 985 986 case ODM_CMNINFO_5G_EXT_PA: 987 pDM_Odm->ExtPA5G = (u8)Value; 988 break; 989 990 case ODM_CMNINFO_GPA: 991 pDM_Odm->TypeGPA = (enum odm_type_gpa_e)Value; 992 break; 993 case ODM_CMNINFO_APA: 994 pDM_Odm->TypeAPA = (enum odm_type_apa_e)Value; 995 break; 996 case ODM_CMNINFO_GLNA: 997 pDM_Odm->TypeGLNA = (enum odm_type_glna_e)Value; 998 break; 999 case ODM_CMNINFO_ALNA: 1000 pDM_Odm->TypeALNA = (enum odm_type_alna_e)Value; 1001 break; 1002 1003 case ODM_CMNINFO_EXT_TRSW: 1004 pDM_Odm->ExtTRSW = (u8)Value; 1005 break; 1006 case ODM_CMNINFO_PATCH_ID: 1007 pDM_Odm->PatchID = (u8)Value; 1008 break; 1009 case ODM_CMNINFO_BINHCT_TEST: 1010 pDM_Odm->bInHctTest = (bool)Value; 1011 break; 1012 case ODM_CMNINFO_BWIFI_TEST: 1013 pDM_Odm->bWIFITest = (bool)Value; 1014 break; 1015 1016 case ODM_CMNINFO_SMART_CONCURRENT: 1017 pDM_Odm->bDualMacSmartConcurrent = (bool)Value; 1018 break; 1019 1020 /* To remove the compiler warning, must add an empty default statement to handle the other values. */ 1021 default: 1022 /* do nothing */ 1023 break; 1024 } 1025 1026 } 1027 1028 1029 void ODM_CmnInfoHook(struct dm_odm_t *pDM_Odm, enum odm_cmninfo_e CmnInfo, void *pValue) 1030 { 1031 /* */ 1032 /* Hook call by reference pointer. */ 1033 /* */ 1034 switch (CmnInfo) { 1035 /* */ 1036 /* Dynamic call by reference pointer. */ 1037 /* */ 1038 case ODM_CMNINFO_MAC_PHY_MODE: 1039 pDM_Odm->pMacPhyMode = pValue; 1040 break; 1041 1042 case ODM_CMNINFO_TX_UNI: 1043 pDM_Odm->pNumTxBytesUnicast = pValue; 1044 break; 1045 1046 case ODM_CMNINFO_RX_UNI: 1047 pDM_Odm->pNumRxBytesUnicast = pValue; 1048 break; 1049 1050 case ODM_CMNINFO_WM_MODE: 1051 pDM_Odm->pwirelessmode = pValue; 1052 break; 1053 1054 case ODM_CMNINFO_BAND: 1055 pDM_Odm->pBandType = pValue; 1056 break; 1057 1058 case ODM_CMNINFO_SEC_CHNL_OFFSET: 1059 pDM_Odm->pSecChOffset = pValue; 1060 break; 1061 1062 case ODM_CMNINFO_SEC_MODE: 1063 pDM_Odm->pSecurity = pValue; 1064 break; 1065 1066 case ODM_CMNINFO_BW: 1067 pDM_Odm->pBandWidth = pValue; 1068 break; 1069 1070 case ODM_CMNINFO_CHNL: 1071 pDM_Odm->pChannel = pValue; 1072 break; 1073 1074 case ODM_CMNINFO_DMSP_GET_VALUE: 1075 pDM_Odm->pbGetValueFromOtherMac = pValue; 1076 break; 1077 1078 case ODM_CMNINFO_BUDDY_ADAPTOR: 1079 pDM_Odm->pBuddyAdapter = pValue; 1080 break; 1081 1082 case ODM_CMNINFO_DMSP_IS_MASTER: 1083 pDM_Odm->pbMasterOfDMSP = pValue; 1084 break; 1085 1086 case ODM_CMNINFO_SCAN: 1087 pDM_Odm->pbScanInProcess = pValue; 1088 break; 1089 1090 case ODM_CMNINFO_POWER_SAVING: 1091 pDM_Odm->pbPowerSaving = pValue; 1092 break; 1093 1094 case ODM_CMNINFO_ONE_PATH_CCA: 1095 pDM_Odm->pOnePathCCA = pValue; 1096 break; 1097 1098 case ODM_CMNINFO_DRV_STOP: 1099 pDM_Odm->pbDriverStopped = pValue; 1100 break; 1101 1102 case ODM_CMNINFO_PNP_IN: 1103 pDM_Odm->pbDriverIsGoingToPnpSetPowerSleep = pValue; 1104 break; 1105 1106 case ODM_CMNINFO_INIT_ON: 1107 pDM_Odm->pinit_adpt_in_progress = pValue; 1108 break; 1109 1110 case ODM_CMNINFO_ANT_TEST: 1111 pDM_Odm->pAntennaTest = pValue; 1112 break; 1113 1114 case ODM_CMNINFO_NET_CLOSED: 1115 pDM_Odm->pbNet_closed = pValue; 1116 break; 1117 1118 case ODM_CMNINFO_FORCED_RATE: 1119 pDM_Odm->pForcedDataRate = pValue; 1120 break; 1121 1122 case ODM_CMNINFO_FORCED_IGI_LB: 1123 pDM_Odm->pu1ForcedIgiLb = pValue; 1124 break; 1125 1126 case ODM_CMNINFO_MP_MODE: 1127 pDM_Odm->mp_mode = pValue; 1128 break; 1129 1130 /* case ODM_CMNINFO_RTSTA_AID: */ 1131 /* pDM_Odm->pAidMap = (u8 *)pValue; */ 1132 /* break; */ 1133 1134 /* case ODM_CMNINFO_BT_COEXIST: */ 1135 /* pDM_Odm->BTCoexist = (bool *)pValue; */ 1136 1137 /* case ODM_CMNINFO_STA_STATUS: */ 1138 /* pDM_Odm->pODM_StaInfo[] = (PSTA_INFO_T)pValue; */ 1139 /* break; */ 1140 1141 /* case ODM_CMNINFO_PHY_STATUS: */ 1142 /* pDM_Odm->pPhyInfo = (ODM_PHY_INFO *)pValue; */ 1143 /* break; */ 1144 1145 /* case ODM_CMNINFO_MAC_STATUS: */ 1146 /* pDM_Odm->pMacInfo = (struct odm_mac_status_info *)pValue; */ 1147 /* break; */ 1148 /* To remove the compiler warning, must add an empty default statement to handle the other values. */ 1149 default: 1150 /* do nothing */ 1151 break; 1152 } 1153 1154 } 1155 1156 1157 void ODM_CmnInfoPtrArrayHook( 1158 struct dm_odm_t *pDM_Odm, 1159 enum odm_cmninfo_e CmnInfo, 1160 u16 Index, 1161 void *pValue 1162 ) 1163 { 1164 /* */ 1165 /* Hook call by reference pointer. */ 1166 /* */ 1167 switch (CmnInfo) { 1168 /* */ 1169 /* Dynamic call by reference pointer. */ 1170 /* */ 1171 case ODM_CMNINFO_STA_STATUS: 1172 pDM_Odm->pODM_StaInfo[Index] = (PSTA_INFO_T)pValue; 1173 break; 1174 /* To remove the compiler warning, must add an empty default statement to handle the other values. */ 1175 default: 1176 /* do nothing */ 1177 break; 1178 } 1179 1180 } 1181 1182 1183 /* */ 1184 /* Update Band/CHannel/.. The values are dynamic but non-per-packet. */ 1185 /* */ 1186 void ODM_CmnInfoUpdate(struct dm_odm_t *pDM_Odm, u32 CmnInfo, u64 Value) 1187 { 1188 /* */ 1189 /* This init variable may be changed in run time. */ 1190 /* */ 1191 switch (CmnInfo) { 1192 case ODM_CMNINFO_LINK_IN_PROGRESS: 1193 pDM_Odm->bLinkInProcess = (bool)Value; 1194 break; 1195 1196 case ODM_CMNINFO_ABILITY: 1197 pDM_Odm->SupportAbility = (u32)Value; 1198 break; 1199 1200 case ODM_CMNINFO_RF_TYPE: 1201 pDM_Odm->RFType = (u8)Value; 1202 break; 1203 1204 case ODM_CMNINFO_WIFI_DIRECT: 1205 pDM_Odm->bWIFI_Direct = (bool)Value; 1206 break; 1207 1208 case ODM_CMNINFO_WIFI_DISPLAY: 1209 pDM_Odm->bWIFI_Display = (bool)Value; 1210 break; 1211 1212 case ODM_CMNINFO_LINK: 1213 pDM_Odm->bLinked = (bool)Value; 1214 break; 1215 1216 case ODM_CMNINFO_STATION_STATE: 1217 pDM_Odm->bsta_state = (bool)Value; 1218 break; 1219 1220 case ODM_CMNINFO_RSSI_MIN: 1221 pDM_Odm->RSSI_Min = (u8)Value; 1222 break; 1223 1224 case ODM_CMNINFO_DBG_COMP: 1225 pDM_Odm->DebugComponents = Value; 1226 break; 1227 1228 case ODM_CMNINFO_DBG_LEVEL: 1229 pDM_Odm->DebugLevel = (u32)Value; 1230 break; 1231 case ODM_CMNINFO_RA_THRESHOLD_HIGH: 1232 pDM_Odm->RateAdaptive.HighRSSIThresh = (u8)Value; 1233 break; 1234 1235 case ODM_CMNINFO_RA_THRESHOLD_LOW: 1236 pDM_Odm->RateAdaptive.LowRSSIThresh = (u8)Value; 1237 break; 1238 /* The following is for BT HS mode and BT coexist mechanism. */ 1239 case ODM_CMNINFO_BT_ENABLED: 1240 pDM_Odm->bBtEnabled = (bool)Value; 1241 break; 1242 1243 case ODM_CMNINFO_BT_HS_CONNECT_PROCESS: 1244 pDM_Odm->bBtConnectProcess = (bool)Value; 1245 break; 1246 1247 case ODM_CMNINFO_BT_HS_RSSI: 1248 pDM_Odm->btHsRssi = (u8)Value; 1249 break; 1250 1251 case ODM_CMNINFO_BT_OPERATION: 1252 pDM_Odm->bBtHsOperation = (bool)Value; 1253 break; 1254 1255 case ODM_CMNINFO_BT_LIMITED_DIG: 1256 pDM_Odm->bBtLimitedDig = (bool)Value; 1257 break; 1258 1259 case ODM_CMNINFO_BT_DISABLE_EDCA: 1260 pDM_Odm->bBtDisableEdcaTurbo = (bool)Value; 1261 break; 1262 1263 /* 1264 case ODM_CMNINFO_OP_MODE: 1265 pDM_Odm->OPMode = (u8)Value; 1266 break; 1267 1268 case ODM_CMNINFO_WM_MODE: 1269 pDM_Odm->WirelessMode = (u8)Value; 1270 break; 1271 1272 case ODM_CMNINFO_BAND: 1273 pDM_Odm->BandType = (u8)Value; 1274 break; 1275 1276 case ODM_CMNINFO_SEC_CHNL_OFFSET: 1277 pDM_Odm->SecChOffset = (u8)Value; 1278 break; 1279 1280 case ODM_CMNINFO_SEC_MODE: 1281 pDM_Odm->Security = (u8)Value; 1282 break; 1283 1284 case ODM_CMNINFO_BW: 1285 pDM_Odm->BandWidth = (u8)Value; 1286 break; 1287 1288 case ODM_CMNINFO_CHNL: 1289 pDM_Odm->Channel = (u8)Value; 1290 break; 1291 */ 1292 default: 1293 /* do nothing */ 1294 break; 1295 } 1296 1297 1298 } 1299 1300 /* 3 ============================================================ */ 1301 /* 3 DIG */ 1302 /* 3 ============================================================ */ 1303 /*----------------------------------------------------------------------------- 1304 * Function: odm_DIGInit() 1305 * 1306 * Overview: Set DIG scheme init value. 1307 * 1308 * Input: NONE 1309 * 1310 * Output: NONE 1311 * 1312 * Return: NONE 1313 * 1314 * Revised History: 1315 *When Who Remark 1316 * 1317 *--------------------------------------------------------------------------- 1318 */ 1319 1320 /* Remove DIG by yuchen */ 1321 1322 /* Remove DIG and FA check by Yu Chen */ 1323 1324 /* 3 ============================================================ */ 1325 /* 3 BB Power Save */ 1326 /* 3 ============================================================ */ 1327 1328 /* Remove BB power saving by Yuchen */ 1329 1330 /* 3 ============================================================ */ 1331 /* 3 Dynamic Tx Power */ 1332 /* 3 ============================================================ */ 1333 1334 /* Remove BY YuChen */ 1335 1336