Al 04/11/10 23:04, En/na Jonas Gorski ha escrit:
On 4 November 2010 19:44, Luca Olivetti<[email protected]>  wrote:
It turns out that the mac was different than the one set in u-boot.
For some reason the switch doesn't accept a different mac than the initial
one (though in u-boot I can change the mac at will, once it boots linux it
has to be the same mac).
Is this a "feature" of the ar8216, a bug or an error on my part?

This sounds more like the ethernet mac uses a different mac than linux
thinks it does, so the outgoing frames have the "wrong" linux source
address and the replies get silently dropped (assuming the ethernet
mac has a non-promiscuous mode or something like that).

Ah, I think I know what happens. Most probably the default for the ethernet port in the danube chip is to not do any mac filtering, but during initialization u-boot sets the mac address *and* sets the mac filtering (from ifx_etop.c, ENET_MAC_DA0, ENET_MAC_DA1 and ENETS_CFG appears to be registers of the danube chip):

static int lq_eth_init(struct eth_device *dev, bd_t * bis)
{
        int i;
        uchar *enetaddr = dev->enetaddr;

        debug("lq_eth_init %x:%x:%x:%x:%x:%x\n",
enetaddr[0], enetaddr[1], enetaddr[2], enetaddr[3], enetaddr[4], enetaddr[5]);

*ENET_MAC_DA0 = (enetaddr[0]<<24) + (enetaddr[1]<<16) + (enetaddr[2]<< 8) + enetaddr[3];
        *ENET_MAC_DA1 = (enetaddr[4]<<24) + (enetaddr[5]<<16);
        *ENETS_CFG |= 1<<28;    /* enable filter for unicast packets */


but in the linux driver .ndo_set_mac_address = eth_mac_addr, so changing the mac in linux does nothing to the chip, hence the filtering with the mac set in u-boot takes place. If u-boot doesn't touch the network, the linux driver will work regardless of the mac because there's no hardware filtering.

Unfortunately I don't know how to modify the driver to do the right thing.

Bye
--
Luca
_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to