# 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