aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReece R. Pollack2013-06-11 13:20:35 -0500
committerMurali Karicheri2014-12-03 10:29:50 -0600
commitad2d8362fefeda0c00e7f5b4332a291adce9811b (patch)
tree0bf6661d4679d98266db0fed23289a6c04774b00 /drivers/net/ethernet/ti/keystone_ethss.c
parent90df6850f2b660501f4afe1175d08f829de54ccc (diff)
downloadlinux-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.c24
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;