diff options
author | Yuval Mintz <yuvalmin@broadcom.com> | 2012-06-20 15:05:23 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-06-22 20:20:32 -0400 |
commit | 24ea818e305b92ad1fadcca015ae3b0c1222c497 (patch) | |
tree | 1464305c95086e1b48dff9e4fc885b773a474df2 /drivers | |
parent | dbef807ee890b45f9c9125b665c0dddc993c3d15 (diff) |
bnx2x: link module eeprom
Add the ethtool functionality of accessing optic modules'
information and eeprom to the bnx2x driver.
Signed-off-by: Yuval Mintz <yuvalmin@broadcom.com>
Signed-off-by: Yaniv Rosner <yaniv.rosner@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c | 61 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c | 9 | ||||
-rw-r--r-- | drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.h | 1 |
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 | ||
1163 | static 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 | |||
1198 | static 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 | |||
1163 | static int bnx2x_nvram_write_dword(struct bnx2x *bp, u32 offset, u32 val, | 1222 | static 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 |