libertas: Create sysfs entry for changing the mesh probe response limit
[pandora-kernel.git] / drivers / net / wireless / libertas / main.c
index 73dc8c7..3dba836 100644 (file)
@@ -12,9 +12,8 @@
 #include <linux/kthread.h>
 #include <linux/kfifo.h>
 #include <linux/stddef.h>
-
+#include <linux/ieee80211.h>
 #include <net/iw_handler.h>
-#include <net/ieee80211.h>
 
 #include "host.h"
 #include "decl.h"
@@ -223,7 +222,7 @@ u8 lbs_data_rate_to_fw_index(u32 rate)
 static ssize_t lbs_anycast_get(struct device *dev,
                struct device_attribute *attr, char * buf)
 {
-       struct lbs_private *priv = to_net_dev(dev)->priv;
+       struct lbs_private *priv = netdev_priv(to_net_dev(dev));
        struct cmd_ds_mesh_access mesh_access;
        int ret;
 
@@ -242,7 +241,7 @@ static ssize_t lbs_anycast_get(struct device *dev,
 static ssize_t lbs_anycast_set(struct device *dev,
                struct device_attribute *attr, const char * buf, size_t count)
 {
-       struct lbs_private *priv = to_net_dev(dev)->priv;
+       struct lbs_private *priv = netdev_priv(to_net_dev(dev));
        struct cmd_ds_mesh_access mesh_access;
        uint32_t datum;
        int ret;
@@ -258,6 +257,58 @@ static ssize_t lbs_anycast_set(struct device *dev,
        return strlen(buf);
 }
 
+/**
+ * @brief Get function for sysfs attribute prb_rsp_limit
+ */
+static ssize_t lbs_prb_rsp_limit_get(struct device *dev,
+               struct device_attribute *attr, char *buf)
+{
+       struct lbs_private *priv = netdev_priv(to_net_dev(dev));
+       struct cmd_ds_mesh_access mesh_access;
+       int ret;
+       u32 retry_limit;
+
+       memset(&mesh_access, 0, sizeof(mesh_access));
+       mesh_access.data[0] = cpu_to_le32(CMD_ACT_GET);
+
+       ret = lbs_mesh_access(priv, CMD_ACT_MESH_SET_GET_PRB_RSP_LIMIT,
+                       &mesh_access);
+       if (ret)
+               return ret;
+
+       retry_limit = le32_to_cpu(mesh_access.data[1]);
+       return snprintf(buf, 10, "%d\n", retry_limit);
+}
+
+/**
+ * @brief Set function for sysfs attribute prb_rsp_limit
+ */
+static ssize_t lbs_prb_rsp_limit_set(struct device *dev,
+               struct device_attribute *attr, const char *buf, size_t count)
+{
+       struct lbs_private *priv = netdev_priv(to_net_dev(dev));
+       struct cmd_ds_mesh_access mesh_access;
+       int ret;
+       unsigned long retry_limit;
+
+       memset(&mesh_access, 0, sizeof(mesh_access));
+       mesh_access.data[0] = cpu_to_le32(CMD_ACT_SET);
+
+       if (!strict_strtoul(buf, 10, &retry_limit))
+               return -ENOTSUPP;
+       if (retry_limit > 15)
+               return -ENOTSUPP;
+
+       mesh_access.data[1] = cpu_to_le32(retry_limit);
+
+       ret = lbs_mesh_access(priv, CMD_ACT_MESH_SET_GET_PRB_RSP_LIMIT,
+                       &mesh_access);
+       if (ret)
+               return ret;
+
+       return strlen(buf);
+}
+
 static int lbs_add_rtap(struct lbs_private *priv);
 static void lbs_remove_rtap(struct lbs_private *priv);
 static int lbs_add_mesh(struct lbs_private *priv);
@@ -270,7 +321,7 @@ static void lbs_remove_mesh(struct lbs_private *priv);
 static ssize_t lbs_rtap_get(struct device *dev,
                struct device_attribute *attr, char * buf)
 {
-       struct lbs_private *priv = to_net_dev(dev)->priv;
+       struct lbs_private *priv = netdev_priv(to_net_dev(dev));
        return snprintf(buf, 5, "0x%X\n", priv->monitormode);
 }
 
@@ -281,7 +332,7 @@ static ssize_t lbs_rtap_set(struct device *dev,
                struct device_attribute *attr, const char * buf, size_t count)
 {
        int monitor_mode;
-       struct lbs_private *priv = to_net_dev(dev)->priv;
+       struct lbs_private *priv = netdev_priv(to_net_dev(dev));
 
        sscanf(buf, "%x", &monitor_mode);
        if (monitor_mode) {
@@ -332,7 +383,7 @@ static DEVICE_ATTR(lbs_rtap, 0644, lbs_rtap_get, lbs_rtap_set );
 static ssize_t lbs_mesh_get(struct device *dev,
                struct device_attribute *attr, char * buf)
 {
-       struct lbs_private *priv = to_net_dev(dev)->priv;
+       struct lbs_private *priv = netdev_priv(to_net_dev(dev));
        return snprintf(buf, 5, "0x%X\n", !!priv->mesh_dev);
 }
 
@@ -342,7 +393,7 @@ static ssize_t lbs_mesh_get(struct device *dev,
 static ssize_t lbs_mesh_set(struct device *dev,
                struct device_attribute *attr, const char * buf, size_t count)
 {
-       struct lbs_private *priv = to_net_dev(dev)->priv;
+       struct lbs_private *priv = netdev_priv(to_net_dev(dev));
        int enable;
        int ret, action = CMD_ACT_MESH_CONFIG_STOP;
 
@@ -376,8 +427,16 @@ static DEVICE_ATTR(lbs_mesh, 0644, lbs_mesh_get, lbs_mesh_set);
  */
 static DEVICE_ATTR(anycast_mask, 0644, lbs_anycast_get, lbs_anycast_set);
 
+/**
+ * prb_rsp_limit attribute to be exported per mshX interface
+ * through sysfs (/sys/class/net/mshX/prb_rsp_limit)
+ */
+static DEVICE_ATTR(prb_rsp_limit, 0644, lbs_prb_rsp_limit_get,
+               lbs_prb_rsp_limit_set);
+
 static struct attribute *lbs_mesh_sysfs_entries[] = {
        &dev_attr_anycast_mask.attr,
+       &dev_attr_prb_rsp_limit.attr,
        NULL,
 };
 
@@ -393,7 +452,7 @@ static struct attribute_group lbs_mesh_attr_group = {
  */
 static int lbs_dev_open(struct net_device *dev)
 {
-       struct lbs_private *priv = (struct lbs_private *) dev->priv ;
+       struct lbs_private *priv = netdev_priv(dev) ;
        int ret = 0;
 
        lbs_deb_enter(LBS_DEB_NET);
@@ -435,7 +494,7 @@ static int lbs_dev_open(struct net_device *dev)
  */
 static int lbs_mesh_stop(struct net_device *dev)
 {
-       struct lbs_private *priv = (struct lbs_private *) (dev->priv);
+       struct lbs_private *priv = dev->ml_priv;
 
        lbs_deb_enter(LBS_DEB_MESH);
        spin_lock_irq(&priv->driver_lock);
@@ -462,7 +521,7 @@ static int lbs_mesh_stop(struct net_device *dev)
  */
 static int lbs_eth_stop(struct net_device *dev)
 {
-       struct lbs_private *priv = (struct lbs_private *) dev->priv;
+       struct lbs_private *priv = netdev_priv(dev);
 
        lbs_deb_enter(LBS_DEB_NET);
 
@@ -479,7 +538,7 @@ static int lbs_eth_stop(struct net_device *dev)
 
 static void lbs_tx_timeout(struct net_device *dev)
 {
-       struct lbs_private *priv = (struct lbs_private *) dev->priv;
+       struct lbs_private *priv = netdev_priv(dev);
 
        lbs_deb_enter(LBS_DEB_TX);
 
@@ -531,7 +590,7 @@ EXPORT_SYMBOL_GPL(lbs_host_to_card_done);
  */
 static struct net_device_stats *lbs_get_stats(struct net_device *dev)
 {
-       struct lbs_private *priv = (struct lbs_private *) dev->priv;
+       struct lbs_private *priv = netdev_priv(dev);
 
        lbs_deb_enter(LBS_DEB_NET);
        return &priv->stats;
@@ -540,7 +599,7 @@ static struct net_device_stats *lbs_get_stats(struct net_device *dev)
 static int lbs_set_mac_address(struct net_device *dev, void *addr)
 {
        int ret = 0;
-       struct lbs_private *priv = (struct lbs_private *) dev->priv;
+       struct lbs_private *priv = netdev_priv(dev);
        struct sockaddr *phwaddr = addr;
        struct cmd_ds_802_11_mac_address cmd;
 
@@ -588,7 +647,6 @@ static int lbs_add_mcast_addrs(struct cmd_ds_mac_multicast_adr *cmd,
 {
        int i = nr_addrs;
        struct dev_mc_list *mc_list;
-       DECLARE_MAC_BUF(mac);
 
        if ((dev->flags & (IFF_UP|IFF_MULTICAST)) != (IFF_UP|IFF_MULTICAST))
                return nr_addrs;
@@ -596,16 +654,16 @@ static int lbs_add_mcast_addrs(struct cmd_ds_mac_multicast_adr *cmd,
        netif_addr_lock_bh(dev);
        for (mc_list = dev->mc_list; mc_list; mc_list = mc_list->next) {
                if (mac_in_list(cmd->maclist, nr_addrs, mc_list->dmi_addr)) {
-                       lbs_deb_net("mcast address %s:%s skipped\n", dev->name,
-                                   print_mac(mac, mc_list->dmi_addr));
+                       lbs_deb_net("mcast address %s:%pM skipped\n", dev->name,
+                                   mc_list->dmi_addr);
                        continue;
                }
 
                if (i == MRVDRV_MAX_MULTICAST_LIST_SIZE)
                        break;
                memcpy(&cmd->maclist[6*i], mc_list->dmi_addr, ETH_ALEN);
-               lbs_deb_net("mcast address %s:%s added to filter\n", dev->name,
-                           print_mac(mac, mc_list->dmi_addr));
+               lbs_deb_net("mcast address %s:%pM added to filter\n", dev->name,
+                           mc_list->dmi_addr);
                i++;
        }
        netif_addr_unlock_bh(dev);
@@ -674,7 +732,7 @@ static void lbs_set_mcast_worker(struct work_struct *work)
 
 static void lbs_set_multicast_list(struct net_device *dev)
 {
-       struct lbs_private *priv = dev->priv;
+       struct lbs_private *priv = netdev_priv(dev);
 
        schedule_work(&priv->mcast_work);
 }
@@ -690,7 +748,7 @@ static void lbs_set_multicast_list(struct net_device *dev)
 static int lbs_thread(void *data)
 {
        struct net_device *dev = data;
-       struct lbs_private *priv = dev->priv;
+       struct lbs_private *priv = netdev_priv(dev);
        wait_queue_t wait;
 
        lbs_deb_enter(LBS_DEB_THREAD);
@@ -1125,7 +1183,7 @@ struct lbs_private *lbs_add_card(void *card, struct device *dmdev)
                lbs_pr_err("init ethX device failed\n");
                goto done;
        }
-       priv = dev->priv;
+       priv = netdev_priv(dev);
 
        if (lbs_init_adapter(priv)) {
                lbs_pr_err("failed to initialize adapter structure.\n");
@@ -1378,7 +1436,7 @@ static int lbs_add_mesh(struct lbs_private *priv)
                ret = -ENOMEM;
                goto done;
        }
-       mesh_dev->priv = priv;
+       mesh_dev->ml_priv = priv;
        priv->mesh_dev = mesh_dev;
 
        mesh_dev->open = lbs_dev_open;
@@ -1591,7 +1649,7 @@ static int lbs_rtap_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
 static struct net_device_stats *lbs_rtap_get_stats(struct net_device *dev)
 {
-       struct lbs_private *priv = dev->priv;
+       struct lbs_private *priv = dev->ml_priv;
        lbs_deb_enter(LBS_DEB_NET);
        return &priv->stats;
 }
@@ -1632,7 +1690,7 @@ static int lbs_add_rtap(struct lbs_private *priv)
        rtap_dev->stop = lbs_rtap_stop;
        rtap_dev->get_stats = lbs_rtap_get_stats;
        rtap_dev->hard_start_xmit = lbs_rtap_hard_start_xmit;
-       rtap_dev->priv = priv;
+       rtap_dev->ml_priv = priv;
        SET_NETDEV_DEV(rtap_dev, priv->dev->dev.parent);
 
        ret = register_netdev(rtap_dev);
@@ -1647,33 +1705,6 @@ out:
        return ret;
 }
 
-#ifndef CONFIG_IEEE80211
-const char *escape_essid(const char *essid, u8 essid_len)
-{
-       static char escaped[IW_ESSID_MAX_SIZE * 2 + 1];
-       const char *s = essid;
-       char *d = escaped;
-
-       if (ieee80211_is_empty_essid(essid, essid_len)) {
-               memcpy(escaped, "<hidden>", sizeof("<hidden>"));
-               return escaped;
-       }
-
-       essid_len = min(essid_len, (u8) IW_ESSID_MAX_SIZE);
-       while (essid_len--) {
-               if (*s == '\0') {
-                       *d++ = '\\';
-                       *d++ = '0';
-                       s++;
-               } else {
-                       *d++ = *s++;
-               }
-       }
-       *d = '\0';
-       return escaped;
-}
-#endif
-
 module_init(lbs_init_module);
 module_exit(lbs_exit_module);