[PATCH iwl-net] idpf: fix LAN memory regions command on some NVMs

Larysa Zaremba posted 1 patch 4 months ago
drivers/net/ethernet/intel/idpf/idpf_virtchnl.c | 5 +++++
1 file changed, 5 insertions(+)
[PATCH iwl-net] idpf: fix LAN memory regions command on some NVMs
Posted by Larysa Zaremba 4 months ago
IPU SDK versions 1.9 through 2.0.5 require send buffer to contain a single
empty memory region. Set number of regions to 1 and use appropriate send
buffer size to satisfy this requirement.

Suggested-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
Signed-off-by: Larysa Zaremba <larysa.zaremba@intel.com>
---
 drivers/net/ethernet/intel/idpf/idpf_virtchnl.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
index fa3ce1e4f6ac..af8b3ebee4d4 100644
--- a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
+++ b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
@@ -1016,6 +1016,9 @@ static int idpf_send_get_lan_memory_regions(struct idpf_adapter *adapter)
 	struct idpf_vc_xn_params xn_params = {
 		.vc_op = VIRTCHNL2_OP_GET_LAN_MEMORY_REGIONS,
 		.recv_buf.iov_len = IDPF_CTLQ_MAX_BUF_LEN,
+		.send_buf.iov_len =
+			sizeof(struct virtchnl2_get_lan_memory_regions) +
+			sizeof(struct virtchnl2_mem_region),
 		.timeout_ms = IDPF_VC_XN_DEFAULT_TIMEOUT_MSEC,
 	};
 	int num_regions, size;
@@ -1028,6 +1031,8 @@ static int idpf_send_get_lan_memory_regions(struct idpf_adapter *adapter)
 		return -ENOMEM;
 
 	xn_params.recv_buf.iov_base = rcvd_regions;
+	rcvd_regions->num_memory_regions = cpu_to_le16(1);
+	xn_params.send_buf.iov_base = rcvd_regions;
 	reply_sz = idpf_vc_xn_exec(adapter, &xn_params);
 	if (reply_sz < 0)
 		return reply_sz;
-- 
2.47.0
RE: [PATCH iwl-net] idpf: fix LAN memory regions command on some NVMs
Posted by Singh, Krishneil K 2 months, 2 weeks ago

> -----Original Message-----
> From: Larysa Zaremba <larysa.zaremba@intel.com>
> Sent: Tuesday, October 7, 2025 4:46 AM
> To: intel-wired-lan@lists.osuosl.org; Nguyen, Anthony L
> <anthony.l.nguyen@intel.com>
> Cc: Zaremba, Larysa <larysa.zaremba@intel.com>; Kitszel, Przemyslaw
> <przemyslaw.kitszel@intel.com>; Andrew Lunn <andrew+netdev@lunn.ch>;
> David S. Miller <davem@davemloft.net>; Eric Dumazet
> <edumazet@google.com>; Jakub Kicinski <kuba@kernel.org>; Paolo Abeni
> <pabeni@redhat.com>; Hay, Joshua A <joshua.a.hay@intel.com>; Chittim,
> Madhu <madhu.chittim@intel.com>; netdev@vger.kernel.org; linux-
> kernel@vger.kernel.org; Tantilov, Emil S <emil.s.tantilov@intel.com>; Michal
> Swiatkowski <michal.swiatkowski@linux.intel.com>; Loktionov, Aleksandr
> <aleksandr.loktionov@intel.com>
> Subject: [PATCH iwl-net] idpf: fix LAN memory regions command on some
> NVMs
> 
> IPU SDK versions 1.9 through 2.0.5 require send buffer to contain a single
> empty memory region. Set number of regions to 1 and use appropriate send
> buffer size to satisfy this requirement.
> 
> Suggested-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
> Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
> Signed-off-by: Larysa Zaremba <larysa.zaremba@intel.com>
> ---
>  drivers/net/ethernet/intel/idpf/idpf_virtchnl.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
> b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
> index fa3ce1e4f6ac..af8b3ebee4d4 100644
> --- a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
> +++ b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
> @@ -1016,6 +1016,9 @@ static int


Tested-by: Krishneil Singh <krishneil.k.singh@intel.com>
Re: [Intel-wired-lan] [PATCH iwl-net] idpf: fix LAN memory regions command on some NVMs
Posted by Paul Menzel 4 months ago
Dear Larysa,


Am 07.10.25 um 13:46 schrieb Larysa Zaremba:
> IPU SDK versions 1.9 through 2.0.5 require send buffer to contain a single
> empty memory region. Set number of regions to 1 and use appropriate send
> buffer size to satisfy this requirement.

Where are the SDK requirements documented?

What are the current SDK versions?

Do you have a reproducer?

> Suggested-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
> Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
> Signed-off-by: Larysa Zaremba <larysa.zaremba@intel.com>
> ---
>   drivers/net/ethernet/intel/idpf/idpf_virtchnl.c | 5 +++++
>   1 file changed, 5 insertions(+)
> 
> diff --git a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
> index fa3ce1e4f6ac..af8b3ebee4d4 100644
> --- a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
> +++ b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
> @@ -1016,6 +1016,9 @@ static int idpf_send_get_lan_memory_regions(struct idpf_adapter *adapter)
>   	struct idpf_vc_xn_params xn_params = {
>   		.vc_op = VIRTCHNL2_OP_GET_LAN_MEMORY_REGIONS,
>   		.recv_buf.iov_len = IDPF_CTLQ_MAX_BUF_LEN,
> +		.send_buf.iov_len =
> +			sizeof(struct virtchnl2_get_lan_memory_regions) +
> +			sizeof(struct virtchnl2_mem_region),
>   		.timeout_ms = IDPF_VC_XN_DEFAULT_TIMEOUT_MSEC,
>   	};
>   	int num_regions, size;
> @@ -1028,6 +1031,8 @@ static int idpf_send_get_lan_memory_regions(struct idpf_adapter *adapter)
>   		return -ENOMEM;
>   
>   	xn_params.recv_buf.iov_base = rcvd_regions;
> +	rcvd_regions->num_memory_regions = cpu_to_le16(1);
> +	xn_params.send_buf.iov_base = rcvd_regions;
>   	reply_sz = idpf_vc_xn_exec(adapter, &xn_params);
>   	if (reply_sz < 0)
>   		return reply_sz;


Kind regards,

Paul
Re: [Intel-wired-lan] [PATCH iwl-net] idpf: fix LAN memory regions command on some NVMs
Posted by Larysa Zaremba 4 months ago
On Tue, Oct 07, 2025 at 02:06:55PM +0200, Paul Menzel wrote:
> Dear Larysa,
> 
> 
> Am 07.10.25 um 13:46 schrieb Larysa Zaremba:
> > IPU SDK versions 1.9 through 2.0.5 require send buffer to contain a single
> > empty memory region. Set number of regions to 1 and use appropriate send
> > buffer size to satisfy this requirement.
> 
> Where are the SDK requirements documented?
>

IPU SDK is a fancy name for the FW. AFAIK, aside idpf specification intel did 
not publish any additional resources for it.

idpf specification [1] is unclear on the exact get command contents. What I am 
fixing is the reality of the implementation of the NVMs that support CPFs too 
(supported by ixd [0]).

> What are the current SDK versions?

2.1, I tested with 2.0.5 that was the latest when this patch was first 
implemented in August.

> 
> Do you have a reproducer?

I can reliably reproduce this on my machine with intel IPU SDK 2.0.5, the 
command fails every time without this patch, causing the probe to fail. Also, 
other developers such as Michal S reported such problem. It is most probably 
present on older NVMs too, its just that the command was not used before the 
RDMA patchset.

I have checked that the patch does not cause regression on the platforms that 
use another idpf-only NVMs, used by most intel IPUs.

[0]
https://lore.kernel.org/netdev/20250516145814.5422-1-larysa.zaremba@intel.com/

[1] 
https://github.com/oasis-tcs/idpf-specification/blob/main/idpf_specification.pdf

> 
> > Suggested-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
> > Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
> > Signed-off-by: Larysa Zaremba <larysa.zaremba@intel.com>
> > ---
> >   drivers/net/ethernet/intel/idpf/idpf_virtchnl.c | 5 +++++
> >   1 file changed, 5 insertions(+)
> > 
> > diff --git a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
> > index fa3ce1e4f6ac..af8b3ebee4d4 100644
> > --- a/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
> > +++ b/drivers/net/ethernet/intel/idpf/idpf_virtchnl.c
> > @@ -1016,6 +1016,9 @@ static int idpf_send_get_lan_memory_regions(struct idpf_adapter *adapter)
> >   	struct idpf_vc_xn_params xn_params = {
> >   		.vc_op = VIRTCHNL2_OP_GET_LAN_MEMORY_REGIONS,
> >   		.recv_buf.iov_len = IDPF_CTLQ_MAX_BUF_LEN,
> > +		.send_buf.iov_len =
> > +			sizeof(struct virtchnl2_get_lan_memory_regions) +
> > +			sizeof(struct virtchnl2_mem_region),
> >   		.timeout_ms = IDPF_VC_XN_DEFAULT_TIMEOUT_MSEC,
> >   	};
> >   	int num_regions, size;
> > @@ -1028,6 +1031,8 @@ static int idpf_send_get_lan_memory_regions(struct idpf_adapter *adapter)
> >   		return -ENOMEM;
> >   	xn_params.recv_buf.iov_base = rcvd_regions;
> > +	rcvd_regions->num_memory_regions = cpu_to_le16(1);
> > +	xn_params.send_buf.iov_base = rcvd_regions;
> >   	reply_sz = idpf_vc_xn_exec(adapter, &xn_params);
> >   	if (reply_sz < 0)
> >   		return reply_sz;
> 
> 
> Kind regards,
> 
> Paul