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

//以下是为某些函数指针分配值. 有关详细信息,请参见有关设备驱动程序的书.
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);

退出:
返回错误;
}
静态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
超凡智慧