aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/qlogic/qlcnic
diff options
context:
space:
mode:
authorHimanshu Madhani <himanshu.madhani@qlogic.com>2013-05-09 05:25:12 -0400
committerDavid S. Miller <davem@davemloft.net>2013-05-11 19:01:15 -0400
commitb938662d88264c1a92611ca1b82fdff5a4e87121 (patch)
treefb0fca4ef248c9242657cd4eb826f70567f53081 /drivers/net/ethernet/qlogic/qlcnic
parent9fd13331ab8f108ade0e8077b69ff4663b63d43f (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.h2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.c68
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_hw.h2
-rw-r--r--drivers/net/ethernet/qlogic/qlcnic/qlcnic_ethtool.c49
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);
1514void qlcnic_remove_diag_entries(struct qlcnic_adapter *adapter); 1515void qlcnic_remove_diag_entries(struct qlcnic_adapter *adapter);
1515void qlcnic_82xx_add_sysfs(struct qlcnic_adapter *adapter); 1516void qlcnic_82xx_add_sysfs(struct qlcnic_adapter *adapter);
1516void qlcnic_82xx_remove_sysfs(struct qlcnic_adapter *adapter); 1517void qlcnic_82xx_remove_sysfs(struct qlcnic_adapter *adapter);
1518int qlcnic_82xx_get_settings(struct qlcnic_adapter *, struct ethtool_cmd *);
1517 1519
1518int qlcnicvf_config_bridged_mode(struct qlcnic_adapter *, u32); 1520int qlcnicvf_config_bridged_mode(struct qlcnic_adapter *, u32);
1519int qlcnicvf_config_led(struct qlcnic_adapter *, u32, u32); 1521int 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
2841int qlcnic_83xx_get_settings(struct qlcnic_adapter *adapter) 2858int 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
604void qlcnic_83xx_get_minidump_template(struct qlcnic_adapter *); 604void qlcnic_83xx_get_minidump_template(struct qlcnic_adapter *);
605void qlcnic_83xx_get_stats(struct qlcnic_adapter *adapter, u64 *data); 605void qlcnic_83xx_get_stats(struct qlcnic_adapter *adapter, u64 *data);
606int qlcnic_83xx_get_settings(struct qlcnic_adapter *); 606int qlcnic_83xx_get_settings(struct qlcnic_adapter *, struct ethtool_cmd *);
607int qlcnic_83xx_set_settings(struct qlcnic_adapter *, struct ethtool_cmd *); 607int qlcnic_83xx_set_settings(struct qlcnic_adapter *, struct ethtool_cmd *);
608void qlcnic_83xx_get_pauseparam(struct qlcnic_adapter *, 608void 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
252qlcnic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) 252qlcnic_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
264int 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);