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>
This commit is contained in:
David Woodhouse 2008-05-19 16:32:02 +01:00 committed by John W. Linville
parent 0d580a774b
commit 5d283e8cdb
1 changed files with 13 additions and 14 deletions

View File

@ -73,8 +73,8 @@ out:
return ret; return ret;
} }
static void lbs_ethtool_get_stats(struct net_device * dev, static void lbs_ethtool_get_stats(struct net_device *dev,
struct ethtool_stats * stats, u64 * data) struct ethtool_stats *stats, uint64_t *data)
{ {
struct lbs_private *priv = dev->priv; struct lbs_private *priv = dev->priv;
struct cmd_ds_mesh_access mesh_access; struct cmd_ds_mesh_access mesh_access;
@ -83,12 +83,12 @@ static void lbs_ethtool_get_stats(struct net_device * dev,
lbs_deb_enter(LBS_DEB_ETHTOOL); lbs_deb_enter(LBS_DEB_ETHTOOL);
/* Get Mesh Statistics */ /* Get Mesh Statistics */
ret = lbs_prepare_and_send_command(priv, ret = lbs_mesh_access(priv, CMD_ACT_MESH_GET_STATS, &mesh_access);
CMD_MESH_ACCESS, CMD_ACT_MESH_GET_STATS,
CMD_OPTION_WAITFORRSP, 0, &mesh_access);
if (ret) if (ret) {
memset(data, 0, MESH_STATS_NUM*(sizeof(uint64_t)));
return; return;
}
priv->mstats.fwd_drop_rbt = le32_to_cpu(mesh_access.data[0]); priv->mstats.fwd_drop_rbt = le32_to_cpu(mesh_access.data[0]);
priv->mstats.fwd_drop_ttl = le32_to_cpu(mesh_access.data[1]); 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,
lbs_deb_enter(LBS_DEB_ETHTOOL); lbs_deb_enter(LBS_DEB_ETHTOOL);
} }
static int lbs_ethtool_get_sset_count(struct net_device * dev, int sset) static int lbs_ethtool_get_sset_count(struct net_device *dev, int sset)
{ {
switch (sset) { struct lbs_private *priv = dev->priv;
case ETH_SS_STATS:
if (sset == ETH_SS_STATS && dev == priv->mesh_dev)
return MESH_STATS_NUM; return MESH_STATS_NUM;
default:
return -EOPNOTSUPP; return -EOPNOTSUPP;
}
} }
static void lbs_ethtool_get_strings(struct net_device *dev, static void lbs_ethtool_get_strings(struct net_device *dev,
u32 stringset, uint32_t stringset, uint8_t *s)
u8 * s)
{ {
int i; int i;