blob: 74090a225e1aa3725e3f5f31a300001cc64e12ed [file] [log] [blame]
/*
* Copyright (c) 2011-2015 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
* above copyright notice and this permission notice appear in all
* copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
* WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
/*
* This file was originally distributed by Qualcomm Atheros, Inc.
* under proprietary terms before Copyright ownership was assigned
* to the Linux Foundation.
*/
#ifndef _OL_RX_REORDER__H_
#define _OL_RX_REORDER__H_
#include <adf_nbuf.h> /* adf_nbuf_t, etc. */
#include <ol_txrx_api.h> /* ol_txrx_peer_t, etc. */
#include <ol_txrx_types.h> /* ol_rx_reorder_t */
void
ol_rx_reorder_store(
struct ol_txrx_pdev_t *pdev,
struct ol_txrx_peer_t *peer,
unsigned tid,
unsigned reorder_array_index,
adf_nbuf_t head_msdu,
adf_nbuf_t tail_msdu);
void
ol_rx_reorder_release(
struct ol_txrx_vdev_t *vdev,
struct ol_txrx_peer_t *peer,
unsigned tid,
unsigned seq_num_start,
unsigned seq_num_end);
void
ol_rx_reorder_flush(
struct ol_txrx_vdev_t *vdev,
struct ol_txrx_peer_t *peer,
unsigned tid,
unsigned seq_num_start,
unsigned seq_num_end,
enum htt_rx_flush_action action);
void ol_rx_reorder_update_history(struct ol_txrx_peer_t *peer,
uint8_t msg_type, uint8_t tid, uint8_t start_seq,
uint8_t end_seq, uint8_t reorder_idx);
/**
* @brief - find end of first range of present MPDUs after the initial rx hole
* @param[in] peer - which sender's data is being checked
* @param[in] tid - which type of data is being checked
* @param[out] idx_end - the reorder array index holding the last MPDU in the
* range of in-order MPDUs that following the initial hole.
* Note that this is the index of the last in-order MPDU following the
* first hole, rather than the starting index of the second hole.
*/
void
ol_rx_reorder_first_hole(
struct ol_txrx_peer_t *peer,
unsigned tid,
unsigned *idx_end);
void
ol_rx_reorder_peer_cleanup(
struct ol_txrx_vdev_t *vdev, struct ol_txrx_peer_t *peer);
void
ol_rx_reorder_init(struct ol_rx_reorder_t *rx_reorder, u_int8_t tid);
enum htt_rx_status
ol_rx_seq_num_check(
struct ol_txrx_pdev_t *pdev,
struct ol_txrx_peer_t *peer,
uint8_t tid,
void *rx_mpdu_desc);
/*
* Peregrine and Rome: do sequence number checking in the host
* for peer-TIDs without aggregation enabled
*/
#define OL_RX_SEQ_NUM_CHECK(pdev, peer, tid, rx_mpdu_desc) \
(pdev->rx.flags.dup_check && peer->tids_rx_reorder[tid].win_sz_mask == 0) ? \
ol_rx_seq_num_check( \
pdev, peer, tid, \
rx_mpdu_desc) : \
htt_rx_status_ok
#endif /* _OL_RX_REORDER__H_ */