Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 203898
b: refs/heads/master
c: 9fb7663
h: refs/heads/master
v: v3
  • Loading branch information
Dan Williams authored and John W. Linville committed Jul 27, 2010
1 parent bed7fa6 commit dc78a6a
Show file tree
Hide file tree
Showing 9 changed files with 52 additions and 78 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a45b6f4f9ef7fde2321da5aaa7db0e1e793a5b1e
refs/heads/master: 9fb7663d2b832183ec7558a19426666819636a64
37 changes: 2 additions & 35 deletions trunk/drivers/net/wireless/libertas/cfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -1386,39 +1386,6 @@ static int lbs_cfg_del_key(struct wiphy *wiphy, struct net_device *netdev,
* 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,
u8 *mac, struct station_info *sinfo)
{
Expand All @@ -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;

/* Get current RSSI */
ret = lbs_get_signal(priv, &signal, &noise);
ret = lbs_get_rssi(priv, &signal, &noise);
if (ret == 0) {
sinfo->signal = signal;
sinfo->filled |= STATION_INFO_SIGNAL;
Expand Down Expand Up @@ -1479,7 +1446,7 @@ static int lbs_get_survey(struct wiphy *wiphy, struct net_device *dev,
survey->channel = ieee80211_get_channel(wiphy,
ieee80211_channel_to_frequency(priv->channel));

ret = lbs_get_signal(priv, &signal, &noise);
ret = lbs_get_rssi(priv, &signal, &noise);
if (ret == 0) {
survey->filled = SURVEY_INFO_NOISE_DBM;
survey->noise = noise;
Expand Down
2 changes: 0 additions & 2 deletions trunk/drivers/net/wireless/libertas/cfg.h
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,6 @@ int lbs_reg_notifier(struct wiphy *wiphy,
struct regulatory_request *request);

/* 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_ret_802_11_bcn_ctrl(priv, resp) (0)

Expand Down
39 changes: 35 additions & 4 deletions trunk/drivers/net/wireless/libertas/cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
#include "cfg.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);

Expand Down Expand Up @@ -690,6 +692,39 @@ int lbs_set_channel(struct lbs_private *priv, u8 channel)
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,
u8 cmd_action, void *pdata_buf)
{
Expand Down Expand Up @@ -1106,10 +1141,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
ret = lbs_cmd_reg_access(cmdptr, cmd_action, pdata_buf);
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_GET_AFC:

Expand Down
2 changes: 2 additions & 0 deletions trunk/drivers/net/wireless/libertas/cmd.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_get_rssi(struct lbs_private *priv, s8 *snr, s8 *nf);

#endif /* _LBS_CMD_H */
4 changes: 0 additions & 4 deletions trunk/drivers/net/wireless/libertas/cmdresp.c
Original file line number Diff line number Diff line change
Expand Up @@ -172,10 +172,6 @@ static inline int handle_cmd_response(struct lbs_private *priv,
case CMD_RET(CMD_802_11_BEACON_STOP):
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):
ret = lbs_ret_802_11d_domain_info(resp);
break;
Expand Down
13 changes: 0 additions & 13 deletions trunk/drivers/net/wireless/libertas/defs.h
Original file line number Diff line number Diff line change
Expand Up @@ -301,19 +301,6 @@ static inline void lbs_deb_hex(unsigned int grp, const char *prompt, u8 *buf, in
#define BAND_G (0x02)
#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_LEDS 8
Expand Down
24 changes: 11 additions & 13 deletions trunk/drivers/net/wireless/libertas/host.h
Original file line number Diff line number Diff line change
Expand Up @@ -644,19 +644,19 @@ struct cmd_ds_802_11_rf_channel {
} __packed;

struct cmd_ds_802_11_rssi {
/* weighting factor */
__le16 N;
struct cmd_header hdr;

__le16 reserved_0;
__le16 reserved_1;
__le16 reserved_2;
} __packed;
/* request: number of beacons (N) to average the SNR and NF over
* response: SNR of most recent beacon
*/
__le16 n_or_snr;

struct cmd_ds_802_11_rssi_rsp {
__le16 SNR;
__le16 noisefloor;
__le16 avgSNR;
__le16 avgnoisefloor;
/* The following fields are only set in the response.
* In the request these are reserved and should be set to 0.
*/
__le16 nf; /* most recent beacon noise floor */
__le16 avg_snr; /* average SNR weighted by N from request */
__le16 avg_nf; /* average noise floor weighted by N from request */
} __packed;

struct cmd_ds_802_11_mac_address {
Expand Down Expand Up @@ -969,8 +969,6 @@ struct cmd_ds_command {
/* command Body */
union {
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_bbp_reg_access bbpreg;
struct cmd_ds_rf_reg_access rfreg;
Expand Down
7 changes: 1 addition & 6 deletions trunk/drivers/net/wireless/libertas/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -157,12 +157,7 @@ static void lbs_tx_timeout(struct net_device *dev)
to kick it somehow? */
lbs_host_to_card_done(priv);

/* More often than not, this actually happens because the
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);
/* FIXME: reset the card */

lbs_deb_leave(LBS_DEB_TX);
}
Expand Down

0 comments on commit dc78a6a

Please sign in to comment.