[U-Boot] [PATCH] Gbe Controller driver support for kirkwood SOCs
Wolfgang Denk
wd at denx.de
Fri Apr 3 21:46:35 CEST 2009
Dear Prafulla Wadaskar,
In message <1238798370-9245-3-git-send-email-prafulla at marvell.com> you wrote:
> From: prafulla_wadaskar <prafulla at marvell.com>
>
> Contributors:
> Yotam Admon <yotam at marvell.com>
> Michael Blostein <michaelbl at marvell.com
>
> Signed-off-by: prafulla_wadaskar <prafulla at marvell.com>
> Reviewed by: Ronen Shitrit <rshitrit at marvell.com>
...
> diff --git a/cpu/arm926ejs/kirkwood/Makefile b/cpu/arm926ejs/kirkwood/Makefile
> index 41ac8d7..3e20898 100644
> --- a/cpu/arm926ejs/kirkwood/Makefile
> +++ b/cpu/arm926ejs/kirkwood/Makefile
> @@ -30,6 +30,7 @@ COBJS-y = timer.o
> COBJS-y += serial.o
> COBJS-y += kwcore.o
> COBJS-y += dram.o
> +COBJS-y += egiga.o
Please sort such lists.
...
> +int eth_smi_reg_read(u32 eth_port_num, u32 phy_adr, u32 reg_ofs, u16 * data)
> +{
> + u32 smi_reg;
> + volatile u32 timeout;
> +
> + /* check parameters */
> + if ((phy_adr << ETH_PHY_SMI_DEV_ADDR_OFFS) & ~ETH_PHY_SMI_DEV_ADDR_MASK) {
Line too long. (Hint: consider using shorter names! :-)
...
> + /* fill the phy address and regiser offset and read opcode */
> + smi_reg =
> + (phy_adr << ETH_PHY_SMI_DEV_ADDR_OFFS) | (reg_ofs <<
> + KW_ETH_SMI_REG_ADDR_OFFS)
> + | ETH_PHY_SMI_OPCODE_READ;
Please clean up indentation here.
...
> +static int egiga_free_rx_rings(struct eth_device *dev)
> +{
> + u32 queue;
> + ETH_PORT_INFO *ethernet_private;
> + struct egiga_priv *port_private;
> + u32 port_num;
> + volatile ETH_RX_DESC *p_rx_curr_desc;
> +
> + ethernet_private = (ETH_PORT_INFO *) dev->priv;
> + port_private = (struct egiga_priv *)ethernet_private->port_private;
> + port_num = port_private->port_num;
> +
> + /* Stop RX Queues */
> + KW_REG_WRITE(KW_ETH_RECEIVE_QUEUE_COMMAND_REG(port_num), 0x0000ff00);
> +
> + /* Free RX rings */
> + debug_print("Clearing previously allocated RX queues... ");
> + for (queue = 0; queue < KW_RX_QUEUE_NUM; queue++) {
> + /* Free preallocated skb's on RX rings */
> + for (p_rx_curr_desc =
> + ethernet_private->p_rx_desc_area_base[queue];
> + (((u32)p_rx_curr_desc <
> + ((u32)ethernet_private->
> + p_rx_desc_area_base[queue] +
> + ethernet_private->rx_desc_area_size[queue])));
> + p_rx_curr_desc =
> + (ETH_RX_DESC *) ((u32)p_rx_curr_desc +
> + RX_DESC_ALIGNED_SIZE)) {
> + if (p_rx_curr_desc->return_info != 0) {
> + p_rx_curr_desc->return_info = 0;
> + debug_print("freed");
> + }
... and here. Such code is basicly unreadable.
...
> +static ETH_FUNC_RET_STATUS eth_port_send(ETH_PORT_INFO * p_eth_port_ctrl,
> + ETH_QUEUE tx_queue,
> + PKT_INFO * p_pkt_info)
> +{
> + volatile ETH_TX_DESC *p_tx_desc_first;
> + volatile ETH_TX_DESC *p_tx_desc_curr;
> + volatile ETH_TX_DESC *p_tx_next_desc_curr;
> + volatile ETH_TX_DESC *p_tx_desc_used;
> + u32 command_status;
> +
> +#ifdef CONFIG_TX_PKT_DISPLAY
> + {
> + u16 pcnt = p_pkt_info->byte_cnt;
> + u8 *prndt = (char *)p_pkt_info->buf_ptr;
> + printf("cnt=%d ", pcnt);
Blank line after declarations, please (check gloabally, please).
Also, pelase try to acoid such nested blocks with additional
declarations.
> + while (pcnt) {
> + printf("%02x,", prndt[0]);
> + prndt++;
> + pcnt--;
> + }
> + printf(" pckend \n");
> +
> + }
> +#endif
...
> diff --git a/cpu/arm926ejs/kirkwood/egiga.h b/cpu/arm926ejs/kirkwood/egiga.h
> new file mode 100644
> index 0000000..83dc4b3
> --- /dev/null
> +++ b/cpu/arm926ejs/kirkwood/egiga.h
> @@ -0,0 +1,707 @@
...
> +#ifndef TRUE
> +#define TRUE 1
> +#endif
> +#ifndef FALSE
> +#define FALSE 0
> +#endif
Omit?
...
> +struct net_device_stats {
> + u32 rx_packets; /* total packets received */
> + u32 tx_packets; /* total packets transmitted */
> + u32 rx_bytes; /* total bytes received */
> + u32 tx_bytes; /* total bytes transmitted */
> + u32 rx_errors; /* bad packets received */
> + u32 tx_errors; /* packet transmit problems */
> + u32 rx_dropped; /* no space in linux buffers */
> + u32 tx_dropped; /* no space available in linux */
> + u32 multicast; /* multicast packets received */
> + u32 collisions;
> + /* detailed rx_errors: */
> + u32 rx_length_errors;
> + u32 rx_over_errors; /* receiver ring buff overflow */
> + u32 rx_crc_errors; /* recved pkt with crc error */
> + u32 rx_frame_errors; /* recv'd frame alignment error */
> + u32 rx_fifo_errors; /* recv'r fifo overrun */
> + u32 rx_missed_errors; /* receiver missed packet */
> + /* detailed tx_errors */
> + u32 tx_aborted_errors;
> + u32 tx_carrier_errors;
> + u32 tx_fifo_errors;
> + u32 tx_heartbeat_errors;
> + u32 tx_window_errors;
> + /* for cslip etc */
> + u32 rx_compressed;
> + u32 tx_compressed;
> +};
> +
> +/* Private data structure used for ethernet device */
> +struct egiga_priv {
> + u32 port_num;
> + struct net_device_stats *stats;
> + /* to buffer area aligned */
> + char *p_eth_tx_buffer[KW_TX_QUEUE_SIZE + 1];
> + char *p_eth_rx_buffer[KW_RX_QUEUE_SIZE + 1];
> + /* Size of Tx Ring per queue */
> + u32 tx_ring_size[MAX_TX_QUEUE_NUM];
> + /* Size of Rx Ring per queue */
> + u32 rx_ring_size[MAX_RX_QUEUE_NUM];
> + /* Magic Number for Ethernet running */
> + u32 eth_running;
> +};
Please use TABs for vertical alignment to make the code readable.
...
> +/* Gap define */
> +#define ETH_BAR_GAP 0x8
> +#define ETH_SIZE_REG_GAP 0x8
> +#define ETH_HIGH_ADDR_REMAP_REG_GAP 0x4
> +#define ETH_PORT_ACCESS_CTRL_GAP 0x4
> +/* MIB Counters register definitions */
> +#define ETH_MIB_GOOD_OCTETS_RECEIVED_LOW 0x0
> +#define ETH_MIB_GOOD_OCTETS_RECEIVED_HIGH 0x4
> +#define ETH_MIB_BAD_OCTETS_RECEIVED 0x8
> +#define ETH_MIB_INTERNAL_MAC_TRANSMIT_ERR 0xc
> +#define ETH_MIB_GOOD_FRAMES_RECEIVED 0x10
> +#define ETH_MIB_BAD_FRAMES_RECEIVED 0x14
> +#define ETH_MIB_BROADCAST_FRAMES_RECEIVED 0x18
> +#define ETH_MIB_MULTICAST_FRAMES_RECEIVED 0x1c
... and so on:
Please use TABs for vertical alignment to make the code better readable.
This applies to the rest of file, too.
> diff --git a/cpu/arm926ejs/kirkwood/egiga_regs.h b/cpu/arm926ejs/kirkwood/egiga_regs.h
> new file mode 100644
> index 0000000..a24fa04
> --- /dev/null
> +++ b/cpu/arm926ejs/kirkwood/egiga_regs.h
...
> +/*
> + *Ethernet Controller Registers
> + */
> +#define KW_ETH_PHY_ADDR_REG(port) (0x72000 + (port<<14))
> +#define KW_ETH_SMI_REG(port) (0x72004 + (port<<14))
> +#define KW_ETH_UNIT_DEFAULT_ADDR_REG(port) (0x72008 + (port<<14))
> +#define KW_ETH_UNIT_DEFAULTID_REG(port) (0x7200c + (port<<14))
> +#define KW_ETH_UNIT_INTERRUPT_CAUSE_REG(port) (0x72080 + (port<<14))
> +#define KW_ETH_UNIT_INTERRUPT_MASK_REG(port) (0x72084 + (port<<14))
...
Use C structures to describe the device layout, and you can get rid of
this ugly code.
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
I've got a bad feeling about this.
More information about the U-Boot
mailing list