Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0+
0002 /*
0003  * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
0004  * All rights reserved.
0005  *
0006  * Purpose: Implement functions to access baseband
0007  *
0008  * Author: Jerry Chen
0009  *
0010  * Date: Jun. 5, 2002
0011  *
0012  * Functions:
0013  *  vnt_get_frame_time  - Calculate data frame transmitting time
0014  *  vnt_get_phy_field   - Calculate PhyLength, PhyService and Phy
0015  *                Signal parameter for baseband Tx
0016  *  vnt_vt3184_init     - VIA VT3184 baseband chip init code
0017  *
0018  * Revision History:
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, /* 0x0f */
0035     0x10, 0x10, 0x12, 0x12, 0x14, 0x14, 0x16, 0x16,
0036     0x18, 0x18, 0x1a, 0x1a, 0x1c, 0x1c, 0x1e, 0x1e, /* 0x1f */
0037     0x20, 0x20, 0x22, 0x22, 0x24, 0x24, 0x26, 0x26,
0038     0x28, 0x28, 0x2a, 0x2a, 0x2c, 0x2c, 0x2e, 0x2e, /* 0x2f */
0039     0x30, 0x30, 0x32, 0x32, 0x34, 0x34, 0x36, 0x36,
0040     0x38, 0x38, 0x3a, 0x3a, 0x3c, 0x3c, 0x3e, 0x3e  /* 0x3f */
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, /* 0x0f */
0046     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0047     0x00, 0x00, 0x00, 0x8e, 0x0a, 0x00, 0x00, 0x00, /* 0x1f */
0048     0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00,
0049     0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x0c, /* 0x2f */
0050     0x26, 0x5b, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa,
0051     0xff, 0xff, 0x79, 0x00, 0x00, 0x0b, 0x48, 0x04, /* 0x3f */
0052     0x00, 0x08, 0x00, 0x08, 0x08, 0x14, 0x05, 0x09,
0053     0x00, 0x00, 0x00, 0x00, 0x09, 0x73, 0x00, 0xc5, /* 0x4f */
0054     0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0055     0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x5f */
0056     0xe4, 0x80, 0x00, 0x00, 0x00, 0x00, 0x98, 0x0a,
0057     0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, /* 0x6f */
0058     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0059     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x7f */
0060     0x8c, 0x01, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
0061     0x08, 0x00, 0x1f, 0xb7, 0x88, 0x47, 0xaa, 0x00, /* 0x8f */
0062     0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb,
0063     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, /* 0x9f */
0064     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
0065     0x18, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x18, /* 0xaf */
0066     0x38, 0x30, 0x00, 0x00, 0xff, 0x0f, 0xe4, 0xe2,
0067     0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, /* 0xbf */
0068     0x18, 0x20, 0x07, 0x18, 0xff, 0xff, 0x0e, 0x0a,
0069     0x0e, 0x00, 0x82, 0xa7, 0x3c, 0x10, 0x30, 0x05, /* 0xcf */
0070     0x40, 0x12, 0x00, 0x00, 0x10, 0x28, 0x80, 0x2a,
0071     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xdf */
0072     0x00, 0xf3, 0x00, 0x00, 0x00, 0x10, 0x00, 0x12,
0073     0x00, 0xf4, 0x00, 0xff, 0x79, 0x20, 0x30, 0x05, /* 0xef */
0074     0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0075     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00  /* 0xff */
0076 };
0077 
0078 /* {{RobertYu:20060515, new BB setting for VT3226D0 */
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, /* 0x0f */
0082     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0083     0x00, 0x00, 0x00, 0x8e, 0x0a, 0x00, 0x00, 0x00, /* 0x1f */
0084     0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00,
0085     0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x0c, /* 0x2f */
0086     0x26, 0x5b, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa,
0087     0xff, 0xff, 0x79, 0x00, 0x00, 0x0b, 0x48, 0x04, /* 0x3f */
0088     0x00, 0x08, 0x00, 0x08, 0x08, 0x14, 0x05, 0x09,
0089     0x00, 0x00, 0x00, 0x00, 0x09, 0x73, 0x00, 0xc5, /* 0x4f */
0090     0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0091     0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x5f */
0092     0xe4, 0x80, 0x00, 0x00, 0x00, 0x00, 0x98, 0x0a,
0093     0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, /* 0x6f */
0094     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0095     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x7f */
0096     0x8c, 0x01, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
0097     0x08, 0x00, 0x1f, 0xb7, 0x88, 0x47, 0xaa, 0x00, /* 0x8f */
0098     0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb,
0099     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, /* 0x9f */
0100     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
0101     0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, /* 0xaf */
0102     0x38, 0x30, 0x00, 0x00, 0xff, 0x0f, 0xe4, 0xe2,
0103     0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, /* 0xbf */
0104     0x18, 0x20, 0x07, 0x18, 0xff, 0xff, 0x10, 0x0a,
0105     0x0e, 0x00, 0x84, 0xa7, 0x3c, 0x10, 0x24, 0x05, /* 0xcf */
0106     0x40, 0x12, 0x00, 0x00, 0x10, 0x28, 0x80, 0x2a,
0107     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xdf */
0108     0x00, 0xf3, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10,
0109     0x00, 0xf4, 0x00, 0xff, 0x79, 0x20, 0x30, 0x08, /* 0xef */
0110     0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0111     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00  /* 0xff */
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},    /* Max sensitivity */
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},    /* Max sensitivity */
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  * Description: Set Antenna mode
0172  *
0173  * Parameters:
0174  *  In:
0175  *  priv        - Device Structure
0176  *  antenna_mode    - Antenna Mode
0177  *  Out:
0178  *      none
0179  *
0180  * Return Value: none
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  * Description: Set Antenna mode
0204  *
0205  * Parameters:
0206  *  In:
0207  *      pDevice          - Device Structure
0208  *      byAntennaMode    - Antenna Mode
0209  *  Out:
0210  *      none
0211  *
0212  * Return Value: none
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         /* Fix VT3226 DFC system timing issue */
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     /* Fix for TX USB resets from vendors driver */
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  * Description: Set ShortSlotTime mode
0321  *
0322  * Parameters:
0323  *  In:
0324  *  priv    - Device Structure
0325  *  Out:
0326  *      none
0327  *
0328  * Return Value: none
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     /* patch for 3253B0 Baseband with Cardbus module */
0361     if (priv->short_slot_time)
0362         priv->bb_rx_conf &= 0xdf; /* 1101 1111 */
0363     else
0364         priv->bb_rx_conf |= 0x20; /* 0010 0000 */
0365 
0366     return vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0a,
0367                   priv->bb_rx_conf);
0368 }
0369 
0370 /*
0371  * Description: vnt_set_deep_sleep
0372  *
0373  * Parameters:
0374  *  In:
0375  *  priv    - Device Structure
0376  *  Out:
0377  *      none
0378  *
0379  * Return Value: none
0380  *
0381  */
0382 int vnt_set_deep_sleep(struct vnt_private *priv)
0383 {
0384     int ret = 0;
0385 
0386     /* CR12 */
0387     ret = vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0c, 0x17);
0388     if (ret)
0389         return ret;
0390 
0391     /* CR13 */
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     /* CR12 */
0400     ret = vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0c, 0x00);
0401     if (ret)
0402         return ret;
0403 
0404     /* CR13 */
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