[][add reset option to disable reset for debug]

[Description]
Add reset option for quickly debug purpose
-- echo 0 to disable reset when err occur
-- echo 2 to recovery reset after echo 0
-- echo 1 force to reset

[Release-log]

Change-Id: I98b8eea32bf3de9a4f1e705a6a87f2f798560bc6
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/6263896
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_dbg.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_dbg.c
index 38d2b53..0d5ca16 100755
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_dbg.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_dbg.c
@@ -319,10 +319,42 @@
 				    size_t len, loff_t *off)
 {
 	struct mtk_eth *eth = file->private_data;
+	char buf[8] = "";
+	int count = len;
+	unsigned long dbg_level = 0;
+
+	len = min(count, sizeof(buf) - 1);
+	if (copy_from_user(buf, ptr, len))
+		return -EFAULT;
+
+	buf[len] = '\0';
+	if (kstrtoul(buf, 0, &dbg_level))
+		return -EINVAL;
 
-	atomic_inc(&force);
-	schedule_work(&eth->pending_work);
-	return len;
+	switch(dbg_level)
+	{
+		case 0:
+			if (atomic_read(&reset_lock) == 0)
+				atomic_inc(&reset_lock);
+			break;
+		case 1:
+			if (atomic_read(&force) == 0)
+				atomic_inc(&force);
+			schedule_work(&eth->pending_work);
+			break;
+		case 2:
+			if (atomic_read(&reset_lock) == 1)
+				atomic_dec(&reset_lock);
+			break;
+		default:
+			pr_info("Usage: echo [level] > /sys/kernel/debug/mtketh/reset\n");
+			pr_info("Commands:	 [level] \n");
+			pr_info("			   0	 disable reset \n");
+			pr_info("			   1	 force reset \n");
+			pr_info("			   2	 enable reset\n");
+			break;
+	}
+	return count;
 }
 
 static const struct file_operations fops_reg_w = {
diff --git a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_reset.c b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_reset.c
index e1619cb..4c4f631 100644
--- a/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_reset.c
+++ b/target/linux/mediatek/files-5.4/drivers/net/ethernet/mediatek/mtk_eth_reset.c
@@ -211,7 +211,7 @@
 	if (cur_wdidx == prev_wdidx && is_wtx_busy &&
 	    is_oq_free && is_cdm_full) {
 		err_cnt1++;
-		if (err_cnt1 == 3) {
+		if (err_cnt1 >= 3) {
 			pr_info("WDMA CDM Hang !\n");
 			pr_info("============== Time: %d ================\n",
 				timestamp);
@@ -244,7 +244,7 @@
 		}
 	} else if (is_qfsm_hang && is_qfwd_hang) {
 		err_cnt2++;
-		if (err_cnt2 == 3) {
+		if (err_cnt2 >= 3) {
 			pr_info("QDMA Tx Hang !\n");
 			pr_info("============== Time: %d ================\n",
 				timestamp);
@@ -269,7 +269,7 @@
 		}
 	} else if (is_oq0_stuck && is_cdm1_busy && is_adma_busy) {
 		err_cnt3++;
-		if (err_cnt3 == 3) {
+		if (err_cnt3 >= 3) {
 			pr_info("ADMA Rx Hang !\n");
 			pr_info("============== Time: %d ================\n",
 				timestamp);