Exemplo n.º 1
0
/**
 *  @brief Shutdown firmware
 *
 *  @param pmlan_adapter	A pointer to mlan_adapter structure
 *
 *  @return			MLAN_STATUS_SUCCESS
 *                      		The firmware shutdown call succeeded.
 *				MLAN_STATUS_PENDING
 *      	                	The firmware shutdown call is pending.
 *				MLAN_STATUS_FAILURE
 *      	                	The firmware shutdown call failed.
 */
mlan_status
mlan_shutdown_fw(IN t_void * pmlan_adapter)
{
    mlan_status ret = MLAN_STATUS_PENDING;
    mlan_adapter *pmadapter = (mlan_adapter *) pmlan_adapter;
    pmlan_callbacks pcb;
    t_s32 i = 0;

    ENTER();

    MASSERT(pmlan_adapter);
    /* MLAN already shutdown */
    if (pmadapter->hw_status == WlanHardwareStatusNotReady) {
        LEAVE();
        return MLAN_STATUS_SUCCESS;
    }

    pmadapter->hw_status = WlanHardwareStatusClosing;
    /* Wait for mlan_process to complete */
    if (pmadapter->mlan_processing) {
        PRINTM(MWARN, "MLAN main processing is still running\n");
        LEAVE();
        return ret;
    }

    /* Shut down MLAN */
    PRINTM(MINFO, "Shutdown MLAN...\n");

    /* Cancel all pending commands and complete ioctls */
    wlan_cancel_all_pending_cmd(pmadapter);

    /* Clean up priv structures */
    for (i = 0; i < pmadapter->priv_num; i++) {
        if (pmadapter->priv[i]) {
            wlan_free_priv(pmadapter->priv[i]);
        }
    }

    pcb = &pmadapter->callbacks;

    if (pcb->moal_spin_lock(pmadapter->pmoal_handle, pmadapter->pmlan_lock)
        != MLAN_STATUS_SUCCESS) {
        ret = MLAN_STATUS_FAILURE;
        goto exit_shutdown_fw;
    }

    if (pcb->moal_spin_unlock(pmadapter->pmoal_handle, pmadapter->pmlan_lock)
        != MLAN_STATUS_SUCCESS) {
        ret = MLAN_STATUS_FAILURE;
        goto exit_shutdown_fw;
    }

    /* Notify completion */
    ret = wlan_shutdown_fw_complete(pmadapter);

  exit_shutdown_fw:
    LEAVE();
    return ret;
}
/**
 *  @brief Shutdown firmware
 *
 *  @param pmlan_adapter	A pointer to mlan_adapter structure
 *
 *  @return			MLAN_STATUS_SUCCESS
 *                      		The firmware shutdown call succeeded.
 *				MLAN_STATUS_PENDING
 *      	                	The firmware shutdown call is pending.
 *				MLAN_STATUS_FAILURE
 *      	                	The firmware shutdown call failed.
 */
mlan_status
mlan_shutdown_fw(IN t_void * pmlan_adapter)
{
    mlan_status ret = MLAN_STATUS_PENDING;
    mlan_adapter *pmadapter = (mlan_adapter *) pmlan_adapter;
    pmlan_buffer pmbuf;
    pmlan_callbacks pcb;
    t_s32 i = 0;

    ENTER();

    MASSERT(pmlan_adapter);
    /* MLAN already shutdown */
    if (pmadapter->hw_status == WlanHardwareStatusNotReady) {
        LEAVE();
        return MLAN_STATUS_SUCCESS;
    }

    pmadapter->hw_status = WlanHardwareStatusClosing;
    /* Wait for mlan_process to complete */
    if (pmadapter->mlan_processing) {
        PRINTM(MWARN, "MLAN main processing is still running\n");
        LEAVE();
        return ret;
    }

    /* Shut down MLAN */
    PRINTM(MINFO, "Shutdown MLAN...\n");

    /* Cancel all pending commands and complete ioctls */
    wlan_cancel_all_pending_cmd(pmadapter);

    /* Clean up priv structures */
    for (i = 0; i < pmadapter->priv_num; i++) {
        if (pmadapter->priv[i]) {
            wlan_free_priv(pmadapter->priv[i]);
        }
    }

    pcb = &pmadapter->callbacks;

    while ((pmbuf =
                (pmlan_buffer) util_dequeue_list(pmadapter->pmoal_handle,
                        &pmadapter->rx_data_queue,
                        pcb->moal_spin_lock,
                        pcb->moal_spin_unlock))) {
        wlan_free_mlan_buffer(pmadapter, pmbuf);
    }
    util_scalar_write(pmadapter->pmoal_handle, &pmadapter->rx_pkts_queued,
                      0, pmadapter->callbacks.moal_spin_lock,
                      pmadapter->callbacks.moal_spin_unlock);

    /* Notify completion */
    ret = wlan_shutdown_fw_complete(pmadapter);

    LEAVE();
    return ret;
}