# TX_CFM
[TX]

LMAC Tx confirmation module. More...

Collaboration diagram for TX_CFM:

## Data Structures
struct | txl_cfm_env_tag
| Context of the Tx Control block. More...
## Functions
__INLINE struct tx_cfm_tag * | txl_cfm_tag_get (struct txdesc *txdesc)
| Get the confirmation structure attached to a TX descriptor.
void | txl_cfm_init (void)
| Initializes the CFM and BA queues.
void | txl_cfm_push (struct txdesc *txdesc, uint32_t status, uint8_t access_category)
| Push a Tx descriptor in the CFM queue.
void | txl_cfm_evt (int access_category)
| Background event handler of the Tx confirmation module.
void | txl_ba_push (struct rxdesc *rxdesc)
| Push a Rx descriptor containing a BA frame in the appropriate aggregate descriptor on the right AC.
void | txl_cfm_flush_desc (uint8_t access_category, struct txdesc *txdesc, uint32_t status)
| Immediately confirm the descriptor passed as parameter.
void | txl_cfm_flush (uint8_t access_category, struct co_list *list, uint32_t status)
| Immediately confirm all the descriptors of the list passed as parameter.
## Variables
const uint32_t | txl_cfm_evt_bit [NX_TXQ_CNT]
| Table mapping the TX confirmation event bit to the queue index.
struct txl_cfm_env_tag | txl_cfm_env
| Tx Confirmation context variable.

## Detailed Description

LMAC Tx confirmation module.

## Function Documentation

void txl_ba_push | ( | struct rxdesc * | rxdesc | ) |

Push a Rx descriptor containing a BA frame in the appropriate aggregate descriptor on the right AC.

This function associates the received BA to an AGG descriptor and verifies its validity.

Parameters:

  `[in]` | rxdesc | Pointer to Rx descriptor to be pushed in the BA queue

Definition at line 304 of file txl_cfm.c.

References AGG_BA_RECEIVED, AGG_BA_VALID, txl_list::aggregates, ASSERT_REC, co_list_pop_front(), PROF_AGG_BA_RXED_CLR, PROF_AGG_BA_RXED_SET, tx_agg_desc::status, txl_ba_ac_get(), txl_cntrl_env, txl_is_ba_valid(), and txl_cntrl_env_tag::txlist.

Referenced by rxl_rxcntrl_frame().

void txl_cfm_evt | ( | int | access_category | ) |

Background event handler of the Tx confirmation module.

TX descriptors are linked in the cfmlist, ACs mixed but in order of arrival per AC. When the event is programmed, a txdesc in the cfmlist front is analyzed.

It can be the 1st MPDU in an AMPDU whose BA reception status is known, because all the MPDUs in an AMPDU are not moved from transmitting list (per AC) to cfmlist until their BA reception status is known (updated by Hw in either the AMPDU THD or BAR THD.

When it is such an MPDU, the first BA received in the ba_list queue is retrieved, and the MPDUs in the AMPDU are taken one by one from the cfm list, their sattus is updated and they are sent to host.

The BA reception status is present in either AMPDU THD or BAR THD, but it doesn't matter how it was received, but IF it was received, the bitmap is extracted for the AMPDU MPDUs in any case.

When the MPDU in the cfm list is a singleton MPDU, it already has its status so it is released towards the host immediately without further handling.

Parameters:

  `[in]` | access_category | Access Category for which confirmations need to be handled

Definition at line 333 of file txl_cfm.c.

References AGG_BA_VALID, lmacdesc::agg_desc, AGG_DONE, ASSERT_ERR, bfr_is_enabled(), bfr_tx_cfm(), txl_cfm_env_tag::cfmlist, co_list_pick(), co_list_pop_front(), FRAME_SUCCESSFUL_TX_BIT, GLOBAL_INT_DISABLE, GLOBAL_INT_RESTORE, txdesc::host, is_mpdu_first(), is_mpdu_last(), ke_evt_clear(), ke_evt_get(), txdesc::lmac, macif_tx_cfm_done(), macif_tx_cfm_push(), macif_tx_cfm_start(), PROF_TX_AC_BG_SET, PROF_TX_CFM_EVT_CLR, PROF_TX_CFM_EVT_SET, ps_check_tx_trigger_sent(), rc_cfm_ampdu(), rc_cfm_singleton(), tx_cfm_tag::status, tx_agg_desc::status, txl_agg_release(), txl_ba_extract_ack(), txl_cfm_env, txl_cfm_evt_bit, txl_cfm_tag_get(), and txu_cntrl_cfm().

void txl_cfm_flush | ( | uint8_t | access_category,
|  | struct co_list * | list,
|  | uint32_t | status |
| ) |  |  |

Immediately confirm all the descriptors of the list passed as parameter.

Parameters:

  `[in]` | access_category | Access category corresponding to the list
  `[in]` | list | Pointer to the list of descriptors to be confirmed
  `[in]` | status | Status to be sent in the confirmation

NX_FULLY_HOSTED

Definition at line 551 of file txl_cfm.c.

References A_MPDU_LAST, lmacdesc::agg_desc, bfr_is_enabled(), bfr_tx_cfm(), co_list_pop_front(), DESC_DONE_TX_BIT, is_int_frame(), txdesc::lmac, macif_tx_cfm_done(), macif_tx_cfm_push(), macif_tx_cfm_start(), tx_cfm_tag::status, txl_buffer_free_all(), txl_cfm_tag_get(), txl_frame_cfm(), txl_frame_evt(), and txu_cntrl_cfm().

void txl_cfm_flush_desc | ( | uint8_t | access_category,
|  | struct txdesc * | txdesc,
|  | uint32_t | status |
| ) |  |  |

Immediately confirm the descriptor passed as parameter.

Parameters:

  `[in]` | access_category | Access category corresponding to the list
  `[in]` | txdesc | Pointer to the descriptor of descriptors to be confirmed
  `[in]` | status | Status to be sent in the confirmation

NX_FULLY_HOSTED

Definition at line 496 of file txl_cfm.c.

References A_MPDU_LAST, lmacdesc::agg_desc, bfr_is_enabled(), bfr_tx_cfm(), DESC_DONE_TX_BIT, is_int_frame(), txdesc::lmac, macif_tx_cfm_done(), macif_tx_cfm_push(), macif_tx_cfm_start(), tx_cfm_tag::status, txl_buffer_free_all(), txl_cfm_tag_get(), txl_frame_cfm(), txl_frame_evt(), and txu_cntrl_cfm().

void txl_cfm_init | ( | void |  | ) |

Initializes the CFM and BA queues.

These queues are useful for sending confirmation to UMAC for the txdescs in order.

The CFM queue will handle the linked list of txdescs, each having a certain status after handling the TX trigger from HW (acked, waiting for BA analysis, not acked at all)

The BA queue holds the linked list of rxdescs of BA frames per AC, which will be used and freed when the TX_CFM kernel event is handled in order to update the MPDU status of those MPDUs part of AMPDUs in the confirm list.

For singleton MPDUs the BA queue is of no use, they should be confirmed according to their already set ok/not acked status.

Definition at line 276 of file txl_cfm.c.

References txl_cfm_env_tag::cfmlist, co_list_init(), NX_TXQ_CNT, and txl_cfm_env.

void txl_cfm_push | ( | struct txdesc * | txdesc,
|  | uint32_t | status,
|  | uint8_t | access_category |
| ) |  |  |

Push a Tx descriptor in the CFM queue.

Parameters:

  `[in]` | txdesc | Tx descriptor to be pushed in the CFM queue
  `[in]` | status | Status of the confirmation
  `[in]` | access_category | Access category on which the confirmation is pushed

Definition at line 287 of file txl_cfm.c.

References txl_cfm_env_tag::cfmlist, co_list_push_back(), is_mpdu_agg(), ke_evt_set(), tx_cfm_tag::status, txl_cfm_env, txl_cfm_evt_bit, and txl_cfm_tag_get().

Referenced by txl_frame_exchange_done(), and txu_cntrl_discard().

__INLINE struct tx_cfm_tag* txl_cfm_tag_get | ( | struct txdesc * | txdesc | ) | `[read]`

Get the confirmation structure attached to a TX descriptor.

Parameters:

  `[in]` | txdesc | TX descriptor pointer

Returns:
  The pointer to the confirmation structure attached to this TX descriptor

Definition at line 68 of file txl_cfm.h.

References tx_hw_desc::cfm, txdesc::host, lmacdesc::hw_desc, and txdesc::lmac.

Referenced by bam_check_tx_baw(), txl_cfm_evt(), txl_cfm_flush(), txl_cfm_flush_desc(), txl_cfm_push(), and txl_frame_exchange_done().