Commit 9fb7663d authored by Dan Williams's avatar Dan Williams Committed by John W. Linville

libertas: clean up RSSI command

Convert to a full direct command; previous code rolled a direct
command by hand but left the original indirect command code intact
but disabled.
Signed-off-by: default avatarDan Williams <dcbw@redhat.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent a45b6f4f
...@@ -1386,39 +1386,6 @@ static int lbs_cfg_del_key(struct wiphy *wiphy, struct net_device *netdev, ...@@ -1386,39 +1386,6 @@ static int lbs_cfg_del_key(struct wiphy *wiphy, struct net_device *netdev,
* Get station * Get station
*/ */
/*
* Returns the signal or 0 in case of an error.
*/
/* like "struct cmd_ds_802_11_rssi", but with cmd_header. Once we get rid
* of WEXT, this should go into host.h */
struct cmd_rssi {
struct cmd_header hdr;
__le16 n_or_snr;
__le16 nf;
__le16 avg_snr;
__le16 avg_nf;
} __packed;
static int lbs_get_signal(struct lbs_private *priv, s8 *signal, s8 *noise)
{
struct cmd_rssi cmd;
int ret;
cmd.hdr.size = cpu_to_le16(sizeof(cmd));
cmd.n_or_snr = cpu_to_le16(DEFAULT_BCN_AVG_FACTOR);
ret = lbs_cmd_with_response(priv, CMD_802_11_RSSI, &cmd);
if (ret == 0) {
*signal = CAL_RSSI(le16_to_cpu(cmd.n_or_snr),
le16_to_cpu(cmd.nf));
*noise = CAL_NF(le16_to_cpu(cmd.nf));
}
return ret;
}
static int lbs_cfg_get_station(struct wiphy *wiphy, struct net_device *dev, static int lbs_cfg_get_station(struct wiphy *wiphy, struct net_device *dev,
u8 *mac, struct station_info *sinfo) u8 *mac, struct station_info *sinfo)
{ {
...@@ -1439,7 +1406,7 @@ static int lbs_cfg_get_station(struct wiphy *wiphy, struct net_device *dev, ...@@ -1439,7 +1406,7 @@ static int lbs_cfg_get_station(struct wiphy *wiphy, struct net_device *dev,
sinfo->rx_packets = priv->dev->stats.rx_packets; sinfo->rx_packets = priv->dev->stats.rx_packets;
/* Get current RSSI */ /* Get current RSSI */
ret = lbs_get_signal(priv, &signal, &noise); ret = lbs_get_rssi(priv, &signal, &noise);
if (ret == 0) { if (ret == 0) {
sinfo->signal = signal; sinfo->signal = signal;
sinfo->filled |= STATION_INFO_SIGNAL; sinfo->filled |= STATION_INFO_SIGNAL;
...@@ -1479,7 +1446,7 @@ static int lbs_get_survey(struct wiphy *wiphy, struct net_device *dev, ...@@ -1479,7 +1446,7 @@ static int lbs_get_survey(struct wiphy *wiphy, struct net_device *dev,
survey->channel = ieee80211_get_channel(wiphy, survey->channel = ieee80211_get_channel(wiphy,
ieee80211_channel_to_frequency(priv->channel)); ieee80211_channel_to_frequency(priv->channel));
ret = lbs_get_signal(priv, &signal, &noise); ret = lbs_get_rssi(priv, &signal, &noise);
if (ret == 0) { if (ret == 0) {
survey->filled = SURVEY_INFO_NOISE_DBM; survey->filled = SURVEY_INFO_NOISE_DBM;
survey->noise = noise; survey->noise = noise;
......
...@@ -14,8 +14,6 @@ int lbs_reg_notifier(struct wiphy *wiphy, ...@@ -14,8 +14,6 @@ int lbs_reg_notifier(struct wiphy *wiphy,
struct regulatory_request *request); struct regulatory_request *request);
/* All of those are TODOs: */ /* All of those are TODOs: */
#define lbs_cmd_802_11_rssi(priv, cmdptr) (0)
#define lbs_ret_802_11_rssi(priv, resp) (0)
#define lbs_cmd_bcn_ctrl(priv, cmdptr, cmd_action) (0) #define lbs_cmd_bcn_ctrl(priv, cmdptr, cmd_action) (0)
#define lbs_ret_802_11_bcn_ctrl(priv, resp) (0) #define lbs_ret_802_11_bcn_ctrl(priv, resp) (0)
......
...@@ -12,6 +12,8 @@ ...@@ -12,6 +12,8 @@
#include "cfg.h" #include "cfg.h"
#include "cmd.h" #include "cmd.h"
#define CAL_NF(nf) ((s32)(-(s32)(nf)))
#define CAL_RSSI(snr, nf) ((s32)((s32)(snr) + CAL_NF(nf)))
static struct cmd_ctrl_node *lbs_get_cmd_ctrl_node(struct lbs_private *priv); static struct cmd_ctrl_node *lbs_get_cmd_ctrl_node(struct lbs_private *priv);
...@@ -690,6 +692,39 @@ int lbs_set_channel(struct lbs_private *priv, u8 channel) ...@@ -690,6 +692,39 @@ int lbs_set_channel(struct lbs_private *priv, u8 channel)
return ret; return ret;
} }
/**
* @brief Get current RSSI and noise floor
*
* @param priv A pointer to struct lbs_private structure
* @param rssi On successful return, signal level in mBm
*
* @return The channel on success, error on failure
*/
int lbs_get_rssi(struct lbs_private *priv, s8 *rssi, s8 *nf)
{
struct cmd_ds_802_11_rssi cmd;
int ret = 0;
lbs_deb_enter(LBS_DEB_CMD);
BUG_ON(rssi == NULL);
BUG_ON(nf == NULL);
memset(&cmd, 0, sizeof(cmd));
cmd.hdr.size = cpu_to_le16(sizeof(cmd));
/* Average SNR over last 8 beacons */
cmd.n_or_snr = cpu_to_le16(8);
ret = lbs_cmd_with_response(priv, CMD_802_11_RSSI, &cmd);
if (ret == 0) {
*nf = CAL_NF(le16_to_cpu(cmd.nf));
*rssi = CAL_RSSI(le16_to_cpu(cmd.n_or_snr), le16_to_cpu(cmd.nf));
}
lbs_deb_leave_args(LBS_DEB_CMD, "ret %d", ret);
return ret;
}
static int lbs_cmd_reg_access(struct cmd_ds_command *cmdptr, static int lbs_cmd_reg_access(struct cmd_ds_command *cmdptr,
u8 cmd_action, void *pdata_buf) u8 cmd_action, void *pdata_buf)
{ {
...@@ -1106,10 +1141,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv, ...@@ -1106,10 +1141,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
ret = lbs_cmd_reg_access(cmdptr, cmd_action, pdata_buf); ret = lbs_cmd_reg_access(cmdptr, cmd_action, pdata_buf);
break; break;
case CMD_802_11_RSSI:
ret = lbs_cmd_802_11_rssi(priv, cmdptr);
break;
case CMD_802_11_SET_AFC: case CMD_802_11_SET_AFC:
case CMD_802_11_GET_AFC: case CMD_802_11_GET_AFC:
......
...@@ -131,4 +131,6 @@ int lbs_set_host_sleep(struct lbs_private *priv, int host_sleep); ...@@ -131,4 +131,6 @@ int lbs_set_host_sleep(struct lbs_private *priv, int host_sleep);
int lbs_set_monitor_mode(struct lbs_private *priv, int enable); int lbs_set_monitor_mode(struct lbs_private *priv, int enable);
int lbs_get_rssi(struct lbs_private *priv, s8 *snr, s8 *nf);
#endif /* _LBS_CMD_H */ #endif /* _LBS_CMD_H */
...@@ -172,10 +172,6 @@ static inline int handle_cmd_response(struct lbs_private *priv, ...@@ -172,10 +172,6 @@ static inline int handle_cmd_response(struct lbs_private *priv,
case CMD_RET(CMD_802_11_BEACON_STOP): case CMD_RET(CMD_802_11_BEACON_STOP):
break; break;
case CMD_RET(CMD_802_11_RSSI):
ret = lbs_ret_802_11_rssi(priv, resp);
break;
case CMD_RET(CMD_802_11D_DOMAIN_INFO): case CMD_RET(CMD_802_11D_DOMAIN_INFO):
ret = lbs_ret_802_11d_domain_info(resp); ret = lbs_ret_802_11d_domain_info(resp);
break; break;
......
...@@ -301,19 +301,6 @@ static inline void lbs_deb_hex(unsigned int grp, const char *prompt, u8 *buf, in ...@@ -301,19 +301,6 @@ static inline void lbs_deb_hex(unsigned int grp, const char *prompt, u8 *buf, in
#define BAND_G (0x02) #define BAND_G (0x02)
#define ALL_802_11_BANDS (BAND_B | BAND_G) #define ALL_802_11_BANDS (BAND_B | BAND_G)
/** MACRO DEFINITIONS */
#define CAL_NF(NF) ((s32)(-(s32)(NF)))
#define CAL_RSSI(SNR, NF) ((s32)((s32)(SNR) + CAL_NF(NF)))
#define SCAN_RSSI(RSSI) (0x100 - ((u8)(RSSI)))
#define DEFAULT_BCN_AVG_FACTOR 8
#define DEFAULT_DATA_AVG_FACTOR 8
#define AVG_SCALE 100
#define CAL_AVG_SNR_NF(AVG, SNRNF, N) \
(((AVG) == 0) ? ((u16)(SNRNF) * AVG_SCALE) : \
((((int)(AVG) * (N -1)) + ((u16)(SNRNF) * \
AVG_SCALE)) / N))
#define MAX_RATES 14 #define MAX_RATES 14
#define MAX_LEDS 8 #define MAX_LEDS 8
......
...@@ -644,19 +644,19 @@ struct cmd_ds_802_11_rf_channel { ...@@ -644,19 +644,19 @@ struct cmd_ds_802_11_rf_channel {
} __packed; } __packed;
struct cmd_ds_802_11_rssi { struct cmd_ds_802_11_rssi {
/* weighting factor */ struct cmd_header hdr;
__le16 N;
__le16 reserved_0; /* request: number of beacons (N) to average the SNR and NF over
__le16 reserved_1; * response: SNR of most recent beacon
__le16 reserved_2; */
} __packed; __le16 n_or_snr;
struct cmd_ds_802_11_rssi_rsp { /* The following fields are only set in the response.
__le16 SNR; * In the request these are reserved and should be set to 0.
__le16 noisefloor; */
__le16 avgSNR; __le16 nf; /* most recent beacon noise floor */
__le16 avgnoisefloor; __le16 avg_snr; /* average SNR weighted by N from request */
__le16 avg_nf; /* average noise floor weighted by N from request */
} __packed; } __packed;
struct cmd_ds_802_11_mac_address { struct cmd_ds_802_11_mac_address {
...@@ -969,8 +969,6 @@ struct cmd_ds_command { ...@@ -969,8 +969,6 @@ struct cmd_ds_command {
/* command Body */ /* command Body */
union { union {
struct cmd_ds_802_11_ps_mode psmode; struct cmd_ds_802_11_ps_mode psmode;
struct cmd_ds_802_11_rssi rssi;
struct cmd_ds_802_11_rssi_rsp rssirsp;
struct cmd_ds_mac_reg_access macreg; struct cmd_ds_mac_reg_access macreg;
struct cmd_ds_bbp_reg_access bbpreg; struct cmd_ds_bbp_reg_access bbpreg;
struct cmd_ds_rf_reg_access rfreg; struct cmd_ds_rf_reg_access rfreg;
......
...@@ -157,12 +157,7 @@ static void lbs_tx_timeout(struct net_device *dev) ...@@ -157,12 +157,7 @@ static void lbs_tx_timeout(struct net_device *dev)
to kick it somehow? */ to kick it somehow? */
lbs_host_to_card_done(priv); lbs_host_to_card_done(priv);
/* More often than not, this actually happens because the /* FIXME: reset the card */
firmware has crapped itself -- rather than just a very
busy medium. So send a harmless command, and if/when
_that_ times out, we'll kick it in the head. */
lbs_prepare_and_send_command(priv, CMD_802_11_RSSI, 0,
0, 0, NULL);
lbs_deb_leave(LBS_DEB_TX); lbs_deb_leave(LBS_DEB_TX);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment