int vnt_check_firmware_version(struct vnt_private *priv) { int status; status = vnt_control_in(priv, MESSAGE_TYPE_READ, 0, MESSAGE_REQUEST_VERSION, 2, (u8 *)&priv->firmware_version); dev_dbg(&priv->usb->dev, "Firmware Version [%04x]\n", priv->firmware_version); if (status != STATUS_SUCCESS) { dev_dbg(&priv->usb->dev, "Firmware Invalid.\n"); return false; } if (priv->firmware_version == 0xFFFF) { dev_dbg(&priv->usb->dev, "In Loader.\n"); return false; } dev_dbg(&priv->usb->dev, "Firmware Version [%04x]\n", priv->firmware_version); if (priv->firmware_version < FIRMWARE_VERSION) { /* branch to loader for download new firmware */ vnt_firmware_branch_to_sram(priv); return false; } return true; }
/* * initialization of MAC & BBP registers */ static int vnt_init_registers(struct vnt_private *priv) { struct vnt_cmd_card_init *init_cmd = &priv->init_command; struct vnt_rsp_card_init *init_rsp = &priv->init_response; u8 antenna; int ii; int status = STATUS_SUCCESS; u8 tmp; u8 calib_tx_iq = 0, calib_tx_dc = 0, calib_rx_iq = 0; dev_dbg(&priv->usb->dev, "---->INIbInitAdapter. [%d][%d]\n", DEVICE_INIT_COLD, priv->packet_type); if (!vnt_check_firmware_version(priv)) { if (vnt_download_firmware(priv) == true) { if (vnt_firmware_branch_to_sram(priv) == false) { dev_dbg(&priv->usb->dev, " vnt_firmware_branch_to_sram fail\n"); return false; } } else { dev_dbg(&priv->usb->dev, "FIRMWAREbDownload fail\n"); return false; } } if (!vnt_vt3184_init(priv)) { dev_dbg(&priv->usb->dev, "vnt_vt3184_init fail\n"); return false; } init_cmd->init_class = DEVICE_INIT_COLD; init_cmd->exist_sw_net_addr = priv->exist_sw_net_addr; for (ii = 0; ii < 6; ii++) init_cmd->sw_net_addr[ii] = priv->current_net_addr[ii]; init_cmd->short_retry_limit = priv->short_retry_limit; init_cmd->long_retry_limit = priv->long_retry_limit; /* issue card_init command to device */ status = vnt_control_out(priv, MESSAGE_TYPE_CARDINIT, 0, 0, sizeof(struct vnt_cmd_card_init), (u8 *)init_cmd); if (status != STATUS_SUCCESS) { dev_dbg(&priv->usb->dev, "Issue Card init fail\n"); return false; } status = vnt_control_in(priv, MESSAGE_TYPE_INIT_RSP, 0, 0, sizeof(struct vnt_rsp_card_init), (u8 *)init_rsp); if (status != STATUS_SUCCESS) { dev_dbg(&priv->usb->dev, "Cardinit request in status fail!\n"); return false; } /* local ID for AES functions */ status = vnt_control_in(priv, MESSAGE_TYPE_READ, MAC_REG_LOCALID, MESSAGE_REQUEST_MACREG, 1, &priv->local_id); if (status != STATUS_SUCCESS) return false; /* do MACbSoftwareReset in MACvInitialize */ priv->top_ofdm_basic_rate = RATE_24M; priv->top_cck_basic_rate = RATE_1M; /* target to IF pin while programming to RF chip */ priv->power = 0xFF; priv->cck_pwr = priv->eeprom[EEP_OFS_PWR_CCK]; priv->ofdm_pwr_g = priv->eeprom[EEP_OFS_PWR_OFDMG]; /* load power table */ for (ii = 0; ii < 14; ii++) { priv->cck_pwr_tbl[ii] = priv->eeprom[ii + EEP_OFS_CCK_PWR_TBL]; if (priv->cck_pwr_tbl[ii] == 0) priv->cck_pwr_tbl[ii] = priv->cck_pwr; priv->ofdm_pwr_tbl[ii] = priv->eeprom[ii + EEP_OFS_OFDM_PWR_TBL]; if (priv->ofdm_pwr_tbl[ii] == 0) priv->ofdm_pwr_tbl[ii] = priv->ofdm_pwr_g; } /* * original zonetype is USA, but custom zonetype is Europe, * then need to recover 12, 13, 14 channels with 11 channel */ for (ii = 11; ii < 14; ii++) { priv->cck_pwr_tbl[ii] = priv->cck_pwr_tbl[10]; priv->ofdm_pwr_tbl[ii] = priv->ofdm_pwr_tbl[10]; } priv->ofdm_pwr_a = 0x34; /* same as RFbMA2829SelectChannel */ /* load OFDM A power table */ for (ii = 0; ii < CB_MAX_CHANNEL_5G; ii++) { priv->ofdm_a_pwr_tbl[ii] = priv->eeprom[ii + EEP_OFS_OFDMA_PWR_TBL]; if (priv->ofdm_a_pwr_tbl[ii] == 0) priv->ofdm_a_pwr_tbl[ii] = priv->ofdm_pwr_a; } antenna = priv->eeprom[EEP_OFS_ANTENNA]; if (antenna & EEP_ANTINV) priv->tx_rx_ant_inv = true; else priv->tx_rx_ant_inv = false; antenna &= (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN); if (antenna == 0) /* if not set default is both */ antenna = (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN); if (antenna == (EEP_ANTENNA_AUX | EEP_ANTENNA_MAIN)) { priv->tx_antenna_mode = ANT_B; priv->rx_antenna_sel = 1; if (priv->tx_rx_ant_inv) priv->rx_antenna_mode = ANT_A; else priv->rx_antenna_mode = ANT_B; } else { priv->rx_antenna_sel = 0; if (antenna & EEP_ANTENNA_AUX) { priv->tx_antenna_mode = ANT_A; if (priv->tx_rx_ant_inv) priv->rx_antenna_mode = ANT_B; else priv->rx_antenna_mode = ANT_A; } else { priv->tx_antenna_mode = ANT_B; if (priv->tx_rx_ant_inv) priv->rx_antenna_mode = ANT_A; else priv->rx_antenna_mode = ANT_B; } } /* Set initial antenna mode */ vnt_set_antenna_mode(priv, priv->rx_antenna_mode); /* get Auto Fall Back type */ priv->auto_fb_ctrl = AUTO_FB_0; /* default Auto Mode */ priv->bb_type = BB_TYPE_11G; /* get RFType */ priv->rf_type = init_rsp->rf_type; /* load vt3266 calibration parameters in EEPROM */ if (priv->rf_type == RF_VT3226D0) { if ((priv->eeprom[EEP_OFS_MAJOR_VER] == 0x1) && (priv->eeprom[EEP_OFS_MINOR_VER] >= 0x4)) { calib_tx_iq = priv->eeprom[EEP_OFS_CALIB_TX_IQ]; calib_tx_dc = priv->eeprom[EEP_OFS_CALIB_TX_DC]; calib_rx_iq = priv->eeprom[EEP_OFS_CALIB_RX_IQ]; if (calib_tx_iq || calib_tx_dc || calib_rx_iq) { /* CR255, enable TX/RX IQ and * DC compensation mode */ vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xff, 0x03); /* CR251, TX I/Q Imbalance Calibration */ vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xfb, calib_tx_iq); /* CR252, TX DC-Offset Calibration */ vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xfC, calib_tx_dc); /* CR253, RX I/Q Imbalance Calibration */ vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xfd, calib_rx_iq); } else { /* CR255, turn off * BB Calibration compensation */ vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xff, 0x0); } } } /* get permanent network address */ memcpy(priv->permanent_net_addr, init_rsp->net_addr, 6); ether_addr_copy(priv->current_net_addr, priv->permanent_net_addr); /* if exist SW network address, use it */ dev_dbg(&priv->usb->dev, "Network address = %pM\n", priv->current_net_addr); /* * set BB and packet type at the same time * set Short Slot Time, xIFS, and RSPINF */ if (priv->bb_type == BB_TYPE_11A) priv->short_slot_time = true; else priv->short_slot_time = false; vnt_set_short_slot_time(priv); priv->radio_ctl = priv->eeprom[EEP_OFS_RADIOCTL]; if ((priv->radio_ctl & EEP_RADIOCTL_ENABLE) != 0) { status = vnt_control_in(priv, MESSAGE_TYPE_READ, MAC_REG_GPIOCTL1, MESSAGE_REQUEST_MACREG, 1, &tmp); if (status != STATUS_SUCCESS) return false; if ((tmp & GPIO3_DATA) == 0) vnt_mac_reg_bits_on(priv, MAC_REG_GPIOCTL1, GPIO3_INTMD); else vnt_mac_reg_bits_off(priv, MAC_REG_GPIOCTL1, GPIO3_INTMD); } vnt_mac_set_led(priv, LEDSTS_TMLEN, 0x38); vnt_mac_set_led(priv, LEDSTS_STS, LEDSTS_SLOW); vnt_mac_reg_bits_on(priv, MAC_REG_GPIOCTL0, 0x01); vnt_radio_power_on(priv); dev_dbg(&priv->usb->dev, "<----INIbInitAdapter Exit\n"); return true; }
int vnt_vt3184_init(struct vnt_private *priv) { int ret = 0; u16 length; u8 *addr; u8 *agc; u16 length_agc; u8 array[256]; u8 data; ret = vnt_control_in(priv, MESSAGE_TYPE_READ, 0, MESSAGE_REQUEST_EEPROM, EEP_MAX_CONTEXT_SIZE, priv->eeprom); if (ret) goto end; priv->rf_type = priv->eeprom[EEP_OFS_RFTYPE]; dev_dbg(&priv->usb->dev, "RF Type %d\n", priv->rf_type); if ((priv->rf_type == RF_AL2230) || (priv->rf_type == RF_AL2230S)) { priv->bb_rx_conf = vnt_vt3184_al2230[10]; length = sizeof(vnt_vt3184_al2230); addr = vnt_vt3184_al2230; agc = vnt_vt3184_agc; length_agc = sizeof(vnt_vt3184_agc); priv->bb_vga[0] = 0x1C; priv->bb_vga[1] = 0x10; priv->bb_vga[2] = 0x0; priv->bb_vga[3] = 0x0; } else if (priv->rf_type == RF_AIROHA7230) { priv->bb_rx_conf = vnt_vt3184_al2230[10]; length = sizeof(vnt_vt3184_al2230); addr = vnt_vt3184_al2230; agc = vnt_vt3184_agc; length_agc = sizeof(vnt_vt3184_agc); addr[0xd7] = 0x06; priv->bb_vga[0] = 0x1c; priv->bb_vga[1] = 0x10; priv->bb_vga[2] = 0x0; priv->bb_vga[3] = 0x0; } else if ((priv->rf_type == RF_VT3226) || (priv->rf_type == RF_VT3226D0)) { priv->bb_rx_conf = vnt_vt3184_vt3226d0[10]; length = sizeof(vnt_vt3184_vt3226d0); addr = vnt_vt3184_vt3226d0; agc = vnt_vt3184_agc; length_agc = sizeof(vnt_vt3184_agc); priv->bb_vga[0] = 0x20; priv->bb_vga[1] = 0x10; priv->bb_vga[2] = 0x0; priv->bb_vga[3] = 0x0; /* Fix VT3226 DFC system timing issue */ ret = vnt_mac_reg_bits_on(priv, MAC_REG_SOFTPWRCTL2, SOFTPWRCTL_RFLEOPT); if (ret) goto end; } else if (priv->rf_type == RF_VT3342A0) { priv->bb_rx_conf = vnt_vt3184_vt3226d0[10]; length = sizeof(vnt_vt3184_vt3226d0); addr = vnt_vt3184_vt3226d0; agc = vnt_vt3184_agc; length_agc = sizeof(vnt_vt3184_agc); priv->bb_vga[0] = 0x20; priv->bb_vga[1] = 0x10; priv->bb_vga[2] = 0x0; priv->bb_vga[3] = 0x0; /* Fix VT3226 DFC system timing issue */ ret = vnt_mac_reg_bits_on(priv, MAC_REG_SOFTPWRCTL2, SOFTPWRCTL_RFLEOPT); if (ret) goto end; } else { goto end; } memcpy(array, addr, length); ret = vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0, MESSAGE_REQUEST_BBREG, length, array); if (ret) goto end; memcpy(array, agc, length_agc); ret = vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0, MESSAGE_REQUEST_BBAGC, length_agc, array); if (ret) goto end; if ((priv->rf_type == RF_VT3226) || (priv->rf_type == RF_VT3342A0)) { ret = vnt_control_out_u8(priv, MESSAGE_REQUEST_MACREG, MAC_REG_ITRTMSET, 0x23); if (ret) goto end; ret = vnt_mac_reg_bits_on(priv, MAC_REG_PAPEDELAY, 0x01); if (ret) goto end; } else if (priv->rf_type == RF_VT3226D0) { ret = vnt_control_out_u8(priv, MESSAGE_REQUEST_MACREG, MAC_REG_ITRTMSET, 0x11); if (ret) goto end; ret = vnt_mac_reg_bits_on(priv, MAC_REG_PAPEDELAY, 0x01); if (ret) goto end; } ret = vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x04, 0x7f); if (ret) goto end; ret = vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0x01); if (ret) goto end; ret = vnt_rf_table_download(priv); if (ret) goto end; /* Fix for TX USB resets from vendors driver */ ret = vnt_control_in(priv, MESSAGE_TYPE_READ, USB_REG4, MESSAGE_REQUEST_MEM, sizeof(data), &data); if (ret) goto end; data |= 0x2; ret = vnt_control_out(priv, MESSAGE_TYPE_WRITE, USB_REG4, MESSAGE_REQUEST_MEM, sizeof(data), &data); end: return ret; }
void vnt_control_in_u8(struct vnt_private *priv, u8 reg, u8 reg_off, u8 *data) { vnt_control_in(priv, MESSAGE_TYPE_READ, reg_off, reg, sizeof(u8), data); }