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