[U-Boot-Users] [PATCH]Fix the UEC driver bug of QE

Dave Liu r63238 at freescale.com
Fri Dec 1 06:00:46 CET 2006


Hello,

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.

Wolfgang and Stefan, I am really sorry for that. I used gcc3.4.3 when I
developed it, so I didn't find it. please apply it, TIA.

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 at freescale.com>
---
diff --git a/drivers/qe/uec.c b/drivers/qe/uec.c
index f640c81..c44a5be 100644
--- a/drivers/qe/uec.c
+++ b/drivers/qe/uec.c
@@ -1122,7 +1122,7 @@ static int uec_send(struct eth_device* d
 	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* d
 	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* d
 	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* d
 {
 	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* d
 		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;
 

-------------- next part --------------
A non-text attachment was scrubbed...
Name: fix-uec.patch
Type: text/x-patch
Size: 1640 bytes
Desc: not available
Url : http://lists.denx.de/pipermail/u-boot/attachments/20061201/e38666e7/attachment.bin 


More information about the U-Boot mailing list