📄 rtmp_init.c
字号:
pAd->WlanCounters.FCSErrorCount.vv.HighPart++;
// Add FCS error count to private counters
OldValue = pAd->RalinkCounters.RealFcsErrCount.vv.LowPart;
pAd->RalinkCounters.RealFcsErrCount.vv.LowPart += StaCsr0.field.CrcErr;
if (pAd->RalinkCounters.RealFcsErrCount.vv.LowPart < OldValue)
pAd->RalinkCounters.RealFcsErrCount.vv.HighPart++;
// Update False CCA counter
RTUSBReadMACRegister(pAd, STA_CSR1, &StaCsr1.word);
pAd->RalinkCounters.OneSecFalseCCACnt += StaCsr1.field.FalseCca;
// Update RX Overflow counter
RTUSBReadMACRegister(pAd, STA_CSR2, &StaCsr2.word);
pAd->Counters8023.RxNoBuffer += (StaCsr2.field.RxOverflowCount + StaCsr2.field.RxFifoOverflowCount);
// Update BEACON sent count
RTUSBReadMACRegister(pAd, STA_CSR3, &StaCsr3.word);
pAd->RalinkCounters.OneSecBeaconSentCnt += StaCsr3.field.TxBeaconCount;
RTUSBReadMACRegister(pAd, STA_CSR4, &StaCsr4.word);
RTUSBReadMACRegister(pAd, STA_CSR5, &StaCsr5.word);
// 1st - Transmit Success
OldValue = pAd->WlanCounters.TransmittedFragmentCount.vv.LowPart;
pAd->WlanCounters.TransmittedFragmentCount.vv.LowPart += (StaCsr4.field.TxOneRetryCount + StaCsr4.field.TxNoRetryCount + StaCsr5.field.TxMultiRetryCount);
if (pAd->WlanCounters.TransmittedFragmentCount.vv.LowPart < OldValue)
{
pAd->WlanCounters.TransmittedFragmentCount.vv.HighPart++;
}
// 2rd -success and no retry
OldValue = pAd->WlanCounters.RetryCount.vv.LowPart;
pAd->WlanCounters.NoRetryCount.vv.LowPart += StaCsr4.field.TxNoRetryCount;
if (pAd->WlanCounters.NoRetryCount.vv.LowPart < OldValue)
{
pAd->WlanCounters.NoRetryCount.vv.HighPart++;
}
// 3rd -success and retry
OldValue = pAd->WlanCounters.RetryCount.vv.LowPart;
pAd->WlanCounters.RetryCount.vv.LowPart += (StaCsr4.field.TxOneRetryCount +StaCsr5.field.TxMultiRetryCount);
if (pAd->WlanCounters.RetryCount.vv.LowPart < OldValue)
{
pAd->WlanCounters.RetryCount.vv.HighPart++;
}
// 4th - fail
OldValue = pAd->WlanCounters.FailedCount.vv.LowPart;
pAd->WlanCounters.FailedCount.vv.LowPart += StaCsr5.field.TxRetryFailCount;
if (pAd->WlanCounters.FailedCount.vv.LowPart < OldValue)
{
pAd->WlanCounters.FailedCount.vv.HighPart++;
}
pAd->RalinkCounters.OneSecTxNoRetryOkCount = StaCsr4.field.TxNoRetryCount;
pAd->RalinkCounters.OneSecTxRetryOkCount = StaCsr4.field.TxOneRetryCount + StaCsr5.field.TxMultiRetryCount;
pAd->RalinkCounters.OneSecTxFailCount = StaCsr5.field.TxRetryFailCount;
pAd->RalinkCounters.OneSecFalseCCACnt = StaCsr1.field.FalseCca;
pAd->RalinkCounters.OneSecRxOkCnt = pAd->RalinkCounters.RxCount;
pAd->RalinkCounters.RxCount = 0; //Reset RxCount
pAd->RalinkCounters.OneSecRxFcsErrCnt = StaCsr0.field.CrcErr;
pAd->RalinkCounters.OneSecBeaconSentCnt = StaCsr3.field.TxBeaconCount;
}
/*
========================================================================
Routine Description:
Reset NIC from error
Arguments:
Adapter Pointer to our adapter
Return Value:
None
Note:
Reset NIC from error state
========================================================================
*/
VOID NICResetFromError(
IN PRTMP_ADAPTER pAd)
{
NICInitializeAsic(pAd);
#ifdef INIT_FROM_EEPROM
NICInitAsicFromEEPROM(pAd);
#endif
RTUSBWriteHWMACAddress(pAd);
}
/*
========================================================================
Routine Description:
Load 8051 firmware RT2561.BIN file into MAC ASIC
Arguments:
Adapter Pointer to our adapter
Return Value:
NDIS_STATUS_SUCCESS firmware image load ok
NDIS_STATUS_FAILURE image not found
========================================================================
*/
NDIS_STATUS NICLoadFirmware(
IN PRTMP_ADAPTER pAd)
{
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
PUCHAR src = NULL;
struct file *srcf;
INT retval = 0, orgfsuid, orgfsgid, i;
mm_segment_t orgfs;
PUCHAR pFirmwareImage;
UINT FileLength = 0;
INT ret;
DBGPRINT(RT_DEBUG_TRACE,"--> NICLoadFirmware\n");
pAd->FirmwareVersion = (FIRMWARE_MAJOR_VERSION << 8) + FIRMWARE_MINOR_VERSION; //default version.
src = RT2573_IMAGE_FILE_NAME;
// Save uid and gid used for filesystem access.
// Set user and group to 0 (root)
orgfsuid = current->fsuid;
orgfsgid = current->fsgid;
current->fsuid=current->fsgid = 0;
orgfs = get_fs();
set_fs(KERNEL_DS);
pFirmwareImage = kmalloc(MAX_FIRMWARE_IMAGE_SIZE, MEM_ALLOC_FLAG);
if (pFirmwareImage == NULL)
{
DBGPRINT(RT_DEBUG_ERROR, "NICLoadFirmware-Memory allocate fail\n");
Status = NDIS_STATUS_FAILURE;
goto out;
}
if (src && *src)
{
srcf = filp_open(src, O_RDONLY, 0);
if (IS_ERR(srcf))
{
Status = NDIS_STATUS_FAILURE;
DBGPRINT(RT_DEBUG_ERROR, "--> Error %ld opening %s\n", -PTR_ERR(srcf),src);
}
else
{
// The object must have a read method
if (srcf->f_op && srcf->f_op->read)
{
memset(pFirmwareImage, 0x00, MAX_FIRMWARE_IMAGE_SIZE);
FileLength = srcf->f_op->read(srcf, pFirmwareImage, MAX_FIRMWARE_IMAGE_SIZE, &srcf->f_pos);
if (FileLength != MAX_FIRMWARE_IMAGE_SIZE)
{
DBGPRINT_ERR("NICLoadFirmware: error file length (=%d) in rt73.bin\n",FileLength);
Status = NDIS_STATUS_FAILURE;
}
else
{ //FileLength == MAX_FIRMWARE_IMAGE_SIZE
PUCHAR ptr = pFirmwareImage;
USHORT crc = 0;
for (i=0; i<(MAX_FIRMWARE_IMAGE_SIZE-2); i++, ptr++)
crc = ByteCRC16(*ptr, crc);
crc = ByteCRC16(0x00, crc);
crc = ByteCRC16(0x00, crc);
if ((pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-2] != (UCHAR)(crc>>8)) ||
(pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-1] != (UCHAR)(crc)))
{
DBGPRINT_ERR("NICLoadFirmware: CRC = 0x%02x 0x%02x error, should be 0x%02x 0x%02x\n",
pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-2], pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-1],
(UCHAR)(crc>>8), (UCHAR)(crc) );
if (retval)
{
DBGPRINT(RT_DEBUG_ERROR, "--> Error %d closing %s\n", -retval, src);
}
Status = NDIS_STATUS_FAILURE;
}
else
{
if ((pAd->FirmwareVersion) > ((pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-4] << 8) + pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-3]))
{
DBGPRINT_ERR("NICLoadFirmware: Ver=%d.%d, local Ver=%d.%d, used FirmwareImage talbe instead\n",
pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-4], pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-3],
FIRMWARE_MAJOR_VERSION, FIRMWARE_MINOR_VERSION);
Status = NDIS_STATUS_FAILURE;
}
else
{
pAd->FirmwareVersion = (pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-4] << 8) + pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-3];
DBGPRINT(RT_DEBUG_TRACE,"NICLoadFirmware OK: CRC = 0x%04x ver=%d.%d\n", crc,
pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-4], pFirmwareImage[MAX_FIRMWARE_IMAGE_SIZE-3]);
}
}
}
}
else
{
Status = NDIS_STATUS_FAILURE;
DBGPRINT(RT_DEBUG_ERROR, "--> %s does not have a write method\n", src);
}
retval = filp_close(srcf, NULL);
if (retval)
{
Status = NDIS_STATUS_FAILURE;
DBGPRINT(RT_DEBUG_ERROR, "--> Error %d closing %s\n", -retval, src);
}
}
}
else
{
Status = NDIS_STATUS_FAILURE;
DBGPRINT(RT_DEBUG_ERROR, "Error src not available\n");
}
if (Status != NDIS_STATUS_SUCCESS)
{
FileLength = FIRMAREIMAGE_LENGTH;
memset(pFirmwareImage, 0x00, FileLength);
NdisMoveMemory(pFirmwareImage, &FirmwareImage[0], FileLength);
Status = NDIS_STATUS_SUCCESS; // change to success
DBGPRINT(RT_DEBUG_ERROR, "NICLoadFirmware failed, used local Firmware(v %d.%d) instead\n",
FIRMWARE_MAJOR_VERSION, FIRMWARE_MINOR_VERSION);
}
// select 8051 program bank; write entire firmware image
for (i = 0; i < FileLength; i = i + 4)
{
ret = RTUSBMultiWrite(pAd, FIRMWARE_IMAGE_BASE + i, pFirmwareImage + i, 4);
if (ret < 0)
{
Status = NDIS_STATUS_FAILURE;
break;
}
}
out:
if (pFirmwareImage != NULL)
kfree(pFirmwareImage);
set_fs(orgfs);
current->fsuid = orgfsuid;
current->fsgid = orgfsgid;
if (Status == NDIS_STATUS_SUCCESS)
{
RTUSBFirmwareRun(pAd);
//
// Send LED command to Firmare after RTUSBFirmwareRun;
//
RTMPSetLED(pAd, LED_LINK_DOWN);
}
DBGPRINT(RT_DEBUG_TRACE,"<-- NICLoadFirmware (src=%s)\n", src);
return Status;
}
/*
========================================================================
Routine Description:
Find key section for Get key parameter.
Arguments:
buffer Pointer to the buffer to start find the key section
section the key of the secion to be find
Return Value:
NULL Fail
Others Success
========================================================================
*/
PUCHAR RTMPFindSection(
IN PCHAR buffer)
{
CHAR temp_buf[255];
PUCHAR ptr;
strcpy(temp_buf, "["); /* and the opening bracket [ */
strcat(temp_buf, "Default");
strcat(temp_buf, "]");
if((ptr = rtstrstr(buffer, temp_buf)) != NULL)
return (ptr+strlen("\n"));
else
return NULL;
}
/**
* strstr - Find the first substring in a %NUL terminated string
* @s1: The string to be searched
* @s2: The string to search for
*/
char * rtstrstr(const char * s1,const char * s2)
{
INT l1, l2;
l2 = strlen(s2);
if (!l2)
return (char *) s1;
l1 = strlen(s1);
while (l1 >= l2)
{
l1--;
if (!memcmp(s1,s2,l2))
return (char *) s1;
s1++;
}
return NULL;
}
/**
* rstrtok - Split a string into tokens
* @s: The string to be searched
* @ct: The characters to search for
* * WARNING: strtok is deprecated, use strsep instead. However strsep is not compatible with old architecture.
*/
char * __rstrtok;
char * rstrtok(char * s,const char * ct)
{
char *sbegin, *send;
sbegin = s ? s : __rstrtok;
if (!sbegin)
{
return NULL;
}
sbegin += strspn(sbegin,ct);
if (*sbegin == '\0')
{
__rstrtok = NULL;
return( NULL );
}
send = strpbrk( sbegin, ct);
if (send && *send != '\0')
*send++ = '\0';
__rstrtok = send;
return (sbegin);
}
/*
========================================================================
Routine Description:
Get key parameter.
Arguments:
key Pointer to key string
dest Pointer to destination
destsize The datasize of the destination
buffer Pointer to the buffer to start find the key
Return Value:
TRUE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -