1. 程式人生 > >《轉》atheros無線驅動之:系統初始化

《轉》atheros無線驅動之:系統初始化

轉自:http://blog.csdn.net/suiyuan19840208/article/details/17532049

1:atheros WLAN系統框圖

Atheros的驅動是應用於在類似如上圖的方案中的,可以不是很清楚但是可以看看如下的框


其中atheros主要的晶片有:AR9344、AR9341,AR9382,AR7240,AR7342(無wifi),交換晶片類AR8328/8337。

在雙頻率裝置中,第一張網絡卡wifi0基本上使用如AR9344、9341提供的2.4或者5.8G來實現,第二組網路wifi1是通過如上面的框圖顯示的有PCIE擴充套件而來,如使用:AR9382。
2:WLAN模組的載入

現在我們的驅動從PCIE介面類的網絡卡的初始化說起。此處的流程是當WLAN的驅動在載入的時候即insmod,可以在atheros提供的rc.wlan中可知在insmod和rmmod時操作的是那些模組。

載入時:

    insmod $MODULE_PATH/adf.ko

    insmod $MODULE_PATH/asf.ko

    insmod $MODULE_PATH/ath_hal.ko

    insmod $MODULE_PATH/ath_rate_atheros.ko

    insmod $MODULE_PATH/ath_spectral.ko$SPECTRAL_ARGS

    if [ "${AP_NO_A_BAND}" !="1" ]; then

        #load DFS if A band issupported,default is supported and set AP_NO_A_BAND=1 if not supported

        insmod $MODULE_PATH/ath_dfs.ko$DFS_ARGS

    fi

    insmod $MODULE_PATH/hst_tx99.ko

    insmod $MODULE_PATH/ath_dev.ko

    insmod $MODULE_PATH/umac.ko

    insmod $MODULE_PATH/wlan_me.ko

insmod $MODULE_PATH/ath_pktlog.ko

解除安裝時:

_ath_unload()

{

    rmmod wlan_scan_ap

    rmmod wlan_scan_sta

    rmmod ath_pktlog

    sleep 2

    rmmod wlan_me

    sleep 2

    rmmod umac

    sleep 2

    rmmod ath_dev

    rmmod hst_tx99

    rmmod ath_dfs

    rmmod ath_spectral

    rmmod ath_rate_atheros

    rmmod ath_hal

    rmmod asf

    rmmod adf

}
來看看當載入PCEI的介面時,初始化列印的資訊如下:此處使用的是9382擴充套件的5.8G的訊號

上面前面的資訊主要是在函式:init_ath_pci()中的
    if (pci_register_driver(&ath_pci_drv_id) < 0) { 此處進行的是PCI的註冊。
        printk("ath_pci: No devices found, driver not installed.\n");
        pci_unregister_driver(&ath_pci_drv_id);
#ifdef ATH_AHB
        pciret = -ENODEV;
#else
        return (-ENODEV);
#endif
    }
其中ath_pci_drv_id定義如下
//static struct pci_driver ath_pci_drv_id = {
struct pci_driver ath_pci_drv_id = {
    .name       = "ath_pci",
    .id_table   = ath_pci_id_table,
    .probe      = ath_pci_probe,
    .remove     = ath_pci_remove,
#ifdef ATH_BUS_PM
    .suspend    = ath_pci_suspend,
    .resume     = ath_pci_resume,

#endif /* ATH_BUS_PM */
    /* Linux 2.4.6 has save_state and enable_wake that are not used here */
};

在PCI的probe函式ath_pci_probe中有如下的程式碼:
    dev = alloc_netdev(sizeof(struct ath_pci_softc), "wifi%d", ether_setup);  //此處分別了裝置節點dev.
    if (dev == NULL) {
        printk(KERN_ERR "ath_pci: no memory for device state\n");
        goto bad2;
    }

    dev->type = ARPHRD_IEEE80211;
    if (__ath_attach(id->device, dev, &bus_context, &sc->aps_osdev) != 0)
        goto bad3;
    athname = ath_hal_probe(id->vendor, id->device);
    printk(KERN_INFO "%s: %s: mem=0x%lx, irq=%d hw_base=0x%p\n",
dev->name, athname ? athname : "Atheros ???", phymem, dev->irq,(void *)(((struct ath_softc *)(sc->aps_sc.sc_dev))->sc_ah->ah_sh));

    return 0;
上面可以知道呼叫函式__ath_attach(),此函式中attach了很多操作相關的處理函式。
其中網路裝置net_device的操作函式定義如下:
#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,30)
static const struct net_device_ops athdev_net_ops = {
    .ndo_open    = ath_netdev_open,
    .ndo_stop    = ath_netdev_stop,
    .ndo_start_xmit = ath_netdev_hardstart,
    .ndo_set_mac_address = ath_netdev_set_macaddr,
    .ndo_tx_timeout = ath_netdev_tx_timeout,
    .ndo_get_stats = ath_getstats,
    .ndo_change_mtu = ath_change_mtu,
    .ndo_set_multicast_list = ath_netdev_set_mcast_list,
    .ndo_do_ioctl = ath_ioctl,
};
#endif
PCI介面的wifi裝置在各層中attach了很多需要處理的函式,其貫穿整個WLAN驅動框架,


在atheros提供的驅動程式時封分層處理的,從下到上可以看到有:
HAL:Hardware Abstraction Layer (HAL):
Lower MAC (LMAC)
Upper MAC (UMAC)
OS Interface Layer (OSIF) 此處就不詳細說明了,其他地方再說。
    /*
     * Create an Atheros Device object
     */
    error = ath_dev_attach(devid, base_addr,ic, &net80211_ops, osdev,
                           &scn->sc_dev, &scn->sc_ops,scn->amem.handle,ath_conf_parm, hal_conf_parm);
其中ieee80211_ops定義很多對80211協議的特定處理函式。
    /*
     * ath_ops is stored per device instance because EDMA devices
     * have EDMA specific functions.
     */
    sc->sc_ath_ops = ath_ar_ops;
    *ops = &sc->sc_ath_ops;
其中ath_ar_ops;  定義了很多處理函式。這些函式太多,都是回撥函式。

上面是device在載入的過程中attach的各層的處理函式,同理當驅動rmmod的時候,做出相反動作,其函式的呼叫流程如下:

上面提到的中斷的申請與釋放:可以proc目錄下面看到系統申請的中斷。