浏览代码

net: emaclite: Fix logic around available TX buffers

Simplify logic how to find out if there is free TX buffer.
Both buffers are checked all the time that's why logic around order
can be removed.
Also add check when only one buffer is available.

Signed-off-by: Michal Simek <michal.simek@xilinx.com>
Acked-by: Joe Hershberger <joe.hershberger@ni.com>
Michal Simek 9 年之前
父节点
当前提交
26c7945a24
共有 1 个文件被更改,包括 8 次插入16 次删除
  1. 8 16
      drivers/net/xilinx_emaclite.c

+ 8 - 16
drivers/net/xilinx_emaclite.c

@@ -379,28 +379,20 @@ static int emaclite_init(struct eth_device *dev, bd_t *bis)
 	return 0;
 	return 0;
 }
 }
 
 
-static int xemaclite_txbufferavailable(struct eth_device *dev)
+static int xemaclite_txbufferavailable(struct xemaclite *emaclite)
 {
 {
-	u32 reg;
-	u32 txpingbusy;
-	u32 txpongbusy;
-	struct xemaclite *emaclite = dev->priv;
+	u32 tmp;
+	struct emaclite_regs *regs = emaclite->regs;
 
 
 	/*
 	/*
 	 * Read the other buffer register
 	 * Read the other buffer register
 	 * and determine if the other buffer is available
 	 * and determine if the other buffer is available
 	 */
 	 */
-	reg = in_be32 (dev->iobase +
-			emaclite->nexttxbuffertouse + 0);
-	txpingbusy = ((reg & XEL_TSR_XMIT_BUSY_MASK) ==
-			XEL_TSR_XMIT_BUSY_MASK);
-
-	reg = in_be32 (dev->iobase +
-			(emaclite->nexttxbuffertouse ^ XEL_TSR_OFFSET) + 0);
-	txpongbusy = ((reg & XEL_TSR_XMIT_BUSY_MASK) ==
-			XEL_TSR_XMIT_BUSY_MASK);
+	tmp = ~in_be32(&regs->tx_ping_tsr);
+	if (emaclite->txpp)
+		tmp |= ~in_be32(&regs->tx_pong_tsr);
 
 
-	return !(txpingbusy && txpongbusy);
+	return !(tmp & XEL_TSR_XMIT_BUSY_MASK);
 }
 }
 
 
 static int emaclite_send(struct eth_device *dev, void *ptr, int len)
 static int emaclite_send(struct eth_device *dev, void *ptr, int len)
@@ -415,7 +407,7 @@ static int emaclite_send(struct eth_device *dev, void *ptr, int len)
 	if (len > PKTSIZE)
 	if (len > PKTSIZE)
 		len = PKTSIZE;
 		len = PKTSIZE;
 
 
-	while (!xemaclite_txbufferavailable(dev) && maxtry) {
+	while (xemaclite_txbufferavailable(emaclite) && maxtry) {
 		udelay(10);
 		udelay(10);
 		maxtry--;
 		maxtry--;
 	}
 	}