network: wireless: bcm4329: Add driver SETSUSPEND command
authorDmitry Shmidt <dimitrysh@google.com>
Wed, 30 Jun 2010 22:30:54 +0000 (15:30 -0700)
committerColin Cross <ccross@android.com>
Thu, 30 Sep 2010 00:49:39 +0000 (17:49 -0700)
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
drivers/net/wireless/bcm4329/dhd.h
drivers/net/wireless/bcm4329/dhd_linux.c
drivers/net/wireless/bcm4329/wl_iw.c
drivers/net/wireless/bcm4329/wl_iw.h

index 005681eb6bbe0ec25189e8335de11a76ec822d8d..9db5c6370972d42a41189bb5cb21ca205ffb7b3d 100644 (file)
@@ -150,6 +150,9 @@ typedef struct dhd_pub {
        /* Last error from dongle */
        int dongle_error;
 
+       /* Suspend disable flag */
+       int suspend_disable_flag;
+
        /* Pkt filter defination */
        char * pktfilter[100];
        int pktfilter_count;
index 27b1f55de3d1ea9ae7dee36f152025e99cff7128..fc24b852cd0256cbeb05d9863d9072b554366e58 100644 (file)
@@ -507,7 +507,7 @@ int dhd_set_suspend(int value, dhd_pub_t *dhd)
 
 #define htod32(i) i
 
-       if (dhd && dhd->up) {
+       if (dhd && (dhd->up && !dhd->suspend_disable_flag)) {
                dhd_os_proto_block(dhd);
                if (value) {
 
@@ -3023,3 +3023,12 @@ int net_os_wake_unlock(struct net_device *dev)
                ret = dhd_os_wake_unlock(&dhd->pub);
        return ret;
 }
+
+int net_os_set_suspend_disable(struct net_device *dev, int val)
+{
+       dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev);
+
+       if (dhd)
+               dhd->pub.suspend_disable_flag = val;
+       return 0;
+}
index bccf9691a961e3c55a66ebc0cb8060dcdc7e7179..98133bbf4b6ad4354d318a7776f94d130372423b 100644 (file)
@@ -822,6 +822,20 @@ wl_iw_set_btcoex_dhcp(
        return error;
 }
 
+static int
+wl_iw_set_suspend(
+       struct net_device *dev,
+       struct iw_request_info *info,
+       union iwreq_data *wrqu,
+       char *extra
+)
+{
+       int suspend_flag;
+
+       suspend_flag = *(extra + strlen("SETSUSPEND") + 1) - '0';
+       return net_os_set_suspend_disable(dev, suspend_flag);
+}
+
 int
 wl_format_ssid(char* ssid_buf, uint8* ssid, int ssid_len)
 {
@@ -5909,6 +5923,8 @@ static int wl_iw_set_priv(
 #endif
                else if (strnicmp(extra, "GETPOWER", strlen("GETPOWER")) == 0)
                        ret = wl_iw_get_power_mode(dev, info, (union iwreq_data *)dwrq, extra);
+               else if (strnicmp(extra, "SETSUSPEND", strlen("SETSUSPEND")) == 0)
+                       ret = wl_iw_set_suspend(dev, info, (union iwreq_data *)dwrq, extra);
 #ifdef SOFTAP
                else if (strnicmp(extra, "ASCII_CMD", strlen("ASCII_CMD")) == 0) {
                        wl_iw_process_private_ascii_cmd(dev, info, (union iwreq_data *)dwrq, extra);
index 7514bafa53e04bd4ce4db71a0446a47d0bae6272..7b7b16b33b1868e355322d8e414d4afd52fcdbf9 100644 (file)
@@ -173,6 +173,7 @@ extern int net_os_wake_lock(struct net_device *dev);
 extern int net_os_wake_unlock(struct net_device *dev);
 extern int net_os_wake_lock_timeout(struct net_device *dev);
 extern int net_os_wake_lock_timeout_enable(struct net_device *dev);
+extern int net_os_set_suspend_disable(struct net_device *dev, int val);
 
 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
 #define IWE_STREAM_ADD_EVENT(info, stream, ends, iwe, extra) \