diff options
author | Himanshu Madhani <himanshu.madhani@qlogic.com> | 2013-05-09 05:25:12 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-05-11 19:01:15 -0400 |
commit | b938662d88264c1a92611ca1b82fdff5a4e87121 (patch) | |
tree | fb0fca4ef248c9242657cd4eb826f70567f53081 /drivers/net/ethernet/qlogic/qlcnic | |
parent | 9fd13331ab8f108ade0e8077b69ff4663b63d43f (diff) |
qlcnic: Fix ethtool supported port status for 83xx
o Fix display for interface while using 'ethtool <device>' for 83xx adapter
Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com>
Signed-off-by: Shahed Shaikh <shahed.shaikh@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/qlogic/qlcnic')
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | 68 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | 49 |
4 files changed, 94 insertions, 27 deletions
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h index 90c253b145ef..019c5f78732e 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic.h | |||
@@ -429,6 +429,7 @@ struct qlcnic_hardware_context { | |||
429 | 429 | ||
430 | u16 port_type; | 430 | u16 port_type; |
431 | u16 board_type; | 431 | u16 board_type; |
432 | u16 supported_type; | ||
432 | 433 | ||
433 | u16 link_speed; | 434 | u16 link_speed; |
434 | u16 link_duplex; | 435 | u16 link_duplex; |
@@ -1514,6 +1515,7 @@ void qlcnic_create_diag_entries(struct qlcnic_adapter *adapter); | |||
1514 | void qlcnic_remove_diag_entries(struct qlcnic_adapter *adapter); | 1515 | void qlcnic_remove_diag_entries(struct qlcnic_adapter *adapter); |
1515 | void qlcnic_82xx_add_sysfs(struct qlcnic_adapter *adapter); | 1516 | void qlcnic_82xx_add_sysfs(struct qlcnic_adapter *adapter); |
1516 | void qlcnic_82xx_remove_sysfs(struct qlcnic_adapter *adapter); | 1517 | void qlcnic_82xx_remove_sysfs(struct qlcnic_adapter *adapter); |
1518 | int qlcnic_82xx_get_settings(struct qlcnic_adapter *, struct ethtool_cmd *); | ||
1517 | 1519 | ||
1518 | int qlcnicvf_config_bridged_mode(struct qlcnic_adapter *, u32); | 1520 | int qlcnicvf_config_bridged_mode(struct qlcnic_adapter *, u32); |
1519 | int qlcnicvf_config_led(struct qlcnic_adapter *, u32, u32); | 1521 | int qlcnicvf_config_led(struct qlcnic_adapter *, u32, u32); |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c index ea790a93ee7c..642fca0b15d2 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c | |||
@@ -2830,6 +2830,23 @@ int qlcnic_83xx_test_link(struct qlcnic_adapter *adapter) | |||
2830 | break; | 2830 | break; |
2831 | } | 2831 | } |
2832 | config = cmd.rsp.arg[3]; | 2832 | config = cmd.rsp.arg[3]; |
2833 | if (QLC_83XX_SFP_PRESENT(config)) { | ||
2834 | switch (ahw->module_type) { | ||
2835 | case LINKEVENT_MODULE_OPTICAL_UNKNOWN: | ||
2836 | case LINKEVENT_MODULE_OPTICAL_SRLR: | ||
2837 | case LINKEVENT_MODULE_OPTICAL_LRM: | ||
2838 | case LINKEVENT_MODULE_OPTICAL_SFP_1G: | ||
2839 | ahw->supported_type = PORT_FIBRE; | ||
2840 | break; | ||
2841 | case LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLE: | ||
2842 | case LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLELEN: | ||
2843 | case LINKEVENT_MODULE_TWINAX: | ||
2844 | ahw->supported_type = PORT_TP; | ||
2845 | break; | ||
2846 | default: | ||
2847 | ahw->supported_type = PORT_OTHER; | ||
2848 | } | ||
2849 | } | ||
2833 | if (config & 1) | 2850 | if (config & 1) |
2834 | err = 1; | 2851 | err = 1; |
2835 | } | 2852 | } |
@@ -2838,7 +2855,8 @@ out: | |||
2838 | return config; | 2855 | return config; |
2839 | } | 2856 | } |
2840 | 2857 | ||
2841 | int qlcnic_83xx_get_settings(struct qlcnic_adapter *adapter) | 2858 | int qlcnic_83xx_get_settings(struct qlcnic_adapter *adapter, |
2859 | struct ethtool_cmd *ecmd) | ||
2842 | { | 2860 | { |
2843 | u32 config = 0; | 2861 | u32 config = 0; |
2844 | int status = 0; | 2862 | int status = 0; |
@@ -2851,6 +2869,54 @@ int qlcnic_83xx_get_settings(struct qlcnic_adapter *adapter) | |||
2851 | ahw->module_type = QLC_83XX_SFP_MODULE_TYPE(config); | 2869 | ahw->module_type = QLC_83XX_SFP_MODULE_TYPE(config); |
2852 | /* hard code until there is a way to get it from flash */ | 2870 | /* hard code until there is a way to get it from flash */ |
2853 | ahw->board_type = QLCNIC_BRDTYPE_83XX_10G; | 2871 | ahw->board_type = QLCNIC_BRDTYPE_83XX_10G; |
2872 | |||
2873 | if (netif_running(adapter->netdev) && ahw->has_link_events) { | ||
2874 | ethtool_cmd_speed_set(ecmd, ahw->link_speed); | ||
2875 | ecmd->duplex = ahw->link_duplex; | ||
2876 | ecmd->autoneg = ahw->link_autoneg; | ||
2877 | } else { | ||
2878 | ethtool_cmd_speed_set(ecmd, SPEED_UNKNOWN); | ||
2879 | ecmd->duplex = DUPLEX_UNKNOWN; | ||
2880 | ecmd->autoneg = AUTONEG_DISABLE; | ||
2881 | } | ||
2882 | |||
2883 | if (ahw->port_type == QLCNIC_XGBE) { | ||
2884 | ecmd->supported = SUPPORTED_1000baseT_Full; | ||
2885 | ecmd->advertising = ADVERTISED_1000baseT_Full; | ||
2886 | } else { | ||
2887 | ecmd->supported = (SUPPORTED_10baseT_Half | | ||
2888 | SUPPORTED_10baseT_Full | | ||
2889 | SUPPORTED_100baseT_Half | | ||
2890 | SUPPORTED_100baseT_Full | | ||
2891 | SUPPORTED_1000baseT_Half | | ||
2892 | SUPPORTED_1000baseT_Full); | ||
2893 | ecmd->advertising = (ADVERTISED_100baseT_Half | | ||
2894 | ADVERTISED_100baseT_Full | | ||
2895 | ADVERTISED_1000baseT_Half | | ||
2896 | ADVERTISED_1000baseT_Full); | ||
2897 | } | ||
2898 | |||
2899 | switch (ahw->supported_type) { | ||
2900 | case PORT_FIBRE: | ||
2901 | ecmd->supported |= SUPPORTED_FIBRE; | ||
2902 | ecmd->advertising |= ADVERTISED_FIBRE; | ||
2903 | ecmd->port = PORT_FIBRE; | ||
2904 | ecmd->transceiver = XCVR_EXTERNAL; | ||
2905 | break; | ||
2906 | case PORT_TP: | ||
2907 | ecmd->supported |= SUPPORTED_TP; | ||
2908 | ecmd->advertising |= ADVERTISED_TP; | ||
2909 | ecmd->port = PORT_TP; | ||
2910 | ecmd->transceiver = XCVR_INTERNAL; | ||
2911 | break; | ||
2912 | default: | ||
2913 | ecmd->supported |= SUPPORTED_FIBRE; | ||
2914 | ecmd->advertising |= ADVERTISED_FIBRE; | ||
2915 | ecmd->port = PORT_OTHER; | ||
2916 | ecmd->transceiver = XCVR_EXTERNAL; | ||
2917 | break; | ||
2918 | } | ||
2919 | ecmd->phy_address = ahw->physical_port; | ||
2854 | return status; | 2920 | return status; |
2855 | } | 2921 | } |
2856 | 2922 | ||
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h index 1f1d85e6f2af..faf5553681e1 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h | |||
@@ -603,7 +603,7 @@ int qlcnic_83xx_get_vnic_pf_info(struct qlcnic_adapter *, struct qlcnic_info *); | |||
603 | 603 | ||
604 | void qlcnic_83xx_get_minidump_template(struct qlcnic_adapter *); | 604 | void qlcnic_83xx_get_minidump_template(struct qlcnic_adapter *); |
605 | void qlcnic_83xx_get_stats(struct qlcnic_adapter *adapter, u64 *data); | 605 | void qlcnic_83xx_get_stats(struct qlcnic_adapter *adapter, u64 *data); |
606 | int qlcnic_83xx_get_settings(struct qlcnic_adapter *); | 606 | int qlcnic_83xx_get_settings(struct qlcnic_adapter *, struct ethtool_cmd *); |
607 | int qlcnic_83xx_set_settings(struct qlcnic_adapter *, struct ethtool_cmd *); | 607 | int qlcnic_83xx_set_settings(struct qlcnic_adapter *, struct ethtool_cmd *); |
608 | void qlcnic_83xx_get_pauseparam(struct qlcnic_adapter *, | 608 | void qlcnic_83xx_get_pauseparam(struct qlcnic_adapter *, |
609 | struct ethtool_pauseparam *); | 609 | struct ethtool_pauseparam *); |
diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c index 6005b06dbf64..f67652de5a63 100644 --- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c +++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c | |||
@@ -252,6 +252,18 @@ static int | |||
252 | qlcnic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | 252 | qlcnic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) |
253 | { | 253 | { |
254 | struct qlcnic_adapter *adapter = netdev_priv(dev); | 254 | struct qlcnic_adapter *adapter = netdev_priv(dev); |
255 | |||
256 | if (qlcnic_82xx_check(adapter)) | ||
257 | return qlcnic_82xx_get_settings(adapter, ecmd); | ||
258 | else if (qlcnic_83xx_check(adapter)) | ||
259 | return qlcnic_83xx_get_settings(adapter, ecmd); | ||
260 | |||
261 | return -EIO; | ||
262 | } | ||
263 | |||
264 | int qlcnic_82xx_get_settings(struct qlcnic_adapter *adapter, | ||
265 | struct ethtool_cmd *ecmd) | ||
266 | { | ||
255 | struct qlcnic_hardware_context *ahw = adapter->ahw; | 267 | struct qlcnic_hardware_context *ahw = adapter->ahw; |
256 | u32 speed, reg; | 268 | u32 speed, reg; |
257 | int check_sfp_module = 0; | 269 | int check_sfp_module = 0; |
@@ -277,10 +289,7 @@ qlcnic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | |||
277 | 289 | ||
278 | } else if (adapter->ahw->port_type == QLCNIC_XGBE) { | 290 | } else if (adapter->ahw->port_type == QLCNIC_XGBE) { |
279 | u32 val = 0; | 291 | u32 val = 0; |
280 | if (qlcnic_83xx_check(adapter)) | 292 | val = QLCRD32(adapter, QLCNIC_PORT_MODE_ADDR); |
281 | qlcnic_83xx_get_settings(adapter); | ||
282 | else | ||
283 | val = QLCRD32(adapter, QLCNIC_PORT_MODE_ADDR); | ||
284 | 293 | ||
285 | if (val == QLCNIC_PORT_MODE_802_3_AP) { | 294 | if (val == QLCNIC_PORT_MODE_802_3_AP) { |
286 | ecmd->supported = SUPPORTED_1000baseT_Full; | 295 | ecmd->supported = SUPPORTED_1000baseT_Full; |
@@ -290,16 +299,13 @@ qlcnic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) | |||
290 | ecmd->advertising = ADVERTISED_10000baseT_Full; | 299 | ecmd->advertising = ADVERTISED_10000baseT_Full; |
291 | } | 300 | } |
292 | 301 | ||
293 | if (netif_running(dev) && adapter->ahw->has_link_events) { | 302 | if (netif_running(adapter->netdev) && ahw->has_link_events) { |
294 | if (qlcnic_82xx_check(adapter)) { | 303 | reg = QLCRD32(adapter, P3P_LINK_SPEED_REG(pcifn)); |
295 | reg = QLCRD32(adapter, | 304 | speed = P3P_LINK_SPEED_VAL(pcifn, reg); |
296 | P3P_LINK_SPEED_REG(pcifn)); | 305 | ahw->link_speed = speed * P3P_LINK_SPEED_MHZ; |
297 | speed = P3P_LINK_SPEED_VAL(pcifn, reg); | 306 | ethtool_cmd_speed_set(ecmd, ahw->link_speed); |
298 | ahw->link_speed = speed * P3P_LINK_SPEED_MHZ; | 307 | ecmd->autoneg = ahw->link_autoneg; |
299 | } | 308 | ecmd->duplex = ahw->link_duplex; |
300 | ethtool_cmd_speed_set(ecmd, adapter->ahw->link_speed); | ||
301 | ecmd->autoneg = adapter->ahw->link_autoneg; | ||
302 | ecmd->duplex = adapter->ahw->link_duplex; | ||
303 | goto skip; | 309 | goto skip; |
304 | } | 310 | } |
305 | 311 | ||
@@ -341,8 +347,8 @@ skip: | |||
341 | case QLCNIC_BRDTYPE_P3P_10G_SFP_QT: | 347 | case QLCNIC_BRDTYPE_P3P_10G_SFP_QT: |
342 | ecmd->advertising |= ADVERTISED_TP; | 348 | ecmd->advertising |= ADVERTISED_TP; |
343 | ecmd->supported |= SUPPORTED_TP; | 349 | ecmd->supported |= SUPPORTED_TP; |
344 | check_sfp_module = netif_running(dev) && | 350 | check_sfp_module = netif_running(adapter->netdev) && |
345 | adapter->ahw->has_link_events; | 351 | ahw->has_link_events; |
346 | case QLCNIC_BRDTYPE_P3P_10G_XFP: | 352 | case QLCNIC_BRDTYPE_P3P_10G_XFP: |
347 | ecmd->supported |= SUPPORTED_FIBRE; | 353 | ecmd->supported |= SUPPORTED_FIBRE; |
348 | ecmd->advertising |= ADVERTISED_FIBRE; | 354 | ecmd->advertising |= ADVERTISED_FIBRE; |
@@ -356,8 +362,8 @@ skip: | |||
356 | ecmd->advertising |= | 362 | ecmd->advertising |= |
357 | (ADVERTISED_FIBRE | ADVERTISED_TP); | 363 | (ADVERTISED_FIBRE | ADVERTISED_TP); |
358 | ecmd->port = PORT_FIBRE; | 364 | ecmd->port = PORT_FIBRE; |
359 | check_sfp_module = netif_running(dev) && | 365 | check_sfp_module = netif_running(adapter->netdev) && |
360 | adapter->ahw->has_link_events; | 366 | ahw->has_link_events; |
361 | } else { | 367 | } else { |
362 | ecmd->autoneg = AUTONEG_ENABLE; | 368 | ecmd->autoneg = AUTONEG_ENABLE; |
363 | ecmd->supported |= (SUPPORTED_TP | SUPPORTED_Autoneg); | 369 | ecmd->supported |= (SUPPORTED_TP | SUPPORTED_Autoneg); |
@@ -366,13 +372,6 @@ skip: | |||
366 | ecmd->port = PORT_TP; | 372 | ecmd->port = PORT_TP; |
367 | } | 373 | } |
368 | break; | 374 | break; |
369 | case QLCNIC_BRDTYPE_83XX_10G: | ||
370 | ecmd->autoneg = AUTONEG_DISABLE; | ||
371 | ecmd->supported |= (SUPPORTED_FIBRE | SUPPORTED_TP); | ||
372 | ecmd->advertising |= (ADVERTISED_FIBRE | ADVERTISED_TP); | ||
373 | ecmd->port = PORT_FIBRE; | ||
374 | check_sfp_module = netif_running(dev) && ahw->has_link_events; | ||
375 | break; | ||
376 | default: | 375 | default: |
377 | dev_err(&adapter->pdev->dev, "Unsupported board model %d\n", | 376 | dev_err(&adapter->pdev->dev, "Unsupported board model %d\n", |
378 | adapter->ahw->board_type); | 377 | adapter->ahw->board_type); |