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_MUX_H_
15#define _GDM_MUX_H_
16
17#include <linux/types.h>
18#include <linux/usb.h>
19#include <linux/list.h>
20
21#include "gdm_tty.h"
22
23#define PM_NORMAL 0
24#define PM_SUSPEND 1
25
26#define USB_RT_ACM          (USB_TYPE_CLASS | USB_RECIP_INTERFACE)
27
28#define START_FLAG 0xA512485A
29#define MUX_HEADER_SIZE 14
30#define MUX_TX_MAX_SIZE (1024*10)
31#define MUX_RX_MAX_SIZE (1024*30)
32#define AT_PKT_TYPE 0xF011
33#define DM_PKT_TYPE 0xF010
34
35#define RETRY_TIMER 30 /* msec */
36
37struct mux_pkt_header {
38	__le32 start_flag;
39	__le32 seq_num;
40	__le32 payload_size;
41	__le16 packet_type;
42	unsigned char data[0];
43};
44
45struct mux_tx {
46	struct urb *urb;
47	u8 *buf;
48	int  len;
49	void (*callback)(void *cb_data);
50	void *cb_data;
51};
52
53struct mux_rx {
54	struct list_head free_list;
55	struct list_head rx_submit_list;
56	struct list_head to_host_list;
57	struct urb *urb;
58	u8 *buf;
59	void *mux_dev;
60	u32 offset;
61	u32 len;
62	int (*callback)(void *data,
63			int len,
64			int tty_index,
65			struct tty_dev *tty_dev,
66			int complete);
67};
68
69struct rx_cxt {
70	struct list_head to_host_list;
71	struct list_head rx_submit_list;
72	struct list_head rx_free_list;
73	spinlock_t to_host_lock;
74	spinlock_t submit_list_lock;
75	spinlock_t free_list_lock;
76};
77
78struct mux_dev {
79	struct usb_device *usbdev;
80	struct usb_interface *control_intf;
81	struct usb_interface *data_intf;
82	struct rx_cxt	rx;
83	struct delayed_work work_rx;
84	struct usb_interface *intf;
85	int usb_state;
86	int (*rx_cb)(void *data,
87		     int len,
88		     int tty_index,
89		     struct tty_dev *tty_dev,
90		     int complete);
91	spinlock_t write_lock;
92	struct tty_dev *tty_dev;
93};
94
95#endif /* _GDM_MUX_H_ */
96