Takashi Iwai 0e6806
From cd936621379d513bd768319219840b003a45e729 Mon Sep 17 00:00:00 2001
Takashi Iwai 0e6806
From: Zhenguo Zhao <Zhenguo.Zhao1@unisoc.com>
Takashi Iwai 0e6806
Date: Fri, 20 Aug 2021 20:17:46 +0800
Takashi Iwai 0e6806
Subject: [PATCH] tty: n_gsm: Modify cr bit value when config requester
Takashi Iwai 0e6806
Git-commit: cd936621379d513bd768319219840b003a45e729
Takashi Iwai 0e6806
Patch-mainline: v5.16-rc1
Takashi Iwai 0e6806
References: git-fixes
Takashi Iwai 0e6806
Takashi Iwai 0e6806
When n_gsm config "initiator=0",as requester,gsmld will receive dlci
Takashi Iwai 0e6806
SABM and DISC control command frame,the CR bit value should be 1.
Takashi Iwai 0e6806
Takashi Iwai 0e6806
If cr == 0,it will goto invalid,and it can't send UA response
Takashi Iwai 0e6806
frame and open requster dlci.
Takashi Iwai 0e6806
Takashi Iwai 0e6806
        case SABM|PF:
Takashi Iwai 0e6806
-               if (cr == 0)
Takashi Iwai 0e6806
+               if (cr == 0) {
Takashi Iwai 0e6806
+                       printk("gsm_queue invalid\n");
Takashi Iwai 0e6806
                        goto invalid;
Takashi Iwai 0e6806
+                       }
Takashi Iwai 0e6806
Takashi Iwai 0e6806
Example,gsmld receive dlc0 SABM command frame:f9 03 3f 01 1c f9
Takashi Iwai 0e6806
but gsmld goto invalid.
Takashi Iwai 0e6806
Takashi Iwai 0e6806
Kernel test log:
Takashi Iwai 0e6806
[  101.794705] c0 gsmld_receive: 00000000: f9 03 3f 01 1c f9
Takashi Iwai 0e6806
[  101.803341] c0 <-- 0) C: SABM(P)
Takashi Iwai 0e6806
[  101.811371] c0 gsm_queue invalid
Takashi Iwai 0e6806
Takashi Iwai 0e6806
Signed-off-by: Zhenguo Zhao <Zhenguo.Zhao1@unisoc.com>
Takashi Iwai 0e6806
Link: https://lore.kernel.org/r/1629461872-26965-2-git-send-email-zhenguo6858@gmail.com
Takashi Iwai 0e6806
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Takashi Iwai 0e6806
Acked-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai 0e6806
Takashi Iwai 0e6806
---
Takashi Iwai 0e6806
 drivers/tty/n_gsm.c |    4 ++--
Takashi Iwai 0e6806
 1 file changed, 2 insertions(+), 2 deletions(-)
Takashi Iwai 0e6806
Takashi Iwai 0e6806
--- a/drivers/tty/n_gsm.c
Takashi Iwai 0e6806
+++ b/drivers/tty/n_gsm.c
Takashi Iwai 0e6806
@@ -1779,7 +1779,7 @@ static void gsm_queue(struct gsm_mux *gs
Takashi Iwai 0e6806
 
Takashi Iwai 0e6806
 	switch (gsm->control) {
Takashi Iwai 0e6806
 	case SABM|PF:
Takashi Iwai 0e6806
-		if (cr == 0)
Takashi Iwai 0e6806
+		if (cr == 1)
Takashi Iwai 0e6806
 			goto invalid;
Takashi Iwai 0e6806
 		if (dlci == NULL)
Takashi Iwai 0e6806
 			dlci = gsm_dlci_alloc(gsm, address);
Takashi Iwai 0e6806
@@ -1793,7 +1793,7 @@ static void gsm_queue(struct gsm_mux *gs
Takashi Iwai 0e6806
 		}
Takashi Iwai 0e6806
 		break;
Takashi Iwai 0e6806
 	case DISC|PF:
Takashi Iwai 0e6806
-		if (cr == 0)
Takashi Iwai 0e6806
+		if (cr == 1)
Takashi Iwai 0e6806
 			goto invalid;
Takashi Iwai 0e6806
 		if (dlci == NULL || dlci->state == DLCI_CLOSED) {
Takashi Iwai 0e6806
 			gsm_response(gsm, address, DM);