2012-06-19 23:15:42 +00:00
|
|
|
/*****************************************************************************
|
|
|
|
|
|
|
|
(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 "csr_types.h"
|
|
|
|
#include "csr_pmem.h"
|
|
|
|
#include "csr_util.h"
|
|
|
|
#include "csr_msgconv.h"
|
|
|
|
#include "csr_wifi_msgconv.h"
|
|
|
|
#include "csr_wifi_lib.h"
|
|
|
|
|
2012-07-20 18:51:01 +00:00
|
|
|
void CsrUint24Des(CsrUint32 *v, u8 *buffer, CsrSize *offset)
|
2012-06-19 23:15:42 +00:00
|
|
|
{
|
|
|
|
CsrUint32 val;
|
|
|
|
|
|
|
|
val = ((buffer[(*offset) + 2] << 16) |
|
|
|
|
(buffer[(*offset) + 1] << 8) |
|
|
|
|
(buffer[(*offset)]));
|
|
|
|
|
|
|
|
*offset += 3;
|
|
|
|
*v = val;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Big endian :e.g WSC, TCLAS */
|
2012-07-20 18:51:01 +00:00
|
|
|
void CsrUint16DesBigEndian(CsrUint16 *v, u8 *buffer, CsrSize *offset)
|
2012-06-19 23:15:42 +00:00
|
|
|
{
|
|
|
|
CsrUint16 val;
|
|
|
|
|
|
|
|
val = (buffer[(*offset)] << 8) | (buffer[(*offset) + 1]);
|
|
|
|
*offset += 2;
|
|
|
|
|
|
|
|
*v = val;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-07-20 18:51:01 +00:00
|
|
|
void CsrUint24DesBigEndian(CsrUint32 *v, u8 *buffer, CsrSize *offset)
|
2012-06-19 23:15:42 +00:00
|
|
|
{
|
|
|
|
CsrUint32 val;
|
|
|
|
|
|
|
|
val = ((buffer[(*offset)] << 16) |
|
|
|
|
(buffer[(*offset) + 1] << 8) |
|
|
|
|
(buffer[(*offset) + 2]));
|
|
|
|
|
|
|
|
*offset += 3;
|
|
|
|
*v = val;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-07-20 18:51:01 +00:00
|
|
|
void CsrUint32DesBigEndian(CsrUint32 *v, u8 *buffer, CsrSize *offset)
|
2012-06-19 23:15:42 +00:00
|
|
|
{
|
|
|
|
CsrUint32 val;
|
|
|
|
|
|
|
|
val = ((buffer[(*offset)] << 24) |
|
|
|
|
(buffer[(*offset) + 1] << 16) |
|
|
|
|
(buffer[(*offset) + 2] << 8) |
|
|
|
|
(buffer[(*offset) + 3]));
|
|
|
|
|
|
|
|
*offset += 4;
|
|
|
|
*v = val;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-07-20 18:51:01 +00:00
|
|
|
void CsrUint24Ser(u8 *ptr, CsrSize *len, CsrUint32 v)
|
2012-06-19 23:15:42 +00:00
|
|
|
{
|
2012-07-20 18:51:01 +00:00
|
|
|
ptr[(*len) + 2] = (u8)((v & 0x00ff0000) >> 16);
|
|
|
|
ptr[(*len) + 1] = (u8)((v & 0x0000ff00) >> 8);
|
|
|
|
ptr[(*len)] = (u8)((v & 0x000000ff));
|
2012-06-19 23:15:42 +00:00
|
|
|
|
|
|
|
*len += 3;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* Big endian :e.g WSC, TCLAS */
|
2012-07-20 18:51:01 +00:00
|
|
|
void CsrUint16SerBigEndian(u8 *ptr, CsrSize *len, CsrUint16 v)
|
2012-06-19 23:15:42 +00:00
|
|
|
{
|
2012-07-20 18:51:01 +00:00
|
|
|
ptr[(*len)] = (u8)((v & 0xff00) >> 8);
|
|
|
|
ptr[(*len) + 1] = (u8)((v & 0x00ff));
|
2012-06-19 23:15:42 +00:00
|
|
|
|
|
|
|
*len += 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-07-20 18:51:01 +00:00
|
|
|
void CsrUint32SerBigEndian(u8 *ptr, CsrSize *len, CsrUint32 v)
|
2012-06-19 23:15:42 +00:00
|
|
|
{
|
2012-07-20 18:51:01 +00:00
|
|
|
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));
|
2012-06-19 23:15:42 +00:00
|
|
|
|
|
|
|
*len += 4;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2012-07-20 18:51:01 +00:00
|
|
|
void CsrUint24SerBigEndian(u8 *ptr, CsrSize *len, CsrUint32 v)
|
2012-06-19 23:15:42 +00:00
|
|
|
{
|
2012-07-20 18:51:01 +00:00
|
|
|
ptr[(*len)] = (u8)((v & 0x00ff0000) >> 16);
|
|
|
|
ptr[(*len) + 1] = (u8)((v & 0x0000ff00) >> 8);
|
|
|
|
ptr[(*len) + 2] = (u8)((v & 0x000000ff));
|
2012-06-19 23:15:42 +00:00
|
|
|
|
|
|
|
*len += 3;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
CsrSize CsrWifiEventSizeof(void *msg)
|
|
|
|
{
|
|
|
|
return 2;
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(CsrWifiEventSizeof);
|
|
|
|
|
2012-07-20 18:51:01 +00:00
|
|
|
u8* CsrWifiEventSer(u8 *ptr, CsrSize *len, void *msg)
|
2012-06-19 23:15:42 +00:00
|
|
|
{
|
|
|
|
CsrWifiFsmEvent *primitive = (CsrWifiFsmEvent *)msg;
|
|
|
|
*len = 0;
|
|
|
|
CsrUint16Ser(ptr, len, primitive->type);
|
|
|
|
return(ptr);
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(CsrWifiEventSer);
|
|
|
|
|
2012-07-20 18:51:01 +00:00
|
|
|
void* CsrWifiEventDes(u8 *buffer, CsrSize length)
|
2012-06-19 23:15:42 +00:00
|
|
|
{
|
|
|
|
CsrWifiFsmEvent *primitive = (CsrWifiFsmEvent *) CsrPmemAlloc(sizeof(CsrWifiFsmEvent));
|
|
|
|
CsrSize offset = 0;
|
|
|
|
CsrUint16Des(&primitive->type, buffer, &offset);
|
|
|
|
|
|
|
|
return primitive;
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(CsrWifiEventDes);
|
|
|
|
|
|
|
|
CsrSize CsrWifiEventCsrUint8Sizeof(void *msg)
|
|
|
|
{
|
|
|
|
return 3;
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint8Sizeof);
|
|
|
|
|
2012-07-20 18:51:01 +00:00
|
|
|
u8* CsrWifiEventCsrUint8Ser(u8 *ptr, CsrSize *len, void *msg)
|
2012-06-19 23:15:42 +00:00
|
|
|
{
|
|
|
|
CsrWifiEventCsrUint8 *primitive = (CsrWifiEventCsrUint8 *)msg;
|
|
|
|
*len = 0;
|
|
|
|
CsrUint16Ser(ptr, len, primitive->common.type);
|
|
|
|
CsrUint8Ser(ptr, len, primitive->value);
|
|
|
|
return(ptr);
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint8Ser);
|
|
|
|
|
|
|
|
|
2012-07-20 18:51:01 +00:00
|
|
|
void* CsrWifiEventCsrUint8Des(u8 *buffer, CsrSize length)
|
2012-06-19 23:15:42 +00:00
|
|
|
{
|
|
|
|
CsrWifiEventCsrUint8 *primitive = (CsrWifiEventCsrUint8 *) CsrPmemAlloc(sizeof(CsrWifiEventCsrUint8));
|
|
|
|
|
|
|
|
CsrSize offset = 0;
|
|
|
|
CsrUint16Des(&primitive->common.type, buffer, &offset);
|
|
|
|
CsrUint8Des(&primitive->value, buffer, &offset);
|
|
|
|
|
|
|
|
return primitive;
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint8Des);
|
|
|
|
|
|
|
|
|
|
|
|
CsrSize CsrWifiEventCsrUint16Sizeof(void *msg)
|
|
|
|
{
|
|
|
|
return 4;
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint16Sizeof);
|
|
|
|
|
|
|
|
|
2012-07-20 18:51:01 +00:00
|
|
|
u8* CsrWifiEventCsrUint16Ser(u8 *ptr, CsrSize *len, void *msg)
|
2012-06-19 23:15:42 +00:00
|
|
|
{
|
|
|
|
CsrWifiEventCsrUint16 *primitive = (CsrWifiEventCsrUint16 *)msg;
|
|
|
|
*len = 0;
|
|
|
|
CsrUint16Ser(ptr, len, primitive->common.type);
|
|
|
|
CsrUint16Ser(ptr, len, primitive->value);
|
|
|
|
return(ptr);
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint16Ser);
|
|
|
|
|
2012-07-20 18:51:01 +00:00
|
|
|
void* CsrWifiEventCsrUint16Des(u8 *buffer, CsrSize length)
|
2012-06-19 23:15:42 +00:00
|
|
|
{
|
|
|
|
CsrWifiEventCsrUint16 *primitive = (CsrWifiEventCsrUint16 *) CsrPmemAlloc(sizeof(CsrWifiEventCsrUint16));
|
|
|
|
|
|
|
|
CsrSize offset = 0;
|
|
|
|
CsrUint16Des(&primitive->common.type, buffer, &offset);
|
|
|
|
CsrUint16Des(&primitive->value, buffer, &offset);
|
|
|
|
|
|
|
|
return primitive;
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint16Des);
|
|
|
|
|
|
|
|
|
|
|
|
CsrSize CsrWifiEventCsrUint32Sizeof(void *msg)
|
|
|
|
{
|
|
|
|
return 6;
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint32Sizeof);
|
|
|
|
|
2012-07-20 18:51:01 +00:00
|
|
|
u8* CsrWifiEventCsrUint32Ser(u8 *ptr, CsrSize *len, void *msg)
|
2012-06-19 23:15:42 +00:00
|
|
|
{
|
|
|
|
CsrWifiEventCsrUint32 *primitive = (CsrWifiEventCsrUint32 *)msg;
|
|
|
|
*len = 0;
|
|
|
|
CsrUint16Ser(ptr, len, primitive->common.type);
|
|
|
|
CsrUint32Ser(ptr, len, primitive->value);
|
|
|
|
return(ptr);
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint32Ser);
|
|
|
|
|
|
|
|
|
2012-07-20 18:51:01 +00:00
|
|
|
void* CsrWifiEventCsrUint32Des(u8 *buffer, CsrSize length)
|
2012-06-19 23:15:42 +00:00
|
|
|
{
|
|
|
|
CsrWifiEventCsrUint32 *primitive = (CsrWifiEventCsrUint32 *) CsrPmemAlloc(sizeof(CsrWifiEventCsrUint32));
|
|
|
|
|
|
|
|
CsrSize offset = 0;
|
|
|
|
CsrUint16Des(&primitive->common.type, buffer, &offset);
|
|
|
|
CsrUint32Des(&primitive->value, buffer, &offset);
|
|
|
|
|
|
|
|
return primitive;
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint32Des);
|
|
|
|
|
|
|
|
CsrSize CsrWifiEventCsrUint16CsrUint8Sizeof(void *msg)
|
|
|
|
{
|
|
|
|
return 5;
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint16CsrUint8Sizeof);
|
|
|
|
|
2012-07-20 18:51:01 +00:00
|
|
|
u8* CsrWifiEventCsrUint16CsrUint8Ser(u8 *ptr, CsrSize *len, void *msg)
|
2012-06-19 23:15:42 +00:00
|
|
|
{
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
2012-07-20 18:51:01 +00:00
|
|
|
void* CsrWifiEventCsrUint16CsrUint8Des(u8 *buffer, CsrSize length)
|
2012-06-19 23:15:42 +00:00
|
|
|
{
|
|
|
|
CsrWifiEventCsrUint16CsrUint8 *primitive = (CsrWifiEventCsrUint16CsrUint8 *) CsrPmemAlloc(sizeof(CsrWifiEventCsrUint16CsrUint8));
|
|
|
|
|
|
|
|
CsrSize offset = 0;
|
|
|
|
CsrUint16Des(&primitive->common.type, buffer, &offset);
|
|
|
|
CsrUint16Des(&primitive->value16, buffer, &offset);
|
|
|
|
CsrUint8Des(&primitive->value8, buffer, &offset);
|
|
|
|
|
|
|
|
return primitive;
|
|
|
|
}
|
|
|
|
EXPORT_SYMBOL_GPL(CsrWifiEventCsrUint16CsrUint8Des);
|
|
|
|
|
|
|
|
|