aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ethernet')
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c61
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c9
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h1
3 files changed, 67 insertions, 4 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
index 819170ee152a..1f8c1561cdec 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
@@ -1160,6 +1160,65 @@ static int bnx2x_get_eeprom(struct net_device *dev,
1160 return rc; 1160 return rc;
1161} 1161}
1162 1162
1163static int bnx2x_get_module_eeprom(struct net_device *dev,
1164 struct ethtool_eeprom *ee,
1165 u8 *data)
1166{
1167 struct bnx2x *bp = netdev_priv(dev);
1168 int rc = 0, phy_idx;
1169 u8 *user_data = data;
1170 int remaining_len = ee->len, xfer_size;
1171 unsigned int page_off = ee->offset;
1172
1173 if (!netif_running(dev)) {
1174 DP(BNX2X_MSG_ETHTOOL | BNX2X_MSG_NVM,
1175 "cannot access eeprom when the interface is down\n");
1176 return -EAGAIN;
1177 }
1178
1179 phy_idx = bnx2x_get_cur_phy_idx(bp);
1180 bnx2x_acquire_phy_lock(bp);
1181 while (!rc && remaining_len > 0) {
1182 xfer_size = (remaining_len > SFP_EEPROM_PAGE_SIZE) ?
1183 SFP_EEPROM_PAGE_SIZE : remaining_len;
1184 rc = bnx2x_read_sfp_module_eeprom(&bp->link_params.phy[phy_idx],
1185 &bp->link_params,
1186 page_off,
1187 xfer_size,
1188 user_data);
1189 remaining_len -= xfer_size;
1190 user_data += xfer_size;
1191 page_off += xfer_size;
1192 }
1193
1194 bnx2x_release_phy_lock(bp);
1195 return rc;
1196}
1197
1198static int bnx2x_get_module_info(struct net_device *dev,
1199 struct ethtool_modinfo *modinfo)
1200{
1201 struct bnx2x *bp = netdev_priv(dev);
1202 int phy_idx;
1203 if (!netif_running(dev)) {
1204 DP(BNX2X_MSG_ETHTOOL | BNX2X_MSG_NVM,
1205 "cannot access eeprom when the interface is down\n");
1206 return -EAGAIN;
1207 }
1208
1209 phy_idx = bnx2x_get_cur_phy_idx(bp);
1210 switch (bp->link_params.phy[phy_idx].media_type) {
1211 case ETH_PHY_SFPP_10G_FIBER:
1212 case ETH_PHY_SFP_1G_FIBER:
1213 case ETH_PHY_DA_TWINAX:
1214 modinfo->type = ETH_MODULE_SFF_8079;
1215 modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN;
1216 return 0;
1217 default:
1218 return -EOPNOTSUPP;
1219 }
1220}
1221
1163static int bnx2x_nvram_write_dword(struct bnx2x *bp, u32 offset, u32 val, 1222static int bnx2x_nvram_write_dword(struct bnx2x *bp, u32 offset, u32 val,
1164 u32 cmd_flags) 1223 u32 cmd_flags)
1165{ 1224{
@@ -2915,6 +2974,8 @@ static const struct ethtool_ops bnx2x_ethtool_ops = {
2915 .set_rxfh_indir = bnx2x_set_rxfh_indir, 2974 .set_rxfh_indir = bnx2x_set_rxfh_indir,
2916 .get_channels = bnx2x_get_channels, 2975 .get_channels = bnx2x_get_channels,
2917 .set_channels = bnx2x_set_channels, 2976 .set_channels = bnx2x_set_channels,
2977 .get_module_info = bnx2x_get_module_info,
2978 .get_module_eeprom = bnx2x_get_module_eeprom,
2918 .get_eee = bnx2x_get_eee, 2979 .get_eee = bnx2x_get_eee,
2919 .set_eee = bnx2x_set_eee, 2980 .set_eee = bnx2x_set_eee,
2920}; 2981};
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
index b21a6be81032..3e662bf7e5d8 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
@@ -7695,7 +7695,7 @@ static int bnx2x_8726_read_sfp_module_eeprom(struct bnx2x_phy *phy,
7695 struct bnx2x *bp = params->bp; 7695 struct bnx2x *bp = params->bp;
7696 u16 val = 0; 7696 u16 val = 0;
7697 u16 i; 7697 u16 i;
7698 if (byte_cnt > 16) { 7698 if (byte_cnt > SFP_EEPROM_PAGE_SIZE) {
7699 DP(NETIF_MSG_LINK, 7699 DP(NETIF_MSG_LINK,
7700 "Reading from eeprom is limited to 0xf\n"); 7700 "Reading from eeprom is limited to 0xf\n");
7701 return -EINVAL; 7701 return -EINVAL;
@@ -7764,7 +7764,8 @@ static int bnx2x_warpcore_read_sfp_module_eeprom(struct bnx2x_phy *phy,
7764 u32 data_array[4]; 7764 u32 data_array[4];
7765 u16 addr32; 7765 u16 addr32;
7766 struct bnx2x *bp = params->bp; 7766 struct bnx2x *bp = params->bp;
7767 if (byte_cnt > 16) { 7767
7768 if (byte_cnt > SFP_EEPROM_PAGE_SIZE) {
7768 DP(NETIF_MSG_LINK, 7769 DP(NETIF_MSG_LINK,
7769 "Reading from eeprom is limited to 16 bytes\n"); 7770 "Reading from eeprom is limited to 16 bytes\n");
7770 return -EINVAL; 7771 return -EINVAL;
@@ -7794,7 +7795,7 @@ static int bnx2x_8727_read_sfp_module_eeprom(struct bnx2x_phy *phy,
7794 struct bnx2x *bp = params->bp; 7795 struct bnx2x *bp = params->bp;
7795 u16 val, i; 7796 u16 val, i;
7796 7797
7797 if (byte_cnt > 16) { 7798 if (byte_cnt > SFP_EEPROM_PAGE_SIZE) {
7798 DP(NETIF_MSG_LINK, 7799 DP(NETIF_MSG_LINK,
7799 "Reading from eeprom is limited to 0xf\n"); 7800 "Reading from eeprom is limited to 0xf\n");
7800 return -EINVAL; 7801 return -EINVAL;
@@ -7877,7 +7878,7 @@ int bnx2x_read_sfp_module_eeprom(struct bnx2x_phy *phy,
7877 struct link_params *params, u16 addr, 7878 struct link_params *params, u16 addr,
7878 u8 byte_cnt, u8 *o_buf) 7879 u8 byte_cnt, u8 *o_buf)
7879{ 7880{
7880 int rc = -EINVAL; 7881 int rc = -EOPNOTSUPP;
7881 switch (phy->type) { 7882 switch (phy->type) {
7882 case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726: 7883 case PORT_HW_CFG_XGXS_EXT_PHY_TYPE_BCM8726:
7883 rc = bnx2x_8726_read_sfp_module_eeprom(phy, params, addr, 7884 rc = bnx2x_8726_read_sfp_module_eeprom(phy, params, addr,
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h
index 017236bee323..c05f9d94938f 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h
@@ -41,6 +41,7 @@
41#define SPEED_AUTO_NEG 0 41#define SPEED_AUTO_NEG 0
42#define SPEED_20000 20000 42#define SPEED_20000 20000
43 43
44#define SFP_EEPROM_PAGE_SIZE 16
44#define SFP_EEPROM_VENDOR_NAME_ADDR 0x14 45#define SFP_EEPROM_VENDOR_NAME_ADDR 0x14
45#define SFP_EEPROM_VENDOR_NAME_SIZE 16 46#define SFP_EEPROM_VENDOR_NAME_SIZE 16
46#define SFP_EEPROM_VENDOR_OUI_ADDR 0x25 47#define SFP_EEPROM_VENDOR_OUI_ADDR 0x25