Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=064827edf6901e5fcbd84fc258fb2326a530da9c
Commit:     064827edf6901e5fcbd84fc258fb2326a530da9c
Parent:     5ecd3100e695228ac5e0ce0e325e252c0f11806f
Author:     Marcelo Tosatti <[EMAIL PROTECTED]>
AuthorDate: Thu May 24 23:37:28 2007 -0400
Committer:  John W. Linville <[EMAIL PROTECTED]>
CommitDate: Mon Jun 11 14:28:35 2007 -0400

    [PATCH] libertas: scan two channels per scan command
    
    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 <[EMAIL PROTECTED]>
    Signed-off-by: John W. Linville <[EMAIL PROTECTED]>
---
 drivers/net/wireless/libertas/dev.h  |    2 ++
 drivers/net/wireless/libertas/scan.c |   34 +++++++++++++++++++++++++---------
 2 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/drivers/net/wireless/libertas/dev.h 
b/drivers/net/wireless/libertas/dev.h
index e8b9020..0dc4fc3 100644
--- a/drivers/net/wireless/libertas/dev.h
+++ b/drivers/net/wireless/libertas/dev.h
@@ -396,6 +396,8 @@ struct _wlan_adapter {
        u32 radiomode;
        u32 debugmode;
        u8 fw_ready;
+
+       u8 last_scanned_channel;
 };
 
 #endif                         /* _WLAN_DEV_H_ */
diff --git a/drivers/net/wireless/libertas/scan.c 
b/drivers/net/wireless/libertas/scan.c
index 3c0b1a2..c9f5737 100644
--- a/drivers/net/wireless/libertas/scan.c
+++ b/drivers/net/wireless/libertas/scan.c
@@ -613,7 +613,8 @@ 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;
@@ -621,6 +622,8 @@ static int wlan_scan_channel_list(wlan_private * priv,
        int doneearly;
        int tlvidx;
        int ret = 0;
+       int scanned = 0;
+       union iwreq_data wrqu;
 
        ENTER();
 
@@ -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)
@@ -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",
@@ -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
@@ -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;
 }
@@ -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);
@@ -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
@@ -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;
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to