Takashi Iwai 157343
From 49d28ebdf1e30d806410eefc7de0a7a1ca5d747c Mon Sep 17 00:00:00 2001
Takashi Iwai 157343
From: Alexander Sverdlin <alexander.sverdlin@nokia.com>
Takashi Iwai 157343
Date: Fri, 16 Oct 2020 16:56:30 +0200
Takashi Iwai 157343
Subject: [PATCH] staging: octeon: Drop on uncorrectable alignment or FCS error
Takashi Iwai 157343
Git-commit: 49d28ebdf1e30d806410eefc7de0a7a1ca5d747c
Takashi Iwai 157343
Patch-mainline: v5.10-rc2
Takashi Iwai 157343
References: git-fixes
Takashi Iwai 157343
Takashi Iwai 157343
Currently in case of alignment or FCS error if the packet cannot be
Takashi Iwai 157343
corrected it's still not dropped. Report the error properly and drop the
Takashi Iwai 157343
packet while making the code around a little bit more readable.
Takashi Iwai 157343
Takashi Iwai 157343
Fixes: 80ff0fd3ab64 ("Staging: Add octeon-ethernet driver files.")
Takashi Iwai 157343
Signed-off-by: Alexander Sverdlin <alexander.sverdlin@nokia.com>
Takashi Iwai 157343
Cc: stable <stable@vger.kernel.org>
Takashi Iwai 157343
Link: https://lore.kernel.org/r/20201016145630.41852-1-alexander.sverdlin@nokia.com
Takashi Iwai 157343
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Takashi Iwai 157343
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 157343
Takashi Iwai 157343
---
Takashi Iwai 157343
 drivers/staging/octeon/ethernet-rx.c |   34 +++++++++++++++++++---------------
Takashi Iwai 157343
 1 file changed, 19 insertions(+), 15 deletions(-)
Takashi Iwai 157343
Takashi Iwai 157343
--- a/drivers/staging/octeon/ethernet-rx.c
Takashi Iwai 157343
+++ b/drivers/staging/octeon/ethernet-rx.c
Takashi Iwai 157343
@@ -83,15 +83,17 @@ static inline int cvm_oct_check_rcv_erro
Takashi Iwai 157343
 	else
Takashi Iwai 157343
 		port = work->word1.cn38xx.ipprt;
Takashi Iwai 157343
 
Takashi Iwai 157343
-	if ((work->word2.snoip.err_code == 10) && (work->word1.len <= 64)) {
Takashi Iwai 157343
+	if ((work->word2.snoip.err_code == 10) && (work->word1.len <= 64))
Takashi Iwai 157343
 		/*
Takashi Iwai 157343
 		 * Ignore length errors on min size packets. Some
Takashi Iwai 157343
 		 * equipment incorrectly pads packets to 64+4FCS
Takashi Iwai 157343
 		 * instead of 60+4FCS.  Note these packets still get
Takashi Iwai 157343
 		 * counted as frame errors.
Takashi Iwai 157343
 		 */
Takashi Iwai 157343
-	} else if (work->word2.snoip.err_code == 5 ||
Takashi Iwai 157343
-		   work->word2.snoip.err_code == 7) {
Takashi Iwai 157343
+		return 0;
Takashi Iwai 157343
+
Takashi Iwai 157343
+	if (work->word2.snoip.err_code == 5 ||
Takashi Iwai 157343
+	    work->word2.snoip.err_code == 7) {
Takashi Iwai 157343
 		/*
Takashi Iwai 157343
 		 * We received a packet with either an alignment error
Takashi Iwai 157343
 		 * or a FCS error. This may be signalling that we are
Takashi Iwai 157343
@@ -122,7 +124,10 @@ static inline int cvm_oct_check_rcv_erro
Takashi Iwai 157343
 				/* Port received 0xd5 preamble */
Takashi Iwai 157343
 				work->packet_ptr.s.addr += i + 1;
Takashi Iwai 157343
 				work->word1.len -= i + 5;
Takashi Iwai 157343
-			} else if ((*ptr & 0xf) == 0xd) {
Takashi Iwai 157343
+				return 0;
Takashi Iwai 157343
+			}
Takashi Iwai 157343
+
Takashi Iwai 157343
+			if ((*ptr & 0xf) == 0xd) {
Takashi Iwai 157343
 				/* Port received 0xd preamble */
Takashi Iwai 157343
 				work->packet_ptr.s.addr += i;
Takashi Iwai 157343
 				work->word1.len -= i + 4;
Takashi Iwai 157343
@@ -132,21 +137,20 @@ static inline int cvm_oct_check_rcv_erro
Takashi Iwai 157343
 					    ((*(ptr + 1) & 0xf) << 4);
Takashi Iwai 157343
 					ptr++;
Takashi Iwai 157343
 				}
Takashi Iwai 157343
-			} else {
Takashi Iwai 157343
-				printk_ratelimited("Port %d unknown preamble, packet dropped\n",
Takashi Iwai 157343
-						   port);
Takashi Iwai 157343
-				cvm_oct_free_work(work);
Takashi Iwai 157343
-				return 1;
Takashi Iwai 157343
+				return 0;
Takashi Iwai 157343
 			}
Takashi Iwai 157343
+
Takashi Iwai 157343
+			printk_ratelimited("Port %d unknown preamble, packet dropped\n",
Takashi Iwai 157343
+					   port);
Takashi Iwai 157343
+			cvm_oct_free_work(work);
Takashi Iwai 157343
+			return 1;
Takashi Iwai 157343
 		}
Takashi Iwai 157343
-	} else {
Takashi Iwai 157343
-		printk_ratelimited("Port %d receive error code %d, packet dropped\n",
Takashi Iwai 157343
-				   port, work->word2.snoip.err_code);
Takashi Iwai 157343
-		cvm_oct_free_work(work);
Takashi Iwai 157343
-		return 1;
Takashi Iwai 157343
 	}
Takashi Iwai 157343
 
Takashi Iwai 157343
-	return 0;
Takashi Iwai 157343
+	printk_ratelimited("Port %d receive error code %d, packet dropped\n",
Takashi Iwai 157343
+			   port, work->word2.snoip.err_code);
Takashi Iwai 157343
+	cvm_oct_free_work(work);
Takashi Iwai 157343
+	return 1;
Takashi Iwai 157343
 }
Takashi Iwai 157343
 
Takashi Iwai 157343
 static int cvm_oct_poll(struct oct_rx_group *rx_group, int budget)