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

#include <adf_nbuf.h>
#include <adf_os_timer.h>

#include "a_types.h"
#include "athdefs.h"
#include "a_osapi.h"
#include "hif_msg_based.h"
#include "a_usb_defs.h"
#include <ol_if_athvar.h>
#include <linux/usb.h>

#define TX_URB_COUNT    32
#define RX_URB_COUNT    32

#define HIF_USB_RX_BUFFER_SIZE  (1792 + 8)
#define HIF_USB_RX_BUNDLE_ONE_PKT_SIZE  (1792 + 8)

/* USB Endpoint definition */
typedef enum {
	HIF_TX_CTRL_PIPE = 0,
	HIF_TX_DATA_LP_PIPE,
	HIF_TX_DATA_MP_PIPE,
	HIF_TX_DATA_HP_PIPE,
	HIF_RX_CTRL_PIPE,
	HIF_RX_DATA_PIPE,
	HIF_RX_DATA2_PIPE,
	HIF_RX_INT_PIPE,
	HIF_USB_PIPE_MAX
} HIF_USB_PIPE_ID;

#define HIF_USB_PIPE_INVALID HIF_USB_PIPE_MAX

/* debug masks */
#define USB_HIF_DEBUG_CTRL_TRANS            ATH_DEBUG_MAKE_MODULE_MASK(0)
#define USB_HIF_DEBUG_BULK_IN               ATH_DEBUG_MAKE_MODULE_MASK(1)
#define USB_HIF_DEBUG_BULK_OUT              ATH_DEBUG_MAKE_MODULE_MASK(2)
#define USB_HIF_DEBUG_ENUM                  ATH_DEBUG_MAKE_MODULE_MASK(3)
#define USB_HIF_DEBUG_DUMP_DATA             ATH_DEBUG_MAKE_MODULE_MASK(4)
#define USB_HIF_SUSPEND                     ATH_DEBUG_MAKE_MODULE_MASK(5)
#define USB_HIF_ISOC_SUPPORT                ATH_DEBUG_MAKE_MODULE_MASK(6)
struct _HIF_DEVICE_USB;
struct _HIF_USB_PIPE;

/*
 * Data structure to record required sending context data
 */
struct HIFSendContext {
	A_BOOL bNewAlloc;
	HIF_DEVICE *pDev;
	adf_nbuf_t netbuf;
	unsigned int transferID;
	unsigned int head_data_len;
};

typedef struct _HIF_URB_CONTEXT {
	DL_LIST link;
	struct _HIF_USB_PIPE *pipe;
	adf_nbuf_t buf;
	struct urb *urb;
	struct HIFSendContext *pSendContext;
} HIF_URB_CONTEXT;

#define HIF_USB_PIPE_FLAG_TX    (1 << 0)

typedef struct _HIF_USB_PIPE {
	DL_LIST urb_list_head;
	DL_LIST urb_pending_list;
	A_INT32 urb_alloc;
	A_INT32 urb_cnt;
	A_INT32 urb_cnt_thresh;
	unsigned int usb_pipe_handle;
	A_UINT32 flags;
	A_UINT8 ep_address;
	A_UINT8 logical_pipe_num;
	struct _HIF_DEVICE_USB *device;
	A_UINT16 max_packet_size;
#ifdef HIF_USB_TASKLET
	struct tasklet_struct io_complete_tasklet;
#else
	struct work_struct io_complete_work;
#endif
	struct sk_buff_head io_comp_queue;
	struct usb_endpoint_descriptor *ep_desc;
	A_INT32 urb_prestart_cnt;
} HIF_USB_PIPE;

typedef struct _HIF_DEVICE_USB {
	spinlock_t cs_lock;
	spinlock_t tx_lock;
	spinlock_t rx_lock;
	spinlock_t rx_prestart_lock;
	MSG_BASED_HIF_CALLBACKS htcCallbacks;
	struct usb_device *udev;
	struct usb_interface *interface;
	HIF_USB_PIPE pipes[HIF_USB_PIPE_MAX];
	a_uint8_t surpriseRemoved;
	a_uint8_t *diag_cmd_buffer;
	a_uint8_t *diag_resp_buffer;
	void *claimed_context;
	struct hif_usb_softc *sc;
	A_BOOL is_bundle_enabled;
	A_UINT16 rx_bundle_cnt;
	A_UINT32 rx_bundle_buf_len;
} HIF_DEVICE_USB;
extern unsigned int hif_usb_disable_rxdata2;

extern A_STATUS usb_hif_submit_ctrl_in(HIF_DEVICE_USB *macp,
				       a_uint8_t req,
				       a_uint16_t value,
				       a_uint16_t index,
				       void *data, a_uint32_t size);

extern A_STATUS usb_hif_submit_ctrl_out(HIF_DEVICE_USB *macp,
					a_uint8_t req,
					a_uint16_t value,
					a_uint16_t index,
					void *data, a_uint32_t size);

extern int HIF_USBDeviceInserted(struct usb_interface *interface,
				 hif_handle_t hif_hdl);
extern void HIF_USBDeviceDetached(struct usb_interface *interface,
				  a_uint8_t surprise_removed);
#ifdef ATH_BUS_PM
extern void HIFDeviceSuspend(HIF_DEVICE *dev);
extern void HIFDeviceResume(HIF_DEVICE *dev);
#endif
extern A_STATUS usb_hif_setup_pipe_resources(HIF_DEVICE_USB *device);
extern void usb_hif_cleanup_pipe_resources(HIF_DEVICE_USB *device);
extern void usb_hif_prestart_recv_pipes(HIF_DEVICE_USB *device);
extern void usb_hif_start_recv_pipes(HIF_DEVICE_USB *device);
extern void usb_hif_flush_all(HIF_DEVICE_USB *device);
extern void usb_hif_cleanup_transmit_urb(HIF_URB_CONTEXT *urb_context);
extern void usb_hif_enqueue_pending_transfer(HIF_USB_PIPE *pipe,
					     HIF_URB_CONTEXT *urb_context);
extern void usb_hif_remove_pending_transfer(HIF_URB_CONTEXT *urb_context);
extern HIF_URB_CONTEXT *usb_hif_alloc_urb_from_pipe(HIF_USB_PIPE *pipe);
#ifdef HIF_USB_TASKLET
extern void usb_hif_io_comp_tasklet(long unsigned int context);
#else
extern void usb_hif_io_comp_work(struct work_struct *work);
#endif
/* Support for USB Suspend / Resume */
extern void usb_hif_suspend(struct usb_interface *interface);
extern void usb_hif_resume(struct usb_interface *interface);
A_STATUS HIFDiagWriteWARMRESET(struct usb_interface *interface,
			       A_UINT32 address, A_UINT32 data);

#endif
