[U-Boot] [PATCH 2/2] net: add driver for Synopsys Ethernet QoS device
Stephen Warren
swarren at wwwdotorg.org
Tue Oct 4 00:13:00 CEST 2016
On 09/23/2016 03:49 PM, Joe Hershberger wrote:
> Hi Stephen,
>
> Thanks for sending this! I have some comments below.
>
> Cheers,
> -Joe
>
> On Mon, Sep 12, 2016 at 12:48 PM, Stephen Warren <swarren at wwwdotorg.org> wrote:
>> From: Stephen Warren <swarren at nvidia.com>
>>
>> This driver supports the Synopsys Designware Ethernet QoS (Quality of
>> Service) a/k/a eqos IP block, which is a different design than the HW
>> supported by the existing designware.c driver. The IP supports many
>> options for bus type, clocking/reset structure, and feature list. This
>> driver currently supports the specific configuration used in NVIDIA's
>> Tegra186 chip, but should be extensible to other combinations quite
>> easily, as explained in the source.
>> diff --git a/drivers/net/dwc_eth_qos.c b/drivers/net/dwc_eth_qos.c
> +static int eqos_start(struct udevice *dev)
>> + /* Update the MAC address */
>> + val = (plat->enetaddr[5] << 8) |
>> + (plat->enetaddr[4]);
>> + writel(val, eqos->regs + EQOS_MAC_ADDRESS0_HIGH);
>> + val = (plat->enetaddr[3] << 24) |
>> + (plat->enetaddr[2] << 16) |
>> + (plat->enetaddr[1] << 8) |
>> + (plat->enetaddr[0]);
>> + writel(val, eqos->regs + EQOS_MAC_ADDRESS0_LOW);
>
> This should be implemented in write_hwaddr() op.
That op is never called because this driver is only instantiated by
device tree. Since this code can't be skipped, it can't be moved to that op.
>> +int eqos_send(struct udevice *dev, void *packet, int length)
>> + for (i = 0; i < 1000000; i++) {
>> + eqos_inval_desc(tx_desc);
>> + if (!(readl(&tx_desc[3]) & EQOS_DESC3_OWN))
>> + return 0;
>
> Use wait_bit() here.
That function won't work here due to the need to call
eqos_inval_desc(tx_desc) inside the loop.
More information about the U-Boot
mailing list