[U-Boot] [PATCH 2/4] net: Adds Fast Ethernet Controller driver for Armada100

Wolfgang Denk wd at denx.de
Thu Jul 28 17:16:28 CEST 2011


Dear Ajay Bhargav,

In message <1310982108-26029-2-git-send-email-ajay.bhargav at einfochips.com> you wrote:
> This patch adds support for Fast Ethernet Controller driver for
> Armada100 series.
...
> +	printf("\noffset: phy_adr, value: 0x%x\n", ARMDFEC_RD(regs->phyadr));
> +	printf("offset: smi, value: 0x%x\n", ARMDFEC_RD(regs->smi));

Please get rid of the ARMDFEC_RD() and ARMDFEC_WR() macros and use the
standard I/O accessors directly.

> +static u8 get_random_byte(u8 seed)
> +{
> +	udelay(seed);
> +	return (u8)(get_timer(0) % 100) + seed;
> +}

You probably want to use "udelay(1000 * seed)" here - udelay() is in
microseconds, but get_timer() is in milliseconds.

> +	/* check parameters */
> +	if (phy_addr > PHY_MASK) {
> +		printf("Err..(%s) Invalid phy address\n", __func__);
> +		return -EINVAL;

In such error messages the incorrect data (here: the content of
phy_addr) is the most interesting thing - please include this.
Please fix globally.

...
> +	if (phy_addr == PHY_ADR_REQ && phy_reg == PHY_ADR_REQ) {
> +		reg_data = ARMDFEC_RD(regs->phyadr);
> +		reg_data &= ~(0x1f);
> +		reg_data |= (value & 0x1f);
> +		ARMDFEC_WR(reg_data, regs->phyadr);
> +		return 0;
> +	}

Sequences like thesde should be rewritten using the standard I/O
accessor macros, here clrsetbits_le32().  Please fix globally.


> +static u32 hash_function(u32 macH, u32 macL)
> +{
> +	u32 hashResult;
> +	u32 addrH;
> +	u32 addrL;
> +	u32 addr0;
> +	u32 addr1;
> +	u32 addr2;
> +	u32 addr3;
> +	u32 addrHSwapped;
> +	u32 addrLSwapped;

We don't allow for CamelCaps identifiers.  Please fix globally.


> +/* Address Table Initialization */
> +static void init_hashtable(struct eth_device *dev)
> +{
> +	struct armdfec_device *darmdfec = to_darmdfec(dev);
> +	struct armdfec_reg *regs = darmdfec->regs;
> +	memset(darmdfec->htpr, 0, HASH_ADDR_TABLE_SIZE);
> +	ARMDFEC_WR((u32) darmdfec->htpr, regs->htpr);

Please always separate declarations and code by a blank line.  Please
fix globally.

...
> +	for (addr = 0; addr < 32; addr++) {
> +		if (miiphy_read(dev->name, addr, MII_BMSR, &mii_status)
> +			!= 0)
> +			/* try next phy */
> +			continue;
> +
> +		/* invalid MII status. More validation required here... */
> +		if (mii_status == 0 || mii_status == 0xffff)
> +			/* try next phy */
> +			continue;
> +
> +		if (miiphy_read(dev->name, addr, MII_PHYSID1, &tmp) != 0)
> +			/* try next phy */
> +			continue;
> +
> +		val = tmp << 16;
> +		if (miiphy_read(dev->name, addr, MII_PHYSID2, &tmp) != 0)
> +			/* try next phy */
> +			continue;

Even if it's only comments, these are multiline statements which need
braces. Please fix globally.

> +		if (i == (RINGSZ - 1))
> +			p_rx_desc->nxtdesc_p = darmdfec->p_rxdesc;
> +		else {
> +			p_rx_desc->nxtdesc_p = (struct rx_desc *)
> +			    ((u32) p_rx_desc + ARMDFEC_RXQ_DESC_ALIGNED_SIZE);
> +			p_rx_desc = p_rx_desc->nxtdesc_p;
> +		}

Coding style: Use braces in both branches. Please fix globally.

> +		/* let the upper layer handle the packet, subtract offset
> +		 * as two dummy bytes are added in received buffer see
> +		 * PORT_CONFIG_EXT register bit TWO_Byte_Stuff_Mode bit.
> +		 */

Incorrect multiline comment style.

> +		NetReceive((p_rxdesc_curr->buf_ptr + RX_BUF_OFFSET),
> +			   (int) (p_rxdesc_curr->byte_cnt -
> +				  RX_BUF_OFFSET));
> +	}
> +	/*
> +	 * free these descriptors and point next in the ring
> +	 */
> +	p_rxdesc_curr->cmd_sts = BUF_OWNED_BY_DMA | RX_EN_INT;
> +	p_rxdesc_curr->buf_size = PKTSIZE_ALIGN;
> +	p_rxdesc_curr->byte_cnt = 0;
> +
> +	writel((unsigned int) p_rxdesc_curr->nxtdesc_p,
> +			&(darmdfec->p_rxdesc_curr));
> +
> +	return 0;
> +}
> +
> +int armada100_fec_initialize()
> +{
> +	struct armdfec_device *darmdfec;
> +	struct eth_device *dev;
> +	int phy_adr;
> +	char *s = "ethaddr";
> +
> +	darmdfec = malloc(sizeof(struct armdfec_device));
> +	if (!darmdfec)
> +		goto error1;
> +
> +	memset(darmdfec, 0, sizeof(struct armdfec_device));
> +
> +	darmdfec->htpr = memalign(8, HASH_ADDR_TABLE_SIZE);
> +	if (!darmdfec->htpr)
> +		goto error2;
> +
> +	darmdfec->p_rxdesc =
> +		(struct rx_desc *) memalign(PKTALIGN,
> +					ARMDFEC_RXQ_DESC_ALIGNED_SIZE
> +					* RINGSZ + 1);
> +	if (!darmdfec->p_rxdesc)
> +		goto error3;
> +
> +	darmdfec->p_rxbuf = (u8 *) memalign(PKTALIGN, RINGSZ
> +						* PKTSIZE_ALIGN + 1);
> +	if (!darmdfec->p_rxbuf)
> +		goto error4;
> +
> +	darmdfec->p_aligned_txbuf = memalign(8, PKTSIZE_ALIGN);
> +	if (!darmdfec->p_aligned_txbuf)
> +		goto error5;
> +
> +	darmdfec->p_txdesc = (struct tx_desc *)
> +		memalign(PKTALIGN, sizeof(struct tx_desc) + 1);
> +	if (!darmdfec->p_txdesc) {
> +		free(darmdfec->p_aligned_txbuf);
> +error5:
> +		free(darmdfec->p_rxbuf);
> +error4:
> +		free(darmdfec->p_rxdesc);
> +error3:
> +		free(darmdfec->htpr);
> +error2:
> +		free(darmdfec);

You could simplify the code and just use a common error entry point
and always call free() for all entries - free(NULL) is defined to
have no effect.


> +/* Bit fields of a Hash Table Entry */
> +enum hash_table_entry {
> +	hteValid = 1,
> +	hteSkip = 2,
> +	hteRD = 4,
> +	hteRDBit = 2
> +};

No CamelCaps identifiers please - see above.

> +struct tx_desc {
> +	volatile u32 cmd_sts;		/* Command/status field */

WARNING: Use of volatile is usually wrong: see
Documentation/volatile-considered-harmful.txt

> +struct rx_desc {
> +	volatile u32 cmd_sts;		/* Descriptor command status */

WARNING: Use of volatile is usually wrong: see
Documentation/volatile-considered-harmful.txt


Best regards,

Wolfgang Denk

-- 
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de
The heart is not a logical organ.
	-- Dr. Janet Wallace, "The Deadly Years", stardate 3479.4


More information about the U-Boot mailing list