zoukankan      html  css  js  c++  java
  • PCI在linux系统中注册与注销示例

    1. pci_driver结构
    struct pci_driver {
        struct list_head node;
        const char *name;
        const struct pci_device_id *id_table;    /* must be non-NULL for probe to be called */
        int  (*probe)  (struct pci_dev *dev, const struct pci_device_id *id);    /* New device inserted */
        void (*remove) (struct pci_dev *dev);    /* Device removed (NULL if not a hot-plug capable driver) */
        int  (*suspend) (struct pci_dev *dev, pm_message_t state);    /* Device suspended */
        int  (*suspend_late) (struct pci_dev *dev, pm_message_t state);
        int  (*resume_early) (struct pci_dev *dev);
        int  (*resume) (struct pci_dev *dev);                    /* Device woken up */
        void (*shutdown) (struct pci_dev *dev);
        int (*sriov_configure) (struct pci_dev *dev, int num_vfs); /* PF pdev */
        const struct pci_error_handlers *err_handler;
        struct device_driver    driver;
        struct pci_dynids dynids;
    };

    1. name 名称,如下:
        # ls /sys/bus/pci/drivers/
    JMicron IDE  Promise_IDE  ata_piix     e100         e1000e       igb    ixgbe

    2. id_table
        是一个指向pci设备的id编号的指针,用于描述当前PCI设备的编号,一般用做probe的输入参数。如下表:
        
        
        /* ixgbe_pci_tbl - PCI Device ID Table
         *
         * Wildcard entries (PCI_ANY_ID) should come last
         * Last entry must be all 0s
         *
         * { Vendor ID, Device ID, SubVendor ID, SubDevice ID,
         *   Class, Class Mask, private data (not used) }
         */
        static DEFINE_PCI_DEVICE_TABLE(ixgbe_pci_tbl) = {
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598), board_82598 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AF_DUAL_PORT), board_82598 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AF_SINGLE_PORT), board_82598 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AT), board_82598 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598AT2), board_82598 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598EB_CX4), board_82598 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598_CX4_DUAL_PORT), board_82598 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598_DA_DUAL_PORT), board_82598 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM), board_82598 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598EB_XF_LR), board_82598 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598EB_SFP_LOM), board_82598 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82598_BX), board_82598 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_KX4), board_82599 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_XAUI_LOM), board_82599 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_KR), board_82599 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_SFP), board_82599 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_SFP_EM), board_82599 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_KX4_MEZZ), board_82599 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_CX4), board_82599 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_BACKPLANE_FCOE), board_82599 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_SFP_FCOE), board_82599 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_T3_LOM), board_82599 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_COMBO_BACKPLANE), board_82599 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_X540T), board_X540 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_SFP_SF2), board_82599 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_LS), board_82599 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599EN_SFP), board_82599 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_SFP_SF_QP), board_82599 },
            {PCI_VDEVICE(INTEL, IXGBE_DEV_ID_X540T1), board_X540 },
            /* required last entry */
            {0, }
        };
        MODULE_DEVICE_TABLE(pci, ixgbe_pci_tbl);
        
        pci_device_id 结构如下:
        struct pci_device_id {
            __u32 vendor, device;        /* Vendor and device ID or PCI_ANY_ID*/
            __u32 subvendor, subdevice;    /* Subsystem ID's or PCI_ANY_ID */
            __u32 class, class_mask;    /* (class,subclass,prog-if) triplet */
            kernel_ulong_t driver_data;    /* Data private to the driver */
        };
        
    3. probe
        
        int (*probe) (struct pci_dev  *dev, const struct pci_device_id *id)
        
        指向PCI驱动中的probe函数指针,这个函数被PCI核心调用,当它有一个它认为这个驱动想控制的 struct pci_dev时,
        一个指向pci_device_id的指针,PCI核心用来做这个决定,也被告传递给这个函数,如果这个PCI驱动需要这个传递给它的struct pci_dev,
        它应当正初始化这个设备,并返回0, 如果这个驱动不想拥有这个设备,或者产生一个错误,它应当返回一个负的错误值。

    4. remove
        void (*remove) (struct pci_dev  *dev)  
        指向PCI核心在struct pci_dev被告从系统中去除时调用的函数指针,或者当PCI驱动被从内核中卸载时。

    5. suspend
        int (*suspend) (struct pci_dev  *dev, pm_message_t state)  
        当struct pci_dev被挂起时PCI核心调用的函数指针,挂起状态在state 变量时传递,这个函数是可选的

    6. resume
        int (*resume) (struct pci_def  *dev)
        当pci_dev被告恢复时PCI核心调用的函数指针,它的调用一定是在suspend函数执行之后,这个函数可选。

    7. shutdown
        void (*shutdown) (struct pci_dev *dev)
        当此设备需要关闭时,此函数指针所指向的函数将会被调用。

    8. ixgbe注册

        static struct pci_driver ixgbe_driver = {
            .name     = ixgbe_driver_name,
            .id_table = ixgbe_pci_tbl,
            .probe    = ixgbe_probe,
            .remove   = __devexit_p(ixgbe_remove),
        #ifdef CONFIG_PM
            .suspend  = ixgbe_suspend,
            .resume   = ixgbe_resume,
        #endif
        #ifndef USE_REBOOT_NOTIFIER
            .shutdown = ixgbe_shutdown,
        #endif
        #ifdef HAVE_PCI_ERS
            .err_handler = &ixgbe_err_handler
        #endif
        };
        static int __init ixgbe_init_module(void)
        {
            int ret;
            ...
            ret = pci_register_driver(&ixgbe_driver);
            return ret;
        }
        module_init(ixgbe_init_module);

    9. ixgbe注销
        static void __exit ixgbe_exit_module(void)
        {
            pci_unregister_driver(&ixgbe_driver);
            ...
        }
        module_exit(ixgbe_exit_module);

    http://blog.chinaunix.net/uid-7187477-id-3220913.html

  • 相关阅读:
    C#与JS实现 获取指定字节长度 中英文混合字符串 的方法
    CKFinder_AspDotNet_2.4 破解方法 去版权
    MVC3中如何输出富文本
    CKEditor与CKFinder整合 MVC3
    vue项目多页配置
    设备宽度
    h5前端项目常见问题汇总
    react分享
    javascript-复制
    vue开发笔记
  • 原文地址:https://www.cnblogs.com/mull/p/pci.html
Copyright © 2011-2022 走看看