mirror of https://gitee.com/openkylin/linux.git
iwlwifi: mvm: change RX sync notification to be an attribute and not a type
Currently the sync notification is a type of notification. However, it is better fitted as an attribute of a notification, since there might be another message in the payload (delba for instance) that should be sent while control path is waiting for all queues to process. Signed-off-by: Sara Sharon <sara.sharon@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
This commit is contained in:
parent
0636b93821
commit
d0ff5d2297
|
@ -437,24 +437,27 @@ struct iwl_rxq_sync_notification {
|
||||||
/**
|
/**
|
||||||
* Internal message identifier
|
* Internal message identifier
|
||||||
*
|
*
|
||||||
* @IWL_MVM_RXQ_SYNC: sync RSS queues
|
* @IWL_MVM_RXQ_EMPTY: empty sync notification
|
||||||
* @IWL_MVM_RXQ_NOTIF_DEL_BA: notify RSS queues of delBA
|
* @IWL_MVM_RXQ_NOTIF_DEL_BA: notify RSS queues of delBA
|
||||||
*/
|
*/
|
||||||
enum iwl_mvm_rxq_notif_type {
|
enum iwl_mvm_rxq_notif_type {
|
||||||
IWL_MVM_RXQ_SYNC,
|
IWL_MVM_RXQ_EMPTY,
|
||||||
IWL_MVM_RXQ_NOTIF_DEL_BA,
|
IWL_MVM_RXQ_NOTIF_DEL_BA,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct iwl_mvm_internal_rxq_notif - Internal representation of the data sent
|
* struct iwl_mvm_internal_rxq_notif - Internal representation of the data sent
|
||||||
* in &iwl_rxq_sync_cmd. Should be DWORD aligned.
|
* in &iwl_rxq_sync_cmd. Should be DWORD aligned.
|
||||||
|
* FW is agnostic to the payload, so there are no endianity requirements.
|
||||||
*
|
*
|
||||||
* @type: value from &iwl_mvm_rxq_notif_type
|
* @type: value from &iwl_mvm_rxq_notif_type
|
||||||
|
* @sync: ctrl path is waiting for all notifications to be received
|
||||||
* @cookie: internal cookie to identify old notifications
|
* @cookie: internal cookie to identify old notifications
|
||||||
* @data: payload
|
* @data: payload
|
||||||
*/
|
*/
|
||||||
struct iwl_mvm_internal_rxq_notif {
|
struct iwl_mvm_internal_rxq_notif {
|
||||||
u32 type;
|
u16 type;
|
||||||
|
u16 sync;
|
||||||
u32 cookie;
|
u32 cookie;
|
||||||
u8 data[];
|
u8 data[];
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
|
@ -4037,12 +4037,10 @@ static void iwl_mvm_mac_event_callback(struct ieee80211_hw *hw,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm)
|
void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm,
|
||||||
|
struct iwl_mvm_internal_rxq_notif *notif,
|
||||||
|
u32 size)
|
||||||
{
|
{
|
||||||
struct iwl_mvm_internal_rxq_notif data = {
|
|
||||||
.type = IWL_MVM_RXQ_SYNC,
|
|
||||||
.cookie = mvm->queue_sync_cookie,
|
|
||||||
};
|
|
||||||
DECLARE_WAIT_QUEUE_HEAD_ONSTACK(notif_waitq);
|
DECLARE_WAIT_QUEUE_HEAD_ONSTACK(notif_waitq);
|
||||||
u32 qmask = BIT(mvm->trans->num_rx_queues) - 1;
|
u32 qmask = BIT(mvm->trans->num_rx_queues) - 1;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -4052,16 +4050,22 @@ static void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm)
|
||||||
if (!iwl_mvm_has_new_rx_api(mvm))
|
if (!iwl_mvm_has_new_rx_api(mvm))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
atomic_set(&mvm->queue_sync_counter, mvm->trans->num_rx_queues);
|
notif->cookie = mvm->queue_sync_cookie;
|
||||||
|
|
||||||
ret = iwl_mvm_notify_rx_queue(mvm, qmask, (u8 *)&data, sizeof(data));
|
if (notif->sync)
|
||||||
|
atomic_set(&mvm->queue_sync_counter,
|
||||||
|
mvm->trans->num_rx_queues);
|
||||||
|
|
||||||
|
ret = iwl_mvm_notify_rx_queue(mvm, qmask, (u8 *)notif, size);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
IWL_ERR(mvm, "Failed to trigger RX queues sync (%d)\n", ret);
|
IWL_ERR(mvm, "Failed to trigger RX queues sync (%d)\n", ret);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
ret = wait_event_timeout(notif_waitq,
|
|
||||||
atomic_read(&mvm->queue_sync_counter) == 0,
|
if (notif->sync)
|
||||||
HZ);
|
ret = wait_event_timeout(notif_waitq,
|
||||||
|
atomic_read(&mvm->queue_sync_counter) == 0,
|
||||||
|
HZ);
|
||||||
WARN_ON_ONCE(!ret);
|
WARN_ON_ONCE(!ret);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
@ -4072,9 +4076,13 @@ static void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm)
|
||||||
static void iwl_mvm_sync_rx_queues(struct ieee80211_hw *hw)
|
static void iwl_mvm_sync_rx_queues(struct ieee80211_hw *hw)
|
||||||
{
|
{
|
||||||
struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
|
struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
|
||||||
|
struct iwl_mvm_internal_rxq_notif data = {
|
||||||
|
.type = IWL_MVM_RXQ_EMPTY,
|
||||||
|
.sync = 1,
|
||||||
|
};
|
||||||
|
|
||||||
mutex_lock(&mvm->mutex);
|
mutex_lock(&mvm->mutex);
|
||||||
iwl_mvm_sync_rx_queues_internal(mvm);
|
iwl_mvm_sync_rx_queues_internal(mvm, &data, sizeof(data));
|
||||||
mutex_unlock(&mvm->mutex);
|
mutex_unlock(&mvm->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1630,6 +1630,9 @@ void iwl_mvm_tdls_cancel_channel_switch(struct ieee80211_hw *hw,
|
||||||
void iwl_mvm_rx_tdls_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
|
void iwl_mvm_rx_tdls_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb);
|
||||||
void iwl_mvm_tdls_ch_switch_work(struct work_struct *work);
|
void iwl_mvm_tdls_ch_switch_work(struct work_struct *work);
|
||||||
|
|
||||||
|
void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm,
|
||||||
|
struct iwl_mvm_internal_rxq_notif *notif,
|
||||||
|
u32 size);
|
||||||
struct ieee80211_vif *iwl_mvm_get_bss_vif(struct iwl_mvm *mvm);
|
struct ieee80211_vif *iwl_mvm_get_bss_vif(struct iwl_mvm *mvm);
|
||||||
|
|
||||||
void iwl_mvm_nic_restart(struct iwl_mvm *mvm, bool fw_error);
|
void iwl_mvm_nic_restart(struct iwl_mvm *mvm, bool fw_error);
|
||||||
|
|
|
@ -405,16 +405,19 @@ void iwl_mvm_rx_queue_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
|
||||||
notif = (void *)pkt->data;
|
notif = (void *)pkt->data;
|
||||||
internal_notif = (void *)notif->payload;
|
internal_notif = (void *)notif->payload;
|
||||||
|
|
||||||
switch (internal_notif->type) {
|
if (internal_notif->sync) {
|
||||||
case IWL_MVM_RXQ_SYNC:
|
if (mvm->queue_sync_cookie != internal_notif->cookie) {
|
||||||
if (mvm->queue_sync_cookie == internal_notif->cookie)
|
|
||||||
atomic_dec(&mvm->queue_sync_counter);
|
|
||||||
else
|
|
||||||
WARN_ONCE(1,
|
WARN_ONCE(1,
|
||||||
"Received expired RX queue sync message\n");
|
"Received expired RX queue sync message\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
atomic_dec(&mvm->queue_sync_counter);
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (internal_notif->type) {
|
||||||
|
case IWL_MVM_RXQ_EMPTY:
|
||||||
break;
|
break;
|
||||||
case IWL_MVM_RXQ_NOTIF_DEL_BA:
|
case IWL_MVM_RXQ_NOTIF_DEL_BA:
|
||||||
/* TODO */
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
WARN_ONCE(1, "Invalid identifier %d", internal_notif->type);
|
WARN_ONCE(1, "Invalid identifier %d", internal_notif->type);
|
||||||
|
|
Loading…
Reference in New Issue