0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023 #include <linux/bits.h>
0024 #include <linux/errno.h>
0025 #include <linux/kernel.h>
0026 #include "device.h"
0027 #include "mac.h"
0028 #include "baseband.h"
0029 #include "rf.h"
0030 #include "usbpipe.h"
0031
0032 static const u8 vnt_vt3184_agc[] = {
0033 0x00, 0x00, 0x02, 0x02, 0x04, 0x04, 0x06, 0x06,
0034 0x08, 0x08, 0x0a, 0x0a, 0x0c, 0x0c, 0x0e, 0x0e,
0035 0x10, 0x10, 0x12, 0x12, 0x14, 0x14, 0x16, 0x16,
0036 0x18, 0x18, 0x1a, 0x1a, 0x1c, 0x1c, 0x1e, 0x1e,
0037 0x20, 0x20, 0x22, 0x22, 0x24, 0x24, 0x26, 0x26,
0038 0x28, 0x28, 0x2a, 0x2a, 0x2c, 0x2c, 0x2e, 0x2e,
0039 0x30, 0x30, 0x32, 0x32, 0x34, 0x34, 0x36, 0x36,
0040 0x38, 0x38, 0x3a, 0x3a, 0x3c, 0x3c, 0x3e, 0x3e
0041 };
0042
0043 static u8 vnt_vt3184_al2230[] = {
0044 0x31, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
0045 0x70, 0x45, 0x2a, 0x76, 0x00, 0x00, 0x80, 0x00,
0046 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0047 0x00, 0x00, 0x00, 0x8e, 0x0a, 0x00, 0x00, 0x00,
0048 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00,
0049 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x0c,
0050 0x26, 0x5b, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa,
0051 0xff, 0xff, 0x79, 0x00, 0x00, 0x0b, 0x48, 0x04,
0052 0x00, 0x08, 0x00, 0x08, 0x08, 0x14, 0x05, 0x09,
0053 0x00, 0x00, 0x00, 0x00, 0x09, 0x73, 0x00, 0xc5,
0054 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0055 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0056 0xe4, 0x80, 0x00, 0x00, 0x00, 0x00, 0x98, 0x0a,
0057 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00,
0058 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0059 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0060 0x8c, 0x01, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
0061 0x08, 0x00, 0x1f, 0xb7, 0x88, 0x47, 0xaa, 0x00,
0062 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb,
0063 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0064 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
0065 0x18, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x18,
0066 0x38, 0x30, 0x00, 0x00, 0xff, 0x0f, 0xe4, 0xe2,
0067 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00,
0068 0x18, 0x20, 0x07, 0x18, 0xff, 0xff, 0x0e, 0x0a,
0069 0x0e, 0x00, 0x82, 0xa7, 0x3c, 0x10, 0x30, 0x05,
0070 0x40, 0x12, 0x00, 0x00, 0x10, 0x28, 0x80, 0x2a,
0071 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0072 0x00, 0xf3, 0x00, 0x00, 0x00, 0x10, 0x00, 0x12,
0073 0x00, 0xf4, 0x00, 0xff, 0x79, 0x20, 0x30, 0x05,
0074 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0075 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
0076 };
0077
0078
0079 static const u8 vnt_vt3184_vt3226d0[] = {
0080 0x31, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
0081 0x70, 0x45, 0x2a, 0x76, 0x00, 0x00, 0x80, 0x00,
0082 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0083 0x00, 0x00, 0x00, 0x8e, 0x0a, 0x00, 0x00, 0x00,
0084 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00,
0085 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x0c,
0086 0x26, 0x5b, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa,
0087 0xff, 0xff, 0x79, 0x00, 0x00, 0x0b, 0x48, 0x04,
0088 0x00, 0x08, 0x00, 0x08, 0x08, 0x14, 0x05, 0x09,
0089 0x00, 0x00, 0x00, 0x00, 0x09, 0x73, 0x00, 0xc5,
0090 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0091 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0092 0xe4, 0x80, 0x00, 0x00, 0x00, 0x00, 0x98, 0x0a,
0093 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00,
0094 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0095 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0096 0x8c, 0x01, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
0097 0x08, 0x00, 0x1f, 0xb7, 0x88, 0x47, 0xaa, 0x00,
0098 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb,
0099 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
0100 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
0101 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
0102 0x38, 0x30, 0x00, 0x00, 0xff, 0x0f, 0xe4, 0xe2,
0103 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00,
0104 0x18, 0x20, 0x07, 0x18, 0xff, 0xff, 0x10, 0x0a,
0105 0x0e, 0x00, 0x84, 0xa7, 0x3c, 0x10, 0x24, 0x05,
0106 0x40, 0x12, 0x00, 0x00, 0x10, 0x28, 0x80, 0x2a,
0107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0108 0x00, 0xf3, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10,
0109 0x00, 0xf4, 0x00, 0xff, 0x79, 0x20, 0x30, 0x08,
0110 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
0112 };
0113
0114 struct vnt_threshold {
0115 u8 bb_pre_ed_rssi;
0116 u8 cr_201;
0117 u8 cr_206;
0118 };
0119
0120 static const struct vnt_threshold al2230_vnt_threshold[] = {
0121 {0, 0x00, 0x30},
0122 {68, 0x00, 0x36},
0123 {67, 0x00, 0x43},
0124 {66, 0x00, 0x51},
0125 {65, 0x00, 0x62},
0126 {64, 0x00, 0x79},
0127 {63, 0x00, 0x93},
0128 {62, 0x00, 0xb9},
0129 {61, 0x00, 0xe3},
0130 {60, 0x01, 0x18},
0131 {59, 0x01, 0x54},
0132 {58, 0x01, 0xa0},
0133 {57, 0x02, 0x20},
0134 {56, 0x02, 0xa0},
0135 {55, 0x03, 0x00},
0136 {53, 0x06, 0x00},
0137 {51, 0x09, 0x00},
0138 {49, 0x0e, 0x00},
0139 {47, 0x15, 0x00},
0140 {46, 0x1a, 0x00},
0141 {45, 0xff, 0x00}
0142 };
0143
0144 static const struct vnt_threshold vt3226_vnt_threshold[] = {
0145 {0, 0x00, 0x24},
0146 {68, 0x00, 0x2d},
0147 {67, 0x00, 0x36},
0148 {66, 0x00, 0x43},
0149 {65, 0x00, 0x52},
0150 {64, 0x00, 0x68},
0151 {63, 0x00, 0x80},
0152 {62, 0x00, 0x9c},
0153 {61, 0x00, 0xc0},
0154 {60, 0x00, 0xea},
0155 {59, 0x01, 0x30},
0156 {58, 0x01, 0x70},
0157 {57, 0x01, 0xb0},
0158 {56, 0x02, 0x30},
0159 {55, 0x02, 0xc0},
0160 {53, 0x04, 0x00},
0161 {51, 0x07, 0x00},
0162 {49, 0x0a, 0x00},
0163 {47, 0x11, 0x00},
0164 {45, 0x18, 0x00},
0165 {43, 0x26, 0x00},
0166 {42, 0x36, 0x00},
0167 {41, 0xff, 0x00}
0168 };
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181
0182
0183 int vnt_set_antenna_mode(struct vnt_private *priv, u8 antenna_mode)
0184 {
0185 switch (antenna_mode) {
0186 case ANT_TXA:
0187 case ANT_TXB:
0188 break;
0189 case ANT_RXA:
0190 priv->bb_rx_conf &= 0xFC;
0191 break;
0192 case ANT_RXB:
0193 priv->bb_rx_conf &= 0xFE;
0194 priv->bb_rx_conf |= 0x02;
0195 break;
0196 }
0197
0198 return vnt_control_out(priv, MESSAGE_TYPE_SET_ANTMD,
0199 (u16)antenna_mode, 0, 0, NULL);
0200 }
0201
0202
0203
0204
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215
0216 int vnt_vt3184_init(struct vnt_private *priv)
0217 {
0218 int ret;
0219 u16 length;
0220 u8 *addr = NULL;
0221 const u8 *c_addr;
0222 u8 data;
0223
0224 ret = vnt_control_in(priv, MESSAGE_TYPE_READ, 0, MESSAGE_REQUEST_EEPROM,
0225 EEP_MAX_CONTEXT_SIZE, priv->eeprom);
0226 if (ret)
0227 goto end;
0228
0229 priv->rf_type = priv->eeprom[EEP_OFS_RFTYPE];
0230
0231 dev_dbg(&priv->usb->dev, "RF Type %d\n", priv->rf_type);
0232
0233 if ((priv->rf_type == RF_AL2230) ||
0234 (priv->rf_type == RF_AL2230S)) {
0235 priv->bb_rx_conf = vnt_vt3184_al2230[10];
0236 length = sizeof(vnt_vt3184_al2230);
0237 addr = vnt_vt3184_al2230;
0238
0239 priv->bb_vga[0] = 0x1c;
0240 priv->bb_vga[1] = 0x10;
0241 priv->bb_vga[2] = 0x0;
0242 priv->bb_vga[3] = 0x0;
0243
0244 } else if ((priv->rf_type == RF_VT3226) ||
0245 (priv->rf_type == RF_VT3226D0)) {
0246 priv->bb_rx_conf = vnt_vt3184_vt3226d0[10];
0247 length = sizeof(vnt_vt3184_vt3226d0);
0248 c_addr = vnt_vt3184_vt3226d0;
0249
0250 priv->bb_vga[0] = 0x20;
0251 priv->bb_vga[1] = 0x10;
0252 priv->bb_vga[2] = 0x0;
0253 priv->bb_vga[3] = 0x0;
0254
0255
0256 ret = vnt_mac_reg_bits_on(priv, MAC_REG_SOFTPWRCTL2,
0257 SOFTPWRCTL_RFLEOPT);
0258 if (ret)
0259 goto end;
0260 } else {
0261 goto end;
0262 }
0263
0264 if (addr)
0265 c_addr = addr;
0266
0267 ret = vnt_control_out_blocks(priv, VNT_REG_BLOCK_SIZE,
0268 MESSAGE_REQUEST_BBREG, length, c_addr);
0269 if (ret)
0270 goto end;
0271
0272 ret = vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0,
0273 MESSAGE_REQUEST_BBAGC,
0274 sizeof(vnt_vt3184_agc), vnt_vt3184_agc);
0275 if (ret)
0276 goto end;
0277
0278 if ((priv->rf_type == RF_VT3226) ||
0279 (priv->rf_type == RF_VT3226D0)) {
0280 data = (priv->rf_type == RF_VT3226D0) ? 0x11 : 0x23;
0281
0282 ret = vnt_control_out_u8(priv, MESSAGE_REQUEST_MACREG,
0283 MAC_REG_ITRTMSET, data);
0284 if (ret)
0285 goto end;
0286
0287 ret = vnt_mac_reg_bits_on(priv, MAC_REG_PAPEDELAY, BIT(0));
0288 if (ret)
0289 goto end;
0290 }
0291
0292 ret = vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x04, 0x7f);
0293 if (ret)
0294 goto end;
0295
0296 ret = vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0x01);
0297 if (ret)
0298 goto end;
0299
0300 ret = vnt_rf_table_download(priv);
0301 if (ret)
0302 goto end;
0303
0304
0305 ret = vnt_control_in(priv, MESSAGE_TYPE_READ, USB_REG4,
0306 MESSAGE_REQUEST_MEM, sizeof(data), &data);
0307 if (ret)
0308 goto end;
0309
0310 data |= 0x2;
0311
0312 ret = vnt_control_out(priv, MESSAGE_TYPE_WRITE, USB_REG4,
0313 MESSAGE_REQUEST_MEM, sizeof(data), &data);
0314
0315 end:
0316 return ret;
0317 }
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331 int vnt_set_short_slot_time(struct vnt_private *priv)
0332 {
0333 int ret = 0;
0334 u8 bb_vga = 0;
0335
0336 if (priv->short_slot_time)
0337 priv->bb_rx_conf &= 0xdf;
0338 else
0339 priv->bb_rx_conf |= 0x20;
0340
0341 ret = vnt_control_in_u8(priv, MESSAGE_REQUEST_BBREG, 0xe7, &bb_vga);
0342 if (ret)
0343 return ret;
0344
0345 if (bb_vga == priv->bb_vga[0])
0346 priv->bb_rx_conf |= 0x20;
0347
0348 return vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0a,
0349 priv->bb_rx_conf);
0350 }
0351
0352 int vnt_set_vga_gain_offset(struct vnt_private *priv, u8 data)
0353 {
0354 int ret;
0355
0356 ret = vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xE7, data);
0357 if (ret)
0358 return ret;
0359
0360
0361 if (priv->short_slot_time)
0362 priv->bb_rx_conf &= 0xdf;
0363 else
0364 priv->bb_rx_conf |= 0x20;
0365
0366 return vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0a,
0367 priv->bb_rx_conf);
0368 }
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379
0380
0381
0382 int vnt_set_deep_sleep(struct vnt_private *priv)
0383 {
0384 int ret = 0;
0385
0386
0387 ret = vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0c, 0x17);
0388 if (ret)
0389 return ret;
0390
0391
0392 return vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0xB9);
0393 }
0394
0395 int vnt_exit_deep_sleep(struct vnt_private *priv)
0396 {
0397 int ret = 0;
0398
0399
0400 ret = vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0c, 0x00);
0401 if (ret)
0402 return ret;
0403
0404
0405 return vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0x01);
0406 }
0407
0408 int vnt_update_pre_ed_threshold(struct vnt_private *priv, int scanning)
0409 {
0410 const struct vnt_threshold *threshold = NULL;
0411 u8 length;
0412 u8 cr_201, cr_206;
0413 u8 ed_inx;
0414 int ret;
0415
0416 switch (priv->rf_type) {
0417 case RF_AL2230:
0418 case RF_AL2230S:
0419 threshold = al2230_vnt_threshold;
0420 length = ARRAY_SIZE(al2230_vnt_threshold);
0421 break;
0422
0423 case RF_VT3226:
0424 case RF_VT3226D0:
0425 threshold = vt3226_vnt_threshold;
0426 length = ARRAY_SIZE(vt3226_vnt_threshold);
0427 break;
0428 }
0429
0430 if (!threshold)
0431 return -EINVAL;
0432
0433 for (ed_inx = scanning ? 0 : length - 1; ed_inx > 0; ed_inx--) {
0434 if (priv->bb_pre_ed_rssi <= threshold[ed_inx].bb_pre_ed_rssi)
0435 break;
0436 }
0437
0438 cr_201 = threshold[ed_inx].cr_201;
0439 cr_206 = threshold[ed_inx].cr_206;
0440
0441 if (ed_inx == priv->bb_pre_ed_index && !scanning)
0442 return 0;
0443
0444 priv->bb_pre_ed_index = ed_inx;
0445
0446 dev_dbg(&priv->usb->dev, "%s bb_pre_ed_rssi %d\n",
0447 __func__, priv->bb_pre_ed_rssi);
0448
0449 ret = vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xc9, cr_201);
0450 if (ret)
0451 return ret;
0452
0453 return vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xce, cr_206);
0454 }
0455