summaryrefslogblamecommitdiffstats
path: root/drivers/staging/csr/csr_wifi_serialize_primitive_types.c
blob: dd93d0061190117a4b522193a86f9359a7a02e52 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11










                                                                              
                       
                      



                             
                                                     
 
            










                                          
                                                              
 
            







                                                             
                                                              
 
            









                                         
                                                              
 
            










                                          
                                              
 


                                                   





                                
                                                       
 

                                          




              
                                                       
 



                                                   




              
                                                       
 


                                                  




              
                                    




                                      
                                                    







                                                        
                                                
 
                                                                              
                      





                                                    
                                            




                                              
                                                            









                                                                  
                                                        
 
                                                                                        
 
                      







                                                           
                                             





                                               
                                                             








                                                                    
                                                         
 
                                                                                          
 
                      







                                                           
                                             




                                               
                                                             









                                                                    
                                                         
 
                                                                                          
 
                      






                                                           
                                                     




                                                       
                                                                     










                                                                                    
                                                                 
 
                                                                                                          
 
                      








                                                           
/*****************************************************************************

            (c) Cambridge Silicon Radio Limited 2011
            All rights reserved and confidential information of CSR

            Refer to LICENSE.txt included with this source for details
            on the license terms.

*****************************************************************************/

#include <linux/module.h>
#include <linux/slab.h>
#include "csr_macro.h"
#include "csr_msgconv.h"
#include "csr_wifi_msgconv.h"
#include "csr_wifi_lib.h"

void CsrUint24Des(u32 *v, u8 *buffer, size_t *offset)
{
    u32 val;

    val = ((buffer[(*offset) + 2] << 16) |
           (buffer[(*offset) + 1] << 8) |
           (buffer[(*offset)]));

    *offset += 3;
    *v = val;
}


/* Big endian :e.g WSC, TCLAS */
void CsrUint16DesBigEndian(u16 *v, u8 *buffer, size_t *offset)
{
    u16 val;

    val = (buffer[(*offset)] << 8) | (buffer[(*offset) + 1]);
    *offset += 2;

    *v = val;
}


void CsrUint24DesBigEndian(u32 *v, u8 *buffer, size_t *offset)
{
    u32 val;

    val = ((buffer[(*offset)] << 16) |
           (buffer[(*offset) + 1] << 8) |
           (buffer[(*offset) + 2]));

    *offset += 3;
    *v = val;
}


void CsrUint32DesBigEndian(u32 *v, u8 *buffer, size_t *offset)
{
    u32 val;

    val = ((buffer[(*offset)] << 24) |
           (buffer[(*offset) + 1] << 16) |
           (buffer[(*offset) + 2] << 8) |
           (buffer[(*offset) + 3]));

    *offset += 4;
    *v = val;
}


void CsrUint24Ser(u8 *ptr, size_t *len, u32 v)
{
    ptr[(*len) + 2] = (u8)((v & 0x00ff0000) >> 16);
    ptr[(*len) + 1] = (u8)((v & 0x0000ff00) >> 8);
    ptr[(*len)]     = (u8)((v & 0x000000ff));

    *len += 3;
}


/* Big endian :e.g WSC, TCLAS */
void CsrUint16SerBigEndian(u8 *ptr, size_t *len, u16 v)
{
    ptr[(*len)] = (u8)((v & 0xff00) >> 8);
    ptr[(*len) + 1] = (u8)((v & 0x00ff));

    *len += 2;
}


void CsrUint32SerBigEndian(u8 *ptr, size_t *len, u32 v)
{
    ptr[(*len)] = (u8)((v & 0xff000000) >> 24);
    ptr[(*len) + 1] = (u8)((v & 0x00ff0000) >> 16);
    ptr[(*len) + 2] = (u8)((v & 0x0000ff00) >> 8);
    ptr[(*len) + 3] = (u8)((v & 0x000000ff));

    *len += 4;
}


void CsrUint24SerBigEndian(u8 *ptr, size_t *len, u32 v)
{
    ptr[(*len)] = (u8)((v & 0x00ff0000) >> 16);
    ptr[(*len) + 1] = (u8)((v & 0x0000ff00) >> 8);
    ptr[(*len) + 2] = (u8)((v & 0x000000ff));

    *len += 3;
}


size_t CsrWifiEventSizeof(void *msg)
{
    return 2;
}
EXPORT_SYMBOL_GPL(CsrWifiEventSizeof);

u8* CsrWifiEventSer(u8 *ptr, size_t *len, void *msg)
{
    CsrWifiFsmEvent *primitive = (CsrWifiFsmEvent *)msg;
    *len = 0;
    CsrUint16Ser(ptr, len, primitive->type);
    return(ptr);
}
EXPORT_SYMBOL_GPL(CsrWifiEventSer);

void* CsrWifiEventDes(u8 *buffer, size_t length)
{
    CsrWifiFsmEvent *primitive = kmalloc(sizeof(CsrWifiFsmEvent), GFP_KERNEL);
    size_t offset = 0;
    CsrUint16Des(&primitive->type, buffer, &offset);

    return primitive;
}
EXPORT_SYMBOL_GPL(CsrWifiEventDes);

size_t CsrWifiEventCsrUint8Sizeof(void *msg)
{
    return 3;
}
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint8Sizeof);

u8* CsrWifiEventCsrUint8Ser(u8 *ptr, size_t *len, void *msg)
{
    CsrWifiEventCsrUint8 *primitive = (CsrWifiEventCsrUint8 *)msg;
    *len = 0;
    CsrUint16Ser(ptr, len, primitive->common.type);
    CsrUint8Ser(ptr, len, primitive->value);
    return(ptr);
}
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint8Ser);


void* CsrWifiEventCsrUint8Des(u8 *buffer, size_t length)
{
    CsrWifiEventCsrUint8 *primitive = kmalloc(sizeof(CsrWifiEventCsrUint8), GFP_KERNEL);

    size_t offset = 0;
    CsrUint16Des(&primitive->common.type, buffer, &offset);
    CsrUint8Des(&primitive->value, buffer, &offset);

    return primitive;
}
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint8Des);


size_t CsrWifiEventCsrUint16Sizeof(void *msg)
{
    return 4;
}
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint16Sizeof);


u8* CsrWifiEventCsrUint16Ser(u8 *ptr, size_t *len, void *msg)
{
    CsrWifiEventCsrUint16 *primitive = (CsrWifiEventCsrUint16 *)msg;
    *len = 0;
    CsrUint16Ser(ptr, len, primitive->common.type);
    CsrUint16Ser(ptr, len, primitive->value);
    return(ptr);
}
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint16Ser);

void* CsrWifiEventCsrUint16Des(u8 *buffer, size_t length)
{
    CsrWifiEventCsrUint16 *primitive = kmalloc(sizeof(CsrWifiEventCsrUint16), GFP_KERNEL);

    size_t offset = 0;
    CsrUint16Des(&primitive->common.type, buffer, &offset);
    CsrUint16Des(&primitive->value, buffer, &offset);

    return primitive;
}
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint16Des);


size_t CsrWifiEventCsrUint32Sizeof(void *msg)
{
    return 6;
}
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint32Sizeof);

u8* CsrWifiEventCsrUint32Ser(u8 *ptr, size_t *len, void *msg)
{
    CsrWifiEventCsrUint32 *primitive = (CsrWifiEventCsrUint32 *)msg;
    *len = 0;
    CsrUint16Ser(ptr, len, primitive->common.type);
    CsrUint32Ser(ptr, len, primitive->value);
    return(ptr);
}
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint32Ser);


void* CsrWifiEventCsrUint32Des(u8 *buffer, size_t length)
{
    CsrWifiEventCsrUint32 *primitive = kmalloc(sizeof(CsrWifiEventCsrUint32), GFP_KERNEL);

    size_t offset = 0;
    CsrUint16Des(&primitive->common.type, buffer, &offset);
    CsrUint32Des(&primitive->value, buffer, &offset);

    return primitive;
}
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint32Des);

size_t CsrWifiEventCsrUint16CsrUint8Sizeof(void *msg)
{
    return 5;
}
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint16CsrUint8Sizeof);

u8* CsrWifiEventCsrUint16CsrUint8Ser(u8 *ptr, size_t *len, void *msg)
{
    CsrWifiEventCsrUint16CsrUint8 *primitive = (CsrWifiEventCsrUint16CsrUint8 *)msg;
    *len = 0;
    CsrUint16Ser(ptr, len, primitive->common.type);
    CsrUint16Ser(ptr, len, primitive->value16);
    CsrUint8Ser(ptr, len, primitive->value8);
    return(ptr);
}
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint16CsrUint8Ser);


void* CsrWifiEventCsrUint16CsrUint8Des(u8 *buffer, size_t length)
{
    CsrWifiEventCsrUint16CsrUint8 *primitive = kmalloc(sizeof(CsrWifiEventCsrUint16CsrUint8), GFP_KERNEL);

    size_t offset = 0;
    CsrUint16Des(&primitive->common.type, buffer, &offset);
    CsrUint16Des(&primitive->value16, buffer, &offset);
    CsrUint8Des(&primitive->value8, buffer, &offset);

    return primitive;
}
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint16CsrUint8Des);