Skip to content

Commit 01a6185

Browse files
committed
ionic: support ethtool get_module_eeprom_by_page
JIRA: https://issues.redhat.com/browse/RHEL-88152 commit 9c2e17d Author: Shannon Nelson <shannon.nelson@amd.com> Date: Tue Apr 15 16:13:15 2025 -0700 ionic: support ethtool get_module_eeprom_by_page Add support for the newer get_module_eeprom_by_page interface. Only the upper half of the 256 byte page is available for reading, and the firmware puts the two sections into the extended sprom buffer, so a union is used over the extended sprom buffer to make clear which page is to be accessed. With get_module_eeprom_by_page implemented there is no need for the older get_module_info or git_module_eeprom interfaces, so remove them. Reviewed-by: Brett Creeley <brett.creeley@amd.com> Signed-off-by: Shannon Nelson <shannon.nelson@amd.com> Reviewed-by: Simon Horman <horms@kernel.org> Link: https://patch.msgid.link/20250415231317.40616-3-shannon.nelson@amd.com Signed-off-by: Paolo Abeni <pabeni@redhat.com> Signed-off-by: Mohammad Heib <mheib@redhat.com>
1 parent df4713c commit 01a6185

File tree

2 files changed

+37
-71
lines changed

2 files changed

+37
-71
lines changed

drivers/net/ethernet/pensando/ionic/ionic_ethtool.c

Lines changed: 27 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -948,44 +948,6 @@ static int ionic_get_tunable(struct net_device *netdev,
948948
return 0;
949949
}
950950

951-
static int ionic_get_module_info(struct net_device *netdev,
952-
struct ethtool_modinfo *modinfo)
953-
954-
{
955-
struct ionic_lif *lif = netdev_priv(netdev);
956-
struct ionic_dev *idev = &lif->ionic->idev;
957-
struct ionic_xcvr_status *xcvr;
958-
struct sfp_eeprom_base *sfp;
959-
960-
xcvr = &idev->port_info->status.xcvr;
961-
sfp = (struct sfp_eeprom_base *) xcvr->sprom;
962-
963-
/* report the module data type and length */
964-
switch (sfp->phys_id) {
965-
case SFF8024_ID_SFP:
966-
modinfo->type = ETH_MODULE_SFF_8079;
967-
modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN;
968-
break;
969-
case SFF8024_ID_QSFP_8436_8636:
970-
case SFF8024_ID_QSFP28_8636:
971-
modinfo->type = ETH_MODULE_SFF_8436;
972-
modinfo->eeprom_len = ETH_MODULE_SFF_8436_LEN;
973-
break;
974-
case SFF8024_ID_QSFP_PLUS_CMIS:
975-
modinfo->type = ETH_MODULE_SFF_8472;
976-
modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN;
977-
break;
978-
default:
979-
netdev_info(netdev, "unknown xcvr type 0x%02x\n",
980-
xcvr->sprom[0]);
981-
modinfo->type = 0;
982-
modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN;
983-
break;
984-
}
985-
986-
return 0;
987-
}
988-
989951
static int ionic_do_module_copy(u8 *dst, u8 *src, u32 len)
990952
{
991953
char tbuf[sizeof_field(struct ionic_xcvr_status, sprom)];
@@ -1010,46 +972,43 @@ static int ionic_do_module_copy(u8 *dst, u8 *src, u32 len)
1010972
return 0;
1011973
}
1012974

1013-
static int ionic_get_module_eeprom(struct net_device *netdev,
1014-
struct ethtool_eeprom *ee,
1015-
u8 *data)
975+
static int ionic_get_module_eeprom_by_page(struct net_device *netdev,
976+
const struct ethtool_module_eeprom *page_data,
977+
struct netlink_ext_ack *extack)
1016978
{
1017979
struct ionic_lif *lif = netdev_priv(netdev);
1018980
struct ionic_dev *idev = &lif->ionic->idev;
1019-
u32 start = ee->offset;
1020981
u32 err = -EINVAL;
1021-
u32 size = 0;
1022982
u8 *src;
1023983

1024-
if (start < ETH_MODULE_SFF_8079_LEN) {
1025-
if (start + ee->len > ETH_MODULE_SFF_8079_LEN)
1026-
size = ETH_MODULE_SFF_8079_LEN - start;
1027-
else
1028-
size = ee->len;
1029-
1030-
src = &idev->port_info->status.xcvr.sprom[start];
1031-
err = ionic_do_module_copy(data, src, size);
1032-
if (err)
1033-
return err;
984+
if (!page_data->length)
985+
return -EINVAL;
1034986

1035-
data += size;
1036-
start += size;
987+
if (page_data->bank != 0) {
988+
NL_SET_ERR_MSG_MOD(extack, "Only bank 0 is supported");
989+
return -EINVAL;
1037990
}
1038991

1039-
if (start >= ETH_MODULE_SFF_8079_LEN &&
1040-
start < ETH_MODULE_SFF_8472_LEN) {
1041-
size = ee->len - size;
1042-
if (start + size > ETH_MODULE_SFF_8472_LEN)
1043-
size = ETH_MODULE_SFF_8472_LEN - start;
1044-
1045-
start -= ETH_MODULE_SFF_8079_LEN;
1046-
src = &idev->port_info->sprom_epage[start];
1047-
err = ionic_do_module_copy(data, src, size);
1048-
if (err)
1049-
return err;
992+
switch (page_data->page) {
993+
case 0:
994+
src = &idev->port_info->status.xcvr.sprom[page_data->offset];
995+
break;
996+
case 1:
997+
src = &idev->port_info->sprom_page1[page_data->offset - 128];
998+
break;
999+
case 2:
1000+
src = &idev->port_info->sprom_page2[page_data->offset - 128];
1001+
break;
1002+
default:
1003+
return -EOPNOTSUPP;
10501004
}
10511005

1052-
return err;
1006+
memset(page_data->data, 0, page_data->length);
1007+
err = ionic_do_module_copy(page_data->data, src, page_data->length);
1008+
if (err)
1009+
return err;
1010+
1011+
return page_data->length;
10531012
}
10541013

10551014
static int ionic_get_ts_info(struct net_device *netdev,
@@ -1197,8 +1156,7 @@ static const struct ethtool_ops ionic_ethtool_ops = {
11971156
.set_rxfh = ionic_set_rxfh,
11981157
.get_tunable = ionic_get_tunable,
11991158
.set_tunable = ionic_set_tunable,
1200-
.get_module_info = ionic_get_module_info,
1201-
.get_module_eeprom = ionic_get_module_eeprom,
1159+
.get_module_eeprom_by_page = ionic_get_module_eeprom_by_page,
12021160
.get_pauseparam = ionic_get_pauseparam,
12031161
.set_pauseparam = ionic_set_pauseparam,
12041162
.get_fecparam = ionic_get_fecparam,

drivers/net/ethernet/pensando/ionic/ionic_if.h

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2839,7 +2839,9 @@ union ionic_port_identity {
28392839
* @status: Port status data
28402840
* @stats: Port statistics data
28412841
* @mgmt_stats: Port management statistics data
2842-
* @sprom_epage: Extended Transceiver sprom, high page 1 and 2
2842+
* @sprom_epage: Extended Transceiver sprom
2843+
* @sprom_page1: Extended Transceiver sprom, page 1
2844+
* @sprom_page2: Extended Transceiver sprom, page 2
28432845
* @rsvd: reserved byte(s)
28442846
* @pb_stats: uplink pb drop stats
28452847
*/
@@ -2850,7 +2852,13 @@ struct ionic_port_info {
28502852
struct ionic_port_stats stats;
28512853
struct ionic_mgmt_port_stats mgmt_stats;
28522854
};
2853-
u8 sprom_epage[256];
2855+
union {
2856+
u8 sprom_epage[256];
2857+
struct {
2858+
u8 sprom_page1[128];
2859+
u8 sprom_page2[128];
2860+
};
2861+
};
28542862
u8 rsvd[504];
28552863

28562864
/* pb_stats must start at 2k offset */

0 commit comments

Comments
 (0)