diff options
author | Reece R. Pollack | 2013-06-11 13:20:35 -0500 |
---|---|---|
committer | Murali Karicheri | 2014-12-03 10:29:50 -0600 |
commit | ad2d8362fefeda0c00e7f5b4332a291adce9811b (patch) | |
tree | 0bf6661d4679d98266db0fed23289a6c04774b00 /drivers/net/ethernet/ti/keystone_ethss.c | |
parent | 90df6850f2b660501f4afe1175d08f829de54ccc (diff) | |
download | linux-ad2d8362fefeda0c00e7f5b4332a291adce9811b.tar.gz linux-ad2d8362fefeda0c00e7f5b4332a291adce9811b.tar.xz linux-ad2d8362fefeda0c00e7f5b4332a291adce9811b.zip |
net: keystone: Fix possible corruption when resetting statistics
The calculation of the statistics register to be written is corrupt
after the first time through the loop. This patch fixes this, and
removes several pointer casts for clarity.
Signed-off-by: Reece R. Pollack <x0183204@ti.com>
Diffstat (limited to 'drivers/net/ethernet/ti/keystone_ethss.c')
-rw-r--r-- | drivers/net/ethernet/ti/keystone_ethss.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/drivers/net/ethernet/ti/keystone_ethss.c b/drivers/net/ethernet/ti/keystone_ethss.c index 896e036a6b1..d820d580887 100644 --- a/drivers/net/ethernet/ti/keystone_ethss.c +++ b/drivers/net/ethernet/ti/keystone_ethss.c | |||
@@ -1098,19 +1098,20 @@ static void cpsw_reset_mod_stats(struct cpsw_priv *cpsw_dev, int stat_mod) | |||
1098 | { | 1098 | { |
1099 | struct cpsw_hw_stats __iomem *cpsw_statsa = cpsw_dev->hw_stats_regs[0]; | 1099 | struct cpsw_hw_stats __iomem *cpsw_statsa = cpsw_dev->hw_stats_regs[0]; |
1100 | struct cpsw_hw_stats __iomem *cpsw_statsb = cpsw_dev->hw_stats_regs[1]; | 1100 | struct cpsw_hw_stats __iomem *cpsw_statsb = cpsw_dev->hw_stats_regs[1]; |
1101 | void *p = NULL; | 1101 | void __iomem *base; |
1102 | u32 __iomem *p; | ||
1102 | int i; | 1103 | int i; |
1103 | 1104 | ||
1104 | if (stat_mod == CPSW_STATSA_MODULE) | 1105 | if (stat_mod == CPSW_STATSA_MODULE) |
1105 | p = cpsw_statsa; | 1106 | base = cpsw_statsa; |
1106 | else | 1107 | else |
1107 | p = cpsw_statsb; | 1108 | base = cpsw_statsb; |
1108 | 1109 | ||
1109 | for (i = 0; i < ETHTOOL_STATS_NUM; i++) { | 1110 | for (i = 0; i < ETHTOOL_STATS_NUM; i++) { |
1110 | if (et_stats[i].type == stat_mod) { | 1111 | if (et_stats[i].type == stat_mod) { |
1111 | cpsw_dev->hw_stats[i] = 0; | 1112 | cpsw_dev->hw_stats[i] = 0; |
1112 | p = (u8 *)p + et_stats[i].offset; | 1113 | p = base + et_stats[i].offset; |
1113 | *(u32 *)p = 0xffffffff; | 1114 | *p = 0xffffffff; |
1114 | } | 1115 | } |
1115 | } | 1116 | } |
1116 | return; | 1117 | return; |
@@ -1262,26 +1263,27 @@ static void cpsw_update_stats(struct cpsw_priv *cpsw_dev, uint64_t *data) | |||
1262 | { | 1263 | { |
1263 | struct cpsw_hw_stats __iomem *cpsw_statsa = cpsw_dev->hw_stats_regs[0]; | 1264 | struct cpsw_hw_stats __iomem *cpsw_statsa = cpsw_dev->hw_stats_regs[0]; |
1264 | struct cpsw_hw_stats __iomem *cpsw_statsb = cpsw_dev->hw_stats_regs[1]; | 1265 | struct cpsw_hw_stats __iomem *cpsw_statsb = cpsw_dev->hw_stats_regs[1]; |
1265 | void *p = NULL; | 1266 | void __iomem *base = NULL; |
1267 | u32 __iomem *p; | ||
1266 | u32 tmp = 0; | 1268 | u32 tmp = 0; |
1267 | int i; | 1269 | int i; |
1268 | 1270 | ||
1269 | for (i = 0; i < ETHTOOL_STATS_NUM; i++) { | 1271 | for (i = 0; i < ETHTOOL_STATS_NUM; i++) { |
1270 | switch (et_stats[i].type) { | 1272 | switch (et_stats[i].type) { |
1271 | case CPSW_STATSA_MODULE: | 1273 | case CPSW_STATSA_MODULE: |
1272 | p = cpsw_statsa; | 1274 | base = cpsw_statsa; |
1273 | break; | 1275 | break; |
1274 | case CPSW_STATSB_MODULE: | 1276 | case CPSW_STATSB_MODULE: |
1275 | p = cpsw_statsb; | 1277 | base = cpsw_statsb; |
1276 | break; | 1278 | break; |
1277 | } | 1279 | } |
1278 | 1280 | ||
1279 | p = (u8 *)p + et_stats[i].offset; | 1281 | p = base + et_stats[i].offset; |
1280 | tmp = *(u32 *)p; | 1282 | tmp = *p; |
1281 | cpsw_dev->hw_stats[i] = cpsw_dev->hw_stats[i] + tmp; | 1283 | cpsw_dev->hw_stats[i] = cpsw_dev->hw_stats[i] + tmp; |
1282 | if (data) | 1284 | if (data) |
1283 | data[i] = cpsw_dev->hw_stats[i]; | 1285 | data[i] = cpsw_dev->hw_stats[i]; |
1284 | *(u32 *)p = tmp; | 1286 | *p = tmp; |
1285 | } | 1287 | } |
1286 | 1288 | ||
1287 | return; | 1289 | return; |