blob: acb7d6474237ea7201a2f18c86f83c74b50242c8 [file] [log] [blame]
/*
* Copyright (c) 2011 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.
*/
/**
* @file ol_txrx_peer_find.h
* @brief Define the API for the rx peer lookup datapath module.
*/
#ifndef _OL_TXRX_PEER_FIND__H_
#define _OL_TXRX_PEER_FIND__H_
#include <htt.h> /* HTT_INVALID_PEER */
#include <ol_txrx_types.h> /* ol_txrx_pdev_t, etc. */
#include <ol_txrx_internal.h> /* TXRX_ASSERT */
int ol_txrx_peer_find_attach(struct ol_txrx_pdev_t *pdev);
void ol_txrx_peer_find_detach(struct ol_txrx_pdev_t *pdev);
static inline
int
ol_txrx_peer_find_mac_addr_cmp(
union ol_txrx_align_mac_addr_t *mac_addr1,
union ol_txrx_align_mac_addr_t *mac_addr2)
{
return
!((mac_addr1->align4.bytes_abcd == mac_addr2->align4.bytes_abcd)
/*
* Intentionally use & rather than &&.
* because the operands are binary rather than generic boolean,
* the functionality is equivalent.
* Using && has the advantage of short-circuited evaluation,
* but using & has the advantage of no conditional branching,
* which is a more significant benefit.
*/
&
(mac_addr1->align4.bytes_ef == mac_addr2->align4.bytes_ef));
}
static inline
struct ol_txrx_peer_t *
ol_txrx_peer_find_by_id(
struct ol_txrx_pdev_t *pdev,
u_int16_t peer_id)
{
struct ol_txrx_peer_t *peer;
peer = (peer_id > ol_cfg_max_peer_id(pdev->ctrl_pdev)) ? NULL :
pdev->peer_id_to_obj_map[peer_id];
/*
* Currently, peer IDs are assigned to vdevs as well as peers.
* If the peer ID is for a vdev, the peer_id_to_obj_map entry
* will hold NULL rather than a valid peer pointer.
*/
//TXRX_ASSERT2(peer != NULL);
/*
* Only return the peer object if it is valid,
* i.e. it has not already been detached.
* If it has already been detached, then returning the
* peer object could result in unpausing the peer's tx queues
* in HL systems, which is an invalid operation following peer_detach.
*/
if (peer && peer->valid) {
return peer;
}
return NULL;
}
void
ol_txrx_peer_find_hash_add(
struct ol_txrx_pdev_t *pdev,
struct ol_txrx_peer_t *peer);
struct ol_txrx_peer_t *
ol_txrx_peer_find_hash_find(
struct ol_txrx_pdev_t *pdev,
u_int8_t *peer_mac_addr,
int mac_addr_is_aligned,
u_int8_t check_valid);
struct
ol_txrx_peer_t *
ol_txrx_peer_vdev_find_hash(
struct ol_txrx_pdev_t *pdev,
struct ol_txrx_vdev_t *vdev,
u_int8_t *peer_mac_addr,
int mac_addr_is_aligned,
u_int8_t check_valid);
void
ol_txrx_peer_find_hash_remove(
struct ol_txrx_pdev_t *pdev,
struct ol_txrx_peer_t *peer);
void
ol_txrx_peer_find_hash_erase(
struct ol_txrx_pdev_t *pdev);
struct ol_txrx_peer_t *
ol_txrx_assoc_peer_find(struct ol_txrx_vdev_t *vdev);
#if defined(TXRX_DEBUG_LEVEL) && TXRX_DEBUG_LEVEL > 5
void ol_txrx_peer_find_display(ol_txrx_pdev_handle pdev, int indent);
#else
#define ol_txrx_peer_find_display(pdev, indent)
#endif /* TXRX_DEBUG_LEVEL */
#endif /* _OL_TXRX_PEER_FIND__H_ */