xref: /OK3568_Linux_fs/kernel/drivers/net/usb/GobiNet/QMI.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*===========================================================================
2*4882a593Smuzhiyun FILE:
3*4882a593Smuzhiyun    QMI.h
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun DESCRIPTION:
6*4882a593Smuzhiyun    Qualcomm QMI driver header
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun FUNCTIONS:
9*4882a593Smuzhiyun    Generic QMUX functions
10*4882a593Smuzhiyun       ParseQMUX
11*4882a593Smuzhiyun       FillQMUX
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun    Generic QMI functions
14*4882a593Smuzhiyun       GetTLV
15*4882a593Smuzhiyun       ValidQMIMessage
16*4882a593Smuzhiyun       GetQMIMessageID
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun    Get sizes of buffers needed by QMI requests
19*4882a593Smuzhiyun       QMUXHeaderSize
20*4882a593Smuzhiyun       QMICTLGetClientIDReqSize
21*4882a593Smuzhiyun       QMICTLReleaseClientIDReqSize
22*4882a593Smuzhiyun       QMICTLReadyReqSize
23*4882a593Smuzhiyun       QMIWDSSetEventReportReqSize
24*4882a593Smuzhiyun       QMIWDSGetPKGSRVCStatusReqSize
25*4882a593Smuzhiyun       QMIDMSGetMEIDReqSize
26*4882a593Smuzhiyun       QMICTLSyncReqSize
27*4882a593Smuzhiyun 
28*4882a593Smuzhiyun    Fill Buffers with QMI requests
29*4882a593Smuzhiyun       QMICTLGetClientIDReq
30*4882a593Smuzhiyun       QMICTLReleaseClientIDReq
31*4882a593Smuzhiyun       QMICTLReadyReq
32*4882a593Smuzhiyun       QMIWDSSetEventReportReq
33*4882a593Smuzhiyun       QMIWDSGetPKGSRVCStatusReq
34*4882a593Smuzhiyun       QMIDMSGetMEIDReq
35*4882a593Smuzhiyun       QMICTLSetDataFormatReq
36*4882a593Smuzhiyun       QMICTLSyncReq
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun    Parse data from QMI responses
39*4882a593Smuzhiyun       QMICTLGetClientIDResp
40*4882a593Smuzhiyun       QMICTLReleaseClientIDResp
41*4882a593Smuzhiyun       QMIWDSEventResp
42*4882a593Smuzhiyun       QMIDMSGetMEIDResp
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun Copyright (c) 2011, Code Aurora Forum. All rights reserved.
45*4882a593Smuzhiyun 
46*4882a593Smuzhiyun Redistribution and use in source and binary forms, with or without
47*4882a593Smuzhiyun modification, are permitted provided that the following conditions are met:
48*4882a593Smuzhiyun     * Redistributions of source code must retain the above copyright
49*4882a593Smuzhiyun       notice, this list of conditions and the following disclaimer.
50*4882a593Smuzhiyun     * Redistributions in binary form must reproduce the above copyright
51*4882a593Smuzhiyun       notice, this list of conditions and the following disclaimer in the
52*4882a593Smuzhiyun       documentation and/or other materials provided with the distribution.
53*4882a593Smuzhiyun     * Neither the name of Code Aurora Forum nor
54*4882a593Smuzhiyun       the names of its contributors may be used to endorse or promote
55*4882a593Smuzhiyun       products derived from this software without specific prior written
56*4882a593Smuzhiyun       permission.
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
60*4882a593Smuzhiyun AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
61*4882a593Smuzhiyun IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
62*4882a593Smuzhiyun ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
63*4882a593Smuzhiyun LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
64*4882a593Smuzhiyun CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
65*4882a593Smuzhiyun SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
66*4882a593Smuzhiyun INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
67*4882a593Smuzhiyun CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
68*4882a593Smuzhiyun ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
69*4882a593Smuzhiyun POSSIBILITY OF SUCH DAMAGE.
70*4882a593Smuzhiyun ===========================================================================*/
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun #pragma once
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun /*=========================================================================*/
75*4882a593Smuzhiyun // Definitions
76*4882a593Smuzhiyun /*=========================================================================*/
77*4882a593Smuzhiyun 
78*4882a593Smuzhiyun extern int quec_debug;
79*4882a593Smuzhiyun // DBG macro
80*4882a593Smuzhiyun #define DBG( format, arg... ) do { \
81*4882a593Smuzhiyun    if (quec_debug == 1)\
82*4882a593Smuzhiyun    { \
83*4882a593Smuzhiyun       printk( KERN_INFO "GobiNet::%s " format, __FUNCTION__, ## arg ); \
84*4882a593Smuzhiyun    } }while(0)
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun #if 0
87*4882a593Smuzhiyun #define VDBG( format, arg... ) do { \
88*4882a593Smuzhiyun    if (debug == 1)\
89*4882a593Smuzhiyun    { \
90*4882a593Smuzhiyun       printk( KERN_INFO "GobiNet::%s " format, __FUNCTION__, ## arg ); \
91*4882a593Smuzhiyun    } } while(0)
92*4882a593Smuzhiyun #else
93*4882a593Smuzhiyun #define VDBG( format, arg... ) do { } while(0)
94*4882a593Smuzhiyun #endif
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun #define INFO( format, arg... ) do { \
97*4882a593Smuzhiyun       printk( KERN_INFO "GobiNet::%s " format, __FUNCTION__, ## arg ); \
98*4882a593Smuzhiyun    }while(0)
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun // QMI Service Types
101*4882a593Smuzhiyun #define QMICTL 0
102*4882a593Smuzhiyun #define QMIWDS 1
103*4882a593Smuzhiyun #define QMIDMS 2
104*4882a593Smuzhiyun #define QMINAS 3
105*4882a593Smuzhiyun #define QMIUIM 11
106*4882a593Smuzhiyun #define QMIWDA 0x1A
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun #define u8        unsigned char
109*4882a593Smuzhiyun #define u16       unsigned short
110*4882a593Smuzhiyun #define u32       unsigned int
111*4882a593Smuzhiyun #define u64       unsigned long long
112*4882a593Smuzhiyun 
113*4882a593Smuzhiyun #define bool      u8
114*4882a593Smuzhiyun #define true      1
115*4882a593Smuzhiyun #define false     0
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun #define ENOMEM    12
118*4882a593Smuzhiyun #define EFAULT    14
119*4882a593Smuzhiyun #define EINVAL    22
120*4882a593Smuzhiyun #ifndef ENOMSG
121*4882a593Smuzhiyun #define ENOMSG    42
122*4882a593Smuzhiyun #endif
123*4882a593Smuzhiyun #define ENODATA   61
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun #define TLV_TYPE_LINK_PROTO 0x10
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun /*=========================================================================*/
128*4882a593Smuzhiyun // Struct sQMUX
129*4882a593Smuzhiyun //
130*4882a593Smuzhiyun //    Structure that defines a QMUX header
131*4882a593Smuzhiyun /*=========================================================================*/
132*4882a593Smuzhiyun typedef struct sQMUX
133*4882a593Smuzhiyun {
134*4882a593Smuzhiyun    /* T\F, always 1 */
135*4882a593Smuzhiyun    u8         mTF;
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun    /* Size of message */
138*4882a593Smuzhiyun    u16        mLength;
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun    /* Control flag */
141*4882a593Smuzhiyun    u8         mCtrlFlag;
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun    /* Service Type */
144*4882a593Smuzhiyun    u8         mQMIService;
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun    /* Client ID */
147*4882a593Smuzhiyun    u8         mQMIClientID;
148*4882a593Smuzhiyun 
149*4882a593Smuzhiyun }__attribute__((__packed__)) sQMUX;
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun #if 0
152*4882a593Smuzhiyun /*=========================================================================*/
153*4882a593Smuzhiyun // Generic QMUX functions
154*4882a593Smuzhiyun /*=========================================================================*/
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun // Remove QMUX headers from a buffer
157*4882a593Smuzhiyun int ParseQMUX(
158*4882a593Smuzhiyun    u16 *    pClientID,
159*4882a593Smuzhiyun    void *   pBuffer,
160*4882a593Smuzhiyun    u16      buffSize );
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun // Fill buffer with QMUX headers
163*4882a593Smuzhiyun int FillQMUX(
164*4882a593Smuzhiyun    u16      clientID,
165*4882a593Smuzhiyun    void *   pBuffer,
166*4882a593Smuzhiyun    u16      buffSize );
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun /*=========================================================================*/
169*4882a593Smuzhiyun // Generic QMI functions
170*4882a593Smuzhiyun /*=========================================================================*/
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun // Get data buffer of a specified TLV from a QMI message
173*4882a593Smuzhiyun int GetTLV(
174*4882a593Smuzhiyun    void *   pQMIMessage,
175*4882a593Smuzhiyun    u16      messageLen,
176*4882a593Smuzhiyun    u8       type,
177*4882a593Smuzhiyun    void *   pOutDataBuf,
178*4882a593Smuzhiyun    u16      bufferLen );
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun // Check mandatory TLV in a QMI message
181*4882a593Smuzhiyun int ValidQMIMessage(
182*4882a593Smuzhiyun    void *   pQMIMessage,
183*4882a593Smuzhiyun    u16      messageLen );
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun // Get the message ID of a QMI message
186*4882a593Smuzhiyun int GetQMIMessageID(
187*4882a593Smuzhiyun    void *   pQMIMessage,
188*4882a593Smuzhiyun    u16      messageLen );
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun /*=========================================================================*/
191*4882a593Smuzhiyun // Get sizes of buffers needed by QMI requests
192*4882a593Smuzhiyun /*=========================================================================*/
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun // Get size of buffer needed for QMUX
195*4882a593Smuzhiyun u16 QMUXHeaderSize( void );
196*4882a593Smuzhiyun 
197*4882a593Smuzhiyun // Get size of buffer needed for QMUX + QMICTLGetClientIDReq
198*4882a593Smuzhiyun u16 QMICTLGetClientIDReqSize( void );
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun // Get size of buffer needed for QMUX + QMICTLReleaseClientIDReq
201*4882a593Smuzhiyun u16 QMICTLReleaseClientIDReqSize( void );
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun // Get size of buffer needed for QMUX + QMICTLReadyReq
204*4882a593Smuzhiyun u16 QMICTLReadyReqSize( void );
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun // Get size of buffer needed for QMUX + QMIWDSSetEventReportReq
207*4882a593Smuzhiyun u16 QMIWDSSetEventReportReqSize( void );
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun // Get size of buffer needed for QMUX + QMIWDSGetPKGSRVCStatusReq
210*4882a593Smuzhiyun u16 QMIWDSGetPKGSRVCStatusReqSize( void );
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun u16 QMIWDSSetQMUXBindMuxDataPortSize( void );
213*4882a593Smuzhiyun 
214*4882a593Smuzhiyun // Get size of buffer needed for QMUX + QMIDMSGetMEIDReq
215*4882a593Smuzhiyun u16 QMIDMSGetMEIDReqSize( void );
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun // Get size of buffer needed for QMUX + QMIWDASetDataFormatReq
218*4882a593Smuzhiyun u16 QMIWDASetDataFormatReqSize( int qmap_mode );
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun // Get size of buffer needed for QMUX + QMICTLSyncReq
221*4882a593Smuzhiyun u16 QMICTLSyncReqSize( void );
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun /*=========================================================================*/
224*4882a593Smuzhiyun // Fill Buffers with QMI requests
225*4882a593Smuzhiyun /*=========================================================================*/
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun // Fill buffer with QMI CTL Get Client ID Request
228*4882a593Smuzhiyun int QMICTLGetClientIDReq(
229*4882a593Smuzhiyun    void *   pBuffer,
230*4882a593Smuzhiyun    u16      buffSize,
231*4882a593Smuzhiyun    u8       transactionID,
232*4882a593Smuzhiyun    u8       serviceType );
233*4882a593Smuzhiyun 
234*4882a593Smuzhiyun // Fill buffer with QMI CTL Release Client ID Request
235*4882a593Smuzhiyun int QMICTLReleaseClientIDReq(
236*4882a593Smuzhiyun    void *   pBuffer,
237*4882a593Smuzhiyun    u16      buffSize,
238*4882a593Smuzhiyun    u8       transactionID,
239*4882a593Smuzhiyun    u16      clientID );
240*4882a593Smuzhiyun 
241*4882a593Smuzhiyun // Fill buffer with QMI CTL Get Version Info Request
242*4882a593Smuzhiyun int QMICTLReadyReq(
243*4882a593Smuzhiyun    void *   pBuffer,
244*4882a593Smuzhiyun    u16      buffSize,
245*4882a593Smuzhiyun    u8       transactionID );
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun // Fill buffer with QMI WDS Set Event Report Request
248*4882a593Smuzhiyun int QMIWDSSetEventReportReq(
249*4882a593Smuzhiyun    void *   pBuffer,
250*4882a593Smuzhiyun    u16      buffSize,
251*4882a593Smuzhiyun    u16      transactionID );
252*4882a593Smuzhiyun 
253*4882a593Smuzhiyun // Fill buffer with QMI WDS Get PKG SRVC Status Request
254*4882a593Smuzhiyun int QMIWDSGetPKGSRVCStatusReq(
255*4882a593Smuzhiyun    void *   pBuffer,
256*4882a593Smuzhiyun    u16      buffSize,
257*4882a593Smuzhiyun    u16      transactionID );
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun u16 QMIWDSSetQMUXBindMuxDataPortReq(
260*4882a593Smuzhiyun    void *   pBuffer,
261*4882a593Smuzhiyun    u16      buffSize,
262*4882a593Smuzhiyun    u8 MuxId,
263*4882a593Smuzhiyun    u16      transactionID );
264*4882a593Smuzhiyun 
265*4882a593Smuzhiyun // Fill buffer with QMI DMS Get Serial Numbers Request
266*4882a593Smuzhiyun int QMIDMSGetMEIDReq(
267*4882a593Smuzhiyun    void *   pBuffer,
268*4882a593Smuzhiyun    u16      buffSize,
269*4882a593Smuzhiyun    u16      transactionID );
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun // Fill buffer with QMI WDA Set Data Format Request
272*4882a593Smuzhiyun int QMIWDASetDataFormatReq(
273*4882a593Smuzhiyun    void *   pBuffer,
274*4882a593Smuzhiyun    u16      buffSize,
275*4882a593Smuzhiyun    bool     bRawIPMode, int qmap_mode, u32 rx_size,
276*4882a593Smuzhiyun    u16      transactionID );
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun #if 0
279*4882a593Smuzhiyun int QMIWDASetDataQmapReq(
280*4882a593Smuzhiyun 		void *   pBuffer,
281*4882a593Smuzhiyun 		u16      buffSize,
282*4882a593Smuzhiyun 		u16      transactionID );
283*4882a593Smuzhiyun #endif
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun int QMICTLSyncReq(
286*4882a593Smuzhiyun    void *   pBuffer,
287*4882a593Smuzhiyun    u16      buffSize,
288*4882a593Smuzhiyun    u16      transactionID );
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun /*=========================================================================*/
291*4882a593Smuzhiyun // Parse data from QMI responses
292*4882a593Smuzhiyun /*=========================================================================*/
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun // Parse the QMI CTL Get Client ID Resp
295*4882a593Smuzhiyun int QMICTLGetClientIDResp(
296*4882a593Smuzhiyun    void * pBuffer,
297*4882a593Smuzhiyun    u16    buffSize,
298*4882a593Smuzhiyun    u16 *  pClientID );
299*4882a593Smuzhiyun 
300*4882a593Smuzhiyun // Verify the QMI CTL Release Client ID Resp is valid
301*4882a593Smuzhiyun int QMICTLReleaseClientIDResp(
302*4882a593Smuzhiyun    void *   pBuffer,
303*4882a593Smuzhiyun    u16      buffSize );
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun // Parse the QMI WDS Set Event Report Resp/Indication or
306*4882a593Smuzhiyun //    QMI WDS Get PKG SRVC Status Resp/Indication
307*4882a593Smuzhiyun int QMIWDSEventResp(
308*4882a593Smuzhiyun    void *   pBuffer,
309*4882a593Smuzhiyun    u16      buffSize,
310*4882a593Smuzhiyun    u32 *    pTXOk,
311*4882a593Smuzhiyun    u32 *    pRXOk,
312*4882a593Smuzhiyun    u32 *    pTXErr,
313*4882a593Smuzhiyun    u32 *    pRXErr,
314*4882a593Smuzhiyun    u32 *    pTXOfl,
315*4882a593Smuzhiyun    u32 *    pRXOfl,
316*4882a593Smuzhiyun    u64 *    pTXBytesOk,
317*4882a593Smuzhiyun    u64 *    pRXBytesOk,
318*4882a593Smuzhiyun    bool *   pbLinkState,
319*4882a593Smuzhiyun    bool *   pbReconfigure );
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun // Parse the QMI DMS Get Serial Numbers Resp
322*4882a593Smuzhiyun int QMIDMSGetMEIDResp(
323*4882a593Smuzhiyun    void *   pBuffer,
324*4882a593Smuzhiyun    u16      buffSize,
325*4882a593Smuzhiyun    char *   pMEID,
326*4882a593Smuzhiyun    int      meidSize );
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun // Parse the QMI DMS Get Serial Numbers Resp
329*4882a593Smuzhiyun int QMIWDASetDataFormatResp(
330*4882a593Smuzhiyun    void *   pBuffer,
331*4882a593Smuzhiyun    u16      buffSize, bool bRawIPMode, int *qmap_enabled, int *rx_size, int *tx_size);
332*4882a593Smuzhiyun 
333*4882a593Smuzhiyun // Pasre the QMI CTL Sync Response
334*4882a593Smuzhiyun int QMICTLSyncResp(
335*4882a593Smuzhiyun    void *pBuffer,
336*4882a593Smuzhiyun    u16  buffSize );
337*4882a593Smuzhiyun #endif
338