[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <Z-6jN7aA8ZnYRH6j@shredder>
Date: Thu, 3 Apr 2025 18:03:19 +0300
From: Ido Schimmel <idosch@...sch.org>
To: Michael Chan <michael.chan@...adcom.com>
Cc: davem@...emloft.net, netdev@...r.kernel.org, edumazet@...gle.com,
kuba@...nel.org, pabeni@...hat.com, andrew@...n.ch,
horms@...nel.org, danieller@...dia.com,
damodharam.ammepalli@...adcom.com, andrew.gospodarek@...adcom.com,
petrm@...dia.com
Subject: Re: [PATCH net 2/2] ethtool: cmis: use u16 for calculated
read_write_len_ext
Adding Petr given Danielle is away
On Wed, Apr 02, 2025 at 11:31:23AM -0700, Michael Chan wrote:
> From: Damodharam Ammepalli <damodharam.ammepalli@...adcom.com>
>
> For EPL (Extended Payload), the maximum calculated size returned by
> ethtool_cmis_get_max_epl_size() is 2048, so the read_write_len_ext
> field in struct ethtool_cmis_cdb_cmd_args needs to be changed to u16
> to hold the value.
>
> To avoid confusion with other u8 read_write_len_ext fields defined
> by the CMIS spec, change the field name to calc_read_write_len_ext.
>
> Without this change, module flashing can fail:
>
> Transceiver module firmware flashing started for device enp177s0np0
> Transceiver module firmware flashing in progress for device enp177s0np0
> Progress: 0%
> Transceiver module firmware flashing encountered an error for device enp177s0np0
> Status message: Write FW block EPL command failed, LPL length is longer
> than CDB read write length extension allows.
>
> Fixes: a39c84d79625 ("ethtool: cmis_cdb: Add a layer for supporting CDB commands)
> Reviewed-by: Andy Gospodarek <andrew.gospodarek@...adcom.com>
> Signed-off-by: Damodharam Ammepalli <damodharam.ammepalli@...adcom.com>
> Signed-off-by: Michael Chan <michael.chan@...adcom.com>
> ---
> net/ethtool/cmis.h | 7 ++++---
> net/ethtool/cmis_cdb.c | 8 ++++----
> 2 files changed, 8 insertions(+), 7 deletions(-)
>
> diff --git a/net/ethtool/cmis.h b/net/ethtool/cmis.h
> index 1e790413db0e..51f5d5439e2a 100644
> --- a/net/ethtool/cmis.h
> +++ b/net/ethtool/cmis.h
> @@ -63,8 +63,9 @@ struct ethtool_cmis_cdb_request {
> * struct ethtool_cmis_cdb_cmd_args - CDB commands execution arguments
> * @req: CDB command fields as described in the CMIS standard.
> * @max_duration: Maximum duration time for command completion in msec.
> - * @read_write_len_ext: Allowable additional number of byte octets to the LPL
> - * in a READ or a WRITE commands.
> + * @calc_read_write_len_ext: Calculated allowable additional number of byte
> + * octets to the LPL or EPL in a READ or WRITE CDB
> + * command.
> * @msleep_pre_rpl: Waiting time before checking reply in msec.
> * @rpl_exp_len: Expected reply length in bytes.
> * @flags: Validation flags for CDB commands.
> @@ -73,7 +74,7 @@ struct ethtool_cmis_cdb_request {
> struct ethtool_cmis_cdb_cmd_args {
> struct ethtool_cmis_cdb_request req;
> u16 max_duration;
> - u8 read_write_len_ext;
> + u16 calc_read_write_len_ext;
> u8 msleep_pre_rpl;
> u8 rpl_exp_len;
> u8 flags;
> diff --git a/net/ethtool/cmis_cdb.c b/net/ethtool/cmis_cdb.c
> index dba3aa909a95..1f487e1a6347 100644
> --- a/net/ethtool/cmis_cdb.c
> +++ b/net/ethtool/cmis_cdb.c
> @@ -35,13 +35,13 @@ void ethtool_cmis_cdb_compose_args(struct ethtool_cmis_cdb_cmd_args *args,
> args->req.lpl_len = lpl_len;
> if (lpl) {
> memcpy(args->req.payload, lpl, args->req.lpl_len);
> - args->read_write_len_ext =
> + args->calc_read_write_len_ext =
> ethtool_cmis_get_max_lpl_size(read_write_len_ext);
> }
> if (epl) {
> args->req.epl_len = cpu_to_be16(epl_len);
> args->req.epl = epl;
> - args->read_write_len_ext =
> + args->calc_read_write_len_ext =
> ethtool_cmis_get_max_epl_size(read_write_len_ext);
AFAIU, a size larger than a page (128 bytes) is only useful when auto
paging is supported which is something the kernel doesn't currently
support. Therefore, I think it's misleading to initialize this field to
a value larger than 128.
How about deleting ethtool_cmis_get_max_epl_size() and moving the
initialization of 'args->read_write_len_ext' outside of the if block as
it was before 9a3b0d078bd82?
> }
>
> @@ -590,7 +590,7 @@ ethtool_cmis_cdb_execute_epl_cmd(struct net_device *dev,
> space_left = CMIS_CDB_EPL_FW_BLOCK_OFFSET_END - offset + 1;
> bytes_to_write = min_t(u16, bytes_left,
> min_t(u16, space_left,
> - args->read_write_len_ext));
> + args->calc_read_write_len_ext));
>
> err = __ethtool_cmis_cdb_execute_cmd(dev, page_data,
> page, offset,
> @@ -631,7 +631,7 @@ int ethtool_cmis_cdb_execute_cmd(struct net_device *dev,
> offsetof(struct ethtool_cmis_cdb_request,
> epl));
>
> - if (args->req.lpl_len > args->read_write_len_ext) {
> + if (args->req.lpl_len > args->calc_read_write_len_ext) {
> args->err_msg = "LPL length is longer than CDB read write length extension allows";
> return -EINVAL;
> }
> --
> 2.30.1
>
>
Powered by blists - more mailing lists