int vnt_rf_set_txpower(struct vnt_private *priv, u8 power, u32 rate) { u32 power_setting = 0; int ret = true; power += vnt_rf_addpower(priv); if (power > VNT_RF_MAX_POWER) power = VNT_RF_MAX_POWER; if (priv->byCurPwr == power) return true; priv->byCurPwr = power; switch (priv->byRFType) { case RF_AL2230: if (priv->byCurPwr >= AL2230_PWR_IDX_LEN) return false; ret &= vnt_rf_write_embedded(priv, al2230_power_table[priv->byCurPwr]); if (rate <= RATE_11M) ret &= vnt_rf_write_embedded(priv, 0x0001b400 + (BY_AL2230_REG_LEN << 3) + IFREGCTL_REGW); else ret &= vnt_rf_write_embedded(priv, 0x0005a400 + (BY_AL2230_REG_LEN << 3) + IFREGCTL_REGW); break; case RF_AL2230S: if (priv->byCurPwr >= AL2230_PWR_IDX_LEN) return false; ret &= vnt_rf_write_embedded(priv, al2230_power_table[priv->byCurPwr]); if (rate <= RATE_11M) { ret &= vnt_rf_write_embedded(priv, 0x040c1400 + (BY_AL2230_REG_LEN << 3) + IFREGCTL_REGW); ret &= vnt_rf_write_embedded(priv, 0x00299b00 + (BY_AL2230_REG_LEN << 3) + IFREGCTL_REGW); } else { ret &= vnt_rf_write_embedded(priv, 0x0005a400 + (BY_AL2230_REG_LEN << 3) + IFREGCTL_REGW); ret &= vnt_rf_write_embedded(priv, 0x00099b00 + (BY_AL2230_REG_LEN << 3) + IFREGCTL_REGW); } break; case RF_AIROHA7230: if (rate <= RATE_11M) ret &= vnt_rf_write_embedded(priv, 0x111bb900 + (BY_AL7230_REG_LEN << 3)+IFREGCTL_REGW); else ret &= vnt_rf_write_embedded(priv, 0x221bb900 + (BY_AL7230_REG_LEN << 3)+IFREGCTL_REGW); if (priv->byCurPwr > AL7230_PWR_IDX_LEN) return false; /* * 0x080F1B00 for 3 wire control TxGain(D10) * and 0x31 as TX Gain value */ power_setting = 0x080c0b00 | ((priv->byCurPwr) << 12) | (BY_AL7230_REG_LEN << 3) | IFREGCTL_REGW; ret &= vnt_rf_write_embedded(priv, power_setting); break; case RF_VT3226: if (priv->byCurPwr >= VT3226_PWR_IDX_LEN) return false; power_setting = ((0x3f - priv->byCurPwr) << 20) | (0x17 << 8) | (BY_VT3226_REG_LEN << 3) | IFREGCTL_REGW; ret &= vnt_rf_write_embedded(priv, power_setting); break; case RF_VT3226D0: if (priv->byCurPwr >= VT3226_PWR_IDX_LEN) return false; if (rate <= RATE_11M) { power_setting = ((0x3f-priv->byCurPwr) << 20) | (0xe07 << 8) | (BY_VT3226_REG_LEN << 3) | IFREGCTL_REGW; ret &= vnt_rf_write_embedded(priv, power_setting); ret &= vnt_rf_write_embedded(priv, 0x03c6a200 + (BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW); if (priv->vnt_mgmt.eScanState != WMAC_NO_SCANNING) { dev_dbg(&priv->usb->dev, "vnt_rf_set_txpower> 11B mode uCurrChannel[%d]\n", priv->vnt_mgmt.uScanChannel); ret &= vnt_rf_write_embedded(priv, vt3226d0_lo_current_table[priv-> vnt_mgmt.uScanChannel - 1]); } else { dev_dbg(&priv->usb->dev, "vnt_rf_set_txpower> 11B mode uCurrChannel[%d]\n", priv->vnt_mgmt.uCurrChannel); ret &= vnt_rf_write_embedded(priv, vt3226d0_lo_current_table[priv-> vnt_mgmt.uCurrChannel - 1]); } ret &= vnt_rf_write_embedded(priv, 0x015C0800 + (BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW); } else { dev_dbg(&priv->usb->dev, "@@@@ vnt_rf_set_txpower> 11G mode\n"); power_setting = ((0x3f-priv->byCurPwr) << 20) | (0x7 << 8) | (BY_VT3226_REG_LEN << 3) | IFREGCTL_REGW; ret &= vnt_rf_write_embedded(priv, power_setting); ret &= vnt_rf_write_embedded(priv, 0x00C6A200 + (BY_VT3226_REG_LEN << 3) + IFREGCTL_REGW); ret &= vnt_rf_write_embedded(priv, 0x016BC600 + (BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW); ret &= vnt_rf_write_embedded(priv, 0x00900800 + (BY_VT3226_REG_LEN<<3)+IFREGCTL_REGW); } break; case RF_VT3342A0: if (priv->byCurPwr >= VT3342_PWR_IDX_LEN) return false; power_setting = ((0x3F-priv->byCurPwr) << 20) | (0x27 << 8) | (BY_VT3342_REG_LEN << 3) | IFREGCTL_REGW; ret &= vnt_rf_write_embedded(priv, power_setting); break; default: break; } return ret; }
/* Set Tx power by power level and rate */ int vnt_rf_set_txpower(struct vnt_private *priv, u8 power, u32 rate) { u32 power_setting = 0; int ret = true; power += vnt_rf_addpower(priv); if (power > VNT_RF_MAX_POWER) power = VNT_RF_MAX_POWER; if (priv->power == power) return true; priv->power = power; switch (priv->rf_type) { case RF_AL2230: if (power >= AL2230_PWR_IDX_LEN) return false; ret &= vnt_rf_write_embedded(priv, al2230_power_table[power]); if (rate <= RATE_11M) ret &= vnt_rf_write_embedded(priv, 0x0001b400); else ret &= vnt_rf_write_embedded(priv, 0x0005a400); break; case RF_AL2230S: if (power >= AL2230_PWR_IDX_LEN) return false; ret &= vnt_rf_write_embedded(priv, al2230_power_table[power]); if (rate <= RATE_11M) { ret &= vnt_rf_write_embedded(priv, 0x040c1400); ret &= vnt_rf_write_embedded(priv, 0x00299b00); } else { ret &= vnt_rf_write_embedded(priv, 0x0005a400); ret &= vnt_rf_write_embedded(priv, 0x00099b00); } break; case RF_AIROHA7230: if (rate <= RATE_11M) ret &= vnt_rf_write_embedded(priv, 0x111bb900); else ret &= vnt_rf_write_embedded(priv, 0x221bb900); if (power >= AL7230_PWR_IDX_LEN) return false; /* * 0x080F1B00 for 3 wire control TxGain(D10) * and 0x31 as TX Gain value */ power_setting = 0x080c0b00 | (power << 12); ret &= vnt_rf_write_embedded(priv, power_setting); break; case RF_VT3226: if (power >= VT3226_PWR_IDX_LEN) return false; power_setting = ((0x3f - power) << 20) | (0x17 << 8); ret &= vnt_rf_write_embedded(priv, power_setting); break; case RF_VT3226D0: if (power >= VT3226_PWR_IDX_LEN) return false; if (rate <= RATE_11M) { u16 hw_value = priv->hw->conf.chandef.chan->hw_value; power_setting = ((0x3f - power) << 20) | (0xe07 << 8); ret &= vnt_rf_write_embedded(priv, power_setting); ret &= vnt_rf_write_embedded(priv, 0x03c6a200); dev_dbg(&priv->usb->dev, "%s 11b channel [%d]\n", __func__, hw_value); hw_value--; if (hw_value < ARRAY_SIZE(vt3226d0_lo_current_table)) ret &= vnt_rf_write_embedded(priv, vt3226d0_lo_current_table[hw_value]); ret &= vnt_rf_write_embedded(priv, 0x015C0800); } else { dev_dbg(&priv->usb->dev, "@@@@ vnt_rf_set_txpower> 11G mode\n"); power_setting = ((0x3f - power) << 20) | (0x7 << 8); ret &= vnt_rf_write_embedded(priv, power_setting); ret &= vnt_rf_write_embedded(priv, 0x00C6A200); ret &= vnt_rf_write_embedded(priv, 0x016BC600); ret &= vnt_rf_write_embedded(priv, 0x00900800); } break; case RF_VT3342A0: if (power >= VT3342_PWR_IDX_LEN) return false; power_setting = ((0x3f - power) << 20) | (0x27 << 8); ret &= vnt_rf_write_embedded(priv, power_setting); break; default: break; } return ret; }