/** * @brief Callback to finish domain_info handling * Not to be called directly to initiate domain_info setting. * * @param pmpriv A pointer to mlan_private structure (cast from t_void*) * * @return MLAN_STATUS_PENDING --success, otherwise fail * @sa wlan_uap_domain_info */ static mlan_status wlan_uap_callback_domain_info(IN t_void * priv) { mlan_status ret = MLAN_STATUS_SUCCESS; mlan_private *pmpriv = (mlan_private *) priv; wlan_uap_get_info_cb_t *puap_state_chan_cb = &pmpriv->uap_state_chan_cb; mlan_ds_11d_cfg *cfg11d; t_u8 band; ENTER(); /* clear callback now that we're here */ puap_state_chan_cb->get_chan_callback = MNULL; cfg11d = (mlan_ds_11d_cfg *) puap_state_chan_cb->pioctl_req_curr->pbuf; band = (puap_state_chan_cb->band_config & BAND_CONFIG_5GHZ) ? BAND_A : BAND_B; ret = wlan_11d_handle_uap_domain_info(pmpriv, band, cfg11d->param.domain_tlv, puap_state_chan_cb->pioctl_req_curr); if (ret == MLAN_STATUS_SUCCESS) ret = MLAN_STATUS_PENDING; puap_state_chan_cb->pioctl_req_curr = MNULL; // prevent re-use LEAVE(); return ret; }
/* * Note: wlan_uap_domain_info() and wlan_uap_callback_domain_info() are the * original function which handles this functionality. However, it does it * through and IOCTL and its control flow will not work in our case. To * elaborate, it first gets the channel number by sending a command to * firmware. Then in the cmd resp handler to sends the domain info * command. As per the current design of our driver we cannot send command * from command resp handler. Hence, we have modified the control flow to * suit our design. The wifi_get_uap_channel() function also helps us in * this by updating pmpriv->uap_state_chan_cb.band_config and * pmpriv->uap_state_chan_cb.channel. * * fixme: Need to check how ACS works with this. */ static int wifi_uap_downld_domain_params(MrvlIEtypes_DomainParamSet_t *dp) { if (!dp) return -WM_E_INVAL; mlan_private *pmpriv = (mlan_private *) mlan_adap->priv[0]; wifi_get_uap_channel(NULL); t_u8 band = (pmpriv->uap_state_chan_cb.band_config & BAND_CONFIG_5GHZ) ? BAND_A : BAND_B; int rv = wlan_11d_handle_uap_domain_info(pmpriv, band, (t_u8 *)dp, NULL); if (rv != MLAN_STATUS_SUCCESS) return -WM_FAIL; return 0; }
/** * @brief Callback to finish domain_info handling * Not to be called directly to initiate domain_info setting. * * @param pmpriv A pointer to mlan_private structure (cast from t_void*) * * @return MLAN_STATUS_PENDING --success, otherwise fail * @sa wlan_uap_domain_info */ static mlan_status wlan_uap_callback_domain_info(IN t_void * priv) { mlan_status ret = MLAN_STATUS_SUCCESS; mlan_private *pmpriv = (mlan_private *) priv; wlan_uap_get_info_cb_t *puap_state_chan_cb = &pmpriv->uap_state_chan_cb; mlan_ds_11d_cfg *cfg11d; t_u8 band; pmlan_adapter pmadapter = pmpriv->adapter; pmlan_callbacks pcb = &pmadapter->callbacks; ENTER(); /* clear callback now that we're here */ puap_state_chan_cb->get_chan_callback = MNULL; if (!puap_state_chan_cb->pioctl_req_curr) { PRINTM(MERROR, "pioctl_req_curr is null\n"); LEAVE(); return ret; } cfg11d = (mlan_ds_11d_cfg *) puap_state_chan_cb->pioctl_req_curr->pbuf; band = (puap_state_chan_cb-> band_config & BAND_CONFIG_5GHZ) ? BAND_A : BAND_B; ret = wlan_11d_handle_uap_domain_info(pmpriv, band, cfg11d->param.domain_tlv, puap_state_chan_cb-> pioctl_req_curr); if (ret == MLAN_STATUS_SUCCESS) ret = MLAN_STATUS_PENDING; else { puap_state_chan_cb->pioctl_req_curr->status_code = MLAN_STATUS_FAILURE; pcb->moal_ioctl_complete(pmadapter->pmoal_handle, puap_state_chan_cb->pioctl_req_curr, MLAN_STATUS_FAILURE); } puap_state_chan_cb->pioctl_req_curr = MNULL; /* prevent re-use */ LEAVE(); return ret; }