Thread (72 messages) 72 messages, 7 authors, 2011-03-03

Re: [PATCH v3] net: add Faraday FTMAC100 10/100 Ethernet driver

flat view

From: Po-Yu Chuang <hidden>
Date: 2011-01-21 05:03:44
Also in: lkml

Dear Joe,

On Fri, Jan 21, 2011 at 3:00 AM, Joe Perches [off-list ref] wrote:
On Thu, 2011-01-20 at 23:30 +0800, Po-Yu Chuang wrote:
quoted
 drivers/net/ftmac100.c | 1243 ++++++++++++++++++++++++++++++++++++++++++++++++
[]
quoted
+/******************************************************************************
+ * struct napi_struct functions
+ *****************************************************************************/
+static int ftmac100_poll(struct napi_struct *napi, int budget)
+{
+     struct ftmac100 *priv = container_of(napi, struct ftmac100, napi);
+     struct net_device *netdev = priv->netdev;
+     unsigned int status;
+     bool completed = true;
+     int rx = 0;
+
+     status = ioread32(priv->base + FTMAC100_OFFSET_ISR);
+
+     if (status & (FTMAC100_INT_RPKT_FINISH | FTMAC100_INT_NORXBUF)) {
+             /*
+              * FTMAC100_INT_RPKT_FINISH:
+              *      RX DMA has received packets into RX buffer successfully
+              *
+              * FTMAC100_INT_NORXBUF:
+              *      RX buffer unavailable
+              */
+             bool retry;
+
+             do {
+                     retry = ftmac100_rx_packet(priv, &rx);
+             } while (retry && rx < budget);
+
+             if (retry && rx == budget)
+                     completed = false;
Is it useful to retry the NORXBUF case?
The idea is that if I miss packet finished interrupts (then rx buffers used up),
I should retrieve the received packets ASAP to free buffers to HW.
Maybe this is really unnecessary.
I am not quite sure, but I'll do your advice now.
quoted
+     }
+
+     if (status & FTMAC100_INT_NORXBUF) {
+             /* RX buffer unavailable */
+             if (net_ratelimit())
+                     netdev_info(netdev, "INT_NORXBUF\n");
+
+             netdev->stats.rx_over_errors++;
+     }
Perhaps this "if (status & FTMAC100_INT_NORXBUF)" block should be
moved into the test block above it before the retry?
Since status is not changed in the function, it does not matter where
the test is.
But I agree that it is better to handle error cases earlier.
It's possible to miss multiple states because of the ratelimit.

If multiple ISR status bits are possible, it might be better to
combine all netdev_info uses into a single call.

Something like:

       if ((status & (FTMAC100_INT_NORXBUF | FTMAC100_INT_RPKT_LOST |
                      FTMAC100_INT_AHB_ERR | FTMAC100_INT_PHYSTS_CHG)) &&
           net_ratelimit())
               netdev_info(netdev, "ISR status: %x%s%s%s%s\n",
                           status & FTMAC100_INT_NORXBUF ? ": INT_NORXBUF" : "",
                           status & FTMAC100_INT_RPKT_LOST ? ": INT_RPKT_LOST" : "",
                           status & FTMAC100_INT_AHB_ERR ? ": INT_AHB_ERR" : "",
                           status & FTMAC100_INT_PHYSTS_CHG ? " : INT_PHYSTS_CHG" : "");
Agree. Thanks.

best regards,
Po-Yu Chuang
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help