// SPDX-License-Identifier: GPL-2.0-only /* * NXP Wireless LAN device driver: 802.11n RX Re-ordering * * Copyright 2011-2020 NXP */ #include "decl.h" #include "ioctl.h" #include "util.h" #include "fw.h" #include "main.h" #include "wmm.h" #include "11n.h" #include "11n_rxreorder.h" /* This function will dispatch amsdu packet and forward it to kernel/upper * layer. */ static int mwifiex_11n_dispatch_amsdu_pkt(struct mwifiex_private *priv, struct sk_buff *skb) { … } /* This function will process the rx packet and forward it to kernel/upper * layer. */ static int mwifiex_11n_dispatch_pkt(struct mwifiex_private *priv, struct sk_buff *payload) { … } /* * This function dispatches all packets in the Rx reorder table until the * start window. * * There could be holes in the buffer, which are skipped by the function. * Since the buffer is linear, the function uses rotation to simulate * circular buffer. */ static void mwifiex_11n_dispatch_pkt_until_start_win(struct mwifiex_private *priv, struct mwifiex_rx_reorder_tbl *tbl, int start_win) { … } /* * This function dispatches all packets in the Rx reorder table until * a hole is found. * * The start window is adjusted automatically when a hole is located. * Since the buffer is linear, the function uses rotation to simulate * circular buffer. */ static void mwifiex_11n_scan_and_dispatch(struct mwifiex_private *priv, struct mwifiex_rx_reorder_tbl *tbl) { … } /* * This function deletes the Rx reorder table and frees the memory. * * The function stops the associated timer and dispatches all the * pending packets in the Rx reorder table before deletion. */ static void mwifiex_del_rx_reorder_entry(struct mwifiex_private *priv, struct mwifiex_rx_reorder_tbl *tbl) { … } /* * This function returns the pointer to an entry in Rx reordering * table which matches the given TA/TID pair. */ struct mwifiex_rx_reorder_tbl * mwifiex_11n_get_rx_reorder_tbl(struct mwifiex_private *priv, int tid, u8 *ta) { … } /* This function retrieves the pointer to an entry in Rx reordering * table which matches the given TA and deletes it. */ void mwifiex_11n_del_rx_reorder_tbl_by_ta(struct mwifiex_private *priv, u8 *ta) { … } /* * This function finds the last sequence number used in the packets * buffered in Rx reordering table. */ static int mwifiex_11n_find_last_seq_num(struct reorder_tmr_cnxt *ctx) { … } /* * This function flushes all the packets in Rx reordering table. * * The function checks if any packets are currently buffered in the * table or not. In case there are packets available, it dispatches * them and then dumps the Rx reordering table. */ static void mwifiex_flush_data(struct timer_list *t) { … } /* * This function creates an entry in Rx reordering table for the * given TA/TID. * * The function also initializes the entry with sequence number, window * size as well as initializes the timer. * * If the received TA/TID pair is already present, all the packets are * dispatched and the window size is moved until the SSN. */ static void mwifiex_11n_create_rx_reorder_tbl(struct mwifiex_private *priv, u8 *ta, int tid, int win_size, int seq_num) { … } static void mwifiex_11n_rxreorder_timer_restart(struct mwifiex_rx_reorder_tbl *tbl) { … } /* * This function prepares command for adding a BA request. * * Preparation includes - * - Setting command ID and proper size * - Setting add BA request buffer * - Ensuring correct endian-ness */ int mwifiex_cmd_11n_addba_req(struct host_cmd_ds_command *cmd, void *data_buf) { … } /* * This function prepares command for adding a BA response. * * Preparation includes - * - Setting command ID and proper size * - Setting add BA response buffer * - Ensuring correct endian-ness */ int mwifiex_cmd_11n_addba_rsp_gen(struct mwifiex_private *priv, struct host_cmd_ds_command *cmd, struct host_cmd_ds_11n_addba_req *cmd_addba_req) { … } /* * This function prepares command for deleting a BA request. * * Preparation includes - * - Setting command ID and proper size * - Setting del BA request buffer * - Ensuring correct endian-ness */ int mwifiex_cmd_11n_delba(struct host_cmd_ds_command *cmd, void *data_buf) { … } /* * This function identifies if Rx reordering is needed for a received packet. * * In case reordering is required, the function will do the reordering * before sending it to kernel. * * The Rx reorder table is checked first with the received TID/TA pair. If * not found, the received packet is dispatched immediately. But if found, * the packet is reordered and all the packets in the updated Rx reordering * table is dispatched until a hole is found. * * For sequence number less than the starting window, the packet is dropped. */ int mwifiex_11n_rx_reorder_pkt(struct mwifiex_private *priv, u16 seq_num, u16 tid, u8 *ta, u8 pkt_type, void *payload) { … } /* * This function deletes an entry for a given TID/TA pair. * * The TID/TA are taken from del BA event body. */ void mwifiex_del_ba_tbl(struct mwifiex_private *priv, int tid, u8 *peer_mac, u8 type, int initiator) { … } /* * This function handles the command response of an add BA response. * * Handling includes changing the header fields into CPU format and * creating the stream, provided the add BA is accepted. */ int mwifiex_ret_11n_addba_resp(struct mwifiex_private *priv, struct host_cmd_ds_command *resp) { … } /* * This function handles BA stream timeout event by preparing and sending * a command to the firmware. */ void mwifiex_11n_ba_stream_timeout(struct mwifiex_private *priv, struct host_cmd_ds_11n_batimeout *event) { … } /* * This function cleans up the Rx reorder table by deleting all the entries * and re-initializing. */ void mwifiex_11n_cleanup_reorder_tbl(struct mwifiex_private *priv) { … } /* * This function updates all rx_reorder_tbl's flags. */ void mwifiex_update_rxreor_flags(struct mwifiex_adapter *adapter, u8 flags) { … } /* This function update all the rx_win_size based on coex flag */ static void mwifiex_update_ampdu_rxwinsize(struct mwifiex_adapter *adapter, bool coex_flag) { … } /* This function check coex for RX BA */ void mwifiex_coex_ampdu_rxwinsize(struct mwifiex_adapter *adapter) { … } /* This function handles rxba_sync event */ void mwifiex_11n_rxba_sync_event(struct mwifiex_private *priv, u8 *event_buf, u16 len) { … }