打开= b44_open; dev-> stop = b44_close; dev-> hard_start_xmit = b44_start_xmit; dev-> ge" />

Broadcom网卡驱动程序代码分析说明(2)

电脑杂谈  发布时间:2020-03-19 21:12:51  来源:网络整理

网卡驱动代码_联想官网下载的网卡 驱动怎么安装_驱动人生5 网卡版

//以下是为某些函数指针分配值. 有关详细信息,请参见有关设备驱动程序的书.

dev->打开= b44_open;

dev-> stop = b44_close;

dev-> hard_start_xmit = b44_start_xmit;

dev-> get_stats = b44_get_stats;

dev-> set_multicast_list = b44_set_rx_mode;

dev-> set_mac_address = b44_set_mac_addr;

dev-> do_ioctl = b44_ioctl;

dev-> tx_timeout = b44_tx_timeout;

netif_napi_add(dev,&bp-> napi,b44_poll,64);

dev-> watchdog_timeo = B44_TX_TIMEOUT;

#ifdef CONFIG_NET_POLL_CONTROLLER

dev-> poll_controller = b44_poll_controller;

#endif

dev-> change_mtu = b44_change_mtu;

dev-> irq = sdev-> irq;

SET_ETHTOOL_OPS(dev,&b44_ethtool_ops);

netif_carrier_off(dev);

err = ssb_bus_powerup(sdev-> bus,0);

if(err){

dev_err(sdev-> dev,

“无法为总线加电\ n”);

转到err_out_free_dev;

}

err = ssb_dma_set_mask(sdev,DMA_30BIT_MASK);

if(err){

dev_err(sdev-> dev,

“系统不支持所需的30BIT DMA掩码. \ n”);

转到err_out_powerdown;

}

err = b44_get_invariants(bp);

if(err){

dev_err(sdev-> dev,

“问题获取芯片的不变式,正在中止. \ n”);

转到err_out_powerdown;

}

bp-> mii_if.dev = dev;

bp-> mii_if.mdio_read = b44_mii_read;

bp-> mii_if.mdio_write = b44_mii_write;

bp-> mii_if.phy_id = bp-> phy_addr;

bp-> mii_if.phy_id_mask = 0x1f;

bp-> mii_if.reg_num_mask = 0x1f;

bp->标志| =(B44_FLAG_ADV_10HALF | B44_FLAG_ADV_10FULL |

B44_FLAG_ADV_100HALF | B44_FLAG_ADV_100FULL);

bp->标志| = B44_FLAG_PAUSE_AUTO;

//注册net_device结构

err = register_netdev(dev);

if(err){

dev_err(sdev-> dev,“无法注册网络设备,正在中止. \ n”);

转到err_out_powerdown;

}

ssb_set_drvdata(sdev,dev);

b44_chip_reset(bp,B44_CHIP_RESET_FULL);

printk(KERN_INFO“%s: Broadcom 44xx / 47xx 10 / 100BaseT以太网%s \ n”,

dev->名称,print_mac(mac,dev-> dev_addr));

返回0;

err_out_powerdown:

ssb_bus_may_powerdown(sdev->总线);

err_out_free_dev:

free_netdev(dev);

网卡驱动代码_联想官网下载的网卡 驱动怎么安装_驱动人生5 网卡版

退出:

返回错误;

}

静态void __devexit b44_remove_one(结构ssb_device * sdev)

{

struct net_device * dev = ssb_get_drvdata(sdev);

unregister_netdev(dev);

ssb_bus_may_powerdown(sdev->总线);

free_netdev(dev);

ssb_pcihost_set_power_state(sdev,PCI_D3hot);

ssb_set_drvdata(sdev,NULL);

}

静态结构ssb_driver b44_ssb_driver = {

.name = DRV_MODULE_NAME,//模块名称

.id_table = b44_ssb_tbl,//模块ID表

.probe = b44_init_one,//探针用于初始化和注册netdev结构

.remove = __devexit_p(b44_remove_one),

.suspend = b44_suspend,

.resume = b44_resume,

};

//注册pci

静态内联int b44_pci_init(无效)

{

int err = 0;

#ifdef CONFIG_B44_PCI

err = ssb_pcihost_register(&b44_pci_driver);

#endif

返回错误;

}

//取消注册pci

静态内联void b44_pci_exit(无效)

{

#ifdef CONFIG_B44_PCI

ssb_pcihost_unregister(&b44_pci_driver);

#endif

}

//初始化功能,用于注册PCI设备和ssb驱动程序

static int __init b44_init(void)

{

//以下是dma的一些设置,这些设置已在设备驱动程序的书中介绍,我自己还没有看到.

unsigned int dma_desc_align_size = dma_get_cache_alignment();

int err;

dma_desc_align_mask =〜(dma_desc_align_size-1);

dma_desc_sync_size = max_t(无符号整数,dma_desc_align_size,sizeof(结构dma_desc));

err = b44_pci_init();

如果(错误)

返回错误;

err = ssb_driver_register(&b44_ssb_driver);

如果(错误)

b44_pci_exit();

返回错误;

}

静态void __退出b44_cleanup(无效)

{

ssb_driver_unregister(&b44_ssb_driver);

b44_pci_exit();

}

//设置模块加载时的初始化功能

module_init(b44_init);

//设置要在模块卸载时运行的功能

module_exit(b44_cleanup);


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-145256-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...