static void bcmasp_get_strings(struct net_device *dev, u32 stringset,
                               u8 *data)
 {
+       const char *str;
        unsigned int i;
 
        switch (stringset) {
        case ETH_SS_STATS:
                for (i = 0; i < BCMASP_STATS_LEN; i++) {
-                       memcpy(data + i * ETH_GSTRING_LEN,
-                              bcmasp_gstrings_stats[i].stat_string,
-                              ETH_GSTRING_LEN);
+                       str = bcmasp_gstrings_stats[i].stat_string;
+                       ethtool_puts(&data, str);
                }
                break;
        default:
 
 static void bcm_enet_get_strings(struct net_device *netdev,
                                 u32 stringset, u8 *data)
 {
+       const char *str;
        int i;
 
        switch (stringset) {
        case ETH_SS_STATS:
                for (i = 0; i < BCM_ENET_STATS_LEN; i++) {
-                       memcpy(data + i * ETH_GSTRING_LEN,
-                              bcm_enet_gstrings_stats[i].stat_string,
-                              ETH_GSTRING_LEN);
+                       str = bcm_enet_gstrings_stats[i].stat_string;
+                       ethtool_puts(&data, str);
                }
                break;
        }
 static void bcm_enetsw_get_strings(struct net_device *netdev,
                                   u32 stringset, u8 *data)
 {
+       const char *str;
        int i;
 
        switch (stringset) {
        case ETH_SS_STATS:
                for (i = 0; i < BCM_ENETSW_STATS_LEN; i++) {
-                       memcpy(data + i * ETH_GSTRING_LEN,
-                              bcm_enetsw_gstrings_stats[i].stat_string,
-                              ETH_GSTRING_LEN);
+                       str = bcm_enetsw_gstrings_stats[i].stat_string;
+                       ethtool_puts(&data, str);
                }
                break;
        }
 
 {
        struct bcm_sysport_priv *priv = netdev_priv(dev);
        const struct bcm_sysport_stats *s;
-       char buf[128];
-       int i, j;
+       int i;
 
        switch (stringset) {
        case ETH_SS_STATS:
-               for (i = 0, j = 0; i < BCM_SYSPORT_STATS_LEN; i++) {
+               for (i = 0; i < BCM_SYSPORT_STATS_LEN; i++) {
                        s = &bcm_sysport_gstrings_stats[i];
                        if (priv->is_lite &&
                            !bcm_sysport_lite_stat_valid(s->type))
                                continue;
 
-                       memcpy(data + j * ETH_GSTRING_LEN, s->stat_string,
-                              ETH_GSTRING_LEN);
-                       j++;
+                       ethtool_puts(&data, s->stat_string);
                }
 
                for (i = 0; i < dev->num_tx_queues; i++) {
-                       snprintf(buf, sizeof(buf), "txq%d_packets", i);
-                       memcpy(data + j * ETH_GSTRING_LEN, buf,
-                              ETH_GSTRING_LEN);
-                       j++;
-
-                       snprintf(buf, sizeof(buf), "txq%d_bytes", i);
-                       memcpy(data + j * ETH_GSTRING_LEN, buf,
-                              ETH_GSTRING_LEN);
-                       j++;
+                       ethtool_sprintf(&data, "txq%d_packets", i);
+                       ethtool_sprintf(&data, "txq%d_bytes", i);
                }
                break;
        default:
 
                return;
 
        for (i = 0; i < BGMAC_STATS_LEN; i++)
-               strscpy(data + i * ETH_GSTRING_LEN,
-                       bgmac_get_strings_stats[i].name, ETH_GSTRING_LEN);
+               ethtool_puts(&data, bgmac_get_strings_stats[i].name);
 }
 
 static void bgmac_get_ethtool_stats(struct net_device *dev,
 
 static void bcmgenet_get_strings(struct net_device *dev, u32 stringset,
                                 u8 *data)
 {
+       const char *str;
        int i;
 
        switch (stringset) {
        case ETH_SS_STATS:
                for (i = 0; i < BCMGENET_STATS_LEN; i++) {
-                       memcpy(data + i * ETH_GSTRING_LEN,
-                              bcmgenet_gstrings_stats[i].stat_string,
-                              ETH_GSTRING_LEN);
+                       str = bcmgenet_gstrings_stats[i].stat_string;
+                       ethtool_puts(&data, str);
                }
                break;
        }
 
        unsigned int i;
 
        for (i = 0; i < ARRAY_SIZE(bcm_phy_hw_stats); i++)
-               strscpy(data + i * ETH_GSTRING_LEN,
-                       bcm_phy_hw_stats[i].string, ETH_GSTRING_LEN);
+               ethtool_puts(&data, bcm_phy_hw_stats[i].string);
 }
 EXPORT_SYMBOL_GPL(bcm_phy_get_strings);