📄 cmdx500.cpp
字号:
if( IsFidBusy(offValue) || IsFidErr(offValue) )
return FALSE;
if( IsFidRdy(offValue) )
return TRUE;
}
//return !(IsFidBusy(offValue) || IsFidErr(offValue));
return TRUE;
}
void
BapMoveFidOffset(USHORT BAPOff, USHORT FidOffNew)
{
NdisRawWritePortUshort( BAPOff+BAPOFF_OFFSET_BAPX, FidOffNew );
}
BOOLEAN
XmitOpen(PCARD card, UINT param)
{
if( 0 == (card->m_fid = (FID)CQGetNextND(card->fidQ)) )
return FALSE;
if( ! BapSet(card, REG_BAPtx_SEL, card->m_fid, sizeof(TXFID_HDR) ) )
return FALSE;
NdisRawWritePortUshort(card->m_IOBase+REG_BAPtx_DATA, (USHORT)param-sizeof(HDR_802_3));
return TRUE;
}
BOOLEAN
XmitClose(PCARD card, UINT param)
{
card->m_cmd = CMD_X500_Transmit;
if( FALSE==exec( card, 600, card->m_fid ) ){
return FALSE;
}
fidCounter--;
CQUpdate(card->fidQ);
return TRUE;
}
FID
AllocNextFid(PCARD card)
{
#define PACKET_MAX_SIZE TX_BUF_SIZE
#define FRAME_X500_SIZE (PACKET_MAX_SIZE+sizeof(TXFID_HDR))
if ( FALSE == WaitLastCmd( card, 500000 ) ){
return NULL;
}
//WaitComplete();
USHORT us = (USHORT)FRAME_X500_SIZE;
card->m_cmd = CMD_X500_Allocate;
WriteCommand( card, us );
if( ! WaitComplete(card) ) {
CmdRestoreInterrupts(card);
return NULL;
}
#if 1
CMD_STATUS_X500 status = GetCmdStatus(card, (CMD_X500)card->m_cmd);
if( CMD_STATUS_SUCCESS != status ){
CmdRestoreInterrupts(card);
return NULL;
}
#endif
if( ! WaitAllocComplete(card) ) {
CmdRestoreInterrupts(card);
return NULL;
}
FID tmpFid;
NdisRawReadPortUshort( card->m_IOBase+REG_FID_TX_ALLOC, &tmpFid );
static TXFID_HDR txFidHdr = {{0,0,0,0,0x26,0,0,0}};
if( ! BapSet(card, REG_BAPtx_SEL, tmpFid, 0 ) ) {
CmdRestoreInterrupts(card);
return FALSE;
}
NdisRawWritePortBufferUshort(card->m_IOBase+REG_BAPtx_DATA, &txFidHdr, sizeof( TXFID_HDR )/2 );
CmdRestoreInterrupts(card);
AckAlloc(card);
return tmpFid;
}
//===========================================================================
BOOLEAN RidGet (PCARD card, USHORT m_RID, void *st, int dataLen)
//===========================================================================
//
// Description:
//
// Inputs:
//
// Returns:
//---------------------------------------------------------------------------
{
if (!WaitLastCmd(card, 100)) {
return FALSE;
}
card->m_cmd = CMD_X500_AccessRIDRead;
WriteCommand( card, m_RID ); // access RID read
if (!WaitComplete(card)) {
CmdRestoreInterrupts(card);
if (card->m_WasMacEnabled) {
cmdEnable(card);
}
return FALSE;
}
if(BapSet(card, REG_BAP1_SEL, m_RID)) {
ULONG size = dataLen/2;
if (dataLen&1) { //Account for Odd number of bytes spb010
size+=1;
UCHAR *buf=new UCHAR[size*2];
NdisRawReadPortBufferUshort(card->m_IOBase+REG_BAP1_DATA, buf, size);
memcpy(st,buf,dataLen);
delete buf;
}
else {
NdisRawReadPortBufferUshort(card->m_IOBase+REG_BAP1_DATA, st, size);
}
}
GetCmdStatus(card);
CmdRestoreInterrupts(card);
return TRUE;
}
//===========================================================================
BOOLEAN RidSet (PCARD card,
USHORT m_RID,
void *st,
int dataLen,
BOOLEAN macEnable)
//===========================================================================
//
// Description:
//
// Inputs:
//
// Returns:
//---------------------------------------------------------------------------
{
if (!WaitLastCmd(card, 100)) {
return FALSE;
}
if (card->m_WasMacEnabled) {
cmdDisable(card);
}
card->m_cmd = CMD_X500_AccessRIDRead;
WriteCommand(card, m_RID); // access RID read
if (!WaitComplete(card)) {
CmdRestoreInterrupts(card);
if (macEnable && card->m_WasMacEnabled) {
cmdEnable(card);
}
return FALSE;
}
if (BapSet(card, REG_BAP1_SEL, m_RID)) {
ULONG size = dataLen/2;
if (dataLen&1) { //Account for Odd number of bytes spb010
size+=1;
UCHAR *buf=new UCHAR [size*2];
memset(buf,0,size*2);
memcpy(buf,st,dataLen);
//spb017 Fixed this so it was a write port instead of read.
NdisRawWritePortBufferUshort(card->m_IOBase+REG_BAP1_DATA, buf, size);
delete buf;
}
else {
NdisRawWritePortBufferUshort(card->m_IOBase+REG_BAP1_DATA, st, size);
}
NdisRawWritePortUshort(card->m_IOBase+REG_CMD, CMD_X500_AccessRIDWrite);
card->m_PrevCmdDone = FALSE;
card->m_PrevCommand = CMD_X500_AccessRIDWrite;
if (!WaitComplete(card)) {
CmdRestoreInterrupts(card);
if (macEnable && card->m_WasMacEnabled) {
cmdEnable(card);
}
card->m_PrevCmdDone = TRUE;
return FALSE;
}
}
GetCmdStatus(card);
CmdRestoreInterrupts(card);
if (macEnable && card->m_WasMacEnabled) {
cmdEnable(card);
}
return TRUE;
}
BOOLEAN
RidSetIgnoreMAC(PCARD card, USHORT m_RID, void *st, int dataLen )
{
if( ! WaitLastCmd(card, 100) ) {
return FALSE;
}
card->m_cmd = CMD_X500_AccessRIDRead;
WriteCommand( card, m_RID ); // access RID read
if( ! WaitComplete(card) ){
return FALSE;
}
if( BapSet(card, REG_BAP1_SEL, m_RID ) ){
ULONG size = dataLen/2 + (1&dataLen);
NdisRawWritePortBufferUshort( card->m_IOBase+REG_BAP1_DATA, st, size );
NdisRawWritePortUshort( card->m_IOBase+REG_CMD, CMD_X500_AccessRIDWrite );
card->m_PrevCmdDone = FALSE;
card->m_PrevCommand = CMD_X500_AccessRIDWrite;
if( ! WaitComplete(card, 30 * 1000000) ){
card->m_PrevCmdDone = TRUE;
CmdRestoreInterrupts(card);
return FALSE;
}
}
GetCmdStatus(card);
CmdRestoreInterrupts(card);
return TRUE;
}
//===========================================================================
BOOLEAN cmdEnable (PCARD card)
//===========================================================================
//
// Description: Enable the radio. Also set flag in card indicating that
// we're enabled.
//
// Inputs: card - pointer to card structure.
//
// Returns: TRUE if successful, false otherwise.
//---------------------------------------------------------------------------
{
card->m_cmd = CMD_X500_EnableAll;
exec(card, 1000);
return (card->m_WasMacEnabled = card->m_IsMacEnabled = WaitComplete(card));
};
//===========================================================================
BOOLEAN cmdDisable (PCARD card)
//===========================================================================
//
// Description: Disable the radio. Also set flag in card indicating that
// we're disabled.
//
// Inputs: card - pointer to card structure.
//
// Returns: TRUE if successful, false otherwise.
//---------------------------------------------------------------------------
{
card->m_cmd = CMD_X500_Disable;
exec(card, 1000);
if( WaitComplete(card) ) {
card->m_IsMacEnabled = FALSE;
//spb009
if (NDIS_STATUS_MEDIA_CONNECT == card->m_MSenceStatus) {
#if DBG
DbgPrint("Sending NDIS_STATUS_MEDIA_DISCONNECT--\n");
#endif
card->IsAssociated = FALSE; //We are No Longer Associated
card->m_MSenceStatus = NDIS_STATUS_MEDIA_DISCONNECT;
#ifndef UNDER_CE
NdisMIndicateStatus(card->m_MAHandle, card->m_MSenceStatus, 0, 0 );
NdisMIndicateStatusComplete(card->m_MAHandle);
#else
//
// Shouldn't indicate if we get here from HaltHandler()..
// Ndis ASSERT.
//
if (!card->bHalting)
{
NdisMIndicateStatus(card->m_MAHandle, card->m_MSenceStatus, 0, 0 );
NdisMIndicateStatusComplete(card->m_MAHandle);
}
#endif
}
return TRUE;
}
return FALSE;
}
//===========================================================================
BOOLEAN cmdBssidListScan (PCARD card)
//===========================================================================
//
// Description: Have the radio perform a BSSID list scan.
//
// Inputs: card - pointer to card structure.
//
// Returns:
//
// (01/29/01)
//---------------------------------------------------------------------------
{
card->m_cmd = CMD_X500_BssidListScan;
return exec(card, 1000);
}
BOOLEAN
cmdSetOpMode( PCARD card, USHORT param )
{
card->m_cmd = CMD_X500_SetOperationMode;
exec(card, 1000, param );
return WaitComplete(card, 100000 ); // wait up to 100 ms
};
//========================================================================
BOOLEAN
cmdConfigGet(PCARD card, CFG_X500 * cfg)
{
return RidGet(card, RID_CONFIG, cfg, sizeof(CFG_X500));
}
BOOLEAN
cmdConfigSet(PCARD card, CFG_X500 * cfg, BOOLEAN macEnable)
{
if( NULL == cfg ) {
cfg = &card->m_activeProfile->zFlags.cfg;
}
else {
card->m_activeProfile->zFlags.cfg = *cfg;
}
//spb v7.37 Per Ned.
if (0 == (cfg->OpMode & 0x00FF)) {
//Adhoc
CFG_X500 tmp;
NdisMoveMemory(&tmp,cfg,sizeof(CFG_X500));
//Make sure the ATIM is always 0
tmp.AtimDuration = 0;
return RidSet(card, RID_CONFIG, &tmp, sizeof(CFG_X500), macEnable );
}
else {
return RidSet(card, RID_CONFIG, cfg, sizeof(CFG_X500), macEnable );
}
}
//========================================================================
BOOLEAN cmdSSIDGet(PCARD card, STSSID * ssid)
{
return RidGet(card, RID_SSID, ssid, sizeof(STSSID) );
}
BOOLEAN cmdSSIDSet(PCARD card, STSSID * ssid, BOOLEAN macEnable)
{
if( NULL == ssid ) {
ssid = &card->m_activeProfile->zFlags.SSIDList;
}
else {
card->m_activeProfile->zFlags.SSIDList = *ssid;
}
return RidSet(card, RID_SSID, ssid, sizeof(STSSID), macEnable ) ;
}
//========================================================================
BOOLEAN cmdAPsGet(PCARD card, STAPLIST *aps)
{
return RidGet(card, RID_APP, aps, sizeof(STAPLIST));
}
BOOLEAN cmdAPsSet(PCARD card, STAPLIST *aps, BOOLEAN macEnable)
{
if( NULL == aps ) {
aps = &card->m_activeProfile->zFlags.APList;
}
else {
card->m_activeProfile->zFlags.APList = *aps;
}
return RidSet(card, RID_APP, aps, sizeof(STAPLIST), macEnable );
}
//========================================================================
BOOLEAN
cmdCapsGet(PCARD card,STCAPS *cap )
{
return RidGet(card, RID_CAP, cap, sizeof(STCAPS) );
}
BOOLEAN
cmdCapsSet(PCARD card,STCAPS *cap )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -