Re: [U-Boot] [PATCH 11/14][v2] driver/ldpaa_eth: Retry enqueue if portal was busy

2015-06-25 Thread Joe Hershberger
Hi Prabhakar,

On Thu, Jun 11, 2015 at 4:03 AM, Prabhakar Kushwaha
prabha...@freescale.com wrote:
 Do not immediately return if the enqueue function returns -EBUSY; re-try
 mulitple times.

 if timeout occures, release the buffer.

 Signed-off-by: Prabhakar Kushwaha prabha...@freescale.com
 ---
 Changes for v2: Sending as it is for patchset

  drivers/net/ldpaa_eth/ldpaa_eth.c | 26 --
  1 file changed, 24 insertions(+), 2 deletions(-)

 diff --git a/drivers/net/ldpaa_eth/ldpaa_eth.c 
 b/drivers/net/ldpaa_eth/ldpaa_eth.c
 index 5636511..2716f6c 100644
 --- a/drivers/net/ldpaa_eth/ldpaa_eth.c
 +++ b/drivers/net/ldpaa_eth/ldpaa_eth.c
 @@ -221,8 +221,11 @@ static int ldpaa_eth_tx(struct eth_device *net_dev, void 
 *buf, int len)
 struct dpaa_fd fd;
 u64 buffer_start;
 int data_offset, err;
 +   u32 timeo = (CONFIG_SYS_HZ * 10) / 1000;
 +   u32 time_start;
 struct qbman_swp *swp = dflt_dpio-sw_portal;
 struct qbman_eq_desc ed;
 +   struct qbman_release_desc releasedesc;

 /* Setup the FD fields */
 memset(fd, 0, sizeof(fd));
 @@ -258,9 +261,18 @@ static int ldpaa_eth_tx(struct eth_device *net_dev, void 
 *buf, int len)
 qbman_eq_desc_clear(ed);
 qbman_eq_desc_set_no_orp(ed, 0);
 qbman_eq_desc_set_qd(ed, priv-tx_qdid, priv-tx_flow_id, 0);
 -   err = qbman_swp_enqueue(swp, ed, (const struct qbman_fd *)(fd));
 +
 +   time_start = get_timer(0);
 +
 +   while (get_timer(time_start)  timeo) {
 +   err = qbman_swp_enqueue(swp, ed,
 +   (const struct qbman_fd *)(fd));
 +   if (err != -EBUSY)
 +   break;
 +   }
 +
 if (err  0)
 -   printf(error enqueueing Tx frame\n);
 +   goto error;

 mdelay(1);

 @@ -269,6 +281,16 @@ static int ldpaa_eth_tx(struct eth_device *net_dev, void 
 *buf, int len)
 printf(error Tx Conf frame\n);

 return err;
 +
 +error:
 +   qbman_release_desc_clear(releasedesc);
 +   qbman_release_desc_set_bpid(releasedesc, dflt_dpbp-dpbp_attr.bpid);
 +   do {
 +   /* Release buffer into the QBMAN */
 +   err = qbman_swp_release(swp, releasedesc, buffer_start, 1);
 +   } while (err == -EBUSY);

Are you sure it's 100% safe to have this infinite loop here? Is there
a guarantee that qbman_swp_release() will stop returning -EBUSY?

 +
 +   return err;
  }

  static int ldpaa_eth_open(struct eth_device *net_dev, bd_t *bd)
 --
 1.9.1


 ___
 U-Boot mailing list
 U-Boot@lists.denx.de
 http://lists.denx.de/mailman/listinfo/u-boot
___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot


[U-Boot] [PATCH 11/14][v2] driver/ldpaa_eth: Retry enqueue if portal was busy

2015-06-11 Thread Prabhakar Kushwaha
Do not immediately return if the enqueue function returns -EBUSY; re-try
mulitple times.

if timeout occures, release the buffer.

Signed-off-by: Prabhakar Kushwaha prabha...@freescale.com
---
Changes for v2: Sending as it is for patchset

 drivers/net/ldpaa_eth/ldpaa_eth.c | 26 --
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/drivers/net/ldpaa_eth/ldpaa_eth.c 
b/drivers/net/ldpaa_eth/ldpaa_eth.c
index 5636511..2716f6c 100644
--- a/drivers/net/ldpaa_eth/ldpaa_eth.c
+++ b/drivers/net/ldpaa_eth/ldpaa_eth.c
@@ -221,8 +221,11 @@ static int ldpaa_eth_tx(struct eth_device *net_dev, void 
*buf, int len)
struct dpaa_fd fd;
u64 buffer_start;
int data_offset, err;
+   u32 timeo = (CONFIG_SYS_HZ * 10) / 1000;
+   u32 time_start;
struct qbman_swp *swp = dflt_dpio-sw_portal;
struct qbman_eq_desc ed;
+   struct qbman_release_desc releasedesc;
 
/* Setup the FD fields */
memset(fd, 0, sizeof(fd));
@@ -258,9 +261,18 @@ static int ldpaa_eth_tx(struct eth_device *net_dev, void 
*buf, int len)
qbman_eq_desc_clear(ed);
qbman_eq_desc_set_no_orp(ed, 0);
qbman_eq_desc_set_qd(ed, priv-tx_qdid, priv-tx_flow_id, 0);
-   err = qbman_swp_enqueue(swp, ed, (const struct qbman_fd *)(fd));
+
+   time_start = get_timer(0);
+
+   while (get_timer(time_start)  timeo) {
+   err = qbman_swp_enqueue(swp, ed,
+   (const struct qbman_fd *)(fd));
+   if (err != -EBUSY)
+   break;
+   }
+
if (err  0)
-   printf(error enqueueing Tx frame\n);
+   goto error;
 
mdelay(1);
 
@@ -269,6 +281,16 @@ static int ldpaa_eth_tx(struct eth_device *net_dev, void 
*buf, int len)
printf(error Tx Conf frame\n);
 
return err;
+
+error:
+   qbman_release_desc_clear(releasedesc);
+   qbman_release_desc_set_bpid(releasedesc, dflt_dpbp-dpbp_attr.bpid);
+   do {
+   /* Release buffer into the QBMAN */
+   err = qbman_swp_release(swp, releasedesc, buffer_start, 1);
+   } while (err == -EBUSY);
+
+   return err;
 }
 
 static int ldpaa_eth_open(struct eth_device *net_dev, bd_t *bd)
-- 
1.9.1


___
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot