where REG is the max power as per the regulatory domain
*/
- /*TODO: Get desired_pwr from wx_handlers or the stack
- limit_value(desired_pwr, 0, max_pwr);
- */
-
- desired_pwr = max_pwr; /* remove this when we have a real desired_pwr */
-
+ desired_pwr = limit_value(radio->txpower_desired, 0, max_pwr);
+ /* Check if we need to adjust the current power. */
pwr_adjust = desired_pwr - estimated_pwr;
-
radio_att_delta = -(pwr_adjust + 7) >> 3;
baseband_att_delta = -(pwr_adjust >> 1) - (4 * radio_att_delta);
if ((radio_att_delta == 0) && (baseband_att_delta == 0)) {
char *extra)
{
struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
+ struct bcm43xx_radioinfo *radio;
+ struct bcm43xx_phyinfo *phy;
unsigned long flags;
int err = -ENODEV;
+ u16 maxpower;
wx_enter();
+ if ((data->txpower.flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM) {
+ printk(PFX KERN_ERR "TX power not in dBm.\n");
+ return -EOPNOTSUPP;
+ }
+
spin_lock_irqsave(&bcm->lock, flags);
if (!bcm->initialized)
goto out_unlock;
- if (data->power.disabled != (!(bcm->current_core->radio->enabled))) {
- if (data->power.disabled)
+ radio = bcm->current_core->radio;
+ phy = bcm->current_core->phy;
+ if (data->txpower.disabled != (!(radio->enabled))) {
+ if (data->txpower.disabled)
bcm43xx_radio_turn_off(bcm);
else
bcm43xx_radio_turn_on(bcm);
}
- //TODO: set txpower.
+ if (data->txpower.value > 0) {
+ /* desired and maxpower dBm values are in Q5.2 */
+ if (phy->type == BCM43xx_PHYTYPE_A)
+ maxpower = bcm->sprom.maxpower_aphy;
+ else
+ maxpower = bcm->sprom.maxpower_bgphy;
+ radio->txpower_desired = limit_value(data->txpower.value << 2,
+ 0, maxpower);
+ bcm43xx_phy_xmitpower(bcm);
+ }
err = 0;
out_unlock:
char *extra)
{
struct bcm43xx_private *bcm = bcm43xx_priv(net_dev);
+ struct bcm43xx_radioinfo *radio;
unsigned long flags;
+ int err = -ENODEV;
wx_enter();
spin_lock_irqsave(&bcm->lock, flags);
-//TODO data->power.value = ???
- data->power.fixed = 1;
- data->power.flags = IW_TXPOW_DBM;
- data->power.disabled = !(bcm->current_core->radio->enabled);
+ if (!bcm->initialized)
+ goto out_unlock;
+ radio = bcm->current_core->radio;
+ /* desired dBm value is in Q5.2 */
+ data->txpower.value = radio->txpower_desired >> 2;
+ data->txpower.fixed = 1;
+ data->txpower.flags = IW_TXPOW_DBM;
+ data->txpower.disabled = !(radio->enabled);
+
+ err = 0;
+out_unlock:
spin_unlock_irqrestore(&bcm->lock, flags);
- return 0;
+ return err;
}
static int bcm43xx_wx_set_retry(struct net_device *net_dev,