Skip to content

Commit

Permalink
[PATCH] libertas: scan two channels per scan command
Browse files Browse the repository at this point in the history
Scan two channels per each command on set_scan(), then bail out and let
get_scan() continue the scanning work up to the last channel.

This gives time to the firmware so it can go back to the association
channel and keep the connection alive.

Fixes http://dev.laptop.org/ticket/841

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Marcelo Tosatti authored and John W. Linville committed Jun 11, 2007
1 parent 5ecd310 commit 064827e
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 9 deletions.
2 changes: 2 additions & 0 deletions drivers/net/wireless/libertas/dev.h
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,8 @@ struct _wlan_adapter {
u32 radiomode;
u32 debugmode;
u8 fw_ready;

u8 last_scanned_channel;
};

#endif /* _WLAN_DEV_H_ */
34 changes: 25 additions & 9 deletions drivers/net/wireless/libertas/scan.c
Original file line number Diff line number Diff line change
Expand Up @@ -613,14 +613,17 @@ static int wlan_scan_channel_list(wlan_private * priv,
u8 filteredscan,
struct wlan_scan_cmd_config * pscancfgout,
struct mrvlietypes_chanlistparamset * pchantlvout,
struct chanscanparamset * pscanchanlist)
struct chanscanparamset * pscanchanlist,
const struct wlan_ioctl_user_scan_cfg * puserscanin)
{
struct chanscanparamset *ptmpchan;
struct chanscanparamset *pstartchan;
u8 scanband;
int doneearly;
int tlvidx;
int ret = 0;
int scanned = 0;
union iwreq_data wrqu;

ENTER();

Expand All @@ -635,6 +638,9 @@ static int wlan_scan_channel_list(wlan_private * priv,
/* Set the temp channel struct pointer to the start of the desired list */
ptmpchan = pscanchanlist;

if (priv->adapter->last_scanned_channel && !puserscanin)
ptmpchan += priv->adapter->last_scanned_channel;

/* Loop through the desired channel list, sending a new firmware scan
* commands for each maxchanperscan channels (or for 1,6,11 individually
* if configured accordingly)
Expand All @@ -654,7 +660,7 @@ static int wlan_scan_channel_list(wlan_private * priv,
* - doneearly is set (controlling individual scanning of 1,6,11)
*/
while (tlvidx < maxchanperscan && ptmpchan->channumber
&& !doneearly) {
&& !doneearly && scanned < 2) {

lbs_pr_debug(1,
"Scan: Chan(%3d), Radio(%d), mode(%d,%d), Dur(%d)\n",
Expand Down Expand Up @@ -701,6 +707,7 @@ static int wlan_scan_channel_list(wlan_private * priv,

/* Increment the tmp pointer to the next channel to be scanned */
ptmpchan++;
scanned++;

/* Stop the loop if the *next* channel is in the 1,6,11 set.
* This will cause it to be the only channel scanned on the next
Expand All @@ -716,8 +723,18 @@ static int wlan_scan_channel_list(wlan_private * priv,
/* Send the scan command to the firmware with the specified cfg */
ret = libertas_prepare_and_send_command(priv, cmd_802_11_scan, 0,
0, 0, pscancfgout);
if (scanned >= 2) {
priv->adapter->last_scanned_channel = ptmpchan->channumber;
return 0;
}

}

priv->adapter->last_scanned_channel = ptmpchan->channumber;

memset(&wrqu, 0, sizeof(union iwreq_data));
wireless_send_event(priv->wlan_dev.netdev, SIOCGIWSCAN, &wrqu, NULL);

LEAVE();
return ret;
}
Expand Down Expand Up @@ -775,6 +792,9 @@ int wlan_scan_networks(wlan_private * priv,
keeppreviousscan = puserscanin->keeppreviousscan;
}

if (adapter->last_scanned_channel)
keeppreviousscan = 1;

if (!keeppreviousscan) {
memset(adapter->scantable, 0x00,
sizeof(struct bss_descriptor) * MRVDRV_MAX_BSSID_LIST);
Expand All @@ -792,7 +812,8 @@ int wlan_scan_networks(wlan_private * priv,
filteredscan,
scan_cfg,
pchantlvout,
scan_chan_list);
scan_chan_list,
puserscanin);

/* Process the resulting scan table:
* - Remove any bad ssids
Expand Down Expand Up @@ -1407,15 +1428,10 @@ int libertas_set_scan(struct net_device *dev, struct iw_request_info *info,
{
wlan_private *priv = dev->priv;
wlan_adapter *adapter = priv->adapter;
union iwreq_data wrqu;

ENTER();

if (!wlan_scan_networks(priv, NULL)) {
memset(&wrqu, 0, sizeof(union iwreq_data));
wireless_send_event(priv->wlan_dev.netdev, SIOCGIWSCAN, &wrqu,
NULL);
}
wlan_scan_networks(priv, NULL);

if (adapter->surpriseremoved)
return -1;
Expand Down

0 comments on commit 064827e

Please sign in to comment.