aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rndis_wlan.c
diff options
context:
space:
mode:
authorJussi Kivilinna <jussi.kivilinna@mbnet.fi>2010-12-21 15:44:49 -0500
committerJohn W. Linville <linville@tuxdriver.com>2010-12-22 15:43:31 -0500
commit40d70dd12200ffeacfe9caaa8242e3ad2995bb5d (patch)
tree62fc52c4fbd9a09c5adead0c1fd9ffab3ff03210 /drivers/net/wireless/rndis_wlan.c
parent49b35bd3f5bbc6997b24b04e9d4896f00cee3528 (diff)
rndis_wlan: add support for set_power_mgmt
Signed-off-by: Jussi Kivilinna <jussi.kivilinna@mbnet.fi> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rndis_wlan.c')
-rw-r--r--drivers/net/wireless/rndis_wlan.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c
index 0cd971a4dd94..848cc2cce247 100644
--- a/drivers/net/wireless/rndis_wlan.c
+++ b/drivers/net/wireless/rndis_wlan.c
@@ -129,6 +129,7 @@ MODULE_PARM_DESC(workaround_interval,
129#define OID_802_11_RTS_THRESHOLD cpu_to_le32(0x0d01020a) 129#define OID_802_11_RTS_THRESHOLD cpu_to_le32(0x0d01020a)
130#define OID_802_11_SUPPORTED_RATES cpu_to_le32(0x0d01020e) 130#define OID_802_11_SUPPORTED_RATES cpu_to_le32(0x0d01020e)
131#define OID_802_11_CONFIGURATION cpu_to_le32(0x0d010211) 131#define OID_802_11_CONFIGURATION cpu_to_le32(0x0d010211)
132#define OID_802_11_POWER_MODE cpu_to_le32(0x0d010216)
132#define OID_802_11_BSSID_LIST cpu_to_le32(0x0d010217) 133#define OID_802_11_BSSID_LIST cpu_to_le32(0x0d010217)
133 134
134 135
@@ -239,6 +240,12 @@ enum ndis_80211_addwep_bits {
239 NDIS_80211_ADDWEP_TRANSMIT_KEY = cpu_to_le32(1 << 31) 240 NDIS_80211_ADDWEP_TRANSMIT_KEY = cpu_to_le32(1 << 31)
240}; 241};
241 242
243enum ndis_80211_power_mode {
244 NDIS_80211_POWER_MODE_CAM,
245 NDIS_80211_POWER_MODE_MAX_PSP,
246 NDIS_80211_POWER_MODE_FAST_PSP,
247};
248
242struct ndis_80211_auth_request { 249struct ndis_80211_auth_request {
243 __le32 length; 250 __le32 length;
244 u8 bssid[6]; 251 u8 bssid[6];
@@ -503,6 +510,7 @@ struct rndis_wlan_private {
503 510
504 /* hardware state */ 511 /* hardware state */
505 bool radio_on; 512 bool radio_on;
513 int power_mode;
506 int infra_mode; 514 int infra_mode;
507 bool connected; 515 bool connected;
508 u8 bssid[ETH_ALEN]; 516 u8 bssid[ETH_ALEN];
@@ -572,6 +580,9 @@ static int rndis_del_pmksa(struct wiphy *wiphy, struct net_device *netdev,
572 580
573static int rndis_flush_pmksa(struct wiphy *wiphy, struct net_device *netdev); 581static int rndis_flush_pmksa(struct wiphy *wiphy, struct net_device *netdev);
574 582
583static int rndis_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,
584 bool enabled, int timeout);
585
575static int rndis_set_cqm_rssi_config(struct wiphy *wiphy, 586static int rndis_set_cqm_rssi_config(struct wiphy *wiphy,
576 struct net_device *dev, 587 struct net_device *dev,
577 s32 rssi_thold, u32 rssi_hyst); 588 s32 rssi_thold, u32 rssi_hyst);
@@ -595,6 +606,7 @@ static const struct cfg80211_ops rndis_config_ops = {
595 .set_pmksa = rndis_set_pmksa, 606 .set_pmksa = rndis_set_pmksa,
596 .del_pmksa = rndis_del_pmksa, 607 .del_pmksa = rndis_del_pmksa,
597 .flush_pmksa = rndis_flush_pmksa, 608 .flush_pmksa = rndis_flush_pmksa,
609 .set_power_mgmt = rndis_set_power_mgmt,
598 .set_cqm_rssi_config = rndis_set_cqm_rssi_config, 610 .set_cqm_rssi_config = rndis_set_cqm_rssi_config,
599}; 611};
600 612
@@ -694,6 +706,7 @@ static const char *oid_to_string(__le32 oid)
694 OID_STR(OID_802_11_ADD_KEY); 706 OID_STR(OID_802_11_ADD_KEY);
695 OID_STR(OID_802_11_REMOVE_KEY); 707 OID_STR(OID_802_11_REMOVE_KEY);
696 OID_STR(OID_802_11_ASSOCIATION_INFORMATION); 708 OID_STR(OID_802_11_ASSOCIATION_INFORMATION);
709 OID_STR(OID_802_11_CAPABILITY);
697 OID_STR(OID_802_11_PMKID); 710 OID_STR(OID_802_11_PMKID);
698 OID_STR(OID_802_11_NETWORK_TYPES_SUPPORTED); 711 OID_STR(OID_802_11_NETWORK_TYPES_SUPPORTED);
699 OID_STR(OID_802_11_NETWORK_TYPE_IN_USE); 712 OID_STR(OID_802_11_NETWORK_TYPE_IN_USE);
@@ -704,6 +717,7 @@ static const char *oid_to_string(__le32 oid)
704 OID_STR(OID_802_11_RTS_THRESHOLD); 717 OID_STR(OID_802_11_RTS_THRESHOLD);
705 OID_STR(OID_802_11_SUPPORTED_RATES); 718 OID_STR(OID_802_11_SUPPORTED_RATES);
706 OID_STR(OID_802_11_CONFIGURATION); 719 OID_STR(OID_802_11_CONFIGURATION);
720 OID_STR(OID_802_11_POWER_MODE);
707 OID_STR(OID_802_11_BSSID_LIST); 721 OID_STR(OID_802_11_BSSID_LIST);
708#undef OID_STR 722#undef OID_STR
709 } 723 }
@@ -2574,6 +2588,38 @@ static int rndis_flush_pmksa(struct wiphy *wiphy, struct net_device *netdev)
2574 return rndis_set_oid(usbdev, OID_802_11_PMKID, &pmkid, sizeof(pmkid)); 2588 return rndis_set_oid(usbdev, OID_802_11_PMKID, &pmkid, sizeof(pmkid));
2575} 2589}
2576 2590
2591static int rndis_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev,
2592 bool enabled, int timeout)
2593{
2594 struct rndis_wlan_private *priv = wiphy_priv(wiphy);
2595 struct usbnet *usbdev = priv->usbdev;
2596 int power_mode;
2597 __le32 mode;
2598 int ret;
2599
2600 netdev_dbg(usbdev->net, "%s(): %s, %d\n", __func__,
2601 enabled ? "enabled" : "disabled",
2602 timeout);
2603
2604 if (enabled)
2605 power_mode = NDIS_80211_POWER_MODE_FAST_PSP;
2606 else
2607 power_mode = NDIS_80211_POWER_MODE_CAM;
2608
2609 if (power_mode == priv->power_mode)
2610 return 0;
2611
2612 priv->power_mode = power_mode;
2613
2614 mode = cpu_to_le32(power_mode);
2615 ret = rndis_set_oid(usbdev, OID_802_11_POWER_MODE, &mode, sizeof(mode));
2616
2617 netdev_dbg(usbdev->net, "%s(): OID_802_11_POWER_MODE -> %d\n",
2618 __func__, ret);
2619
2620 return ret;
2621}
2622
2577static int rndis_set_cqm_rssi_config(struct wiphy *wiphy, 2623static int rndis_set_cqm_rssi_config(struct wiphy *wiphy,
2578 struct net_device *dev, 2624 struct net_device *dev,
2579 s32 rssi_thold, u32 rssi_hyst) 2625 s32 rssi_thold, u32 rssi_hyst)
@@ -3441,6 +3487,8 @@ static int rndis_wlan_bind(struct usbnet *usbdev, struct usb_interface *intf)
3441 3487
3442 set_default_iw_params(usbdev); 3488 set_default_iw_params(usbdev);
3443 3489
3490 priv->power_mode = -1;
3491
3444 /* set default rts/frag */ 3492 /* set default rts/frag */
3445 rndis_set_wiphy_params(wiphy, 3493 rndis_set_wiphy_params(wiphy,
3446 WIPHY_PARAM_FRAG_THRESHOLD | WIPHY_PARAM_RTS_THRESHOLD); 3494 WIPHY_PARAM_FRAG_THRESHOLD | WIPHY_PARAM_RTS_THRESHOLD);