2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 * Purpose: Implement functions to access baseband
29 * BBuGetFrameTime - Calculate data frame transmitting time
30 * BBvCalculateParameter - Calculate PhyLength, PhyService and Phy Signal parameter for baseband Tx
31 * BBbVT3184Init - VIA VT3184 baseband chip init code
46 static u8 abyVT3184_AGC[] = {
50 0x02, //3 //RobertYu:20060505, 0x04, //3
52 0x04, //5 //RobertYu:20060505, 0x06, //5
113 static u8 abyVT3184_AL2230[] = {
123 0x45,//tx //0x64 for FPGA
141 0x8e, //RobertYu:20060522, //0x8d,
142 0x0a, //RobertYu:20060515, //0x09,
161 0x0c, //RobertYu:20060522, //0x10,
194 0x00,//50 //RobertYu:20060505, //0x15,//50
203 0xd0, //RobertYu:20060505, //0xb0,
222 0x00, //0x80 for FPGA
252 0x1f, //RobertYu:20060516, //0x0f,
257 0x00, //RobertYu:20060505, //0x02,
258 0x20,//90 //RobertYu:20060505, //0x22,//90
287 0x15, //RobertYu:20060516, //0x00,
311 0xff, //RobertYu:20060509, //0x2c,
312 0x0e, //RobertYu:20060530, //0x0c,
315 0x00, //RobertYu:20060505, //0x01,
316 0x82, //RobertYu:20060516, //0x8f,
320 0x30, //RobertYu:20060627, //0x0b,
321 0x05, //RobertYu:20060516, //0x25,
339 0xf3, //RobertYu:20060516, //0xd3,
345 0x12, //RobertYu:20060627, //0x10,
353 0x05, //RobertYu:20060516, //0x0c,
372 //{{RobertYu:20060515, new BB setting for VT3226D0
373 static u8 abyVT3184_VT3226D0[] = {
383 0x45,//tx //0x64 for FPGA
401 0x8e, //RobertYu:20060525, //0x8d,
402 0x0a, //RobertYu:20060515, //0x09,
421 0x0c, //RobertYu:20060525, //0x10,
454 0x00,//50 //RobertYu:20060505, //0x15,//50
463 0xd0, //RobertYu:20060505, //0xb0,
482 0x00, //0x80 for FPGA
512 0x1f, //RobertYu:20060515, //0x0f,
517 0x00, //RobertYu:20060505, //0x02,
518 0x20,//90 //RobertYu:20060505, //0x22,//90
571 0xff, //RobertYu:20060509, //0x2c,
572 0x10, //RobertYu:20060525, //0x0c,
575 0x00, //RobertYu:20060505, //0x01,
576 0x84, //RobertYu:20060525, //0x8f,
580 0x24, //RobertYu:20060627, //0x18,
581 0x05, //RobertYu:20060515, //0x25,
599 0xf3, //RobertYu:20060515, //0xd3,
605 0x10, //RobertYu:20060627, //0x0e,
613 0x08, //RobertYu:20060515, //0x0c,
632 static const u16 awcFrameTime[MAX_RATE] =
633 {10, 20, 55, 110, 24, 36, 48, 72, 96, 144, 192, 216};
636 * Description: Calculate data frame transmitting time
640 * preamble_type - Preamble Type
641 * pkt_type - PK_TYPE_11A, PK_TYPE_11B, PK_TYPE_11GB, PK_TYPE_11GA
642 * frame_length - Baseband Type
646 * Return Value: FrameTime
649 unsigned int BBuGetFrameTime(u8 preamble_type, u8 pkt_type,
650 unsigned int frame_length, u16 tx_rate)
652 unsigned int frame_time;
653 unsigned int preamble;
655 unsigned int rate = 0;
657 if (tx_rate > RATE_54M)
660 rate = (unsigned int)awcFrameTime[tx_rate];
663 if (preamble_type == 1)
668 frame_time = (frame_length * 80) / rate;
669 tmp = (frame_time * rate) / 80;
671 if (frame_length != tmp)
674 return preamble + frame_time;
676 frame_time = (frame_length * 8 + 22) / rate;
677 tmp = ((frame_time * rate) - 22) / 8;
679 if (frame_length != tmp)
682 frame_time = frame_time * 4;
684 if (pkt_type != PK_TYPE_11A)
687 return 20 + frame_time;
692 * Description: Calculate Length, Service, and Signal fields of Phy for Tx
696 * priv - Device Structure
697 * frame_length - Tx Frame Length
700 * struct vnt_phy_field *phy
701 * - pointer to Phy Length field
702 * - pointer to Phy Service field
703 * - pointer to Phy Signal field
708 void BBvCalculateParameter(struct vnt_private *priv, u32 frame_length,
709 u16 tx_rate, u8 pkt_type, struct vnt_phy_field *phy)
715 u8 preamble_type = priv->byPreambleType;
717 bit_count = frame_length * 8;
728 count = bit_count / 2;
730 if (preamble_type == 1)
737 count = (bit_count * 10) / 55;
738 tmp = (count * 55) / 10;
740 if (tmp != bit_count)
743 if (preamble_type == 1)
750 count = bit_count / 11;
753 if (tmp != bit_count) {
756 if ((bit_count - tmp) <= 3)
760 if (preamble_type == 1)
767 if (pkt_type == PK_TYPE_11A)
774 if (pkt_type == PK_TYPE_11A)
781 if (pkt_type == PK_TYPE_11A)
788 if (pkt_type == PK_TYPE_11A)
795 if (pkt_type == PK_TYPE_11A)
802 if (pkt_type == PK_TYPE_11A)
809 if (pkt_type == PK_TYPE_11A)
816 if (pkt_type == PK_TYPE_11A)
822 if (pkt_type == PK_TYPE_11A)
829 if (pkt_type == PK_TYPE_11B) {
832 phy->service |= 0x80;
833 phy->len = cpu_to_le16((u16)count);
836 phy->len = cpu_to_le16((u16)frame_length);
841 * Description: Set Antenna mode
845 * priv - Device Structure
846 * antenna_mode - Antenna Mode
853 void BBvSetAntennaMode(struct vnt_private *priv, u8 antenna_mode)
855 switch (antenna_mode) {
860 priv->byBBRxConf &= 0xFC;
863 priv->byBBRxConf &= 0xFE;
864 priv->byBBRxConf |= 0x02;
868 vnt_control_out(priv, MESSAGE_TYPE_SET_ANTMD,
869 (u16)antenna_mode, 0, 0, NULL);
873 * Description: Set Antenna mode
877 * pDevice - Device Structure
878 * byAntennaMode - Antenna Mode
886 int BBbVT3184Init(struct vnt_private *priv)
896 status = vnt_control_in(priv, MESSAGE_TYPE_READ, 0,
897 MESSAGE_REQUEST_EEPROM, EEP_MAX_CONTEXT_SIZE,
899 if (status != STATUS_SUCCESS)
902 /* zonetype initial */
903 priv->byOriginalZonetype = priv->abyEEPROM[EEP_OFS_ZONETYPE];
905 if (priv->config_file.ZoneType >= 0) {
906 if ((priv->config_file.ZoneType == 0) &&
907 (priv->abyEEPROM[EEP_OFS_ZONETYPE] != 0x00)) {
908 priv->abyEEPROM[EEP_OFS_ZONETYPE] = 0;
909 priv->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0B;
911 dev_dbg(&priv->usb->dev, "Init Zone Type :USA\n");
912 } else if ((priv->config_file.ZoneType == 1) &&
913 (priv->abyEEPROM[EEP_OFS_ZONETYPE] != 0x01)) {
914 priv->abyEEPROM[EEP_OFS_ZONETYPE] = 0x01;
915 priv->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0D;
917 dev_dbg(&priv->usb->dev, "Init Zone Type :Japan\n");
918 } else if ((priv->config_file.ZoneType == 2) &&
919 (priv->abyEEPROM[EEP_OFS_ZONETYPE] != 0x02)) {
920 priv->abyEEPROM[EEP_OFS_ZONETYPE] = 0x02;
921 priv->abyEEPROM[EEP_OFS_MAXCHANNEL] = 0x0D;
923 dev_dbg(&priv->usb->dev, "Init Zone Type :Europe\n");
925 if (priv->config_file.ZoneType !=
926 priv->abyEEPROM[EEP_OFS_ZONETYPE])
927 printk("zonetype in file[%02x]\
928 mismatch with in EEPROM[%02x]\n",
929 priv->config_file.ZoneType,
930 priv->abyEEPROM[EEP_OFS_ZONETYPE]);
932 printk("Read Zonetype file success,\
933 use default zonetype setting[%02x]\n",
934 priv->config_file.ZoneType);
938 if (!priv->bZoneRegExist)
939 priv->byZoneType = priv->abyEEPROM[EEP_OFS_ZONETYPE];
941 priv->byRFType = priv->abyEEPROM[EEP_OFS_RFTYPE];
943 dev_dbg(&priv->usb->dev, "Zone Type %x\n", priv->byZoneType);
945 dev_dbg(&priv->usb->dev, "RF Type %d\n", priv->byRFType);
947 if ((priv->byRFType == RF_AL2230) ||
948 (priv->byRFType == RF_AL2230S)) {
949 priv->byBBRxConf = abyVT3184_AL2230[10];
950 length = sizeof(abyVT3184_AL2230);
951 addr = abyVT3184_AL2230;
953 length_agc = sizeof(abyVT3184_AGC);
955 priv->abyBBVGA[0] = 0x1C;
956 priv->abyBBVGA[1] = 0x10;
957 priv->abyBBVGA[2] = 0x0;
958 priv->abyBBVGA[3] = 0x0;
959 priv->ldBmThreshold[0] = -70;
960 priv->ldBmThreshold[1] = -48;
961 priv->ldBmThreshold[2] = 0;
962 priv->ldBmThreshold[3] = 0;
963 } else if (priv->byRFType == RF_AIROHA7230) {
964 priv->byBBRxConf = abyVT3184_AL2230[10];
965 length = sizeof(abyVT3184_AL2230);
966 addr = abyVT3184_AL2230;
968 length_agc = sizeof(abyVT3184_AGC);
972 priv->abyBBVGA[0] = 0x1c;
973 priv->abyBBVGA[1] = 0x10;
974 priv->abyBBVGA[2] = 0x0;
975 priv->abyBBVGA[3] = 0x0;
976 priv->ldBmThreshold[0] = -70;
977 priv->ldBmThreshold[1] = -48;
978 priv->ldBmThreshold[2] = 0;
979 priv->ldBmThreshold[3] = 0;
980 } else if ((priv->byRFType == RF_VT3226) ||
981 (priv->byRFType == RF_VT3226D0)) {
982 priv->byBBRxConf = abyVT3184_VT3226D0[10];
983 length = sizeof(abyVT3184_VT3226D0);
984 addr = abyVT3184_VT3226D0;
986 length_agc = sizeof(abyVT3184_AGC);
988 priv->abyBBVGA[0] = 0x20;
989 priv->abyBBVGA[1] = 0x10;
990 priv->abyBBVGA[2] = 0x0;
991 priv->abyBBVGA[3] = 0x0;
992 priv->ldBmThreshold[0] = -70;
993 priv->ldBmThreshold[1] = -48;
994 priv->ldBmThreshold[2] = 0;
995 priv->ldBmThreshold[3] = 0;
996 /* Fix VT3226 DFC system timing issue */
997 MACvRegBitsOn(priv, MAC_REG_SOFTPWRCTL2, SOFTPWRCTL_RFLEOPT);
998 } else if ((priv->byRFType == RF_VT3342A0)) {
999 priv->byBBRxConf = abyVT3184_VT3226D0[10];
1000 length = sizeof(abyVT3184_VT3226D0);
1001 addr = abyVT3184_VT3226D0;
1002 agc = abyVT3184_AGC;
1003 length_agc = sizeof(abyVT3184_AGC);
1005 priv->abyBBVGA[0] = 0x20;
1006 priv->abyBBVGA[1] = 0x10;
1007 priv->abyBBVGA[2] = 0x0;
1008 priv->abyBBVGA[3] = 0x0;
1009 priv->ldBmThreshold[0] = -70;
1010 priv->ldBmThreshold[1] = -48;
1011 priv->ldBmThreshold[2] = 0;
1012 priv->ldBmThreshold[3] = 0;
1013 /* Fix VT3226 DFC system timing issue */
1014 MACvRegBitsOn(priv, MAC_REG_SOFTPWRCTL2, SOFTPWRCTL_RFLEOPT);
1019 memcpy(array, addr, length);
1021 vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0,
1022 MESSAGE_REQUEST_BBREG, length, array);
1024 memcpy(array, agc, length_agc);
1026 vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0,
1027 MESSAGE_REQUEST_BBAGC, length_agc, array);
1029 if ((priv->byRFType == RF_VT3226) ||
1030 (priv->byRFType == RF_VT3342A0)) {
1031 vnt_control_out_u8(priv, MESSAGE_REQUEST_MACREG,
1032 MAC_REG_ITRTMSET, 0x23);
1033 MACvRegBitsOn(priv, MAC_REG_PAPEDELAY, 0x01);
1034 } else if (priv->byRFType == RF_VT3226D0) {
1035 vnt_control_out_u8(priv, MESSAGE_REQUEST_MACREG,
1036 MAC_REG_ITRTMSET, 0x11);
1037 MACvRegBitsOn(priv, MAC_REG_PAPEDELAY, 0x01);
1040 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x04, 0x7f);
1041 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0x01);
1043 vnt_rf_table_download(priv);
1045 /* Fix for TX USB resets from vendors driver */
1046 vnt_control_in(priv, MESSAGE_TYPE_READ, USB_REG4,
1047 MESSAGE_REQUEST_MEM, sizeof(data), &data);
1051 vnt_control_out(priv, MESSAGE_TYPE_WRITE, USB_REG4,
1052 MESSAGE_REQUEST_MEM, sizeof(data), &data);
1058 * Description: Set ShortSlotTime mode
1062 * priv - Device Structure
1066 * Return Value: none
1069 void BBvSetShortSlotTime(struct vnt_private *priv)
1073 if (priv->bShortSlotTime)
1074 priv->byBBRxConf &= 0xdf;
1076 priv->byBBRxConf |= 0x20;
1078 vnt_control_in_u8(priv, MESSAGE_REQUEST_BBREG, 0xe7, &bb_vga);
1080 if (bb_vga == priv->abyBBVGA[0])
1081 priv->byBBRxConf |= 0x20;
1083 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0a, priv->byBBRxConf);
1086 void BBvSetVGAGainOffset(struct vnt_private *priv, u8 data)
1089 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xE7, data);
1091 /* patch for 3253B0 Baseband with Cardbus module */
1092 if (priv->bShortSlotTime)
1093 priv->byBBRxConf &= 0xdf; /* 1101 1111 */
1095 priv->byBBRxConf |= 0x20; /* 0010 0000 */
1097 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0a, priv->byBBRxConf);
1101 * Description: BBvSetDeepSleep
1105 * priv - Device Structure
1109 * Return Value: none
1112 void BBvSetDeepSleep(struct vnt_private *priv)
1114 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0c, 0x17);/* CR12 */
1115 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0xB9);/* CR13 */
1118 void BBvExitDeepSleep(struct vnt_private *priv)
1120 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0c, 0x00);/* CR12 */
1121 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0x01);/* CR13 */
1124 void BBvUpdatePreEDThreshold(struct vnt_private *priv, int scanning)
1126 u8 cr_201 = 0x0, cr_206 = 0x0;
1127 u8 ed_inx = priv->byBBPreEDIndex;
1129 switch (priv->byRFType) {
1133 if (scanning) { /* Max sensitivity */
1139 if (priv->byBBPreEDRSSI <= 45) {
1142 } else if (priv->byBBPreEDRSSI <= 46) {
1145 } else if (priv->byBBPreEDRSSI <= 47) {
1148 } else if (priv->byBBPreEDRSSI <= 49) {
1151 } else if (priv->byBBPreEDRSSI <= 51) {
1154 } else if (priv->byBBPreEDRSSI <= 53) {
1157 } else if (priv->byBBPreEDRSSI <= 55) {
1160 } else if (priv->byBBPreEDRSSI <= 56) {
1164 } else if (priv->byBBPreEDRSSI <= 57) {
1168 } else if (priv->byBBPreEDRSSI <= 58) {
1172 } else if (priv->byBBPreEDRSSI <= 59) {
1176 } else if (priv->byBBPreEDRSSI <= 60) {
1180 } else if (priv->byBBPreEDRSSI <= 61) {
1183 } else if (priv->byBBPreEDRSSI <= 62) {
1186 } else if (priv->byBBPreEDRSSI <= 63) {
1189 } else if (priv->byBBPreEDRSSI <= 64) {
1192 } else if (priv->byBBPreEDRSSI <= 65) {
1195 } else if (priv->byBBPreEDRSSI <= 66) {
1198 } else if (priv->byBBPreEDRSSI <= 67) {
1201 } else if (priv->byBBPreEDRSSI <= 68) {
1212 if (scanning) { /* Max sensitivity */
1218 if (priv->byBBPreEDRSSI <= 41) {
1221 } else if (priv->byBBPreEDRSSI <= 42) {
1224 } else if (priv->byBBPreEDRSSI <= 43) {
1227 } else if (priv->byBBPreEDRSSI <= 45) {
1230 } else if (priv->byBBPreEDRSSI <= 47) {
1233 } else if (priv->byBBPreEDRSSI <= 49) {
1236 } else if (priv->byBBPreEDRSSI <= 51) {
1239 } else if (priv->byBBPreEDRSSI <= 53) {
1242 } else if (priv->byBBPreEDRSSI <= 55) {
1246 } else if (priv->byBBPreEDRSSI <= 56) {
1250 } else if (priv->byBBPreEDRSSI <= 57) {
1254 } else if (priv->byBBPreEDRSSI <= 58) {
1258 } else if (priv->byBBPreEDRSSI <= 59) {
1262 } else if (priv->byBBPreEDRSSI <= 60) {
1265 } else if (priv->byBBPreEDRSSI <= 61) {
1268 } else if (priv->byBBPreEDRSSI <= 62) {
1271 } else if (priv->byBBPreEDRSSI <= 63) {
1274 } else if (priv->byBBPreEDRSSI <= 64) {
1277 } else if (priv->byBBPreEDRSSI <= 65) {
1280 } else if (priv->byBBPreEDRSSI <= 66) {
1283 } else if (priv->byBBPreEDRSSI <= 67) {
1286 } else if (priv->byBBPreEDRSSI <= 68) {
1296 if (scanning) { /* need Max sensitivity */
1302 if (priv->byBBPreEDRSSI <= 41) {
1305 } else if (priv->byBBPreEDRSSI <= 42) {
1308 } else if (priv->byBBPreEDRSSI <= 43) {
1311 } else if (priv->byBBPreEDRSSI <= 45) {
1314 } else if (priv->byBBPreEDRSSI <= 47) {
1317 } else if (priv->byBBPreEDRSSI <= 49) {
1320 } else if (priv->byBBPreEDRSSI <= 51) {
1323 } else if (priv->byBBPreEDRSSI <= 53) {
1326 } else if (priv->byBBPreEDRSSI <= 55) {
1330 } else if (priv->byBBPreEDRSSI <= 56) {
1334 } else if (priv->byBBPreEDRSSI <= 57) {
1338 } else if (priv->byBBPreEDRSSI <= 58) {
1342 } else if (priv->byBBPreEDRSSI <= 59) {
1346 } else if (priv->byBBPreEDRSSI <= 60) {
1349 } else if (priv->byBBPreEDRSSI <= 61) {
1352 } else if (priv->byBBPreEDRSSI <= 62) {
1355 } else if (priv->byBBPreEDRSSI <= 63) {
1358 } else if (priv->byBBPreEDRSSI <= 64) {
1361 } else if (priv->byBBPreEDRSSI <= 65) {
1364 } else if (priv->byBBPreEDRSSI <= 66) {
1375 if (ed_inx == priv->byBBPreEDIndex && !scanning)
1378 priv->byBBPreEDIndex = ed_inx;
1380 dev_dbg(&priv->usb->dev, "%s byBBPreEDRSSI %d\n",
1381 __func__, priv->byBBPreEDRSSI);
1383 if (!cr_201 && !cr_206)
1386 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xc9, cr_201);
1387 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xce, cr_206);