From nobody Sat Feb 7 05:49:53 2026 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0B52C32ED24 for ; Wed, 28 Jan 2026 11:44:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769600658; cv=none; b=N1ty1wCDhHajaDYOhfnvRmj1Re4kBgQgfSK+FJuk/GGvmumBAg7/zu9gZQQARMeo5Sz29s+1En06f1JfzdwMZavEjyVXcrMeOoZHdlz9kyM5TZ4qCCb2ki2iyqIExnfPoa6iLyVL+16wL130JrsQBXUtMkFX47Hn6unESY3OwUE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769600658; c=relaxed/simple; bh=SLi73qi3hgxRSm0wdPcuLW2wYsRLsIuKqPxh1lIcZEI=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version:Content-Type; b=R3f9pOoPwFPK6wKS38G/MkuFAsLacIRJWMtlg55v9p9BGQu6T4vKLilcB+yPTIRXOU3How2whurKeK96Sc8ZyuiX5qQp0EUOI/LmwukkdwSJTaYHpU6uzDYCOG0P/DBxgunbY2Gkh7s46I+qEfpS64LpcjJjH1WoJY4LtJNFA1I= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=CP992iL/; arc=none smtp.client-ip=209.85.128.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="CP992iL/" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-4805ef35864so28531925e9.0 for ; Wed, 28 Jan 2026 03:44:16 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1769600655; x=1770205455; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=FUvr9mq0z1s9Jd1QxtwQCDhfv7uq7+snq/W/AMSNbAw=; b=CP992iL/mJA0exbsaaaXUiheUTDXsrZRDWJHX76+NiYnh6Dv7/zlwi34C1+6r9fHYb V+Jd9sv3frjHA5pgQpNMVXPkgJYUvUxwV5aWhg/WSKVVvza9JQQ682YgVEe1DxKhW9as i+LnBy4GC/opJ3sVzfXcboWadOrH1qB+wAXRHzYdx55WzkpUgoefwqdAgNx39M6N9kn5 BUUIa9Q3IXnskudVbz167OhKtqHR9o+4RBZCGVxx6AefKNNls2YjN59i0BNp+PF2RKtn 1bfV1UB7ipuyA+rF6kUqd23pmG1nBmwLfefLPzSuqE9oHyZaVS/11yeD88Cr1RIpcygx tHPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769600655; x=1770205455; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=FUvr9mq0z1s9Jd1QxtwQCDhfv7uq7+snq/W/AMSNbAw=; b=VNMwPyk8G45D53PGvf0FYrKGDjGC8nYwfq/nEgyMT/z+fYOmR+cT3zucF823NQyMgz K7f5XtKBqYz2tBuP573wGUV482zgGXVEhHkPSu5jxW52EBbgAryil5pYXgbr6Rwtdaaa YixcpxakIohSBCfNNX0b4gkQ+HUI89dKIzu8xFD8nuAirrWdUMjL7ZYxionZIec66aml KMmNFpGwftD1MeNytUJk4ZkrfSbkqTKzbmNLtH9R98FoJqk1W27gYXBo0kFe7HHjyXSG F7bYTAvbLwNbR00welscXGtNaCJaFi0rbEMFfpMs+e28IYOUgCXfP+DBO/t2ekHmgkJZ PEtQ== X-Forwarded-Encrypted: i=1; AJvYcCVfakakistM6eOcVKNtX8+j+rS4Hf6qFYeDnF2kYXcEtB2VGlRx1zUuxA/iR+aIZEro5lrs0mwzHSH3XAE=@vger.kernel.org X-Gm-Message-State: AOJu0Yz5JL5O8N8R/eVgCYUGEB3bjbRN67m2S8ignNqfJk3V3Od9nbzf sUIPyTcRWITmGqdTODNIvv0fn04K9+82SQQU3yg4+yBvosYa4Vlbh1Zf X-Gm-Gg: AZuq6aL66/NF+SG7pvih/OSyFfPCCfzWsHUkfxFgjO1J7nUlAVGfO7ZPwclLHqWVigr k30AawH/vCMFwq+5oiIzHbNRkF9BLmE4qN8Uwnp5OR4WLckW9OCjukM9wUT1nS/rC2T9Ul+AV7t 00+NVUwNVXY+cPwfCn8tMpRNMlC3882GwA3pUorvX9OAIYr0mSpPQrGPnj/dIB5j5YBYXPmLd0/ i0av+skIRQZkvqCtSUMtqZm3y8ppGTcWPkbQnQpIV6RAQOOIfauT1cR77EBrVDMk2yJ0/KUpvNB 7m6yx3RSQnBxQFJqo43yQqX9davpXkm/bBUvkhoD4pVBVDnvdRaVCzAgsAi0XD2GUypIzerm8NK PLRjKYDhBNG6kN0mmgS6Wwb9ovhCh3Mt2ek+bmddy3tORlKePIlwsM/vJCIyH+wn7IfTuW67/4m Qwp67Jp/lDpAEoB2aAGi2QMzxY0IYnuptxeKKfUevoeCVs3Yr0xrF9V3JTPfAhVfw= X-Received: by 2002:a05:600c:8708:b0:480:5678:1fdd with SMTP id 5b1f17b1804b1-48069c0dea2mr61890865e9.12.1769600655166; Wed, 28 Jan 2026 03:44:15 -0800 (PST) Received: from navid-Latitude-E6430.homestation.setup ([188.211.127.107]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48066c428basm132270565e9.12.2026.01.28.03.44.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 28 Jan 2026 03:44:14 -0800 (PST) From: Navid-Derakhshandeh To: alex.bou9@gmail.com, mporter@kernel.crashing.org Cc: linux-rio@vger.kernel.org, linux-kernel@vger.kernel.org, Navid-Derakhshandeh Subject: [PATCH] drivers: switches: ackID realignment implemented, Date: Wed, 28 Jan 2026 15:13:32 +0330 Message-ID: <20260128114400.36585-1-navid.derakhshandeh1@gmail.com> X-Mailer: git-send-email 2.51.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable unpluged handler add for Cable Disconnect Situation and idtg3_em_handler Improved Signed-off-by: Navid-Derakhshandeh --- drivers/rapidio/switches/idt_gen3.c | 151 ++++++++++++++++++++++++---- 1 file changed, 133 insertions(+), 18 deletions(-) diff --git a/drivers/rapidio/switches/idt_gen3.c b/drivers/rapidio/switches= /idt_gen3.c index d7537e62119e..ba3a99b346fc 100644 --- a/drivers/rapidio/switches/idt_gen3.c +++ b/drivers/rapidio/switches/idt_gen3.c @@ -33,6 +33,9 @@ #define RIO_SPx_L2_Gn_ENTRYy_CSR(x, n, y) \ (0x51000 + (x)*0x2000 + (n)*0x400 + (y)*0x4) =20 +#define ACKID_REALIGN_DELAY_MS 20 +#define LINK_STABLE_DELAY_MS 100 + static int idtg3_route_add_entry(struct rio_mport *mport, u16 destid, u8 hopcount, u16 table, u16 route_destid, u8 route_port) @@ -223,36 +226,148 @@ idtg3_em_init(struct rio_dev *rdev) * This way the port is synchronized with freshly inserted device (assumin= g it * was reset/powered-up on insertion). * + * TODO: This is not sufficient in a situation when a link between two dev= ices * was down and up again (e.g. cable disconnect). For that situation full = ackID * realignment process has to be implemented. */ + static int=20 + idtg3_ackid_realign(struct rio_dev *rdev, u8 pnum) + { + u32 ctl; + u32 err; + int retries =3D 3; +=20 + pr_debug("RIO: ackID realign start %s port %d\n", + rio_name(rdev), pnum); +=20 + /* 1. Disable PW generation to stop storms */ + rio_write_config_32(rdev, RIO_PLM_SPx_PW_EN(pnum), 0); +=20 + /* 2. Clear port error status */ + rio_read_config_32(rdev, + RIO_DEV_PORT_N_ERR_STS_CSR(rdev, pnum), &err); +=20 + rio_write_config_32(rdev, + RIO_DEV_PORT_N_ERR_STS_CSR(rdev, pnum), err); +=20 + /* + * 3. Perform port soft reset + * This clears inbound & outbound ackIDs locally + */ + rio_read_config_32(rdev, + RIO_PLM_SPx_IMP_SPEC_CTL(pnum), &ctl); +=20 + rio_write_config_32(rdev, + RIO_PLM_SPx_IMP_SPEC_CTL(pnum), + ctl | RIO_PLM_SPx_IMP_SPEC_CTL_SOFT_RST); +=20 + msleep(ACKID_REALIGN_DELAY_MS); +=20 + rio_write_config_32(rdev, + RIO_PLM_SPx_IMP_SPEC_CTL(pnum), ctl); +=20 + /* + * 4. Wait for link to stabilize + * Required to avoid immediate ES re-trigger + */ + msleep(LINK_STABLE_DELAY_MS); +=20 + /* + * 5. Verify error state + * Retry reset if remote side still mismatched + */ + while (retries--) { + rio_read_config_32(rdev, + RIO_DEV_PORT_N_ERR_STS_CSR(rdev, pnum), &err); +=20 + if (!(err & (RIO_PORT_N_ERR_STS_OUT_ES | + RIO_PORT_N_ERR_STS_INP_ES))) + break; +=20 + pr_debug("RIO: ackID retry %s port %d\n", + rio_name(rdev), pnum); +=20 + rio_write_config_32(rdev, + RIO_PLM_SPx_IMP_SPEC_CTL(pnum), + ctl | RIO_PLM_SPx_IMP_SPEC_CTL_SOFT_RST); +=20 + msleep(ACKID_REALIGN_DELAY_MS); +=20 + rio_write_config_32(rdev, + RIO_PLM_SPx_IMP_SPEC_CTL(pnum), ctl); +=20 + msleep(LINK_STABLE_DELAY_MS); + } +=20 + if (err & (RIO_PORT_N_ERR_STS_OUT_ES | + RIO_PORT_N_ERR_STS_INP_ES)) { + pr_err("RIO: ackID realign FAILED %s port %d\n", + rio_name(rdev), pnum); + return -EIO; + } +=20 + pr_debug("RIO: ackID realign OK %s port %d\n", + rio_name(rdev), pnum); +=20 + return 0; + } + +static int +unpluged_handler(struct rio_dev *rdev, u8 pnum) + { + u32 rval; +=20 + pr_debug("RIO: port unplug %s port %d\n", + rio_name(rdev), pnum); +=20 + /* Disable PW immediately */ + rio_write_config_32(rdev, RIO_PLM_SPx_PW_EN(pnum), 0); +=20 + /* Clear error state */ + rio_read_config_32(rdev, + RIO_DEV_PORT_N_ERR_STS_CSR(rdev, pnum), &rval); +=20 + rio_write_config_32(rdev, + RIO_DEV_PORT_N_ERR_STS_CSR(rdev, pnum), rval); +=20 + /* + * Routing cleanup is handled by fabric re-enumeration. + * Do NOT soft reset here =E2=80=94 link is down. + */ + return 0; + } +=20 static int idtg3_em_handler(struct rio_dev *rdev, u8 pnum) { u32 err_status; - u32 rval; =20 rio_read_config_32(rdev, - RIO_DEV_PORT_N_ERR_STS_CSR(rdev, pnum), - &err_status); - - /* Do nothing for device/link removal */ - if (err_status & RIO_PORT_N_ERR_STS_PORT_UNINIT) - return 0; + RIO_DEV_PORT_N_ERR_STS_CSR(rdev, pnum), + &err_status); + + /* Link removal */ + if (err_status & RIO_PORT_N_ERR_STS_PORT_UNINIT) { + pr_debug("RIO: PORT_UNINIT %s port %d\n", + rio_name(rdev), pnum); + return unpluged_handler(rdev, pnum); + } =20 - /* When link is OK we have a device insertion. - * Request port soft reset to clear errors if they present. - * Inbound and outbound ackIDs will be 0 after reset. - */ + /* Link up but protocol errors present */ if (err_status & (RIO_PORT_N_ERR_STS_OUT_ES | - RIO_PORT_N_ERR_STS_INP_ES)) { - rio_read_config_32(rdev, RIO_PLM_SPx_IMP_SPEC_CTL(pnum), &rval); - rio_write_config_32(rdev, RIO_PLM_SPx_IMP_SPEC_CTL(pnum), - rval | RIO_PLM_SPx_IMP_SPEC_CTL_SOFT_RST); - udelay(10); - rio_write_config_32(rdev, RIO_PLM_SPx_IMP_SPEC_CTL(pnum), rval); - msleep(500); + RIO_PORT_N_ERR_STS_INP_ES)) { + + pr_debug("RIO: ES detected %s port %d\n", + rio_name(rdev), pnum); + + if (idtg3_ackid_realign(rdev, pnum)) + return -EIO; + + /* Re-enable PW only after clean state */ + rio_write_config_32(rdev, RIO_PLM_SPx_PW_EN(pnum), + RIO_PLM_SPx_PW_EN_OK2U | + RIO_PLM_SPx_PW_EN_LINIT); } =20 return 0; --=20 2.51.0