The ocelot_rx_frame_word() function can return a negative error code,
however this isn't being checked for consistently.

Also, some constructs can be simplified by using "goto" instead of
repeated "break" statements.

Signed-off-by: Vladimir Oltean <vladimir.olt...@nxp.com>
---
Changes in v2:
Patch is new.

 drivers/net/ethernet/mscc/ocelot_vsc7514.c | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ethernet/mscc/ocelot_vsc7514.c 
b/drivers/net/ethernet/mscc/ocelot_vsc7514.c
index 52ebc69a52cc..ea66b372d63b 100644
--- a/drivers/net/ethernet/mscc/ocelot_vsc7514.c
+++ b/drivers/net/ethernet/mscc/ocelot_vsc7514.c
@@ -620,12 +620,9 @@ static irqreturn_t ocelot_xtr_irq_handler(int irq, void 
*arg)
                for (i = 0; i < OCELOT_TAG_LEN / 4; i++) {
                        err = ocelot_rx_frame_word(ocelot, grp, true, &ifh[i]);
                        if (err != 4)
-                               break;
+                               goto out;
                }
 
-               if (err != 4)
-                       break;
-
                /* At this point the IFH was read correctly, so it is safe to
                 * presume that there is no error. The err needs to be reset
                 * otherwise a frame could come in CPU queue between the while
@@ -646,7 +643,7 @@ static irqreturn_t ocelot_xtr_irq_handler(int irq, void 
*arg)
                if (unlikely(!skb)) {
                        netdev_err(dev, "Unable to allocate sk_buff\n");
                        err = -ENOMEM;
-                       break;
+                       goto out;
                }
                buf_len = info.len - ETH_FCS_LEN;
                buf = (u32 *)skb_put(skb, buf_len);
@@ -654,12 +651,21 @@ static irqreturn_t ocelot_xtr_irq_handler(int irq, void 
*arg)
                len = 0;
                do {
                        sz = ocelot_rx_frame_word(ocelot, grp, false, &val);
+                       if (sz < 0) {
+                               err = sz;
+                               goto out;
+                       }
                        *buf++ = val;
                        len += sz;
                } while (len < buf_len);
 
                /* Read the FCS */
                sz = ocelot_rx_frame_word(ocelot, grp, false, &val);
+               if (sz < 0) {
+                       err = sz;
+                       goto out;
+               }
+
                /* Update the statistics if part of the FCS was read before */
                len -= ETH_FCS_LEN - sz;
 
@@ -668,11 +674,6 @@ static irqreturn_t ocelot_xtr_irq_handler(int irq, void 
*arg)
                        *buf = val;
                }
 
-               if (sz < 0) {
-                       err = sz;
-                       break;
-               }
-
                if (ocelot->ptp) {
                        ocelot_ptp_gettime64(&ocelot->ptp_info, &ts);
 
@@ -702,6 +703,7 @@ static irqreturn_t ocelot_xtr_irq_handler(int irq, void 
*arg)
                dev->stats.rx_packets++;
        }
 
+out:
        if (err < 0) {
                ocelot_write(ocelot, QS_XTR_FLUSH, BIT(grp));
                ocelot_write(ocelot, QS_XTR_FLUSH, 0);
-- 
2.25.1

Reply via email to