/* * Copyright (c) 2012 GCT Semiconductor, Inc. All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and * may be copied, distributed, and modified under those terms. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #ifndef _GDM_MUX_H_ #define _GDM_MUX_H_ #include <linux/types.h> #include <linux/usb.h> #include <linux/list.h> #include "gdm_tty.h" #define PM_NORMAL 0 #define PM_SUSPEND 1 #define USB_RT_ACM (USB_TYPE_CLASS | USB_RECIP_INTERFACE) #define START_FLAG 0xA512485A #define MUX_HEADER_SIZE 14 #define MUX_TX_MAX_SIZE (1024*10) #define MUX_RX_MAX_SIZE (1024*30) #define AT_PKT_TYPE 0xF011 #define DM_PKT_TYPE 0xF010 #define RETRY_TIMER 30 /* msec */ struct mux_pkt_header { unsigned int start_flag; unsigned int seq_num; unsigned int payload_size; unsigned short packet_type; unsigned char data[0]; }; struct mux_tx { struct urb *urb; u8 *buf; int len; void (*callback)(void *cb_data); void *cb_data; }; struct mux_rx { struct list_head free_list; struct list_head rx_submit_list; struct list_head to_host_list; struct urb *urb; u8 *buf; void *mux_dev; u32 offset; u32 len; int (*callback)(void *data, int len, int tty_index, struct tty_dev *tty_dev, int complete); }; struct rx_cxt { struct list_head to_host_list; struct list_head rx_submit_list; struct list_head rx_free_list; spinlock_t to_host_lock; spinlock_t submit_list_lock; spinlock_t free_list_lock; }; struct mux_dev { struct usb_device *usbdev; struct usb_interface *control_intf; struct usb_interface *data_intf; struct rx_cxt rx; struct delayed_work work_rx; struct usb_interface *intf; int usb_state; int (*rx_cb)(void *data, int len, int tty_index, struct tty_dev *tty_dev, int complete); spinlock_t write_lock; struct tty_dev *tty_dev; }; #endif /* _GDM_MUX_H_ */