blob: cfe8613bb6825ed40ede426a79c872810994bb7c [file] [log] [blame]
/*
* 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