diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/wl12xx/cmd.c | 37 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/cmd.h | 18 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/init.c | 45 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/main.c | 15 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/scan.c | 28 | ||||
-rw-r--r-- | drivers/net/wireless/wl12xx/wl12xx.h | 4 |
6 files changed, 94 insertions, 53 deletions
diff --git a/drivers/net/wireless/wl12xx/cmd.c b/drivers/net/wireless/wl12xx/cmd.c index 25990bd38be6..28e0a56d794f 100644 --- a/drivers/net/wireless/wl12xx/cmd.c +++ b/drivers/net/wireless/wl12xx/cmd.c | |||
@@ -1022,8 +1022,9 @@ out: | |||
1022 | return ret; | 1022 | return ret; |
1023 | } | 1023 | } |
1024 | 1024 | ||
1025 | int wl1271_cmd_template_set(struct wl1271 *wl, u16 template_id, | 1025 | int wl1271_cmd_template_set(struct wl1271 *wl, u8 role_id, |
1026 | void *buf, size_t buf_len, int index, u32 rates) | 1026 | u16 template_id, void *buf, size_t buf_len, |
1027 | int index, u32 rates) | ||
1027 | { | 1028 | { |
1028 | struct wl1271_cmd_template_set *cmd; | 1029 | struct wl1271_cmd_template_set *cmd; |
1029 | int ret = 0; | 1030 | int ret = 0; |
@@ -1039,6 +1040,8 @@ int wl1271_cmd_template_set(struct wl1271 *wl, u16 template_id, | |||
1039 | goto out; | 1040 | goto out; |
1040 | } | 1041 | } |
1041 | 1042 | ||
1043 | /* during initialization wlvif is NULL */ | ||
1044 | cmd->role_id = role_id; | ||
1042 | cmd->len = cpu_to_le16(buf_len); | 1045 | cmd->len = cpu_to_le16(buf_len); |
1043 | cmd->template_type = template_id; | 1046 | cmd->template_type = template_id; |
1044 | cmd->enabled_rates = cpu_to_le32(rates); | 1047 | cmd->enabled_rates = cpu_to_le32(rates); |
@@ -1082,7 +1085,8 @@ int wl12xx_cmd_build_null_data(struct wl1271 *wl, struct wl12xx_vif *wlvif) | |||
1082 | ptr = skb->data; | 1085 | ptr = skb->data; |
1083 | } | 1086 | } |
1084 | 1087 | ||
1085 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_NULL_DATA, ptr, size, 0, | 1088 | ret = wl1271_cmd_template_set(wl, wlvif->role_id, |
1089 | CMD_TEMPL_NULL_DATA, ptr, size, 0, | ||
1086 | wlvif->basic_rate); | 1090 | wlvif->basic_rate); |
1087 | 1091 | ||
1088 | out: | 1092 | out: |
@@ -1105,7 +1109,7 @@ int wl12xx_cmd_build_klv_null_data(struct wl1271 *wl, | |||
1105 | if (!skb) | 1109 | if (!skb) |
1106 | goto out; | 1110 | goto out; |
1107 | 1111 | ||
1108 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_KLV, | 1112 | ret = wl1271_cmd_template_set(wl, wlvif->role_id, CMD_TEMPL_KLV, |
1109 | skb->data, skb->len, | 1113 | skb->data, skb->len, |
1110 | CMD_TEMPL_KLV_IDX_NULL_DATA, | 1114 | CMD_TEMPL_KLV_IDX_NULL_DATA, |
1111 | wlvif->basic_rate); | 1115 | wlvif->basic_rate); |
@@ -1130,7 +1134,8 @@ int wl1271_cmd_build_ps_poll(struct wl1271 *wl, struct wl12xx_vif *wlvif, | |||
1130 | if (!skb) | 1134 | if (!skb) |
1131 | goto out; | 1135 | goto out; |
1132 | 1136 | ||
1133 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_PS_POLL, skb->data, | 1137 | ret = wl1271_cmd_template_set(wl, wlvif->role_id, |
1138 | CMD_TEMPL_PS_POLL, skb->data, | ||
1134 | skb->len, 0, wlvif->basic_rate_set); | 1139 | skb->len, 0, wlvif->basic_rate_set); |
1135 | 1140 | ||
1136 | out: | 1141 | out: |
@@ -1138,9 +1143,10 @@ out: | |||
1138 | return ret; | 1143 | return ret; |
1139 | } | 1144 | } |
1140 | 1145 | ||
1141 | int wl1271_cmd_build_probe_req(struct wl1271 *wl, struct wl12xx_vif *wlvif, | 1146 | int wl12xx_cmd_build_probe_req(struct wl1271 *wl, struct wl12xx_vif *wlvif, |
1147 | u8 role_id, u8 band, | ||
1142 | const u8 *ssid, size_t ssid_len, | 1148 | const u8 *ssid, size_t ssid_len, |
1143 | const u8 *ie, size_t ie_len, u8 band) | 1149 | const u8 *ie, size_t ie_len) |
1144 | { | 1150 | { |
1145 | struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif); | 1151 | struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif); |
1146 | struct sk_buff *skb; | 1152 | struct sk_buff *skb; |
@@ -1158,10 +1164,12 @@ int wl1271_cmd_build_probe_req(struct wl1271 *wl, struct wl12xx_vif *wlvif, | |||
1158 | 1164 | ||
1159 | rate = wl1271_tx_min_rate_get(wl, wlvif->bitrate_masks[band]); | 1165 | rate = wl1271_tx_min_rate_get(wl, wlvif->bitrate_masks[band]); |
1160 | if (band == IEEE80211_BAND_2GHZ) | 1166 | if (band == IEEE80211_BAND_2GHZ) |
1161 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_2_4, | 1167 | ret = wl1271_cmd_template_set(wl, role_id, |
1168 | CMD_TEMPL_CFG_PROBE_REQ_2_4, | ||
1162 | skb->data, skb->len, 0, rate); | 1169 | skb->data, skb->len, 0, rate); |
1163 | else | 1170 | else |
1164 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_5, | 1171 | ret = wl1271_cmd_template_set(wl, role_id, |
1172 | CMD_TEMPL_CFG_PROBE_REQ_5, | ||
1165 | skb->data, skb->len, 0, rate); | 1173 | skb->data, skb->len, 0, rate); |
1166 | 1174 | ||
1167 | out: | 1175 | out: |
@@ -1186,10 +1194,12 @@ struct sk_buff *wl1271_cmd_build_ap_probe_req(struct wl1271 *wl, | |||
1186 | 1194 | ||
1187 | rate = wl1271_tx_min_rate_get(wl, wlvif->bitrate_masks[wlvif->band]); | 1195 | rate = wl1271_tx_min_rate_get(wl, wlvif->bitrate_masks[wlvif->band]); |
1188 | if (wlvif->band == IEEE80211_BAND_2GHZ) | 1196 | if (wlvif->band == IEEE80211_BAND_2GHZ) |
1189 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_2_4, | 1197 | ret = wl1271_cmd_template_set(wl, wlvif->role_id, |
1198 | CMD_TEMPL_CFG_PROBE_REQ_2_4, | ||
1190 | skb->data, skb->len, 0, rate); | 1199 | skb->data, skb->len, 0, rate); |
1191 | else | 1200 | else |
1192 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_5, | 1201 | ret = wl1271_cmd_template_set(wl, wlvif->role_id, |
1202 | CMD_TEMPL_CFG_PROBE_REQ_5, | ||
1193 | skb->data, skb->len, 0, rate); | 1203 | skb->data, skb->len, 0, rate); |
1194 | 1204 | ||
1195 | if (ret < 0) | 1205 | if (ret < 0) |
@@ -1235,7 +1245,7 @@ int wl1271_cmd_build_arp_rsp(struct wl1271 *wl, struct wl12xx_vif *wlvif, | |||
1235 | memcpy(tmpl.sender_hw, vif->addr, ETH_ALEN); | 1245 | memcpy(tmpl.sender_hw, vif->addr, ETH_ALEN); |
1236 | tmpl.sender_ip = ip_addr; | 1246 | tmpl.sender_ip = ip_addr; |
1237 | 1247 | ||
1238 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_ARP_RSP, | 1248 | ret = wl1271_cmd_template_set(wl, wlvif->role_id, CMD_TEMPL_ARP_RSP, |
1239 | &tmpl, sizeof(tmpl), 0, | 1249 | &tmpl, sizeof(tmpl), 0, |
1240 | wlvif->basic_rate); | 1250 | wlvif->basic_rate); |
1241 | 1251 | ||
@@ -1260,7 +1270,8 @@ int wl1271_build_qos_null_data(struct wl1271 *wl, struct ieee80211_vif *vif) | |||
1260 | /* FIXME: not sure what priority to use here */ | 1270 | /* FIXME: not sure what priority to use here */ |
1261 | template.qos_ctrl = cpu_to_le16(0); | 1271 | template.qos_ctrl = cpu_to_le16(0); |
1262 | 1272 | ||
1263 | return wl1271_cmd_template_set(wl, CMD_TEMPL_QOS_NULL_DATA, &template, | 1273 | return wl1271_cmd_template_set(wl, wlvif->role_id, |
1274 | CMD_TEMPL_QOS_NULL_DATA, &template, | ||
1264 | sizeof(template), 0, | 1275 | sizeof(template), 0, |
1265 | wlvif->basic_rate); | 1276 | wlvif->basic_rate); |
1266 | } | 1277 | } |
diff --git a/drivers/net/wireless/wl12xx/cmd.h b/drivers/net/wireless/wl12xx/cmd.h index 3f7d0b93c24d..8e8035d33068 100644 --- a/drivers/net/wireless/wl12xx/cmd.h +++ b/drivers/net/wireless/wl12xx/cmd.h | |||
@@ -54,14 +54,16 @@ int wl1271_cmd_ps_mode(struct wl1271 *wl, struct wl12xx_vif *wlvif, | |||
54 | u8 ps_mode); | 54 | u8 ps_mode); |
55 | int wl1271_cmd_read_memory(struct wl1271 *wl, u32 addr, void *answer, | 55 | int wl1271_cmd_read_memory(struct wl1271 *wl, u32 addr, void *answer, |
56 | size_t len); | 56 | size_t len); |
57 | int wl1271_cmd_template_set(struct wl1271 *wl, u16 template_id, | 57 | int wl1271_cmd_template_set(struct wl1271 *wl, u8 role_id, |
58 | void *buf, size_t buf_len, int index, u32 rates); | 58 | u16 template_id, void *buf, size_t buf_len, |
59 | int index, u32 rates); | ||
59 | int wl12xx_cmd_build_null_data(struct wl1271 *wl, struct wl12xx_vif *wlvif); | 60 | int wl12xx_cmd_build_null_data(struct wl1271 *wl, struct wl12xx_vif *wlvif); |
60 | int wl1271_cmd_build_ps_poll(struct wl1271 *wl, struct wl12xx_vif *wlvif, | 61 | int wl1271_cmd_build_ps_poll(struct wl1271 *wl, struct wl12xx_vif *wlvif, |
61 | u16 aid); | 62 | u16 aid); |
62 | int wl1271_cmd_build_probe_req(struct wl1271 *wl, struct wl12xx_vif *wlvif, | 63 | int wl12xx_cmd_build_probe_req(struct wl1271 *wl, struct wl12xx_vif *wlvif, |
64 | u8 role_id, u8 band, | ||
63 | const u8 *ssid, size_t ssid_len, | 65 | const u8 *ssid, size_t ssid_len, |
64 | const u8 *ie, size_t ie_len, u8 band); | 66 | const u8 *ie, size_t ie_len); |
65 | struct sk_buff *wl1271_cmd_build_ap_probe_req(struct wl1271 *wl, | 67 | struct sk_buff *wl1271_cmd_build_ap_probe_req(struct wl1271 *wl, |
66 | struct wl12xx_vif *wlvif, | 68 | struct wl12xx_vif *wlvif, |
67 | struct sk_buff *skb); | 69 | struct sk_buff *skb); |
@@ -191,7 +193,7 @@ enum cmd_templ { | |||
191 | /* unit ms */ | 193 | /* unit ms */ |
192 | #define WL1271_COMMAND_TIMEOUT 2000 | 194 | #define WL1271_COMMAND_TIMEOUT 2000 |
193 | #define WL1271_CMD_TEMPL_DFLT_SIZE 252 | 195 | #define WL1271_CMD_TEMPL_DFLT_SIZE 252 |
194 | #define WL1271_CMD_TEMPL_MAX_SIZE 548 | 196 | #define WL1271_CMD_TEMPL_MAX_SIZE 512 |
195 | #define WL1271_EVENT_TIMEOUT 750 | 197 | #define WL1271_EVENT_TIMEOUT 750 |
196 | 198 | ||
197 | struct wl1271_cmd_header { | 199 | struct wl1271_cmd_header { |
@@ -364,14 +366,18 @@ struct cmd_enabledisable_path { | |||
364 | struct wl1271_cmd_template_set { | 366 | struct wl1271_cmd_template_set { |
365 | struct wl1271_cmd_header header; | 367 | struct wl1271_cmd_header header; |
366 | 368 | ||
367 | __le16 len; | 369 | u8 role_id; |
368 | u8 template_type; | 370 | u8 template_type; |
371 | __le16 len; | ||
369 | u8 index; /* relevant only for KLV_TEMPLATE type */ | 372 | u8 index; /* relevant only for KLV_TEMPLATE type */ |
373 | u8 padding[3]; | ||
374 | |||
370 | __le32 enabled_rates; | 375 | __le32 enabled_rates; |
371 | u8 short_retry_limit; | 376 | u8 short_retry_limit; |
372 | u8 long_retry_limit; | 377 | u8 long_retry_limit; |
373 | u8 aflags; | 378 | u8 aflags; |
374 | u8 reserved; | 379 | u8 reserved; |
380 | |||
375 | u8 template_data[WL1271_CMD_TEMPL_MAX_SIZE]; | 381 | u8 template_data[WL1271_CMD_TEMPL_MAX_SIZE]; |
376 | } __packed; | 382 | } __packed; |
377 | 383 | ||
diff --git a/drivers/net/wireless/wl12xx/init.c b/drivers/net/wireless/wl12xx/init.c index ca7ee59e4505..fcf2b128f9a4 100644 --- a/drivers/net/wireless/wl12xx/init.c +++ b/drivers/net/wireless/wl12xx/init.c | |||
@@ -39,50 +39,58 @@ int wl1271_init_templates_config(struct wl1271 *wl) | |||
39 | int ret, i; | 39 | int ret, i; |
40 | 40 | ||
41 | /* send empty templates for fw memory reservation */ | 41 | /* send empty templates for fw memory reservation */ |
42 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_2_4, NULL, | 42 | ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID, |
43 | CMD_TEMPL_CFG_PROBE_REQ_2_4, NULL, | ||
43 | WL1271_CMD_TEMPL_DFLT_SIZE, | 44 | WL1271_CMD_TEMPL_DFLT_SIZE, |
44 | 0, WL1271_RATE_AUTOMATIC); | 45 | 0, WL1271_RATE_AUTOMATIC); |
45 | if (ret < 0) | 46 | if (ret < 0) |
46 | return ret; | 47 | return ret; |
47 | 48 | ||
48 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_CFG_PROBE_REQ_5, | 49 | ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID, |
50 | CMD_TEMPL_CFG_PROBE_REQ_5, | ||
49 | NULL, WL1271_CMD_TEMPL_DFLT_SIZE, 0, | 51 | NULL, WL1271_CMD_TEMPL_DFLT_SIZE, 0, |
50 | WL1271_RATE_AUTOMATIC); | 52 | WL1271_RATE_AUTOMATIC); |
51 | if (ret < 0) | 53 | if (ret < 0) |
52 | return ret; | 54 | return ret; |
53 | 55 | ||
54 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_NULL_DATA, NULL, | 56 | ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID, |
57 | CMD_TEMPL_NULL_DATA, NULL, | ||
55 | sizeof(struct wl12xx_null_data_template), | 58 | sizeof(struct wl12xx_null_data_template), |
56 | 0, WL1271_RATE_AUTOMATIC); | 59 | 0, WL1271_RATE_AUTOMATIC); |
57 | if (ret < 0) | 60 | if (ret < 0) |
58 | return ret; | 61 | return ret; |
59 | 62 | ||
60 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_PS_POLL, NULL, | 63 | ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID, |
64 | CMD_TEMPL_PS_POLL, NULL, | ||
61 | sizeof(struct wl12xx_ps_poll_template), | 65 | sizeof(struct wl12xx_ps_poll_template), |
62 | 0, WL1271_RATE_AUTOMATIC); | 66 | 0, WL1271_RATE_AUTOMATIC); |
63 | if (ret < 0) | 67 | if (ret < 0) |
64 | return ret; | 68 | return ret; |
65 | 69 | ||
66 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_QOS_NULL_DATA, NULL, | 70 | ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID, |
71 | CMD_TEMPL_QOS_NULL_DATA, NULL, | ||
67 | sizeof | 72 | sizeof |
68 | (struct ieee80211_qos_hdr), | 73 | (struct ieee80211_qos_hdr), |
69 | 0, WL1271_RATE_AUTOMATIC); | 74 | 0, WL1271_RATE_AUTOMATIC); |
70 | if (ret < 0) | 75 | if (ret < 0) |
71 | return ret; | 76 | return ret; |
72 | 77 | ||
73 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_PROBE_RESPONSE, NULL, | 78 | ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID, |
79 | CMD_TEMPL_PROBE_RESPONSE, NULL, | ||
74 | WL1271_CMD_TEMPL_DFLT_SIZE, | 80 | WL1271_CMD_TEMPL_DFLT_SIZE, |
75 | 0, WL1271_RATE_AUTOMATIC); | 81 | 0, WL1271_RATE_AUTOMATIC); |
76 | if (ret < 0) | 82 | if (ret < 0) |
77 | return ret; | 83 | return ret; |
78 | 84 | ||
79 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_BEACON, NULL, | 85 | ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID, |
86 | CMD_TEMPL_BEACON, NULL, | ||
80 | WL1271_CMD_TEMPL_DFLT_SIZE, | 87 | WL1271_CMD_TEMPL_DFLT_SIZE, |
81 | 0, WL1271_RATE_AUTOMATIC); | 88 | 0, WL1271_RATE_AUTOMATIC); |
82 | if (ret < 0) | 89 | if (ret < 0) |
83 | return ret; | 90 | return ret; |
84 | 91 | ||
85 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_ARP_RSP, NULL, | 92 | ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID, |
93 | CMD_TEMPL_ARP_RSP, NULL, | ||
86 | sizeof | 94 | sizeof |
87 | (struct wl12xx_arp_rsp_template), | 95 | (struct wl12xx_arp_rsp_template), |
88 | 0, WL1271_RATE_AUTOMATIC); | 96 | 0, WL1271_RATE_AUTOMATIC); |
@@ -93,19 +101,22 @@ int wl1271_init_templates_config(struct wl1271 *wl) | |||
93 | * Put very large empty placeholders for all templates. These | 101 | * Put very large empty placeholders for all templates. These |
94 | * reserve memory for later. | 102 | * reserve memory for later. |
95 | */ | 103 | */ |
96 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_AP_PROBE_RESPONSE, NULL, | 104 | ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID, |
105 | CMD_TEMPL_AP_PROBE_RESPONSE, NULL, | ||
97 | WL1271_CMD_TEMPL_MAX_SIZE, | 106 | WL1271_CMD_TEMPL_MAX_SIZE, |
98 | 0, WL1271_RATE_AUTOMATIC); | 107 | 0, WL1271_RATE_AUTOMATIC); |
99 | if (ret < 0) | 108 | if (ret < 0) |
100 | return ret; | 109 | return ret; |
101 | 110 | ||
102 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_AP_BEACON, NULL, | 111 | ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID, |
112 | CMD_TEMPL_AP_BEACON, NULL, | ||
103 | WL1271_CMD_TEMPL_MAX_SIZE, | 113 | WL1271_CMD_TEMPL_MAX_SIZE, |
104 | 0, WL1271_RATE_AUTOMATIC); | 114 | 0, WL1271_RATE_AUTOMATIC); |
105 | if (ret < 0) | 115 | if (ret < 0) |
106 | return ret; | 116 | return ret; |
107 | 117 | ||
108 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_DEAUTH_AP, NULL, | 118 | ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID, |
119 | CMD_TEMPL_DEAUTH_AP, NULL, | ||
109 | sizeof | 120 | sizeof |
110 | (struct wl12xx_disconn_template), | 121 | (struct wl12xx_disconn_template), |
111 | 0, WL1271_RATE_AUTOMATIC); | 122 | 0, WL1271_RATE_AUTOMATIC); |
@@ -113,7 +124,8 @@ int wl1271_init_templates_config(struct wl1271 *wl) | |||
113 | return ret; | 124 | return ret; |
114 | 125 | ||
115 | for (i = 0; i < CMD_TEMPL_KLV_IDX_MAX; i++) { | 126 | for (i = 0; i < CMD_TEMPL_KLV_IDX_MAX; i++) { |
116 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_KLV, NULL, | 127 | ret = wl1271_cmd_template_set(wl, WL12XX_INVALID_ROLE_ID, |
128 | CMD_TEMPL_KLV, NULL, | ||
117 | sizeof(struct ieee80211_qos_hdr), | 129 | sizeof(struct ieee80211_qos_hdr), |
118 | i, WL1271_RATE_AUTOMATIC); | 130 | i, WL1271_RATE_AUTOMATIC); |
119 | if (ret < 0) | 131 | if (ret < 0) |
@@ -140,7 +152,8 @@ static int wl1271_ap_init_deauth_template(struct wl1271 *wl, | |||
140 | IEEE80211_STYPE_DEAUTH); | 152 | IEEE80211_STYPE_DEAUTH); |
141 | 153 | ||
142 | rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set); | 154 | rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set); |
143 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_DEAUTH_AP, | 155 | ret = wl1271_cmd_template_set(wl, wlvif->role_id, |
156 | CMD_TEMPL_DEAUTH_AP, | ||
144 | tmpl, sizeof(*tmpl), 0, rate); | 157 | tmpl, sizeof(*tmpl), 0, rate); |
145 | 158 | ||
146 | out: | 159 | out: |
@@ -172,7 +185,8 @@ static int wl1271_ap_init_null_template(struct wl1271 *wl, | |||
172 | memcpy(nullfunc->addr3, vif->addr, ETH_ALEN); | 185 | memcpy(nullfunc->addr3, vif->addr, ETH_ALEN); |
173 | 186 | ||
174 | rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set); | 187 | rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set); |
175 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_NULL_DATA, nullfunc, | 188 | ret = wl1271_cmd_template_set(wl, wlvif->role_id, |
189 | CMD_TEMPL_NULL_DATA, nullfunc, | ||
176 | sizeof(*nullfunc), 0, rate); | 190 | sizeof(*nullfunc), 0, rate); |
177 | 191 | ||
178 | out: | 192 | out: |
@@ -204,7 +218,8 @@ static int wl1271_ap_init_qos_null_template(struct wl1271 *wl, | |||
204 | memcpy(qosnull->addr3, vif->addr, ETH_ALEN); | 218 | memcpy(qosnull->addr3, vif->addr, ETH_ALEN); |
205 | 219 | ||
206 | rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set); | 220 | rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set); |
207 | ret = wl1271_cmd_template_set(wl, CMD_TEMPL_QOS_NULL_DATA, qosnull, | 221 | ret = wl1271_cmd_template_set(wl, wlvif->role_id, |
222 | CMD_TEMPL_QOS_NULL_DATA, qosnull, | ||
208 | sizeof(*qosnull), 0, rate); | 223 | sizeof(*qosnull), 0, rate); |
209 | 224 | ||
210 | out: | 225 | out: |
diff --git a/drivers/net/wireless/wl12xx/main.c b/drivers/net/wireless/wl12xx/main.c index bba2a52256b6..e4549dfb70d4 100644 --- a/drivers/net/wireless/wl12xx/main.c +++ b/drivers/net/wireless/wl12xx/main.c | |||
@@ -1778,7 +1778,9 @@ static int wl1271_op_start(struct ieee80211_hw *hw) | |||
1778 | * is added. That is where we will initialize the hardware. | 1778 | * is added. That is where we will initialize the hardware. |
1779 | */ | 1779 | */ |
1780 | 1780 | ||
1781 | return 0; | 1781 | wl1271_error("wl12xx is in an ustable state (fw api update is " |
1782 | "taking place). skip this commit when bisecting"); | ||
1783 | return -EBUSY; | ||
1782 | } | 1784 | } |
1783 | 1785 | ||
1784 | static void wl1271_op_stop(struct ieee80211_hw *hw) | 1786 | static void wl1271_op_stop(struct ieee80211_hw *hw) |
@@ -3297,6 +3299,7 @@ static void wl12xx_remove_vendor_ie(struct sk_buff *skb, | |||
3297 | static int wl1271_ap_set_probe_resp_tmpl(struct wl1271 *wl, u32 rates, | 3299 | static int wl1271_ap_set_probe_resp_tmpl(struct wl1271 *wl, u32 rates, |
3298 | struct ieee80211_vif *vif) | 3300 | struct ieee80211_vif *vif) |
3299 | { | 3301 | { |
3302 | struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); | ||
3300 | struct sk_buff *skb; | 3303 | struct sk_buff *skb; |
3301 | int ret; | 3304 | int ret; |
3302 | 3305 | ||
@@ -3304,7 +3307,7 @@ static int wl1271_ap_set_probe_resp_tmpl(struct wl1271 *wl, u32 rates, | |||
3304 | if (!skb) | 3307 | if (!skb) |
3305 | return -EOPNOTSUPP; | 3308 | return -EOPNOTSUPP; |
3306 | 3309 | ||
3307 | ret = wl1271_cmd_template_set(wl, | 3310 | ret = wl1271_cmd_template_set(wl, wlvif->role_id, |
3308 | CMD_TEMPL_AP_PROBE_RESPONSE, | 3311 | CMD_TEMPL_AP_PROBE_RESPONSE, |
3309 | skb->data, | 3312 | skb->data, |
3310 | skb->len, 0, | 3313 | skb->len, 0, |
@@ -3328,7 +3331,7 @@ static int wl1271_ap_set_probe_resp_tmpl_legacy(struct wl1271 *wl, | |||
3328 | 3331 | ||
3329 | /* no need to change probe response if the SSID is set correctly */ | 3332 | /* no need to change probe response if the SSID is set correctly */ |
3330 | if (wlvif->ssid_len > 0) | 3333 | if (wlvif->ssid_len > 0) |
3331 | return wl1271_cmd_template_set(wl, | 3334 | return wl1271_cmd_template_set(wl, wlvif->role_id, |
3332 | CMD_TEMPL_AP_PROBE_RESPONSE, | 3335 | CMD_TEMPL_AP_PROBE_RESPONSE, |
3333 | probe_rsp_data, | 3336 | probe_rsp_data, |
3334 | probe_rsp_len, 0, | 3337 | probe_rsp_len, 0, |
@@ -3365,7 +3368,7 @@ static int wl1271_ap_set_probe_resp_tmpl_legacy(struct wl1271 *wl, | |||
3365 | ptr, probe_rsp_len - (ptr - probe_rsp_data)); | 3368 | ptr, probe_rsp_len - (ptr - probe_rsp_data)); |
3366 | templ_len += probe_rsp_len - (ptr - probe_rsp_data); | 3369 | templ_len += probe_rsp_len - (ptr - probe_rsp_data); |
3367 | 3370 | ||
3368 | return wl1271_cmd_template_set(wl, | 3371 | return wl1271_cmd_template_set(wl, wlvif->role_id, |
3369 | CMD_TEMPL_AP_PROBE_RESPONSE, | 3372 | CMD_TEMPL_AP_PROBE_RESPONSE, |
3370 | probe_rsp_templ, | 3373 | probe_rsp_templ, |
3371 | templ_len, 0, | 3374 | templ_len, 0, |
@@ -3462,7 +3465,7 @@ static int wl1271_bss_beacon_info_changed(struct wl1271 *wl, | |||
3462 | min_rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set); | 3465 | min_rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set); |
3463 | tmpl_id = is_ap ? CMD_TEMPL_AP_BEACON : | 3466 | tmpl_id = is_ap ? CMD_TEMPL_AP_BEACON : |
3464 | CMD_TEMPL_BEACON; | 3467 | CMD_TEMPL_BEACON; |
3465 | ret = wl1271_cmd_template_set(wl, tmpl_id, | 3468 | ret = wl1271_cmd_template_set(wl, wlvif->role_id, tmpl_id, |
3466 | beacon->data, | 3469 | beacon->data, |
3467 | beacon->len, 0, | 3470 | beacon->len, 0, |
3468 | min_rate); | 3471 | min_rate); |
@@ -3501,7 +3504,7 @@ static int wl1271_bss_beacon_info_changed(struct wl1271 *wl, | |||
3501 | beacon->len, | 3504 | beacon->len, |
3502 | min_rate); | 3505 | min_rate); |
3503 | else | 3506 | else |
3504 | ret = wl1271_cmd_template_set(wl, | 3507 | ret = wl1271_cmd_template_set(wl, wlvif->role_id, |
3505 | CMD_TEMPL_PROBE_RESPONSE, | 3508 | CMD_TEMPL_PROBE_RESPONSE, |
3506 | beacon->data, | 3509 | beacon->data, |
3507 | beacon->len, 0, | 3510 | beacon->len, 0, |
diff --git a/drivers/net/wireless/wl12xx/scan.c b/drivers/net/wireless/wl12xx/scan.c index e24111ececc5..416ae9145d61 100644 --- a/drivers/net/wireless/wl12xx/scan.c +++ b/drivers/net/wireless/wl12xx/scan.c | |||
@@ -217,9 +217,11 @@ static int wl1271_scan_send(struct wl1271 *wl, struct ieee80211_vif *vif, | |||
217 | 217 | ||
218 | memcpy(cmd->addr, vif->addr, ETH_ALEN); | 218 | memcpy(cmd->addr, vif->addr, ETH_ALEN); |
219 | 219 | ||
220 | ret = wl1271_cmd_build_probe_req(wl, wlvif, wl->scan.ssid, | 220 | ret = wl12xx_cmd_build_probe_req(wl, wlvif, |
221 | wl->scan.ssid_len, wl->scan.req->ie, | 221 | wlvif->role_id, band, |
222 | wl->scan.req->ie_len, band); | 222 | wl->scan.ssid, wl->scan.ssid_len, |
223 | wl->scan.req->ie, | ||
224 | wl->scan.req->ie_len); | ||
223 | if (ret < 0) { | 225 | if (ret < 0) { |
224 | wl1271_error("PROBE request template failed"); | 226 | wl1271_error("PROBE request template failed"); |
225 | goto out; | 227 | goto out; |
@@ -658,11 +660,13 @@ int wl1271_scan_sched_scan_config(struct wl1271 *wl, | |||
658 | } | 660 | } |
659 | 661 | ||
660 | if (!force_passive && cfg->active[0]) { | 662 | if (!force_passive && cfg->active[0]) { |
661 | ret = wl1271_cmd_build_probe_req(wl, wlvif, req->ssids[0].ssid, | 663 | u8 band = IEEE80211_BAND_2GHZ; |
664 | ret = wl12xx_cmd_build_probe_req(wl, wlvif, | ||
665 | wlvif->role_id, band, | ||
666 | req->ssids[0].ssid, | ||
662 | req->ssids[0].ssid_len, | 667 | req->ssids[0].ssid_len, |
663 | ies->ie[IEEE80211_BAND_2GHZ], | 668 | ies->ie[band], |
664 | ies->len[IEEE80211_BAND_2GHZ], | 669 | ies->len[band]); |
665 | IEEE80211_BAND_2GHZ); | ||
666 | if (ret < 0) { | 670 | if (ret < 0) { |
667 | wl1271_error("2.4GHz PROBE request template failed"); | 671 | wl1271_error("2.4GHz PROBE request template failed"); |
668 | goto out; | 672 | goto out; |
@@ -670,11 +674,13 @@ int wl1271_scan_sched_scan_config(struct wl1271 *wl, | |||
670 | } | 674 | } |
671 | 675 | ||
672 | if (!force_passive && cfg->active[1]) { | 676 | if (!force_passive && cfg->active[1]) { |
673 | ret = wl1271_cmd_build_probe_req(wl, wlvif, req->ssids[0].ssid, | 677 | u8 band = IEEE80211_BAND_5GHZ; |
678 | ret = wl12xx_cmd_build_probe_req(wl, wlvif, | ||
679 | wlvif->role_id, band, | ||
680 | req->ssids[0].ssid, | ||
674 | req->ssids[0].ssid_len, | 681 | req->ssids[0].ssid_len, |
675 | ies->ie[IEEE80211_BAND_5GHZ], | 682 | ies->ie[band], |
676 | ies->len[IEEE80211_BAND_5GHZ], | 683 | ies->len[band]); |
677 | IEEE80211_BAND_5GHZ); | ||
678 | if (ret < 0) { | 684 | if (ret < 0) { |
679 | wl1271_error("5GHz PROBE request template failed"); | 685 | wl1271_error("5GHz PROBE request template failed"); |
680 | goto out; | 686 | goto out; |
diff --git a/drivers/net/wireless/wl12xx/wl12xx.h b/drivers/net/wireless/wl12xx/wl12xx.h index 1f629fac02e4..b9bfbfffc5c0 100644 --- a/drivers/net/wireless/wl12xx/wl12xx.h +++ b/drivers/net/wireless/wl12xx/wl12xx.h | |||
@@ -35,8 +35,8 @@ | |||
35 | #include "conf.h" | 35 | #include "conf.h" |
36 | #include "ini.h" | 36 | #include "ini.h" |
37 | 37 | ||
38 | #define WL127X_FW_NAME "ti-connectivity/wl127x-fw-3.bin" | 38 | #define WL127X_FW_NAME "ti-connectivity/wl127x-fw-4-sr.bin" |
39 | #define WL128X_FW_NAME "ti-connectivity/wl128x-fw-3.bin" | 39 | #define WL128X_FW_NAME "ti-connectivity/wl128x-fw-4-sr.bin" |
40 | 40 | ||
41 | /* | 41 | /* |
42 | * wl127x and wl128x are using the same NVS file name. However, the | 42 | * wl127x and wl128x are using the same NVS file name. However, the |