Перейти к содержанию
    

Доброго дня!

Имеется самодельная плата с процессором DM365 и сетевой Realtek RTL8201, в работе используется linux-2.6.18_pro500, из состава SDK, и u-boot 1.3.4.

Слегка модифицировав u-boot я добился работающего ping-а, к сожалению tftp пока не работает.

Но более приоретным является работоспособность сети в Linux, драйвер davinci_emac от TI видит чип, но смонтировать файловую систему по NFS не может, NFS-сервер в это время работает.

Из странного в работе - постоянно горит индикатор линка, но при попытке монтирования файловой сети он тухнет.

Привожу лог загрузки, касающейся сети:

Linux version 2.6.18_pro500-davinci_evm-arm_v5t_le-gb43d9841-dirty (kirill@kirill) (gcc version 4.2.0 (MontaVista 4.2.0-16.0.32.0801914 2008-08-30)) #1 PREEMPT Mon Nov 29 12:55:40 MSK 2010
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
Machine: DaVinci DM365 EVM
...............................................
Kernel command line: console=ttyS0,115200n8 noinitrd rw eth=00:01:02:03:04:05 ip=192.168.10.254:192.168.10.3:::arm:eth0:off root=/dev/nfs nfsroot=192.168.10.3:/home/kirill/nfs/rootfs,nolock
TI DaVinci EMAC: kernel boot params Ethernet address: 00:01:02:03:04:05
....................................................
Generic PHY: Registered new driver
......................................................
RTL8201PHY: Starting realtek_init.
Realtel RTL8201: Registered new driver
Davinci EMAC MII Bus: probed
i2c_davinci i2c_davinci.1: timeout waiting for bus ready
i2c_davinci i2c_davinci.1: timeout waiting for bus ready
i2c_davinci i2c_davinci.1: timeout waiting for bus ready
i2c_davinci i2c_davinci.1: timeout waiting for bus ready
MAC address is 02:00:10:00:00:00
TI DaVinci EMAC Linux version updated 4.0
...............................................
IPv4 over IPv4 tunneling driver
TCP bic registered
NET: Registered protocol family 1
NET: Registered protocol family 17
...........................................
RTL8201PHY: Starting rtl8201_config_init.
found Realtek RTL8201 PHY
IP-Config: Guessing netmask 255.255.255.0
IP-Config: Complete:
      device=eth0, addr=192.168.10.254, mask=255.255.255.0, gw=255.255.255.255,
     host=arm, domain=, nis-domain=(none),
     bootserver=192.168.10.3, rootserver=192.168.10.3, rootpath=
Looking up port of RPC 100003/2 on 192.168.10.3
portmap: server 192.168.10.3 not responding, timed out
Root-NFS: Unable to get nfsd port number from server, using default
Looking up port of RPC 100005/1 on 192.168.10.3
portmap: server 192.168.10.3 not responding, timed out
Root-NFS: Unable to get mountd port number from server, using default
mount: server 192.168.10.3 not responding, timed out
Root-NFS: Server returned error -5 while mounting /home/kirill/nfs/rootfs
VFS: Unable to mount root fs via NFS, trying floppy.
VFS: Cannot open root device "nfs" or unknown-block(2,0)
Please append a correct "root=" boot option
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)

Строки начинающиеся на RTL8201PHY являются выводом из моей попытки дописать работу с RTL8201 к Generic PHY.

Может кто-нибудь решил эту проблему?

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

NFS-сервер в это время работает.

.......

 

Looking up port of RPC 100005/1 on 192.168.10.3

portmap: server 192.168.10.3 not responding, timed out

Root-NFS: Unable to get mountd port number from server, using default

mount: server 192.168.10.3 not responding, timed out

 

Уверены что сервер работает ? Демон portmap запущен ?

#ps -A | grep portmap

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Абсолютно.

$ ps aux | grep nfs | grep -v grep
root      1106  0.0  0.0      0     0 ?        S    Nov29   0:00 [nfsiod]
root      1387  0.0  0.0      0     0 ?        S    Nov29   0:00 [nfsd4]
root      1388  0.0  0.0      0     0 ?        S    Nov29   0:00 [nfsd]
root      1389  0.0  0.0      0     0 ?        S    Nov29   0:00 [nfsd]
root      1390  0.0  0.0      0     0 ?        S    Nov29   0:00 [nfsd]
root      1391  0.0  0.0      0     0 ?        S    Nov29   0:00 [nfsd]
root      1392  0.0  0.0      0     0 ?        S    Nov29   0:00 [nfsd]
root      1393  0.0  0.0      0     0 ?        S    Nov29   0:00 [nfsd]
root      1394  0.0  0.0      0     0 ?        S    Nov29   0:00 [nfsd]
root      1395  0.0  0.0      0     0 ?        S    Nov29   0:00 [nfsd]

$ ps aux | grep portmap | grep -v grep
daemon    1076  0.0  0.0   1796   444 ?        Ss   Nov29   0:00 /sbin/portmap

У меня создаётся впечатление, что в момент подключения к серверу сетевой чип выключают. Косвенно это подтверждает выключение светодиода на сетевом разъёме.

Поддерживаемые в ядре 2.6.18 PHY:

$ ls drivers/net/phy | grep c
broadcom.c
cicada.c
davicom.c
fixed.c
icplus.c
Kconfig
lxt.c
marvell.c
mdio_bus.c
phy.c
phy_device.c
phy_device.o
qsemi.c
realtek.c
smsc.c
vitesse.c

Файл realtek.c - это моя попытка добавить поддержку RTL8201, на данный момент неудачная.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Файл realtek.c - это моя попытка добавить поддержку RTL8201, на данный момент неудачная.

 

Вообще я сомневаюсь что для него вообще нужен какой-то драйвер :)

http://www.realtek.com/faqs/faqsView.aspx?...d=1&Level=3

 

# Q9: Why don't I find RTL8201x driver on the website?

 

A9:

RTL8201, RTL8201BL, RTL8201CL, RTL8201CP, RTL8201N and RTL8211B(L) are all PHYceiver. That is a driverless hardware device. Software driver are relative to Network controller ( MAC ) which is integrated into chipset in such case mostly. Please contact your mother board maker or chipset manufacturer to obtain proper driver support.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В U-Boot без драйвера не работало ничего, сейчас хоть ping заработал.

А насчёт нужности драйвера http://www.google.com/search?q=linux+rtl8201

Да и что-то не работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В U-Boot без драйвера не работало ничего, сейчас хоть ping заработал.

А насчёт нужности драйвера http://www.google.com/search?q=linux+rtl8201

Да и что-то не работает.

 

И что вы нашли в гугле - у этого PHY нет irq, зачем там драйвер ? Покажите что вы делаете в драйвере ? Поддержка например в at91 для rtl8201 заключается только в чтении идентификатора и констатации факта - да, там у меня rtl8201 висит :) максимум что может потребоваться - это прописать идентификатор, чтобы драйвер MAC узнавал его и знал - что-то висит на MII.

 

PS кстати посмотрите - может в вашем дроайвере MAC тоже нужно просто дописать его идентификатор а то вполне возможно что он не узнает PHY и отрубается.

Изменено пользователем sasamy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я разве утверждаю, что в драйвере делаю что-то сложное? ;)

#include <linux/module.h>
#include <linux/phy.h>

char debug = 1;
#define DBG(format, args...) if (debug) printk("RTL8201PHY: " format "\n", ##args)

static int rtl8201_config_init(struct phy_device *phydev)
{
    DBG("Starting %s.", __func__);
    phydev->irq = PHY_POLL;
    //phydev->interrupts = PHY_INTERRUPT_DISABLED;

    return 0;
}

static int rtl8201_ack_interrupt(struct phy_device *phydev)
{
    DBG("Starting %s.", __func__);
    return 0;
}

static int rtl8201_config_interrupt(struct phy_device *phydev)
{
    DBG("Starting %s.", __func__);
    return 0;
}
static struct phy_driver rtl8201_driver = {
    .phy_id = 0x8201,
    .phy_id_mask = 0xffff,
    .name = "Realtel RTL8201",
    .features = (SUPPORTED_10baseT_Half | \
                 SUPPORTED_10baseT_Full | \
                 SUPPORTED_100baseT_Half | \
                 SUPPORTED_100baseT_Full | \
                 SUPPORTED_Autoneg | \
                 SUPPORTED_MII), 
    .flags = 0,
    .config_init = rtl8201_config_init,
    .config_aneg = genphy_config_aneg,
    .read_status = genphy_read_status,
    .ack_interrupt = rtl8201_ack_interrupt,
    .config_intr = rtl8201_config_interrupt,
    .driver = {.owner = THIS_MODULE},
};

static int __init realtek_init(void)
{
    int ret;
    
    DBG("Starting %s.", __func__);
    ret = phy_driver_register(&rtl8201_driver);
    if (ret) {
        printk("Can't registered driver for Realtek RTL8201.\n");
        phy_driver_unregister(&rtl8201_driver);
    }

    return ret;
}

static void __exit realtek_exit(void)
{
    DBG("Starting %s.", __func__);
    phy_driver_unregister(&rtl8201_driver);
}

module_init(realtek_init);
module_exit(realtek_exit);

MAC я передаю в параметрах загрузки.

Пробовал ядро с моим драйвером и без него, результат одинаковый - нет соединения по NFS.

Может действительно проблема в железе? Но проверка тестом из CodeComposer прошла, правда там там тупо шлют некоторое количество байтов и пожалуй это доказывает только то, что процессор видит сетевой чип.

Изменено пользователем /dev/null

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я разве утверждаю, что в драйвере делаю что-то сложное? ;)

 

Ну понятно - этот драйвер ровным счетом ничего и не делает :) смотрите драйвер ethernet вашего давинча - как он пытается PHY обнаружить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#define PHY_ID_MASK        0xfffffff0
#define LXT971_ID        0x001378e0
#define KSZ8893MQL_ID    0x00221430
#define RTL8201_ID      0x8201

static int emac_phy_init(struct emac_dev *dev, u8 phy_num, u8 *phy_cnt,
             u8 *phy_max)
{
    char phy_id[BUS_ID_SIZE];

    snprintf(phy_id, BUS_ID_SIZE, PHY_ID_FMT, 1, phy_num);

    dev->phydev[phy_num] = phy_connect(dev->owner, phy_id,
        &emac_update_phy_status, 0, PHY_INTERFACE_MODE_MII);
    if (IS_ERR(dev->phydev[phy_num])) {
        if (dev->phydev[phy_num] == ERR_PTR(-ENODEV))
            dev->phydev[phy_num] = NULL;
        return PTR_ERR(dev->phydev[phy_num]);
    }

    dev->phydev[phy_num]->supported = PHY_BASIC_FEATURES;

    if (dev->init_cfg.gigabit)
        dev->phydev[phy_num]->supported |= SUPPORTED_1000baseT_Full;

    dev->phydev[phy_num]->advertising = dev->phydev[phy_num]->supported;

    if ((dev->phydev[phy_num]->phy_id & PHY_ID_MASK) == LXT971_ID) {
        /*
         * CRITICAL: Fix for increasing PHY signal drive strength for
         * TX lockup issue. On DaVinci EVM, the Intel LXT971 PHY
         * signal strength was low causing TX to fail randomly. The
         * fix is to Set bit 11 (Increased MII drive strength) of PHY
         * register 26 (Digital Config register) on this phy.
         */
        int control;

        pr_info("applying Intel LTX971 workaround..\n");

        control = phy_read(dev->phydev[phy_num], 26);
        phy_write(dev->phydev[phy_num], 26, (control | 0x800));
        phy_read(dev->phydev[phy_num], 26);
    } else if ((dev->phydev[phy_num]->phy_id & PHY_ID_MASK) ==
            KSZ8893MQL_ID) {
        /*
         * KSZ8893MQL is a layer 2 switch that connects to EMAC via
         * MII.  The MII setting is required to be fixed with autoneg
         * off, 100Mbps, and full duplex.  This happens to be the
         * settings and behavior when phy_mode is set to SNWAY_NOPHY.
         * Therefore, we set the phy_mode to SNWAY_NOPHY whenever
         * KSZ8893MQL is detected.
         */
        dev->init_cfg.phy_mode = SNWAY_NOPHY;

        /* The third phy is used for MII, so only expect 2 phys */
        *phy_max = 2;
    } else if ((dev->phydev[phy_num]->phy_id & 0xffff) == RTL8201_ID) {
        pr_info("found Realtek RTL8201 PHY\n");
        //dev->init_cfg.phy_mode = SNWAY_NOPHY;
    }

    *phy_cnt = *phy_cnt + 1;
    phy_start(dev->phydev[phy_num]);

    return 0;
}

PHY обнаруживается, при загрузке я вижу строку "found Realtek RTL8201 PHY".

Изменено пользователем /dev/null

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

PHY обнаруживается, при загрузке я вижу строку "found Realtek RTL8201 PHY".

 

Смотрите драйвер изернет - включите отладочную информацию тогда ясно будет почему он линк гасит, как вы понимаете проблема не может быть в ничего не делающем драйвере :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемые, не сочтите за труд, посмотрите на правильность схемы.

 

linux-xx/Documentation/networking/phy.txt

 

Generic PHY driver

 

If the desired PHY doesn't have any errata, quirks, or special

features you want to support, then it may be best to not add

support, and let the PHY Abstraction Layer's Generic PHY Driver

do all of the work.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Читал я этот файл. Повторю ещё раз - не работает в любом случае, добавлю я свой драйвер или нет.

Некоторые странности в поведении наводят на мысль о ошибке в разводке, для чего выложил схему, или сбой железа.

Странности заключаются в следующем:

- при питании от 12В индикатор линка гаснет при попытке подсоединится по NFS, индикатор активно не горит, соединение по NFS не устанавливается

- при питании по POE когда идёт подсоединение по NFS, индикатор линка гаснет, но через секунду зажигается снова, также зажигается индикатор активности и даже слегка подмигивает, соединение по NFS не устанавливается.

Вставив отладку в драйвер производителя выяснил следующее - устанавливается скорость в 100 Мб/с, режим дуплекса UNKNOW, состояние чипа READY (функция emac_phy_init).

После этого запускается функция phy_start, которая переводи чип в состояние PHY_UP.

Разбираюсь дальше.

 

P.S. Неужто никто не применяет RTL8201? Или у меня так загрязнены чакры? ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...