/*
 * Copyright (c) 2013-2014 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 _WDI_EVENT_H_
#define _WDI_EVENT_H_

#include "athdefs.h"
#include "cdf_nbuf.h"
#define WDI_EVENT_BASE 0x100    /* Event starting number */

enum WDI_EVENT {
	WDI_EVENT_TX_STATUS = WDI_EVENT_BASE,
	WDI_EVENT_RX_DESC,
	WDI_EVENT_RX_DESC_REMOTE,
	WDI_EVENT_RATE_FIND,
	WDI_EVENT_RATE_UPDATE,
	WDI_EVENT_RX_PEER_INVALID,
	/* End of new event items */

	WDI_EVENT_LAST
};

struct wdi_event_rx_peer_invalid_msg {
	cdf_nbuf_t msdu;
	struct ieee80211_frame *wh;
	uint8_t vdev_id;
};

#define WDI_NUM_EVENTS  (WDI_EVENT_LAST - WDI_EVENT_BASE)

#define WDI_EVENT_NOTIFY_BASE   0x200
enum WDI_EVENT_NOTIFY {
	WDI_EVENT_SUB_DEALLOCATE = WDI_EVENT_NOTIFY_BASE,
	/* End of new notification types */

	WDI_EVENT_NOTIFY_LAST
};

/* Opaque event callback */
typedef void (*wdi_event_cb)(void *pdev, enum WDI_EVENT event, void *data);

/* Opaque event notify */
typedef void (*wdi_event_notify)(enum WDI_EVENT_NOTIFY notify,
				 enum WDI_EVENT event);

/**
 * @typedef wdi_event_subscribe
 * @brief Used by consumers to subscribe to WDI event notifications.
 * @details
 *  The event_subscribe struct includes pointers to other event_subscribe
 *  objects.  These pointers are simply to simplify the management of
 *  lists of event subscribers.  These pointers are set during the
 *  event_sub() function, and shall not be modified except by the
 *  WDI event management SW, until after the object's event subscription
 *  is canceled by calling event_unsub().
 */

typedef struct wdi_event_subscribe_t {
	wdi_event_cb callback;  /* subscriber event callback structure head */
	void *context;          /* subscriber object that processes the event callback */
	struct {
		/* private - the event subscriber SW shall not use this struct */
		struct wdi_event_subscribe_t *next;
		struct wdi_event_subscribe_t *prev;
	} priv;
} wdi_event_subscribe;

#endif
