aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/libertas
diff options
context:
space:
mode:
authorJohn W. Linville <linville@tuxdriver.com>2011-10-17 15:05:26 -0400
committerJohn W. Linville <linville@tuxdriver.com>2011-10-17 15:05:26 -0400
commit41ebe9cde738a972d05c7282e09f5ed54cff0e8d (patch)
tree223bf0feb7305e46989b60c3f070bef87d5fcab4 /drivers/net/wireless/libertas
parentfd38f734cb8200529e281338514945fcbff2364b (diff)
parent5c1381ac3f3f49ab1e0886ea8f1432c9a5def519 (diff)
Merge branch 'master' of git://git.infradead.org/users/linville/wireless-next into for-davem
Diffstat (limited to 'drivers/net/wireless/libertas')
-rw-r--r--drivers/net/wireless/libertas/cfg.c20
-rw-r--r--drivers/net/wireless/libertas/decl.h2
-rw-r--r--drivers/net/wireless/libertas/main.c32
3 files changed, 40 insertions, 14 deletions
diff --git a/drivers/net/wireless/libertas/cfg.c b/drivers/net/wireless/libertas/cfg.c
index 610bfcee3cf..ff6378276ff 100644
--- a/drivers/net/wireless/libertas/cfg.c
+++ b/drivers/net/wireless/libertas/cfg.c
@@ -1666,28 +1666,20 @@ static int lbs_change_intf(struct wiphy *wiphy, struct net_device *dev,
1666 if (dev == priv->mesh_dev) 1666 if (dev == priv->mesh_dev)
1667 return -EOPNOTSUPP; 1667 return -EOPNOTSUPP;
1668 1668
1669 lbs_deb_enter(LBS_DEB_CFG80211);
1670
1671 switch (type) { 1669 switch (type) {
1672 case NL80211_IFTYPE_MONITOR: 1670 case NL80211_IFTYPE_MONITOR:
1673 ret = lbs_set_monitor_mode(priv, 1);
1674 break;
1675 case NL80211_IFTYPE_STATION: 1671 case NL80211_IFTYPE_STATION:
1676 if (priv->wdev->iftype == NL80211_IFTYPE_MONITOR)
1677 ret = lbs_set_monitor_mode(priv, 0);
1678 if (!ret)
1679 ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_BSS_TYPE, 1);
1680 break;
1681 case NL80211_IFTYPE_ADHOC: 1672 case NL80211_IFTYPE_ADHOC:
1682 if (priv->wdev->iftype == NL80211_IFTYPE_MONITOR)
1683 ret = lbs_set_monitor_mode(priv, 0);
1684 if (!ret)
1685 ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_BSS_TYPE, 2);
1686 break; 1673 break;
1687 default: 1674 default:
1688 ret = -ENOTSUPP; 1675 return -EOPNOTSUPP;
1689 } 1676 }
1690 1677
1678 lbs_deb_enter(LBS_DEB_CFG80211);
1679
1680 if (priv->iface_running)
1681 ret = lbs_set_iface_type(priv, type);
1682
1691 if (!ret) 1683 if (!ret)
1692 priv->wdev->iftype = type; 1684 priv->wdev->iftype = type;
1693 1685
diff --git a/drivers/net/wireless/libertas/decl.h b/drivers/net/wireless/libertas/decl.h
index 9304e6fc421..bc951ab4b68 100644
--- a/drivers/net/wireless/libertas/decl.h
+++ b/drivers/net/wireless/libertas/decl.h
@@ -9,6 +9,7 @@
9 9
10#include <linux/netdevice.h> 10#include <linux/netdevice.h>
11#include <linux/firmware.h> 11#include <linux/firmware.h>
12#include <linux/nl80211.h>
12 13
13/* Should be terminated by a NULL entry */ 14/* Should be terminated by a NULL entry */
14struct lbs_fw_table { 15struct lbs_fw_table {
@@ -45,6 +46,7 @@ void lbs_host_to_card_done(struct lbs_private *priv);
45 46
46int lbs_start_iface(struct lbs_private *priv); 47int lbs_start_iface(struct lbs_private *priv);
47int lbs_stop_iface(struct lbs_private *priv); 48int lbs_stop_iface(struct lbs_private *priv);
49int lbs_set_iface_type(struct lbs_private *priv, enum nl80211_iftype type);
48 50
49int lbs_rtap_supported(struct lbs_private *priv); 51int lbs_rtap_supported(struct lbs_private *priv);
50 52
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index c50ae07e2e8..b03779bcd54 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -99,6 +99,32 @@ u8 lbs_data_rate_to_fw_index(u32 rate)
99 return 0; 99 return 0;
100} 100}
101 101
102int lbs_set_iface_type(struct lbs_private *priv, enum nl80211_iftype type)
103{
104 int ret = 0;
105
106 switch (type) {
107 case NL80211_IFTYPE_MONITOR:
108 ret = lbs_set_monitor_mode(priv, 1);
109 break;
110 case NL80211_IFTYPE_STATION:
111 if (priv->wdev->iftype == NL80211_IFTYPE_MONITOR)
112 ret = lbs_set_monitor_mode(priv, 0);
113 if (!ret)
114 ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_BSS_TYPE, 1);
115 break;
116 case NL80211_IFTYPE_ADHOC:
117 if (priv->wdev->iftype == NL80211_IFTYPE_MONITOR)
118 ret = lbs_set_monitor_mode(priv, 0);
119 if (!ret)
120 ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_BSS_TYPE, 2);
121 break;
122 default:
123 ret = -ENOTSUPP;
124 }
125 return ret;
126}
127
102int lbs_start_iface(struct lbs_private *priv) 128int lbs_start_iface(struct lbs_private *priv)
103{ 129{
104 struct cmd_ds_802_11_mac_address cmd; 130 struct cmd_ds_802_11_mac_address cmd;
@@ -120,6 +146,12 @@ int lbs_start_iface(struct lbs_private *priv)
120 goto err; 146 goto err;
121 } 147 }
122 148
149 ret = lbs_set_iface_type(priv, priv->wdev->iftype);
150 if (ret) {
151 lbs_deb_net("set iface type failed\n");
152 goto err;
153 }
154
123 lbs_update_channel(priv); 155 lbs_update_channel(priv);
124 156
125 priv->iface_running = true; 157 priv->iface_running = true;