From patchwork Mon Jan 22 09:09:37 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jinjian Song X-Patchwork-Id: 13524990 X-Patchwork-Delegate: kuba@kernel.org Received: from AUS01-ME3-obe.outbound.protection.outlook.com (mail-me3aus01olkn2182.outbound.protection.outlook.com [40.92.63.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8870038F94 for ; Mon, 22 Jan 2024 09:10:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.92.63.182 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705914619; cv=fail; b=gK7LVs1dJLx0tny0Z8Src8JAK33/CT+hreBc6P3khqxleOER0fl/p1pQeMuIv3xr1zoSd8brKqGq4TfVns+dn0HPQeC/AwR/zSncTJDSa9VU21Jmijy6I4wIw+JnFBsI+35NoQ35Dp9bnEKKyaNp5WHfntgY/A/+31JngHlor+c= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705914619; c=relaxed/simple; bh=FG8CrWsUY0c8tU+EHWVuFa407oPP9CichIkfeUcSDkU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=fUaFl9eyuT1naalzzfWEqsl2CLoMsPyWXVqe1hdym/x5E4HDEqtr3N8AIbp3m8+9RRo62qH0Iimr5Qjc4TKQH6mS3MY4jqCKEtwMqoZyZN+YK9vKkK9kauBVJTQNVXS5cRwcxbYrAFXbRDN3QZc3SO/LgkniaALz6/kyhj2cP3g= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=hotmail.com; spf=pass smtp.mailfrom=hotmail.com; dkim=pass (2048-bit key) header.d=hotmail.com header.i=@hotmail.com header.b=JUIg//AH; arc=fail smtp.client-ip=40.92.63.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=hotmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=hotmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=hotmail.com header.i=@hotmail.com header.b="JUIg//AH" ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=VqHgav7n7bA7pOY+tPApuNvdM+b7cTLBLmUUpIoL2bZqPTjzhSqo8G2J2Dg3/SeNGmQDA6bQbxn8k1SQUnpd7TtUg3/HAzamxHZTuet1eSSQaFd0102NxoZMj9uZIdRQu7GiqlOiE0psdVYCwUV3+Fp8eFVucJqbOB9VlQzfHIJESqAhQy+r4ZNJe0I/WqbNbs0tVM79KIE72U0LcXctuiyVVjv+sjnIMl1Wh7eXPUXSlIDoWybLL5mhYDG3eY0/ZN6VOo73ZZuHifi4DYWAWcR0gwZQRaBdR5jDMVr/w7sN4ulmut78FA6hx8jMLoS/x7dqAU2LbYNykXlkZyEpeg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=xVMF2JDXbBaUsGUKXz9oqyhCDBc7okLDok0YYpYhQr8=; b=lUvyzLN6znP7RPIJEbnOycXxOGMWcHOOOzon6WE1qdadLKtIMazkKNA7yu4nOVzJYIm/md5fJnWQgav45CJsR7bR0egiTsBz74/wSW7pAcQWiaa4vT2s0pMSGfCpXXvROd5uv8luqt+WsiP+CFWJlWiDZ7MdPwn9zoNfLexld0izH7+Pz32wqhKkfuKrqUVTqK5I0Bq6Xm3sptS63eZ1h/SRl4q4olWHeXcr7n31l+9te0LU+c0POtIxPWXP1RT1D0t+yBHaTa8nHvkZ9jXBOkmt0uCtx/P6YHqQPgDuRSoo69YZ08o7aNFaXH+7QsE4vH28f+yTHcRM8O2d7qxtZw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hotmail.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=xVMF2JDXbBaUsGUKXz9oqyhCDBc7okLDok0YYpYhQr8=; b=JUIg//AHNHO6Dkka/6sT4l6h0m4oujAUWLRRiCpoaN2CnE+oxRY7nT+2/syf+XPN6WaBkNLN4HDkmJkDPbP1d4TbO4EZAMLaO45MlVIXCuvO47D29BVVllkceNcfips82Ga7Zt1pccC84nR3EYp7LJxlH5KsSHMG7h9liMzlLBcy9SycHa0XOntrNTVrZEUrIdis6frn4/q958dBF5EV2UQHKgkPaBXd1VQSpqOWhEZ0bxs/cIyoz5f2NqZJvz+lWR9QloBwoz7sFJ0nAtuZLDa5c0xoMnaMZD4l13JqZn+DPwgiYB87LUnTR4UkJ8ReQbwL+37DSpdyx6h7bhQMwQ== Received: from MEYP282MB2697.AUSP282.PROD.OUTLOOK.COM (2603:10c6:220:14c::12) by SY5P282MB4893.AUSP282.PROD.OUTLOOK.COM (2603:10c6:10:26e::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7202.32; Mon, 22 Jan 2024 09:10:10 +0000 Received: from MEYP282MB2697.AUSP282.PROD.OUTLOOK.COM ([fe80::4b5:c5db:e39a:e48f]) by MEYP282MB2697.AUSP282.PROD.OUTLOOK.COM ([fe80::4b5:c5db:e39a:e48f%3]) with mapi id 15.20.7202.031; Mon, 22 Jan 2024 09:10:10 +0000 From: Jinjian Song To: netdev@vger.kernel.org Cc: chandrashekar.devegowda@intel.com, chiranjeevi.rapolu@linux.intel.com, haijun.liu@mediatek.com, m.chetan.kumar@linux.intel.com, ricardo.martinez@linux.intel.com, loic.poulain@linaro.org, ryazanov.s.a@gmail.com, johannes@sipsolutions.net, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, linux-kernel@vger.kernel.com, vsankar@lenovo.com, danielwinkler@google.com, nmarupaka@google.com, joey.zhao@fibocom.com, liuqf@fibocom.com, felix.yan@fibocom.com, Jinjian Song Subject: [net-next v5 1/4] wwan: core: Add WWAN fastboot port type Date: Mon, 22 Jan 2024 17:09:37 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240122090940.10108-1-songjinjian@hotmail.com> References: <20240122090940.10108-1-songjinjian@hotmail.com> X-TMN: [EniaLaL2SDUJutXpx1bYQfYQv7NiESLT] X-ClientProxiedBy: SI2P153CA0010.APCP153.PROD.OUTLOOK.COM (2603:1096:4:140::13) To MEYP282MB2697.AUSP282.PROD.OUTLOOK.COM (2603:10c6:220:14c::12) X-Microsoft-Original-Message-ID: <20240122090940.10108-2-songjinjian@hotmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MEYP282MB2697:EE_|SY5P282MB4893:EE_ X-MS-Office365-Filtering-Correlation-Id: 5f873f17-8958-4c6f-06a0-08dc1b29ef2f X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: dbORQjQ+ucrjmAR6k+LXD0mZPkrJHTeHjdFXASa+AHjmzgcD2VoTcrnPs5YE9VdC4FNaXun7o1zE3Mv6810s+LGQGuzwUbN1VT0XccPkPQSxPjsCOZ3+vhHhQwgYgVkQYiVFVSdPJzWnEbSK9iPq0bhqTk/Elx6oWgLOgbsp7tD5ZbMtnz5B2eiYVpVmUUfhC8JNhhYf40onnpzfzduo7ADPuzIixa3otXeixp35uU9JnpP2SYzWytJb9XmQbXRywYbkFs7sQWfHdBx9srcFn8s5TaCIwxGZyFS3B3umxVOH3ilXvrrBXryoxj7VRZTa0yPkHZf9J/QS5cQU26i9oYkq9rFL4w1so92xjnioFCV14ixnLZTkcSIH2GTfCZRbxR5+0ltm0XItbcLfO1oCTF5jP3FNiITsiIti09dKSYOaD+WcoI8OfSjM6HcUZI8Ug+1kqdl7oK0NmNQZNCuIHeEdk/UXBBIKJr07DrHEr20U0beuwrmTGne1MwpsKcras4fM7KrbJ2Vw9gmK4HyNaSYPRGrcid2LDH4cHFFuPfoX0Oj1gCN+hUVtn9acnRtX X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: bIAlXqGQeR/RYpQgZl9W4zBf2R2CtGoDX4MCN+x8UwLtp3GmDB/dOrOSURCiP3AFq+BSY7WKqd8GzrfagTF9lp4t0B8p/i/hbfPX8FzWdbgSRhwkPX9JbYTpKZ3b2nN0LSWIJBNbUtfLKQc9+G+o2B5TIOoRTmmexbc2pbgsgu8zJUsxfPD70UfDArvK3/aEI6+18EJffjLdgZ5Im0tL+PcONBvqR2y9La6OTbKqbEGyG0O4d/4Mvuly1NHTeBt0HO5fOL05hWNMXG2eeDHJkA3Xl+uJml864rsv86IrGosNNUf8fkljeNNzELuFf5a5alvQtkLSVdl54AJDSxp9wEi79g+zCWJ8Mdkj7rT5hGQsYFCuC+IoxXpbY/15C55nVMrZJYu0yU9w5qh0dVaiP1wx8VDnTPGAV8PW0XXgyh7wa+H6GwnYzY1loAtWDi6z7kSbLiW7tlb9Kgjf2MwEJIUG+aJiYSxcweAxzpwAKp/TpTnKlEqYZsVtmOrN8vNaSyRRN46oaKXQ3YyFU6u0kCtiejXLUwL/tryIeCRN7NSmE0Y9c8PYXxRR2gwsR3PaowhMV4CYqqvrymJwHCrsj9t/rV8pK9YzheYD4s+6tgIDlIcAVk1vB5FzEpc2/ctwAmMdLkCfHyhS5Tl4FyJmXYBR/E/iHF1o06d+kyOhyFjadX8ZdcFZ/+6gkcavyUXDA61nXsdlrYOwczLQl9OWbBfpMkyUsH9TPSt+OXF0eLTeR8eNad8dZys291HvL0GdgXme+iA1wt0VICBRBBxr0MYfxvfHD4t0NNibKKFEsNhwImGYB+hj3KHpohdPbYxzBlR9yTbrBUhbe0+YRYOya8lMV9qGzfmlO3Gt4UDblWsJGGUlrr+QqeMKPJjv65VF06VIGKOrEHF9utVxYUTtmXvEbJmdEKXhdeobGurgJVtdVpsIgxAU9dCF6kA/ipo2zAQH6HqMsywpzHlfikptDMJXNZonz63cIyMLJY+9GwMXdA2i++3h9h83aTXm4PN4XESHCBP+mJQFyIeqYhVvZCtDOcOkpuF7A4zuZ2OC5cC8cQYroPU7Ou5z+HYsNKiQt1KAirNZkKBerp/jZuOS2NUq6UhgyzmiWbO4C/aQuwgT962T8h4KxlhvvjLYJ38b1C2N4XVbzJwT1tEey1SPlXfqEX0O/dLxr5VVGRL6Hf/tFxOyFpwml3zIHhI4fEx3r+6/S1qoMh2LKq/XgyIhnIKuTWn2JghEbFo/e7KHk3E= X-OriginatorOrg: sct-15-20-4755-11-msonline-outlook-746f3.templateTenant X-MS-Exchange-CrossTenant-Network-Message-Id: 5f873f17-8958-4c6f-06a0-08dc1b29ef2f X-MS-Exchange-CrossTenant-AuthSource: MEYP282MB2697.AUSP282.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jan 2024 09:10:10.3231 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: SY5P282MB4893 X-Patchwork-Delegate: kuba@kernel.org From: Jinjian Song Add a new WWAN port that connects to the device fastboot protocol interface. Signed-off-by: Jinjian Song --- v5: * no change v4: * no change v3: * no change v2: * no change --- drivers/net/wwan/wwan_core.c | 4 ++++ include/linux/wwan.h | 2 ++ 2 files changed, 6 insertions(+) diff --git a/drivers/net/wwan/wwan_core.c b/drivers/net/wwan/wwan_core.c index 72e01e550a16..2ed20b20e7fc 100644 --- a/drivers/net/wwan/wwan_core.c +++ b/drivers/net/wwan/wwan_core.c @@ -328,6 +328,10 @@ static const struct { .name = "XMMRPC", .devsuf = "xmmrpc", }, + [WWAN_PORT_FASTBOOT] = { + .name = "FASTBOOT", + .devsuf = "fastboot", + }, }; static ssize_t type_show(struct device *dev, struct device_attribute *attr, diff --git a/include/linux/wwan.h b/include/linux/wwan.h index 01fa15506286..170fdee6339c 100644 --- a/include/linux/wwan.h +++ b/include/linux/wwan.h @@ -16,6 +16,7 @@ * @WWAN_PORT_QCDM: Qcom Modem diagnostic interface * @WWAN_PORT_FIREHOSE: XML based command protocol * @WWAN_PORT_XMMRPC: Control protocol for Intel XMM modems + * @WWAN_PORT_FASTBOOT: Fastboot protocol control * * @WWAN_PORT_MAX: Highest supported port types * @WWAN_PORT_UNKNOWN: Special value to indicate an unknown port type @@ -28,6 +29,7 @@ enum wwan_port_type { WWAN_PORT_QCDM, WWAN_PORT_FIREHOSE, WWAN_PORT_XMMRPC, + WWAN_PORT_FASTBOOT, /* Add new port types above this line */ From patchwork Mon Jan 22 09:09:38 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jinjian Song X-Patchwork-Id: 13524991 X-Patchwork-Delegate: kuba@kernel.org Received: from AUS01-ME3-obe.outbound.protection.outlook.com (mail-me3aus01olkn2166.outbound.protection.outlook.com [40.92.63.166]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8D4D05697 for ; Mon, 22 Jan 2024 09:10:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.92.63.166 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705914625; cv=fail; b=ca9WsSovBjQDmSasmc9BteMNLeGSsWT12TSCh4WB9N/v4cSXF30/cqLHmiTQEwsOv9SBoFy645tLRcugjFGUtLhSIgXxiitkgoUEAKH/h7WefXb1dlKmruC5ilPc+4MIdo+HaY0ZGYpwoB5RHzRtMIsVivcNqxxYRLiISwij+kc= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705914625; c=relaxed/simple; bh=mDL0/OEu95MCOb52OJh/YzjG7B4OPIRzqAzd02nXVIM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=mgZB7H1vY6Uc3CoeKb3JqZTxmnYSnBhvYOsXCkMVJu2C7xRGbkYkRW2iXmr+G0t3x17Frq+4HKQfu1HmU/36AfVm5zdWvyScQgwwcJp9VMo6aUGxbyyueAvBXOsob45BKwNwt7cEsR9mreY/ZgaAcm59IwZkDluMdMT6j/3tYVI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=hotmail.com; spf=pass smtp.mailfrom=hotmail.com; dkim=pass (2048-bit key) header.d=hotmail.com header.i=@hotmail.com header.b=Pe5TSqY0; arc=fail smtp.client-ip=40.92.63.166 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=hotmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=hotmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=hotmail.com header.i=@hotmail.com header.b="Pe5TSqY0" ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=BQKXPMM8c8THmKYCbadL58g0m2oPKOV+XQvhUDnVJvIpSYXO70PEVdMecXjU36spJunqJxaDqCtBrvYuAzYg4aEUxGRj7BZmbpn7xNaTijLphcHl7cfXrVEKDsTfHpN/7Jo5f1QBcvbN9jD9SlnOqb5DT8n/wzKu/zFkTVGATh1Wb0EJqFt/pqvWNYL3LtglecebmjKvbOwUw/ejW/gubGCW2YKLKacAgiIatE3Uew4AZ6xTHzkrhZooyb8h8XmjrVLRAOJr4/bOnRVDNpz9fLDmVaZX++xoUC5/CQkkjWazRoTYjxgycQv/d/2v2KB9RnF6c2Pthnq9vdlncxGGoA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=g9s7QEHa9n2gu4UFKFF1iRn5LzoR5hrMJc/w6aMY+x4=; b=OysBmC7haCPsx/1UUEcL7Ljo529e31XLTq5WgfxD2+MZFysI6PhNQ6MAdx2mRZuhF+wuir0oINoDwlTPgd3AieY/IleS7fr2usRp8QAE/ZtKqRFdnlM9rkmB7KnD2Az7VeuBgujRj3RU8QX0P8GQOhpGiZZ4HhoR6knhqPhOf4nuGySl6tpdDFAwGfscWWc99+lt731eOsDZLd5kS70wZeF5eT0T0RAGAJoQMS0Pz94UX3AuOQbIAYD9AGhtrGz2Nzma7SsOGGL9MzLA0bEp5VLr0c7jpmaHPwkqiLFIUov1Rci4l56Frqo8vqAR2vMZZ9oerbQis8eHvjhFcjAwbg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hotmail.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=g9s7QEHa9n2gu4UFKFF1iRn5LzoR5hrMJc/w6aMY+x4=; b=Pe5TSqY0F3Uxa+vgqPIaPUq1MqgePxghd0Vz3HOyCAzwoYe+d1Hqxr1d1m+ljUjyuZwm8qEWUUV5Zy2XJ4Xir+9BLQrVSptt72FjnaaRcvjeB0FhZ+Mh0Oc+B4Xr6OB7A3hUm/qnufT9NjkhyCrjvV2CqiShpU4rSB4ndWIFa1B+xXmAZ0eNfvDlJZp1IbqOMl7J7Bslyv86zKSicMX0V1gzwXZ9LP+lBENhYlalUdTRhFpE9xPNeIaT05Pc1RkkEKYBPJAn+ZKCiPgOU8cvM26k0ndRO9jxdVPBgzQrfHnLz1pNVztl/CMqjzesxwchtej1YZAcXKigMd67pIehTw== Received: from MEYP282MB2697.AUSP282.PROD.OUTLOOK.COM (2603:10c6:220:14c::12) by SY5P282MB4893.AUSP282.PROD.OUTLOOK.COM (2603:10c6:10:26e::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7202.32; Mon, 22 Jan 2024 09:10:16 +0000 Received: from MEYP282MB2697.AUSP282.PROD.OUTLOOK.COM ([fe80::4b5:c5db:e39a:e48f]) by MEYP282MB2697.AUSP282.PROD.OUTLOOK.COM ([fe80::4b5:c5db:e39a:e48f%3]) with mapi id 15.20.7202.031; Mon, 22 Jan 2024 09:10:16 +0000 From: Jinjian Song To: netdev@vger.kernel.org Cc: chandrashekar.devegowda@intel.com, chiranjeevi.rapolu@linux.intel.com, haijun.liu@mediatek.com, m.chetan.kumar@linux.intel.com, ricardo.martinez@linux.intel.com, loic.poulain@linaro.org, ryazanov.s.a@gmail.com, johannes@sipsolutions.net, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, linux-kernel@vger.kernel.com, vsankar@lenovo.com, danielwinkler@google.com, nmarupaka@google.com, joey.zhao@fibocom.com, liuqf@fibocom.com, felix.yan@fibocom.com, Jinjian Song Subject: [net-next v5 2/4] net: wwan: t7xx: Add sysfs attribute for device state machine Date: Mon, 22 Jan 2024 17:09:38 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240122090940.10108-1-songjinjian@hotmail.com> References: <20240122090940.10108-1-songjinjian@hotmail.com> X-TMN: [M1Hdfatq5cpHCrBAUaz9vobZCr4XfPIz] X-ClientProxiedBy: SI2P153CA0010.APCP153.PROD.OUTLOOK.COM (2603:1096:4:140::13) To MEYP282MB2697.AUSP282.PROD.OUTLOOK.COM (2603:10c6:220:14c::12) X-Microsoft-Original-Message-ID: <20240122090940.10108-3-songjinjian@hotmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MEYP282MB2697:EE_|SY5P282MB4893:EE_ X-MS-Office365-Filtering-Correlation-Id: 50ce43c6-b7b6-4750-f597-08dc1b29f305 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: +Q2HEwoVzMN5GXiu1uBXKs3S45nxTwZfwejg3zu8NaHMwoqNaJRyQ1lbh5Qe2jxkbGfc3SK45nC9mpEwbm1YmeZLhIGC/0hGduzNZa9/PZ6iw0AeWWNp5aWGme5BwpEJnzlQQLoxXYaRvnKJ+nLYsYK11EFiOV9Hfe8Hhzj4+8vV/vHJaa6jNIYRKmynm+H8SWYnvcrxZVPlmIcpKBSUN90Oy8ZRApz68Bs5aaQGic7FJI0VFfncVQJuPwdckNoSdewfu9gX7WStiFipdhP6yH0x+XH1sxQohQUEfOMyU8FTJA+yHjRGtSs9X0SSoorFxLDWIhcbsdatUW6fT+CzVenGFF/1x4zig7vfiBjJ8jD6VRLLRj3YJzaGnSJ/UBqkZ63817wtpKn5ycO84iIa9j4EKH4kBhYfPestFVZwktjQAOWdndqkcOuz1cFLnLmFPSzo3J1w3zjV+w7lhXoqjI81Evlp7OemGkdaSjfmC8hn7xdA/6N1YdxroU2aBy7w4Mf3dniSlssgePhYWDEN6LV6xm0RyP2+UyfdfmRi1CVZVhf//cFVUv1ElnpQ26g6 X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: OURFvmfzUZ7Y/uhNH4V+0+nSE8b53hfn3Dn8Oe5kt/O4odr5sVk7eOdfcDGnSbVRAnnJBj9Y/V81ptCJKym2vD3dCgoEJ2mh8wXd9/vPJD48SPC5tAKcWz+FXwKA/vOdRGXfuzKamN+nlZPDK2Gy25c9z1JHyiwpI1yA4lEASZJXD5yWHLpTuvsVEBP4YNmit8MPzY8saD4UQyK/tYknrj4ZcdPgNCgtYIM9Cd8WvP9/Z1ttOHgE90doV7/tbPJXzZrFjhCYeSrG3oZj6ma2nq2PFegdyUCtUEHBPCG0Oiuh9McsTfbAHr3wH0Mq86FxBQRTSQu9bPwDOSY1Uu4n71PuLdrkL1ErQkagnz6NaNIa0kTWvZkhrTy2Cf12QqxB8uBbanPIJ4xHPEv3Y8+VZUpXT5irYnXcJcxnqX4zqCB/QQpy97YMR07ITLSqfBklnQ0388tV4hJ7UUdzY9wdmse3VVvuVjRvvoQA5/3osp5WczB/hsGbelagSEH9QV+KFdVqvqEBgbO8S5fJmKYvl0iDxkogHaXbDw7Mu3oSQnn1qrr4EKK3F9DUy8F/NGuIeOwPo+8jF+DGDJqawuj3MnXLB7dctcL/k9xxakxzLhQ48tbB8njkglAKMZMi3C7WvfCC++P0+Idt6pcscpKEpUs11pKIYslPNJN+yefGJaB5Sy0GB/LBUpPaaD01+5zCcDnwR83fIZ+GOvdi/hdDVAZ5nuT4FzEessN6iXH7Q+3W5regxhJsLg5fjcb6qJEdEaEOltBW6cq+6L4MF1IbVfgrekmYNRIN7Mkog9hsLlGI55BAJIJsN6IXbi8VhA1OmyETuqAPgjqJFqs8m0V4w2mdUrw78nYWvOaSUCs5sCScSeGivFJ/dmqQbcaN41o6tjrD3U2zNMScEddelxaAQFtn0zw5pdKNBQxhgAXeF8QFoolhGhTAXKckl1/4be088UVf2iYkx1ml6K18bj6mcDtM/GNwKQliXAohsly79ha93fOHlbuQ49ltSGETCIh/cvkBcQ/vIXRVtIHRua1MBhD3cB+U9PVWGwgHqgpvvqm7TcXDKGD494vdjN4n6Joj3bT+GYasyK+3xL7dGnewztaCWXvb0YI+1We7v8MbjxdVCLhdHUGnbjnlikqPoa+/kp2PuGBBhuCLUg70pdgm3yGHpC3OX/pMZ1FE4twDZAQZXicB52cFjwR1xvHg9/9p0ddcC9W9+Foi1br0pW4fYd8G7c0VlWkgZ8Q0UQk2sGY= X-OriginatorOrg: sct-15-20-4755-11-msonline-outlook-746f3.templateTenant X-MS-Exchange-CrossTenant-Network-Message-Id: 50ce43c6-b7b6-4750-f597-08dc1b29f305 X-MS-Exchange-CrossTenant-AuthSource: MEYP282MB2697.AUSP282.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jan 2024 09:10:16.7257 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: SY5P282MB4893 X-Patchwork-Delegate: kuba@kernel.org From: Jinjian Song Add support for userspace to get/set the device mode, e.g., reset/ready/fastboot mode. Signed-off-by: Jinjian Song --- v5: * add cold reset support via sysfs t7xx_mode v4: * narrow down the set of accepted values in t7xx_mode_store() * change mode type atomic to u32 with READ_ONCE()/WRITE_ONCE() * delete 'T7XX_MODEM' prefix and using sysfs_emit in t7xx_mode_show() * add description of sysfs t7xx_mode in document t7xx.rst v3: * no change v2: * optimizing using goto label in t7xx_pci_probe --- .../networking/device_drivers/wwan/t7xx.rst | 28 ++++++ drivers/net/wwan/t7xx/t7xx_modem_ops.c | 6 ++ drivers/net/wwan/t7xx/t7xx_modem_ops.h | 1 + drivers/net/wwan/t7xx/t7xx_pci.c | 96 ++++++++++++++++++- drivers/net/wwan/t7xx/t7xx_pci.h | 14 ++- drivers/net/wwan/t7xx/t7xx_state_monitor.c | 1 + 6 files changed, 141 insertions(+), 5 deletions(-) diff --git a/Documentation/networking/device_drivers/wwan/t7xx.rst b/Documentation/networking/device_drivers/wwan/t7xx.rst index dd5b731957ca..d13624a52d8b 100644 --- a/Documentation/networking/device_drivers/wwan/t7xx.rst +++ b/Documentation/networking/device_drivers/wwan/t7xx.rst @@ -39,6 +39,34 @@ command and receive response: - open the AT control channel using a UART tool or a special user tool +Sysfs +===== +The driver provides sysfs interfaces to userspace. + +t7xx_mode +--------- +The sysfs interface provides userspace with access to the device mode, this interface +supports read and write operations. + +Device mode: + +- ``UNKNOW`` represents that device in unknown status +- ``READY`` represents that device in ready status +- ``RESET`` represents that device in reset status +- ``FASTBOOT_DL_SWITCHING`` represents that device in fastboot switching status +- ``FASTBOOT_DL_MODE`` represents that device in fastboot download status +- ``FASTBOOT_DL_DUMP_MODE`` represents that device in fastboot dump status + +Read from userspace to get the current device mode. + +:: + $ cat /sys/bus/pci/devices/${bdf}/t7xx_mode + +Write from userspace to set the device mode. + +:: + $ echo FASTBOOT_DL_SWITCHING > /sys/bus/pci/devices/${bdf}/t7xx_mode + Management application development ================================== The driver and userspace interfaces are described below. The MBIM protocol is diff --git a/drivers/net/wwan/t7xx/t7xx_modem_ops.c b/drivers/net/wwan/t7xx/t7xx_modem_ops.c index 24e7d491468e..ca262d2961ed 100644 --- a/drivers/net/wwan/t7xx/t7xx_modem_ops.c +++ b/drivers/net/wwan/t7xx/t7xx_modem_ops.c @@ -177,6 +177,11 @@ int t7xx_acpi_fldr_func(struct t7xx_pci_dev *t7xx_dev) return t7xx_acpi_reset(t7xx_dev, "_RST"); } +int t7xx_acpi_pldr_func(struct t7xx_pci_dev *t7xx_dev) +{ + return t7xx_acpi_reset(t7xx_dev, "MRST._RST"); +} + static void t7xx_reset_device_via_pmic(struct t7xx_pci_dev *t7xx_dev) { u32 val; @@ -192,6 +197,7 @@ static irqreturn_t t7xx_rgu_isr_thread(int irq, void *data) { struct t7xx_pci_dev *t7xx_dev = data; + t7xx_mode_update(t7xx_dev, T7XX_RESET); msleep(RGU_RESET_DELAY_MS); t7xx_reset_device_via_pmic(t7xx_dev); return IRQ_HANDLED; diff --git a/drivers/net/wwan/t7xx/t7xx_modem_ops.h b/drivers/net/wwan/t7xx/t7xx_modem_ops.h index abe633cf7adc..b39e945a92e0 100644 --- a/drivers/net/wwan/t7xx/t7xx_modem_ops.h +++ b/drivers/net/wwan/t7xx/t7xx_modem_ops.h @@ -85,6 +85,7 @@ int t7xx_md_init(struct t7xx_pci_dev *t7xx_dev); void t7xx_md_exit(struct t7xx_pci_dev *t7xx_dev); void t7xx_clear_rgu_irq(struct t7xx_pci_dev *t7xx_dev); int t7xx_acpi_fldr_func(struct t7xx_pci_dev *t7xx_dev); +int t7xx_acpi_pldr_func(struct t7xx_pci_dev *t7xx_dev); int t7xx_pci_mhccif_isr(struct t7xx_pci_dev *t7xx_dev); #endif /* __T7XX_MODEM_OPS_H__ */ diff --git a/drivers/net/wwan/t7xx/t7xx_pci.c b/drivers/net/wwan/t7xx/t7xx_pci.c index 91256e005b84..4c3f70f92470 100644 --- a/drivers/net/wwan/t7xx/t7xx_pci.c +++ b/drivers/net/wwan/t7xx/t7xx_pci.c @@ -52,6 +52,79 @@ #define PM_RESOURCE_POLL_TIMEOUT_US 10000 #define PM_RESOURCE_POLL_STEP_US 100 +static const char * const mode_names[] = { + [T7XX_UNKNOWN] = "UNKNOWN", + [T7XX_READY] = "READY", + [T7XX_RESET] = "RESET", + [T7XX_FASTBOOT_DL_SWITCHING] = "FASTBOOT_DL_SWITCHING", + [T7XX_FASTBOOT_DL_MODE] = "FASTBOOT_DL_MODE", + [T7XX_FASTBOOT_DUMP_MODE] = "FASTBOOT_DUMP_MODE", +}; + +static_assert(ARRAY_SIZE(mode_names) == T7XX_MODE_LAST); + +static ssize_t t7xx_mode_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int index = 0; + struct pci_dev *pdev; + struct t7xx_pci_dev *t7xx_dev; + + pdev = to_pci_dev(dev); + t7xx_dev = pci_get_drvdata(pdev); + if (!t7xx_dev) + return -ENODEV; + + index = sysfs_match_string(mode_names, buf); + if (index == T7XX_FASTBOOT_DL_SWITCHING) + WRITE_ONCE(t7xx_dev->mode, T7XX_FASTBOOT_DL_SWITCHING); + else if (index == T7XX_RESET) + t7xx_acpi_pldr_func(t7xx_dev); + + return count; +}; + +static ssize_t t7xx_mode_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + enum t7xx_mode mode = T7XX_UNKNOWN; + struct pci_dev *pdev; + struct t7xx_pci_dev *t7xx_dev; + + pdev = to_pci_dev(dev); + t7xx_dev = pci_get_drvdata(pdev); + if (!t7xx_dev) + return -ENODEV; + + mode = READ_ONCE(t7xx_dev->mode); + if (mode < T7XX_MODE_LAST) + return sysfs_emit(buf, "%s\n", mode_names[mode]); + + return sysfs_emit(buf, "%s\n", mode_names[T7XX_UNKNOWN]); +} + +static DEVICE_ATTR_RW(t7xx_mode); + +static struct attribute *t7xx_mode_attr[] = { + &dev_attr_t7xx_mode.attr, + NULL +}; + +static const struct attribute_group t7xx_mode_attribute_group = { + .attrs = t7xx_mode_attr, +}; + +void t7xx_mode_update(struct t7xx_pci_dev *t7xx_dev, enum t7xx_mode mode) +{ + if (!t7xx_dev) + return; + + WRITE_ONCE(t7xx_dev->mode, mode); + sysfs_notify(&t7xx_dev->pdev->dev.kobj, NULL, "t7xx_mode"); +} + enum t7xx_pm_state { MTK_PM_EXCEPTION, MTK_PM_INIT, /* Device initialized, but handshake not completed */ @@ -729,16 +802,28 @@ static int t7xx_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) t7xx_pcie_mac_interrupts_dis(t7xx_dev); + ret = sysfs_create_group(&t7xx_dev->pdev->dev.kobj, + &t7xx_mode_attribute_group); + if (ret) + goto err_md_exit; + ret = t7xx_interrupt_init(t7xx_dev); - if (ret) { - t7xx_md_exit(t7xx_dev); - return ret; - } + if (ret) + goto err_remove_group; + t7xx_pcie_mac_set_int(t7xx_dev, MHCCIF_INT); t7xx_pcie_mac_interrupts_en(t7xx_dev); return 0; + +err_remove_group: + sysfs_remove_group(&t7xx_dev->pdev->dev.kobj, + &t7xx_mode_attribute_group); + +err_md_exit: + t7xx_md_exit(t7xx_dev); + return ret; } static void t7xx_pci_remove(struct pci_dev *pdev) @@ -747,6 +832,9 @@ static void t7xx_pci_remove(struct pci_dev *pdev) int i; t7xx_dev = pci_get_drvdata(pdev); + + sysfs_remove_group(&t7xx_dev->pdev->dev.kobj, + &t7xx_mode_attribute_group); t7xx_md_exit(t7xx_dev); for (i = 0; i < EXT_INT_NUM; i++) { diff --git a/drivers/net/wwan/t7xx/t7xx_pci.h b/drivers/net/wwan/t7xx/t7xx_pci.h index f08f1ab74469..0abba7e6f8aa 100644 --- a/drivers/net/wwan/t7xx/t7xx_pci.h +++ b/drivers/net/wwan/t7xx/t7xx_pci.h @@ -43,6 +43,16 @@ struct t7xx_addr_base { typedef irqreturn_t (*t7xx_intr_callback)(int irq, void *param); +enum t7xx_mode { + T7XX_UNKNOWN, + T7XX_READY, + T7XX_RESET, + T7XX_FASTBOOT_DL_SWITCHING, + T7XX_FASTBOOT_DL_MODE, + T7XX_FASTBOOT_DUMP_MODE, + T7XX_MODE_LAST, /* must always be last */ +}; + /* struct t7xx_pci_dev - MTK device context structure * @intr_handler: array of handler function for request_threaded_irq * @intr_thread: array of thread_fn for request_threaded_irq @@ -59,6 +69,7 @@ typedef irqreturn_t (*t7xx_intr_callback)(int irq, void *param); * @md_pm_lock: protects PCIe sleep lock * @sleep_disable_count: PCIe L1.2 lock counter * @sleep_lock_acquire: indicates that sleep has been disabled + * @mode: indicates the device mode */ struct t7xx_pci_dev { t7xx_intr_callback intr_handler[EXT_INT_NUM]; @@ -82,6 +93,7 @@ struct t7xx_pci_dev { #ifdef CONFIG_WWAN_DEBUGFS struct dentry *debugfs_dir; #endif + u32 mode; }; enum t7xx_pm_id { @@ -120,5 +132,5 @@ int t7xx_pci_pm_entity_register(struct t7xx_pci_dev *t7xx_dev, struct md_pm_enti int t7xx_pci_pm_entity_unregister(struct t7xx_pci_dev *t7xx_dev, struct md_pm_entity *pm_entity); void t7xx_pci_pm_init_late(struct t7xx_pci_dev *t7xx_dev); void t7xx_pci_pm_exp_detected(struct t7xx_pci_dev *t7xx_dev); - +void t7xx_mode_update(struct t7xx_pci_dev *t7xx_dev, enum t7xx_mode mode); #endif /* __T7XX_PCI_H__ */ diff --git a/drivers/net/wwan/t7xx/t7xx_state_monitor.c b/drivers/net/wwan/t7xx/t7xx_state_monitor.c index 0bc97430211b..c5d46f45fa62 100644 --- a/drivers/net/wwan/t7xx/t7xx_state_monitor.c +++ b/drivers/net/wwan/t7xx/t7xx_state_monitor.c @@ -272,6 +272,7 @@ static void fsm_routine_ready(struct t7xx_fsm_ctl *ctl) ctl->curr_state = FSM_STATE_READY; t7xx_fsm_broadcast_ready_state(ctl); + t7xx_mode_update(md->t7xx_dev, T7XX_READY); t7xx_md_event_notify(md, FSM_READY); } From patchwork Mon Jan 22 09:09:39 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jinjian Song X-Patchwork-Id: 13524992 X-Patchwork-Delegate: kuba@kernel.org Received: from AUS01-ME3-obe.outbound.protection.outlook.com (mail-me3aus01olkn2158.outbound.protection.outlook.com [40.92.63.158]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 09D3938FB2 for ; Mon, 22 Jan 2024 09:10:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.92.63.158 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705914632; cv=fail; b=j72SH1hgtAN/M30osdGPW1YzLjaRvYrFmYpWXvf+FEXvnwpolW90dbG2EBmtvf58/j+Dg6JwSMDZXBxsmlLXNHjy1n259Y0pbp9nkOSZkOE8/mjLY6UgH6Neasgd1Hl/l7qGIJWTZiRfFCO79Ou/KvKrAeb0a/hOP0gXk84NNOA= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705914632; c=relaxed/simple; bh=lALyFRASXckxQpO+yzA5xWc/3sczxIMWF3BWPI4lyJM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=UD2MYVhzlvYsqUI2770plfj62B+JbwlGI3Asy0Mk+kHuSRZH3F/Lpdn97iUTs1zohV5PYEWwM3cf6nh2JLTb4WNx4OTWyG4uOeutQBX4ojhMVhrPYDTNWkUFsZ+2lu9wmy1tw0VjmwhHr43JxQOBFv6OBGHUTZ1avJvjWZ577z4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=hotmail.com; spf=pass smtp.mailfrom=hotmail.com; dkim=pass (2048-bit key) header.d=hotmail.com header.i=@hotmail.com header.b=Jzc1rkch; arc=fail smtp.client-ip=40.92.63.158 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=hotmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=hotmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=hotmail.com header.i=@hotmail.com header.b="Jzc1rkch" ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ViRMu25tJLyvr19MeDHKhzpk22VlUWNjSA2EtUZwjC9K/nw03W3L7eNGrBe17oqWjmeRcD/dqltcQHtbu/Rkj0qGeHsDd07KSzgjQi/Z293Z9UjcLtruVATlDFXfil2WPdMDUg7rpxmvYfmFiAUn9YrZNlTYFtSjBHMdOWij1v6DWYaYrqncbTTXuo3I3/8XGnO+RhrqmwZNIIyf79aWaAJ5d4qafJjiYUVP/Q3vFjcO6pEyZZGxa4DFPflFCcU9alKJCIG8vDelaWI9/xfAgpSAqQMMOcX//SlZUCTaj4a24Um8X+fs+y1ZCOGD1gYOSE5Vh7tDqGA2127R6TW2Rw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=+CREucNWHMAjW02qYBxlHlqqmJSsxD8MAVx/3eLAj1U=; b=XaWsVT/x4kIZsUV7S6kJYjHM9HtTyrmZozn99lnfbwlIa2HTkruwCmwt0iJz0wAIP5zaRlr4WwXZ+g7shlp+IdbHfjYr8eWVEelpSfQ1hmL3bw56J14G1DMHM45VginAb+8vmXUx28L3hba8HHpKdyXjDW1FCDRaYuL9uGOKu/WYrTTqxmB84WUOUtsG5wf18Uc853nXGzTcdk8svXjpWInj5IKh5e7AZDBpGhx0+XpzJlJtlpAqgIAVWItC4vmk5m4DCVKAHwDRpVVHlWLJEMEIduC//dKjgRbiYY7CaqqS0K9JFSTyiLSgC9Yvfrk046OFjqwAhrZiauihfCEL5w== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hotmail.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=+CREucNWHMAjW02qYBxlHlqqmJSsxD8MAVx/3eLAj1U=; b=Jzc1rkchyv5b/K+HJFF9VMfzudca9opJOrZrOqIqj/RRxzCCQpjxKE5KGjPvZi/K7KROUvWw5vd+5PJpDAwOpffmlRIqRoCHFCbNnNMgvlXhhaGA/3IAEotBYj+eGuhI4xo3cQr0GNDfS92iTYTyhjRbsNIzwv3KcQm0WK/QyrNc90rOJ8vJ4rZS2OhPIzpnZG7v3wY0o+f7Rj7rlF0oJrFn52/Kr4SCxSwVXNe2Tv0PylzfDw3TkUjrpJXgVjlOJ4yrmcUY7+YQnwc01f6qGXQnFUlCKRfy8uYi5t1GMBSwE8OJhE4k6IBrxYr7Yx5k/3y6pkmZarouIOlM37hOqQ== Received: from MEYP282MB2697.AUSP282.PROD.OUTLOOK.COM (2603:10c6:220:14c::12) by SY5P282MB4893.AUSP282.PROD.OUTLOOK.COM (2603:10c6:10:26e::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7202.32; Mon, 22 Jan 2024 09:10:22 +0000 Received: from MEYP282MB2697.AUSP282.PROD.OUTLOOK.COM ([fe80::4b5:c5db:e39a:e48f]) by MEYP282MB2697.AUSP282.PROD.OUTLOOK.COM ([fe80::4b5:c5db:e39a:e48f%3]) with mapi id 15.20.7202.031; Mon, 22 Jan 2024 09:10:22 +0000 From: Jinjian Song To: netdev@vger.kernel.org Cc: chandrashekar.devegowda@intel.com, chiranjeevi.rapolu@linux.intel.com, haijun.liu@mediatek.com, m.chetan.kumar@linux.intel.com, ricardo.martinez@linux.intel.com, loic.poulain@linaro.org, ryazanov.s.a@gmail.com, johannes@sipsolutions.net, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, linux-kernel@vger.kernel.com, vsankar@lenovo.com, danielwinkler@google.com, nmarupaka@google.com, joey.zhao@fibocom.com, liuqf@fibocom.com, felix.yan@fibocom.com, Jinjian Song Subject: [net-next v5 3/4] net: wwan: t7xx: Infrastructure for early port configuration Date: Mon, 22 Jan 2024 17:09:39 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240122090940.10108-1-songjinjian@hotmail.com> References: <20240122090940.10108-1-songjinjian@hotmail.com> X-TMN: [nAG+D3W4qsPkCwcD02hFTrZCvule+sBP] X-ClientProxiedBy: SI2P153CA0010.APCP153.PROD.OUTLOOK.COM (2603:1096:4:140::13) To MEYP282MB2697.AUSP282.PROD.OUTLOOK.COM (2603:10c6:220:14c::12) X-Microsoft-Original-Message-ID: <20240122090940.10108-4-songjinjian@hotmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MEYP282MB2697:EE_|SY5P282MB4893:EE_ X-MS-Office365-Filtering-Correlation-Id: 818c4bc7-01a4-4196-4fa9-08dc1b29f690 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: G4PwQ/NgWoAYqvk1P1bCAQr/jy9eWWK564mYKI5dLiC29+wbxto7hkvWrSpWl6N+cMjfA+cRmS8CcDYPn2n88azaBmAduEuNtOiLX5ycuzCYBAOFopulwwnhtOciJa/+WGur8wGcTbV01HKNr5nCp4gqBWKAPUDq+NEW1V9U9uSREjNgIMEaTlM2Q0YkT8Xmsvy89AMe6A23t/JAXHdA65RLA83KxJJWsFeT8ryM3TNRoAJNUjjL0hF45Nn/o9Dx3joRSQRRgwxhi1ZIJsXkJqZEfS5+qysVFAHuyGP47X2kDmw1k6Goq82MNaou4tsYJ2grkw8cKA7ydMAFGcELxqiqebuBhWV6hj5L91iEh60xHC3DZ95rs63xByz0eVmQzVgUMHb1AbGfHBGkeUaqI4ESNVGWZQ45pW/S+a1NJ+7/gmS7BkPayuxQG/8X8a22Jfq1uXyOfK1x8skEoJQCqu0Nb9PGEswRinz0eJD24zyxFvLf/giwzmaxrhOP4SGsu23pqBTsCE/HWYuWVVfr+kXPhAdaRfBzkuamUjtRQnsdh0m2QwqF/nuucsDoz+S8ZoisL23pEPot9tKXQ/eDSqlh3KZxZpJmZCd2b0NkOJs= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: wjTNFFTiiL7SVvv0UAxe26UGh7xiEowwcGxdahZg2vCjWbcFexzqJ/Rxor4V88PAZYOLIHU0MoYc46GhnmQ5qIm2KTqp+BDRAuUYprBX2YUzz0VVwx6ExciTIvSFIDfgEIPD9mY8CsHSD0/Cax2J8N+b2mwOqjRH5YjUE1o5HCeSmL+NqUEKFLwdRSP44kdOKloBPmrZfIV6fRGYthbXhLACk3Zuav8863qMwOV4PqM2GAR4mJREfu02JshoWGn4URfR6H0cAeOb6agUu94fVANwXX3aBvAU8dAIjQp2MOXofVnfItuc23y3mW2P33eQdg5/pUQMzll4haK0oIW1zN3dR/LbKqgLRiH5qR1URgmKaDJtaSWM80JcxrIVGI+1HSX1G/5NbM8uAL4F8fmlhSsK8EKTdUYVMI5UX2W0/fqpv5rdjfbmdYwD/KtbWd7lzXyxOQ839L9n8+5nRqDKNzXuoXlW0iUCvp1gBPnDjM0U+ChDRd8F1OhfoEpTp/pSMtZ7w9JOHLA+wtQy507pZjet8Y0DkrQB7kiI/3mrJltK2obn3l7bJ2SaMBLOpbyakQBySymnN9b8AFuLliG/IPNSlx9AqPbQPZuepDkUv61lJNQwssMLXZcC969rV4asgkx2FjsZhxFuBkxlnXZxrcjcUqyA99COd2z/anmothUfXPtozBRT+8o9fxQw1B3gMbipkyuPz56eiH0T8zNnRuP6JEOjtCNH91it0D11z2pGCz8l4GeAqPR4U1zx++3XuE+OFlcvZD0tS/OasOqoBqVstcw8IBibpRARZUyIrlm9psVpzylYtVxx2u3Sqs4EYNeD5fQe0FnISNlNve8sAiYaIVAUmRqW3iW3aLW19SBPfxEO1cEEM7sFp3QieKP8bAKozDaY5DnVXTfJmzTTn/EKQj5zr3FkefUi3LSNMR1s+wxj8Le0L7nYMttQ5J2+CxrBSufYgjtuu1NjPoebY6KbsMWZ/fpVWrzA21W9lq34YzkuMT2fyPYQTVm0xWD3vGbjFA3lm2G/RsNlBfLY4hUV58eqHt8nsryqKZR92SUmDda0eORCBdKvCUkmbznFI6nCVg21Zmb47Q9j1togFYXItqnQm7gKL6rIqUm2RWee3Qurc4fv9DSgHdbebgxToUeKhzipt1T0R1yz4BAcU2Z46GK1tkFradJEvRpmCeAmV0LX6ruKsPdmuegps2jP7RVTVuThiUqh6Khr/PB8XB8zpD+WpDGqHA0C+ky4aA0= X-OriginatorOrg: sct-15-20-4755-11-msonline-outlook-746f3.templateTenant X-MS-Exchange-CrossTenant-Network-Message-Id: 818c4bc7-01a4-4196-4fa9-08dc1b29f690 X-MS-Exchange-CrossTenant-AuthSource: MEYP282MB2697.AUSP282.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jan 2024 09:10:22.7255 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: SY5P282MB4893 X-Patchwork-Delegate: kuba@kernel.org From: Jinjian Song To support cases such as FW update or Core dump, the t7xx device is capable of signaling the host that a special port needs to be created before the handshake phase. Adds the infrastructure required to create the early ports which also requires a different configuration of CLDMA queues. Base on the v5 patch version of follow series: 'net: wwan: t7xx: fw flashing & coredump support' (https://patchwork.kernel.org/project/netdevbpf/patch/3777bb382f4b0395cb594a602c5c79dbab86c9e0.1674307425.git.m.chetan.kumar@linux.intel.com/) Signed-off-by: Jinjian Song --- v5: * using t7xx_mode_update to update sysfs t7xx_mode v4: * change PORT_CH_ID_UNIMPORTANT to PORT_CH_UNIMPORTANT * delete t7xx_wait_pm_config() in t7xx_pci_pm_init() * define T7XX_MAX_POSSIBLE_PORTS_NUM to get max port num * define macro wait_for_expected_dev_stage to be more readable * change prev_status to status in struct t7xx_fsm_ctl v3: * no change v2: * no change --- drivers/net/wwan/t7xx/t7xx_hif_cldma.c | 47 +++++--- drivers/net/wwan/t7xx/t7xx_hif_cldma.h | 18 ++- drivers/net/wwan/t7xx/t7xx_modem_ops.c | 4 +- drivers/net/wwan/t7xx/t7xx_pci.c | 2 +- drivers/net/wwan/t7xx/t7xx_port.h | 4 + drivers/net/wwan/t7xx/t7xx_port_proxy.c | 105 +++++++++++++++--- drivers/net/wwan/t7xx/t7xx_port_proxy.h | 10 ++ drivers/net/wwan/t7xx/t7xx_port_wwan.c | 5 +- drivers/net/wwan/t7xx/t7xx_reg.h | 24 +++- drivers/net/wwan/t7xx/t7xx_state_monitor.c | 123 ++++++++++++++++++--- drivers/net/wwan/t7xx/t7xx_state_monitor.h | 1 + 11 files changed, 287 insertions(+), 56 deletions(-) diff --git a/drivers/net/wwan/t7xx/t7xx_hif_cldma.c b/drivers/net/wwan/t7xx/t7xx_hif_cldma.c index cc70360364b7..abc41a7089fa 100644 --- a/drivers/net/wwan/t7xx/t7xx_hif_cldma.c +++ b/drivers/net/wwan/t7xx/t7xx_hif_cldma.c @@ -57,8 +57,6 @@ #define CHECK_Q_STOP_TIMEOUT_US 1000000 #define CHECK_Q_STOP_STEP_US 10000 -#define CLDMA_JUMBO_BUFF_SZ (63 * 1024 + sizeof(struct ccci_header)) - static void md_cd_queue_struct_reset(struct cldma_queue *queue, struct cldma_ctrl *md_ctrl, enum mtk_txrx tx_rx, unsigned int index) { @@ -161,7 +159,7 @@ static int t7xx_cldma_gpd_rx_from_q(struct cldma_queue *queue, int budget, bool skb_reset_tail_pointer(skb); skb_put(skb, le16_to_cpu(gpd->data_buff_len)); - ret = md_ctrl->recv_skb(queue, skb); + ret = queue->recv_skb(queue, skb); /* Break processing, will try again later */ if (ret < 0) return ret; @@ -897,13 +895,13 @@ static void t7xx_cldma_hw_start_send(struct cldma_ctrl *md_ctrl, int qno, /** * t7xx_cldma_set_recv_skb() - Set the callback to handle RX packets. - * @md_ctrl: CLDMA context structure. + * @queue: CLDMA queue. * @recv_skb: Receiving skb callback. */ -void t7xx_cldma_set_recv_skb(struct cldma_ctrl *md_ctrl, +void t7xx_cldma_set_recv_skb(struct cldma_queue *queue, int (*recv_skb)(struct cldma_queue *queue, struct sk_buff *skb)) { - md_ctrl->recv_skb = recv_skb; + queue->recv_skb = recv_skb; } /** @@ -993,6 +991,28 @@ int t7xx_cldma_send_skb(struct cldma_ctrl *md_ctrl, int qno, struct sk_buff *skb return ret; } +static void t7xx_cldma_adjust_config(struct cldma_ctrl *md_ctrl, enum cldma_cfg cfg_id) +{ + int qno; + + for (qno = 0; qno < CLDMA_RXQ_NUM; qno++) { + md_ctrl->rx_ring[qno].pkt_size = CLDMA_SHARED_Q_BUFF_SZ; + t7xx_cldma_set_recv_skb(&md_ctrl->rxq[qno], t7xx_port_proxy_recv_skb); + } + + md_ctrl->rx_ring[CLDMA_RXQ_NUM - 1].pkt_size = CLDMA_JUMBO_BUFF_SZ; + + for (qno = 0; qno < CLDMA_TXQ_NUM; qno++) + md_ctrl->tx_ring[qno].pkt_size = CLDMA_SHARED_Q_BUFF_SZ; + + if (cfg_id == CLDMA_DEDICATED_Q_CFG) { + md_ctrl->tx_ring[CLDMA_Q_IDX_DUMP].pkt_size = CLDMA_DEDICATED_Q_BUFF_SZ; + md_ctrl->rx_ring[CLDMA_Q_IDX_DUMP].pkt_size = CLDMA_DEDICATED_Q_BUFF_SZ; + t7xx_cldma_set_recv_skb(&md_ctrl->rxq[CLDMA_Q_IDX_DUMP], + t7xx_port_proxy_recv_skb_from_dedicated_queue); + } +} + static int t7xx_cldma_late_init(struct cldma_ctrl *md_ctrl) { char dma_pool_name[32]; @@ -1018,16 +1038,9 @@ static int t7xx_cldma_late_init(struct cldma_ctrl *md_ctrl) dev_err(md_ctrl->dev, "control TX ring init fail\n"); goto err_free_tx_ring; } - - md_ctrl->tx_ring[i].pkt_size = CLDMA_MTU; } for (j = 0; j < CLDMA_RXQ_NUM; j++) { - md_ctrl->rx_ring[j].pkt_size = CLDMA_MTU; - - if (j == CLDMA_RXQ_NUM - 1) - md_ctrl->rx_ring[j].pkt_size = CLDMA_JUMBO_BUFF_SZ; - ret = t7xx_cldma_rx_ring_init(md_ctrl, &md_ctrl->rx_ring[j]); if (ret) { dev_err(md_ctrl->dev, "Control RX ring init fail\n"); @@ -1094,6 +1107,7 @@ int t7xx_cldma_alloc(enum cldma_id hif_id, struct t7xx_pci_dev *t7xx_dev) { struct device *dev = &t7xx_dev->pdev->dev; struct cldma_ctrl *md_ctrl; + int qno; md_ctrl = devm_kzalloc(dev, sizeof(*md_ctrl), GFP_KERNEL); if (!md_ctrl) @@ -1102,7 +1116,9 @@ int t7xx_cldma_alloc(enum cldma_id hif_id, struct t7xx_pci_dev *t7xx_dev) md_ctrl->t7xx_dev = t7xx_dev; md_ctrl->dev = dev; md_ctrl->hif_id = hif_id; - md_ctrl->recv_skb = t7xx_cldma_default_recv_skb; + for (qno = 0; qno < CLDMA_RXQ_NUM; qno++) + md_ctrl->rxq[qno].recv_skb = t7xx_cldma_default_recv_skb; + t7xx_hw_info_init(md_ctrl); t7xx_dev->md->md_ctrl[hif_id] = md_ctrl; return 0; @@ -1332,9 +1348,10 @@ int t7xx_cldma_init(struct cldma_ctrl *md_ctrl) return -ENOMEM; } -void t7xx_cldma_switch_cfg(struct cldma_ctrl *md_ctrl) +void t7xx_cldma_switch_cfg(struct cldma_ctrl *md_ctrl, enum cldma_cfg cfg_id) { t7xx_cldma_late_release(md_ctrl); + t7xx_cldma_adjust_config(md_ctrl, cfg_id); t7xx_cldma_late_init(md_ctrl); } diff --git a/drivers/net/wwan/t7xx/t7xx_hif_cldma.h b/drivers/net/wwan/t7xx/t7xx_hif_cldma.h index 4410bac6993a..f2d9941be9c8 100644 --- a/drivers/net/wwan/t7xx/t7xx_hif_cldma.h +++ b/drivers/net/wwan/t7xx/t7xx_hif_cldma.h @@ -31,6 +31,10 @@ #include "t7xx_cldma.h" #include "t7xx_pci.h" +#define CLDMA_JUMBO_BUFF_SZ (63 * 1024 + sizeof(struct ccci_header)) +#define CLDMA_SHARED_Q_BUFF_SZ 3584 +#define CLDMA_DEDICATED_Q_BUFF_SZ 2048 + /** * enum cldma_id - Identifiers for CLDMA HW units. * @CLDMA_ID_MD: Modem control channel. @@ -55,6 +59,11 @@ struct cldma_gpd { __le16 not_used2; }; +enum cldma_cfg { + CLDMA_SHARED_Q_CFG, + CLDMA_DEDICATED_Q_CFG, +}; + struct cldma_request { struct cldma_gpd *gpd; /* Virtual address for CPU */ dma_addr_t gpd_addr; /* Physical address for DMA */ @@ -82,6 +91,7 @@ struct cldma_queue { wait_queue_head_t req_wq; /* Only for TX */ struct workqueue_struct *worker; struct work_struct cldma_work; + int (*recv_skb)(struct cldma_queue *queue, struct sk_buff *skb); }; struct cldma_ctrl { @@ -101,24 +111,22 @@ struct cldma_ctrl { struct md_pm_entity *pm_entity; struct t7xx_cldma_hw hw_info; bool is_late_init; - int (*recv_skb)(struct cldma_queue *queue, struct sk_buff *skb); }; +#define CLDMA_Q_IDX_DUMP 1 #define GPD_FLAGS_HWO BIT(0) #define GPD_FLAGS_IOC BIT(7) #define GPD_DMAPOOL_ALIGN 16 -#define CLDMA_MTU 3584 /* 3.5kB */ - int t7xx_cldma_alloc(enum cldma_id hif_id, struct t7xx_pci_dev *t7xx_dev); void t7xx_cldma_hif_hw_init(struct cldma_ctrl *md_ctrl); int t7xx_cldma_init(struct cldma_ctrl *md_ctrl); void t7xx_cldma_exit(struct cldma_ctrl *md_ctrl); -void t7xx_cldma_switch_cfg(struct cldma_ctrl *md_ctrl); +void t7xx_cldma_switch_cfg(struct cldma_ctrl *md_ctrl, enum cldma_cfg cfg_id); void t7xx_cldma_start(struct cldma_ctrl *md_ctrl); int t7xx_cldma_stop(struct cldma_ctrl *md_ctrl); void t7xx_cldma_reset(struct cldma_ctrl *md_ctrl); -void t7xx_cldma_set_recv_skb(struct cldma_ctrl *md_ctrl, +void t7xx_cldma_set_recv_skb(struct cldma_queue *queue, int (*recv_skb)(struct cldma_queue *queue, struct sk_buff *skb)); int t7xx_cldma_send_skb(struct cldma_ctrl *md_ctrl, int qno, struct sk_buff *skb); void t7xx_cldma_stop_all_qs(struct cldma_ctrl *md_ctrl, enum mtk_txrx tx_rx); diff --git a/drivers/net/wwan/t7xx/t7xx_modem_ops.c b/drivers/net/wwan/t7xx/t7xx_modem_ops.c index ca262d2961ed..fd79a2a1cc6f 100644 --- a/drivers/net/wwan/t7xx/t7xx_modem_ops.c +++ b/drivers/net/wwan/t7xx/t7xx_modem_ops.c @@ -535,7 +535,7 @@ static void t7xx_md_hk_wq(struct work_struct *work) /* Clear the HS2 EXIT event appended in core_reset() */ t7xx_fsm_clr_event(ctl, FSM_EVENT_MD_HS2_EXIT); - t7xx_cldma_switch_cfg(md->md_ctrl[CLDMA_ID_MD]); + t7xx_cldma_switch_cfg(md->md_ctrl[CLDMA_ID_MD], CLDMA_SHARED_Q_CFG); t7xx_cldma_start(md->md_ctrl[CLDMA_ID_MD]); t7xx_fsm_broadcast_state(ctl, MD_STATE_WAITING_FOR_HS2); md->core_md.handshake_ongoing = true; @@ -550,7 +550,7 @@ static void t7xx_ap_hk_wq(struct work_struct *work) /* Clear the HS2 EXIT event appended in t7xx_core_reset(). */ t7xx_fsm_clr_event(ctl, FSM_EVENT_AP_HS2_EXIT); t7xx_cldma_stop(md->md_ctrl[CLDMA_ID_AP]); - t7xx_cldma_switch_cfg(md->md_ctrl[CLDMA_ID_AP]); + t7xx_cldma_switch_cfg(md->md_ctrl[CLDMA_ID_AP], CLDMA_SHARED_Q_CFG); t7xx_cldma_start(md->md_ctrl[CLDMA_ID_AP]); md->core_ap.handshake_ongoing = true; t7xx_core_hk_handler(md, &md->core_ap, ctl, FSM_EVENT_AP_HS2, FSM_EVENT_AP_HS2_EXIT); diff --git a/drivers/net/wwan/t7xx/t7xx_pci.c b/drivers/net/wwan/t7xx/t7xx_pci.c index 4c3f70f92470..25f33f737b19 100644 --- a/drivers/net/wwan/t7xx/t7xx_pci.c +++ b/drivers/net/wwan/t7xx/t7xx_pci.c @@ -181,7 +181,7 @@ static int t7xx_pci_pm_init(struct t7xx_pci_dev *t7xx_dev) pm_runtime_set_autosuspend_delay(&pdev->dev, PM_AUTOSUSPEND_MS); pm_runtime_use_autosuspend(&pdev->dev); - return t7xx_wait_pm_config(t7xx_dev); + return 0; } void t7xx_pci_pm_init_late(struct t7xx_pci_dev *t7xx_dev) diff --git a/drivers/net/wwan/t7xx/t7xx_port.h b/drivers/net/wwan/t7xx/t7xx_port.h index 4ae8a00a8532..f74d3bab810d 100644 --- a/drivers/net/wwan/t7xx/t7xx_port.h +++ b/drivers/net/wwan/t7xx/t7xx_port.h @@ -75,6 +75,8 @@ enum port_ch { PORT_CH_DSS6_TX = 0x20df, PORT_CH_DSS7_RX = 0x20e0, PORT_CH_DSS7_TX = 0x20e1, + + PORT_CH_UNIMPORTANT = 0xffff, }; struct t7xx_port; @@ -135,11 +137,13 @@ struct t7xx_port { }; }; +int t7xx_get_port_mtu(struct t7xx_port *port); struct sk_buff *t7xx_port_alloc_skb(int payload); struct sk_buff *t7xx_ctrl_alloc_skb(int payload); int t7xx_port_enqueue_skb(struct t7xx_port *port, struct sk_buff *skb); int t7xx_port_send_skb(struct t7xx_port *port, struct sk_buff *skb, unsigned int pkt_header, unsigned int ex_msg); +int t7xx_port_send_raw_skb(struct t7xx_port *port, struct sk_buff *skb); int t7xx_port_send_ctl_skb(struct t7xx_port *port, struct sk_buff *skb, unsigned int msg, unsigned int ex_msg); diff --git a/drivers/net/wwan/t7xx/t7xx_port_proxy.c b/drivers/net/wwan/t7xx/t7xx_port_proxy.c index 274846d39fbf..e53a152faee4 100644 --- a/drivers/net/wwan/t7xx/t7xx_port_proxy.c +++ b/drivers/net/wwan/t7xx/t7xx_port_proxy.c @@ -48,6 +48,9 @@ i < (proxy)->port_count; \ i++, (p) = &(proxy)->ports[i]) +#define T7XX_MAX_POSSIBLE_PORTS_NUM \ + (max(ARRAY_SIZE(t7xx_port_conf), ARRAY_SIZE(t7xx_early_port_conf))) + static const struct t7xx_port_conf t7xx_port_conf[] = { { .tx_ch = PORT_CH_UART2_TX, @@ -100,6 +103,18 @@ static const struct t7xx_port_conf t7xx_port_conf[] = { }, }; +static const struct t7xx_port_conf t7xx_early_port_conf[] = { + { + .tx_ch = PORT_CH_UNIMPORTANT, + .rx_ch = PORT_CH_UNIMPORTANT, + .txq_index = CLDMA_Q_IDX_DUMP, + .rxq_index = CLDMA_Q_IDX_DUMP, + .txq_exp_index = CLDMA_Q_IDX_DUMP, + .rxq_exp_index = CLDMA_Q_IDX_DUMP, + .path_id = CLDMA_ID_AP, + }, +}; + static struct t7xx_port *t7xx_proxy_get_port_by_ch(struct port_proxy *port_prox, enum port_ch ch) { const struct t7xx_port_conf *port_conf; @@ -214,7 +229,17 @@ int t7xx_port_enqueue_skb(struct t7xx_port *port, struct sk_buff *skb) return 0; } -static int t7xx_port_send_raw_skb(struct t7xx_port *port, struct sk_buff *skb) +int t7xx_get_port_mtu(struct t7xx_port *port) +{ + enum cldma_id path_id = port->port_conf->path_id; + int tx_qno = t7xx_port_get_queue_no(port); + struct cldma_ctrl *md_ctrl; + + md_ctrl = port->t7xx_dev->md->md_ctrl[path_id]; + return md_ctrl->tx_ring[tx_qno].pkt_size; +} + +int t7xx_port_send_raw_skb(struct t7xx_port *port, struct sk_buff *skb) { enum cldma_id path_id = port->port_conf->path_id; struct cldma_ctrl *md_ctrl; @@ -329,6 +354,39 @@ static void t7xx_proxy_setup_ch_mapping(struct port_proxy *port_prox) } } +/** + * t7xx_port_proxy_recv_skb_from_dedicated_queue() - Dispatch early port received skb. + * @queue: CLDMA queue. + * @skb: Socket buffer. + * + * Return: + ** 0 - Packet consumed. + ** -ERROR - Failed to process skb. + */ +int t7xx_port_proxy_recv_skb_from_dedicated_queue(struct cldma_queue *queue, struct sk_buff *skb) +{ + struct t7xx_pci_dev *t7xx_dev = queue->md_ctrl->t7xx_dev; + struct port_proxy *port_prox = t7xx_dev->md->port_prox; + const struct t7xx_port_conf *port_conf; + struct t7xx_port *port; + int ret; + + port = &port_prox->ports[0]; + if (WARN_ON_ONCE(port->port_conf->rxq_index != queue->index)) { + dev_kfree_skb_any(skb); + return -EINVAL; + } + + port_conf = port->port_conf; + ret = port_conf->ops->recv_skb(port, skb); + if (ret < 0 && ret != -ENOBUFS) { + dev_err(port->dev, "drop on RX ch %d, %d\n", port_conf->rx_ch, ret); + dev_kfree_skb_any(skb); + } + + return ret; +} + static struct t7xx_port *t7xx_port_proxy_find_port(struct t7xx_pci_dev *t7xx_dev, struct cldma_queue *queue, u16 channel) { @@ -359,7 +417,7 @@ static struct t7xx_port *t7xx_port_proxy_find_port(struct t7xx_pci_dev *t7xx_dev ** 0 - Packet consumed. ** -ERROR - Failed to process skb. */ -static int t7xx_port_proxy_recv_skb(struct cldma_queue *queue, struct sk_buff *skb) +int t7xx_port_proxy_recv_skb(struct cldma_queue *queue, struct sk_buff *skb) { struct ccci_header *ccci_h = (struct ccci_header *)skb->data; struct t7xx_pci_dev *t7xx_dev = queue->md_ctrl->t7xx_dev; @@ -444,33 +502,54 @@ static void t7xx_proxy_init_all_ports(struct t7xx_modem *md) spin_lock_init(&port->port_update_lock); port->chan_enable = false; - if (port_conf->ops->init) + if (port_conf->ops && port_conf->ops->init) port_conf->ops->init(port); } t7xx_proxy_setup_ch_mapping(port_prox); } +void t7xx_port_proxy_set_cfg(struct t7xx_modem *md, enum port_cfg_id cfg_id) +{ + struct port_proxy *port_prox = md->port_prox; + const struct t7xx_port_conf *port_conf; + u32 port_count; + int i; + + t7xx_port_proxy_uninit(port_prox); + + if (cfg_id == PORT_CFG_ID_EARLY) { + port_conf = t7xx_early_port_conf; + port_count = ARRAY_SIZE(t7xx_early_port_conf); + } else { + port_conf = t7xx_port_conf; + port_count = ARRAY_SIZE(t7xx_port_conf); + } + + for (i = 0; i < port_count; i++) + port_prox->ports[i].port_conf = &port_conf[i]; + + port_prox->cfg_id = cfg_id; + port_prox->port_count = port_count; + + t7xx_proxy_init_all_ports(md); +} + static int t7xx_proxy_alloc(struct t7xx_modem *md) { - unsigned int port_count = ARRAY_SIZE(t7xx_port_conf); struct device *dev = &md->t7xx_dev->pdev->dev; struct port_proxy *port_prox; - int i; - port_prox = devm_kzalloc(dev, sizeof(*port_prox) + sizeof(struct t7xx_port) * port_count, + port_prox = devm_kzalloc(dev, sizeof(*port_prox) + + sizeof(struct t7xx_port) * T7XX_MAX_POSSIBLE_PORTS_NUM, GFP_KERNEL); if (!port_prox) return -ENOMEM; md->port_prox = port_prox; port_prox->dev = dev; + t7xx_port_proxy_set_cfg(md, PORT_CFG_ID_EARLY); - for (i = 0; i < port_count; i++) - port_prox->ports[i].port_conf = &t7xx_port_conf[i]; - - port_prox->port_count = port_count; - t7xx_proxy_init_all_ports(md); return 0; } @@ -492,8 +571,6 @@ int t7xx_port_proxy_init(struct t7xx_modem *md) if (ret) return ret; - t7xx_cldma_set_recv_skb(md->md_ctrl[CLDMA_ID_AP], t7xx_port_proxy_recv_skb); - t7xx_cldma_set_recv_skb(md->md_ctrl[CLDMA_ID_MD], t7xx_port_proxy_recv_skb); return 0; } @@ -505,7 +582,7 @@ void t7xx_port_proxy_uninit(struct port_proxy *port_prox) for_each_proxy_port(i, port, port_prox) { const struct t7xx_port_conf *port_conf = port->port_conf; - if (port_conf->ops->uninit) + if (port_conf->ops && port_conf->ops->uninit) port_conf->ops->uninit(port); } } diff --git a/drivers/net/wwan/t7xx/t7xx_port_proxy.h b/drivers/net/wwan/t7xx/t7xx_port_proxy.h index 81d059fbc0fb..7f5706811445 100644 --- a/drivers/net/wwan/t7xx/t7xx_port_proxy.h +++ b/drivers/net/wwan/t7xx/t7xx_port_proxy.h @@ -31,11 +31,18 @@ #define RX_QUEUE_MAXLEN 32 #define CTRL_QUEUE_MAXLEN 16 +enum port_cfg_id { + PORT_CFG_ID_INVALID, + PORT_CFG_ID_NORMAL, + PORT_CFG_ID_EARLY, +}; + struct port_proxy { int port_count; struct list_head rx_ch_ports[PORT_CH_ID_MASK + 1]; struct list_head queue_ports[CLDMA_NUM][MTK_QUEUES]; struct device *dev; + enum port_cfg_id cfg_id; struct t7xx_port ports[]; }; @@ -98,5 +105,8 @@ void t7xx_port_proxy_md_status_notify(struct port_proxy *port_prox, unsigned int int t7xx_port_enum_msg_handler(struct t7xx_modem *md, void *msg); int t7xx_port_proxy_chl_enable_disable(struct port_proxy *port_prox, unsigned int ch_id, bool en_flag); +void t7xx_port_proxy_set_cfg(struct t7xx_modem *md, enum port_cfg_id cfg_id); +int t7xx_port_proxy_recv_skb(struct cldma_queue *queue, struct sk_buff *skb); +int t7xx_port_proxy_recv_skb_from_dedicated_queue(struct cldma_queue *queue, struct sk_buff *skb); #endif /* __T7XX_PORT_PROXY_H__ */ diff --git a/drivers/net/wwan/t7xx/t7xx_port_wwan.c b/drivers/net/wwan/t7xx/t7xx_port_wwan.c index 17389c8f6600..ddc20ddfa734 100644 --- a/drivers/net/wwan/t7xx/t7xx_port_wwan.c +++ b/drivers/net/wwan/t7xx/t7xx_port_wwan.c @@ -152,14 +152,15 @@ static int t7xx_port_wwan_disable_chl(struct t7xx_port *port) static void t7xx_port_wwan_md_state_notify(struct t7xx_port *port, unsigned int state) { const struct t7xx_port_conf *port_conf = port->port_conf; - unsigned int header_len = sizeof(struct ccci_header); + unsigned int header_len = sizeof(struct ccci_header), mtu; struct wwan_port_caps caps; if (state != MD_STATE_READY) return; if (!port->wwan.wwan_port) { - caps.frag_len = CLDMA_MTU - header_len; + mtu = t7xx_get_port_mtu(port); + caps.frag_len = mtu - header_len; caps.headroom_len = header_len; port->wwan.wwan_port = wwan_create_port(port->dev, port_conf->port_type, &wwan_ops, &caps, port); diff --git a/drivers/net/wwan/t7xx/t7xx_reg.h b/drivers/net/wwan/t7xx/t7xx_reg.h index c41d7d094c08..9c7dc72ac6f6 100644 --- a/drivers/net/wwan/t7xx/t7xx_reg.h +++ b/drivers/net/wwan/t7xx/t7xx_reg.h @@ -101,11 +101,33 @@ enum t7xx_pm_resume_state { PM_RESUME_REG_STATE_L2_EXP, }; +enum host_event_e { + HOST_EVENT_INIT = 0, + FASTBOOT_DL_NOTIFY = 0x3, +}; + #define T7XX_PCIE_MISC_DEV_STATUS 0x0d1c #define MISC_STAGE_MASK GENMASK(2, 0) #define MISC_RESET_TYPE_PLDR BIT(26) #define MISC_RESET_TYPE_FLDR BIT(27) -#define LINUX_STAGE 4 +#define MISC_RESET_TYPE_PLDR BIT(26) +#define MISC_LK_EVENT_MASK GENMASK(11, 8) +#define HOST_EVENT_MASK GENMASK(31, 28) + +enum lk_event_id { + LK_EVENT_NORMAL = 0, + LK_EVENT_CREATE_PD_PORT = 1, + LK_EVENT_CREATE_POST_DL_PORT = 2, + LK_EVENT_RESET = 7, +}; + +enum t7xx_device_stage { + T7XX_DEV_STAGE_INIT = 0, + T7XX_DEV_STAGE_BROM_PRE = 1, + T7XX_DEV_STAGE_BROM_POST = 2, + T7XX_DEV_STAGE_LK = 3, + T7XX_DEV_STAGE_LINUX = 4, +}; #define T7XX_PCIE_RESOURCE_STATUS 0x0d28 #define T7XX_PCIE_RESOURCE_STS_MSK GENMASK(4, 0) diff --git a/drivers/net/wwan/t7xx/t7xx_state_monitor.c b/drivers/net/wwan/t7xx/t7xx_state_monitor.c index c5d46f45fa62..2bcd061617e2 100644 --- a/drivers/net/wwan/t7xx/t7xx_state_monitor.c +++ b/drivers/net/wwan/t7xx/t7xx_state_monitor.c @@ -47,6 +47,13 @@ #define FSM_MD_EX_PASS_TIMEOUT_MS 45000 #define FSM_CMD_TIMEOUT_MS 2000 +#define wait_for_expected_dev_stage(status) \ + read_poll_timeout(ioread32, status, \ + ((status & MISC_STAGE_MASK) == T7XX_DEV_STAGE_LINUX) || \ + ((status & MISC_STAGE_MASK) == T7XX_DEV_STAGE_LK), 100000, \ + 20000000, false, IREG_BASE(md->t7xx_dev) + \ + T7XX_PCIE_MISC_DEV_STATUS) + void t7xx_fsm_notifier_register(struct t7xx_modem *md, struct t7xx_fsm_notifier *notifier) { struct t7xx_fsm_ctl *ctl = md->fsm_ctl; @@ -206,6 +213,51 @@ static void fsm_routine_exception(struct t7xx_fsm_ctl *ctl, struct t7xx_fsm_comm fsm_finish_command(ctl, cmd, 0); } +static void t7xx_host_event_notify(struct t7xx_modem *md, unsigned int event_id) +{ + u32 value; + + value = ioread32(IREG_BASE(md->t7xx_dev) + T7XX_PCIE_MISC_DEV_STATUS); + value &= ~HOST_EVENT_MASK; + value |= FIELD_PREP(HOST_EVENT_MASK, event_id); + iowrite32(value, IREG_BASE(md->t7xx_dev) + T7XX_PCIE_MISC_DEV_STATUS); +} + +static void t7xx_lk_stage_event_handling(struct t7xx_fsm_ctl *ctl, unsigned int status) +{ + struct t7xx_modem *md = ctl->md; + struct cldma_ctrl *md_ctrl; + enum lk_event_id lk_event; + struct device *dev; + + dev = &md->t7xx_dev->pdev->dev; + lk_event = FIELD_GET(MISC_LK_EVENT_MASK, status); + switch (lk_event) { + case LK_EVENT_NORMAL: + case LK_EVENT_RESET: + break; + + case LK_EVENT_CREATE_PD_PORT: + case LK_EVENT_CREATE_POST_DL_PORT: + md_ctrl = md->md_ctrl[CLDMA_ID_AP]; + t7xx_cldma_hif_hw_init(md_ctrl); + t7xx_cldma_stop(md_ctrl); + t7xx_cldma_switch_cfg(md_ctrl, CLDMA_DEDICATED_Q_CFG); + + t7xx_cldma_start(md_ctrl); + + if (lk_event == LK_EVENT_CREATE_POST_DL_PORT) + t7xx_mode_update(md->t7xx_dev, T7XX_FASTBOOT_DL_MODE); + else + t7xx_mode_update(md->t7xx_dev, T7XX_FASTBOOT_DUMP_MODE); + break; + + default: + dev_err(dev, "Invalid LK event %d\n", lk_event); + break; + } +} + static int fsm_stopped_handler(struct t7xx_fsm_ctl *ctl) { ctl->curr_state = FSM_STATE_STOPPED; @@ -230,7 +282,9 @@ static void fsm_routine_stopping(struct t7xx_fsm_ctl *ctl, struct t7xx_fsm_comma struct cldma_ctrl *md_ctrl; int err; - if (ctl->curr_state == FSM_STATE_STOPPED || ctl->curr_state == FSM_STATE_STOPPING) { + if (ctl->curr_state == FSM_STATE_STOPPED || + ctl->curr_state == FSM_STATE_STOPPING || + ctl->md->rgu_irq_asserted) { fsm_finish_command(ctl, cmd, -EINVAL); return; } @@ -242,11 +296,16 @@ static void fsm_routine_stopping(struct t7xx_fsm_ctl *ctl, struct t7xx_fsm_comma t7xx_fsm_broadcast_state(ctl, MD_STATE_WAITING_TO_STOP); t7xx_cldma_stop(md_ctrl); - if (!ctl->md->rgu_irq_asserted) { - t7xx_mhccif_h2d_swint_trigger(t7xx_dev, H2D_CH_DRM_DISABLE_AP); - /* Wait for the DRM disable to take effect */ - msleep(FSM_DRM_DISABLE_DELAY_MS); + if (READ_ONCE(t7xx_dev->mode) == T7XX_FASTBOOT_DL_SWITCHING) + t7xx_host_event_notify(ctl->md, FASTBOOT_DL_NOTIFY); + t7xx_mhccif_h2d_swint_trigger(t7xx_dev, H2D_CH_DRM_DISABLE_AP); + /* Wait for the DRM disable to take effect */ + msleep(FSM_DRM_DISABLE_DELAY_MS); + + if (READ_ONCE(t7xx_dev->mode) == T7XX_FASTBOOT_DL_SWITCHING) { + t7xx_mhccif_h2d_swint_trigger(t7xx_dev, H2D_CH_DEVICE_RESET); + } else { err = t7xx_acpi_fldr_func(t7xx_dev); if (err) t7xx_mhccif_h2d_swint_trigger(t7xx_dev, H2D_CH_DEVICE_RESET); @@ -318,7 +377,8 @@ static int fsm_routine_starting(struct t7xx_fsm_ctl *ctl) static void fsm_routine_start(struct t7xx_fsm_ctl *ctl, struct t7xx_fsm_command *cmd) { struct t7xx_modem *md = ctl->md; - u32 dev_status; + struct device *dev; + u32 status; int ret; if (!md) @@ -330,23 +390,53 @@ static void fsm_routine_start(struct t7xx_fsm_ctl *ctl, struct t7xx_fsm_command return; } + dev = &md->t7xx_dev->pdev->dev; ctl->curr_state = FSM_STATE_PRE_START; t7xx_md_event_notify(md, FSM_PRE_START); - ret = read_poll_timeout(ioread32, dev_status, - (dev_status & MISC_STAGE_MASK) == LINUX_STAGE, 20000, 2000000, - false, IREG_BASE(md->t7xx_dev) + T7XX_PCIE_MISC_DEV_STATUS); + ret = wait_for_expected_dev_stage(status); + if (ret) { - struct device *dev = &md->t7xx_dev->pdev->dev; + dev_err(dev, "read poll timeout %d\n", ret); + goto finish_command; + } - fsm_finish_command(ctl, cmd, -ETIMEDOUT); - dev_err(dev, "Invalid device status 0x%lx\n", dev_status & MISC_STAGE_MASK); - return; + if (status != ctl->status || cmd->flag != 0) { + u32 stage = FIELD_GET(MISC_STAGE_MASK, status); + + switch (stage) { + case T7XX_DEV_STAGE_INIT: + case T7XX_DEV_STAGE_BROM_PRE: + case T7XX_DEV_STAGE_BROM_POST: + dev_dbg(dev, "BROM_STAGE Entered\n"); + ret = t7xx_fsm_append_cmd(ctl, FSM_CMD_START, 0); + break; + + case T7XX_DEV_STAGE_LK: + dev_dbg(dev, "LK_STAGE Entered\n"); + t7xx_lk_stage_event_handling(ctl, status); + break; + + case T7XX_DEV_STAGE_LINUX: + dev_dbg(dev, "LINUX_STAGE Entered\n"); + t7xx_mhccif_mask_clr(md->t7xx_dev, D2H_INT_PORT_ENUM | + D2H_INT_ASYNC_MD_HK | D2H_INT_ASYNC_AP_HK); + if (cmd->flag == 0) + break; + t7xx_cldma_hif_hw_init(md->md_ctrl[CLDMA_ID_AP]); + t7xx_cldma_hif_hw_init(md->md_ctrl[CLDMA_ID_MD]); + t7xx_port_proxy_set_cfg(md, PORT_CFG_ID_NORMAL); + ret = fsm_routine_starting(ctl); + break; + + default: + break; + } + ctl->status = status; } - t7xx_cldma_hif_hw_init(md->md_ctrl[CLDMA_ID_AP]); - t7xx_cldma_hif_hw_init(md->md_ctrl[CLDMA_ID_MD]); - fsm_finish_command(ctl, cmd, fsm_routine_starting(ctl)); +finish_command: + fsm_finish_command(ctl, cmd, ret); } static int fsm_main_thread(void *data) @@ -518,6 +608,7 @@ void t7xx_fsm_reset(struct t7xx_modem *md) fsm_flush_event_cmd_qs(ctl); ctl->curr_state = FSM_STATE_STOPPED; ctl->exp_flg = false; + ctl->status = T7XX_DEV_STAGE_INIT; } int t7xx_fsm_init(struct t7xx_modem *md) diff --git a/drivers/net/wwan/t7xx/t7xx_state_monitor.h b/drivers/net/wwan/t7xx/t7xx_state_monitor.h index b0b3662ae6d7..7b0a9baf488c 100644 --- a/drivers/net/wwan/t7xx/t7xx_state_monitor.h +++ b/drivers/net/wwan/t7xx/t7xx_state_monitor.h @@ -96,6 +96,7 @@ struct t7xx_fsm_ctl { bool exp_flg; spinlock_t notifier_lock; /* Protects notifier list */ struct list_head notifier_list; + u32 status; /* Device boot stage */ }; struct t7xx_fsm_event { From patchwork Mon Jan 22 09:09:40 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jinjian Song X-Patchwork-Id: 13524993 X-Patchwork-Delegate: kuba@kernel.org Received: from AUS01-ME3-obe.outbound.protection.outlook.com (mail-me3aus01olkn2186.outbound.protection.outlook.com [40.92.63.186]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B624638FB2 for ; Mon, 22 Jan 2024 09:10:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.92.63.186 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705914638; cv=fail; b=MAt46DAX/FmLP1sla4CE3AO7XxTmxGCqkybhScUak6QXMyO1XTMCd9ZI/SO4XZRrz61xmeZXL0Tkvju/tZIy0/MbvcWgoDPUS9xR5xB00O/S9bJoK+qQnfIy9ZqhbxlQ8HC48PFhLLx9Y3VBWutf10lLvgTckurdJj8yBvn2ZyQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705914638; c=relaxed/simple; bh=/TwPvR6wYUCEDHNIIavCi023LHep7cjKtNilJ+t+F+0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: Content-Type:MIME-Version; b=i4njjQoaPUp2Glj61gbI5NdqQz6TmuGNt+Rz4Rd4pyZqKrDyfSbu6zMBbv9sOXvaO9ILrJ1DBUMQZrdWxzHZsjbo3hP1IB+vUzBWIrVSMjhN8lMDDr6gy9Fx3njIJ2tLW3zWvGthO0t3/jajBQVYmnf0rlfEYtiMMUCJzLTZhTc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=hotmail.com; spf=pass smtp.mailfrom=hotmail.com; dkim=pass (2048-bit key) header.d=hotmail.com header.i=@hotmail.com header.b=c0FJbr3Z; arc=fail smtp.client-ip=40.92.63.186 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=hotmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=hotmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=hotmail.com header.i=@hotmail.com header.b="c0FJbr3Z" ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=TaYXdAcheXmwrQ7T7dhFG7cRFL4GSDvSLj2Qh2egUGgrb6Y8O7Y/HquIvTjYu3FtvrXZP8bpJ0kihja5vsp+nT91kVYduw6XEI+2WUs4NSaluyaooyo4K/yBRWsePJODKKrn97oNS+o5+V5awp6xcpVCMuzz2izWK5X8y7bPmU0LNux5DMnSTF+YjBJF/lBqE/wwazzQcqEqJoDnakGXgSwqFnXGHTk3GyKN4EProvSy/Vi/BJBLHAFztORVw80gBKzQIl2Y0bWrYeDQ7VuGoAUikK7lRsMLOt5SKSIP5wF34Wuiih3DLZtX3ZziDL7c6LbHdylv5Efab3CYe+QUyw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=2gV99M/yDC/MRR+3bDBKEWiryR1G5szEsSo+NfjISS4=; b=ogV4FhBKtc9w0ZxrdmNzyqjhGl3lXc4Kiiuq8/VCRhi8WteydpIRvo78dBDfqyCRdBOkv+2XmNIFA7El9R16sA5Ztcqmf1zpYxBkuIIB53/acjixwfVng+vBNBEhDbGSdPcGv/SBlvxeamKj24Sw00tGxDDL3bcmjuJk1YyBjUIYpWNHzZGv/Vv7hsvU9xxxU8m7/NOJaJ3jLj+FjR0lPKa0yGUc1Ok5lhi1wVKjLdRkHcuNHJT6qiRAHCEZid21dXAXYLGNN0bhYwfwZ+BquqU7+Q7KwAV/Moo5yUd+M6cLuBC4mIiXrtM/gpdCReJJ/k/OnpohYWBDnVPVWC44PQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=hotmail.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=2gV99M/yDC/MRR+3bDBKEWiryR1G5szEsSo+NfjISS4=; b=c0FJbr3ZffJVw6DqpNTbsol/MimO5FGiJ3qHnUmz7iV973Hc0Tsgo2GD7r4XfCWTUNvVEs9eSBHAQsLwSf39rINk4gRI5Xz39Fd2CQdRPojxNopr8kvGDSgEPMNQI5C6xSjlUc824fea6m4+qWGd7ZyfVFmnnItfzBg/7JNm1inrzNujUURzL7ZCePH352ur9ghPOgDN/vlItdnLMAyjmk2/mt8ovBCTuGWZbbIS3lK60Q3KFnSJTnrBNB9uR7/P+TLCUP8ZYT0G+2XZVvvIY/SO5A+sqixIYaV63lBX+Rytg1Fy8RzTP06xDVaeXOx1GVEkW9RUGO81jSfBywA2+Q== Received: from MEYP282MB2697.AUSP282.PROD.OUTLOOK.COM (2603:10c6:220:14c::12) by SY5P282MB4893.AUSP282.PROD.OUTLOOK.COM (2603:10c6:10:26e::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7202.32; Mon, 22 Jan 2024 09:10:29 +0000 Received: from MEYP282MB2697.AUSP282.PROD.OUTLOOK.COM ([fe80::4b5:c5db:e39a:e48f]) by MEYP282MB2697.AUSP282.PROD.OUTLOOK.COM ([fe80::4b5:c5db:e39a:e48f%3]) with mapi id 15.20.7202.031; Mon, 22 Jan 2024 09:10:29 +0000 From: Jinjian Song To: netdev@vger.kernel.org Cc: chandrashekar.devegowda@intel.com, chiranjeevi.rapolu@linux.intel.com, haijun.liu@mediatek.com, m.chetan.kumar@linux.intel.com, ricardo.martinez@linux.intel.com, loic.poulain@linaro.org, ryazanov.s.a@gmail.com, johannes@sipsolutions.net, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, linux-kernel@vger.kernel.com, vsankar@lenovo.com, danielwinkler@google.com, nmarupaka@google.com, joey.zhao@fibocom.com, liuqf@fibocom.com, felix.yan@fibocom.com, Jinjian Song Subject: [net-next v5 4/4] net: wwan: t7xx: Add fastboot WWAN port Date: Mon, 22 Jan 2024 17:09:40 +0800 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240122090940.10108-1-songjinjian@hotmail.com> References: <20240122090940.10108-1-songjinjian@hotmail.com> X-TMN: [9cL8Aqv8wePe238BiSEPonibIkp4YNe+] X-ClientProxiedBy: SI2P153CA0010.APCP153.PROD.OUTLOOK.COM (2603:1096:4:140::13) To MEYP282MB2697.AUSP282.PROD.OUTLOOK.COM (2603:10c6:220:14c::12) X-Microsoft-Original-Message-ID: <20240122090940.10108-5-songjinjian@hotmail.com> Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: MEYP282MB2697:EE_|SY5P282MB4893:EE_ X-MS-Office365-Filtering-Correlation-Id: 4ef8a436-286a-448a-3ec0-08dc1b29fa59 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ZomRtvtK9pxI1sA919XQrKdbuT+IpCdM9ntok8LMxvF07mA97vfCBmAxhsT7kve4c2Iy3/fP0neTTkT1T6XGKbsUZEETjr13VUvn6fwcol7HjXizMEC3e4dbDJhgdxF22N73Hw6SwYNXtcB8ipN/pOS4lhHYL1I+2el6eMD3qBk4iX9bugLTCNtPmCLG03uHxF+wWefbPOgwpazK1U4hgvsVn2IhPmCKr0b4ysGdMfznuUnVmpu+yHdGoo9NeuzZj4JVMg9wWbQtqH7Bclb3ABhL3oy/zfWh3BL/KU5HFxEenbJvrQ0KfQMMg1g8ul7Lx/IOwZdINwVqx7QFNVGU+DptMXSkOEOlYZonK6Gxdau/qmmgzUxW5VDhKxLCH3bOMLh8OT1HskYDi5wX5vBBpRspTt4stm9+nCnF/+1ScwomcEqXtY3LtblOhiuY1hPTbVlkkOIQv3Uo1zPMTthnEutJA+nSgOtV7KZpWqtDsaXv4cFerDGpo6AD7j3WghicHohctaokj4+hVJIh07QvxDxDfcmF21XFIz2bt34DqA8qoKSvjMA0DmNPt/JGjJBz X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: cbObdz9w1qhyM6/7mLXlkOOCrHd8DSSMpZZ1A/t69orJM0H6FAZuR4WZF+4JLYOTd7+ML0epsidQKR1anaIEIpEm8RdceGrn/hlxcm3bFaLWgHQzWzA206WuUlUXPXFlmUwSSi63Y/Z2Yo4YbLiunOA26OOebeQzT/A+gMvAucTUJN8pvCrdZ9On6m3nCN1m8m0OWhO6Wzi7zGERSEg3/t2gz11XgXorXp+xjanQgAdXQyF3h70DEFnT703L6keXfLcEj8C/Te8ab9kHNh+mwkLMzCavyO947nN8JdcmpheWaJ3qDkFWZc9i/EYlZi8MRIVDsz0V9Jix8v/TVLfsKNNltbiNXxaKF+Yi4EAlhXg9ky3bjOin7qbv0apnjBt+9bbrgt1exIqUty13HZQjmOhabjSSytBxo06008k83vFqNoSqyb5oZ+h5SlKJVNkq1cv0CzhPfxtWjj/JxFZfPdSxha2YXW8VBaakXVnKyZQFIvSZC9kLl7ndmB47JTOF8wS3utr55gOUNHU8Z/J6B8dxT1gNpMb8RzkQZPsHB62kDa9Yad83Dw/M2vxJrSeNWi55+4W8gBJZAi0do7/+KAhSLk8dPR8+wZRV30KDMFiDQ12EAiIil2age3bbn58AjD8tHuJZpi60hcRUb+b3ujPYFNUSBRG+Mi0fZorfE5c35K2JozuKmnKCMhvqigbIQGVvbwulWKbA6TjYae8CjLevdGOaZSVwKFFKORZ5GGcMLMURdfswzdk3seMkQRtCTB+lK4DzPdgdLqrjyPjeLVI9EVlKq1WyoFzXouqqf+tVWyBjf9C5xXOHtoANNG0PQ3y+q6UOMbIS7T0vc26eq4bD4h3bB5z58BIb6tqHPj1xD/4TgB+JKeTLfEAl7++goNduEUnXw81W12NaXH6IQoAGAeuNXYaVolNkI4kGjMVrvbzREFGfOlr2akDu0lzdOEvK1DDOwoXCSJkla1VAgct3M/PT9gtao735Te6cSxwa6ajlZaUJIYnXLd2JdFz9ocp/q/8d9BX8qXsjA6wa/UPFjEoZyU5k935Zx4MbkF35XeI3nHs0A9rn43wu4xJq+YNwqdCWkGOr4fRcFx5v96/IZpN9MRB2Eesjx6mq22kp44InjAhocJDXh5yOYJSDT8bNkm/+2UbGzrhVDRoUARYY5P8Ef5Ej/FYSYpYGurUQx42m+oI3o1J1VWSZ5CC+PBXcl4j5KMKByKZsjyhh0qO2jYeTXmwIE26LQVxx1oY= X-OriginatorOrg: sct-15-20-4755-11-msonline-outlook-746f3.templateTenant X-MS-Exchange-CrossTenant-Network-Message-Id: 4ef8a436-286a-448a-3ec0-08dc1b29fa59 X-MS-Exchange-CrossTenant-AuthSource: MEYP282MB2697.AUSP282.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Jan 2024 09:10:29.0270 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: SY5P282MB4893 X-Patchwork-Delegate: kuba@kernel.org From: Jinjian Song On early detection of wwan device in fastboot mode, driver sets up CLDMA0 HW tx/rx queues for raw data transfer and then create fastboot port to userspace. Application can use this port to flash firmware and collect core dump by fastboot protocol commands. Signed-off-by: Jinjian Song --- v5: * no change v4: * change function prefix to t7xx_port_fastboot * change the name 'FASTBOOT' to fastboot in struct t7xx_early_port_conf v3: * no change v2: * no change --- .../networking/device_drivers/wwan/t7xx.rst | 14 ++ drivers/net/wwan/t7xx/Makefile | 1 + drivers/net/wwan/t7xx/t7xx_port_fastboot.c | 155 ++++++++++++++++++ drivers/net/wwan/t7xx/t7xx_port_proxy.c | 3 + drivers/net/wwan/t7xx/t7xx_port_proxy.h | 2 + drivers/net/wwan/t7xx/t7xx_state_monitor.c | 4 + 6 files changed, 179 insertions(+) create mode 100644 drivers/net/wwan/t7xx/t7xx_port_fastboot.c diff --git a/Documentation/networking/device_drivers/wwan/t7xx.rst b/Documentation/networking/device_drivers/wwan/t7xx.rst index d13624a52d8b..7257ede90152 100644 --- a/Documentation/networking/device_drivers/wwan/t7xx.rst +++ b/Documentation/networking/device_drivers/wwan/t7xx.rst @@ -125,6 +125,20 @@ The driver exposes an AT port by implementing AT WWAN Port. The userspace end of the control port is a /dev/wwan0at0 character device. Application shall use this interface to issue AT commands. +fastboot port userspace ABI +--------------------------- + +/dev/wwan0fastboot0 character device +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The driver exposes a fastboot protocol interface by implementing +fastboot WWAN Port. The userspace end of the fastboot channel pipe is a +/dev/wwan0fastboot0 character device. Application shall use this interface for +fastboot protocol communication. + +Please note that driver needs to be reloaded to export /dev/wwan0fastboot0 +port, because device needs a cold reset after enter ``FASTBOOT_DL_SWITCHING`` +mode. + The MediaTek's T700 modem supports the 3GPP TS 27.007 [4] specification. References diff --git a/drivers/net/wwan/t7xx/Makefile b/drivers/net/wwan/t7xx/Makefile index 2652cd00504e..ddf03efe388a 100644 --- a/drivers/net/wwan/t7xx/Makefile +++ b/drivers/net/wwan/t7xx/Makefile @@ -11,6 +11,7 @@ mtk_t7xx-y:= t7xx_pci.o \ t7xx_port_proxy.o \ t7xx_port_ctrl_msg.o \ t7xx_port_wwan.o \ + t7xx_port_fastboot.o \ t7xx_hif_dpmaif.o \ t7xx_hif_dpmaif_tx.o \ t7xx_hif_dpmaif_rx.o \ diff --git a/drivers/net/wwan/t7xx/t7xx_port_fastboot.c b/drivers/net/wwan/t7xx/t7xx_port_fastboot.c new file mode 100644 index 000000000000..880931af3433 --- /dev/null +++ b/drivers/net/wwan/t7xx/t7xx_port_fastboot.c @@ -0,0 +1,155 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (c) 2023, Fibocom Wireless Inc. + * + * Authors: + * Jinjian Song + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "t7xx_port.h" +#include "t7xx_port_proxy.h" +#include "t7xx_state_monitor.h" + +static int t7xx_port_fastboot_start(struct wwan_port *port) +{ + struct t7xx_port *port_mtk = wwan_port_get_drvdata(port); + + if (atomic_read(&port_mtk->usage_cnt)) + return -EBUSY; + + atomic_inc(&port_mtk->usage_cnt); + return 0; +} + +static void t7xx_port_fastboot_stop(struct wwan_port *port) +{ + struct t7xx_port *port_mtk = wwan_port_get_drvdata(port); + + atomic_dec(&port_mtk->usage_cnt); +} + +static int t7xx_port_fastboot_tx(struct wwan_port *port, struct sk_buff *skb) +{ + struct t7xx_port *port_private = wwan_port_get_drvdata(port); + struct sk_buff *cur = skb, *cloned; + size_t actual, len, offset = 0; + int ret; + int txq_mtu; + + if (!port_private->chan_enable) + return -EINVAL; + + txq_mtu = t7xx_get_port_mtu(port_private); + if (txq_mtu < 0) + return -EINVAL; + + actual = cur->len; + while (actual) { + len = min_t(size_t, actual, txq_mtu); + cloned = __dev_alloc_skb(len, GFP_KERNEL); + if (!cloned) + return -ENOMEM; + + skb_put_data(cloned, cur->data + offset, len); + + ret = t7xx_port_send_raw_skb(port_private, cloned); + if (ret) { + dev_kfree_skb(cloned); + dev_err(port_private->dev, "Write error on fastboot port, %d\n", ret); + break; + } + offset += len; + actual -= len; + } + + dev_kfree_skb(skb); + return 0; +} + +static const struct wwan_port_ops wwan_ops = { + .start = t7xx_port_fastboot_start, + .stop = t7xx_port_fastboot_stop, + .tx = t7xx_port_fastboot_tx, +}; + +static int t7xx_port_fastboot_init(struct t7xx_port *port) +{ + const struct t7xx_port_conf *port_conf = port->port_conf; + unsigned int header_len = sizeof(struct ccci_header), mtu; + struct wwan_port_caps caps; + + port->rx_length_th = RX_QUEUE_MAXLEN; + + if (!port->wwan.wwan_port) { + mtu = t7xx_get_port_mtu(port); + caps.frag_len = mtu - header_len; + caps.headroom_len = header_len; + port->wwan.wwan_port = wwan_create_port(port->dev, port_conf->port_type, + &wwan_ops, &caps, port); + if (IS_ERR(port->wwan.wwan_port)) + dev_err(port->dev, "Unable to create WWWAN port %s", port_conf->name); + } + + return 0; +} + +static void t7xx_port_fastboot_uninit(struct t7xx_port *port) +{ + if (!port->wwan.wwan_port) + return; + + port->rx_length_th = 0; + wwan_remove_port(port->wwan.wwan_port); + port->wwan.wwan_port = NULL; +} + +static int t7xx_port_fastboot_recv_skb(struct t7xx_port *port, struct sk_buff *skb) +{ + if (!atomic_read(&port->usage_cnt) || !port->chan_enable) { + const struct t7xx_port_conf *port_conf = port->port_conf; + + dev_kfree_skb_any(skb); + dev_err_ratelimited(port->dev, "Port %s is not opened, drop packets\n", + port_conf->name); + /* Dropping skb, caller should not access skb.*/ + return 0; + } + + wwan_port_rx(port->wwan.wwan_port, skb); + + return 0; +} + +static int t7xx_port_fastboot_enable_chl(struct t7xx_port *port) +{ + spin_lock(&port->port_update_lock); + port->chan_enable = true; + spin_unlock(&port->port_update_lock); + + return 0; +} + +static int t7xx_port_fastboot_disable_chl(struct t7xx_port *port) +{ + spin_lock(&port->port_update_lock); + port->chan_enable = false; + spin_unlock(&port->port_update_lock); + + return 0; +} + +struct port_ops fastboot_port_ops = { + .init = t7xx_port_fastboot_init, + .recv_skb = t7xx_port_fastboot_recv_skb, + .uninit = t7xx_port_fastboot_uninit, + .enable_chl = t7xx_port_fastboot_enable_chl, + .disable_chl = t7xx_port_fastboot_disable_chl, +}; diff --git a/drivers/net/wwan/t7xx/t7xx_port_proxy.c b/drivers/net/wwan/t7xx/t7xx_port_proxy.c index e53a152faee4..7200d2d210fc 100644 --- a/drivers/net/wwan/t7xx/t7xx_port_proxy.c +++ b/drivers/net/wwan/t7xx/t7xx_port_proxy.c @@ -112,6 +112,9 @@ static const struct t7xx_port_conf t7xx_early_port_conf[] = { .txq_exp_index = CLDMA_Q_IDX_DUMP, .rxq_exp_index = CLDMA_Q_IDX_DUMP, .path_id = CLDMA_ID_AP, + .ops = &fastboot_port_ops, + .name = "fastboot", + .port_type = WWAN_PORT_FASTBOOT, }, }; diff --git a/drivers/net/wwan/t7xx/t7xx_port_proxy.h b/drivers/net/wwan/t7xx/t7xx_port_proxy.h index 7f5706811445..0f40b4884dc0 100644 --- a/drivers/net/wwan/t7xx/t7xx_port_proxy.h +++ b/drivers/net/wwan/t7xx/t7xx_port_proxy.h @@ -98,6 +98,8 @@ extern struct port_ops ctl_port_ops; extern struct port_ops t7xx_trace_port_ops; #endif +extern struct port_ops fastboot_port_ops; + void t7xx_port_proxy_reset(struct port_proxy *port_prox); void t7xx_port_proxy_uninit(struct port_proxy *port_prox); int t7xx_port_proxy_init(struct t7xx_modem *md); diff --git a/drivers/net/wwan/t7xx/t7xx_state_monitor.c b/drivers/net/wwan/t7xx/t7xx_state_monitor.c index 2bcd061617e2..60bc8d635ade 100644 --- a/drivers/net/wwan/t7xx/t7xx_state_monitor.c +++ b/drivers/net/wwan/t7xx/t7xx_state_monitor.c @@ -229,6 +229,7 @@ static void t7xx_lk_stage_event_handling(struct t7xx_fsm_ctl *ctl, unsigned int struct cldma_ctrl *md_ctrl; enum lk_event_id lk_event; struct device *dev; + struct t7xx_port *port; dev = &md->t7xx_dev->pdev->dev; lk_event = FIELD_GET(MISC_LK_EVENT_MASK, status); @@ -244,6 +245,9 @@ static void t7xx_lk_stage_event_handling(struct t7xx_fsm_ctl *ctl, unsigned int t7xx_cldma_stop(md_ctrl); t7xx_cldma_switch_cfg(md_ctrl, CLDMA_DEDICATED_Q_CFG); + port = &ctl->md->port_prox->ports[0]; + port->port_conf->ops->enable_chl(port); + t7xx_cldma_start(md_ctrl); if (lk_event == LK_EVENT_CREATE_POST_DL_PORT)