]> git.ipfire.org Git - people/ms/u-boot.git/commitdiff
mpc83xx: Fix the UEC driver bug of QE
authorDave Liu <r63238@freescale.com>
Wed, 6 Dec 2006 03:38:17 +0000 (11:38 +0800)
committerKim Phillips <kim.phillips@freescale.com>
Fri, 2 Mar 2007 17:05:52 +0000 (11:05 -0600)
The patch prevents the GCC tool chain from striping useful code for
optimization. It will make UEC ethernet driver workable, Otherwise the
UEC will fail in tx when you are using gcc4.x. but the driver can work
when using gcc3.4.3.

CHANGELOG

*Prevent the GCC from striping code for optimization, Otherwise the UEC
will tx failed when you are using gcc4.x.

Signed-off-by: Dave Liu <daveliu@freescale.com>
drivers/qe/uec.c

index f640c8191618c5f19342edaf52987c4bf10d531c..c44a5be9dac78d532bf0b14a3e4a2d6e14ef395a 100644 (file)
@@ -1122,7 +1122,7 @@ static int uec_send(struct eth_device* dev, volatile void *buf, int len)
        uec_private_t           *uec;
        ucc_fast_private_t      *uccf;
        volatile qe_bd_t        *bd;
-       volatile u16            status;
+       u16                     status;
        int                     i;
        int                     result = 0;
 
@@ -1131,7 +1131,7 @@ static int uec_send(struct eth_device* dev, volatile void *buf, int len)
        bd = uec->txBd;
 
        /* Find an empty TxBD */
-       for (i = 0; BD_STATUS(bd) & TxBD_READY; i++) {
+       for (i = 0; bd->status & TxBD_READY; i++) {
                if (i > 0x100000) {
                        printf("%s: tx buffer not ready\n", dev->name);
                        return result;
@@ -1150,13 +1150,11 @@ static int uec_send(struct eth_device* dev, volatile void *buf, int len)
        ucc_fast_transmit_on_demand(uccf);
 
        /* Wait for buffer to be transmitted */
-       status = BD_STATUS(bd);
-       for (i = 0; status & TxBD_READY; i++) {
+       for (i = 0; bd->status & TxBD_READY; i++) {
                if (i > 0x100000) {
                        printf("%s: tx error\n", dev->name);
                        return result;
                }
-               status = BD_STATUS(bd);
        }
 
        /* Ok, the buffer be transimitted */
@@ -1171,12 +1169,12 @@ static int uec_recv(struct eth_device* dev)
 {
        uec_private_t           *uec = dev->priv;
        volatile qe_bd_t        *bd;
-       volatile u16            status;
+       u16                     status;
        u16                     len;
        u8                      *data;
 
        bd = uec->rxBd;
-       status = BD_STATUS(bd);
+       status = bd->status;
 
        while (!(status & RxBD_EMPTY)) {
                if (!(status & RxBD_ERROR)) {
@@ -1190,7 +1188,7 @@ static int uec_recv(struct eth_device* dev)
                BD_LENGTH_SET(bd, 0);
                BD_STATUS_SET(bd, status | RxBD_EMPTY);
                BD_ADVANCE(bd, status, uec->p_rx_bd_ring);
-               status = BD_STATUS(bd);
+               status = bd->status;
        }
        uec->rxBd = bd;