diff options
author | Jian Shen <shenjian15@huawei.com> | 2018-01-19 01:41:12 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-01-22 16:05:49 -0500 |
commit | 716aaac1f3f3ee141f550d2d6d7934eab42c1c29 (patch) | |
tree | 2d0f0bcfde73b983527d1f4edfeac8217b78bd0f | |
parent | 07f8e94011d7d14d4633f076bae6e341fea5076e (diff) |
net: hns3: add net status led support for fiber port
Check the net status per second, include port speed, total rx/tx packets
and link status. Updating the led status for fiber port.
Signed-off-by: Jian Shen <shenjian15@huawei.com>
Signed-off-by: Peng Li <lipeng321@huawei.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
3 files changed, 113 insertions, 0 deletions
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h index 122f862b6d9c..3fd10a6bec53 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h | |||
@@ -115,6 +115,7 @@ enum hclge_opcode_type { | |||
115 | HCLGE_OPC_QUERY_LINK_STATUS = 0x0307, | 115 | HCLGE_OPC_QUERY_LINK_STATUS = 0x0307, |
116 | HCLGE_OPC_CONFIG_MAX_FRM_SIZE = 0x0308, | 116 | HCLGE_OPC_CONFIG_MAX_FRM_SIZE = 0x0308, |
117 | HCLGE_OPC_CONFIG_SPEED_DUP = 0x0309, | 117 | HCLGE_OPC_CONFIG_SPEED_DUP = 0x0309, |
118 | HCLGE_OPC_STATS_MAC_TRAFFIC = 0x0314, | ||
118 | /* MACSEC command */ | 119 | /* MACSEC command */ |
119 | 120 | ||
120 | /* PFC/Pause CMD*/ | 121 | /* PFC/Pause CMD*/ |
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c index 12150f26d00d..32bc6f68e297 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | |||
@@ -39,6 +39,7 @@ static int hclge_set_mta_filter_mode(struct hclge_dev *hdev, | |||
39 | static int hclge_set_mtu(struct hnae3_handle *handle, int new_mtu); | 39 | static int hclge_set_mtu(struct hnae3_handle *handle, int new_mtu); |
40 | static int hclge_init_vlan_config(struct hclge_dev *hdev); | 40 | static int hclge_init_vlan_config(struct hclge_dev *hdev); |
41 | static int hclge_reset_ae_dev(struct hnae3_ae_dev *ae_dev); | 41 | static int hclge_reset_ae_dev(struct hnae3_ae_dev *ae_dev); |
42 | static int hclge_update_led_status(struct hclge_dev *hdev); | ||
42 | 43 | ||
43 | static struct hnae3_ae_algo ae_algo; | 44 | static struct hnae3_ae_algo ae_algo; |
44 | 45 | ||
@@ -505,6 +506,38 @@ static int hclge_32_bit_update_stats(struct hclge_dev *hdev) | |||
505 | return 0; | 506 | return 0; |
506 | } | 507 | } |
507 | 508 | ||
509 | static int hclge_mac_get_traffic_stats(struct hclge_dev *hdev) | ||
510 | { | ||
511 | struct hclge_mac_stats *mac_stats = &hdev->hw_stats.mac_stats; | ||
512 | struct hclge_desc desc; | ||
513 | __le64 *desc_data; | ||
514 | int ret; | ||
515 | |||
516 | /* for fiber port, need to query the total rx/tx packets statstics, | ||
517 | * used for data transferring checking. | ||
518 | */ | ||
519 | if (hdev->hw.mac.media_type != HNAE3_MEDIA_TYPE_FIBER) | ||
520 | return 0; | ||
521 | |||
522 | if (test_bit(HCLGE_STATE_STATISTICS_UPDATING, &hdev->state)) | ||
523 | return 0; | ||
524 | |||
525 | hclge_cmd_setup_basic_desc(&desc, HCLGE_OPC_STATS_MAC_TRAFFIC, true); | ||
526 | ret = hclge_cmd_send(&hdev->hw, &desc, 1); | ||
527 | if (ret) { | ||
528 | dev_err(&hdev->pdev->dev, | ||
529 | "Get MAC total pkt stats fail, ret = %d\n", ret); | ||
530 | |||
531 | return ret; | ||
532 | } | ||
533 | |||
534 | desc_data = (__le64 *)(&desc.data[0]); | ||
535 | mac_stats->mac_tx_total_pkt_num += le64_to_cpu(*desc_data++); | ||
536 | mac_stats->mac_rx_total_pkt_num += le64_to_cpu(*desc_data); | ||
537 | |||
538 | return 0; | ||
539 | } | ||
540 | |||
508 | static int hclge_mac_update_stats(struct hclge_dev *hdev) | 541 | static int hclge_mac_update_stats(struct hclge_dev *hdev) |
509 | { | 542 | { |
510 | #define HCLGE_MAC_CMD_NUM 21 | 543 | #define HCLGE_MAC_CMD_NUM 21 |
@@ -2846,13 +2879,20 @@ static void hclge_service_task(struct work_struct *work) | |||
2846 | struct hclge_dev *hdev = | 2879 | struct hclge_dev *hdev = |
2847 | container_of(work, struct hclge_dev, service_task); | 2880 | container_of(work, struct hclge_dev, service_task); |
2848 | 2881 | ||
2882 | /* The total rx/tx packets statstics are wanted to be updated | ||
2883 | * per second. Both hclge_update_stats_for_all() and | ||
2884 | * hclge_mac_get_traffic_stats() can do it. | ||
2885 | */ | ||
2849 | if (hdev->hw_stats.stats_timer >= HCLGE_STATS_TIMER_INTERVAL) { | 2886 | if (hdev->hw_stats.stats_timer >= HCLGE_STATS_TIMER_INTERVAL) { |
2850 | hclge_update_stats_for_all(hdev); | 2887 | hclge_update_stats_for_all(hdev); |
2851 | hdev->hw_stats.stats_timer = 0; | 2888 | hdev->hw_stats.stats_timer = 0; |
2889 | } else { | ||
2890 | hclge_mac_get_traffic_stats(hdev); | ||
2852 | } | 2891 | } |
2853 | 2892 | ||
2854 | hclge_update_speed_duplex(hdev); | 2893 | hclge_update_speed_duplex(hdev); |
2855 | hclge_update_link_status(hdev); | 2894 | hclge_update_link_status(hdev); |
2895 | hclge_update_led_status(hdev); | ||
2856 | hclge_service_complete(hdev); | 2896 | hclge_service_complete(hdev); |
2857 | } | 2897 | } |
2858 | 2898 | ||
@@ -5888,6 +5928,75 @@ static int hclge_set_led_id(struct hnae3_handle *handle, | |||
5888 | return ret; | 5928 | return ret; |
5889 | } | 5929 | } |
5890 | 5930 | ||
5931 | enum hclge_led_port_speed { | ||
5932 | HCLGE_SPEED_LED_FOR_1G, | ||
5933 | HCLGE_SPEED_LED_FOR_10G, | ||
5934 | HCLGE_SPEED_LED_FOR_25G, | ||
5935 | HCLGE_SPEED_LED_FOR_40G, | ||
5936 | HCLGE_SPEED_LED_FOR_50G, | ||
5937 | HCLGE_SPEED_LED_FOR_100G, | ||
5938 | }; | ||
5939 | |||
5940 | static u8 hclge_led_get_speed_status(u32 speed) | ||
5941 | { | ||
5942 | u8 speed_led; | ||
5943 | |||
5944 | switch (speed) { | ||
5945 | case HCLGE_MAC_SPEED_1G: | ||
5946 | speed_led = HCLGE_SPEED_LED_FOR_1G; | ||
5947 | break; | ||
5948 | case HCLGE_MAC_SPEED_10G: | ||
5949 | speed_led = HCLGE_SPEED_LED_FOR_10G; | ||
5950 | break; | ||
5951 | case HCLGE_MAC_SPEED_25G: | ||
5952 | speed_led = HCLGE_SPEED_LED_FOR_25G; | ||
5953 | break; | ||
5954 | case HCLGE_MAC_SPEED_40G: | ||
5955 | speed_led = HCLGE_SPEED_LED_FOR_40G; | ||
5956 | break; | ||
5957 | case HCLGE_MAC_SPEED_50G: | ||
5958 | speed_led = HCLGE_SPEED_LED_FOR_50G; | ||
5959 | break; | ||
5960 | case HCLGE_MAC_SPEED_100G: | ||
5961 | speed_led = HCLGE_SPEED_LED_FOR_100G; | ||
5962 | break; | ||
5963 | default: | ||
5964 | speed_led = HCLGE_LED_NO_CHANGE; | ||
5965 | } | ||
5966 | |||
5967 | return speed_led; | ||
5968 | } | ||
5969 | |||
5970 | static int hclge_update_led_status(struct hclge_dev *hdev) | ||
5971 | { | ||
5972 | u8 port_speed_status, link_status, activity_status; | ||
5973 | u64 rx_pkts, tx_pkts; | ||
5974 | |||
5975 | if (hdev->hw.mac.media_type != HNAE3_MEDIA_TYPE_FIBER) | ||
5976 | return 0; | ||
5977 | |||
5978 | port_speed_status = hclge_led_get_speed_status(hdev->hw.mac.speed); | ||
5979 | |||
5980 | rx_pkts = hdev->hw_stats.mac_stats.mac_rx_total_pkt_num; | ||
5981 | tx_pkts = hdev->hw_stats.mac_stats.mac_tx_total_pkt_num; | ||
5982 | if (rx_pkts != hdev->rx_pkts_for_led || | ||
5983 | tx_pkts != hdev->tx_pkts_for_led) | ||
5984 | activity_status = HCLGE_LED_ON; | ||
5985 | else | ||
5986 | activity_status = HCLGE_LED_OFF; | ||
5987 | hdev->rx_pkts_for_led = rx_pkts; | ||
5988 | hdev->tx_pkts_for_led = tx_pkts; | ||
5989 | |||
5990 | if (hdev->hw.mac.link) | ||
5991 | link_status = HCLGE_LED_ON; | ||
5992 | else | ||
5993 | link_status = HCLGE_LED_OFF; | ||
5994 | |||
5995 | return hclge_set_led_status_sfp(hdev, port_speed_status, | ||
5996 | activity_status, link_status, | ||
5997 | HCLGE_LED_NO_CHANGE); | ||
5998 | } | ||
5999 | |||
5891 | static const struct hnae3_ae_ops hclge_ops = { | 6000 | static const struct hnae3_ae_ops hclge_ops = { |
5892 | .init_ae_dev = hclge_init_ae_dev, | 6001 | .init_ae_dev = hclge_init_ae_dev, |
5893 | .uninit_ae_dev = hclge_uninit_ae_dev, | 6002 | .uninit_ae_dev = hclge_uninit_ae_dev, |
diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h index eeb6c8d66e4e..d99a76a9557c 100644 --- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h +++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h | |||
@@ -550,6 +550,9 @@ struct hclge_dev { | |||
550 | bool accept_mta_mc; /* Whether accept mta filter multicast */ | 550 | bool accept_mta_mc; /* Whether accept mta filter multicast */ |
551 | 551 | ||
552 | struct hclge_vlan_type_cfg vlan_type_cfg; | 552 | struct hclge_vlan_type_cfg vlan_type_cfg; |
553 | |||
554 | u64 rx_pkts_for_led; | ||
555 | u64 tx_pkts_for_led; | ||
553 | }; | 556 | }; |
554 | 557 | ||
555 | /* VPort level vlan tag configuration for TX direction */ | 558 | /* VPort level vlan tag configuration for TX direction */ |