什么是 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 (将#修改为@)