Signed-off-by: Denis Kirjanov <kirjanov@gmail.com> --- src/pcnet.c | 35 ++++++++++++++++++++++++++++++++++- 1 files changed, 34 insertions(+), 1 deletions(-) diff --git a/src/pcnet.c b/src/pcnet.c index 7946394..f320ffd 100644 --- a/src/pcnet.c +++ b/src/pcnet.c @@ -2,22 +2,55 @@ #include <linux/module.h> #include <linux/init.h> +#include <linux/kernel.h> +#include <linux/pci.h> MODULE_AUTHOR("Dmitry Podgorny <pasis.ua@gmail.com>"); MODULE_DESCRIPTION("PCNet-PCI II/III Ethernet controller driver"); MODULE_VERSION("dev"); MODULE_LICENSE("GPL"); +#define DRV_NAME "pcnet_dummy" + +static DEFINE_PCI_DEVICE_TABLE(pcnet_dummy_pci_tbl) = { + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_LANCE) }, + { } +}; + +static int __devinit pcnet_dummy_init_one(struct pci_dev *pdev, + const struct pci_device_id *ent) +{ + /* basically pci-skeleton stuff */ + /* reset the chip at the end */ + return 0; +} + +static void __devexit pcnet_dummy_remove_one(struct pci_dev *pdev) +{ + /* noop */ +} + +static struct pci_driver pcnet_dummy_driver = { + .name = DRV_NAME, + .id_table = pcnet_dummy_pci_tbl, + .probe = pcnet_dummy_init_one, + .remove = __devexit_p(pcnet_dummy_remove_one), +#if 0 + /* FIXME: add PM hooks */ +#endif +}; + static int __init pcnet_init(void) { printk(KERN_INFO "pcnet: module has loaded"); - return 0; + return pci_register_driver(&pcnet_dummy_driver); } static void __exit pcnet_exit(void) { printk(KERN_INFO "pcnet: module was unloaded"); + pci_unregister_driver(&pcnet_dummy_driver); } module_init(pcnet_init); -- 1.7.0.4
On Tue, Sep 14, 2010 at 9:52 PM, Denis Kirjanov <kirjanov@gmail.com> wrote:
+static struct pci_driver pcnet_dummy_driver = { + .name = DRV_NAME, + .id_table = pcnet_dummy_pci_tbl, + .probe = pcnet_dummy_init_one, + .remove = __devexit_p(pcnet_dummy_remove_one),
Это ничего, что мы оставляем столько элементов неинициализированными? struct pci_driver { struct list_head node; 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); struct pm_ext_ops *pm; struct pci_error_handlers *err_handler; struct device_driver driver; struct pci_dynids dynids; }; Было бы здорово, Ден, некоторые комментарии к коду ;)
Это минимально необходимая структура для pci драйвера. по id_table код PCI core вызывает функцию инициализации драйвера (.probe = pcnet_dummy_init_one ), которая в конечном итоге должна зарегестрировать новый сетевой интерфейс в системе. (register_netdev()) и предоставить структуру net_device_ops, которая является основным и главным интерфейсом между драйвером и сетевым стеком. Другие поля структуры используются не очень часто. Все примеры есть в drivers/net Thanks! On Wed, Sep 15, 2010 at 3:13 AM, Alex Naumov <posix.ru@googlemail.com> wrote:
On Tue, Sep 14, 2010 at 9:52 PM, Denis Kirjanov <kirjanov@gmail.com> wrote:
+static struct pci_driver pcnet_dummy_driver = { + .name = DRV_NAME, + .id_table = pcnet_dummy_pci_tbl, + .probe = pcnet_dummy_init_one, + .remove = __devexit_p(pcnet_dummy_remove_one),
Это ничего, что мы оставляем столько элементов неинициализированными?
struct pci_driver { struct list_head node; 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); struct pm_ext_ops *pm; struct pci_error_handlers *err_handler; struct device_driver driver; struct pci_dynids dynids; };
Было бы здорово, Ден, некоторые комментарии к коду ;)
_______________________________________________ Kernel-russian mailing list Kernel-russian@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernel-russian
-- Regards, Denis
Премного благодарен за патч, уже в апстриме :). В Tue, 14 Sep 2010 23:52:35 +0400 Denis Kirjanov <kirjanov@gmail.com> пишет:
Signed-off-by: Denis Kirjanov <kirjanov@gmail.com> --- src/pcnet.c | 35 ++++++++++++++++++++++++++++++++++- 1 files changed, 34 insertions(+), 1 deletions(-)
Dmitry, возможно ли отсылать патчи сюда в mailing list для ревью остальными участниками. Thanks! On Wed, Sep 15, 2010 at 11:23 AM, Dmitry Podgorny <pasis.ua@gmail.com> wrote:
Премного благодарен за патч, уже в апстриме :).
В Tue, 14 Sep 2010 23:52:35 +0400 Denis Kirjanov <kirjanov@gmail.com> пишет:
Signed-off-by: Denis Kirjanov <kirjanov@gmail.com> --- src/pcnet.c | 35 ++++++++++++++++++++++++++++++++++- 1 files changed, 34 insertions(+), 1 deletions(-)
_______________________________________________ Kernel-russian mailing list Kernel-russian@kernelnewbies.org http://lists.kernelnewbies.org/mailman/listinfo/kernel-russian
-- Regards, Denis
Denis, конечно, так даже лучше. Еще я использовал пару ваших фраз в doc/ru/2-pci-register.txt, надеюсь вы не против =). Более активно займусь разработкой на выходных, как оказалось, подзабыл бОльшую часть теории что знал (хоть знал и не много...). Предлагаю писать поэтапно, чтобы успевать документировать и иметь более-менее завершенный вид каждой части драйвера. Думаю, нужно довести до ума часть работы с pci, перед тем как заняться уже net_device. Прошу просматривать изменения в doc/ru/, все ли верно я пишу. В Wed, 15 Sep 2010 18:13:17 +0400 Denis Kirjanov <kirjanov@gmail.com> пишет:
Dmitry, возможно ли отсылать патчи сюда в mailing list для ревью остальными участниками.
Thanks!
participants (3)
-
Alex Naumov -
Denis Kirjanov -
Dmitry Podgorny