/*
 * Copyright (c) 2012, 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 __ATHDEFS_H__
#define __ATHDEFS_H__

/*
 * This file contains definitions that may be used across both
 * Host and Target software.  Nothing here is module-dependent
 * or platform-dependent.
 */

/*
 * Generic error codes that can be used by hw, sta, ap, sim, dk
 * and any other environments. Since these are enums, feel free to
 * add any more codes that you need.
 */

typedef enum {
	A_ERROR = -1,           /* Generic error return */
	A_OK = 0,               /* success */
	/* Following values start at 1 */
	A_DEVICE_NOT_FOUND,     /* not able to find PCI device */
	A_NO_MEMORY,            /* not able to allocate memory, not available */
	A_MEMORY_NOT_AVAIL,     /* memory region is not free for mapping */
	A_NO_FREE_DESC,         /* no free descriptors available */
	A_BAD_ADDRESS,          /* address does not match descriptor */
	A_WIN_DRIVER_ERROR,     /* used in NT_HW version, if problem at init */
	A_REGS_NOT_MAPPED,      /* registers not correctly mapped */
	A_EPERM,                /* Not superuser */
	A_EACCES,               /* Access denied */
	A_ENOENT,               /* No such entry, search failed, etc. */
	A_EEXIST,               /* The object already exists (can't create) */
	A_EFAULT,               /* Bad address fault */
	A_EBUSY,                /* Object is busy */
	A_EINVAL,               /* Invalid parameter */
	A_EMSGSIZE,             /* Inappropriate message buffer length */
	A_ECANCELED,            /* Operation canceled */
	A_ENOTSUP,              /* Operation not supported */
	A_ECOMM,                /* Communication error on send */
	A_EPROTO,               /* Protocol error */
	A_ENODEV,               /* No such device */
	A_EDEVNOTUP,            /* device is not UP */
	A_NO_RESOURCE,          /* No resources for requested operation */
	A_HARDWARE,             /* Hardware failure */
	A_PENDING,              /* Asynchronous routine; will send up results la
	                           ter (typically in callback) */
	A_EBADCHANNEL,          /* The channel cannot be used */
	A_DECRYPT_ERROR,        /* Decryption error */
	A_PHY_ERROR,            /* RX PHY error */
	A_CONSUMED,             /* Object was consumed */
	A_CLONE,                /* The buffer is cloned */
	A_USB_ERROR,            /* Rome USB Target error */
} A_STATUS;

#define A_SUCCESS(x)        (x == A_OK)
#define A_FAILED(x)         (!A_SUCCESS(x))

#endif /* __ATHDEFS_H__ */
