]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/net/wireless/libertas/wext.c
libertas: convert CMD_802_11_RF_TX_POWER to a direct command
[linux-2.6-omap-h63xx.git] / drivers / net / wireless / libertas / wext.c
index 8b3ed77860b3e2cc6e8b526b53ccd43aaac95815..10a806666001d731d3afcf973428e302e078f203 100644 (file)
@@ -422,26 +422,24 @@ static int lbs_get_txpow(struct net_device *dev,
 {
        int ret = 0;
        struct lbs_private *priv = dev->priv;
+       s16 curlevel = 0;
 
        lbs_deb_enter(LBS_DEB_WEXT);
 
-       ret = lbs_prepare_and_send_command(priv,
-                                   CMD_802_11_RF_TX_POWER,
-                                   CMD_ACT_TX_POWER_OPT_GET,
-                                   CMD_OPTION_WAITFORRSP, 0, NULL);
-
+       ret = lbs_get_tx_power(priv, &curlevel, NULL, NULL);
        if (ret)
                goto out;
 
-       lbs_deb_wext("tx power level %d dbm\n", priv->txpowerlevel);
-       vwrq->value = priv->txpowerlevel;
+       lbs_deb_wext("tx power level %d dbm\n", curlevel);
+
+       priv->txpower_cur = curlevel;
+       vwrq->value = curlevel;
        vwrq->fixed = 1;
        if (priv->radioon) {
                vwrq->disabled = 0;
                vwrq->flags = IW_TXPOW_DBM;
-       } else {
+       } else
                vwrq->disabled = 1;
-       }
 
 out:
        lbs_deb_leave_args(LBS_DEB_WEXT, "ret %d", ret);
@@ -693,22 +691,12 @@ static int lbs_get_range(struct net_device *dev, struct iw_request_info *info,
 
        range->sensitivity = 0;
 
-       /*
-        * Setup the supported power level ranges
-        */
+       /* Setup the supported power level ranges */
        memset(range->txpower, 0, sizeof(range->txpower));
-       range->txpower[0] = 5;
-       range->txpower[1] = 7;
-       range->txpower[2] = 9;
-       range->txpower[3] = 11;
-       range->txpower[4] = 13;
-       range->txpower[5] = 15;
-       range->txpower[6] = 17;
-       range->txpower[7] = 19;
-
-       range->num_txpower = 8;
-       range->txpower_capa = IW_TXPOW_DBM;
-       range->txpower_capa |= IW_TXPOW_RANGE;
+       range->txpower_capa = IW_TXPOW_DBM | IW_TXPOW_RANGE;
+       range->txpower[0] = priv->txpower_min;
+       range->txpower[1] = priv->txpower_max;
+       range->num_txpower = 2;
 
        range->event_capa[0] = (IW_EVENT_CAPA_K_0 |
                                IW_EVENT_CAPA_MASK(SIOCGIWAP) |
@@ -1844,39 +1832,46 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
 {
        int ret = 0;
        struct lbs_private *priv = dev->priv;
-
-       u16 dbm;
+       s16 dbm = (s16) vwrq->value;
 
        lbs_deb_enter(LBS_DEB_WEXT);
 
        if (vwrq->disabled) {
                lbs_radio_ioctl(priv, RADIO_OFF);
-               return 0;
+               goto out;
        }
 
-       priv->preamble = CMD_TYPE_AUTO_PREAMBLE;
-
-       lbs_radio_ioctl(priv, RADIO_ON);
+       if (vwrq->fixed == 0) {
+               /* Auto power control */
+               priv->preamble = CMD_TYPE_AUTO_PREAMBLE;
+               dbm = priv->txpower_max;
+       } else {
+               /* Userspace check in iwrange if it should use dBm or mW,
+                * therefore this should never happen... Jean II */
+               if ((vwrq->flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM) {
+                       ret = -EOPNOTSUPP;
+                       goto out;
+               }
 
-       /* Userspace check in iwrange if it should use dBm or mW,
-        * therefore this should never happen... Jean II */
-       if ((vwrq->flags & IW_TXPOW_TYPE) == IW_TXPOW_MWATT) {
-               return -EOPNOTSUPP;
-       } else
-               dbm = (u16) vwrq->value;
+               /* Validate requested power level against firmware allowed levels */
+               if (priv->txpower_min && (dbm < priv->txpower_min)) {
+                       ret = -EINVAL;
+                       goto out;
+               }
 
-       /* auto tx power control */
+               if (priv->txpower_max && (dbm > priv->txpower_max)) {
+                       ret = -EINVAL;
+                       goto out;
+               }
+       }
 
-       if (vwrq->fixed == 0)
-               dbm = 0xffff;
+       lbs_radio_ioctl(priv, RADIO_ON);
 
-       lbs_deb_wext("txpower set %d dbm\n", dbm);
+       lbs_deb_wext("txpower set %d dBm\n", dbm);
 
-       ret = lbs_prepare_and_send_command(priv,
-                                   CMD_802_11_RF_TX_POWER,
-                                   CMD_ACT_TX_POWER_OPT_SET_LOW,
-                                   CMD_OPTION_WAITFORRSP, 0, (void *)&dbm);
+       ret = lbs_set_tx_power(priv, dbm);
 
+out:
        lbs_deb_leave_args(LBS_DEB_WEXT, "ret %d", ret);
        return ret;
 }