aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJian Shen <shenjian15@huawei.com>2018-01-19 01:41:12 -0500
committerDavid S. Miller <davem@davemloft.net>2018-01-22 16:05:49 -0500
commit716aaac1f3f3ee141f550d2d6d7934eab42c1c29 (patch)
tree2d0f0bcfde73b983527d1f4edfeac8217b78bd0f
parent07f8e94011d7d14d4633f076bae6e341fea5076e (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>
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h1
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c109
-rw-r--r--drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h3
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,
39static int hclge_set_mtu(struct hnae3_handle *handle, int new_mtu); 39static int hclge_set_mtu(struct hnae3_handle *handle, int new_mtu);
40static int hclge_init_vlan_config(struct hclge_dev *hdev); 40static int hclge_init_vlan_config(struct hclge_dev *hdev);
41static int hclge_reset_ae_dev(struct hnae3_ae_dev *ae_dev); 41static int hclge_reset_ae_dev(struct hnae3_ae_dev *ae_dev);
42static int hclge_update_led_status(struct hclge_dev *hdev);
42 43
43static struct hnae3_ae_algo ae_algo; 44static 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
509static 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
508static int hclge_mac_update_stats(struct hclge_dev *hdev) 541static 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
5931enum 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
5940static 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
5970static 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
5891static const struct hnae3_ae_ops hclge_ops = { 6000static 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 */