Beispiel #1
0
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;
}
Beispiel #2
0
/* 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;
}