diff options
| author | David Woodhouse <dwmw2@infradead.org> | 2008-05-19 11:32:02 -0400 |
|---|---|---|
| committer | John W. Linville <linville@tuxdriver.com> | 2008-05-20 22:40:31 -0400 |
| commit | 5d283e8cdb8097b6a3e9304c9c8942ad9dc1a4eb (patch) | |
| tree | af8cdee59c2895dc4c95419e1fa3ed891f953f73 | |
| parent | 0d580a774b3682b8b2b5c89ab9b813d149ef28e7 (diff) | |
libertas: Fix ethtool statistics
Fix various problems:
- We converted MESH_ACCESS to a direct command but missed this caller.
- We were trying to access mesh stats even on meshless firmware.
- We should really zero the buffer if something goes wrong.
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Acked-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
| -rw-r--r-- | drivers/net/wireless/libertas/ethtool.c | 27 |
1 files changed, 13 insertions, 14 deletions
diff --git a/drivers/net/wireless/libertas/ethtool.c b/drivers/net/wireless/libertas/ethtool.c index dcfdb404678b..688d60de55cb 100644 --- a/drivers/net/wireless/libertas/ethtool.c +++ b/drivers/net/wireless/libertas/ethtool.c | |||
| @@ -73,8 +73,8 @@ out: | |||
| 73 | return ret; | 73 | return ret; |
| 74 | } | 74 | } |
| 75 | 75 | ||
| 76 | static void lbs_ethtool_get_stats(struct net_device * dev, | 76 | static void lbs_ethtool_get_stats(struct net_device *dev, |
| 77 | struct ethtool_stats * stats, u64 * data) | 77 | struct ethtool_stats *stats, uint64_t *data) |
| 78 | { | 78 | { |
| 79 | struct lbs_private *priv = dev->priv; | 79 | struct lbs_private *priv = dev->priv; |
| 80 | struct cmd_ds_mesh_access mesh_access; | 80 | struct cmd_ds_mesh_access mesh_access; |
| @@ -83,12 +83,12 @@ static void lbs_ethtool_get_stats(struct net_device * dev, | |||
| 83 | lbs_deb_enter(LBS_DEB_ETHTOOL); | 83 | lbs_deb_enter(LBS_DEB_ETHTOOL); |
| 84 | 84 | ||
| 85 | /* Get Mesh Statistics */ | 85 | /* Get Mesh Statistics */ |
| 86 | ret = lbs_prepare_and_send_command(priv, | 86 | ret = lbs_mesh_access(priv, CMD_ACT_MESH_GET_STATS, &mesh_access); |
| 87 | CMD_MESH_ACCESS, CMD_ACT_MESH_GET_STATS, | ||
| 88 | CMD_OPTION_WAITFORRSP, 0, &mesh_access); | ||
| 89 | 87 | ||
| 90 | if (ret) | 88 | if (ret) { |
| 89 | memset(data, 0, MESH_STATS_NUM*(sizeof(uint64_t))); | ||
| 91 | return; | 90 | return; |
| 91 | } | ||
| 92 | 92 | ||
| 93 | priv->mstats.fwd_drop_rbt = le32_to_cpu(mesh_access.data[0]); | 93 | priv->mstats.fwd_drop_rbt = le32_to_cpu(mesh_access.data[0]); |
| 94 | priv->mstats.fwd_drop_ttl = le32_to_cpu(mesh_access.data[1]); | 94 | priv->mstats.fwd_drop_ttl = le32_to_cpu(mesh_access.data[1]); |
| @@ -111,19 +111,18 @@ static void lbs_ethtool_get_stats(struct net_device * dev, | |||
| 111 | lbs_deb_enter(LBS_DEB_ETHTOOL); | 111 | lbs_deb_enter(LBS_DEB_ETHTOOL); |
| 112 | } | 112 | } |
| 113 | 113 | ||
| 114 | static int lbs_ethtool_get_sset_count(struct net_device * dev, int sset) | 114 | static int lbs_ethtool_get_sset_count(struct net_device *dev, int sset) |
| 115 | { | 115 | { |
| 116 | switch (sset) { | 116 | struct lbs_private *priv = dev->priv; |
| 117 | case ETH_SS_STATS: | 117 | |
| 118 | if (sset == ETH_SS_STATS && dev == priv->mesh_dev) | ||
| 118 | return MESH_STATS_NUM; | 119 | return MESH_STATS_NUM; |
| 119 | default: | 120 | |
| 120 | return -EOPNOTSUPP; | 121 | return -EOPNOTSUPP; |
| 121 | } | ||
| 122 | } | 122 | } |
| 123 | 123 | ||
| 124 | static void lbs_ethtool_get_strings(struct net_device *dev, | 124 | static void lbs_ethtool_get_strings(struct net_device *dev, |
| 125 | u32 stringset, | 125 | uint32_t stringset, uint8_t *s) |
| 126 | u8 * s) | ||
| 127 | { | 126 | { |
| 128 | int i; | 127 | int i; |
| 129 | 128 | ||
