diff options
Diffstat (limited to 'net/wireless/wext-compat.c')
| -rw-r--r-- | net/wireless/wext-compat.c | 49 |
1 files changed, 36 insertions, 13 deletions
diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c index 54face3d4424..9ab51838849e 100644 --- a/net/wireless/wext-compat.c +++ b/net/wireless/wext-compat.c | |||
| @@ -1099,8 +1099,8 @@ int cfg80211_wext_siwpower(struct net_device *dev, | |||
| 1099 | { | 1099 | { |
| 1100 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 1100 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
| 1101 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy); | 1101 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy); |
| 1102 | bool ps = wdev->wext.ps; | 1102 | bool ps = wdev->ps; |
| 1103 | int timeout = wdev->wext.ps_timeout; | 1103 | int timeout = wdev->ps_timeout; |
| 1104 | int err; | 1104 | int err; |
| 1105 | 1105 | ||
| 1106 | if (wdev->iftype != NL80211_IFTYPE_STATION) | 1106 | if (wdev->iftype != NL80211_IFTYPE_STATION) |
| @@ -1133,8 +1133,8 @@ int cfg80211_wext_siwpower(struct net_device *dev, | |||
| 1133 | if (err) | 1133 | if (err) |
| 1134 | return err; | 1134 | return err; |
| 1135 | 1135 | ||
| 1136 | wdev->wext.ps = ps; | 1136 | wdev->ps = ps; |
| 1137 | wdev->wext.ps_timeout = timeout; | 1137 | wdev->ps_timeout = timeout; |
| 1138 | 1138 | ||
| 1139 | return 0; | 1139 | return 0; |
| 1140 | 1140 | ||
| @@ -1147,7 +1147,7 @@ int cfg80211_wext_giwpower(struct net_device *dev, | |||
| 1147 | { | 1147 | { |
| 1148 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 1148 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
| 1149 | 1149 | ||
| 1150 | wrq->disabled = !wdev->wext.ps; | 1150 | wrq->disabled = !wdev->ps; |
| 1151 | 1151 | ||
| 1152 | return 0; | 1152 | return 0; |
| 1153 | } | 1153 | } |
| @@ -1204,21 +1204,47 @@ int cfg80211_wext_siwrate(struct net_device *dev, | |||
| 1204 | struct wireless_dev *wdev = dev->ieee80211_ptr; | 1204 | struct wireless_dev *wdev = dev->ieee80211_ptr; |
| 1205 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy); | 1205 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy); |
| 1206 | struct cfg80211_bitrate_mask mask; | 1206 | struct cfg80211_bitrate_mask mask; |
| 1207 | u32 fixed, maxrate; | ||
| 1208 | struct ieee80211_supported_band *sband; | ||
| 1209 | int band, ridx; | ||
| 1210 | bool match = false; | ||
| 1207 | 1211 | ||
| 1208 | if (!rdev->ops->set_bitrate_mask) | 1212 | if (!rdev->ops->set_bitrate_mask) |
| 1209 | return -EOPNOTSUPP; | 1213 | return -EOPNOTSUPP; |
| 1210 | 1214 | ||
| 1211 | mask.fixed = 0; | 1215 | memset(&mask, 0, sizeof(mask)); |
| 1212 | mask.maxrate = 0; | 1216 | fixed = 0; |
| 1217 | maxrate = (u32)-1; | ||
| 1213 | 1218 | ||
| 1214 | if (rate->value < 0) { | 1219 | if (rate->value < 0) { |
| 1215 | /* nothing */ | 1220 | /* nothing */ |
| 1216 | } else if (rate->fixed) { | 1221 | } else if (rate->fixed) { |
| 1217 | mask.fixed = rate->value / 1000; /* kbps */ | 1222 | fixed = rate->value / 100000; |
| 1218 | } else { | 1223 | } else { |
| 1219 | mask.maxrate = rate->value / 1000; /* kbps */ | 1224 | maxrate = rate->value / 100000; |
| 1220 | } | 1225 | } |
| 1221 | 1226 | ||
| 1227 | for (band = 0; band < IEEE80211_NUM_BANDS; band++) { | ||
| 1228 | sband = wdev->wiphy->bands[band]; | ||
| 1229 | if (sband == NULL) | ||
| 1230 | continue; | ||
| 1231 | for (ridx = 0; ridx < sband->n_bitrates; ridx++) { | ||
| 1232 | struct ieee80211_rate *srate = &sband->bitrates[ridx]; | ||
| 1233 | if (fixed == srate->bitrate) { | ||
| 1234 | mask.control[band].legacy = 1 << ridx; | ||
| 1235 | match = true; | ||
| 1236 | break; | ||
| 1237 | } | ||
| 1238 | if (srate->bitrate <= maxrate) { | ||
| 1239 | mask.control[band].legacy |= 1 << ridx; | ||
| 1240 | match = true; | ||
| 1241 | } | ||
| 1242 | } | ||
| 1243 | } | ||
| 1244 | |||
| 1245 | if (!match) | ||
| 1246 | return -EINVAL; | ||
| 1247 | |||
| 1222 | return rdev->ops->set_bitrate_mask(wdev->wiphy, dev, NULL, &mask); | 1248 | return rdev->ops->set_bitrate_mask(wdev->wiphy, dev, NULL, &mask); |
| 1223 | } | 1249 | } |
| 1224 | EXPORT_SYMBOL_GPL(cfg80211_wext_siwrate); | 1250 | EXPORT_SYMBOL_GPL(cfg80211_wext_siwrate); |
| @@ -1257,10 +1283,7 @@ int cfg80211_wext_giwrate(struct net_device *dev, | |||
| 1257 | if (!(sinfo.filled & STATION_INFO_TX_BITRATE)) | 1283 | if (!(sinfo.filled & STATION_INFO_TX_BITRATE)) |
| 1258 | return -EOPNOTSUPP; | 1284 | return -EOPNOTSUPP; |
| 1259 | 1285 | ||
| 1260 | rate->value = 0; | 1286 | rate->value = 100000 * cfg80211_calculate_bitrate(&sinfo.txrate); |
| 1261 | |||
| 1262 | if (!(sinfo.txrate.flags & RATE_INFO_FLAGS_MCS)) | ||
| 1263 | rate->value = 100000 * sinfo.txrate.legacy; | ||
| 1264 | 1287 | ||
| 1265 | return 0; | 1288 | return 0; |
| 1266 | } | 1289 | } |
