xref: /OK3568_Linux_fs/kernel/drivers/net/usb/GobiNet/Structs.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*===========================================================================
2*4882a593Smuzhiyun FILE:
3*4882a593Smuzhiyun    Structs.h
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun DESCRIPTION:
6*4882a593Smuzhiyun    Declaration of structures used by the Qualcomm Linux USB Network driver
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun FUNCTIONS:
9*4882a593Smuzhiyun    none
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun Copyright (c) 2011, Code Aurora Forum. All rights reserved.
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun Redistribution and use in source and binary forms, with or without
14*4882a593Smuzhiyun modification, are permitted provided that the following conditions are met:
15*4882a593Smuzhiyun     * Redistributions of source code must retain the above copyright
16*4882a593Smuzhiyun       notice, this list of conditions and the following disclaimer.
17*4882a593Smuzhiyun     * Redistributions in binary form must reproduce the above copyright
18*4882a593Smuzhiyun       notice, this list of conditions and the following disclaimer in the
19*4882a593Smuzhiyun       documentation and/or other materials provided with the distribution.
20*4882a593Smuzhiyun     * Neither the name of Code Aurora Forum nor
21*4882a593Smuzhiyun       the names of its contributors may be used to endorse or promote
22*4882a593Smuzhiyun       products derived from this software without specific prior written
23*4882a593Smuzhiyun       permission.
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27*4882a593Smuzhiyun AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28*4882a593Smuzhiyun IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29*4882a593Smuzhiyun ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
30*4882a593Smuzhiyun LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31*4882a593Smuzhiyun CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32*4882a593Smuzhiyun SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33*4882a593Smuzhiyun INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34*4882a593Smuzhiyun CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35*4882a593Smuzhiyun ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36*4882a593Smuzhiyun POSSIBILITY OF SUCH DAMAGE.
37*4882a593Smuzhiyun ===========================================================================*/
38*4882a593Smuzhiyun 
39*4882a593Smuzhiyun //---------------------------------------------------------------------------
40*4882a593Smuzhiyun // Pragmas
41*4882a593Smuzhiyun //---------------------------------------------------------------------------
42*4882a593Smuzhiyun #pragma once
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun //---------------------------------------------------------------------------
45*4882a593Smuzhiyun // Include Files
46*4882a593Smuzhiyun //---------------------------------------------------------------------------
47*4882a593Smuzhiyun #include <linux/etherdevice.h>
48*4882a593Smuzhiyun #include <linux/ethtool.h>
49*4882a593Smuzhiyun #include <linux/mii.h>
50*4882a593Smuzhiyun #include <linux/usb.h>
51*4882a593Smuzhiyun #include <linux/version.h>
52*4882a593Smuzhiyun #include <linux/cdev.h>
53*4882a593Smuzhiyun #include <linux/kthread.h>
54*4882a593Smuzhiyun #include <linux/poll.h>
55*4882a593Smuzhiyun #include <linux/completion.h>
56*4882a593Smuzhiyun #include <linux/hrtimer.h>
57*4882a593Smuzhiyun #include <linux/interrupt.h>
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun #define QUECTEL_WWAN_QMAP 4 //MAX is 7
60*4882a593Smuzhiyun #ifdef QUECTEL_WWAN_QMAP
61*4882a593Smuzhiyun #define QUECTEL_QMAP_MUX_ID 0x81
62*4882a593Smuzhiyun #endif
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun //#define QUECTEL_QMI_MERGE
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun #if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
67*4882a593Smuzhiyun #define QUECTEL_BRIDGE_MODE
68*4882a593Smuzhiyun #endif
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun #if (LINUX_VERSION_CODE <= KERNEL_VERSION( 2,6,21 ))
skb_reset_mac_header(struct sk_buff * skb)71*4882a593Smuzhiyun static inline void skb_reset_mac_header(struct sk_buff *skb)
72*4882a593Smuzhiyun {
73*4882a593Smuzhiyun     skb->mac.raw = skb->data;
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun #endif
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun #if (LINUX_VERSION_CODE <= KERNEL_VERSION( 2,6,22 ))
78*4882a593Smuzhiyun #define bool      u8
79*4882a593Smuzhiyun #ifndef URB_FREE_BUFFER
80*4882a593Smuzhiyun #define URB_FREE_BUFFER_BY_SELF //usb_free_urb will not free, should free by self
81*4882a593Smuzhiyun #define URB_FREE_BUFFER		0x0100	/* Free transfer buffer with the URB */
82*4882a593Smuzhiyun #endif
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun /**
85*4882a593Smuzhiyun  * usb_endpoint_type - get the endpoint's transfer type
86*4882a593Smuzhiyun  * @epd: endpoint to be checked
87*4882a593Smuzhiyun  *
88*4882a593Smuzhiyun  * Returns one of USB_ENDPOINT_XFER_{CONTROL, ISOC, BULK, INT} according
89*4882a593Smuzhiyun  * to @epd's transfer type.
90*4882a593Smuzhiyun  */
usb_endpoint_type(const struct usb_endpoint_descriptor * epd)91*4882a593Smuzhiyun static inline int usb_endpoint_type(const struct usb_endpoint_descriptor *epd)
92*4882a593Smuzhiyun {
93*4882a593Smuzhiyun 	return epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK;
94*4882a593Smuzhiyun }
95*4882a593Smuzhiyun #endif
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun #if (LINUX_VERSION_CODE <= KERNEL_VERSION( 2,6,18 ))
98*4882a593Smuzhiyun /**
99*4882a593Smuzhiyun  * usb_endpoint_dir_in - check if the endpoint has IN direction
100*4882a593Smuzhiyun  * @epd: endpoint to be checked
101*4882a593Smuzhiyun  *
102*4882a593Smuzhiyun  * Returns true if the endpoint is of type IN, otherwise it returns false.
103*4882a593Smuzhiyun  */
usb_endpoint_dir_in(const struct usb_endpoint_descriptor * epd)104*4882a593Smuzhiyun static inline int usb_endpoint_dir_in(const struct usb_endpoint_descriptor *epd)
105*4882a593Smuzhiyun {
106*4882a593Smuzhiyun 	return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN);
107*4882a593Smuzhiyun }
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun /**
110*4882a593Smuzhiyun  * usb_endpoint_dir_out - check if the endpoint has OUT direction
111*4882a593Smuzhiyun  * @epd: endpoint to be checked
112*4882a593Smuzhiyun  *
113*4882a593Smuzhiyun  * Returns true if the endpoint is of type OUT, otherwise it returns false.
114*4882a593Smuzhiyun  */
usb_endpoint_dir_out(const struct usb_endpoint_descriptor * epd)115*4882a593Smuzhiyun static inline int usb_endpoint_dir_out(
116*4882a593Smuzhiyun 				const struct usb_endpoint_descriptor *epd)
117*4882a593Smuzhiyun {
118*4882a593Smuzhiyun 	return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT);
119*4882a593Smuzhiyun }
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun /**
122*4882a593Smuzhiyun  * usb_endpoint_xfer_int - check if the endpoint has interrupt transfer type
123*4882a593Smuzhiyun  * @epd: endpoint to be checked
124*4882a593Smuzhiyun  *
125*4882a593Smuzhiyun  * Returns true if the endpoint is of type interrupt, otherwise it returns
126*4882a593Smuzhiyun  * false.
127*4882a593Smuzhiyun  */
usb_endpoint_xfer_int(const struct usb_endpoint_descriptor * epd)128*4882a593Smuzhiyun static inline int usb_endpoint_xfer_int(
129*4882a593Smuzhiyun 				const struct usb_endpoint_descriptor *epd)
130*4882a593Smuzhiyun {
131*4882a593Smuzhiyun 	return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
132*4882a593Smuzhiyun 		USB_ENDPOINT_XFER_INT);
133*4882a593Smuzhiyun }
134*4882a593Smuzhiyun 
usb_autopm_set_interface(struct usb_interface * intf)135*4882a593Smuzhiyun static inline int usb_autopm_set_interface(struct usb_interface *intf)
136*4882a593Smuzhiyun { return 0; }
137*4882a593Smuzhiyun 
usb_autopm_get_interface(struct usb_interface * intf)138*4882a593Smuzhiyun static inline int usb_autopm_get_interface(struct usb_interface *intf)
139*4882a593Smuzhiyun { return 0; }
140*4882a593Smuzhiyun 
usb_autopm_get_interface_async(struct usb_interface * intf)141*4882a593Smuzhiyun static inline int usb_autopm_get_interface_async(struct usb_interface *intf)
142*4882a593Smuzhiyun { return 0; }
143*4882a593Smuzhiyun 
usb_autopm_put_interface(struct usb_interface * intf)144*4882a593Smuzhiyun static inline void usb_autopm_put_interface(struct usb_interface *intf)
145*4882a593Smuzhiyun { }
usb_autopm_put_interface_async(struct usb_interface * intf)146*4882a593Smuzhiyun static inline void usb_autopm_put_interface_async(struct usb_interface *intf)
147*4882a593Smuzhiyun { }
usb_autopm_enable(struct usb_interface * intf)148*4882a593Smuzhiyun static inline void usb_autopm_enable(struct usb_interface *intf)
149*4882a593Smuzhiyun { }
usb_autopm_disable(struct usb_interface * intf)150*4882a593Smuzhiyun static inline void usb_autopm_disable(struct usb_interface *intf)
151*4882a593Smuzhiyun { }
usb_mark_last_busy(struct usb_device * udev)152*4882a593Smuzhiyun static inline void usb_mark_last_busy(struct usb_device *udev)
153*4882a593Smuzhiyun { }
154*4882a593Smuzhiyun #endif
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun #if (LINUX_VERSION_CODE <= KERNEL_VERSION( 2,6,24 ))
157*4882a593Smuzhiyun    #include "usbnet.h"
158*4882a593Smuzhiyun #else
159*4882a593Smuzhiyun    #include <linux/usb/usbnet.h>
160*4882a593Smuzhiyun #endif
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun #if (LINUX_VERSION_CODE > KERNEL_VERSION( 2,6,25 ))
163*4882a593Smuzhiyun    #include <linux/fdtable.h>
164*4882a593Smuzhiyun #else
165*4882a593Smuzhiyun    #include <linux/file.h>
166*4882a593Smuzhiyun #endif
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun // Used in recursion, defined later below
169*4882a593Smuzhiyun struct sGobiUSBNet;
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun #if defined(QUECTEL_WWAN_QMAP)
173*4882a593Smuzhiyun #define QUECTEL_UL_DATA_AGG 1
174*4882a593Smuzhiyun 
175*4882a593Smuzhiyun #if defined(QUECTEL_UL_DATA_AGG)
176*4882a593Smuzhiyun struct ul_agg_ctx {
177*4882a593Smuzhiyun 	/* QMIWDS_ADMIN_SET_DATA_FORMAT_RESP TLV_0x17 and TLV_0x18 */
178*4882a593Smuzhiyun 	uint ul_data_aggregation_max_datagrams; //UplinkDataAggregationMaxDatagramsTlv
179*4882a593Smuzhiyun 	uint ul_data_aggregation_max_size; //UplinkDataAggregationMaxSizeTlv
180*4882a593Smuzhiyun 	uint dl_minimum_padding;
181*4882a593Smuzhiyun };
182*4882a593Smuzhiyun #endif
183*4882a593Smuzhiyun #endif
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun /*=========================================================================*/
186*4882a593Smuzhiyun // Struct sReadMemList
187*4882a593Smuzhiyun //
188*4882a593Smuzhiyun //    Structure that defines an entry in a Read Memory linked list
189*4882a593Smuzhiyun /*=========================================================================*/
190*4882a593Smuzhiyun typedef struct sReadMemList
191*4882a593Smuzhiyun {
192*4882a593Smuzhiyun    /* Data buffer */
193*4882a593Smuzhiyun    void *                     mpData;
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun    /* Transaction ID */
196*4882a593Smuzhiyun    u16                        mTransactionID;
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun    /* Size of data buffer */
199*4882a593Smuzhiyun    u16                        mDataSize;
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun    /* Next entry in linked list */
202*4882a593Smuzhiyun    struct sReadMemList *      mpNext;
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun } sReadMemList;
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun /*=========================================================================*/
207*4882a593Smuzhiyun // Struct sNotifyList
208*4882a593Smuzhiyun //
209*4882a593Smuzhiyun //    Structure that defines an entry in a Notification linked list
210*4882a593Smuzhiyun /*=========================================================================*/
211*4882a593Smuzhiyun typedef struct sNotifyList
212*4882a593Smuzhiyun {
213*4882a593Smuzhiyun    /* Function to be run when data becomes available */
214*4882a593Smuzhiyun    void                  (* mpNotifyFunct)(struct sGobiUSBNet *, u16, void *);
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun    /* Transaction ID */
217*4882a593Smuzhiyun    u16                   mTransactionID;
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun    /* Data to provide as parameter to mpNotifyFunct */
220*4882a593Smuzhiyun    void *                mpData;
221*4882a593Smuzhiyun 
222*4882a593Smuzhiyun    /* Next entry in linked list */
223*4882a593Smuzhiyun    struct sNotifyList *  mpNext;
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun } sNotifyList;
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun /*=========================================================================*/
228*4882a593Smuzhiyun // Struct sURBList
229*4882a593Smuzhiyun //
230*4882a593Smuzhiyun //    Structure that defines an entry in a URB linked list
231*4882a593Smuzhiyun /*=========================================================================*/
232*4882a593Smuzhiyun typedef struct sURBList
233*4882a593Smuzhiyun {
234*4882a593Smuzhiyun    /* The current URB */
235*4882a593Smuzhiyun    struct urb *       mpURB;
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun    /* Next entry in linked list */
238*4882a593Smuzhiyun    struct sURBList *  mpNext;
239*4882a593Smuzhiyun 
240*4882a593Smuzhiyun } sURBList;
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun /*=========================================================================*/
243*4882a593Smuzhiyun // Struct sClientMemList
244*4882a593Smuzhiyun //
245*4882a593Smuzhiyun //    Structure that defines an entry in a Client Memory linked list
246*4882a593Smuzhiyun //      Stores data specific to a Service Type and Client ID
247*4882a593Smuzhiyun /*=========================================================================*/
248*4882a593Smuzhiyun typedef struct sClientMemList
249*4882a593Smuzhiyun {
250*4882a593Smuzhiyun    /* Client ID for this Client */
251*4882a593Smuzhiyun    u16                          mClientID;
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun    /* Linked list of Read entries */
254*4882a593Smuzhiyun    /*    Stores data read from device before sending to client */
255*4882a593Smuzhiyun    sReadMemList *               mpList;
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun    /* Linked list of Notification entries */
258*4882a593Smuzhiyun    /*    Stores notification functions to be run as data becomes
259*4882a593Smuzhiyun          available or the device is removed */
260*4882a593Smuzhiyun    sNotifyList *                mpReadNotifyList;
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun    /* Linked list of URB entries */
263*4882a593Smuzhiyun    /*    Stores pointers to outstanding URBs which need canceled
264*4882a593Smuzhiyun          when the client is deregistered or the device is removed */
265*4882a593Smuzhiyun    sURBList *                   mpURBList;
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun    /* Next entry in linked list */
268*4882a593Smuzhiyun    struct sClientMemList *      mpNext;
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun    /* Wait queue object for poll() */
271*4882a593Smuzhiyun    wait_queue_head_t    mWaitQueue;
272*4882a593Smuzhiyun 
273*4882a593Smuzhiyun } sClientMemList;
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun /*=========================================================================*/
276*4882a593Smuzhiyun // Struct sURBSetupPacket
277*4882a593Smuzhiyun //
278*4882a593Smuzhiyun //    Structure that defines a USB Setup packet for Control URBs
279*4882a593Smuzhiyun //    Taken from USB CDC specifications
280*4882a593Smuzhiyun /*=========================================================================*/
281*4882a593Smuzhiyun typedef struct sURBSetupPacket
282*4882a593Smuzhiyun {
283*4882a593Smuzhiyun    /* Request type */
284*4882a593Smuzhiyun    u8    mRequestType;
285*4882a593Smuzhiyun 
286*4882a593Smuzhiyun    /* Request code */
287*4882a593Smuzhiyun    u8    mRequestCode;
288*4882a593Smuzhiyun 
289*4882a593Smuzhiyun    /* Value */
290*4882a593Smuzhiyun    u16   mValue;
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun    /* Index */
293*4882a593Smuzhiyun    u16   mIndex;
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun    /* Length of Control URB */
296*4882a593Smuzhiyun    u16   mLength;
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun } sURBSetupPacket;
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun // Common value for sURBSetupPacket.mLength
301*4882a593Smuzhiyun #define DEFAULT_READ_URB_LENGTH 0x1000
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun #ifdef QUECTEL_QMI_MERGE
304*4882a593Smuzhiyun #define MERGE_PACKET_IDENTITY 0x2c7c
305*4882a593Smuzhiyun #define MERGE_PACKET_VERSION 0x0001
306*4882a593Smuzhiyun #define MERGE_PACKET_MAX_PAYLOAD_SIZE 56
307*4882a593Smuzhiyun typedef struct sQMIMsgHeader {
308*4882a593Smuzhiyun     u16 idenity;
309*4882a593Smuzhiyun     u16 version;
310*4882a593Smuzhiyun     u16 cur_len;
311*4882a593Smuzhiyun     u16 total_len;
312*4882a593Smuzhiyun } sQMIMsgHeader;
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun typedef struct sQMIMsgPacket {
315*4882a593Smuzhiyun     sQMIMsgHeader header;
316*4882a593Smuzhiyun     u16 len;
317*4882a593Smuzhiyun     char buf[DEFAULT_READ_URB_LENGTH];
318*4882a593Smuzhiyun } sQMIMsgPacket;
319*4882a593Smuzhiyun #endif
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun #ifdef CONFIG_PM
322*4882a593Smuzhiyun #if (LINUX_VERSION_CODE < KERNEL_VERSION( 2,6,29 ))
323*4882a593Smuzhiyun /*=========================================================================*/
324*4882a593Smuzhiyun // Struct sAutoPM
325*4882a593Smuzhiyun //
326*4882a593Smuzhiyun //    Structure used to manage AutoPM thread which determines whether the
327*4882a593Smuzhiyun //    device is in use or may enter autosuspend.  Also submits net
328*4882a593Smuzhiyun //    transmissions asynchronously.
329*4882a593Smuzhiyun /*=========================================================================*/
330*4882a593Smuzhiyun typedef struct sAutoPM
331*4882a593Smuzhiyun {
332*4882a593Smuzhiyun    /* Thread for atomic autopm function */
333*4882a593Smuzhiyun    struct task_struct *       mpThread;
334*4882a593Smuzhiyun 
335*4882a593Smuzhiyun    /* Signal for completion when it's time for the thread to work */
336*4882a593Smuzhiyun    struct completion          mThreadDoWork;
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun    /* Time to exit? */
339*4882a593Smuzhiyun    bool                       mbExit;
340*4882a593Smuzhiyun 
341*4882a593Smuzhiyun    /* List of URB's queued to be sent to the device */
342*4882a593Smuzhiyun    sURBList *                 mpURBList;
343*4882a593Smuzhiyun 
344*4882a593Smuzhiyun    /* URB list lock (for adding and removing elements) */
345*4882a593Smuzhiyun    spinlock_t                 mURBListLock;
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun    /* Length of the URB list */
348*4882a593Smuzhiyun    atomic_t                   mURBListLen;
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun    /* Active URB */
351*4882a593Smuzhiyun    struct urb *               mpActiveURB;
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun    /* Active URB lock (for adding and removing elements) */
354*4882a593Smuzhiyun    spinlock_t                 mActiveURBLock;
355*4882a593Smuzhiyun 
356*4882a593Smuzhiyun    /* Duplicate pointer to USB device interface */
357*4882a593Smuzhiyun    struct usb_interface *     mpIntf;
358*4882a593Smuzhiyun 
359*4882a593Smuzhiyun } sAutoPM;
360*4882a593Smuzhiyun #endif
361*4882a593Smuzhiyun #endif /* CONFIG_PM */
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun /*=========================================================================*/
364*4882a593Smuzhiyun // Struct sQMIDev
365*4882a593Smuzhiyun //
366*4882a593Smuzhiyun //    Structure that defines the data for the QMI device
367*4882a593Smuzhiyun /*=========================================================================*/
368*4882a593Smuzhiyun typedef struct sQMIDev
369*4882a593Smuzhiyun {
370*4882a593Smuzhiyun    /* Device number */
371*4882a593Smuzhiyun    dev_t                      mDevNum;
372*4882a593Smuzhiyun 
373*4882a593Smuzhiyun    /* Device class */
374*4882a593Smuzhiyun    struct class *             mpDevClass;
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun    /* cdev struct */
377*4882a593Smuzhiyun    struct cdev                mCdev;
378*4882a593Smuzhiyun 
379*4882a593Smuzhiyun    /* is mCdev initialized? */
380*4882a593Smuzhiyun    bool                       mbCdevIsInitialized;
381*4882a593Smuzhiyun 
382*4882a593Smuzhiyun    /* Pointer to read URB */
383*4882a593Smuzhiyun    struct urb *               mpReadURB;
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun //#define READ_QMI_URB_ERROR
386*4882a593Smuzhiyun #ifdef READ_QMI_URB_ERROR
387*4882a593Smuzhiyun    struct timer_list mReadUrbTimer;
388*4882a593Smuzhiyun #endif
389*4882a593Smuzhiyun 
390*4882a593Smuzhiyun #ifdef QUECTEL_QMI_MERGE
391*4882a593Smuzhiyun    sQMIMsgPacket * mpQmiMsgPacket;
392*4882a593Smuzhiyun #endif
393*4882a593Smuzhiyun 
394*4882a593Smuzhiyun    /* Read setup packet */
395*4882a593Smuzhiyun    sURBSetupPacket *          mpReadSetupPacket;
396*4882a593Smuzhiyun 
397*4882a593Smuzhiyun    /* Read buffer attached to current read URB */
398*4882a593Smuzhiyun    void *                     mpReadBuffer;
399*4882a593Smuzhiyun 
400*4882a593Smuzhiyun    /* Inturrupt URB */
401*4882a593Smuzhiyun    /*    Used to asynchronously notify when read data is available */
402*4882a593Smuzhiyun    struct urb *               mpIntURB;
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun    /* Buffer used by Inturrupt URB */
405*4882a593Smuzhiyun    void *                     mpIntBuffer;
406*4882a593Smuzhiyun 
407*4882a593Smuzhiyun    /* Pointer to memory linked list for all clients */
408*4882a593Smuzhiyun    sClientMemList *           mpClientMemList;
409*4882a593Smuzhiyun 
410*4882a593Smuzhiyun    /* Spinlock for client Memory entries */
411*4882a593Smuzhiyun    spinlock_t                 mClientMemLock;
412*4882a593Smuzhiyun 
413*4882a593Smuzhiyun    /* Transaction ID associated with QMICTL "client" */
414*4882a593Smuzhiyun    atomic_t                   mQMICTLTransactionID;
415*4882a593Smuzhiyun 
416*4882a593Smuzhiyun } sQMIDev;
417*4882a593Smuzhiyun 
418*4882a593Smuzhiyun typedef struct {
419*4882a593Smuzhiyun 	u32 qmap_enabled;
420*4882a593Smuzhiyun 	u32 dl_data_aggregation_max_datagrams;
421*4882a593Smuzhiyun 	u32 dl_data_aggregation_max_size ;
422*4882a593Smuzhiyun 	u32 ul_data_aggregation_max_datagrams;
423*4882a593Smuzhiyun 	u32 ul_data_aggregation_max_size;
424*4882a593Smuzhiyun 	u32 dl_minimum_padding;
425*4882a593Smuzhiyun } QMAP_SETTING;
426*4882a593Smuzhiyun 
427*4882a593Smuzhiyun /*=========================================================================*/
428*4882a593Smuzhiyun // Struct sGobiUSBNet
429*4882a593Smuzhiyun //
430*4882a593Smuzhiyun //    Structure that defines the data associated with the Qualcomm USB device
431*4882a593Smuzhiyun /*=========================================================================*/
432*4882a593Smuzhiyun typedef struct sGobiUSBNet
433*4882a593Smuzhiyun {
434*4882a593Smuzhiyun     atomic_t refcount;
435*4882a593Smuzhiyun 
436*4882a593Smuzhiyun    /* Net device structure */
437*4882a593Smuzhiyun    struct usbnet *        mpNetDev;
438*4882a593Smuzhiyun #ifdef QUECTEL_WWAN_QMAP
439*4882a593Smuzhiyun    unsigned link_state;
440*4882a593Smuzhiyun    int qmap_mode;
441*4882a593Smuzhiyun    int qmap_size;
442*4882a593Smuzhiyun    int qmap_version;
443*4882a593Smuzhiyun    struct net_device	*mpQmapNetDev[QUECTEL_WWAN_QMAP];
444*4882a593Smuzhiyun    struct tasklet_struct	txq;
445*4882a593Smuzhiyun 
446*4882a593Smuzhiyun    QMAP_SETTING qmap_settings;
447*4882a593Smuzhiyun #if defined(QUECTEL_UL_DATA_AGG)
448*4882a593Smuzhiyun    struct ul_agg_ctx agg_ctx;
449*4882a593Smuzhiyun #endif
450*4882a593Smuzhiyun 
451*4882a593Smuzhiyun #ifdef QUECTEL_BRIDGE_MODE
452*4882a593Smuzhiyun    int m_qmap_bridge_mode[QUECTEL_WWAN_QMAP];
453*4882a593Smuzhiyun #endif
454*4882a593Smuzhiyun #endif
455*4882a593Smuzhiyun 
456*4882a593Smuzhiyun #if 1 //def DATA_MODE_RP
457*4882a593Smuzhiyun     bool                   mbMdm9x07;
458*4882a593Smuzhiyun     bool                   mbMdm9x06;	//for BG96
459*4882a593Smuzhiyun    /* QMI "device" work in IP Mode or ETH Mode */
460*4882a593Smuzhiyun    bool                   mbRawIPMode;
461*4882a593Smuzhiyun #ifdef QUECTEL_BRIDGE_MODE
462*4882a593Smuzhiyun    int m_bridge_mode;
463*4882a593Smuzhiyun    uint m_bridge_ipv4;
464*4882a593Smuzhiyun    unsigned char     mHostMAC[6];
465*4882a593Smuzhiyun #endif
466*4882a593Smuzhiyun    int m_qcrmcall_mode;
467*4882a593Smuzhiyun #endif
468*4882a593Smuzhiyun 
469*4882a593Smuzhiyun    struct completion mQMIReadyCompletion;
470*4882a593Smuzhiyun    bool                   mbQMIReady;
471*4882a593Smuzhiyun    bool                   mbProbeDone;
472*4882a593Smuzhiyun    bool                   mbQMISyncIng;
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun    /* Usb device interface */
475*4882a593Smuzhiyun    struct usb_interface * mpIntf;
476*4882a593Smuzhiyun 
477*4882a593Smuzhiyun    /* Pointers to usbnet_open and usbnet_stop functions */
478*4882a593Smuzhiyun    int                  (* mpUSBNetOpen)(struct net_device *);
479*4882a593Smuzhiyun    int                  (* mpUSBNetStop)(struct net_device *);
480*4882a593Smuzhiyun 
481*4882a593Smuzhiyun    /* Reason(s) why interface is down */
482*4882a593Smuzhiyun    /* Used by Gobi*DownReason */
483*4882a593Smuzhiyun    unsigned long          mDownReason;
484*4882a593Smuzhiyun #define NO_NDIS_CONNECTION    0
485*4882a593Smuzhiyun #define CDC_CONNECTION_SPEED  1
486*4882a593Smuzhiyun #define DRIVER_SUSPENDED      2
487*4882a593Smuzhiyun #define NET_IFACE_STOPPED     3
488*4882a593Smuzhiyun 
489*4882a593Smuzhiyun    /* QMI "device" status */
490*4882a593Smuzhiyun    bool                   mbQMIValid;
491*4882a593Smuzhiyun 
492*4882a593Smuzhiyun    bool                   mbDeregisterQMIDevice;
493*4882a593Smuzhiyun 
494*4882a593Smuzhiyun    /* QMI "device" memory */
495*4882a593Smuzhiyun    sQMIDev                mQMIDev;
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun    /* Device MEID */
498*4882a593Smuzhiyun    char                   mMEID[14];
499*4882a593Smuzhiyun     struct hrtimer timer;
500*4882a593Smuzhiyun     struct tasklet_struct bh;
501*4882a593Smuzhiyun     unsigned long
502*4882a593Smuzhiyun         pending_num : 8,
503*4882a593Smuzhiyun         pending_size : 16;
504*4882a593Smuzhiyun     struct sk_buff *pending_pool[16];
505*4882a593Smuzhiyun 
506*4882a593Smuzhiyun #ifdef CONFIG_PM
507*4882a593Smuzhiyun    #if (LINUX_VERSION_CODE < KERNEL_VERSION( 2,6,29 ))
508*4882a593Smuzhiyun    /* AutoPM thread */
509*4882a593Smuzhiyun    sAutoPM                mAutoPM;
510*4882a593Smuzhiyun #endif
511*4882a593Smuzhiyun #endif /* CONFIG_PM */
512*4882a593Smuzhiyun } sGobiUSBNet;
513*4882a593Smuzhiyun 
514*4882a593Smuzhiyun /*=========================================================================*/
515*4882a593Smuzhiyun // Struct sQMIFilpStorage
516*4882a593Smuzhiyun //
517*4882a593Smuzhiyun //    Structure that defines the storage each file handle contains
518*4882a593Smuzhiyun //       Relates the file handle to a client
519*4882a593Smuzhiyun /*=========================================================================*/
520*4882a593Smuzhiyun typedef struct sQMIFilpStorage
521*4882a593Smuzhiyun {
522*4882a593Smuzhiyun    /* Client ID */
523*4882a593Smuzhiyun    u16                  mClientID;
524*4882a593Smuzhiyun 
525*4882a593Smuzhiyun    /* Device pointer */
526*4882a593Smuzhiyun    sGobiUSBNet *        mpDev;
527*4882a593Smuzhiyun 
528*4882a593Smuzhiyun } sQMIFilpStorage;
529*4882a593Smuzhiyun 
530