From nobody Mon Feb 9 04:31:31 2026 Received: from mail-lf1-f53.google.com (mail-lf1-f53.google.com [209.85.167.53]) (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 3DD5B6DCE1 for ; Fri, 20 Dec 2024 04:17:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734668231; cv=none; b=Yzsz44cyYbCAKJjPAUZB7I/ujWMwjf7bCycvsCVz3R5kzf9HuMcB6VToE0bzqGyGtHFUX7FsPJH9AmTs4tYN0sOEDmJR7I0Auxo5D+6qOq1/+nhwVDggbhIWNQhM0Ds07yATr1PusltabC8FKKDbYR08jzekP3FzdjnKgTTCJJ4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734668231; c=relaxed/simple; bh=Zzz2EPje6+3TuGXV1Q1rqzKmSt6Pb5THyarRvmhP+Xk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=ngyAHTd9RmwEJYSaSITdGMjqepQlMcczAwXCipKyrWVhWBgT9lG6+Rj3n+NkdmdIYmVAFeeJNtlX6wpdiHSNenxsN3+TVDNYYVo0I8U1NYe1u+R+mDmRCvd/rYscIa909ELoeg9xuEB46m3N6fI6G8WvWr8BVvQMXmolPBF5Hk4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cogentembedded.com; spf=pass smtp.mailfrom=cogentembedded.com; dkim=pass (2048-bit key) header.d=cogentembedded-com.20230601.gappssmtp.com header.i=@cogentembedded-com.20230601.gappssmtp.com header.b=W3DUukMz; arc=none smtp.client-ip=209.85.167.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cogentembedded.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cogentembedded.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cogentembedded-com.20230601.gappssmtp.com header.i=@cogentembedded-com.20230601.gappssmtp.com header.b="W3DUukMz" Received: by mail-lf1-f53.google.com with SMTP id 2adb3069b0e04-53e3a5fa6aaso2775733e87.0 for ; Thu, 19 Dec 2024 20:17:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cogentembedded-com.20230601.gappssmtp.com; s=20230601; t=1734668227; x=1735273027; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=MdyfGmuzzdq2sa9nFxISnqHi8az8zfldhWocEWhpN90=; b=W3DUukMzVg/QS5ixYElsNbukPKsCouvKBQQfVQ6VfjQf5ttQz67OW2pvVCNKALHikT 1YXPNZXc0srtf2oivGocWZcvZSg7wMLzJYKuGmb0W2k0UIcA60+SOJpubHiMut7VBBGE qIz9E+Eq2Q53piWnzAbxC74SA8fmtY+9RLbj0ckeIWJgRsf4JYDf9wKDhsoczyV2qpVm cYLhTEYZcH3J2SR21kMZlgeaROSqh+vw6l8D205nonYMTMykdW+vlnCcUQoAzKgcLuOg l2Yy9UG6eI8h0x8rueMLiScH8MymQEU131Xs+v7dygAgqh0r2NwcRBupvndVfBgCrWiS ApOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734668227; x=1735273027; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=MdyfGmuzzdq2sa9nFxISnqHi8az8zfldhWocEWhpN90=; b=HVgQOA54S7H7PyLU6JIAa2L013RdypQIu6uIjnE0Vh9x2z4HYLYNk+38kWG1FSE7UU zj0nuC0T/Qzd0zPtkSGSfhY0wo9/lLw50MVXClB6cIkB7UF6eD0ZjsrgmsF+dd2YL/EF ZWZBYCk3D41tIC9ITVc0R2VkfZ0NseB+8AROPAXXMXJcD3pGAdJhUfbW6KeMAh2qMYiy VbO7PHBBJXUQcnGbWwNfdEyKOFa+xQxEA1DNvNL/FsFXHMbIq1mZXCPGPrGk9HdebedM VyCRGO7akgmUp9IeS7kjevFjUSMJUXeHSyeK6k0JWVImhlhWOu63epAovk/es/0g5Roz sYJQ== X-Forwarded-Encrypted: i=1; AJvYcCXYnKG6QeNYA040fCcyXGC5hi7K2MI+Jx886yUPGxWsCfHInEdVFSO+1k6Lv+Ua+tam4zwUO1WTavv7P7M=@vger.kernel.org X-Gm-Message-State: AOJu0YxM6efplb8yYqXMabPyuvSvBDe9z9c5uqSfZ2okK7qXERNFqmUq iAO8T0CEPElu79Bat5Ci6P1LMqzJhyEHdm52BqknJtf3ve1LpQ8QA/KNvuLkJQY= X-Gm-Gg: ASbGnct83lry48i732XsK5MjxOZQlPsDfIhHsMpBwgnzrjmw2XEZoAuhBak3yMluE82 R0uR01kd/7QHa4l+lGL+f3dBL2WTqoz2JZ4koIsbuOfhNUw6u7Eq1iDbF8o44x5Z+O9RXk+UIhY AjnKxKMROxdM33xcF8nSEwUqzIze/iF5HiCoXVee3QA2YRHeGKEoNwv/IpGKgOtqL9EPPUDvb+y ALm5NY1isa6I43jR6e0WPIi1O5hhAqGI8e/3TIYfuQN3aSyqrQencQ04kg2zS6c6HodEDk= X-Google-Smtp-Source: AGHT+IEm/48JRG9rYImWJCL4b/vA9ZZZm32z9vp+IsOg3BhPCH2QFQWygKbCz9GD+scIV0XfwvxHMw== X-Received: by 2002:a05:6512:32c8:b0:541:3175:19b4 with SMTP id 2adb3069b0e04-542212eee43mr2221258e87.11.1734668227314; Thu, 19 Dec 2024 20:17:07 -0800 (PST) Received: from cobook.home ([91.198.101.25]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54223832c1bsm357078e87.280.2024.12.19.20.17.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Dec 2024 20:17:07 -0800 (PST) From: Nikita Yushchenko To: Yoshihiro Shimoda , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Geert Uytterhoeven Cc: netdev@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Dege , Christian Mardmoeller , Dennis Ostermann , Nikita Yushchenko Subject: [PATCH net-next 1/2] net: renesas: rswitch: use per-port irq handlers Date: Fri, 20 Dec 2024 09:16:58 +0500 Message-Id: <20241220041659.2985492-2-nikita.yoush@cogentembedded.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20241220041659.2985492-1-nikita.yoush@cogentembedded.com> References: <20241220041659.2985492-1-nikita.yoush@cogentembedded.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Instead of handling all possible data interrupts in the same handler, switch to per-port handlers. This significantly simplifies handling: when the same interrupt is used for several ports, system calls all handlers, and each handler only has to check interrupts for one port's tx and rx queues. But it is not required to use the same interrupt for all ports - GWCA provides 8 data interrupts and allows arbitrary per-queue assignment of those. Support that by reading interrupt index for each port from optional 'irq-index' device tree property. With per-port interrupts it becomes possible to configure affinity such that traffic coming from different ports is serviced simultaneously on different CPUs. Signed-off-by: Nikita Yushchenko --- drivers/net/ethernet/renesas/rswitch.c | 190 ++++++++++--------------- drivers/net/ethernet/renesas/rswitch.h | 10 +- 2 files changed, 82 insertions(+), 118 deletions(-) diff --git a/drivers/net/ethernet/renesas/rswitch.c b/drivers/net/ethernet/= renesas/rswitch.c index 84d09a8973b7..eb9dea8b16f3 100644 --- a/drivers/net/ethernet/renesas/rswitch.c +++ b/drivers/net/ethernet/renesas/rswitch.c @@ -99,15 +99,6 @@ static void rswitch_coma_init(struct rswitch_private *pr= iv) iowrite32(CABPPFLC_INIT_VALUE, priv->addr + CABPPFLC0); } =20 -/* R-Switch-2 block (TOP) */ -static void rswitch_top_init(struct rswitch_private *priv) -{ - unsigned int i; - - for (i =3D 0; i < RSWITCH_MAX_NUM_QUEUES; i++) - iowrite32((i / 16) << (GWCA_INDEX * 8), priv->addr + TPEMIMC7(i)); -} - /* Forwarding engine block (MFWD) */ static void rswitch_fwd_init(struct rswitch_private *priv) { @@ -175,29 +166,6 @@ static int rswitch_gwca_axi_ram_reset(struct rswitch_p= rivate *priv) return rswitch_reg_wait(priv->addr, GWARIRM, GWARIRM_ARR, GWARIRM_ARR); } =20 -static bool rswitch_is_any_data_irq(struct rswitch_private *priv, u32 *dis= , bool tx) -{ - u32 *mask =3D tx ? priv->gwca.tx_irq_bits : priv->gwca.rx_irq_bits; - unsigned int i; - - for (i =3D 0; i < RSWITCH_NUM_IRQ_REGS; i++) { - if (dis[i] & mask[i]) - return true; - } - - return false; -} - -static void rswitch_get_data_irq_status(struct rswitch_private *priv, u32 = *dis) -{ - unsigned int i; - - for (i =3D 0; i < RSWITCH_NUM_IRQ_REGS; i++) { - dis[i] =3D ioread32(priv->addr + GWDIS(i)); - dis[i] &=3D ioread32(priv->addr + GWDIE(i)); - } -} - static void rswitch_enadis_data_irq(struct rswitch_private *priv, unsigned int index, bool enable) { @@ -206,12 +174,18 @@ static void rswitch_enadis_data_irq(struct rswitch_pr= ivate *priv, iowrite32(BIT(index % 32), priv->addr + offs); } =20 -static void rswitch_ack_data_irq(struct rswitch_private *priv, - unsigned int index) +static bool rswitch_check_ack_data_irq(struct rswitch_private *priv, + unsigned int index) { - u32 offs =3D GWDIS(index / 32); + u32 reg =3D GWDIS(index / 32); + u32 bit =3D BIT(index % 32); =20 - iowrite32(BIT(index % 32), priv->addr + offs); + if (ioread32(priv->addr + reg) & bit) { + iowrite32(bit, priv->addr + reg); + return true; + } + + return false; } =20 static unsigned int rswitch_next_queue_index(struct rswitch_gwca_queue *gq, @@ -314,8 +288,6 @@ static int rswitch_gwca_queue_alloc(struct net_device *= ndev, struct rswitch_gwca_queue *gq, bool dir_tx, unsigned int ring_size) { - unsigned int i, bit; - gq->dir_tx =3D dir_tx; gq->ring_size =3D ring_size; gq->ndev =3D ndev; @@ -345,13 +317,6 @@ static int rswitch_gwca_queue_alloc(struct net_device = *ndev, if (!gq->rx_ring && !gq->tx_ring) goto out; =20 - i =3D gq->index / 32; - bit =3D BIT(gq->index % 32); - if (dir_tx) - priv->gwca.tx_irq_bits[i] |=3D bit; - else - priv->gwca.rx_irq_bits[i] |=3D bit; - return 0; =20 out: @@ -583,6 +548,15 @@ static void rswitch_gwca_put(struct rswitch_private *p= riv, clear_bit(gq->index, priv->gwca.used); } =20 +static void rswitch_gwca_queue_assign_irq(struct rswitch_private *priv, + struct rswitch_gwca_queue *gq, + unsigned int irq_index) +{ + rswitch_modify(priv->addr, TPEMIMC7(gq->index), + TPEMIMC7_GDICM(GWCA_INDEX), + TPEMIMC7_GDICM_PREP(GWCA_INDEX, irq_index)); +} + static int rswitch_txdmac_alloc(struct net_device *ndev) { struct rswitch_device *rdev =3D netdev_priv(ndev); @@ -614,6 +588,7 @@ static int rswitch_txdmac_init(struct rswitch_private *= priv, unsigned int index) { struct rswitch_device *rdev =3D priv->rdev[index]; =20 + rswitch_gwca_queue_assign_irq(priv, rdev->tx_queue, rdev->irq_index); return rswitch_gwca_queue_format(rdev->ndev, priv, rdev->tx_queue); } =20 @@ -649,6 +624,7 @@ static int rswitch_rxdmac_init(struct rswitch_private *= priv, unsigned int index) struct rswitch_device *rdev =3D priv->rdev[index]; struct net_device *ndev =3D rdev->ndev; =20 + rswitch_gwca_queue_assign_irq(priv, rdev->rx_queue, rdev->irq_index); return rswitch_gwca_queue_ext_ts_format(ndev, priv, rdev->rx_queue); } =20 @@ -933,9 +909,13 @@ static int rswitch_poll(struct napi_struct *napi, int = budget) return 0; } =20 -static void rswitch_queue_interrupt(struct net_device *ndev) +static irqreturn_t rswitch_gwca_data_irq(int irq, void *data) { - struct rswitch_device *rdev =3D netdev_priv(ndev); + struct rswitch_device *rdev =3D data; + + if (!rswitch_check_ack_data_irq(rdev->priv, rdev->tx_queue->index) && + !rswitch_check_ack_data_irq(rdev->priv, rdev->rx_queue->index)) + return IRQ_NONE; =20 if (napi_schedule_prep(&rdev->napi)) { spin_lock(&rdev->priv->lock); @@ -944,71 +924,10 @@ static void rswitch_queue_interrupt(struct net_device= *ndev) spin_unlock(&rdev->priv->lock); __napi_schedule(&rdev->napi); } -} - -static irqreturn_t rswitch_data_irq(struct rswitch_private *priv, u32 *dis) -{ - struct rswitch_gwca_queue *gq; - unsigned int i, index, bit; - - for (i =3D 0; i < priv->gwca.num_queues; i++) { - gq =3D &priv->gwca.queues[i]; - index =3D gq->index / 32; - bit =3D BIT(gq->index % 32); - if (!(dis[index] & bit)) - continue; - - rswitch_ack_data_irq(priv, gq->index); - rswitch_queue_interrupt(gq->ndev); - } =20 return IRQ_HANDLED; } =20 -static irqreturn_t rswitch_gwca_irq(int irq, void *dev_id) -{ - struct rswitch_private *priv =3D dev_id; - u32 dis[RSWITCH_NUM_IRQ_REGS]; - irqreturn_t ret =3D IRQ_NONE; - - rswitch_get_data_irq_status(priv, dis); - - if (rswitch_is_any_data_irq(priv, dis, true) || - rswitch_is_any_data_irq(priv, dis, false)) - ret =3D rswitch_data_irq(priv, dis); - - return ret; -} - -static int rswitch_gwca_request_irqs(struct rswitch_private *priv) -{ - char *resource_name, *irq_name; - int i, ret, irq; - - for (i =3D 0; i < GWCA_NUM_IRQS; i++) { - resource_name =3D kasprintf(GFP_KERNEL, GWCA_IRQ_RESOURCE_NAME, i); - if (!resource_name) - return -ENOMEM; - - irq =3D platform_get_irq_byname(priv->pdev, resource_name); - kfree(resource_name); - if (irq < 0) - return irq; - - irq_name =3D devm_kasprintf(&priv->pdev->dev, GFP_KERNEL, - GWCA_IRQ_NAME, i); - if (!irq_name) - return -ENOMEM; - - ret =3D devm_request_irq(&priv->pdev->dev, irq, rswitch_gwca_irq, - 0, irq_name, priv); - if (ret < 0) - return ret; - } - - return 0; -} - static void rswitch_ts(struct rswitch_private *priv) { struct rswitch_gwca_queue *gq =3D &priv->gwca.ts_queue; @@ -1589,12 +1508,18 @@ static int rswitch_open(struct net_device *ndev) { struct rswitch_device *rdev =3D netdev_priv(ndev); unsigned long flags; + int ret; =20 if (bitmap_empty(rdev->priv->opened_ports, RSWITCH_NUM_PORTS)) iowrite32(GWCA_TS_IRQ_BIT, rdev->priv->addr + GWTSDIE); =20 napi_enable(&rdev->napi); =20 + ret =3D request_irq(rdev->irq, rswitch_gwca_data_irq, IRQF_SHARED, + netdev_name(ndev), rdev); + if (ret < 0) + goto err_request_irq; + spin_lock_irqsave(&rdev->priv->lock, flags); bitmap_set(rdev->priv->opened_ports, rdev->port, 1); rswitch_enadis_data_irq(rdev->priv, rdev->tx_queue->index, true); @@ -1606,6 +1531,14 @@ static int rswitch_open(struct net_device *ndev) netif_start_queue(ndev); =20 return 0; + +err_request_irq: + napi_disable(&rdev->napi); + + if (bitmap_empty(rdev->priv->opened_ports, RSWITCH_NUM_PORTS)) + iowrite32(GWCA_TS_IRQ_BIT, rdev->priv->addr + GWTSDID); + + return ret; }; =20 static int rswitch_stop(struct net_device *ndev) @@ -1625,6 +1558,8 @@ static int rswitch_stop(struct net_device *ndev) bitmap_clear(rdev->priv->opened_ports, rdev->port, 1); spin_unlock_irqrestore(&rdev->priv->lock, flags); =20 + free_irq(rdev->irq, rdev); + napi_disable(&rdev->napi); =20 if (bitmap_empty(rdev->priv->opened_ports, RSWITCH_NUM_PORTS)) @@ -1906,6 +1841,34 @@ static void rswitch_etha_init(struct rswitch_private= *priv, unsigned int index) etha->psmcs =3D clk_get_rate(priv->clk) / 100000 / (25 * 2) - 1; } =20 +static int rswitch_port_get_irq(struct rswitch_device *rdev) +{ + unsigned int irq_index; + char *name; + int err; + + err =3D of_property_read_u32(rdev->np_port, "irq-index", &irq_index); + if (err =3D=3D 0) { + if (irq_index < GWCA_NUM_IRQS) + rdev->irq_index =3D irq_index; + else + dev_warn(&rdev->priv->pdev->dev, + "%pOF: irq-index out of range\n", + rdev->np_port); + } + + name =3D kasprintf(GFP_KERNEL, GWCA_IRQ_RESOURCE_NAME, rdev->irq_index); + if (!name) + return -ENOMEM; + err =3D platform_get_irq_byname(rdev->priv->pdev, name); + kfree(name); + if (err < 0) + return err; + rdev->irq =3D err; + + return 0; +} + static int rswitch_device_alloc(struct rswitch_private *priv, unsigned int= index) { struct platform_device *pdev =3D priv->pdev; @@ -1954,6 +1917,10 @@ static int rswitch_device_alloc(struct rswitch_priva= te *priv, unsigned int index if (err < 0) goto out_get_params; =20 + err =3D rswitch_port_get_irq(rdev); + if (err < 0) + goto out_get_irq; + err =3D rswitch_rxdmac_alloc(ndev); if (err < 0) goto out_rxdmac; @@ -1968,6 +1935,7 @@ static int rswitch_device_alloc(struct rswitch_privat= e *priv, unsigned int index rswitch_rxdmac_free(ndev); =20 out_rxdmac: +out_get_irq: out_get_params: of_node_put(rdev->np_port); netif_napi_del(&rdev->napi); @@ -2003,7 +1971,6 @@ static int rswitch_init(struct rswitch_private *priv) rswitch_reset(priv); =20 rswitch_clock_enable(priv); - rswitch_top_init(priv); err =3D rswitch_bpool_config(priv); if (err < 0) return err; @@ -2034,10 +2001,6 @@ static int rswitch_init(struct rswitch_private *priv) if (err < 0) goto err_ptp_register; =20 - err =3D rswitch_gwca_request_irqs(priv); - if (err < 0) - goto err_gwca_request_irq; - err =3D rswitch_gwca_ts_request_irqs(priv); if (err < 0) goto err_gwca_ts_request_irq; @@ -2073,7 +2036,6 @@ static int rswitch_init(struct rswitch_private *priv) =20 err_gwca_hw_init: err_gwca_ts_request_irq: -err_gwca_request_irq: rcar_gen4_ptp_unregister(priv->ptp_priv); =20 err_ptp_register: diff --git a/drivers/net/ethernet/renesas/rswitch.h b/drivers/net/ethernet/= renesas/rswitch.h index 532192cbca4b..a1e62a6b3844 100644 --- a/drivers/net/ethernet/renesas/rswitch.h +++ b/drivers/net/ethernet/renesas/rswitch.h @@ -51,7 +51,6 @@ =20 /* TODO: hardcoded ETHA/GWCA settings for now */ #define GWCA_IRQ_RESOURCE_NAME "gwca0_rxtx%d" -#define GWCA_IRQ_NAME "rswitch: gwca0_rxtx%d" #define GWCA_NUM_IRQS 8 #define GWCA_INDEX 0 #define AGENT_INDEX_GWCA 3 @@ -828,6 +827,10 @@ enum rswitch_gwca_mode { =20 /* TOP */ #define TPEMIMC7(queue) (TPEMIMC70 + (queue) * 4) +#define TPEMIMC7_GDICM0 GENMASK(2, 0) +#define TPEMIMC7_GDICM_SHIFT(i) ((i) * 8) +#define TPEMIMC7_GDICM(i) (TPEMIMC7_GDICM0 << TPEMIMC7_GDICM_SHIFT(i)) +#define TPEMIMC7_GDICM_PREP(i, val) (((val) & TPEMIMC7_GDICM0) << TPEMIMC7= _GDICM_SHIFT(i)) =20 /* Descriptors */ enum RX_DS_CC_BIT { @@ -967,7 +970,6 @@ struct rswitch_gwca_queue { }; }; =20 -#define RSWITCH_NUM_IRQ_REGS (RSWITCH_MAX_NUM_QUEUES / BITS_PER_TYPE(u32)) struct rswitch_gwca { unsigned int index; struct rswitch_desc *linkfix_table; @@ -977,8 +979,6 @@ struct rswitch_gwca { int num_queues; struct rswitch_gwca_queue ts_queue; DECLARE_BITMAP(used, RSWITCH_MAX_NUM_QUEUES); - u32 tx_irq_bits[RSWITCH_NUM_IRQ_REGS]; - u32 rx_irq_bits[RSWITCH_NUM_IRQ_REGS]; }; =20 #define NUM_QUEUES_PER_NDEV 2 @@ -990,6 +990,8 @@ struct rswitch_device { void __iomem *addr; struct rswitch_gwca_queue *tx_queue; struct rswitch_gwca_queue *rx_queue; + unsigned int irq_index; + int irq; struct sk_buff *ts_skb[TS_TAGS_PER_PORT]; DECLARE_BITMAP(ts_skb_used, TS_TAGS_PER_PORT); bool disabled; --=20 2.39.5 From nobody Mon Feb 9 04:31:31 2026 Received: from mail-lj1-f171.google.com (mail-lj1-f171.google.com [209.85.208.171]) (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 801232F509 for ; Fri, 20 Dec 2024 04:17:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734668233; cv=none; b=oGF0nW8OlUR5gZ/h2jJJSPjG/CfFGMDJIgfGTb4dJRoxE5yzVFbXYp8MW1FGw9ZwgRBYZc2L7Lb4o8UfmHiango+EueUSf1YLKJ/qJLi9y8R9apDqJ0FsSulN0ovIsI8y+IbJAY5MNNchQM5bSun1XRmZZ4ru2KzBf2tmXzGi+g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1734668233; c=relaxed/simple; bh=7UUTsmjRchZRPWt1L9EdlY0v8i26VrF6o4c6qJ5IuEw=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=RGvZnuGKxr0atXtCKEuaXx1/aN17OK4IsoGJLk54Kz41vpaFv0CxtQCaloiMx2L54bhC/RTsiZGfot38Dtd79MvKcnH0+GJauqmW08zBfy/2qV20UtdVYFUSeqZNIcveMnHl7MZ1SKvge2va8/TjI0e1MZhz4JG6TF00H/vPVQY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cogentembedded.com; spf=pass smtp.mailfrom=cogentembedded.com; dkim=pass (2048-bit key) header.d=cogentembedded-com.20230601.gappssmtp.com header.i=@cogentembedded-com.20230601.gappssmtp.com header.b=C/5/BU97; arc=none smtp.client-ip=209.85.208.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=cogentembedded.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=cogentembedded.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=cogentembedded-com.20230601.gappssmtp.com header.i=@cogentembedded-com.20230601.gappssmtp.com header.b="C/5/BU97" Received: by mail-lj1-f171.google.com with SMTP id 38308e7fff4ca-30225b2586cso26511461fa.0 for ; Thu, 19 Dec 2024 20:17:11 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cogentembedded-com.20230601.gappssmtp.com; s=20230601; t=1734668229; x=1735273029; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=LTwIjsFkDY5wb4hiAoIm9JErxNYkg5bDw1x4lkN+29w=; b=C/5/BU97WUAHskdaqwHOyALD2wJogE7lKIPRtIv0mxSpReUWljdAJq9HG5SQCI4aBD Moq5j1i67w6Pfq8M+Iy4JpSSsAS/wBYXrtEe3tpF6sT+3oJIDU5tlhKPme3Z80vixWvL BjuCHWiu0za2Hrcx0o9PNF3xhLTwjUybjLRy3RiSi2/gOLKK44j2ArfpaxqloBshXsMG Da2lmcWbGP3M+7b4K3pHjV5c5PRMH4Lg+QTGk7jQMK+ZWZz5N+PSixYm3RFbfdc5SXGm R5jDdqg0LJMAvzqXR/rIsQmw+ppKCQnORD/IEDYvKbH25OrqaDORtQwouw7NYJqY0cfT IoEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1734668229; x=1735273029; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=LTwIjsFkDY5wb4hiAoIm9JErxNYkg5bDw1x4lkN+29w=; b=B5Xz8Sl+ciVHEJ7GL3QBk9xWFLdsS68X6MYxVXZZfltJQA5GPKlqdt+uncNC+FPoMK d5LXUlPv9oBEjO8bUqgaNWrrZ0oLfi+QgrTBl+4Kwd/VZnzaOzcE1ANE6iIcjdrohEc5 RUDz7DAI8WG39wlcriTa19px8FkAuOdxCWIBc3oPaexMGWhmADgNANlpDN5AtFRp15lZ vhTCdWlthXa9knM86jUjDkh8u39t291IC7KZ4YX5SpHD/7tcaUvECh4rMxKl5mG9l+py ABmXQJK3N3siOxYj1vCkpYw0jPiyQa1/jsrFSdPDTE9YpVuy/Tr0vt6/DetcHYZRLhSB h4Aw== X-Forwarded-Encrypted: i=1; AJvYcCUSrm389Oz/x7USw5G3/DXLbZpvqcCQL/XpopsHc26S7wk4QJ/NC3qwkCgOA/uAWcAj3Qt2s0sJ92/WLXM=@vger.kernel.org X-Gm-Message-State: AOJu0YzM1gpB1TSvfyHG4RGAMtlvReJn5wgHhAplfJ7PbZgtXj2V4NPx ys73PKfiF92Bm0Pk0tFEJfLCxcbYuLO/MsjQ5RYhRy4nX9anc6TKlPxJUANk518= X-Gm-Gg: ASbGnct3ZNk/IwJUdUmRUzycVUDi6DnRGz4O/79p9dv+HRr83oTxxNeoYALcvsyM4CG 8RSaVFD0KzWnBeHz81TJE+gmmv6yzqJ/fTXug/ZBdQickkR0uYIQqbQulzvkGo4luj6OQBf77VS RZm2FDIAuKrKonfM9jQxVuxpR3kNwlzOHEIN1F6fBhzfUiyBBMz2izTEhpfjH3pUX6JtpIubI/v BzwpspnllFOHxk9ISbTlQ5zxG22XaJWiWSdOKPSYWlnKnSaWFVlD+AM34ru5gT2sXeAqkE= X-Google-Smtp-Source: AGHT+IE5czr4LmTwoALi/RSdvS2Orti1CAw/4SDl5Z6ra7AljW2hSxHfLwtSebbfg5iMM0wrj4ad/w== X-Received: by 2002:a05:6512:1042:b0:540:2add:c1f1 with SMTP id 2adb3069b0e04-5422133b657mr1889695e87.18.1734668229367; Thu, 19 Dec 2024 20:17:09 -0800 (PST) Received: from cobook.home ([91.198.101.25]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-54223832c1bsm357078e87.280.2024.12.19.20.17.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Dec 2024 20:17:09 -0800 (PST) From: Nikita Yushchenko To: Yoshihiro Shimoda , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Geert Uytterhoeven Cc: netdev@vger.kernel.org, linux-renesas-soc@vger.kernel.org, linux-kernel@vger.kernel.org, Michael Dege , Christian Mardmoeller , Dennis Ostermann , Nikita Yushchenko Subject: [PATCH net-next 2/2] net: renesas: rswitch: request ts interrupt at port open Date: Fri, 20 Dec 2024 09:16:59 +0500 Message-Id: <20241220041659.2985492-3-nikita.yoush@cogentembedded.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20241220041659.2985492-1-nikita.yoush@cogentembedded.com> References: <20241220041659.2985492-1-nikita.yoush@cogentembedded.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Data interrupts are now requested at port open and freed at port close. For symmetry, do the same for ts interrupt. Signed-off-by: Nikita Yushchenko Reviewed-by: Michal Swiatkowski --- drivers/net/ethernet/renesas/rswitch.c | 35 +++++++++++++------------- drivers/net/ethernet/renesas/rswitch.h | 2 +- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/drivers/net/ethernet/renesas/rswitch.c b/drivers/net/ethernet/= renesas/rswitch.c index eb9dea8b16f3..cc8f2a4e3d70 100644 --- a/drivers/net/ethernet/renesas/rswitch.c +++ b/drivers/net/ethernet/renesas/rswitch.c @@ -989,18 +989,6 @@ static irqreturn_t rswitch_gwca_ts_irq(int irq, void *= dev_id) return IRQ_NONE; } =20 -static int rswitch_gwca_ts_request_irqs(struct rswitch_private *priv) -{ - int irq; - - irq =3D platform_get_irq_byname(priv->pdev, GWCA_TS_IRQ_RESOURCE_NAME); - if (irq < 0) - return irq; - - return devm_request_irq(&priv->pdev->dev, irq, rswitch_gwca_ts_irq, - 0, GWCA_TS_IRQ_NAME, priv); -} - /* Ethernet TSN Agent block (ETHA) and Ethernet MAC IP block (RMAC) */ static int rswitch_etha_change_mode(struct rswitch_etha *etha, enum rswitch_etha_mode mode) @@ -1510,8 +1498,14 @@ static int rswitch_open(struct net_device *ndev) unsigned long flags; int ret; =20 - if (bitmap_empty(rdev->priv->opened_ports, RSWITCH_NUM_PORTS)) + if (bitmap_empty(rdev->priv->opened_ports, RSWITCH_NUM_PORTS)) { + ret =3D request_irq(rdev->priv->gwca.ts_irq, rswitch_gwca_ts_irq, + 0, "rswitch_ts", rdev->priv); + if (ret < 0) + return ret; + iowrite32(GWCA_TS_IRQ_BIT, rdev->priv->addr + GWTSDIE); + } =20 napi_enable(&rdev->napi); =20 @@ -1535,8 +1529,10 @@ static int rswitch_open(struct net_device *ndev) err_request_irq: napi_disable(&rdev->napi); =20 - if (bitmap_empty(rdev->priv->opened_ports, RSWITCH_NUM_PORTS)) + if (bitmap_empty(rdev->priv->opened_ports, RSWITCH_NUM_PORTS)) { iowrite32(GWCA_TS_IRQ_BIT, rdev->priv->addr + GWTSDID); + free_irq(rdev->priv->gwca.ts_irq, rdev->priv); + } =20 return ret; }; @@ -1562,8 +1558,10 @@ static int rswitch_stop(struct net_device *ndev) =20 napi_disable(&rdev->napi); =20 - if (bitmap_empty(rdev->priv->opened_ports, RSWITCH_NUM_PORTS)) + if (bitmap_empty(rdev->priv->opened_ports, RSWITCH_NUM_PORTS)) { iowrite32(GWCA_TS_IRQ_BIT, rdev->priv->addr + GWTSDID); + free_irq(rdev->priv->gwca.ts_irq, rdev->priv); + } =20 for (tag =3D find_first_bit(rdev->ts_skb_used, TS_TAGS_PER_PORT); tag < TS_TAGS_PER_PORT; @@ -2001,9 +1999,10 @@ static int rswitch_init(struct rswitch_private *priv) if (err < 0) goto err_ptp_register; =20 - err =3D rswitch_gwca_ts_request_irqs(priv); + err =3D platform_get_irq_byname(priv->pdev, GWCA_TS_IRQ_RESOURCE_NAME); if (err < 0) - goto err_gwca_ts_request_irq; + goto err_gwca_ts_irq; + priv->gwca.ts_irq =3D err; =20 err =3D rswitch_gwca_hw_init(priv); if (err < 0) @@ -2035,7 +2034,7 @@ static int rswitch_init(struct rswitch_private *priv) rswitch_gwca_hw_deinit(priv); =20 err_gwca_hw_init: -err_gwca_ts_request_irq: +err_gwca_ts_irq: rcar_gen4_ptp_unregister(priv->ptp_priv); =20 err_ptp_register: diff --git a/drivers/net/ethernet/renesas/rswitch.h b/drivers/net/ethernet/= renesas/rswitch.h index a1e62a6b3844..54b9f059707a 100644 --- a/drivers/net/ethernet/renesas/rswitch.h +++ b/drivers/net/ethernet/renesas/rswitch.h @@ -58,7 +58,6 @@ #define GWRO RSWITCH_GWCA0_OFFSET =20 #define GWCA_TS_IRQ_RESOURCE_NAME "gwca0_rxts0" -#define GWCA_TS_IRQ_NAME "rswitch: gwca0_rxts0" #define GWCA_TS_IRQ_BIT BIT(0) =20 #define FWRO 0 @@ -978,6 +977,7 @@ struct rswitch_gwca { struct rswitch_gwca_queue *queues; int num_queues; struct rswitch_gwca_queue ts_queue; + int ts_irq; DECLARE_BITMAP(used, RSWITCH_MAX_NUM_QUEUES); }; =20 --=20 2.39.5