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