aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/rndis_wlan.c95
1 files changed, 43 insertions, 52 deletions
diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c
index c995d7c3139c..a8758603e01c 100644
--- a/drivers/net/wireless/rndis_wlan.c
+++ b/drivers/net/wireless/rndis_wlan.c
@@ -406,8 +406,17 @@ struct rndis_wext_private {
406 u8 command_buffer[COMMAND_BUFFER_SIZE]; 406 u8 command_buffer[COMMAND_BUFFER_SIZE];
407}; 407};
408 408
409/*
410 * cfg80211 ops
411 */
412static int rndis_change_virtual_intf(struct wiphy *wiphy, int ifindex,
413 enum nl80211_iftype type, u32 *flags,
414 struct vif_params *params);
415
416struct cfg80211_ops rndis_config_ops = {
417 .change_virtual_intf = rndis_change_virtual_intf,
418};
409 419
410struct cfg80211_ops rndis_config_ops = { };
411void *rndis_wiphy_privid = &rndis_wiphy_privid; 420void *rndis_wiphy_privid = &rndis_wiphy_privid;
412 421
413static const int bcm4320_power_output[4] = { 25, 50, 75, 100 }; 422static const int bcm4320_power_output[4] = { 25, 50, 75, 100 };
@@ -1125,6 +1134,37 @@ static void set_multicast_list(struct usbnet *usbdev)
1125 1134
1126 1135
1127/* 1136/*
1137 * cfg80211 ops
1138 */
1139static int rndis_change_virtual_intf(struct wiphy *wiphy, int ifindex,
1140 enum nl80211_iftype type, u32 *flags,
1141 struct vif_params *params)
1142{
1143 struct net_device *dev;
1144 struct usbnet *usbdev;
1145 int mode;
1146
1147 /* we're under RTNL */
1148 dev = __dev_get_by_index(&init_net, ifindex);
1149 if (!dev)
1150 return -ENODEV;
1151 usbdev = netdev_priv(dev);
1152
1153 switch (type) {
1154 case NL80211_IFTYPE_ADHOC:
1155 mode = ndis_80211_infra_adhoc;
1156 break;
1157 case NL80211_IFTYPE_STATION:
1158 mode = ndis_80211_infra_infra;
1159 break;
1160 default:
1161 return -EINVAL;
1162 }
1163
1164 return set_infra_mode(usbdev, mode);
1165}
1166
1167/*
1128 * wireless extension handlers 1168 * wireless extension handlers
1129 */ 1169 */
1130 1170
@@ -1450,55 +1490,6 @@ static int rndis_iw_get_auth(struct net_device *dev,
1450} 1490}
1451 1491
1452 1492
1453static int rndis_iw_get_mode(struct net_device *dev,
1454 struct iw_request_info *info,
1455 union iwreq_data *wrqu, char *extra)
1456{
1457 struct usbnet *usbdev = netdev_priv(dev);
1458 struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev);
1459
1460 switch (priv->infra_mode) {
1461 case ndis_80211_infra_adhoc:
1462 wrqu->mode = IW_MODE_ADHOC;
1463 break;
1464 case ndis_80211_infra_infra:
1465 wrqu->mode = IW_MODE_INFRA;
1466 break;
1467 /*case ndis_80211_infra_auto_unknown:*/
1468 default:
1469 wrqu->mode = IW_MODE_AUTO;
1470 break;
1471 }
1472 devdbg(usbdev, "SIOCGIWMODE: %08x", wrqu->mode);
1473 return 0;
1474}
1475
1476
1477static int rndis_iw_set_mode(struct net_device *dev,
1478 struct iw_request_info *info, union iwreq_data *wrqu, char *extra)
1479{
1480 struct usbnet *usbdev = netdev_priv(dev);
1481 int mode;
1482
1483 devdbg(usbdev, "SIOCSIWMODE: %08x", wrqu->mode);
1484
1485 switch (wrqu->mode) {
1486 case IW_MODE_ADHOC:
1487 mode = ndis_80211_infra_adhoc;
1488 break;
1489 case IW_MODE_INFRA:
1490 mode = ndis_80211_infra_infra;
1491 break;
1492 /*case IW_MODE_AUTO:*/
1493 default:
1494 mode = ndis_80211_infra_auto_unknown;
1495 break;
1496 }
1497
1498 return set_infra_mode(usbdev, mode);
1499}
1500
1501
1502static int rndis_iw_set_encode(struct net_device *dev, 1493static int rndis_iw_set_encode(struct net_device *dev,
1503 struct iw_request_info *info, union iwreq_data *wrqu, char *extra) 1494 struct iw_request_info *info, union iwreq_data *wrqu, char *extra)
1504{ 1495{
@@ -2196,8 +2187,8 @@ static const iw_handler rndis_iw_handler[] =
2196 IW_IOCTL(SIOCGIWNAME) = (iw_handler) cfg80211_wext_giwname, 2187 IW_IOCTL(SIOCGIWNAME) = (iw_handler) cfg80211_wext_giwname,
2197 IW_IOCTL(SIOCSIWFREQ) = rndis_iw_set_freq, 2188 IW_IOCTL(SIOCSIWFREQ) = rndis_iw_set_freq,
2198 IW_IOCTL(SIOCGIWFREQ) = rndis_iw_get_freq, 2189 IW_IOCTL(SIOCGIWFREQ) = rndis_iw_get_freq,
2199 IW_IOCTL(SIOCSIWMODE) = rndis_iw_set_mode, 2190 IW_IOCTL(SIOCSIWMODE) = (iw_handler) cfg80211_wext_siwmode,
2200 IW_IOCTL(SIOCGIWMODE) = rndis_iw_get_mode, 2191 IW_IOCTL(SIOCGIWMODE) = (iw_handler) cfg80211_wext_giwmode,
2201 IW_IOCTL(SIOCGIWRANGE) = rndis_iw_get_range, 2192 IW_IOCTL(SIOCGIWRANGE) = rndis_iw_get_range,
2202 IW_IOCTL(SIOCSIWAP) = rndis_iw_set_bssid, 2193 IW_IOCTL(SIOCSIWAP) = rndis_iw_set_bssid,
2203 IW_IOCTL(SIOCGIWAP) = rndis_iw_get_bssid, 2194 IW_IOCTL(SIOCGIWAP) = rndis_iw_get_bssid,