Vamos considerar o driver e1000e
para uma placa Ethernet. Esse driver fornece dois métodos de gerenciamento de energia .suspend
e .resume
para desligar e ligar o cartão respectivamente. Esses métodos são chamados naturalmente durante a transição para o estado S3 ou Suspender para Ram (para .suspend
) e qualquer ativação (para .resume
).
Eu quero chamar cada um desses métodos sempre que eu quiser (não apenas quando todo o sistema tiver que ser suspenso). Em outras palavras, eu quero desligar e retomar o dispositivo sem precisar desligar todo o sistema.
Para fazer isso:
1) Eu baixei o código-fonte do driver e1000e
2) No código fonte do e1000e, eu exportei os métodos .suspend
e .resume
para torná-los acessíveis externamente:
EXPORT_SYMBOL(e1000e_pm_suspend);
EXPORT_SYMBOL(e1000e_pm_resume);
3) Eu escrevi um módulo na intenção de chamar esses métodos como eu gostaria
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/device.h>
extern int e1000e_pm_suspend(struct device *dev);
extern int e1000e_pm_resume(struct device *dev);
static int __init mfps_driver_init(void){
return 0;
}
static void __exit mfps_driver_exit(void){
}
module_init(mfps_driver_init);
module_exit(mfps_driver_exit);
E é aí que estou preso. Como meu módulo acessa o dispositivo Ethernet para poder chamar seus métodos de gerenciamento de energia?
Tags drivers c devices linux-kernel