Чтение данных из EEPROM в модуле ядра Linux

Я должен прочитать MAC-адрес из EEPROM и установить его для сетевого интерфейса во время инициализации интерфейса.
И я последовал комментарию из Прочитать запись EEPROM из модуля linux, чтобы прочитать EEPROM через sysfs. Но результат провален.

Когда я открывал файл EEPROM с помощью filp_open(), он всегда возвращал указатель ошибки с -EACCESS.

struct file *kernel_open(const char *filename, int flags, umode_t mode) {
    struct file *filp = NULL;
    mm_segment_t oldfs = get_fs();
    set_fs(get_ds());
    filp = filp_open(filename, flags, mode);
    set_fs(oldfs);
    return filp;
}

const char *filename = "/sys/bus/i2c/devices/6-0054/eeprom";
struct file filp = kernel_open(filename, O_RDONLY, 0);
if (IS_ERR(filp)) {
    printk(KERN_ERR "Failed to open file (code: %d)\n", PTR_ERR(filp));
    return; <-- always return here and filp value with -13, aka -EACCESS, aka Permission denied
}

Есть идеи?

[Обновлено]
- Процессор: AST2500 (ARMv6)
- Версия ядра: 4.19
- EEPROM: at24c64


person Richard B. Vannacutt    schedule 19.03.2019    source источник
comment
Какая ЭСППЗУ? В какой системе? Подключено как??? i2c-detect находит что-нибудь?   -  person Chris Stratton    schedule 19.03.2019
comment
@ChrisStratton EEPROM - at24c64, и мой модуль работает на платформе ARM с ядром 4.19. i2c-детект показывает UU на адресе EEPROM, на мой взгляд, это потому, что драйвер EEPROM имеет дело с устройством.   -  person Richard B. Vannacutt    schedule 20.03.2019
comment
ARM не имеет смысла как платформа, вы должны быть конкретными: процессор, плата, дистрибутив, загруженные драйверы... Также вы должны задокументировать подключение eeprom к процессору.   -  person Chris Stratton    schedule 20.03.2019
comment
И вы действительно должны сначала попробовать это из пользовательского пространства. Также включите отладку драйвера, который, по вашему мнению, используется, или загрузите его со своими собственными функциями printk().   -  person Chris Stratton    schedule 20.03.2019
comment
@ChrisStratton Я реализую наш BMC на основе OpenBMC. После того, как я проверил /proc/cpuinfo, модель процессора показывает совместимость с ARMv6. Также я прочитал EEPROM из sysfs в пользовательском пространстве, результат в порядке.   -  person Richard B. Vannacutt    schedule 20.03.2019
comment
Плохо, процессор AST2500   -  person Richard B. Vannacutt    schedule 20.03.2019
comment
Если это работает из пользовательского пространства, то проблема, вероятно, связана с ужасным уродливым взломом попытки использовать интерфейсы пользовательского пространства из ядра. Обычно рекомендуется не делать этого. Вы должны сделать это в ядре? Можете ли вы использовать для этого более конкретный API драйвера, а не злоупотреблять sysfs?   -  person Chris Stratton    schedule 20.03.2019
comment
Если EEPROM не имеет уникальной физической связи с сетевым интерфейсом, а является более общим системным ресурсом или подключен как таковой, то использование сценариев запуска в пользовательском пространстве, считывающих MAC-адрес и повторно вводящих его в сетевой драйвер, на самом деле является довольно обычный тип задачи запуска для встроенной системы. Это также дает вам хорошее место для предоставления альтернативы, если этот адрес еще не был записан вашей производственной установкой.   -  person Chris Stratton    schedule 20.03.2019
comment
Обычно я считывал MAC-адрес EEPROM из кода загрузчика (особенно если загрузчик поддерживает Ethernet) и заставлял загрузчик исправлять свойство mac-address для устройства Ethernet в большом двоичном объекте дерева устройств Linux, передаваемом от загрузчика к ядро линукса. Однако я думаю, что вы можете заставить ядро ​​Linux считывать MAC-адрес из самой EEPROM, используя свойства nvmem-cells и nvmem-cell-names в узле дерева устройств для Ethernet-устройства.   -  person Ian Abbott    schedule 20.03.2019
comment
@ChrisStratton Почему обычное руководство говорит нам не открывать файл в ядре? Я не могу разобраться:(   -  person Richard B. Vannacutt    schedule 21.03.2019
comment
Потому что sysfs предназначен для пользовательского пространства. Ядро не предназначено для общения с самим собой.   -  person Chris Stratton    schedule 21.03.2019
comment
@IanAbbott Спасибо за предложения. Раньше я пытался прочитать MAC-адрес в uboot; Однако я обнаружил, что в моем uboot нет драйвера i2c для AST2500 :( Я сразу перейду к nvmem и дереву устройств.   -  person Richard B. Vannacutt    schedule 21.03.2019
comment
@ChrisStratton Вызывает ли это какие-либо неявные проблемы, если я получаю доступ к sysfs?   -  person Richard B. Vannacutt    schedule 21.03.2019
comment
Жаль, что поддержка nvmem-cells и nvmem-cell-names = mac-address еще не зашита в функцию device_get_mac_address или fwnode_get_mac_address, иначе, возможно, вам нужно было бы изменить только дерево устройств.   -  person Ian Abbott    schedule 21.03.2019