>From 8f1b87a115f6c340558b95f6a1748ddbf866d95f Mon Sep 17 00:00:00 2001 Message-Id: <8f1b87a115f6c340558b95f6a1748ddbf866d95f.1441670158.git.romieu@fr.zoreil.com> From: Francois Romieu Date: Sat, 5 Sep 2015 13:26:30 +0200 Subject: [PATCH 1/3] r8169: decouple the counters data and the device private area. X-Organisation: Land of Sunshine Inc. Signed-off-by: Francois Romieu --- drivers/net/ethernet/realtek/r8169.c | 69 ++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 27 deletions(-) diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c index 24dcbe6..ff1b834 100644 --- a/drivers/net/ethernet/realtek/r8169.c +++ b/drivers/net/ethernet/realtek/r8169.c @@ -833,7 +833,7 @@ struct rtl8169_private { unsigned features; struct mii_if_info mii; - struct rtl8169_counters counters; + struct rtl8169_counters *counters; struct rtl8169_tc_offsets tc_offset; u32 saved_wolopts; u32 opts1_mask; @@ -2284,7 +2284,7 @@ static bool rtl8169_update_counters(struct net_device *dev) return false; if (rtl_udelay_loop_wait_low(tp, &rtl_counters_cond, 10, 1000)) - memcpy(&tp->counters, counters, sizeof(*counters)); + memcpy(tp->counters, counters, sizeof(*counters)); else ret = false; @@ -2296,6 +2296,8 @@ static bool rtl8169_update_counters(struct net_device *dev) static bool rtl8169_init_counter_offsets(struct net_device *dev) { struct rtl8169_private *tp = netdev_priv(dev); + struct rtl8169_counters *counters = tp->counters; + struct rtl8169_tc_offsets *offset = &tp->tc_offset; bool ret = false; /* @@ -2313,7 +2315,7 @@ static bool rtl8169_init_counter_offsets(struct net_device *dev) * set at open time by rtl_hw_start. */ - if (tp->tc_offset.inited) + if (offset->inited) return true; /* If both, reset and update fail, propagate to caller. */ @@ -2323,10 +2325,10 @@ static bool rtl8169_init_counter_offsets(struct net_device *dev) if (rtl8169_update_counters(dev)) ret = true; - tp->tc_offset.tx_errors = tp->counters.tx_errors; - tp->tc_offset.tx_multi_collision = tp->counters.tx_multi_collision; - tp->tc_offset.tx_aborted = tp->counters.tx_aborted; - tp->tc_offset.inited = true; + offset->tx_errors = counters->tx_errors; + offset->tx_multi_collision = counters->tx_multi_collision; + offset->tx_aborted = counters->tx_aborted; + offset->inited = true; return ret; } @@ -2335,24 +2337,25 @@ static void rtl8169_get_ethtool_stats(struct net_device *dev, struct ethtool_stats *stats, u64 *data) { struct rtl8169_private *tp = netdev_priv(dev); + struct rtl8169_counters *c = tp->counters; ASSERT_RTNL(); rtl8169_update_counters(dev); - data[0] = le64_to_cpu(tp->counters.tx_packets); - data[1] = le64_to_cpu(tp->counters.rx_packets); - data[2] = le64_to_cpu(tp->counters.tx_errors); - data[3] = le32_to_cpu(tp->counters.rx_errors); - data[4] = le16_to_cpu(tp->counters.rx_missed); - data[5] = le16_to_cpu(tp->counters.align_errors); - data[6] = le32_to_cpu(tp->counters.tx_one_collision); - data[7] = le32_to_cpu(tp->counters.tx_multi_collision); - data[8] = le64_to_cpu(tp->counters.rx_unicast); - data[9] = le64_to_cpu(tp->counters.rx_broadcast); - data[10] = le32_to_cpu(tp->counters.rx_multicast); - data[11] = le16_to_cpu(tp->counters.tx_aborted); - data[12] = le16_to_cpu(tp->counters.tx_underun); + data[ 0] = le64_to_cpu(c->tx_packets); + data[ 1] = le64_to_cpu(c->rx_packets); + data[ 2] = le64_to_cpu(c->tx_errors); + data[ 3] = le32_to_cpu(c->rx_errors); + data[ 4] = le16_to_cpu(c->rx_missed); + data[ 5] = le16_to_cpu(c->align_errors); + data[ 6] = le32_to_cpu(c->tx_one_collision); + data[ 7] = le32_to_cpu(c->tx_multi_collision); + data[ 8] = le64_to_cpu(c->rx_unicast); + data[ 9] = le64_to_cpu(c->rx_broadcast); + data[10] = le32_to_cpu(c->rx_multicast); + data[11] = le16_to_cpu(c->tx_aborted); + data[12] = le16_to_cpu(c->tx_underun); } static void rtl8169_get_strings(struct net_device *dev, u32 stringset, u8 *data) @@ -7779,6 +7782,8 @@ static struct rtnl_link_stats64 * rtl8169_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) { struct rtl8169_private *tp = netdev_priv(dev); + struct rtl8169_tc_offsets *offset = &tp->tc_offset; + struct rtl8169_counters *counters = tp->counters; void __iomem *ioaddr = tp->mmio_addr; unsigned int start; @@ -7816,12 +7821,12 @@ rtl8169_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) * Subtract values fetched during initalization. * See rtl8169_init_counter_offsets for a description why we do that. */ - stats->tx_errors = le64_to_cpu(tp->counters.tx_errors) - - le64_to_cpu(tp->tc_offset.tx_errors); - stats->collisions = le32_to_cpu(tp->counters.tx_multi_collision) - - le32_to_cpu(tp->tc_offset.tx_multi_collision); - stats->tx_aborted_errors = le16_to_cpu(tp->counters.tx_aborted) - - le16_to_cpu(tp->tc_offset.tx_aborted); + stats->tx_errors = le64_to_cpu(counters->tx_errors) - + le64_to_cpu(offset->tx_errors); + stats->collisions = le32_to_cpu(counters->tx_multi_collision) - + le32_to_cpu(offset->tx_multi_collision); + stats->tx_aborted_errors = le16_to_cpu(counters->tx_aborted) - + le16_to_cpu(offset->tx_aborted); return stats; } @@ -8022,6 +8027,8 @@ static void rtl_remove_one(struct pci_dev *pdev) unregister_netdev(dev); + kfree(tp->counters); + rtl_release_firmware(tp); if (pci_dev_run_wake(pdev)) @@ -8447,9 +8454,15 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) tp->rtl_fw = RTL_FIRMWARE_UNKNOWN; + tp->counters = kmalloc(sizeof(*tp->counters), GFP_KERNEL); + if (!tp->counters) { + rc = -ENOMEM; + goto err_out_msi_4; + } + rc = register_netdev(dev); if (rc < 0) - goto err_out_msi_4; + goto err_out_counters_5; pci_set_drvdata(pdev, dev); @@ -8483,6 +8496,8 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) out: return rc; +err_out_counters_5: + kfree(tp->counters); err_out_msi_4: netif_napi_del(&tp->napi); rtl_disable_msi(pdev, tp); -- 2.4.3