1511e6bc0Shuangdaode /* 2511e6bc0Shuangdaode * Copyright (c) 2014-2015 Hisilicon Limited. 3511e6bc0Shuangdaode * 4511e6bc0Shuangdaode * This program is free software; you can redistribute it and/or modify 5511e6bc0Shuangdaode * it under the terms of the GNU General Public License as published by 6511e6bc0Shuangdaode * the Free Software Foundation; either version 2 of the License, or 7511e6bc0Shuangdaode * (at your option) any later version. 8511e6bc0Shuangdaode */ 9511e6bc0Shuangdaode 10a1cbaad7SArnd Bergmann #include <linux/io-64-nonatomic-hi-lo.h> 11511e6bc0Shuangdaode #include <linux/of_mdio.h> 12511e6bc0Shuangdaode #include "hns_dsaf_main.h" 13511e6bc0Shuangdaode #include "hns_dsaf_mac.h" 14511e6bc0Shuangdaode #include "hns_dsaf_xgmac.h" 15511e6bc0Shuangdaode #include "hns_dsaf_reg.h" 16511e6bc0Shuangdaode 17511e6bc0Shuangdaode static const struct mac_stats_string g_xgmac_stats_string[] = { 18511e6bc0Shuangdaode {"xgmac_tx_bad_pkts_minto64", MAC_STATS_FIELD_OFF(tx_fragment_err)}, 19511e6bc0Shuangdaode {"xgmac_tx_good_pkts_minto64", MAC_STATS_FIELD_OFF(tx_undersize)}, 20511e6bc0Shuangdaode {"xgmac_tx_total_pkts_minto64", MAC_STATS_FIELD_OFF(tx_under_min_pkts)}, 21511e6bc0Shuangdaode {"xgmac_tx_pkts_64", MAC_STATS_FIELD_OFF(tx_64bytes)}, 22511e6bc0Shuangdaode {"xgmac_tx_pkts_65to127", MAC_STATS_FIELD_OFF(tx_65to127)}, 23511e6bc0Shuangdaode {"xgmac_tx_pkts_128to255", MAC_STATS_FIELD_OFF(tx_128to255)}, 24511e6bc0Shuangdaode {"xgmac_tx_pkts_256to511", MAC_STATS_FIELD_OFF(tx_256to511)}, 25511e6bc0Shuangdaode {"xgmac_tx_pkts_512to1023", MAC_STATS_FIELD_OFF(tx_512to1023)}, 26511e6bc0Shuangdaode {"xgmac_tx_pkts_1024to1518", MAC_STATS_FIELD_OFF(tx_1024to1518)}, 27511e6bc0Shuangdaode {"xgmac_tx_pkts_1519tomax", MAC_STATS_FIELD_OFF(tx_1519tomax)}, 28511e6bc0Shuangdaode {"xgmac_tx_good_pkts_1519tomax", 29511e6bc0Shuangdaode MAC_STATS_FIELD_OFF(tx_1519tomax_good)}, 30511e6bc0Shuangdaode {"xgmac_tx_good_pkts_untralmax", MAC_STATS_FIELD_OFF(tx_oversize)}, 31511e6bc0Shuangdaode {"xgmac_tx_bad_pkts_untralmax", MAC_STATS_FIELD_OFF(tx_jabber_err)}, 32511e6bc0Shuangdaode {"xgmac_tx_good_pkts_all", MAC_STATS_FIELD_OFF(tx_good_pkts)}, 33511e6bc0Shuangdaode {"xgmac_tx_good_byte_all", MAC_STATS_FIELD_OFF(tx_good_bytes)}, 34511e6bc0Shuangdaode {"xgmac_tx_total_pkt", MAC_STATS_FIELD_OFF(tx_total_pkts)}, 35511e6bc0Shuangdaode {"xgmac_tx_total_byt", MAC_STATS_FIELD_OFF(tx_total_bytes)}, 36511e6bc0Shuangdaode {"xgmac_tx_uc_pkt", MAC_STATS_FIELD_OFF(tx_uc_pkts)}, 37511e6bc0Shuangdaode {"xgmac_tx_mc_pkt", MAC_STATS_FIELD_OFF(tx_mc_pkts)}, 38511e6bc0Shuangdaode {"xgmac_tx_bc_pkt", MAC_STATS_FIELD_OFF(tx_bc_pkts)}, 39511e6bc0Shuangdaode {"xgmac_tx_pause_frame_num", MAC_STATS_FIELD_OFF(tx_pfc_tc0)}, 40511e6bc0Shuangdaode {"xgmac_tx_pfc_per_1pause_framer", MAC_STATS_FIELD_OFF(tx_pfc_tc1)}, 41511e6bc0Shuangdaode {"xgmac_tx_pfc_per_2pause_framer", MAC_STATS_FIELD_OFF(tx_pfc_tc2)}, 42511e6bc0Shuangdaode {"xgmac_tx_pfc_per_3pause_framer", MAC_STATS_FIELD_OFF(tx_pfc_tc3)}, 43511e6bc0Shuangdaode {"xgmac_tx_pfc_per_4pause_framer", MAC_STATS_FIELD_OFF(tx_pfc_tc4)}, 44511e6bc0Shuangdaode {"xgmac_tx_pfc_per_5pause_framer", MAC_STATS_FIELD_OFF(tx_pfc_tc5)}, 45511e6bc0Shuangdaode {"xgmac_tx_pfc_per_6pause_framer", MAC_STATS_FIELD_OFF(tx_pfc_tc6)}, 46511e6bc0Shuangdaode {"xgmac_tx_pfc_per_7pause_framer", MAC_STATS_FIELD_OFF(tx_pfc_tc7)}, 47511e6bc0Shuangdaode {"xgmac_tx_mac_ctrol_frame", MAC_STATS_FIELD_OFF(tx_ctrl)}, 48511e6bc0Shuangdaode {"xgmac_tx_1731_pkts", MAC_STATS_FIELD_OFF(tx_1731_pkts)}, 49511e6bc0Shuangdaode {"xgmac_tx_1588_pkts", MAC_STATS_FIELD_OFF(tx_1588_pkts)}, 50511e6bc0Shuangdaode {"xgmac_rx_good_pkt_from_dsaf", MAC_STATS_FIELD_OFF(rx_good_from_sw)}, 51511e6bc0Shuangdaode {"xgmac_rx_bad_pkt_from_dsaf", MAC_STATS_FIELD_OFF(rx_bad_from_sw)}, 52511e6bc0Shuangdaode {"xgmac_tx_bad_pkt_64tomax", MAC_STATS_FIELD_OFF(tx_bad_pkts)}, 53511e6bc0Shuangdaode 54adc9048cSlipeng {"xgmac_rx_bad_pkts_minto64", MAC_STATS_FIELD_OFF(rx_fragment_err)}, 55adc9048cSlipeng {"xgmac_rx_good_pkts_minto64", MAC_STATS_FIELD_OFF(rx_undersize)}, 56adc9048cSlipeng {"xgmac_rx_total_pkts_minto64", MAC_STATS_FIELD_OFF(rx_under_min)}, 57511e6bc0Shuangdaode {"xgmac_rx_pkt_64", MAC_STATS_FIELD_OFF(rx_64bytes)}, 58511e6bc0Shuangdaode {"xgmac_rx_pkt_65to127", MAC_STATS_FIELD_OFF(rx_65to127)}, 59511e6bc0Shuangdaode {"xgmac_rx_pkt_128to255", MAC_STATS_FIELD_OFF(rx_128to255)}, 60511e6bc0Shuangdaode {"xgmac_rx_pkt_256to511", MAC_STATS_FIELD_OFF(rx_256to511)}, 61511e6bc0Shuangdaode {"xgmac_rx_pkt_512to1023", MAC_STATS_FIELD_OFF(rx_512to1023)}, 62511e6bc0Shuangdaode {"xgmac_rx_pkt_1024to1518", MAC_STATS_FIELD_OFF(rx_1024to1518)}, 63511e6bc0Shuangdaode {"xgmac_rx_pkt_1519tomax", MAC_STATS_FIELD_OFF(rx_1519tomax)}, 64511e6bc0Shuangdaode {"xgmac_rx_good_pkt_1519tomax", MAC_STATS_FIELD_OFF(rx_1519tomax_good)}, 65511e6bc0Shuangdaode {"xgmac_rx_good_pkt_untramax", MAC_STATS_FIELD_OFF(rx_oversize)}, 66511e6bc0Shuangdaode {"xgmac_rx_bad_pkt_untramax", MAC_STATS_FIELD_OFF(rx_jabber_err)}, 67511e6bc0Shuangdaode {"xgmac_rx_good_pkt", MAC_STATS_FIELD_OFF(rx_good_pkts)}, 68511e6bc0Shuangdaode {"xgmac_rx_good_byt", MAC_STATS_FIELD_OFF(rx_good_bytes)}, 69511e6bc0Shuangdaode {"xgmac_rx_pkt", MAC_STATS_FIELD_OFF(rx_total_pkts)}, 70511e6bc0Shuangdaode {"xgmac_rx_byt", MAC_STATS_FIELD_OFF(rx_total_bytes)}, 71511e6bc0Shuangdaode {"xgmac_rx_uc_pkt", MAC_STATS_FIELD_OFF(rx_uc_pkts)}, 72511e6bc0Shuangdaode {"xgmac_rx_mc_pkt", MAC_STATS_FIELD_OFF(rx_mc_pkts)}, 73511e6bc0Shuangdaode {"xgmac_rx_bc_pkt", MAC_STATS_FIELD_OFF(rx_bc_pkts)}, 74511e6bc0Shuangdaode {"xgmac_rx_pause_frame_num", MAC_STATS_FIELD_OFF(rx_pfc_tc0)}, 75511e6bc0Shuangdaode {"xgmac_rx_pfc_per_1pause_frame", MAC_STATS_FIELD_OFF(rx_pfc_tc1)}, 76511e6bc0Shuangdaode {"xgmac_rx_pfc_per_2pause_frame", MAC_STATS_FIELD_OFF(rx_pfc_tc2)}, 77511e6bc0Shuangdaode {"xgmac_rx_pfc_per_3pause_frame", MAC_STATS_FIELD_OFF(rx_pfc_tc3)}, 78511e6bc0Shuangdaode {"xgmac_rx_pfc_per_4pause_frame", MAC_STATS_FIELD_OFF(rx_pfc_tc4)}, 79511e6bc0Shuangdaode {"xgmac_rx_pfc_per_5pause_frame", MAC_STATS_FIELD_OFF(rx_pfc_tc5)}, 80511e6bc0Shuangdaode {"xgmac_rx_pfc_per_6pause_frame", MAC_STATS_FIELD_OFF(rx_pfc_tc6)}, 81511e6bc0Shuangdaode {"xgmac_rx_pfc_per_7pause_frame", MAC_STATS_FIELD_OFF(rx_pfc_tc7)}, 82511e6bc0Shuangdaode {"xgmac_rx_mac_control", MAC_STATS_FIELD_OFF(rx_unknown_ctrl)}, 83511e6bc0Shuangdaode {"xgmac_tx_good_pkt_todsaf", MAC_STATS_FIELD_OFF(tx_good_to_sw)}, 84511e6bc0Shuangdaode {"xgmac_tx_bad_pkt_todsaf", MAC_STATS_FIELD_OFF(tx_bad_to_sw)}, 85511e6bc0Shuangdaode {"xgmac_rx_1731_pkt", MAC_STATS_FIELD_OFF(rx_1731_pkts)}, 86511e6bc0Shuangdaode {"xgmac_rx_symbol_err_pkt", MAC_STATS_FIELD_OFF(rx_symbol_err)}, 87511e6bc0Shuangdaode {"xgmac_rx_fcs_pkt", MAC_STATS_FIELD_OFF(rx_fcs_err)} 88511e6bc0Shuangdaode }; 89511e6bc0Shuangdaode 90511e6bc0Shuangdaode /** 91511e6bc0Shuangdaode *hns_xgmac_tx_enable - xgmac port tx enable 92511e6bc0Shuangdaode *@drv: mac driver 93511e6bc0Shuangdaode *@value: value of enable 94511e6bc0Shuangdaode */ 95511e6bc0Shuangdaode static void hns_xgmac_tx_enable(struct mac_driver *drv, u32 value) 96511e6bc0Shuangdaode { 97511e6bc0Shuangdaode dsaf_set_dev_bit(drv, XGMAC_MAC_ENABLE_REG, XGMAC_ENABLE_TX_B, !!value); 98511e6bc0Shuangdaode } 99511e6bc0Shuangdaode 100511e6bc0Shuangdaode /** 101511e6bc0Shuangdaode *hns_xgmac_rx_enable - xgmac port rx enable 102511e6bc0Shuangdaode *@drv: mac driver 103511e6bc0Shuangdaode *@value: value of enable 104511e6bc0Shuangdaode */ 105511e6bc0Shuangdaode static void hns_xgmac_rx_enable(struct mac_driver *drv, u32 value) 106511e6bc0Shuangdaode { 107511e6bc0Shuangdaode dsaf_set_dev_bit(drv, XGMAC_MAC_ENABLE_REG, XGMAC_ENABLE_RX_B, !!value); 108511e6bc0Shuangdaode } 109511e6bc0Shuangdaode 110511e6bc0Shuangdaode /** 11120b3385aSDaode Huang * hns_xgmac_tx_lf_rf_insert - insert lf rf control about xgmac 11220b3385aSDaode Huang * @mac_drv: mac driver 11320b3385aSDaode Huang * @mode: inserf rf or lf 11420b3385aSDaode Huang */ 11520b3385aSDaode Huang static void hns_xgmac_lf_rf_insert(struct mac_driver *mac_drv, u32 mode) 11620b3385aSDaode Huang { 11720b3385aSDaode Huang dsaf_set_dev_field(mac_drv, XGMAC_MAC_TX_LF_RF_CONTROL_REG, 11820b3385aSDaode Huang XGMAC_LF_RF_INSERT_M, XGMAC_LF_RF_INSERT_S, mode); 11920b3385aSDaode Huang } 12020b3385aSDaode Huang 12120b3385aSDaode Huang /** 12220b3385aSDaode Huang * hns_xgmac__lf_rf_control_init - initial the lf rf control register 12320b3385aSDaode Huang * @mac_drv: mac driver 12420b3385aSDaode Huang */ 12520b3385aSDaode Huang static void hns_xgmac_lf_rf_control_init(struct mac_driver *mac_drv) 12620b3385aSDaode Huang { 12720b3385aSDaode Huang u32 val = 0; 12820b3385aSDaode Huang 12920b3385aSDaode Huang dsaf_set_bit(val, XGMAC_UNIDIR_EN_B, 0); 13020b3385aSDaode Huang dsaf_set_bit(val, XGMAC_RF_TX_EN_B, 1); 13120b3385aSDaode Huang dsaf_set_field(val, XGMAC_LF_RF_INSERT_M, XGMAC_LF_RF_INSERT_S, 0); 13220b3385aSDaode Huang dsaf_write_reg(mac_drv, XGMAC_MAC_TX_LF_RF_CONTROL_REG, val); 13320b3385aSDaode Huang } 13420b3385aSDaode Huang 13520b3385aSDaode Huang /** 136511e6bc0Shuangdaode *hns_xgmac_enable - enable xgmac port 137511e6bc0Shuangdaode *@drv: mac driver 138511e6bc0Shuangdaode *@mode: mode of mac port 139511e6bc0Shuangdaode */ 140511e6bc0Shuangdaode static void hns_xgmac_enable(void *mac_drv, enum mac_commom_mode mode) 141511e6bc0Shuangdaode { 142511e6bc0Shuangdaode struct mac_driver *drv = (struct mac_driver *)mac_drv; 143511e6bc0Shuangdaode 14420b3385aSDaode Huang hns_xgmac_lf_rf_insert(drv, HNS_XGMAC_NO_LF_RF_INSERT); 145511e6bc0Shuangdaode 146511e6bc0Shuangdaode /*enable XGE rX/tX */ 147511e6bc0Shuangdaode if (mode == MAC_COMM_MODE_TX) { 148511e6bc0Shuangdaode hns_xgmac_tx_enable(drv, 1); 149511e6bc0Shuangdaode } else if (mode == MAC_COMM_MODE_RX) { 150511e6bc0Shuangdaode hns_xgmac_rx_enable(drv, 1); 151511e6bc0Shuangdaode } else if (mode == MAC_COMM_MODE_RX_AND_TX) { 152511e6bc0Shuangdaode hns_xgmac_tx_enable(drv, 1); 153511e6bc0Shuangdaode hns_xgmac_rx_enable(drv, 1); 154511e6bc0Shuangdaode } else { 155511e6bc0Shuangdaode dev_err(drv->dev, "error mac mode:%d\n", mode); 156511e6bc0Shuangdaode } 157511e6bc0Shuangdaode } 158511e6bc0Shuangdaode 159511e6bc0Shuangdaode /** 160511e6bc0Shuangdaode *hns_xgmac_disable - disable xgmac port 161511e6bc0Shuangdaode *@mac_drv: mac driver 162511e6bc0Shuangdaode *@mode: mode of mac port 163511e6bc0Shuangdaode */ 164511e6bc0Shuangdaode static void hns_xgmac_disable(void *mac_drv, enum mac_commom_mode mode) 165511e6bc0Shuangdaode { 166511e6bc0Shuangdaode struct mac_driver *drv = (struct mac_driver *)mac_drv; 167511e6bc0Shuangdaode 168511e6bc0Shuangdaode if (mode == MAC_COMM_MODE_TX) { 169511e6bc0Shuangdaode hns_xgmac_tx_enable(drv, 0); 170511e6bc0Shuangdaode } else if (mode == MAC_COMM_MODE_RX) { 171511e6bc0Shuangdaode hns_xgmac_rx_enable(drv, 0); 172511e6bc0Shuangdaode } else if (mode == MAC_COMM_MODE_RX_AND_TX) { 173511e6bc0Shuangdaode hns_xgmac_tx_enable(drv, 0); 174511e6bc0Shuangdaode hns_xgmac_rx_enable(drv, 0); 175511e6bc0Shuangdaode } 17620b3385aSDaode Huang hns_xgmac_lf_rf_insert(drv, HNS_XGMAC_LF_INSERT); 177511e6bc0Shuangdaode } 178511e6bc0Shuangdaode 179511e6bc0Shuangdaode /** 180511e6bc0Shuangdaode *hns_xgmac_pma_fec_enable - xgmac PMA FEC enable 181511e6bc0Shuangdaode *@drv: mac driver 182511e6bc0Shuangdaode *@tx_value: tx value 183511e6bc0Shuangdaode *@rx_value: rx value 184511e6bc0Shuangdaode *return status 185511e6bc0Shuangdaode */ 186511e6bc0Shuangdaode static void hns_xgmac_pma_fec_enable(struct mac_driver *drv, u32 tx_value, 187511e6bc0Shuangdaode u32 rx_value) 188511e6bc0Shuangdaode { 189511e6bc0Shuangdaode u32 origin = dsaf_read_dev(drv, XGMAC_PMA_FEC_CONTROL_REG); 190511e6bc0Shuangdaode 191511e6bc0Shuangdaode dsaf_set_bit(origin, XGMAC_PMA_FEC_CTL_TX_B, !!tx_value); 192511e6bc0Shuangdaode dsaf_set_bit(origin, XGMAC_PMA_FEC_CTL_RX_B, !!rx_value); 193511e6bc0Shuangdaode dsaf_write_dev(drv, XGMAC_PMA_FEC_CONTROL_REG, origin); 194511e6bc0Shuangdaode } 195511e6bc0Shuangdaode 196511e6bc0Shuangdaode /* clr exc irq for xge*/ 197511e6bc0Shuangdaode static void hns_xgmac_exc_irq_en(struct mac_driver *drv, u32 en) 198511e6bc0Shuangdaode { 199511e6bc0Shuangdaode u32 clr_vlue = 0xfffffffful; 200511e6bc0Shuangdaode u32 msk_vlue = en ? 0xfffffffful : 0; /*1 is en, 0 is dis*/ 201511e6bc0Shuangdaode 202511e6bc0Shuangdaode dsaf_write_dev(drv, XGMAC_INT_STATUS_REG, clr_vlue); 203511e6bc0Shuangdaode dsaf_write_dev(drv, XGMAC_INT_ENABLE_REG, msk_vlue); 204511e6bc0Shuangdaode } 205511e6bc0Shuangdaode 206511e6bc0Shuangdaode /** 207511e6bc0Shuangdaode *hns_xgmac_init - initialize XGE 208511e6bc0Shuangdaode *@mac_drv: mac driver 209511e6bc0Shuangdaode */ 210511e6bc0Shuangdaode static void hns_xgmac_init(void *mac_drv) 211511e6bc0Shuangdaode { 212511e6bc0Shuangdaode struct mac_driver *drv = (struct mac_driver *)mac_drv; 213511e6bc0Shuangdaode struct dsaf_device *dsaf_dev 214511e6bc0Shuangdaode = (struct dsaf_device *)dev_get_drvdata(drv->dev); 215511e6bc0Shuangdaode u32 port = drv->mac_id; 216511e6bc0Shuangdaode 217a24274aaSKejian Yan dsaf_dev->misc_op->xge_srst(dsaf_dev, port, 0); 218511e6bc0Shuangdaode mdelay(100); 219a24274aaSKejian Yan dsaf_dev->misc_op->xge_srst(dsaf_dev, port, 1); 220511e6bc0Shuangdaode 221511e6bc0Shuangdaode mdelay(100); 22220b3385aSDaode Huang hns_xgmac_lf_rf_control_init(drv); 223511e6bc0Shuangdaode hns_xgmac_exc_irq_en(drv, 0); 224511e6bc0Shuangdaode 225511e6bc0Shuangdaode hns_xgmac_pma_fec_enable(drv, 0x0, 0x0); 226511e6bc0Shuangdaode 227511e6bc0Shuangdaode hns_xgmac_disable(mac_drv, MAC_COMM_MODE_RX_AND_TX); 228511e6bc0Shuangdaode } 229511e6bc0Shuangdaode 230511e6bc0Shuangdaode /** 231511e6bc0Shuangdaode *hns_xgmac_config_pad_and_crc - set xgmac pad and crc enable the same time 232511e6bc0Shuangdaode *@mac_drv: mac driver 233511e6bc0Shuangdaode *@newval:enable of pad and crc 234511e6bc0Shuangdaode */ 235511e6bc0Shuangdaode static void hns_xgmac_config_pad_and_crc(void *mac_drv, u8 newval) 236511e6bc0Shuangdaode { 237511e6bc0Shuangdaode struct mac_driver *drv = (struct mac_driver *)mac_drv; 238511e6bc0Shuangdaode u32 origin = dsaf_read_dev(drv, XGMAC_MAC_CONTROL_REG); 239511e6bc0Shuangdaode 240511e6bc0Shuangdaode dsaf_set_bit(origin, XGMAC_CTL_TX_PAD_B, !!newval); 241511e6bc0Shuangdaode dsaf_set_bit(origin, XGMAC_CTL_TX_FCS_B, !!newval); 242511e6bc0Shuangdaode dsaf_set_bit(origin, XGMAC_CTL_RX_FCS_B, !!newval); 243511e6bc0Shuangdaode dsaf_write_dev(drv, XGMAC_MAC_CONTROL_REG, origin); 244511e6bc0Shuangdaode } 245511e6bc0Shuangdaode 246511e6bc0Shuangdaode /** 247511e6bc0Shuangdaode *hns_xgmac_pausefrm_cfg - set pause param about xgmac 248511e6bc0Shuangdaode *@mac_drv: mac driver 249511e6bc0Shuangdaode *@newval:enable of pad and crc 250511e6bc0Shuangdaode */ 251511e6bc0Shuangdaode static void hns_xgmac_pausefrm_cfg(void *mac_drv, u32 rx_en, u32 tx_en) 252511e6bc0Shuangdaode { 253511e6bc0Shuangdaode struct mac_driver *drv = (struct mac_driver *)mac_drv; 254511e6bc0Shuangdaode u32 origin = dsaf_read_dev(drv, XGMAC_MAC_PAUSE_CTRL_REG); 255511e6bc0Shuangdaode 256511e6bc0Shuangdaode dsaf_set_bit(origin, XGMAC_PAUSE_CTL_TX_B, !!tx_en); 257511e6bc0Shuangdaode dsaf_set_bit(origin, XGMAC_PAUSE_CTL_RX_B, !!rx_en); 258511e6bc0Shuangdaode dsaf_write_dev(drv, XGMAC_MAC_PAUSE_CTRL_REG, origin); 259511e6bc0Shuangdaode } 260511e6bc0Shuangdaode 261511e6bc0Shuangdaode static void hns_xgmac_set_pausefrm_mac_addr(void *mac_drv, char *mac_addr) 262511e6bc0Shuangdaode { 263511e6bc0Shuangdaode struct mac_driver *drv = (struct mac_driver *)mac_drv; 264511e6bc0Shuangdaode 265511e6bc0Shuangdaode u32 high_val = mac_addr[1] | (mac_addr[0] << 8); 266511e6bc0Shuangdaode u32 low_val = mac_addr[5] | (mac_addr[4] << 8) 267511e6bc0Shuangdaode | (mac_addr[3] << 16) | (mac_addr[2] << 24); 268511e6bc0Shuangdaode dsaf_write_dev(drv, XGMAC_MAC_PAUSE_LOCAL_MAC_L_REG, low_val); 269511e6bc0Shuangdaode dsaf_write_dev(drv, XGMAC_MAC_PAUSE_LOCAL_MAC_H_REG, high_val); 270511e6bc0Shuangdaode } 271511e6bc0Shuangdaode 272511e6bc0Shuangdaode /** 273511e6bc0Shuangdaode *hns_xgmac_set_rx_ignore_pause_frames - set rx pause param about xgmac 274511e6bc0Shuangdaode *@mac_drv: mac driver 275511e6bc0Shuangdaode *@enable:enable rx pause param 276511e6bc0Shuangdaode */ 277511e6bc0Shuangdaode static void hns_xgmac_set_rx_ignore_pause_frames(void *mac_drv, u32 enable) 278511e6bc0Shuangdaode { 279511e6bc0Shuangdaode struct mac_driver *drv = (struct mac_driver *)mac_drv; 280511e6bc0Shuangdaode 281511e6bc0Shuangdaode dsaf_set_dev_bit(drv, XGMAC_MAC_PAUSE_CTRL_REG, 282511e6bc0Shuangdaode XGMAC_PAUSE_CTL_RX_B, !!enable); 283511e6bc0Shuangdaode } 284511e6bc0Shuangdaode 285511e6bc0Shuangdaode /** 286511e6bc0Shuangdaode *hns_xgmac_set_tx_auto_pause_frames - set tx pause param about xgmac 287511e6bc0Shuangdaode *@mac_drv: mac driver 288511e6bc0Shuangdaode *@enable:enable tx pause param 289511e6bc0Shuangdaode */ 290511e6bc0Shuangdaode static void hns_xgmac_set_tx_auto_pause_frames(void *mac_drv, u16 enable) 291511e6bc0Shuangdaode { 292511e6bc0Shuangdaode struct mac_driver *drv = (struct mac_driver *)mac_drv; 293511e6bc0Shuangdaode 294511e6bc0Shuangdaode dsaf_set_dev_bit(drv, XGMAC_MAC_PAUSE_CTRL_REG, 295511e6bc0Shuangdaode XGMAC_PAUSE_CTL_TX_B, !!enable); 296511e6bc0Shuangdaode 297511e6bc0Shuangdaode /*if enable is not zero ,set tx pause time */ 298511e6bc0Shuangdaode if (enable) 299511e6bc0Shuangdaode dsaf_write_dev(drv, XGMAC_MAC_PAUSE_TIME_REG, enable); 300511e6bc0Shuangdaode } 301511e6bc0Shuangdaode 302511e6bc0Shuangdaode /** 303511e6bc0Shuangdaode *hns_xgmac_config_max_frame_length - set xgmac max frame length 304511e6bc0Shuangdaode *@mac_drv: mac driver 305511e6bc0Shuangdaode *@newval:xgmac max frame length 306511e6bc0Shuangdaode */ 307511e6bc0Shuangdaode static void hns_xgmac_config_max_frame_length(void *mac_drv, u16 newval) 308511e6bc0Shuangdaode { 309511e6bc0Shuangdaode struct mac_driver *drv = (struct mac_driver *)mac_drv; 310511e6bc0Shuangdaode 311511e6bc0Shuangdaode dsaf_write_dev(drv, XGMAC_MAC_MAX_PKT_SIZE_REG, newval); 312511e6bc0Shuangdaode } 313511e6bc0Shuangdaode 314*336a443bSYueHaibing static void hns_xgmac_update_stats(void *mac_drv) 315511e6bc0Shuangdaode { 316511e6bc0Shuangdaode struct mac_driver *drv = (struct mac_driver *)mac_drv; 317511e6bc0Shuangdaode struct mac_hw_stats *hw_stats = &drv->mac_cb->hw_stats; 318511e6bc0Shuangdaode 319511e6bc0Shuangdaode /* TX */ 320511e6bc0Shuangdaode hw_stats->tx_fragment_err 321511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_FRAGMENT); 322511e6bc0Shuangdaode hw_stats->tx_undersize 323511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_UNDERSIZE); 324511e6bc0Shuangdaode hw_stats->tx_under_min_pkts 325511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_UNDERMIN); 326511e6bc0Shuangdaode hw_stats->tx_64bytes = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_64OCTETS); 327511e6bc0Shuangdaode hw_stats->tx_65to127 328511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_65TO127OCTETS); 329511e6bc0Shuangdaode hw_stats->tx_128to255 330511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_128TO255OCTETS); 331511e6bc0Shuangdaode hw_stats->tx_256to511 332511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_256TO511OCTETS); 333511e6bc0Shuangdaode hw_stats->tx_512to1023 334511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_512TO1023OCTETS); 335511e6bc0Shuangdaode hw_stats->tx_1024to1518 336511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_1024TO1518OCTETS); 337511e6bc0Shuangdaode hw_stats->tx_1519tomax 338511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_1519TOMAXOCTETS); 339511e6bc0Shuangdaode hw_stats->tx_1519tomax_good 340511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_1519TOMAXOCTETSOK); 341511e6bc0Shuangdaode hw_stats->tx_oversize = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_OVERSIZE); 342511e6bc0Shuangdaode hw_stats->tx_jabber_err = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_JABBER); 343511e6bc0Shuangdaode hw_stats->tx_good_pkts = hns_mac_reg_read64(drv, XGMAC_TX_GOODPKTS); 344511e6bc0Shuangdaode hw_stats->tx_good_bytes = hns_mac_reg_read64(drv, XGMAC_TX_GOODOCTETS); 345511e6bc0Shuangdaode hw_stats->tx_total_pkts = hns_mac_reg_read64(drv, XGMAC_TX_TOTAL_PKTS); 346511e6bc0Shuangdaode hw_stats->tx_total_bytes 347511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_TX_TOTALOCTETS); 348511e6bc0Shuangdaode hw_stats->tx_uc_pkts = hns_mac_reg_read64(drv, XGMAC_TX_UNICASTPKTS); 349511e6bc0Shuangdaode hw_stats->tx_mc_pkts = hns_mac_reg_read64(drv, XGMAC_TX_MULTICASTPKTS); 350511e6bc0Shuangdaode hw_stats->tx_bc_pkts = hns_mac_reg_read64(drv, XGMAC_TX_BROADCASTPKTS); 351511e6bc0Shuangdaode hw_stats->tx_pfc_tc0 = hns_mac_reg_read64(drv, XGMAC_TX_PRI0PAUSEPKTS); 352511e6bc0Shuangdaode hw_stats->tx_pfc_tc1 = hns_mac_reg_read64(drv, XGMAC_TX_PRI1PAUSEPKTS); 353511e6bc0Shuangdaode hw_stats->tx_pfc_tc2 = hns_mac_reg_read64(drv, XGMAC_TX_PRI2PAUSEPKTS); 354511e6bc0Shuangdaode hw_stats->tx_pfc_tc3 = hns_mac_reg_read64(drv, XGMAC_TX_PRI3PAUSEPKTS); 355511e6bc0Shuangdaode hw_stats->tx_pfc_tc4 = hns_mac_reg_read64(drv, XGMAC_TX_PRI4PAUSEPKTS); 356511e6bc0Shuangdaode hw_stats->tx_pfc_tc5 = hns_mac_reg_read64(drv, XGMAC_TX_PRI5PAUSEPKTS); 357511e6bc0Shuangdaode hw_stats->tx_pfc_tc6 = hns_mac_reg_read64(drv, XGMAC_TX_PRI6PAUSEPKTS); 358511e6bc0Shuangdaode hw_stats->tx_pfc_tc7 = hns_mac_reg_read64(drv, XGMAC_TX_PRI7PAUSEPKTS); 359511e6bc0Shuangdaode hw_stats->tx_ctrl = hns_mac_reg_read64(drv, XGMAC_TX_MACCTRLPKTS); 360511e6bc0Shuangdaode hw_stats->tx_1731_pkts = hns_mac_reg_read64(drv, XGMAC_TX_1731PKTS); 361511e6bc0Shuangdaode hw_stats->tx_1588_pkts = hns_mac_reg_read64(drv, XGMAC_TX_1588PKTS); 362511e6bc0Shuangdaode hw_stats->rx_good_from_sw 363511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_RX_FROMAPPGOODPKTS); 364511e6bc0Shuangdaode hw_stats->rx_bad_from_sw 365511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_RX_FROMAPPBADPKTS); 366511e6bc0Shuangdaode hw_stats->tx_bad_pkts = hns_mac_reg_read64(drv, XGMAC_TX_ERRALLPKTS); 367511e6bc0Shuangdaode 368511e6bc0Shuangdaode /* RX */ 369511e6bc0Shuangdaode hw_stats->rx_fragment_err 370511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_FRAGMENT); 371511e6bc0Shuangdaode hw_stats->rx_undersize 372511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_RX_PKTSUNDERSIZE); 373511e6bc0Shuangdaode hw_stats->rx_under_min 374511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_UNDERMIN); 375511e6bc0Shuangdaode hw_stats->rx_64bytes = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_64OCTETS); 376511e6bc0Shuangdaode hw_stats->rx_65to127 377511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_65TO127OCTETS); 378511e6bc0Shuangdaode hw_stats->rx_128to255 379511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_128TO255OCTETS); 380511e6bc0Shuangdaode hw_stats->rx_256to511 381511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_256TO511OCTETS); 382511e6bc0Shuangdaode hw_stats->rx_512to1023 383511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_512TO1023OCTETS); 384511e6bc0Shuangdaode hw_stats->rx_1024to1518 385511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_1024TO1518OCTETS); 386511e6bc0Shuangdaode hw_stats->rx_1519tomax 387511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_1519TOMAXOCTETS); 388511e6bc0Shuangdaode hw_stats->rx_1519tomax_good 389511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_1519TOMAXOCTETSOK); 390511e6bc0Shuangdaode hw_stats->rx_oversize = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_OVERSIZE); 391511e6bc0Shuangdaode hw_stats->rx_jabber_err = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_JABBER); 392511e6bc0Shuangdaode hw_stats->rx_good_pkts = hns_mac_reg_read64(drv, XGMAC_RX_GOODPKTS); 393511e6bc0Shuangdaode hw_stats->rx_good_bytes = hns_mac_reg_read64(drv, XGMAC_RX_GOODOCTETS); 394511e6bc0Shuangdaode hw_stats->rx_total_pkts = hns_mac_reg_read64(drv, XGMAC_RX_TOTAL_PKTS); 395511e6bc0Shuangdaode hw_stats->rx_total_bytes 396511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_RX_TOTALOCTETS); 397511e6bc0Shuangdaode hw_stats->rx_uc_pkts = hns_mac_reg_read64(drv, XGMAC_RX_UNICASTPKTS); 398511e6bc0Shuangdaode hw_stats->rx_mc_pkts = hns_mac_reg_read64(drv, XGMAC_RX_MULTICASTPKTS); 399511e6bc0Shuangdaode hw_stats->rx_bc_pkts = hns_mac_reg_read64(drv, XGMAC_RX_BROADCASTPKTS); 400511e6bc0Shuangdaode hw_stats->rx_pfc_tc0 = hns_mac_reg_read64(drv, XGMAC_RX_PRI0PAUSEPKTS); 401511e6bc0Shuangdaode hw_stats->rx_pfc_tc1 = hns_mac_reg_read64(drv, XGMAC_RX_PRI1PAUSEPKTS); 402511e6bc0Shuangdaode hw_stats->rx_pfc_tc2 = hns_mac_reg_read64(drv, XGMAC_RX_PRI2PAUSEPKTS); 403511e6bc0Shuangdaode hw_stats->rx_pfc_tc3 = hns_mac_reg_read64(drv, XGMAC_RX_PRI3PAUSEPKTS); 404511e6bc0Shuangdaode hw_stats->rx_pfc_tc4 = hns_mac_reg_read64(drv, XGMAC_RX_PRI4PAUSEPKTS); 405511e6bc0Shuangdaode hw_stats->rx_pfc_tc5 = hns_mac_reg_read64(drv, XGMAC_RX_PRI5PAUSEPKTS); 406511e6bc0Shuangdaode hw_stats->rx_pfc_tc6 = hns_mac_reg_read64(drv, XGMAC_RX_PRI6PAUSEPKTS); 407511e6bc0Shuangdaode hw_stats->rx_pfc_tc7 = hns_mac_reg_read64(drv, XGMAC_RX_PRI7PAUSEPKTS); 408511e6bc0Shuangdaode 409511e6bc0Shuangdaode hw_stats->rx_unknown_ctrl 410511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_RX_MACCTRLPKTS); 411511e6bc0Shuangdaode hw_stats->tx_good_to_sw 412511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_TX_SENDAPPGOODPKTS); 413511e6bc0Shuangdaode hw_stats->tx_bad_to_sw 414511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_TX_SENDAPPBADPKTS); 415511e6bc0Shuangdaode hw_stats->rx_1731_pkts = hns_mac_reg_read64(drv, XGMAC_RX_1731PKTS); 416511e6bc0Shuangdaode hw_stats->rx_symbol_err 417511e6bc0Shuangdaode = hns_mac_reg_read64(drv, XGMAC_RX_SYMBOLERRPKTS); 418511e6bc0Shuangdaode hw_stats->rx_fcs_err = hns_mac_reg_read64(drv, XGMAC_RX_FCSERRPKTS); 419511e6bc0Shuangdaode } 420511e6bc0Shuangdaode 421511e6bc0Shuangdaode /** 422511e6bc0Shuangdaode *hns_xgmac_free - free xgmac driver 423511e6bc0Shuangdaode *@mac_drv: mac driver 424511e6bc0Shuangdaode */ 425511e6bc0Shuangdaode static void hns_xgmac_free(void *mac_drv) 426511e6bc0Shuangdaode { 427511e6bc0Shuangdaode struct mac_driver *drv = (struct mac_driver *)mac_drv; 428511e6bc0Shuangdaode struct dsaf_device *dsaf_dev 429511e6bc0Shuangdaode = (struct dsaf_device *)dev_get_drvdata(drv->dev); 430511e6bc0Shuangdaode 431511e6bc0Shuangdaode u32 mac_id = drv->mac_id; 432511e6bc0Shuangdaode 433a24274aaSKejian Yan dsaf_dev->misc_op->xge_srst(dsaf_dev, mac_id, 0); 434511e6bc0Shuangdaode } 435511e6bc0Shuangdaode 436511e6bc0Shuangdaode /** 437511e6bc0Shuangdaode *hns_xgmac_get_info - get xgmac information 438511e6bc0Shuangdaode *@mac_drv: mac driver 439511e6bc0Shuangdaode *@mac_info:mac information 440511e6bc0Shuangdaode */ 441511e6bc0Shuangdaode static void hns_xgmac_get_info(void *mac_drv, struct mac_info *mac_info) 442511e6bc0Shuangdaode { 443511e6bc0Shuangdaode struct mac_driver *drv = (struct mac_driver *)mac_drv; 444511e6bc0Shuangdaode u32 pause_time, pause_ctrl, port_mode, ctrl_val; 445511e6bc0Shuangdaode 446511e6bc0Shuangdaode ctrl_val = dsaf_read_dev(drv, XGMAC_MAC_CONTROL_REG); 447511e6bc0Shuangdaode mac_info->pad_and_crc_en = dsaf_get_bit(ctrl_val, XGMAC_CTL_TX_PAD_B); 448511e6bc0Shuangdaode mac_info->auto_neg = 0; 449511e6bc0Shuangdaode 450511e6bc0Shuangdaode pause_time = dsaf_read_dev(drv, XGMAC_MAC_PAUSE_TIME_REG); 451511e6bc0Shuangdaode mac_info->tx_pause_time = pause_time; 452511e6bc0Shuangdaode 453511e6bc0Shuangdaode port_mode = dsaf_read_dev(drv, XGMAC_PORT_MODE_REG); 454511e6bc0Shuangdaode mac_info->port_en = dsaf_get_field(port_mode, XGMAC_PORT_MODE_TX_M, 455511e6bc0Shuangdaode XGMAC_PORT_MODE_TX_S) && 456511e6bc0Shuangdaode dsaf_get_field(port_mode, XGMAC_PORT_MODE_RX_M, 457511e6bc0Shuangdaode XGMAC_PORT_MODE_RX_S); 458511e6bc0Shuangdaode mac_info->duplex = 1; 459511e6bc0Shuangdaode mac_info->speed = MAC_SPEED_10000; 460511e6bc0Shuangdaode 461511e6bc0Shuangdaode pause_ctrl = dsaf_read_dev(drv, XGMAC_MAC_PAUSE_CTRL_REG); 462511e6bc0Shuangdaode mac_info->rx_pause_en = dsaf_get_bit(pause_ctrl, XGMAC_PAUSE_CTL_RX_B); 463511e6bc0Shuangdaode mac_info->tx_pause_en = dsaf_get_bit(pause_ctrl, XGMAC_PAUSE_CTL_TX_B); 464511e6bc0Shuangdaode } 465511e6bc0Shuangdaode 466511e6bc0Shuangdaode /** 467511e6bc0Shuangdaode *hns_xgmac_get_pausefrm_cfg - get xgmac pause param 468511e6bc0Shuangdaode *@mac_drv: mac driver 469511e6bc0Shuangdaode *@rx_en:xgmac rx pause enable 470511e6bc0Shuangdaode *@tx_en:xgmac tx pause enable 471511e6bc0Shuangdaode */ 472511e6bc0Shuangdaode static void hns_xgmac_get_pausefrm_cfg(void *mac_drv, u32 *rx_en, u32 *tx_en) 473511e6bc0Shuangdaode { 474511e6bc0Shuangdaode struct mac_driver *drv = (struct mac_driver *)mac_drv; 475511e6bc0Shuangdaode u32 pause_ctrl; 476511e6bc0Shuangdaode 477511e6bc0Shuangdaode pause_ctrl = dsaf_read_dev(drv, XGMAC_MAC_PAUSE_CTRL_REG); 478511e6bc0Shuangdaode *rx_en = dsaf_get_bit(pause_ctrl, XGMAC_PAUSE_CTL_RX_B); 479511e6bc0Shuangdaode *tx_en = dsaf_get_bit(pause_ctrl, XGMAC_PAUSE_CTL_TX_B); 480511e6bc0Shuangdaode } 481511e6bc0Shuangdaode 482511e6bc0Shuangdaode /** 483511e6bc0Shuangdaode *hns_xgmac_get_link_status - get xgmac link status 484511e6bc0Shuangdaode *@mac_drv: mac driver 485511e6bc0Shuangdaode *@link_stat: xgmac link stat 486511e6bc0Shuangdaode */ 487511e6bc0Shuangdaode static void hns_xgmac_get_link_status(void *mac_drv, u32 *link_stat) 488511e6bc0Shuangdaode { 489511e6bc0Shuangdaode struct mac_driver *drv = (struct mac_driver *)mac_drv; 490511e6bc0Shuangdaode 491511e6bc0Shuangdaode *link_stat = dsaf_read_dev(drv, XGMAC_LINK_STATUS_REG); 492511e6bc0Shuangdaode } 493511e6bc0Shuangdaode 494511e6bc0Shuangdaode /** 495511e6bc0Shuangdaode *hns_xgmac_get_regs - dump xgmac regs 496511e6bc0Shuangdaode *@mac_drv: mac driver 497511e6bc0Shuangdaode *@cmd:ethtool cmd 498511e6bc0Shuangdaode *@data:data for value of regs 499511e6bc0Shuangdaode */ 500511e6bc0Shuangdaode static void hns_xgmac_get_regs(void *mac_drv, void *data) 501511e6bc0Shuangdaode { 502511e6bc0Shuangdaode u32 i = 0; 503511e6bc0Shuangdaode struct mac_driver *drv = (struct mac_driver *)mac_drv; 504511e6bc0Shuangdaode u32 *regs = data; 505511e6bc0Shuangdaode u64 qtmp; 506511e6bc0Shuangdaode 507511e6bc0Shuangdaode /* base config registers */ 508511e6bc0Shuangdaode regs[0] = dsaf_read_dev(drv, XGMAC_INT_STATUS_REG); 509511e6bc0Shuangdaode regs[1] = dsaf_read_dev(drv, XGMAC_INT_ENABLE_REG); 510511e6bc0Shuangdaode regs[2] = dsaf_read_dev(drv, XGMAC_INT_SET_REG); 511511e6bc0Shuangdaode regs[3] = dsaf_read_dev(drv, XGMAC_IERR_U_INFO_REG); 512511e6bc0Shuangdaode regs[4] = dsaf_read_dev(drv, XGMAC_OVF_INFO_REG); 513511e6bc0Shuangdaode regs[5] = dsaf_read_dev(drv, XGMAC_OVF_CNT_REG); 514511e6bc0Shuangdaode regs[6] = dsaf_read_dev(drv, XGMAC_PORT_MODE_REG); 515511e6bc0Shuangdaode regs[7] = dsaf_read_dev(drv, XGMAC_CLK_ENABLE_REG); 516511e6bc0Shuangdaode regs[8] = dsaf_read_dev(drv, XGMAC_RESET_REG); 517511e6bc0Shuangdaode regs[9] = dsaf_read_dev(drv, XGMAC_LINK_CONTROL_REG); 518511e6bc0Shuangdaode regs[10] = dsaf_read_dev(drv, XGMAC_LINK_STATUS_REG); 519511e6bc0Shuangdaode 520511e6bc0Shuangdaode regs[11] = dsaf_read_dev(drv, XGMAC_SPARE_REG); 521511e6bc0Shuangdaode regs[12] = dsaf_read_dev(drv, XGMAC_SPARE_CNT_REG); 522511e6bc0Shuangdaode regs[13] = dsaf_read_dev(drv, XGMAC_MAC_ENABLE_REG); 523511e6bc0Shuangdaode regs[14] = dsaf_read_dev(drv, XGMAC_MAC_CONTROL_REG); 524511e6bc0Shuangdaode regs[15] = dsaf_read_dev(drv, XGMAC_MAC_IPG_REG); 525511e6bc0Shuangdaode regs[16] = dsaf_read_dev(drv, XGMAC_MAC_MSG_CRC_EN_REG); 526511e6bc0Shuangdaode regs[17] = dsaf_read_dev(drv, XGMAC_MAC_MSG_IMG_REG); 527511e6bc0Shuangdaode regs[18] = dsaf_read_dev(drv, XGMAC_MAC_MSG_FC_CFG_REG); 528511e6bc0Shuangdaode regs[19] = dsaf_read_dev(drv, XGMAC_MAC_MSG_TC_CFG_REG); 529511e6bc0Shuangdaode regs[20] = dsaf_read_dev(drv, XGMAC_MAC_PAD_SIZE_REG); 530511e6bc0Shuangdaode regs[21] = dsaf_read_dev(drv, XGMAC_MAC_MIN_PKT_SIZE_REG); 531511e6bc0Shuangdaode regs[22] = dsaf_read_dev(drv, XGMAC_MAC_MAX_PKT_SIZE_REG); 532511e6bc0Shuangdaode regs[23] = dsaf_read_dev(drv, XGMAC_MAC_PAUSE_CTRL_REG); 533511e6bc0Shuangdaode regs[24] = dsaf_read_dev(drv, XGMAC_MAC_PAUSE_TIME_REG); 534511e6bc0Shuangdaode regs[25] = dsaf_read_dev(drv, XGMAC_MAC_PAUSE_GAP_REG); 535511e6bc0Shuangdaode regs[26] = dsaf_read_dev(drv, XGMAC_MAC_PAUSE_LOCAL_MAC_H_REG); 536511e6bc0Shuangdaode regs[27] = dsaf_read_dev(drv, XGMAC_MAC_PAUSE_LOCAL_MAC_L_REG); 537511e6bc0Shuangdaode regs[28] = dsaf_read_dev(drv, XGMAC_MAC_PAUSE_PEER_MAC_H_REG); 538511e6bc0Shuangdaode regs[29] = dsaf_read_dev(drv, XGMAC_MAC_PAUSE_PEER_MAC_L_REG); 539511e6bc0Shuangdaode regs[30] = dsaf_read_dev(drv, XGMAC_MAC_PFC_PRI_EN_REG); 540511e6bc0Shuangdaode regs[31] = dsaf_read_dev(drv, XGMAC_MAC_1588_CTRL_REG); 541511e6bc0Shuangdaode regs[32] = dsaf_read_dev(drv, XGMAC_MAC_1588_TX_PORT_DLY_REG); 542511e6bc0Shuangdaode regs[33] = dsaf_read_dev(drv, XGMAC_MAC_1588_RX_PORT_DLY_REG); 543511e6bc0Shuangdaode regs[34] = dsaf_read_dev(drv, XGMAC_MAC_1588_ASYM_DLY_REG); 544511e6bc0Shuangdaode regs[35] = dsaf_read_dev(drv, XGMAC_MAC_1588_ADJUST_CFG_REG); 545511e6bc0Shuangdaode 546511e6bc0Shuangdaode regs[36] = dsaf_read_dev(drv, XGMAC_MAC_Y1731_ETH_TYPE_REG); 547511e6bc0Shuangdaode regs[37] = dsaf_read_dev(drv, XGMAC_MAC_MIB_CONTROL_REG); 548511e6bc0Shuangdaode regs[38] = dsaf_read_dev(drv, XGMAC_MAC_WAN_RATE_ADJUST_REG); 549511e6bc0Shuangdaode regs[39] = dsaf_read_dev(drv, XGMAC_MAC_TX_ERR_MARK_REG); 550511e6bc0Shuangdaode regs[40] = dsaf_read_dev(drv, XGMAC_MAC_TX_LF_RF_CONTROL_REG); 551511e6bc0Shuangdaode regs[41] = dsaf_read_dev(drv, XGMAC_MAC_RX_LF_RF_STATUS_REG); 552511e6bc0Shuangdaode regs[42] = dsaf_read_dev(drv, XGMAC_MAC_TX_RUNT_PKT_CNT_REG); 553511e6bc0Shuangdaode regs[43] = dsaf_read_dev(drv, XGMAC_MAC_RX_RUNT_PKT_CNT_REG); 554511e6bc0Shuangdaode regs[44] = dsaf_read_dev(drv, XGMAC_MAC_RX_PREAM_ERR_PKT_CNT_REG); 555511e6bc0Shuangdaode regs[45] = dsaf_read_dev(drv, XGMAC_MAC_TX_LF_RF_TERM_PKT_CNT_REG); 556511e6bc0Shuangdaode regs[46] = dsaf_read_dev(drv, XGMAC_MAC_TX_SN_MISMATCH_PKT_CNT_REG); 557511e6bc0Shuangdaode regs[47] = dsaf_read_dev(drv, XGMAC_MAC_RX_ERR_MSG_CNT_REG); 558511e6bc0Shuangdaode regs[48] = dsaf_read_dev(drv, XGMAC_MAC_RX_ERR_EFD_CNT_REG); 559511e6bc0Shuangdaode regs[49] = dsaf_read_dev(drv, XGMAC_MAC_ERR_INFO_REG); 560511e6bc0Shuangdaode regs[50] = dsaf_read_dev(drv, XGMAC_MAC_DBG_INFO_REG); 561511e6bc0Shuangdaode 562511e6bc0Shuangdaode regs[51] = dsaf_read_dev(drv, XGMAC_PCS_BASER_SYNC_THD_REG); 563511e6bc0Shuangdaode regs[52] = dsaf_read_dev(drv, XGMAC_PCS_STATUS1_REG); 564511e6bc0Shuangdaode regs[53] = dsaf_read_dev(drv, XGMAC_PCS_BASER_STATUS1_REG); 565511e6bc0Shuangdaode regs[54] = dsaf_read_dev(drv, XGMAC_PCS_BASER_STATUS2_REG); 566511e6bc0Shuangdaode regs[55] = dsaf_read_dev(drv, XGMAC_PCS_BASER_SEEDA_0_REG); 567511e6bc0Shuangdaode regs[56] = dsaf_read_dev(drv, XGMAC_PCS_BASER_SEEDA_1_REG); 568511e6bc0Shuangdaode regs[57] = dsaf_read_dev(drv, XGMAC_PCS_BASER_SEEDB_0_REG); 569511e6bc0Shuangdaode regs[58] = dsaf_read_dev(drv, XGMAC_PCS_BASER_SEEDB_1_REG); 570511e6bc0Shuangdaode regs[59] = dsaf_read_dev(drv, XGMAC_PCS_BASER_TEST_CONTROL_REG); 571511e6bc0Shuangdaode regs[60] = dsaf_read_dev(drv, XGMAC_PCS_BASER_TEST_ERR_CNT_REG); 572511e6bc0Shuangdaode regs[61] = dsaf_read_dev(drv, XGMAC_PCS_DBG_INFO_REG); 573511e6bc0Shuangdaode regs[62] = dsaf_read_dev(drv, XGMAC_PCS_DBG_INFO1_REG); 574511e6bc0Shuangdaode regs[63] = dsaf_read_dev(drv, XGMAC_PCS_DBG_INFO2_REG); 575511e6bc0Shuangdaode regs[64] = dsaf_read_dev(drv, XGMAC_PCS_DBG_INFO3_REG); 576511e6bc0Shuangdaode 577511e6bc0Shuangdaode regs[65] = dsaf_read_dev(drv, XGMAC_PMA_ENABLE_REG); 578511e6bc0Shuangdaode regs[66] = dsaf_read_dev(drv, XGMAC_PMA_CONTROL_REG); 579511e6bc0Shuangdaode regs[67] = dsaf_read_dev(drv, XGMAC_PMA_SIGNAL_STATUS_REG); 580511e6bc0Shuangdaode regs[68] = dsaf_read_dev(drv, XGMAC_PMA_DBG_INFO_REG); 581511e6bc0Shuangdaode regs[69] = dsaf_read_dev(drv, XGMAC_PMA_FEC_ABILITY_REG); 582511e6bc0Shuangdaode regs[70] = dsaf_read_dev(drv, XGMAC_PMA_FEC_CONTROL_REG); 583511e6bc0Shuangdaode regs[71] = dsaf_read_dev(drv, XGMAC_PMA_FEC_CORR_BLOCK_CNT__REG); 584511e6bc0Shuangdaode regs[72] = dsaf_read_dev(drv, XGMAC_PMA_FEC_UNCORR_BLOCK_CNT__REG); 585511e6bc0Shuangdaode 586511e6bc0Shuangdaode /* status registers */ 587511e6bc0Shuangdaode #define hns_xgmac_cpy_q(p, q) \ 588511e6bc0Shuangdaode do {\ 589511e6bc0Shuangdaode *(p) = (u32)(q);\ 590511e6bc0Shuangdaode *((p) + 1) = (u32)((q) >> 32);\ 591511e6bc0Shuangdaode } while (0) 592511e6bc0Shuangdaode 593511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_FRAGMENT); 594511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[73], qtmp); 595511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_UNDERSIZE); 596511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[75], qtmp); 597511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_UNDERMIN); 598511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[77], qtmp); 599511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_64OCTETS); 600511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[79], qtmp); 601511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_65TO127OCTETS); 602511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[81], qtmp); 603511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_128TO255OCTETS); 604511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[83], qtmp); 605511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_256TO511OCTETS); 606511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[85], qtmp); 607511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_512TO1023OCTETS); 608511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[87], qtmp); 609511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_1024TO1518OCTETS); 610511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[89], qtmp); 611511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_1519TOMAXOCTETS); 612511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[91], qtmp); 613511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_1519TOMAXOCTETSOK); 614511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[93], qtmp); 615511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_OVERSIZE); 616511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[95], qtmp); 617511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_PKTS_JABBER); 618511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[97], qtmp); 619511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_GOODPKTS); 620511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[99], qtmp); 621511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_GOODOCTETS); 622511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[101], qtmp); 623511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_TOTAL_PKTS); 624511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[103], qtmp); 625511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_TOTALOCTETS); 626511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[105], qtmp); 627511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_UNICASTPKTS); 628511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[107], qtmp); 629511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_MULTICASTPKTS); 630511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[109], qtmp); 631511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_BROADCASTPKTS); 632511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[111], qtmp); 633511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_PRI0PAUSEPKTS); 634511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[113], qtmp); 635511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_PRI1PAUSEPKTS); 636511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[115], qtmp); 637511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_PRI2PAUSEPKTS); 638511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[117], qtmp); 639511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_PRI3PAUSEPKTS); 640511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[119], qtmp); 641511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_PRI4PAUSEPKTS); 642511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[121], qtmp); 643511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_PRI5PAUSEPKTS); 644511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[123], qtmp); 645511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_PRI6PAUSEPKTS); 646511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[125], qtmp); 647511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_PRI7PAUSEPKTS); 648511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[127], qtmp); 649511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_MACCTRLPKTS); 650511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[129], qtmp); 651511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_1731PKTS); 652511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[131], qtmp); 653511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_1588PKTS); 654511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[133], qtmp); 655511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_FROMAPPGOODPKTS); 656511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[135], qtmp); 657511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_FROMAPPBADPKTS); 658511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[137], qtmp); 659511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_ERRALLPKTS); 660511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[139], qtmp); 661511e6bc0Shuangdaode 662511e6bc0Shuangdaode /* RX */ 663511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_FRAGMENT); 664511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[141], qtmp); 665511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_PKTSUNDERSIZE); 666511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[143], qtmp); 667511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_UNDERMIN); 668511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[145], qtmp); 669511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_64OCTETS); 670511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[147], qtmp); 671511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_65TO127OCTETS); 672511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[149], qtmp); 673511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_128TO255OCTETS); 674511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[151], qtmp); 675511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_256TO511OCTETS); 676511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[153], qtmp); 677511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_512TO1023OCTETS); 678511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[155], qtmp); 679511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_1024TO1518OCTETS); 680511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[157], qtmp); 681511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_1519TOMAXOCTETS); 682511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[159], qtmp); 683511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_1519TOMAXOCTETSOK); 684511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[161], qtmp); 685511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_OVERSIZE); 686511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[163], qtmp); 687511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_PKTS_JABBER); 688511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[165], qtmp); 689511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_GOODPKTS); 690511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[167], qtmp); 691511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_GOODOCTETS); 692511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[169], qtmp); 693511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_TOTAL_PKTS); 694511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[171], qtmp); 695511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_TOTALOCTETS); 696511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[173], qtmp); 697511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_UNICASTPKTS); 698511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[175], qtmp); 699511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_MULTICASTPKTS); 700511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[177], qtmp); 701511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_BROADCASTPKTS); 702511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[179], qtmp); 703511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_PRI0PAUSEPKTS); 704511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[181], qtmp); 705511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_PRI1PAUSEPKTS); 706511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[183], qtmp); 707511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_PRI2PAUSEPKTS); 708511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[185], qtmp); 709511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_PRI3PAUSEPKTS); 710511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[187], qtmp); 711511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_PRI4PAUSEPKTS); 712511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[189], qtmp); 713511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_PRI5PAUSEPKTS); 714511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[191], qtmp); 715511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_PRI6PAUSEPKTS); 716511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[193], qtmp); 717511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_PRI7PAUSEPKTS); 718511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[195], qtmp); 719511e6bc0Shuangdaode 720511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_MACCTRLPKTS); 721511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[197], qtmp); 722511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_SENDAPPGOODPKTS); 723511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[199], qtmp); 724511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_TX_SENDAPPBADPKTS); 725511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[201], qtmp); 726511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_1731PKTS); 727511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[203], qtmp); 728511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_SYMBOLERRPKTS); 729511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[205], qtmp); 730511e6bc0Shuangdaode qtmp = hns_mac_reg_read64(drv, XGMAC_RX_FCSERRPKTS); 731511e6bc0Shuangdaode hns_xgmac_cpy_q(®s[207], qtmp); 732511e6bc0Shuangdaode 733511e6bc0Shuangdaode /* mark end of mac regs */ 734511e6bc0Shuangdaode for (i = 208; i < 214; i++) 735511e6bc0Shuangdaode regs[i] = 0xaaaaaaaa; 736511e6bc0Shuangdaode } 737511e6bc0Shuangdaode 738511e6bc0Shuangdaode /** 739511e6bc0Shuangdaode *hns_xgmac_get_stats - get xgmac statistic 740511e6bc0Shuangdaode *@mac_drv: mac driver 741511e6bc0Shuangdaode *@data:data for value of stats regs 742511e6bc0Shuangdaode */ 743511e6bc0Shuangdaode static void hns_xgmac_get_stats(void *mac_drv, u64 *data) 744511e6bc0Shuangdaode { 745511e6bc0Shuangdaode u32 i; 746511e6bc0Shuangdaode u64 *buf = data; 747511e6bc0Shuangdaode struct mac_driver *drv = (struct mac_driver *)mac_drv; 748511e6bc0Shuangdaode struct mac_hw_stats *hw_stats = NULL; 749511e6bc0Shuangdaode 750511e6bc0Shuangdaode hw_stats = &drv->mac_cb->hw_stats; 751511e6bc0Shuangdaode 752511e6bc0Shuangdaode for (i = 0; i < ARRAY_SIZE(g_xgmac_stats_string); i++) { 753511e6bc0Shuangdaode buf[i] = DSAF_STATS_READ(hw_stats, 754511e6bc0Shuangdaode g_xgmac_stats_string[i].offset); 755511e6bc0Shuangdaode } 756511e6bc0Shuangdaode } 757511e6bc0Shuangdaode 758511e6bc0Shuangdaode /** 759511e6bc0Shuangdaode *hns_xgmac_get_strings - get xgmac strings name 760511e6bc0Shuangdaode *@stringset: type of values in data 761511e6bc0Shuangdaode *@data:data for value of string name 762511e6bc0Shuangdaode */ 763511e6bc0Shuangdaode static void hns_xgmac_get_strings(u32 stringset, u8 *data) 764511e6bc0Shuangdaode { 765511e6bc0Shuangdaode char *buff = (char *)data; 766511e6bc0Shuangdaode u32 i; 767511e6bc0Shuangdaode 768511e6bc0Shuangdaode if (stringset != ETH_SS_STATS) 769511e6bc0Shuangdaode return; 770511e6bc0Shuangdaode 771511e6bc0Shuangdaode for (i = 0; i < ARRAY_SIZE(g_xgmac_stats_string); i++) { 772511e6bc0Shuangdaode snprintf(buff, ETH_GSTRING_LEN, g_xgmac_stats_string[i].desc); 773511e6bc0Shuangdaode buff = buff + ETH_GSTRING_LEN; 774511e6bc0Shuangdaode } 775511e6bc0Shuangdaode } 776511e6bc0Shuangdaode 777511e6bc0Shuangdaode /** 778511e6bc0Shuangdaode *hns_xgmac_get_sset_count - get xgmac string set count 779511e6bc0Shuangdaode *@stringset: type of values in data 780511e6bc0Shuangdaode *return xgmac string set count 781511e6bc0Shuangdaode */ 782511e6bc0Shuangdaode static int hns_xgmac_get_sset_count(int stringset) 783511e6bc0Shuangdaode { 784412b65d1STimmy Li if (stringset == ETH_SS_STATS || stringset == ETH_SS_PRIV_FLAGS) 785511e6bc0Shuangdaode return ARRAY_SIZE(g_xgmac_stats_string); 786511e6bc0Shuangdaode 787511e6bc0Shuangdaode return 0; 788511e6bc0Shuangdaode } 789511e6bc0Shuangdaode 790511e6bc0Shuangdaode /** 791511e6bc0Shuangdaode *hns_xgmac_get_regs_count - get xgmac regs count 792511e6bc0Shuangdaode *return xgmac regs count 793511e6bc0Shuangdaode */ 794511e6bc0Shuangdaode static int hns_xgmac_get_regs_count(void) 795511e6bc0Shuangdaode { 79620b3385aSDaode Huang return HNS_XGMAC_DUMP_NUM; 797511e6bc0Shuangdaode } 798511e6bc0Shuangdaode 799511e6bc0Shuangdaode void *hns_xgmac_config(struct hns_mac_cb *mac_cb, struct mac_params *mac_param) 800511e6bc0Shuangdaode { 801511e6bc0Shuangdaode struct mac_driver *mac_drv; 802511e6bc0Shuangdaode 803511e6bc0Shuangdaode mac_drv = devm_kzalloc(mac_cb->dev, sizeof(*mac_drv), GFP_KERNEL); 804511e6bc0Shuangdaode if (!mac_drv) 805511e6bc0Shuangdaode return NULL; 806511e6bc0Shuangdaode 807511e6bc0Shuangdaode mac_drv->mac_init = hns_xgmac_init; 808511e6bc0Shuangdaode mac_drv->mac_enable = hns_xgmac_enable; 809511e6bc0Shuangdaode mac_drv->mac_disable = hns_xgmac_disable; 810511e6bc0Shuangdaode 811511e6bc0Shuangdaode mac_drv->mac_id = mac_param->mac_id; 812511e6bc0Shuangdaode mac_drv->mac_mode = mac_param->mac_mode; 813511e6bc0Shuangdaode mac_drv->io_base = mac_param->vaddr; 814511e6bc0Shuangdaode mac_drv->dev = mac_param->dev; 815511e6bc0Shuangdaode mac_drv->mac_cb = mac_cb; 816511e6bc0Shuangdaode 817511e6bc0Shuangdaode mac_drv->set_mac_addr = hns_xgmac_set_pausefrm_mac_addr; 818511e6bc0Shuangdaode mac_drv->set_an_mode = NULL; 819511e6bc0Shuangdaode mac_drv->config_loopback = NULL; 820511e6bc0Shuangdaode mac_drv->config_pad_and_crc = hns_xgmac_config_pad_and_crc; 821511e6bc0Shuangdaode mac_drv->config_half_duplex = NULL; 822511e6bc0Shuangdaode mac_drv->set_rx_ignore_pause_frames = 823511e6bc0Shuangdaode hns_xgmac_set_rx_ignore_pause_frames; 824511e6bc0Shuangdaode mac_drv->mac_free = hns_xgmac_free; 825511e6bc0Shuangdaode mac_drv->adjust_link = NULL; 826511e6bc0Shuangdaode mac_drv->set_tx_auto_pause_frames = hns_xgmac_set_tx_auto_pause_frames; 827511e6bc0Shuangdaode mac_drv->config_max_frame_length = hns_xgmac_config_max_frame_length; 828511e6bc0Shuangdaode mac_drv->mac_pausefrm_cfg = hns_xgmac_pausefrm_cfg; 829511e6bc0Shuangdaode mac_drv->autoneg_stat = NULL; 830511e6bc0Shuangdaode mac_drv->get_info = hns_xgmac_get_info; 831511e6bc0Shuangdaode mac_drv->get_pause_enable = hns_xgmac_get_pausefrm_cfg; 832511e6bc0Shuangdaode mac_drv->get_link_status = hns_xgmac_get_link_status; 833511e6bc0Shuangdaode mac_drv->get_regs = hns_xgmac_get_regs; 834511e6bc0Shuangdaode mac_drv->get_ethtool_stats = hns_xgmac_get_stats; 835511e6bc0Shuangdaode mac_drv->get_sset_count = hns_xgmac_get_sset_count; 836511e6bc0Shuangdaode mac_drv->get_regs_count = hns_xgmac_get_regs_count; 837511e6bc0Shuangdaode mac_drv->get_strings = hns_xgmac_get_strings; 838511e6bc0Shuangdaode mac_drv->update_stats = hns_xgmac_update_stats; 839511e6bc0Shuangdaode 840511e6bc0Shuangdaode return (void *)mac_drv; 841511e6bc0Shuangdaode } 842