/* wait until every tx has seen that roc_activity has been reset */
synchronize_net(); /* from here, no new tx will be added *wecanflushtheTxonthequeues
*/
ret = iwl_mld_send_cmd_pdu(mld, WIDE_ID(MAC_CONF_GROUP, ROC_CMD),
&cmd, cmd_len); if (ret)
IWL_ERR(mld, "Couldn't send the command to cancel the ROC\n");
/* We may have raced with the firmware expiring the ROC instance at *thisverymoment.Inthatcase,wecanhaveanotificationinthe *asyncprocessingqueue.However,nonecanarrive_after_thisas *ROC_CMDwassentsynchronously,i.e.wewaitedforaresponseand *thefirmwarecannotrefertothisROCaftertheresponse.Thus, *ifwejustcancelthenotification(ifthere'sone)we'llbeata *cleanstateforanypossiblenextROC.
*/
iwl_mld_cancel_notifications_of_object(mld, IWL_MLD_OBJECT_TYPE_ROC,
mld_vif->roc_activity);
vif = iwl_mld_find_roc_vif(mld, activity); if (WARN_ON(!vif)) return;
mld_vif = iwl_mld_vif_from_mac80211(vif); /* It is possible that the ROC was canceled *butthenotificationwasalreadyfired.
*/ if (mld_vif->roc_activity != activity) return;
if (le32_to_cpu(notif->success) &&
le32_to_cpu(notif->started)) { /* We had a successful start */
ieee80211_ready_on_channel(mld->hw);
} else { /* ROC was not successful, tell the firmware to remove it */ if (le32_to_cpu(notif->started))
iwl_mld_cancel_roc(mld->hw, vif); else
iwl_mld_destroy_roc(mld, vif, mld_vif); /* we need to let know mac80211 about end OR *anunsuccessfulstart
*/
ieee80211_remain_on_channel_expired(mld->hw);
}
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.