mtkwifidriver驱动的分析

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

管理篇

接收到扫描完毕

nicRxSDIOAggReceiveRFBs

sdio有两个通道,两个通道获取数据的流程是一样的,

1)通过prEnhDataStr->rRxInfo.u.u2NumValidRx0Len可以获取到该通道目前存储有多少数据包,通道数据包的存储量只有16个,如果超过16个则是固件问题,跳过看下一个通道的2)然后获取当前freeswrfb空闲空间是否够用,不够用则看下一个通道的。

3)可接收的聚合报文(管理帧)长度(u4RxAvailAggLen)为2352

4)循环遍历某个通道的报文,读到报文长度+4 然后按照4个字节对齐从u4RxAvailAggLen 扣减掉。如果空间不够则跳出。

5)遍历完之后用2352减去u4RxAvailAggLen 可以得到总的数据长度通过dma获取数据到prRxCtrl->pucRxCoalescingBufPtr中

1)6)遍历通道中报文数,把每个报文拷贝到prSwRfb->pucRecvBuff中,并且填充prSwRfb->ucPacketType和prSwRfb->ucStaRecIdx

2)nicRxSetupRFB

3)如果prSwRfb->pvPacket为空,则先将prSwRfb置成0,然后按照2352分配sk_buff,prSwRfb->pucRecvBuff指向skb->data,prSwRfb->pvPacket指向skb

1)同时,prSwRfb->prHifRxHdr指向skb->data首部。

2)nicRxFillRFB

3)从prHifRxHdr->ucHerderLenOffset获取出header的offset和MACHeaderLen

4)设置prSwRfb->pvHeader指向skb->data越过prHifRxHdr + HIF_RX_HDR_SIZE + u4Heade

rOffset,指向的将是beacon帧结构

5)重置prSwRfb->u2HeaderLen=u4MacHeaderLen 和prSwRfb->u2PacketLen为原来skb->dat

a长度减去(HIF_RX_HDR_SIZE + u4HeaderOffset)

MacHeader 如下图:

nicAddScanResult

该函数分为replace和add部分,先讲解add部分

Add

1)如果prAdapter->rWlanInfo.u4ScanResultNum小于63则继续往下走

2)先将prAdapter->rWlanInfo.arScanResult[i]到aucIE之前的部分设置为0

3)设置prAdapter->rWlanInfo.arScanResult[i].u4Length为aucIE之前的部分的长度+IE的长度4)拷贝mac地址到prAdapter->rWlanInfo.arScanResult[i].arMacAddress

5)拷贝ssid到prAdapter->rWlanInfo.arScanResult[i].rSsid.aucSsid

6)设置u4Privacy、rRssi、eNetworkTypeInUse、eOpMode等

7)拷贝prConfiguration到prAdapter->rWlanInfo.arScanResult[i].rConfiguration中

8)拷贝rSupportedRates到prAdapter->rWlanInfo.arScanResult[i].rSupportedRates中

9)拷贝u2IELength到prAdapter->rWlanInfo.arScanResult[i].u4IELength

10)如果u2IELength大于0 则检查aucScanIEBuf是否够放下当前bssdesc的IE部分,如果可

以的话,则拷贝到aucScanIEBuf[prAdapter->rWlanInfo.u4ScanIEBufferUsage],然后设置指针到apucScanResultIEs[i]中,接下来重置u4ScanIEBufferUsage的值。

如果空间不够的话,则将arScanResult[i].u4Length、u4IELength、apucScanResultIEs[i]设置为0.

如果u2IELength不大于0,则设置apucScanResultIEs[i] = NULL;

11)prAdapter->rWlanInfo.u4ScanResultNum++;

如果当前已经没有空间存储了,则考虑替换rssi最弱的那个ap authCheckRxAuthFrameTransSeq

1)该函数先判断该报文是否是正确的,评判标准就是:如果报文总长度扣掉报文头所剩下的空驾大于6(auth algorithm+auth seq num+status code)

这三个字段是必备的意思。

获取auth seq num 来判断该数据包是属于auth request(1和3)还是auth response(2和4)

saaFsmRunEventRxAuth(处理auth response的包函数)

aaaFsmRunEventRxAuth (处理auth request的包函数aaa指authentication,authorization,and accountingservices即认证授权计费系统)

kalEnqueueCommand的cmd最后会由这边来执行wlanProcessCommandQueue mboxRcvAllMsg

上层下发scan指令流程分析

mtk_cfg80211_scan

1)首先先查看下当前是否有在扫描的请求,如果有,则直接退出,通过变量prGlueInfo->p rScanRequest来进行判断

2)通过对request进行判断分解请求

a.分解ssid,如果请求ssid的个数为1,则将ssid拷贝到rScanRequest的ssid中,如果

大于1则直接退出,如果为0,则将rScanRequest.rSsid.u4SsidLen为0;

b.分解IE,如果ie_len大于0,则将rScanRequest.pucIE指向request中的ie,并且置为u

4IELength为0

3)通过kalioctl进行发送wlanoidSetBssidListScanExt参数为rScanRequest

Kalioctl 触发流程:

将相关参数组装成prIoReq中,之后唤醒tx_thread来处理OID,然后等待执行结束,在tx_t hread中会调用wlanSetInformation或者wlanQueryInformation,不过这两部分的操作,最后都会调用prIoReq中的回调函数,

相关文档
最新文档