.. | .. |
---|
2452 | 2452 | dhd_pub_t *dhd = (dhd_pub_t *)handle; |
---|
2453 | 2453 | unsigned long flags; |
---|
2454 | 2454 | wifi_adapter_info_t *adapter; |
---|
| 2455 | + int wowl_dngldown = 0; |
---|
2455 | 2456 | |
---|
2456 | 2457 | if (dhd == NULL) { |
---|
2457 | 2458 | DBUSERR(("%s: dhd is NULL\n", __FUNCTION__)); |
---|
2458 | 2459 | return; |
---|
2459 | 2460 | } |
---|
2460 | 2461 | adapter = (wifi_adapter_info_t *)dhd->adapter; |
---|
| 2462 | +#ifdef WL_EXT_WOWL |
---|
| 2463 | + wowl_dngldown = dhd_conf_wowl_dngldown(dhd); |
---|
| 2464 | +#endif |
---|
2461 | 2465 | |
---|
2462 | | - if (dhd->busstate == DHD_BUS_SUSPEND && state == DBUS_STATE_DOWN) { |
---|
| 2466 | + if ((dhd->busstate == DHD_BUS_SUSPEND && state == DBUS_STATE_DOWN) || |
---|
| 2467 | + (dhd->hostsleep && wowl_dngldown)) { |
---|
2463 | 2468 | DBUSERR(("%s: switch state %d to %d\n", __FUNCTION__, state, DBUS_STATE_SLEEP)); |
---|
2464 | 2469 | state = DBUS_STATE_SLEEP; |
---|
2465 | 2470 | } |
---|
.. | .. |
---|
3059 | 3064 | } |
---|
3060 | 3065 | |
---|
3061 | 3066 | DBUSTRACE(("%s: Exit\n", __FUNCTION__)); |
---|
| 3067 | + wifi_clr_adapter_status(adapter, WIFI_STATUS_BUS_DISCONNECTED); |
---|
3062 | 3068 | if (net_attached) { |
---|
3063 | 3069 | wifi_set_adapter_status(adapter, WIFI_STATUS_NET_ATTACHED); |
---|
3064 | 3070 | wake_up_interruptible(&adapter->status_event); |
---|
.. | .. |
---|
3112 | 3118 | dhd_dbus_advertise_bus_remove(bus->dhd); |
---|
3113 | 3119 | dbus_detach(pub->bus); |
---|
3114 | 3120 | pub->bus = NULL; |
---|
| 3121 | + wifi_set_adapter_status(adapter, WIFI_STATUS_BUS_DISCONNECTED); |
---|
3115 | 3122 | wake_up_interruptible(&adapter->status_event); |
---|
3116 | 3123 | } else { |
---|
3117 | 3124 | osh = pub->osh; |
---|
.. | .. |
---|
3133 | 3140 | DBUSTRACE(("%s: Exit\n", __FUNCTION__)); |
---|
3134 | 3141 | } |
---|
3135 | 3142 | |
---|
| 3143 | +int |
---|
| 3144 | +dhd_bus_sleep(dhd_pub_t *dhdp, bool sleep, uint32 *intstatus) |
---|
| 3145 | +{ |
---|
| 3146 | + wifi_adapter_info_t *adapter = (wifi_adapter_info_t *)dhdp->adapter; |
---|
| 3147 | + s32 timeout = -1; |
---|
| 3148 | + int err = 0; |
---|
| 3149 | + |
---|
| 3150 | + timeout = wait_event_interruptible_timeout(adapter->status_event, |
---|
| 3151 | + wifi_get_adapter_status(adapter, WIFI_STATUS_BUS_DISCONNECTED), |
---|
| 3152 | + msecs_to_jiffies(12000)); |
---|
| 3153 | + if (timeout <= 0) { |
---|
| 3154 | + err = -1; |
---|
| 3155 | + DBUSERR(("%s: bus disconnected timeout\n", __FUNCTION__)); |
---|
| 3156 | + } |
---|
| 3157 | + |
---|
| 3158 | + return err; |
---|
| 3159 | +} |
---|
| 3160 | + |
---|
3136 | 3161 | #ifdef LINUX_EXTERNAL_MODULE_DBUS |
---|
3137 | 3162 | |
---|
3138 | 3163 | static int __init |
---|