/*
* Copyright (c) 2014 Jan Kolarik
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* - The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/** @file wmi.h
*
* Definitions of the Atheros WMI protocol specified in the
* Wireless Module Interface (WMI).
*
*/
#ifndef ATHEROS_WMI_H
#define ATHEROS_WMI_H
#include "htc.h"
/* Macros for creating service identificators. */
#define WMI_SERVICE_GROUP 1
#define CREATE_SERVICE_ID(group, i) \
(unsigned int) (((unsigned int) group << 8) | (unsigned int) (i))
#define WMI_MGMT_CMD_MASK 0x1000
/** WMI header structure.
*
*/
typedef struct {
uint16_t command_id; /**< Big Endian value! */
uint16_t sequence_number; /**< Big Endian value! */
} __attribute__((packed)) wmi_command_header_t;
/** WMI services IDs
*
*/
typedef enum {
WMI_CONTROL_SERVICE = CREATE_SERVICE_ID(WMI_SERVICE_GROUP, 0),
WMI_BEACON_SERVICE = CREATE_SERVICE_ID(WMI_SERVICE_GROUP, 1),
WMI_CAB_SERVICE = CREATE_SERVICE_ID(WMI_SERVICE_GROUP, 2),
WMI_UAPSD_SERVICE = CREATE_SERVICE_ID(WMI_SERVICE_GROUP, 3),
WMI_MGMT_SERVICE = CREATE_SERVICE_ID(WMI_SERVICE_GROUP, 4),
WMI_DATA_VOICE_SERVICE = CREATE_SERVICE_ID(WMI_SERVICE_GROUP, 5),
WMI_DATA_VIDEO_SERVICE = CREATE_SERVICE_ID(WMI_SERVICE_GROUP, 6),
WMI_DATA_BE_SERVICE = CREATE_SERVICE_ID(WMI_SERVICE_GROUP, 7),
WMI_DATA_BK_SERVICE = CREATE_SERVICE_ID(WMI_SERVICE_GROUP, 8)
} wmi_services_t;
/** List of WMI commands
*
*/
typedef enum {
WMI_ECHO = 0x0001,
WMI_ACCESS_MEMORY,
/* Commands used for HOST -> DEVICE communication */
WMI_GET_FW_VERSION,
WMI_DISABLE_INTR,
WMI_ENABLE_INTR,
WMI_ATH_INIT,
WMI_ABORT_TXQ,
WMI_STOP_TX_DMA,
WMI_ABORT_TX_DMA,
WMI_DRAIN_TXQ,
WMI_DRAIN_TXQ_ALL,
WMI_START_RECV,
WMI_STOP_RECV,
WMI_FLUSH_RECV,
WMI_SET_MODE,
WMI_NODE_CREATE,
WMI_NODE_REMOVE,
WMI_VAP_REMOVE,
WMI_VAP_CREATE,
WMI_REG_READ,
WMI_REG_WRITE,
WMI_RC_STATE_CHANGE,
WMI_RC_RATE_UPDATE,
WMI_TARGET_IC_UPDATE,
WMI_TX_AGGR_ENABLE,
WMI_TGT_DETACH,
WMI_NODE_UPDATE,
WMI_INT_STATS,
WMI_TX_STATS,
WMI_RX_STATS,
WMI_BITRATE_MASK
} wmi_command_t;
/**Structure used when sending registry buffer
*
*/
typedef struct {
uint32_t offset; /**< Big Endian value! */
uint32_t value; /**< Big Endian value! */
} wmi_reg_t;
extern errno_t wmi_reg_read(htc_device_t *, uint32_t, uint32_t *);
extern errno_t wmi_reg_write(htc_device_t *, uint32_t, uint32_t);
extern errno_t wmi_reg_set_clear_bit(htc_device_t *, uint32_t, uint32_t, uint32_t);
extern errno_t wmi_reg_set_bit(htc_device_t *, uint32_t, uint32_t);
extern errno_t wmi_reg_clear_bit(htc_device_t *, uint32_t, uint32_t);
extern errno_t wmi_reg_buffer_write(htc_device_t *, wmi_reg_t *, size_t);
extern errno_t wmi_send_command(htc_device_t *, wmi_command_t, uint8_t *, uint32_t,
void *);
#endif /* ATHEROS_WMI_H */