net: kirkwood: updates: used eth_setenv_enetaddr api
[pandora-u-boot.git] / drivers / net / kirkwood_egiga.c
index b43bbf2..f31fefc 100644 (file)
@@ -49,7 +49,7 @@ static int smi_reg_read(char *devname, u8 phy_adr, u8 reg_ofs, u16 * data)
        struct kwgbe_device *dkwgbe = to_dkwgbe(dev);
        struct kwgbe_registers *regs = dkwgbe->regs;
        u32 smi_reg;
-       volatile u32 timeout;
+       u32 timeout;
 
        /* Phyadr read request */
        if (phy_adr == 0xEE && reg_ofs == 0xEE) {
@@ -124,7 +124,7 @@ static int smi_reg_write(char *devname, u8 phy_adr, u8 reg_ofs, u16 data)
        struct kwgbe_device *dkwgbe = to_dkwgbe(dev);
        struct kwgbe_registers *regs = dkwgbe->regs;
        u32 smi_reg;
-       volatile u32 timeout;
+       u32 timeout;
 
        /* Phyadr write request*/
        if (phy_adr == 0xEE && reg_ofs == 0xEE) {
@@ -370,7 +370,7 @@ static void port_uc_addr_set(struct kwgbe_registers *regs, u8 * p_addr)
  */
 static void kwgbe_init_rx_desc_ring(struct kwgbe_device *dkwgbe)
 {
-       volatile struct kwgbe_rxdesc *p_rx_desc;
+       struct kwgbe_rxdesc *p_rx_desc;
        int i;
 
        /* initialize the Rx descriptors ring */
@@ -487,6 +487,7 @@ static int kwgbe_send(struct eth_device *dev, volatile void *dataptr,
        struct kwgbe_device *dkwgbe = to_dkwgbe(dev);
        struct kwgbe_registers *regs = dkwgbe->regs;
        struct kwgbe_txdesc *p_txdesc = dkwgbe->p_txdesc;
+       u32 cmd_sts;
 
        if ((u32) dataptr & 0x07) {
                printf("Err..(%s) xmit dataptr not 64bit aligned\n",
@@ -507,21 +508,26 @@ static int kwgbe_send(struct eth_device *dev, volatile void *dataptr,
        /*
         * wait for packet xmit completion
         */
-       while (p_txdesc->cmd_sts & KWGBE_BUFFER_OWNED_BY_DMA) {
+       cmd_sts = readl(&p_txdesc->cmd_sts);
+       while (cmd_sts & KWGBE_BUFFER_OWNED_BY_DMA) {
                /* return fail if error is detected */
-               if (p_txdesc->cmd_sts & (KWGBE_UR_ERROR | KWGBE_RL_ERROR)) {
+               if ((cmd_sts & (KWGBE_ERROR_SUMMARY | KWGBE_TX_LAST_FRAME)) ==
+                               (KWGBE_ERROR_SUMMARY | KWGBE_TX_LAST_FRAME) &&
+                               cmd_sts & (KWGBE_UR_ERROR | KWGBE_RL_ERROR)) {
                        printf("Err..(%s) in xmit packet\n", __FUNCTION__);
                        return -1;
                }
+               cmd_sts = readl(&p_txdesc->cmd_sts);
        };
        return 0;
 }
 
 static int kwgbe_recv(struct eth_device *dev)
 {
-       volatile struct kwgbe_device *dkwgbe = to_dkwgbe(dev);
-       volatile struct kwgbe_rxdesc *p_rxdesc_curr = dkwgbe->p_rxdesc_curr;
-       volatile u32 timeout = 0;
+       struct kwgbe_device *dkwgbe = to_dkwgbe(dev);
+       struct kwgbe_rxdesc *p_rxdesc_curr = dkwgbe->p_rxdesc_curr;
+       u32 cmd_sts;
+       u32 timeout = 0;
 
        /* wait untill rx packet available or timeout */
        do {
@@ -531,7 +537,7 @@ static int kwgbe_recv(struct eth_device *dev)
                        debug("%s time out...\n", __FUNCTION__);
                        return -1;
                }
-       } while (p_rxdesc_curr->cmd_sts & KWGBE_BUFFER_OWNED_BY_DMA);
+       } while (readl(&p_rxdesc_curr->cmd_sts) & KWGBE_BUFFER_OWNED_BY_DMA);
 
        if (p_rxdesc_curr->byte_cnt != 0) {
                debug("%s: Received %d byte Packet @ 0x%x (cmd_sts= %08x)\n",
@@ -545,14 +551,16 @@ static int kwgbe_recv(struct eth_device *dev)
         * OR the error summary bit is on,
         * the packets needs to be dropeed.
         */
-       if ((p_rxdesc_curr->cmd_sts &
+       cmd_sts = readl(&p_rxdesc_curr->cmd_sts);
+
+       if ((cmd_sts &
                (KWGBE_RX_FIRST_DESC | KWGBE_RX_LAST_DESC))
                != (KWGBE_RX_FIRST_DESC | KWGBE_RX_LAST_DESC)) {
 
                printf("Err..(%s) Dropping packet spread on"
                        " multiple descriptors\n", __FUNCTION__);
 
-       } else if (p_rxdesc_curr->cmd_sts & KWGBE_ERROR_SUMMARY) {
+       } else if (cmd_sts & KWGBE_ERROR_SUMMARY) {
 
                printf("Err..(%s) Dropping packet with errors\n",
                        __FUNCTION__);
@@ -574,7 +582,8 @@ static int kwgbe_recv(struct eth_device *dev)
        p_rxdesc_curr->buf_size = PKTSIZE_ALIGN;
        p_rxdesc_curr->byte_cnt = 0;
 
-       dkwgbe->p_rxdesc_curr = p_rxdesc_curr->nxtdesc_p;
+       writel((unsigned)p_rxdesc_curr->nxtdesc_p, &dkwgbe->p_rxdesc_curr);
+
        return 0;
 }
 
@@ -583,7 +592,7 @@ int kirkwood_egiga_initialize(bd_t * bis)
        struct kwgbe_device *dkwgbe;
        struct eth_device *dev;
        int devnum;
-       char *s, buf[NAMESIZE * 2];
+       char *s;
        u8 used_ports[MAX_KWGBE_DEVS] = CONFIG_KIRKWOOD_EGIGA_PORTS;
 
        for (devnum = 0; devnum < MAX_KWGBE_DEVS; devnum++) {
@@ -641,11 +650,14 @@ int kirkwood_egiga_initialize(bd_t * bis)
                }
 
                while (!eth_getenv_enetaddr(s, dev->enetaddr)) {
-                       /* Generate Ramdom MAC addresses if not set */
-                       sprintf(buf, "00:50:43:%02x:%02x:%02x",
-                               get_random_hex(), get_random_hex(),
-                               get_random_hex());
-                       setenv(s, buf);
+                       /* Generate Random Private MAC addr if not set */
+                       dev->enetaddr[0] = 0x02;
+                       dev->enetaddr[1] = 0x50;
+                       dev->enetaddr[2] = 0x43;
+                       dev->enetaddr[3] = get_random_hex();
+                       dev->enetaddr[4] = get_random_hex();
+                       dev->enetaddr[5] = get_random_hex();
+                       eth_setenv_enetaddr(s, dev->enetaddr);
                }
 
                dev->init = (void *)kwgbe_init;
@@ -662,3 +674,4 @@ int kirkwood_egiga_initialize(bd_t * bis)
 #endif
        }
        return 0;
+}