MT7615 datapath
# MT7615 datapath、发送、读 profile、Load MCU firmware
module_init(rt_pci_init_module)
rt_pci_init_module()
pci_module_init(&rt_pci_driver);
probe: rt_pci_probe,
rt_pci_probe()
/*PCIDevInit============================================== */
pci_enable_device()
pci_set_dma_mask()
pci_request_regions()
pci_set_master()
os_alloc_mem()
/*NetDevInit============================================== */
RtmpPhyNetDevInit() // 主要对网络设备初始化,对设备的operation进行赋值
pNetDevHook->open = MainVirtualIF_open; // ifconfig ra0 up
MainVirtualIF_open()
VIRTUAL_IF_UP()
.mt_wifi_open
RtmpOSIRQRequest(net_dev); // 开启硬件中断处理函数,主要 RX
request_irq()
mt_wifi_init() /*rename from rt28xx_init*/ // 主要设置 mac 以及数据帧处理定时器初始化, 读取配置文件和EEPROM就是在这个函数中
rtmp_sys_init()
RtmpMgmtTaskInit() // 注册管理帧kernel work
rtmp_cfg_init() // 读取配置文件.dat
RTMPReadParametersHook() // 读取参数
os_file_open()
os_file_read()
RTMPSetProfileParameters() // 根据 profile 设置参数
RTMPGetKeyParameter("MacAddress", tmpbuf, 25, pBuffer, TRUE) //Get key parameter. 以后自己若要实现 profile 文件读写,可以参考此函数的实现
RT_CfgSetMacAddress(pAd, tmpbuf,0) // 读取 profile 设置 MAC,但是default profile 没有 MAC 条目。应该是通过 bin 设置的。不过这里也实验成功,进一步说明这里的优先级比别处高,因为使用了这里的配置
os_file_close()
WfInit()
WfTopInit()
WfHifInit() // Load MCU firmware
WfMcuInit()
WfMcuSysInit()
RtmpNetTaskInit() // 注册数据包kernel work
WfEPROMInit()
WfEPROMSysInit()
NICReadEEPROMParameters() // 读取EEPROM // 读取AP_PROFILE_PATH_RBUS 中的配置参数,可以看作是hostapd.conf
WfMacInit()
WfPhyInit()
RT28xx_MBSS_Init() // 无线设置相关
RT28xx_WDS_Init()
RTMP_DRIVER_CFG80211_START()
RTMPDrvOpen() // 开启驱动底层,硬件相关的 tx rx,开启终端,打开硬件
pNetDevHook->xmit = rt28xx_send_packets; // 无线发包
rt28xx_send_packets()
rt28xx_packet_xmit()
RTMPSendPackets()
wdev_tx_pkts()
wdev->tx_pkt_allowed // = ApAllowToSendPacket() 检查目的mac是否是关联的设备,如果是就允许,不是就不允许
wdev->tx_pkt_handle // = APSendPacket()
RTMPDeQueuePacket()
_RTMPDeQueuePacket()
pTxBlk->wdev->wdev_hard_tx // = APHardTransmit // 发包函数
pci_set_drvdata()
/*All done, it's time to register the net device to linux kernel. */
RtmpOSNetDevAttach()
# 接收
rt2860_interrupt() // 接收,中断触发
RTMPHandleInterrupt()
rx_done_task()
rtmp_rx_done_handle()
rx_packet_process()
dev_rx_data_frm()
rx_data_frm_announce()
Indicate_Legacy_Packet()
Announce_or_Forward_802_3_Packet()
announce_802_3_packet()
RtmpOsPktRcvHandle()
netif_rx()
# Load EEPROM
/* Load param (MT7615_EEPROM.bin) */
RTMP_COM_IoctlHandle()
RTMPInitPCIeDevice()
pci_read_config_word(pci_dev, pConfig->ConfigDeviceID, &device_id); // 读配置空间中的 device_id=0x7615,pConfig->ConfigDeviceID:redister offset, Value: 16-bit value
rtmp_rlt_pci_chip_cfg()
DriverOwn()
HIF_IO_WRITE32(pAd, HIF_SYS_REV, 1); /* Write any value to HIF_SYS_REV clear FW own */
RtmpRaDevCtrlInit()
RtmpChipOpsRegister()
RtmpChipOpsHook()
WfSysPreInit()
mt7615_init()
mt7615_chipCap_init() // bin
mt7615_get_default_bin_image_file()
mt_chip_bcn_parameter_init(pAd); // configure beacon related parameters
UINT16 BcnMaxHwSize; /* hardware maximum beacon size */
Load MCU firmware
/* Load MCU firmware (WIFI_RAM_CODE_MT7615.bin) */
WfInit()
WfHifInit()
WfMcuInit()
WfMcuHwInit()
NICLoadFirmware()
ad->chipOps.loadFirmware(ad); // == AndesMTLoadFw()
AndesMTLoadFw()
AndesMTLoadFwMethodFwDlRing()
MtCmdFwScatters()
MtCmdFwScatter() // 一次最多发 4K。PCIe Spec