diff options
Diffstat (limited to 'drivers/net/wireless/libertas/scan.c')
-rw-r--r-- | drivers/net/wireless/libertas/scan.c | 54 |
1 files changed, 18 insertions, 36 deletions
diff --git a/drivers/net/wireless/libertas/scan.c b/drivers/net/wireless/libertas/scan.c index 2cac47fc4cd9..790e9888ea2b 100644 --- a/drivers/net/wireless/libertas/scan.c +++ b/drivers/net/wireless/libertas/scan.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include "decl.h" | 17 | #include "decl.h" |
18 | #include "dev.h" | 18 | #include "dev.h" |
19 | #include "scan.h" | 19 | #include "scan.h" |
20 | #include "join.h" | ||
20 | 21 | ||
21 | //! Approximate amount of data needed to pass a scan result back to iwlist | 22 | //! Approximate amount of data needed to pass a scan result back to iwlist |
22 | #define MAX_SCAN_CELL_SIZE (IW_EV_ADDR_LEN \ | 23 | #define MAX_SCAN_CELL_SIZE (IW_EV_ADDR_LEN \ |
@@ -904,22 +905,14 @@ static int libertas_process_bss(struct bss_descriptor * bss, | |||
904 | struct ieeetypes_dsparamset *pDS; | 905 | struct ieeetypes_dsparamset *pDS; |
905 | struct ieeetypes_cfparamset *pCF; | 906 | struct ieeetypes_cfparamset *pCF; |
906 | struct ieeetypes_ibssparamset *pibss; | 907 | struct ieeetypes_ibssparamset *pibss; |
907 | u8 *pos, *end; | ||
908 | u8 *pRate; | ||
909 | u8 bytestocopy; | ||
910 | u8 ratesize; | ||
911 | u16 beaconsize; | ||
912 | u8 founddatarateie; | ||
913 | int ret; | ||
914 | |||
915 | struct ieeetypes_countryinfoset *pcountryinfo; | 908 | struct ieeetypes_countryinfoset *pcountryinfo; |
909 | u8 *pos, *end, *p; | ||
910 | u8 n_ex_rates = 0, got_basic_rates = 0, n_basic_rates = 0; | ||
911 | u16 beaconsize = 0; | ||
912 | int ret; | ||
916 | 913 | ||
917 | lbs_deb_enter(LBS_DEB_ASSOC); | 914 | lbs_deb_enter(LBS_DEB_ASSOC); |
918 | 915 | ||
919 | founddatarateie = 0; | ||
920 | ratesize = 0; | ||
921 | beaconsize = 0; | ||
922 | |||
923 | if (*bytesleft >= sizeof(beaconsize)) { | 916 | if (*bytesleft >= sizeof(beaconsize)) { |
924 | /* Extract & convert beacon size from the command buffer */ | 917 | /* Extract & convert beacon size from the command buffer */ |
925 | beaconsize = le16_to_cpup((void *)*pbeaconinfo); | 918 | beaconsize = le16_to_cpup((void *)*pbeaconinfo); |
@@ -1005,11 +998,9 @@ static int libertas_process_bss(struct bss_descriptor * bss, | |||
1005 | break; | 998 | break; |
1006 | 999 | ||
1007 | case MFIE_TYPE_RATES: | 1000 | case MFIE_TYPE_RATES: |
1008 | memcpy(bss->datarates, elem->data, elem->len); | 1001 | n_basic_rates = min_t(u8, MAX_RATES, elem->len); |
1009 | memmove(bss->libertas_supported_rates, elem->data, | 1002 | memcpy(bss->rates, elem->data, n_basic_rates); |
1010 | elem->len); | 1003 | got_basic_rates = 1; |
1011 | ratesize = elem->len; | ||
1012 | founddatarateie = 1; | ||
1013 | break; | 1004 | break; |
1014 | 1005 | ||
1015 | case MFIE_TYPE_FH_SET: | 1006 | case MFIE_TYPE_FH_SET: |
@@ -1070,22 +1061,15 @@ static int libertas_process_bss(struct bss_descriptor * bss, | |||
1070 | * already found. Data rate IE should come before | 1061 | * already found. Data rate IE should come before |
1071 | * extended supported rate IE | 1062 | * extended supported rate IE |
1072 | */ | 1063 | */ |
1073 | if (!founddatarateie) | 1064 | if (!got_basic_rates) |
1074 | break; | 1065 | break; |
1075 | 1066 | ||
1076 | if ((elem->len + ratesize) > WLAN_SUPPORTED_RATES) { | 1067 | n_ex_rates = elem->len; |
1077 | bytestocopy = | 1068 | if (n_basic_rates + n_ex_rates > MAX_RATES) |
1078 | (WLAN_SUPPORTED_RATES - ratesize); | 1069 | n_ex_rates = MAX_RATES - n_basic_rates; |
1079 | } else { | ||
1080 | bytestocopy = elem->len; | ||
1081 | } | ||
1082 | 1070 | ||
1083 | pRate = (u8 *) bss->datarates; | 1071 | p = bss->rates + n_basic_rates; |
1084 | pRate += ratesize; | 1072 | memcpy(p, elem->data, n_ex_rates); |
1085 | memmove(pRate, elem->data, bytestocopy); | ||
1086 | pRate = (u8 *) bss->libertas_supported_rates; | ||
1087 | pRate += ratesize; | ||
1088 | memmove(pRate, elem->data, bytestocopy); | ||
1089 | break; | 1073 | break; |
1090 | 1074 | ||
1091 | case MFIE_TYPE_GENERIC: | 1075 | case MFIE_TYPE_GENERIC: |
@@ -1123,6 +1107,7 @@ static int libertas_process_bss(struct bss_descriptor * bss, | |||
1123 | 1107 | ||
1124 | /* Timestamp */ | 1108 | /* Timestamp */ |
1125 | bss->last_scanned = jiffies; | 1109 | bss->last_scanned = jiffies; |
1110 | libertas_unset_basic_rate_flags(bss->rates, sizeof(bss->rates)); | ||
1126 | 1111 | ||
1127 | ret = 0; | 1112 | ret = 0; |
1128 | 1113 | ||
@@ -1530,12 +1515,9 @@ static inline char *libertas_translate_scan(wlan_private *priv, | |||
1530 | iwe.u.bitrate.disabled = 0; | 1515 | iwe.u.bitrate.disabled = 0; |
1531 | iwe.u.bitrate.value = 0; | 1516 | iwe.u.bitrate.value = 0; |
1532 | 1517 | ||
1533 | for (j = 0; j < sizeof(bss->libertas_supported_rates); j++) { | 1518 | for (j = 0; bss->rates[j] && (j < sizeof(bss->rates)); j++) { |
1534 | u8 rate = bss->libertas_supported_rates[j]; | 1519 | /* Bit rate given in 500 kb/s units */ |
1535 | if (rate == 0) | 1520 | iwe.u.bitrate.value = bss->rates[j] * 500000; |
1536 | break; /* no more rates */ | ||
1537 | /* Bit rate given in 500 kb/s units (+ 0x80) */ | ||
1538 | iwe.u.bitrate.value = (rate & 0x7f) * 500000; | ||
1539 | current_val = iwe_stream_add_value(start, current_val, | 1521 | current_val = iwe_stream_add_value(start, current_val, |
1540 | stop, &iwe, IW_EV_PARAM_LEN); | 1522 | stop, &iwe, IW_EV_PARAM_LEN); |
1541 | } | 1523 | } |