/** @brief This function handles client driver resume * * @param dev A pointer to device structure * @return MLAN_STATUS_SUCCESS */ int woal_sdio_resume(struct device *dev) { struct sdio_func *func = dev_to_sdio_func(dev); mmc_pm_flag_t pm_flags = 0; moal_handle *handle = NULL; struct sdio_mmc_card *cardp; int i; ENTER(); PRINTM(MCMND, "<--- Enter woal_sdio_resume --->\n"); wifi_enable_hostwake_irq(MFALSE); pm_flags = sdio_get_host_pm_caps(func); PRINTM(MCMND, "%s: resume: PM flags = 0x%x\n", sdio_func_id(func), pm_flags); cardp = sdio_get_drvdata(func); if (!cardp || !cardp->handle) { PRINTM(MERROR, "Card or moal_handle structure is not valid\n"); LEAVE(); return MLAN_STATUS_SUCCESS; } handle = cardp->handle; if (handle->is_suspended == MFALSE) { PRINTM(MWARN, "Device already resumed\n"); LEAVE(); return MLAN_STATUS_SUCCESS; } handle->is_suspended = MFALSE; if (woal_check_driver_status(handle)) { PRINTM(MERROR, "Resuem, device is in hang state\n"); LEAVE(); return MLAN_STATUS_SUCCESS; } for (i = 0; i < handle->priv_num; i++) netif_device_attach(handle->priv[i]->netdev); /* Disable Host Sleep */ woal_cancel_hs(woal_get_priv(handle, MLAN_BSS_ROLE_ANY), MOAL_NO_WAIT); PRINTM(MCMND, "<--- Leave woal_sdio_resume --->\n"); LEAVE(); return MLAN_STATUS_SUCCESS; }
/** * @brief Handle resume * * @param intf Pointer to usb_interface * * @return MLAN_STATUS_SUCCESS */ static int woal_usb_resume(struct usb_interface *intf) { struct usb_card_rec *cardp = usb_get_intfdata(intf); moal_handle *handle = NULL; int i; ENTER(); if (!cardp || !cardp->phandle) { PRINTM(MERROR, "Card or adapter structure is not valid\n"); LEAVE(); return MLAN_STATUS_SUCCESS; } handle = cardp->phandle; if (handle->is_suspended == MFALSE) { PRINTM(MWARN, "Device already resumed\n"); LEAVE(); return MLAN_STATUS_SUCCESS; } /* Indicate device resumed. The netdev queue will be resumed only after the urbs have been resubmitted */ handle->is_suspended = MFALSE; if (!atomic_read(&cardp->rx_data_urb_pending)) { /* Submit multiple Rx data URBs */ woal_usb_submit_rx_data_urbs(handle); } if (!atomic_read(&cardp->rx_cmd_urb_pending)) { if ((cardp->rx_cmd.pmbuf = woal_alloc_mlan_buffer(handle, MLAN_RX_CMD_BUF_SIZE))) woal_usb_submit_rx_urb(&cardp->rx_cmd, MLAN_RX_CMD_BUF_SIZE); } for (i = 0; i < handle->priv_num; i++) if (handle->priv[i]->media_connected == MTRUE) netif_carrier_on(handle->priv[i]->netdev); /* Disable Host Sleep */ if (handle->hs_activated) woal_cancel_hs(woal_get_priv(handle, MLAN_BSS_ROLE_ANY), MOAL_NO_WAIT); #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24) #ifdef CONFIG_PM /* Resume handler may be called due to remote wakeup, force to exit suspend anyway */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,35) cardp->udev->autosuspend_disabled = 1; #else cardp->udev->dev.power.runtime_auto = 0; #endif /* < 2.6.35 */ #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33) cardp->udev->autoresume_disabled = 0; #endif /* < 2.6.33 */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,34) atomic_inc(&(cardp->udev)->dev.power.usage_count); #endif /* >= 2.6.34 */ #endif /* CONFIG_PM */ #endif /* >= 2.6.24 */ LEAVE(); return MLAN_STATUS_SUCCESS; }