[PATCH] libertas: fix a few wext abuses...
authorJean Tourrilhes <jt@hpl.hp.com>
Thu, 2 Aug 2007 17:16:30 +0000 (13:16 -0400)
committerDavid S. Miller <davem@sunset.davemloft.net>
Wed, 10 Oct 2007 23:50:12 +0000 (16:50 -0700)
o SIOCGIWNAME is not designed to return the version number of the driver.
On the other hand, you are free to abuse SIOCGIWNICKN for that purpose.

o Don't attempt to fix the WE19/WE20 transition in the driver, because
your fixes are bogus, and redundant with the code in the kernel (you may
endup with +2, you can't read 32 char ESSID...).

o In SIOCSIWTXPOW, if you specified in iwrange that you want dBm, you
should only get dBm, which allow to reduce code bloat.

Signed-off-by: Jean Tourrilhes <jt@hpl.hp.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/libertas/wext.c

index 1fb0f91..15395bf 100644 (file)
 #include "assoc.h"
 
 
-/**
- *  @brief Convert mw value to dbm value
- *
- *  @param mw     the value of mw
- *  @return       the value of dbm
- */
-static int mw_to_dbm(int mw)
-{
-       if (mw < 2)
-               return 0;
-       else if (mw < 3)
-               return 3;
-       else if (mw < 4)
-               return 5;
-       else if (mw < 6)
-               return 7;
-       else if (mw < 7)
-               return 8;
-       else if (mw < 8)
-               return 9;
-       else if (mw < 10)
-               return 10;
-       else if (mw < 13)
-               return 11;
-       else if (mw < 16)
-               return 12;
-       else if (mw < 20)
-               return 13;
-       else if (mw < 25)
-               return 14;
-       else if (mw < 32)
-               return 15;
-       else if (mw < 40)
-               return 16;
-       else if (mw < 50)
-               return 17;
-       else if (mw < 63)
-               return 18;
-       else if (mw < 79)
-               return 19;
-       else if (mw < 100)
-               return 20;
-       else
-               return 21;
-}
-
 /**
  *  @brief Find the channel frequency power info with specific channel
  *
@@ -199,28 +153,11 @@ static void copy_active_data_rates(wlan_adapter * adapter, u8 * rates)
 static int wlan_get_name(struct net_device *dev, struct iw_request_info *info,
                         char *cwrq, char *extra)
 {
-       const char *cp;
-       char comm[6] = { "COMM-" };
-       char mrvl[6] = { "MRVL-" };
-       int cnt;
 
        lbs_deb_enter(LBS_DEB_WEXT);
 
-       strcpy(cwrq, mrvl);
-
-       cp = strstr(libertas_driver_version, comm);
-       if (cp == libertas_driver_version)      //skip leading "COMM-"
-               cp = libertas_driver_version + strlen(comm);
-       else
-               cp = libertas_driver_version;
-
-       cnt = strlen(mrvl);
-       cwrq += cnt;
-       while (cnt < 16 && (*cp != '-')) {
-               *cwrq++ = toupper(*cp++);
-               cnt++;
-       }
-       *cwrq = '\0';
+       /* We could add support for 802.11n here as needed. Jean II */
+       snprintf(cwrq, IFNAMSIZ, "IEEE 802.11b/g");
 
        lbs_deb_leave(LBS_DEB_WEXT);
        return 0;
@@ -300,29 +237,37 @@ static int wlan_set_nick(struct net_device *dev, struct iw_request_info *info,
 static int wlan_get_nick(struct net_device *dev, struct iw_request_info *info,
                         struct iw_point *dwrq, char *extra)
 {
-       wlan_private *priv = dev->priv;
-       wlan_adapter *adapter = priv->adapter;
+       const char *cp;
+       char comm[6] = { "COMM-" };
+       char mrvl[6] = { "MRVL-" };
+       int cnt;
 
        lbs_deb_enter(LBS_DEB_WEXT);
 
        /*
-        * Get the Nick Name saved
+        * Nick Name is not used internally in this mode,
+        * therefore return something useful instead. Jean II
         */
 
-       mutex_lock(&adapter->lock);
-       strncpy(extra, adapter->nodename, 16);
-       mutex_unlock(&adapter->lock);
+       strcpy(extra, mrvl);
 
-       extra[16] = '\0';
+       cp = strstr(libertas_driver_version, comm);
+       if (cp == libertas_driver_version)      //skip leading "COMM-"
+               cp = libertas_driver_version + strlen(comm);
+       else
+               cp = libertas_driver_version;
 
-       /*
-        * If none, we may want to get the one that was set
-        */
+       cnt = strlen(mrvl);
+       extra += cnt;
+       while (cnt < 16 && (*cp != '-')) {
+               *extra++ = toupper(*cp++);
+               cnt++;
+       }
 
        /*
         * Push it out !
         */
-       dwrq->length = strlen(extra) + 1;
+       dwrq->length = cnt;
 
        lbs_deb_leave(LBS_DEB_WEXT);
        return 0;
@@ -341,12 +286,12 @@ static int mesh_get_nick(struct net_device *dev, struct iw_request_info *info,
        if (adapter->connect_status == LIBERTAS_CONNECTED) {
                strncpy(extra, "Mesh", 12);
                extra[12] = '\0';
-               dwrq->length = strlen(extra) + 1;
+               dwrq->length = strlen(extra);
        }
 
        else {
                extra[0] = '\0';
-               dwrq->length = ;
+               dwrq->length = 0;
        }
 
        lbs_deb_leave(LBS_DEB_WEXT);
@@ -1897,8 +1842,10 @@ static int wlan_set_txpow(struct net_device *dev, struct iw_request_info *info,
 
        wlan_radio_ioctl(priv, RADIO_ON);
 
+       /* 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) {
-               dbm = (u16) mw_to_dbm(vwrq->value);
+               return -EOPNOTSUPP;
        } else
                dbm = (u16) vwrq->value;
 
@@ -1946,12 +1893,7 @@ static int wlan_get_essid(struct net_device *dev, struct iw_request_info *info,
         * If none, we may want to get the one that was set
         */
 
-       /* To make the driver backward compatible with WPA supplicant v0.2.4 */
-       if (dwrq->length == 32) /* check with WPA supplicant buffer size */
-               dwrq->length = min_t(size_t, adapter->curbssparams.ssid_len,
-                                  IW_ESSID_MAX_SIZE);
-       else
-               dwrq->length = adapter->curbssparams.ssid_len + 1;
+       dwrq->length = adapter->curbssparams.ssid_len;
 
        dwrq->flags = 1;        /* active */
 
@@ -1972,14 +1914,6 @@ static int wlan_set_essid(struct net_device *dev, struct iw_request_info *info,
 
        lbs_deb_enter(LBS_DEB_WEXT);
 
-       /*
-        * WE-20 and earlier NULL pad the end of the SSID and increment
-        * SSID length so it can be used like a string.  WE-21 and later don't,
-        * but some userspace tools aren't able to cope with the change.
-        */
-       if ((in_ssid_len > 0) && (extra[in_ssid_len - 1] == '\0'))
-               in_ssid_len--;
-
        /* Check the size of the string */
        if (in_ssid_len > IW_ESSID_MAX_SIZE) {
                ret = -E2BIG;