162306a36Sopenharmony_ci/* SPDX-License-Identifier: ISC */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (c) 2004-2011 Atheros Communications Inc.
462306a36Sopenharmony_ci * Copyright (c) 2011-2012 Qualcomm Atheros, Inc.
562306a36Sopenharmony_ci * Copyright (c) 2016-2017 Erik Stromdahl <erik.stromdahl@gmail.com>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#ifndef _USB_H_
962306a36Sopenharmony_ci#define _USB_H_
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci/* constants */
1262306a36Sopenharmony_ci#define TX_URB_COUNT               32
1362306a36Sopenharmony_ci#define RX_URB_COUNT               32
1462306a36Sopenharmony_ci#define ATH10K_USB_RX_BUFFER_SIZE  4096
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#define ATH10K_USB_PIPE_INVALID ATH10K_USB_PIPE_MAX
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci/* USB endpoint definitions */
1962306a36Sopenharmony_ci#define ATH10K_USB_EP_ADDR_APP_CTRL_IN          0x81
2062306a36Sopenharmony_ci#define ATH10K_USB_EP_ADDR_APP_DATA_IN          0x82
2162306a36Sopenharmony_ci#define ATH10K_USB_EP_ADDR_APP_DATA2_IN         0x83
2262306a36Sopenharmony_ci#define ATH10K_USB_EP_ADDR_APP_INT_IN           0x84
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define ATH10K_USB_EP_ADDR_APP_CTRL_OUT         0x01
2562306a36Sopenharmony_ci#define ATH10K_USB_EP_ADDR_APP_DATA_LP_OUT      0x02
2662306a36Sopenharmony_ci#define ATH10K_USB_EP_ADDR_APP_DATA_MP_OUT      0x03
2762306a36Sopenharmony_ci#define ATH10K_USB_EP_ADDR_APP_DATA_HP_OUT      0x04
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci/* diagnostic command definitions */
3062306a36Sopenharmony_ci#define ATH10K_USB_CONTROL_REQ_SEND_BMI_CMD        1
3162306a36Sopenharmony_ci#define ATH10K_USB_CONTROL_REQ_RECV_BMI_RESP       2
3262306a36Sopenharmony_ci#define ATH10K_USB_CONTROL_REQ_DIAG_CMD            3
3362306a36Sopenharmony_ci#define ATH10K_USB_CONTROL_REQ_DIAG_RESP           4
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#define ATH10K_USB_CTRL_DIAG_CC_READ               0
3662306a36Sopenharmony_ci#define ATH10K_USB_CTRL_DIAG_CC_WRITE              1
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci#define ATH10K_USB_IS_BULK_EP(attr) (((attr) & 3) == 0x02)
3962306a36Sopenharmony_ci#define ATH10K_USB_IS_INT_EP(attr)  (((attr) & 3) == 0x03)
4062306a36Sopenharmony_ci#define ATH10K_USB_IS_ISOC_EP(attr) (((attr) & 3) == 0x01)
4162306a36Sopenharmony_ci#define ATH10K_USB_IS_DIR_IN(addr)  ((addr) & 0x80)
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cistruct ath10k_usb_ctrl_diag_cmd_write {
4462306a36Sopenharmony_ci	__le32 cmd;
4562306a36Sopenharmony_ci	__le32 address;
4662306a36Sopenharmony_ci	__le32 value;
4762306a36Sopenharmony_ci	__le32 padding;
4862306a36Sopenharmony_ci} __packed;
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_cistruct ath10k_usb_ctrl_diag_cmd_read {
5162306a36Sopenharmony_ci	__le32 cmd;
5262306a36Sopenharmony_ci	__le32 address;
5362306a36Sopenharmony_ci} __packed;
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_cistruct ath10k_usb_ctrl_diag_resp_read {
5662306a36Sopenharmony_ci	u8 value[4];
5762306a36Sopenharmony_ci} __packed;
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci/* tx/rx pipes for usb */
6062306a36Sopenharmony_cienum ath10k_usb_pipe_id {
6162306a36Sopenharmony_ci	ATH10K_USB_PIPE_TX_CTRL = 0,
6262306a36Sopenharmony_ci	ATH10K_USB_PIPE_TX_DATA_LP,
6362306a36Sopenharmony_ci	ATH10K_USB_PIPE_TX_DATA_MP,
6462306a36Sopenharmony_ci	ATH10K_USB_PIPE_TX_DATA_HP,
6562306a36Sopenharmony_ci	ATH10K_USB_PIPE_RX_CTRL,
6662306a36Sopenharmony_ci	ATH10K_USB_PIPE_RX_DATA,
6762306a36Sopenharmony_ci	ATH10K_USB_PIPE_RX_DATA2,
6862306a36Sopenharmony_ci	ATH10K_USB_PIPE_RX_INT,
6962306a36Sopenharmony_ci	ATH10K_USB_PIPE_MAX
7062306a36Sopenharmony_ci};
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_cistruct ath10k_usb_pipe {
7362306a36Sopenharmony_ci	struct list_head urb_list_head;
7462306a36Sopenharmony_ci	struct usb_anchor urb_submitted;
7562306a36Sopenharmony_ci	u32 urb_alloc;
7662306a36Sopenharmony_ci	u32 urb_cnt;
7762306a36Sopenharmony_ci	u32 urb_cnt_thresh;
7862306a36Sopenharmony_ci	unsigned int usb_pipe_handle;
7962306a36Sopenharmony_ci	u32 flags;
8062306a36Sopenharmony_ci	u8 ep_address;
8162306a36Sopenharmony_ci	u8 logical_pipe_num;
8262306a36Sopenharmony_ci	struct ath10k_usb *ar_usb;
8362306a36Sopenharmony_ci	u16 max_packet_size;
8462306a36Sopenharmony_ci	struct work_struct io_complete_work;
8562306a36Sopenharmony_ci	struct sk_buff_head io_comp_queue;
8662306a36Sopenharmony_ci	struct usb_endpoint_descriptor *ep_desc;
8762306a36Sopenharmony_ci};
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci#define ATH10K_USB_PIPE_FLAG_TX BIT(0)
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci/* usb device object */
9262306a36Sopenharmony_cistruct ath10k_usb {
9362306a36Sopenharmony_ci	/* protects pipe->urb_list_head and  pipe->urb_cnt */
9462306a36Sopenharmony_ci	spinlock_t cs_lock;
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci	struct usb_device *udev;
9762306a36Sopenharmony_ci	struct usb_interface *interface;
9862306a36Sopenharmony_ci	struct ath10k_usb_pipe pipes[ATH10K_USB_PIPE_MAX];
9962306a36Sopenharmony_ci	u8 *diag_cmd_buffer;
10062306a36Sopenharmony_ci	u8 *diag_resp_buffer;
10162306a36Sopenharmony_ci	struct ath10k *ar;
10262306a36Sopenharmony_ci};
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci/* usb urb object */
10562306a36Sopenharmony_cistruct ath10k_urb_context {
10662306a36Sopenharmony_ci	struct list_head link;
10762306a36Sopenharmony_ci	struct ath10k_usb_pipe *pipe;
10862306a36Sopenharmony_ci	struct sk_buff *skb;
10962306a36Sopenharmony_ci	struct ath10k *ar;
11062306a36Sopenharmony_ci};
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_cistatic inline struct ath10k_usb *ath10k_usb_priv(struct ath10k *ar)
11362306a36Sopenharmony_ci{
11462306a36Sopenharmony_ci	return (struct ath10k_usb *)ar->drv_priv;
11562306a36Sopenharmony_ci}
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci#endif
118