您好,欢迎来到星星旅游。
搜索
您的当前位置:首页Linux驱动之PCI驱动程序分析

Linux驱动之PCI驱动程序分析

来源:星星旅游
PCI网卡驱动程序分析

(国嵌)

1. 概述

该分析报告针对 GNIC-II的千兆以太网卡,源程序文件:drivers/net/hamachi.c,由于该分析报告旨在对介绍PCI驱动程序结构,所以程序中关于硬件操作的具体部分不作介绍。

2. 初始化

static int __init hamachi_init (void) { if (pci_register_driver(&hamachi_driver) > 0) return 0; pci_unregister_driver(&hamachi_driver); return -ENODEV; }

在模块初始化时采用pci_register_driver注册pci驱动程序。

static struct pci_driver hamachi_driver = { name: DRV_NAME, id_table: hamachi_pci_tbl, probe: hamachi_init_one, remove: __devexit_p(hamachi_remove_one), };

static struct pci_device_id hamachi_pci_tbl[] __initdata = { { 0x1318, 0x0911, PCI_ANY_ID, PCI_ANY_ID, },

}

该表记录的是该驱动能够支持的PCI设备,分别是厂商号,设备号,子厂商号,子设备号,其中子厂商号,子设备号为PCI_ANY_ID,表示支持各种子类型。 该表到底有什么实际用处?(通过分析函数pci_register_driver得出结论)

probe: hamachi_init_one (该函数的调用时机可通过分析pci_register_driver得出)

static int __init hamachi_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) { /* 使能PCI设备 */

if (pci_enable_device(pdev)) {

ret = -EIO; goto err_out; } /* 获取基地址 */

ioaddr = pci_resource_start(pdev, 0);

/* 申请将要使用的地址空间 */ i = pci_request_regions(pdev, DRV_NAME); if (i) return i; /* 获取中断号 */ irq = pdev->irq;

/* 思考为什么这里要使用ioremap? */ ioaddr = (long) ioremap(ioaddr, 0x400);

if (!ioaddr) goto err_out_release;

dev = alloc_etherdev(sizeof(struct hamachi_private)); if (!dev) goto err_out_iounmap; SET_MODULE_OWNER(dev); /* 硬件相关操作,省略 */

/* The Hamachi-specific entries in the device structure. */ dev->open = &hamachi_open;

dev->hard_start_xmit = &hamachi_start_xmit; dev->stop = &hamachi_close;

dev->get_stats = &hamachi_get_stats; dev->set_multicast_list = &set_rx_mode; dev->do_ioctl = &netdev_ioctl;

dev->tx_timeout = &hamachi_tx_timeout; dev->watchdog_timeo = TX_TIMEOUT; if (mtu) dev->mtu = mtu; i = register_netdev(dev); if (i) { ret = i; goto err_out_unmap_rx; }

/* Configure gigabit autonegotiation. */

writew(0x0400, ioaddr + ANXchngCtrl); /* Enable legacy links. */ writew(0x08e0, ioaddr + ANAdvertise); /* Set our advertise word. */ writew(0x1000, ioaddr + ANCtrl); card_idx++; return 0;

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- stra.cn 版权所有 赣ICP备2024042791号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务