如何解决什么是 SET_NETDEV_DEV 函数是它是否使“pci_dev”成为“net_device”的父级它有什么作用 RealTek
在以太网驱动程序的 RealTek 设备驱动程序中,它执行类似的操作
SET_NETDEV_DEV(net_dev_obj,&pci_dev_obj->dev);
上一行意味着为什么 pci_dev 必须是 net_device 的父级。 net_device 可以是 pci_dev 的父级吗
在上面的驱动程序做类似的事情之前
dev = devm_alloc_etherdev(&pci_dev_obj->dev,sizeof (*my_struct_obj));
my_struct_obj
是我的结构,在 realTek 的 r8169 驱动程序中它定义为
struct my_struct_obj
{
void __iomem *mmio_addr; /* memory map physical address */
struct pci_dev *pci_dev;
struct net_device *dev;
struct phy_device *phydev;
struct napi_struct napi;
enum mac_version mac_version;
u32 cur_rx; /* Index into the Rx descriptor buffer of next Rx pkt. */
u32 cur_tx; /* Index into the Tx descriptor buffer of next Rx pkt. */
u32 dirty_tx;
struct rtl8169_stats rx_stats;
struct rtl8169_stats tx_stats;
struct TxDesc *TxDescArray; /* 256-aligned Tx descriptor ring */
struct RxDesc *RxDescArray; /* 256-aligned Rx descriptor ring */
dma_addr_t TxPhyAddr;
dma_addr_t RxPhyAddr;
struct page *Rx_databuff[NUM_RX_DESC]; /* Rx data buffers */
struct ring_info tx_skb[NUM_TX_DESC]; /* Tx data buffers */
u16 cp_cmd;
u32 irq_mask;
struct clk *clk;
struct {
DECLARE_BITMAP(flags,RTL_FLAG_MAX);
struct work_struct work;
} wk;
unsigned supports_gmii:1;
unsigned aspm_manageable:1;
dma_addr_t counters_phys_addr;
struct rtl8169_counters *counters;
struct rtl8169_tc_offsets tc_offset;
u32 saved_wolopts;
int eee_adv;
const char *fw_name;
struct rtl_fw *rtl_fw;
u32 ocp_base;
};
这是什么意思dev = devm_alloc_etherdev(&pci_dev_obj->dev,sizeof (*my_struct_obj));
在 Linux Device Drivers 一书中,它谈到了 alloc_netdev(int sizeof_my_struct_object,name,void (*setup(struct net_device *)))
由于 alloc_netdev
听起来像是在 RAM 中分配网络驱动程序内存空间,而 devm_alloc_etherdev
也与此有关,但我的问题是为什么 devm_alloc_etherdev(dev,sizeof(my_struct_object))
确实需要 net_device 和 sizeof
my_object 作为参数,它不应该要求 my_struct_object
作为它的第一个参数。
我假设 devm_alloc_etherdev
将 net_device 的私有数据(这是它的第一个参数:net_device)分配给 my_struct_object 的大小。如果这是真的,请确认。
任何连接都有助于 my_struct_object
、pci_dev 和 net_device 如何相互连接。我只知道
简而言之,告诉我什么是
dev = devm_alloc_etherdev(&pdev->dev,sizeof (*tp));
和
SET_NETDEV_DEV(dev,&pdev->dev);
为什么它们很重要
或
是 SET_NETDEV_DEV 将 pci_dev 连接到 net_device
和
devm_alloc_etherdev 将 pci_dev 连接到 my_struct_object 如何因为它只需要参数的大小
这些是后面的行
my_struct_object = netdev_priv(dev);
my_struct_object->dev = dev;
my_struct_object->pci_dev = pdev;
以上三行不应该只有我在问题中提到的前两行。以下是完整代码
net_device_obj = devm_alloc_etherdev(&pci_dev_obj->dev,sizeof (*my_struct_obj));
SET_NETDEV_DEV(net_dev_obj,&pci_dev_obj->dev);
my_struct_object = netdev_priv(dev);
my_struct_object->dev = dev;
my_struct_object->pci_dev = pdev;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。