当前位置: 首页 > news >正文

qca wlan wifi modules解析二

wifi驱动使用是PCI总线,首先从pci设备注册开始: os/linux/src/if_ath_pci.c 文件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定义如下

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;
}


if (__ath_attach(id->device, dev, &bus_context, &sc->aps_osdev) != 0)
    goto bad3;
复制代码

调用流程如下图:

函数__ath_attach(),此函数中attach了很多操作相关的处理函数

dev->netdev_ops = &athdev_net_ops;
复制代码

athdev_net_ops是ath网络接口的结构体, PCI接口的wifi设备在各层中attach了很多需要处理的函数,其贯穿整个WLAN驱动框架, 定义如下:

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,
#if LINUX_VERSION_CODE < KERNEL_VERSION(3,2,0)
    .ndo_set_multicast_list = ath_netdev_set_mcast_list,
#else
    .ndo_set_rx_mode = ath_netdev_set_mcast_list,
#endif
    .ndo_do_ioctl = ath_ioctl,
};
复制代码

ath_attachath_dev_attachnet80211_ops实现了ieee80211_ops各种操作:

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);

复制代码

ath_attachosif_attach(dev);初始化OSIF层的操作: ath_dev_attach实现了ath_ops操作,既: ath_ar_opsath_attach 中, device在加载的过程中attach的各层的处理函数 :


    #ifdef ADF_SUPPORT
    ATH_INIT_TQUEUE(&osdev->intr_tq, (adf_os_defer_fn_t)ath_tasklet, (void*)dev);
    #else
   ATH_INIT_TQUEUE(&osdev->intr_tq, ath_tasklet, dev);
    #endif
    ...
    
    error = request_irq(dev->irq, ath_isr, IRQF_DISABLED, dev->name, dev);
    
    ...
    
    /*
     * finally register netdev and ready to go
     */
    if ((error = register_netdev(dev)) != 0) {
        printk(KERN_ERR "%s: unable to register device\n", dev->name);
        goto bad4;
    }

复制代码

以上反操作流程如下:

相关文章:

  • 结合 Laravel 初步学习 GraphQL
  • 实验三 类与对象(zxt)
  • 翻译:DECLARE HANDLER语句(已提交到MariaDB官方手册)
  • 窥探Node.js里的Stream
  • 给mybatis添加自动建表,自动加字段的功能
  • 如何夯实(Java)编程基础,并深入学习和提高
  • 大话测试与质量
  • 文顶顶虽老,博客尚在
  • BZOJ3998:[TJOI2015]弦论——题解
  • 3、第一个Appium测试
  • 【代码片段】Python发送带图片的邮件
  • @Autowired @Resource @Qualifier的区别
  • 区块链学习路线
  • Activity事件分发机制
  • ListT常用操作函数
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • [笔记] php常见简单功能及函数
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • crontab执行失败的多种原因
  • CSS中外联样式表代表的含义
  • ES6核心特性
  • JavaScript类型识别
  • log4j2输出到kafka
  • Mac转Windows的拯救指南
  • Making An Indicator With Pure CSS
  • mysql innodb 索引使用指南
  • PAT A1120
  • Redis中的lru算法实现
  • 从零开始学习部署
  • 搭建gitbook 和 访问权限认证
  • 构建二叉树进行数值数组的去重及优化
  • 蓝海存储开关机注意事项总结
  • 聊聊hikari连接池的leakDetectionThreshold
  • 码农张的Bug人生 - 初来乍到
  • 前端之React实战:创建跨平台的项目架构
  • 小程序开发之路(一)
  • 最近的计划
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ###C语言程序设计-----C语言学习(3)#
  • (07)Hive——窗口函数详解
  • (14)Hive调优——合并小文件
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (第27天)Oracle 数据泵转换分区表
  • (定时器/计数器)中断系统(详解与使用)
  • (二)windows配置JDK环境
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (学习日记)2024.02.29:UCOSIII第二节
  • (原)本想说脏话,奈何已放下
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)四层和七层负载均衡的区别
  • **PHP二维数组遍历时同时赋值