/* * --------------------------------------------------------------------------- * unifi_resume * * Handles a resume request from the SDIO driver. * * Arguments: * ospriv Pointer to OS driver context. * * --------------------------------------------------------------------------- */ void unifi_resume(void *ospriv) { unifi_priv_t *priv = ospriv; int interfaceTag=0; int r; int wol = priv->wol_suspend; unifi_trace(priv, UDBG1, "unifi_resume: resume SME, enable_wol=%d", enable_wol); /* The resume causes wifi-on which will re-enable the BH and reinstall the ISR */ r = sme_sys_resume(priv); if (r) { unifi_error(priv, "Failed to resume UniFi\n"); } /* Resume the network interfaces. For the cold resume case, this will * happen upon reconnection. */ if (wol) { unifi_trace(priv, UDBG1, "unifi_resume: try to enable carrier"); /* need to start all the netdevices*/ for( interfaceTag=0;interfaceTag<CSR_WIFI_NUM_INTERFACES;interfaceTag++) { netInterface_priv_t *interfacePriv = priv->interfacePriv[interfaceTag]; unifi_trace(priv, UDBG1, "unifi_resume: interfaceTag %d netdev_registered %d mode %d\n", interfaceTag, interfacePriv->netdev_registered, interfacePriv->interfaceMode); if (interfacePriv->netdev_registered == 1) { netif_carrier_on(priv->netdev[interfaceTag]); UF_NETIF_TX_START_ALL_QUEUES(priv->netdev[interfaceTag]); } } /* Kick the BH thread (with reason=host) to poll for data that may have * arrived during a powered suspend. This caters for the case where the SME * doesn't interact with the chip (e.g install autonomous scans) during resume. */ unifi_send_signal(priv->card, NULL, 0, NULL); } } /* unifi_resume() */
int unifi_cfg_power(unifi_priv_t *priv, unsigned char *arg) { unifi_cfg_power_t cfg_power; int rc; int wol; if (get_user(cfg_power, (unifi_cfg_power_t*)(((unifi_cfg_command_t*)arg) + 1))) { unifi_error(priv, "UNIFI_CFG: Failed to get the argument\n"); return -EFAULT; } switch (cfg_power) { case UNIFI_CFG_POWER_OFF: priv->wol_suspend = (enable_wol == UNIFI_WOL_OFF) ? FALSE : TRUE; rc = sme_sys_suspend(priv); if (rc) { return rc; } break; case UNIFI_CFG_POWER_ON: wol = priv->wol_suspend; rc = sme_sys_resume(priv); if (rc) { return rc; } if (wol) { /* Kick the BH to ensure pending transfers are handled when * a suspend happened with card powered. */ unifi_send_signal(priv->card, NULL, 0, NULL); } break; default: unifi_error(priv, "WIFI POWER: Unknown value.\n"); return -EINVAL; } return 0; }