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