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