1/*
2 * Copyright (c) 2012 GCT Semiconductor, Inc. All rights reserved.
3 *
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13
14#ifndef _GDM_USB_H_
15#define _GDM_USB_H_
16
17#include <linux/types.h>
18#include <linux/usb.h>
19#include <linux/list.h>
20#include <linux/time.h>
21
22#include "gdm_endian.h"
23#include "hci_packet.h"
24
25#define PM_NORMAL 0
26#define PM_SUSPEND 1
27#define AUTO_SUSPEND_TIMER 5000 /* ms */
28
29#define RX_BUF_SIZE		(1024*32)
30#define TX_BUF_SIZE		(1024*32)
31#define SDU_BUF_SIZE	2048
32#define MAX_SDU_SIZE	(1024*30)
33#define MAX_PACKET_IN_MULTI_SDU	256
34
35#define VID_GCT			0x1076
36#define PID_GDM7240		0x8000
37#define PID_GDM7243		0x9000
38
39#define NETWORK_INTERFACE 1
40#define USB_SC_SCSI 0x06
41#define USB_PR_BULK 0x50
42
43#define MAX_NUM_SDU_BUF	64
44
45struct usb_tx {
46	struct list_head list;
47	struct urb *urb;
48	u8 *buf;
49	u32 len;
50	void (*callback)(void *cb_data);
51	void *cb_data;
52	struct tx_cxt *tx;
53	u8 is_sdu;
54};
55
56struct usb_tx_sdu {
57	struct list_head list;
58	u8 *buf;
59	u32 len;
60	void (*callback)(void *cb_data);
61	void *cb_data;
62};
63
64struct usb_rx {
65	struct list_head to_host_list;
66	struct list_head free_list;
67	struct list_head rx_submit_list;
68	struct rx_cxt	*rx;
69	struct urb *urb;
70	u8 *buf;
71	int (*callback)(void *cb_data, void *data, int len, int context);
72	void *cb_data;
73	void *index;
74};
75
76struct tx_cxt {
77	struct list_head sdu_list;
78	struct list_head hci_list;
79	struct list_head free_list;
80	u32 avail_count;
81	spinlock_t lock;
82};
83
84struct rx_cxt {
85	struct list_head to_host_list;
86	struct list_head rx_submit_list;
87	struct list_head free_list;
88	u32	avail_count;
89	spinlock_t to_host_lock;
90	spinlock_t rx_lock;
91	spinlock_t submit_lock;
92};
93
94struct lte_udev {
95	struct usb_device *usbdev;
96	struct gdm_endian gdm_ed;
97	struct tx_cxt tx;
98	struct rx_cxt rx;
99	struct delayed_work work_tx;
100	struct delayed_work work_rx;
101	u8 send_complete;
102	u8 tx_stop;
103	struct usb_interface *intf;
104	int (*rx_cb)(void *cb_data, void *data, int len, int context);
105	int usb_state;
106	u8 request_mac_addr;
107};
108
109#endif /* _GDM_USB_H_ */
110