Message ID | 1386494714-21070-2-git-send-email-pali.rohar@gmail.com (mailing list archive) |
---|---|
State | Not Applicable, archived |
Headers | show |
Hi! > diff --git a/drivers/net/wireless/ti/wl1251/cmd.c b/drivers/net/wireless/ti/wl1251/cmd.c > index 6822b84..16b6479 100644 > --- a/drivers/net/wireless/ti/wl1251/cmd.c > +++ b/drivers/net/wireless/ti/wl1251/cmd.c > @@ -410,7 +411,10 @@ int wl1251_cmd_scan(struct wl1251 *wl, u8 *ssid, size_t ssid_len, > struct wl1251_cmd_scan *cmd; > int i, ret = 0; > > - wl1251_debug(DEBUG_CMD, "cmd scan"); > + wl1251_debug(DEBUG_CMD, "cmd scan channels %d ssid(%d) '%s'", > + n_channels, (int)ssid_len, ssid); > + > + WARN_ON(n_channels > SCAN_MAX_NUM_OF_CHANNELS); > ssids can have \0s in them... and what is worse, they may not be 0 terminated AFAICT. Potential solution is at http://www.spinics.net/lists/linux-wireless/msg98640.html . Thanks, Pavel
Pavel Machek <pavel@ucw.cz> writes: > ssids can have \0s in them... and what is worse, they may not be 0 > terminated AFAICT. > > Potential solution is at > http://www.spinics.net/lists/linux-wireless/msg98640.html . I just use print_hex_dump_bytes() to print SSIDs.
On Tuesday 10 December 2013 16:41:04 Kalle Valo wrote: > Pavel Machek <pavel@ucw.cz> writes: > > ssids can have \0s in them... and what is worse, they may > > not be 0 terminated AFAICT. > > > > Potential solution is at > > http://www.spinics.net/lists/linux-wireless/msg98640.html . > > I just use print_hex_dump_bytes() to print SSIDs. Ok and has kernel printf modifier for size_t?
On Tue, 2013-12-10 at 18:08 +0100, Pali Rohár wrote: > On Tuesday 10 December 2013 16:41:04 Kalle Valo wrote: > > Pavel Machek <pavel@ucw.cz> writes: > > > ssids can have \0s in them... and what is worse, they may > > > not be 0 terminated AFAICT. > > > > > > Potential solution is at > > > http://www.spinics.net/lists/linux-wireless/msg98640.html . > > > > I just use print_hex_dump_bytes() to print SSIDs. > > Ok and has kernel printf modifier for size_t? It is 'z', same as in userland. Ben.
diff --git a/drivers/net/wireless/ti/wl1251/cmd.c b/drivers/net/wireless/ti/wl1251/cmd.c index 6822b84..16b6479 100644 --- a/drivers/net/wireless/ti/wl1251/cmd.c +++ b/drivers/net/wireless/ti/wl1251/cmd.c @@ -3,6 +3,7 @@ #include <linux/module.h> #include <linux/slab.h> #include <linux/crc7.h> +#include <linux/etherdevice.h> #include "wl1251.h" #include "reg.h" @@ -410,7 +411,10 @@ int wl1251_cmd_scan(struct wl1251 *wl, u8 *ssid, size_t ssid_len, struct wl1251_cmd_scan *cmd; int i, ret = 0; - wl1251_debug(DEBUG_CMD, "cmd scan"); + wl1251_debug(DEBUG_CMD, "cmd scan channels %d ssid(%d) '%s'", + n_channels, (int)ssid_len, ssid); + + WARN_ON(n_channels > SCAN_MAX_NUM_OF_CHANNELS); cmd = kzalloc(sizeof(*cmd), GFP_KERNEL); if (!cmd) @@ -421,6 +425,13 @@ int wl1251_cmd_scan(struct wl1251 *wl, u8 *ssid, size_t ssid_len, CFG_RX_MGMT_EN | CFG_RX_BCN_EN); cmd->params.scan_options = 0; + /* + * Use high priority scan when not associated to prevent fw issue + * causing never-ending scans (sometimes 20+ minutes). + * Note: This bug may be caused by the fw's DTIM handling. + */ + if (is_zero_ether_addr(wl->bssid)) + cmd->params.scan_options |= WL1251_SCAN_OPT_PRIORITY_HIGH; cmd->params.num_channels = n_channels; cmd->params.num_probe_requests = n_probes; cmd->params.tx_rate = cpu_to_le16(1 << 1); /* 2 Mbps */ diff --git a/drivers/net/wireless/ti/wl1251/cmd.h b/drivers/net/wireless/ti/wl1251/cmd.h index ee4f2b3..126f273 100644 --- a/drivers/net/wireless/ti/wl1251/cmd.h +++ b/drivers/net/wireless/ti/wl1251/cmd.h @@ -167,6 +167,11 @@ struct cmd_read_write_memory { #define CMDMBOX_HEADER_LEN 4 #define CMDMBOX_INFO_ELEM_HEADER_LEN 4 +#define WL1251_SCAN_OPT_PASSIVE 1 +#define WL1251_SCAN_OPT_5GHZ_BAND 2 +#define WL1251_SCAN_OPT_TRIGGERD_SCAN 4 +#define WL1251_SCAN_OPT_PRIORITY_HIGH 8 + #define WL1251_SCAN_MIN_DURATION 30000 #define WL1251_SCAN_MAX_DURATION 60000 diff --git a/drivers/net/wireless/ti/wl1251/main.c b/drivers/net/wireless/ti/wl1251/main.c index 3291ffa..4d89ac8 100644 --- a/drivers/net/wireless/ti/wl1251/main.c +++ b/drivers/net/wireless/ti/wl1251/main.c @@ -930,6 +930,7 @@ static int wl1251_op_hw_scan(struct ieee80211_hw *hw, ret = wl1251_cmd_scan(wl, ssid, ssid_len, req->channels, req->n_channels, WL1251_SCAN_NUM_PROBES); if (ret < 0) { + wl1251_debug(DEBUG_SCAN, "scan failed %d", ret); wl->scanning = false; goto out_idle; }