* [PATCH] libertas: Improvements on automatic tx power control via SIOCSIWTXPOW.
@ 2008-09-25 23:19 Anna Neal
2008-09-26 14:49 ` Dan Williams
2008-09-26 16:26 ` John W. Linville
0 siblings, 2 replies; 16+ messages in thread
From: Anna Neal @ 2008-09-25 23:19 UTC (permalink / raw)
To: linux-wireless; +Cc: libertas-dev
iwconfig txpower can now be used to set tx power to fixed or auto. If set to
auto the default firmware settings are used.
The command CMD_802_11_PA_CFG is only sent to older firmware, as Dan Williams
noted the command was no longer supported in firmware V9+.
Signed-off-by: Anna Neal <anna@cozybit.com>
Signed-off-by: Javier Cardona <javier@cozybit.com>
---
drivers/net/wireless/libertas/cmd.c | 64 +++++++++++++++++++++++++++++++
drivers/net/wireless/libertas/cmd.h | 6 +++
drivers/net/wireless/libertas/defs.h | 9 ++++
drivers/net/wireless/libertas/host.h | 1 +
drivers/net/wireless/libertas/hostcmd.h | 24 +++++++++--
drivers/net/wireless/libertas/wext.c | 32 ++++++++++++++-
6 files changed, 129 insertions(+), 7 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 7e818b0..a912fb6 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1927,6 +1927,70 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv)
}
+/**
+ * @brief Configures the transmission power control functionality.
+ *
+ * @param priv A pointer to struct lbs_private structure
+ * @param enable Transmission power control enable
+ * @param p0 Power level when link quality is good (dBm).
+ * @param p1 Power level when link quality is fair (dBm).
+ * @param p2 Power level when link quality is poor (dBm).
+ * @param usesnr Use Signal to Noise Ratio in TPC
+ *
+ * @return 0 on success
+ */
+int lbs_set_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
+ int8_t p2, int usesnr)
+{
+ struct cmd_ds_802_11_tpc_cfg cmd;
+ int ret;
+
+ memset(&cmd, 0, sizeof(cmd));
+ cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+ cmd.action = cpu_to_le16(CMD_ACT_SET);
+ cmd.enable = !!enable;
+ cmd.usesnr = !!usesnr;
+ cmd.P0 = p0;
+ cmd.P1 = p1;
+ cmd.P2 = p2;
+
+ ret = lbs_cmd_with_response(priv, CMD_802_11_TPC_CFG, &cmd);
+
+ return ret;
+}
+
+/**
+ * @brief Configures the power adaptation settings.
+ *
+ * @param priv A pointer to struct lbs_private structure
+ * @param enable Power adaptation enable
+ * @param p0 Power level for 1, 2, 5.5 and 11 Mbps (dBm).
+ * @param p1 Power level for 6, 9, 12, 18, 22, 24 and 36 Mbps (dBm).
+ * @param p2 Power level for 48 and 54 Mbps (dBm).
+ *
+ * @return 0 on Success
+ */
+
+int lbs_set_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
+ int8_t p1, int8_t p2)
+{
+ struct cmd_ds_802_11_pa_cfg cmd;
+ int ret;
+
+ memset(&cmd, 0, sizeof(cmd));
+ cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+ cmd.action = cpu_to_le16(CMD_ACT_SET);
+ cmd.enable = !!enable;
+ cmd.P0 = p0;
+ cmd.P1 = p1;
+ cmd.P2 = p2;
+
+ ret = lbs_cmd_with_response(priv, CMD_802_11_PA_CFG , &cmd);
+
+ return ret;
+}
+
+
static struct cmd_ctrl_node *__lbs_cmd_async(struct lbs_private *priv,
uint16_t command, struct cmd_header *in_cmd, int in_cmd_size,
int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index 9a35e15..d002160 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -26,6 +26,12 @@ int __lbs_cmd(struct lbs_private *priv, uint16_t command,
int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
unsigned long callback_arg);
+int lbs_set_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
+ int8_t p1, int8_t p2);
+
+int lbs_set_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
+ int8_t p2, int usesnr);
+
int lbs_cmd_copyback(struct lbs_private *priv, unsigned long extra,
struct cmd_header *resp);
diff --git a/drivers/net/wireless/libertas/defs.h b/drivers/net/wireless/libertas/defs.h
index c20fcf1..58d11a3 100644
--- a/drivers/net/wireless/libertas/defs.h
+++ b/drivers/net/wireless/libertas/defs.h
@@ -189,6 +189,15 @@ static inline void lbs_deb_hex(unsigned int grp, const char *prompt, u8 *buf, in
#define MRVDRV_CMD_UPLD_RDY 0x0008
#define MRVDRV_CARDEVENT 0x0010
+
+/* Automatic TX control default levels */
+#define POW_ADAPT_DEFAULT_P0 13
+#define POW_ADAPT_DEFAULT_P1 15
+#define POW_ADAPT_DEFAULT_P2 18
+#define TPC_DEFAULT_P0 5
+#define TPC_DEFAULT_P1 10
+#define TPC_DEFAULT_P2 13
+
/** TxPD status */
/* Station firmware use TxPD status field to report final Tx transmit
diff --git a/drivers/net/wireless/libertas/host.h b/drivers/net/wireless/libertas/host.h
index d1d0666..5004d76 100644
--- a/drivers/net/wireless/libertas/host.h
+++ b/drivers/net/wireless/libertas/host.h
@@ -72,6 +72,7 @@
#define CMD_802_11_INACTIVITY_TIMEOUT 0x0067
#define CMD_802_11_SLEEP_PERIOD 0x0068
#define CMD_802_11_TPC_CFG 0x0072
+#define CMD_802_11_PA_CFG 0x0073
#define CMD_802_11_FW_WAKE_METHOD 0x0074
#define CMD_802_11_SUBSCRIBE_EVENT 0x0075
#define CMD_802_11_RATE_ADAPT_RATESET 0x0076
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index b4ae2c2..d9f9a12 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -605,14 +605,28 @@ struct cmd_ds_802_11_eeprom_access {
} __attribute__ ((packed));
struct cmd_ds_802_11_tpc_cfg {
+ struct cmd_header hdr;
+
__le16 action;
- u8 enable;
- s8 P0;
- s8 P1;
- s8 P2;
- u8 usesnr;
+ uint8_t enable;
+ int8_t P0;
+ int8_t P1;
+ int8_t P2;
+ uint8_t usesnr;
} __attribute__ ((packed));
+
+struct cmd_ds_802_11_pa_cfg {
+ struct cmd_header hdr;
+
+ __le16 action;
+ uint8_t enable;
+ int8_t P0;
+ int8_t P1;
+ int8_t P2;
+} __attribute__ ((packed));
+
+
struct cmd_ds_802_11_led_ctrl {
__le16 action;
__le16 numled;
diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c
index 641e1c6..caf6108 100644
--- a/drivers/net/wireless/libertas/wext.c
+++ b/drivers/net/wireless/libertas/wext.c
@@ -1856,7 +1856,22 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
}
if (vwrq->fixed == 0) {
- /* Auto power control */
+ /* User requests automatic tx power control, however there are
+ * many auto tx settings. For now use firmware defaults
+ * (enable power adaptation and disable TPC) until we come up
+ * with a good way to expose these to the user. */
+ if (priv->fwrelease < 0x09000000) {
+ ret = lbs_set_power_adapt_cfg(priv, 1,
+ POW_ADAPT_DEFAULT_P0,
+ POW_ADAPT_DEFAULT_P1,
+ POW_ADAPT_DEFAULT_P2);
+ if (ret)
+ goto out;
+ }
+ ret = lbs_set_tpc_cfg(priv, 0, TPC_DEFAULT_P0, TPC_DEFAULT_P1,
+ TPC_DEFAULT_P2, 1);
+ if (ret)
+ goto out;
dbm = priv->txpower_max;
} else {
/* Userspace check in iwrange if it should use dBm or mW,
@@ -1866,7 +1881,8 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
goto out;
}
- /* Validate requested power level against firmware allowed levels */
+ /* Validate requested power level against firmware allowed
+ * levels */
if (priv->txpower_min && (dbm < priv->txpower_min)) {
ret = -EINVAL;
goto out;
@@ -1876,6 +1892,18 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
ret = -EINVAL;
goto out;
}
+ if (priv->fwrelease < 0x09000000) {
+ ret = lbs_set_power_adapt_cfg(priv, 0,
+ POW_ADAPT_DEFAULT_P0,
+ POW_ADAPT_DEFAULT_P1,
+ POW_ADAPT_DEFAULT_P2);
+ if (ret)
+ goto out;
+ }
+ ret = lbs_set_tpc_cfg(priv, 0, TPC_DEFAULT_P0, TPC_DEFAULT_P1,
+ TPC_DEFAULT_P2, 1);
+ if (ret)
+ goto out;
}
/* If the radio was off, turn it on */
--
1.5.4.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* Re: [PATCH] libertas: Improvements on automatic tx power control via SIOCSIWTXPOW.
2008-09-25 23:19 [PATCH] libertas: Improvements on automatic tx power control via SIOCSIWTXPOW Anna Neal
@ 2008-09-26 14:49 ` Dan Williams
2008-09-26 16:26 ` John W. Linville
1 sibling, 0 replies; 16+ messages in thread
From: Dan Williams @ 2008-09-26 14:49 UTC (permalink / raw)
To: Anna Neal; +Cc: linux-wireless, libertas-dev
On Thu, 2008-09-25 at 16:19 -0700, Anna Neal wrote:
> iwconfig txpower can now be used to set tx power to fixed or auto. If set to
> auto the default firmware settings are used.
>
> The command CMD_802_11_PA_CFG is only sent to older firmware, as Dan Williams
> noted the command was no longer supported in firmware V9+.
>
> Signed-off-by: Anna Neal <anna@cozybit.com>
> Signed-off-by: Javier Cardona <javier@cozybit.com>
Thanks!
Acked-by: Dan Williams <dcbw@redhat.com>
> ---
> drivers/net/wireless/libertas/cmd.c | 64 +++++++++++++++++++++++++++++++
> drivers/net/wireless/libertas/cmd.h | 6 +++
> drivers/net/wireless/libertas/defs.h | 9 ++++
> drivers/net/wireless/libertas/host.h | 1 +
> drivers/net/wireless/libertas/hostcmd.h | 24 +++++++++--
> drivers/net/wireless/libertas/wext.c | 32 ++++++++++++++-
> 6 files changed, 129 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
> index 7e818b0..a912fb6 100644
> --- a/drivers/net/wireless/libertas/cmd.c
> +++ b/drivers/net/wireless/libertas/cmd.c
> @@ -1927,6 +1927,70 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv)
> }
>
>
> +/**
> + * @brief Configures the transmission power control functionality.
> + *
> + * @param priv A pointer to struct lbs_private structure
> + * @param enable Transmission power control enable
> + * @param p0 Power level when link quality is good (dBm).
> + * @param p1 Power level when link quality is fair (dBm).
> + * @param p2 Power level when link quality is poor (dBm).
> + * @param usesnr Use Signal to Noise Ratio in TPC
> + *
> + * @return 0 on success
> + */
> +int lbs_set_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
> + int8_t p2, int usesnr)
> +{
> + struct cmd_ds_802_11_tpc_cfg cmd;
> + int ret;
> +
> + memset(&cmd, 0, sizeof(cmd));
> + cmd.hdr.size = cpu_to_le16(sizeof(cmd));
> + cmd.action = cpu_to_le16(CMD_ACT_SET);
> + cmd.enable = !!enable;
> + cmd.usesnr = !!usesnr;
> + cmd.P0 = p0;
> + cmd.P1 = p1;
> + cmd.P2 = p2;
> +
> + ret = lbs_cmd_with_response(priv, CMD_802_11_TPC_CFG, &cmd);
> +
> + return ret;
> +}
> +
> +/**
> + * @brief Configures the power adaptation settings.
> + *
> + * @param priv A pointer to struct lbs_private structure
> + * @param enable Power adaptation enable
> + * @param p0 Power level for 1, 2, 5.5 and 11 Mbps (dBm).
> + * @param p1 Power level for 6, 9, 12, 18, 22, 24 and 36 Mbps (dBm).
> + * @param p2 Power level for 48 and 54 Mbps (dBm).
> + *
> + * @return 0 on Success
> + */
> +
> +int lbs_set_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
> + int8_t p1, int8_t p2)
> +{
> + struct cmd_ds_802_11_pa_cfg cmd;
> + int ret;
> +
> + memset(&cmd, 0, sizeof(cmd));
> + cmd.hdr.size = cpu_to_le16(sizeof(cmd));
> + cmd.action = cpu_to_le16(CMD_ACT_SET);
> + cmd.enable = !!enable;
> + cmd.P0 = p0;
> + cmd.P1 = p1;
> + cmd.P2 = p2;
> +
> + ret = lbs_cmd_with_response(priv, CMD_802_11_PA_CFG , &cmd);
> +
> + return ret;
> +}
> +
> +
> static struct cmd_ctrl_node *__lbs_cmd_async(struct lbs_private *priv,
> uint16_t command, struct cmd_header *in_cmd, int in_cmd_size,
> int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
> diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
> index 9a35e15..d002160 100644
> --- a/drivers/net/wireless/libertas/cmd.h
> +++ b/drivers/net/wireless/libertas/cmd.h
> @@ -26,6 +26,12 @@ int __lbs_cmd(struct lbs_private *priv, uint16_t command,
> int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
> unsigned long callback_arg);
>
> +int lbs_set_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
> + int8_t p1, int8_t p2);
> +
> +int lbs_set_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
> + int8_t p2, int usesnr);
> +
> int lbs_cmd_copyback(struct lbs_private *priv, unsigned long extra,
> struct cmd_header *resp);
>
> diff --git a/drivers/net/wireless/libertas/defs.h b/drivers/net/wireless/libertas/defs.h
> index c20fcf1..58d11a3 100644
> --- a/drivers/net/wireless/libertas/defs.h
> +++ b/drivers/net/wireless/libertas/defs.h
> @@ -189,6 +189,15 @@ static inline void lbs_deb_hex(unsigned int grp, const char *prompt, u8 *buf, in
> #define MRVDRV_CMD_UPLD_RDY 0x0008
> #define MRVDRV_CARDEVENT 0x0010
>
> +
> +/* Automatic TX control default levels */
> +#define POW_ADAPT_DEFAULT_P0 13
> +#define POW_ADAPT_DEFAULT_P1 15
> +#define POW_ADAPT_DEFAULT_P2 18
> +#define TPC_DEFAULT_P0 5
> +#define TPC_DEFAULT_P1 10
> +#define TPC_DEFAULT_P2 13
> +
> /** TxPD status */
>
> /* Station firmware use TxPD status field to report final Tx transmit
> diff --git a/drivers/net/wireless/libertas/host.h b/drivers/net/wireless/libertas/host.h
> index d1d0666..5004d76 100644
> --- a/drivers/net/wireless/libertas/host.h
> +++ b/drivers/net/wireless/libertas/host.h
> @@ -72,6 +72,7 @@
> #define CMD_802_11_INACTIVITY_TIMEOUT 0x0067
> #define CMD_802_11_SLEEP_PERIOD 0x0068
> #define CMD_802_11_TPC_CFG 0x0072
> +#define CMD_802_11_PA_CFG 0x0073
> #define CMD_802_11_FW_WAKE_METHOD 0x0074
> #define CMD_802_11_SUBSCRIBE_EVENT 0x0075
> #define CMD_802_11_RATE_ADAPT_RATESET 0x0076
> diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
> index b4ae2c2..d9f9a12 100644
> --- a/drivers/net/wireless/libertas/hostcmd.h
> +++ b/drivers/net/wireless/libertas/hostcmd.h
> @@ -605,14 +605,28 @@ struct cmd_ds_802_11_eeprom_access {
> } __attribute__ ((packed));
>
> struct cmd_ds_802_11_tpc_cfg {
> + struct cmd_header hdr;
> +
> __le16 action;
> - u8 enable;
> - s8 P0;
> - s8 P1;
> - s8 P2;
> - u8 usesnr;
> + uint8_t enable;
> + int8_t P0;
> + int8_t P1;
> + int8_t P2;
> + uint8_t usesnr;
> } __attribute__ ((packed));
>
> +
> +struct cmd_ds_802_11_pa_cfg {
> + struct cmd_header hdr;
> +
> + __le16 action;
> + uint8_t enable;
> + int8_t P0;
> + int8_t P1;
> + int8_t P2;
> +} __attribute__ ((packed));
> +
> +
> struct cmd_ds_802_11_led_ctrl {
> __le16 action;
> __le16 numled;
> diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c
> index 641e1c6..caf6108 100644
> --- a/drivers/net/wireless/libertas/wext.c
> +++ b/drivers/net/wireless/libertas/wext.c
> @@ -1856,7 +1856,22 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
> }
>
> if (vwrq->fixed == 0) {
> - /* Auto power control */
> + /* User requests automatic tx power control, however there are
> + * many auto tx settings. For now use firmware defaults
> + * (enable power adaptation and disable TPC) until we come up
> + * with a good way to expose these to the user. */
> + if (priv->fwrelease < 0x09000000) {
> + ret = lbs_set_power_adapt_cfg(priv, 1,
> + POW_ADAPT_DEFAULT_P0,
> + POW_ADAPT_DEFAULT_P1,
> + POW_ADAPT_DEFAULT_P2);
> + if (ret)
> + goto out;
> + }
> + ret = lbs_set_tpc_cfg(priv, 0, TPC_DEFAULT_P0, TPC_DEFAULT_P1,
> + TPC_DEFAULT_P2, 1);
> + if (ret)
> + goto out;
> dbm = priv->txpower_max;
> } else {
> /* Userspace check in iwrange if it should use dBm or mW,
> @@ -1866,7 +1881,8 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
> goto out;
> }
>
> - /* Validate requested power level against firmware allowed levels */
> + /* Validate requested power level against firmware allowed
> + * levels */
> if (priv->txpower_min && (dbm < priv->txpower_min)) {
> ret = -EINVAL;
> goto out;
> @@ -1876,6 +1892,18 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
> ret = -EINVAL;
> goto out;
> }
> + if (priv->fwrelease < 0x09000000) {
> + ret = lbs_set_power_adapt_cfg(priv, 0,
> + POW_ADAPT_DEFAULT_P0,
> + POW_ADAPT_DEFAULT_P1,
> + POW_ADAPT_DEFAULT_P2);
> + if (ret)
> + goto out;
> + }
> + ret = lbs_set_tpc_cfg(priv, 0, TPC_DEFAULT_P0, TPC_DEFAULT_P1,
> + TPC_DEFAULT_P2, 1);
> + if (ret)
> + goto out;
> }
>
> /* If the radio was off, turn it on */
^ permalink raw reply [flat|nested] 16+ messages in thread* Re: [PATCH] libertas: Improvements on automatic tx power control via SIOCSIWTXPOW.
2008-09-25 23:19 [PATCH] libertas: Improvements on automatic tx power control via SIOCSIWTXPOW Anna Neal
2008-09-26 14:49 ` Dan Williams
@ 2008-09-26 16:26 ` John W. Linville
2008-09-29 20:59 ` Dan Williams
1 sibling, 1 reply; 16+ messages in thread
From: John W. Linville @ 2008-09-26 16:26 UTC (permalink / raw)
To: Anna Neal; +Cc: linux-wireless, libertas-dev
On Thu, Sep 25, 2008 at 04:19:31PM -0700, Anna Neal wrote:
> iwconfig txpower can now be used to set tx power to fixed or auto. If set to
> auto the default firmware settings are used.
>
> The command CMD_802_11_PA_CFG is only sent to older firmware, as Dan Williams
> noted the command was no longer supported in firmware V9+.
>
> Signed-off-by: Anna Neal <anna@cozybit.com>
> Signed-off-by: Javier Cardona <javier@cozybit.com>
I had already committed an earlier version. I believe I have
incorporated all the changes in "libertas: Improvements on automatic tx
power control via SIOCSIWTXPOW (fixups)" -- please feel free to verify.
Thanks,
John
--
John W. Linville Linux should be at the core
linville@tuxdriver.com of your literate lifestyle.
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] libertas: Improvements on automatic tx power control via SIOCSIWTXPOW.
2008-09-26 16:26 ` John W. Linville
@ 2008-09-29 20:59 ` Dan Williams
2008-09-29 21:20 ` John W. Linville
0 siblings, 1 reply; 16+ messages in thread
From: Dan Williams @ 2008-09-29 20:59 UTC (permalink / raw)
To: John W. Linville; +Cc: Anna Neal, linux-wireless, libertas-dev
On Fri, 2008-09-26 at 12:26 -0400, John W. Linville wrote:
> On Thu, Sep 25, 2008 at 04:19:31PM -0700, Anna Neal wrote:
> > iwconfig txpower can now be used to set tx power to fixed or auto. If set to
> > auto the default firmware settings are used.
> >
> > The command CMD_802_11_PA_CFG is only sent to older firmware, as Dan Williams
> > noted the command was no longer supported in firmware V9+.
> >
> > Signed-off-by: Anna Neal <anna@cozybit.com>
> > Signed-off-by: Javier Cardona <javier@cozybit.com>
>
> I had already committed an earlier version. I believe I have
> incorporated all the changes in "libertas: Improvements on automatic tx
> power control via SIOCSIWTXPOW (fixups)" -- please feel free to verify.
A few missing bits, sorry for the confusion. Merge fixups against
current wireless-testing below.
Signed-off-by: Dan Williams <dcbw@redhat.com>
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index aee19fa..a912fb6 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1949,7 +1949,7 @@ int lbs_set_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
cmd.hdr.size = cpu_to_le16(sizeof(cmd));
cmd.action = cpu_to_le16(CMD_ACT_SET);
cmd.enable = !!enable;
- cmd.usesnr = !!enable;
+ cmd.usesnr = !!usesnr;
cmd.P0 = p0;
cmd.P1 = p1;
cmd.P2 = p2;
diff --git a/drivers/net/wireless/libertas/defs.h b/drivers/net/wireless/libertas/defs.h
index d21bb4e..076a636 100644
--- a/drivers/net/wireless/libertas/defs.h
+++ b/drivers/net/wireless/libertas/defs.h
@@ -189,16 +189,6 @@ static inline void lbs_deb_hex(unsigned int grp, const char *prompt, u8 *buf, in
#define MRVDRV_CMD_UPLD_RDY 0x0008
#define MRVDRV_CARDEVENT 0x0010
-
-/* Automatic TX control default levels */
-#define POW_ADAPT_DEFAULT_P0 13
-#define POW_ADAPT_DEFAULT_P1 15
-#define POW_ADAPT_DEFAULT_P2 18
-#define TPC_DEFAULT_P0 5
-#define TPC_DEFAULT_P1 10
-#define TPC_DEFAULT_P2 13
-
-
/* Automatic TX control default levels */
#define POW_ADAPT_DEFAULT_P0 13
#define POW_ADAPT_DEFAULT_P1 15
^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH] libertas: Improvements on automatic tx power control via SIOCSIWTXPOW.
2008-09-29 20:59 ` Dan Williams
@ 2008-09-29 21:20 ` John W. Linville
0 siblings, 0 replies; 16+ messages in thread
From: John W. Linville @ 2008-09-29 21:20 UTC (permalink / raw)
To: Dan Williams; +Cc: Anna Neal, linux-wireless, libertas-dev
On Mon, Sep 29, 2008 at 04:59:37PM -0400, Dan Williams wrote:
> On Fri, 2008-09-26 at 12:26 -0400, John W. Linville wrote:
> > On Thu, Sep 25, 2008 at 04:19:31PM -0700, Anna Neal wrote:
> > > iwconfig txpower can now be used to set tx power to fixed or auto. If set to
> > > auto the default firmware settings are used.
> > >
> > > The command CMD_802_11_PA_CFG is only sent to older firmware, as Dan Williams
> > > noted the command was no longer supported in firmware V9+.
> > >
> > > Signed-off-by: Anna Neal <anna@cozybit.com>
> > > Signed-off-by: Javier Cardona <javier@cozybit.com>
> >
> > I had already committed an earlier version. I believe I have
> > incorporated all the changes in "libertas: Improvements on automatic tx
> > power control via SIOCSIWTXPOW (fixups)" -- please feel free to verify.
>
> A few missing bits, sorry for the confusion. Merge fixups against
> current wireless-testing below.
>
> Signed-off-by: Dan Williams <dcbw@redhat.com>
Thanks Dan! I'll fold this into the patch before sending it upstream.
John
--
John W. Linville Linux should be at the core
linville@tuxdriver.com of your literate lifestyle.
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH] libertas: Improvements on automatic tx power control via SIOCSIWTXPOW.
@ 2008-09-11 18:17 Anna Neal
2008-09-11 18:37 ` Johannes Berg
2008-09-15 5:44 ` Dan Williams
0 siblings, 2 replies; 16+ messages in thread
From: Anna Neal @ 2008-09-11 18:17 UTC (permalink / raw)
To: linux-wireless; +Cc: libertas-dev
iwconfig txpower can now be used to set tx power to fixed or auto. If set to
auto the default firmware settings are used.
The command CMD_802_11_PA_CFG is only sent to older firmware, as Dan Williams
noted the command was no longer supported in firmware V9+.
Signed-off-by: Anna Neal <anna@cozybit.com>
Signed-off-by: Javier Cardona <javier@cozybit.com>
---
drivers/net/wireless/libertas/cmd.c | 64 +++++++++++++++++++++++++++++++
drivers/net/wireless/libertas/cmd.h | 6 +++
drivers/net/wireless/libertas/defs.h | 9 ++++
drivers/net/wireless/libertas/host.h | 1 +
drivers/net/wireless/libertas/hostcmd.h | 24 +++++++++--
drivers/net/wireless/libertas/wext.c | 31 ++++++++++++++-
6 files changed, 128 insertions(+), 7 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 802547e..5fef05f 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1971,6 +1971,70 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv)
}
+/**
+ * @brief Configures the transmission power control functionality.
+ *
+ * @param priv A pointer to struct lbs_private structure
+ * @param enable Transmission power control enable
+ * @param p0 Power level when link quality is good (dBm).
+ * @param p1 Power level when link quality is fair (dBm).
+ * @param p2 Power level when link quality is poor (dBm).
+ * @param usesnr Use Signal to Noise Ratio in TPC
+ *
+ * @return 0 on success
+ */
+int lbs_set_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
+ int8_t p2, int usesnr)
+{
+ struct cmd_ds_802_11_tpc_cfg cmd;
+ int ret;
+
+ memset(&cmd, 0, sizeof(cmd));
+ cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+ cmd.action = cpu_to_le16(CMD_ACT_SET);
+ cmd.enable = !!enable;
+ cmd.usesnr = !!enable;
+ cmd.P0 = p0;
+ cmd.P1 = p1;
+ cmd.P2 = p2;
+
+ ret = lbs_cmd_with_response(priv, CMD_802_11_TPC_CFG, &cmd);
+
+ return ret;
+}
+
+/**
+ * @brief Configures the power adaptation settings.
+ *
+ * @param priv A pointer to struct lbs_private structure
+ * @param enable Power adaptation enable
+ * @param p0 Power level for 1, 2, 5.5 and 11 Mbps (dBm).
+ * @param p1 Power level for 6, 9, 12, 18, 22, 24 and 36 Mbps (dBm).
+ * @param p2 Power level for 48 and 54 Mbps (dBm).
+ *
+ * @return 0 on Success
+ */
+
+int lbs_set_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
+ int8_t p1, int8_t p2)
+{
+ struct cmd_ds_802_11_pa_cfg cmd;
+ int ret;
+
+ memset(&cmd, 0, sizeof(cmd));
+ cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+ cmd.action = cpu_to_le16(CMD_ACT_SET);
+ cmd.enable = !!enable;
+ cmd.P0 = p0;
+ cmd.P1 = p1;
+ cmd.P2 = p2;
+
+ ret = lbs_cmd_with_response(priv, CMD_802_11_PA_CFG , &cmd);
+
+ return ret;
+}
+
+
static struct cmd_ctrl_node *__lbs_cmd_async(struct lbs_private *priv,
uint16_t command, struct cmd_header *in_cmd, int in_cmd_size,
int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index 11ac996..336a181 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -26,6 +26,12 @@ int __lbs_cmd(struct lbs_private *priv, uint16_t command,
int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
unsigned long callback_arg);
+int lbs_set_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
+ int8_t p1, int8_t p2);
+
+int lbs_set_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
+ int8_t p2, int usesnr);
+
int lbs_cmd_copyback(struct lbs_private *priv, unsigned long extra,
struct cmd_header *resp);
diff --git a/drivers/net/wireless/libertas/defs.h b/drivers/net/wireless/libertas/defs.h
index 4b2428a..c89d7a1 100644
--- a/drivers/net/wireless/libertas/defs.h
+++ b/drivers/net/wireless/libertas/defs.h
@@ -189,6 +189,15 @@ static inline void lbs_deb_hex(unsigned int grp, const char *prompt, u8 *buf, in
#define MRVDRV_CMD_UPLD_RDY 0x0008
#define MRVDRV_CARDEVENT 0x0010
+
+/* Automatic TX control default levels */
+#define POW_ADAPT_DEFAULT_P0 13
+#define POW_ADAPT_DEFAULT_P1 15
+#define POW_ADAPT_DEFAULT_P2 18
+#define TPC_DEFAULT_P0 5
+#define TPC_DEFAULT_P1 10
+#define TPC_DEFAULT_P2 13
+
/** TxPD status */
/* Station firmware use TxPD status field to report final Tx transmit
diff --git a/drivers/net/wireless/libertas/host.h b/drivers/net/wireless/libertas/host.h
index da618fc..a916bb9 100644
--- a/drivers/net/wireless/libertas/host.h
+++ b/drivers/net/wireless/libertas/host.h
@@ -83,6 +83,7 @@
#define CMD_802_11_INACTIVITY_TIMEOUT 0x0067
#define CMD_802_11_SLEEP_PERIOD 0x0068
#define CMD_802_11_TPC_CFG 0x0072
+#define CMD_802_11_PA_CFG 0x0073
#define CMD_802_11_FW_WAKE_METHOD 0x0074
#define CMD_802_11_SUBSCRIBE_EVENT 0x0075
#define CMD_802_11_RATE_ADAPT_RATESET 0x0076
diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
index d27c276..630b799 100644
--- a/drivers/net/wireless/libertas/hostcmd.h
+++ b/drivers/net/wireless/libertas/hostcmd.h
@@ -607,14 +607,28 @@ struct cmd_ds_802_11_eeprom_access {
} __attribute__ ((packed));
struct cmd_ds_802_11_tpc_cfg {
+ struct cmd_header hdr;
+
__le16 action;
- u8 enable;
- s8 P0;
- s8 P1;
- s8 P2;
- u8 usesnr;
+ uint8_t enable;
+ int8_t P0;
+ int8_t P1;
+ int8_t P2;
+ uint8_t usesnr;
} __attribute__ ((packed));
+
+struct cmd_ds_802_11_pa_cfg {
+ struct cmd_header hdr;
+
+ __le16 action;
+ uint8_t enable;
+ int8_t P0;
+ int8_t P1;
+ int8_t P2;
+} __attribute__ ((packed));
+
+
struct cmd_ds_802_11_led_ctrl {
__le16 action;
__le16 numled;
diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c
index 426f1fe..e8cadad 100644
--- a/drivers/net/wireless/libertas/wext.c
+++ b/drivers/net/wireless/libertas/wext.c
@@ -1820,7 +1820,21 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
}
if (vwrq->fixed == 0) {
- /* Auto power control */
+ /* User requests automatic tx power control, however there are
+ * many auto tx settings. For now use firmware defaults until
+ * we come up with a good way to expose these to the user. */
+ if (priv->fwrelease < 0x09000000) {
+ ret = lbs_set_power_adapt_cfg(priv, 1,
+ POW_ADAPT_DEFAULT_P0,
+ POW_ADAPT_DEFAULT_P1,
+ POW_ADAPT_DEFAULT_P2);
+ if (ret)
+ goto out;
+ }
+ ret = lbs_set_tpc_cfg(priv, 0, TPC_DEFAULT_P0, TPC_DEFAULT_P1,
+ TPC_DEFAULT_P2, 1);
+ if (ret)
+ goto out;
dbm = priv->txpower_max;
} else {
/* Userspace check in iwrange if it should use dBm or mW,
@@ -1830,7 +1844,8 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
goto out;
}
- /* Validate requested power level against firmware allowed levels */
+ /* Validate requested power level against firmware allowed
+ * levels */
if (priv->txpower_min && (dbm < priv->txpower_min)) {
ret = -EINVAL;
goto out;
@@ -1840,6 +1855,18 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
ret = -EINVAL;
goto out;
}
+ if (priv->fwrelease < 0x09000000) {
+ ret = lbs_set_power_adapt_cfg(priv, 0,
+ POW_ADAPT_DEFAULT_P0,
+ POW_ADAPT_DEFAULT_P1,
+ POW_ADAPT_DEFAULT_P2);
+ if (ret)
+ goto out;
+ }
+ ret = lbs_set_tpc_cfg(priv, 0, TPC_DEFAULT_P0, TPC_DEFAULT_P1,
+ TPC_DEFAULT_P2, 1);
+ if (ret)
+ goto out;
}
/* If the radio was off, turn it on */
--
1.5.4.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* Re: [PATCH] libertas: Improvements on automatic tx power control via SIOCSIWTXPOW.
2008-09-11 18:17 Anna Neal
@ 2008-09-11 18:37 ` Johannes Berg
2008-09-11 18:56 ` Anna Neal
2008-09-15 5:44 ` Dan Williams
1 sibling, 1 reply; 16+ messages in thread
From: Johannes Berg @ 2008-09-11 18:37 UTC (permalink / raw)
To: Anna Neal; +Cc: linux-wireless, libertas-dev
[-- Attachment #1: Type: text/plain, Size: 761 bytes --]
On Thu, 2008-09-11 at 11:17 -0700, Anna Neal wrote:
> +/**
> + * @brief Configures the transmission power control functionality.
> + *
> + * @param priv A pointer to struct lbs_private structure
> + * @param enable Transmission power control enable
> + * @param p0 Power level when link quality is good (dBm).
> + * @param p1 Power level when link quality is fair (dBm).
> + * @param p2 Power level when link quality is poor (dBm).
> + * @param usesnr Use Signal to Noise Ratio in TPC
> + *
> + * @return 0 on success
What doc tools are you using? This isn't kernel-doc notation, is it?
[not that I think that should prevent the patch from going in, at this
point, since I don't think the file is read by kernel-doc anyway]
johannes
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] libertas: Improvements on automatic tx power control via SIOCSIWTXPOW.
2008-09-11 18:37 ` Johannes Berg
@ 2008-09-11 18:56 ` Anna Neal
2008-09-11 19:12 ` Johannes Berg
0 siblings, 1 reply; 16+ messages in thread
From: Anna Neal @ 2008-09-11 18:56 UTC (permalink / raw)
To: Johannes Berg; +Cc: linux-wireless, libertas-dev
On Thu, Sep 11, 2008 at 11:37 AM, Johannes Berg
<johannes@sipsolutions.net> wrote:
> On Thu, 2008-09-11 at 11:17 -0700, Anna Neal wrote:
>
>> +/**
>> + * @brief Configures the transmission power control functionality.
>> + *
>> + * @param priv A pointer to struct lbs_private structure
>> + * @param enable Transmission power control enable
>> + * @param p0 Power level when link quality is good (dBm).
>> + * @param p1 Power level when link quality is fair (dBm).
>> + * @param p2 Power level when link quality is poor (dBm).
>> + * @param usesnr Use Signal to Noise Ratio in TPC
>> + *
>> + * @return 0 on success
>
> What doc tools are you using? This isn't kernel-doc notation, is it?
Thanks for the feedback,
I was just trying to be consistent with the rest of the file. I am not
currently using kernel-doc.
Maybe its worth it, in a subsequent patch, to convert the whole file
to kernel-doc notation?
Any volunteers?
Anna
>
> [not that I think that should prevent the patch from going in, at this
> point, since I don't think the file is read by kernel-doc anyway]
>
> johannes
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] libertas: Improvements on automatic tx power control via SIOCSIWTXPOW.
2008-09-11 18:56 ` Anna Neal
@ 2008-09-11 19:12 ` Johannes Berg
0 siblings, 0 replies; 16+ messages in thread
From: Johannes Berg @ 2008-09-11 19:12 UTC (permalink / raw)
To: Anna Neal; +Cc: linux-wireless, libertas-dev
[-- Attachment #1: Type: text/plain, Size: 477 bytes --]
On Thu, 2008-09-11 at 11:56 -0700, Anna Neal wrote:
> I was just trying to be consistent with the rest of the file. I am not
> currently using kernel-doc.
Oh ok, I hadn't actually checked the rest of the file.
> Maybe its worth it, in a subsequent patch, to convert the whole file
> to kernel-doc notation?
Possibly, if accompanied by hooking it into the kernel-doc system int
Documentation/DocBook/ too.
> Any volunteers?
Not me right now :)
johannes
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 836 bytes --]
^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH] libertas: Improvements on automatic tx power control via SIOCSIWTXPOW.
2008-09-11 18:17 Anna Neal
2008-09-11 18:37 ` Johannes Berg
@ 2008-09-15 5:44 ` Dan Williams
2008-09-17 18:23 ` Anna Neal
1 sibling, 1 reply; 16+ messages in thread
From: Dan Williams @ 2008-09-15 5:44 UTC (permalink / raw)
To: Anna Neal; +Cc: linux-wireless, libertas-dev
On Thu, 2008-09-11 at 11:17 -0700, Anna Neal wrote:
> iwconfig txpower can now be used to set tx power to fixed or auto. If set to
> auto the default firmware settings are used.
>
> The command CMD_802_11_PA_CFG is only sent to older firmware, as Dan Williams
> noted the command was no longer supported in firmware V9+.
Updated patch looks ok, but two last questions... (see below)
> Signed-off-by: Anna Neal <anna@cozybit.com>
> Signed-off-by: Javier Cardona <javier@cozybit.com>
> ---
> drivers/net/wireless/libertas/cmd.c | 64 +++++++++++++++++++++++++++++++
> drivers/net/wireless/libertas/cmd.h | 6 +++
> drivers/net/wireless/libertas/defs.h | 9 ++++
> drivers/net/wireless/libertas/host.h | 1 +
> drivers/net/wireless/libertas/hostcmd.h | 24 +++++++++--
> drivers/net/wireless/libertas/wext.c | 31 ++++++++++++++-
> 6 files changed, 128 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
> index 802547e..5fef05f 100644
> --- a/drivers/net/wireless/libertas/cmd.c
> +++ b/drivers/net/wireless/libertas/cmd.c
> @@ -1971,6 +1971,70 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv)
> }
>
>
> +/**
> + * @brief Configures the transmission power control functionality.
> + *
> + * @param priv A pointer to struct lbs_private structure
> + * @param enable Transmission power control enable
> + * @param p0 Power level when link quality is good (dBm).
> + * @param p1 Power level when link quality is fair (dBm).
> + * @param p2 Power level when link quality is poor (dBm).
> + * @param usesnr Use Signal to Noise Ratio in TPC
> + *
> + * @return 0 on success
> + */
> +int lbs_set_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
> + int8_t p2, int usesnr)
> +{
> + struct cmd_ds_802_11_tpc_cfg cmd;
> + int ret;
> +
> + memset(&cmd, 0, sizeof(cmd));
> + cmd.hdr.size = cpu_to_le16(sizeof(cmd));
> + cmd.action = cpu_to_le16(CMD_ACT_SET);
> + cmd.enable = !!enable;
> + cmd.usesnr = !!enable;
Hmm, do you mean !!usesnr here instead of !!enable? Otherwise the
usesnr parameter goes unused and you can remove it from the parameter
list. But I think you probably meant to use it :)
> + cmd.P0 = p0;
> + cmd.P1 = p1;
> + cmd.P2 = p2;
> +
> + ret = lbs_cmd_with_response(priv, CMD_802_11_TPC_CFG, &cmd);
> +
> + return ret;
> +}
> +
> +/**
> + * @brief Configures the power adaptation settings.
> + *
> + * @param priv A pointer to struct lbs_private structure
> + * @param enable Power adaptation enable
> + * @param p0 Power level for 1, 2, 5.5 and 11 Mbps (dBm).
> + * @param p1 Power level for 6, 9, 12, 18, 22, 24 and 36 Mbps (dBm).
> + * @param p2 Power level for 48 and 54 Mbps (dBm).
> + *
> + * @return 0 on Success
> + */
> +
> +int lbs_set_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
> + int8_t p1, int8_t p2)
> +{
> + struct cmd_ds_802_11_pa_cfg cmd;
> + int ret;
> +
> + memset(&cmd, 0, sizeof(cmd));
> + cmd.hdr.size = cpu_to_le16(sizeof(cmd));
> + cmd.action = cpu_to_le16(CMD_ACT_SET);
> + cmd.enable = !!enable;
> + cmd.P0 = p0;
> + cmd.P1 = p1;
> + cmd.P2 = p2;
> +
> + ret = lbs_cmd_with_response(priv, CMD_802_11_PA_CFG , &cmd);
> +
> + return ret;
> +}
> +
> +
> static struct cmd_ctrl_node *__lbs_cmd_async(struct lbs_private *priv,
> uint16_t command, struct cmd_header *in_cmd, int in_cmd_size,
> int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
> diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
> index 11ac996..336a181 100644
> --- a/drivers/net/wireless/libertas/cmd.h
> +++ b/drivers/net/wireless/libertas/cmd.h
> @@ -26,6 +26,12 @@ int __lbs_cmd(struct lbs_private *priv, uint16_t command,
> int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
> unsigned long callback_arg);
>
> +int lbs_set_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
> + int8_t p1, int8_t p2);
> +
> +int lbs_set_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
> + int8_t p2, int usesnr);
> +
> int lbs_cmd_copyback(struct lbs_private *priv, unsigned long extra,
> struct cmd_header *resp);
>
> diff --git a/drivers/net/wireless/libertas/defs.h b/drivers/net/wireless/libertas/defs.h
> index 4b2428a..c89d7a1 100644
> --- a/drivers/net/wireless/libertas/defs.h
> +++ b/drivers/net/wireless/libertas/defs.h
> @@ -189,6 +189,15 @@ static inline void lbs_deb_hex(unsigned int grp, const char *prompt, u8 *buf, in
> #define MRVDRV_CMD_UPLD_RDY 0x0008
> #define MRVDRV_CARDEVENT 0x0010
>
> +
> +/* Automatic TX control default levels */
> +#define POW_ADAPT_DEFAULT_P0 13
> +#define POW_ADAPT_DEFAULT_P1 15
> +#define POW_ADAPT_DEFAULT_P2 18
> +#define TPC_DEFAULT_P0 5
> +#define TPC_DEFAULT_P1 10
> +#define TPC_DEFAULT_P2 13
> +
> /** TxPD status */
>
> /* Station firmware use TxPD status field to report final Tx transmit
> diff --git a/drivers/net/wireless/libertas/host.h b/drivers/net/wireless/libertas/host.h
> index da618fc..a916bb9 100644
> --- a/drivers/net/wireless/libertas/host.h
> +++ b/drivers/net/wireless/libertas/host.h
> @@ -83,6 +83,7 @@
> #define CMD_802_11_INACTIVITY_TIMEOUT 0x0067
> #define CMD_802_11_SLEEP_PERIOD 0x0068
> #define CMD_802_11_TPC_CFG 0x0072
> +#define CMD_802_11_PA_CFG 0x0073
> #define CMD_802_11_FW_WAKE_METHOD 0x0074
> #define CMD_802_11_SUBSCRIBE_EVENT 0x0075
> #define CMD_802_11_RATE_ADAPT_RATESET 0x0076
> diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
> index d27c276..630b799 100644
> --- a/drivers/net/wireless/libertas/hostcmd.h
> +++ b/drivers/net/wireless/libertas/hostcmd.h
> @@ -607,14 +607,28 @@ struct cmd_ds_802_11_eeprom_access {
> } __attribute__ ((packed));
>
> struct cmd_ds_802_11_tpc_cfg {
> + struct cmd_header hdr;
> +
> __le16 action;
> - u8 enable;
> - s8 P0;
> - s8 P1;
> - s8 P2;
> - u8 usesnr;
> + uint8_t enable;
> + int8_t P0;
> + int8_t P1;
> + int8_t P2;
> + uint8_t usesnr;
> } __attribute__ ((packed));
>
> +
> +struct cmd_ds_802_11_pa_cfg {
> + struct cmd_header hdr;
> +
> + __le16 action;
> + uint8_t enable;
> + int8_t P0;
> + int8_t P1;
> + int8_t P2;
> +} __attribute__ ((packed));
> +
> +
> struct cmd_ds_802_11_led_ctrl {
> __le16 action;
> __le16 numled;
> diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c
> index 426f1fe..e8cadad 100644
> --- a/drivers/net/wireless/libertas/wext.c
> +++ b/drivers/net/wireless/libertas/wext.c
> @@ -1820,7 +1820,21 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
> }
>
> if (vwrq->fixed == 0) {
> - /* Auto power control */
> + /* User requests automatic tx power control, however there are
> + * many auto tx settings. For now use firmware defaults until
> + * we come up with a good way to expose these to the user. */
> + if (priv->fwrelease < 0x09000000) {
> + ret = lbs_set_power_adapt_cfg(priv, 1,
> + POW_ADAPT_DEFAULT_P0,
> + POW_ADAPT_DEFAULT_P1,
> + POW_ADAPT_DEFAULT_P2);
> + if (ret)
> + goto out;
> + }
> + ret = lbs_set_tpc_cfg(priv, 0, TPC_DEFAULT_P0, TPC_DEFAULT_P1,
Did you mean to disable TPC here when the user specified "auto" power
control? This would mean that PA gets used at every rate and TPC is
disabled, while enabling TPC here would mean TPC gets used at the
highest rate, and PA gets used at all other rates. What was your intent
here? If you really mean to use '0' here to disable TPC, you might want
to put the rationale in a comment.
Thanks!
Dan
> + TPC_DEFAULT_P2, 1);
> + if (ret)
> + goto out;
> dbm = priv->txpower_max;
> } else {
> /* Userspace check in iwrange if it should use dBm or mW,
> @@ -1830,7 +1844,8 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
> goto out;
> }
>
> - /* Validate requested power level against firmware allowed levels */
> + /* Validate requested power level against firmware allowed
> + * levels */
> if (priv->txpower_min && (dbm < priv->txpower_min)) {
> ret = -EINVAL;
> goto out;
> @@ -1840,6 +1855,18 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
> ret = -EINVAL;
> goto out;
> }
> + if (priv->fwrelease < 0x09000000) {
> + ret = lbs_set_power_adapt_cfg(priv, 0,
> + POW_ADAPT_DEFAULT_P0,
> + POW_ADAPT_DEFAULT_P1,
> + POW_ADAPT_DEFAULT_P2);
> + if (ret)
> + goto out;
> + }
> + ret = lbs_set_tpc_cfg(priv, 0, TPC_DEFAULT_P0, TPC_DEFAULT_P1,
> + TPC_DEFAULT_P2, 1);
> + if (ret)
> + goto out;
> }
>
> /* If the radio was off, turn it on */
^ permalink raw reply [flat|nested] 16+ messages in thread* Re: [PATCH] libertas: Improvements on automatic tx power control via SIOCSIWTXPOW.
2008-09-15 5:44 ` Dan Williams
@ 2008-09-17 18:23 ` Anna Neal
0 siblings, 0 replies; 16+ messages in thread
From: Anna Neal @ 2008-09-17 18:23 UTC (permalink / raw)
To: Dan Williams; +Cc: linux-wireless, libertas-dev
On Sun, Sep 14, 2008 at 10:44 PM, Dan Williams <dcbw@redhat.com> wrote:
> On Thu, 2008-09-11 at 11:17 -0700, Anna Neal wrote:
>> iwconfig txpower can now be used to set tx power to fixed or auto. If set to
>> auto the default firmware settings are used.
>>
>> The command CMD_802_11_PA_CFG is only sent to older firmware, as Dan Williams
>> noted the command was no longer supported in firmware V9+.
>
> Updated patch looks ok, but two last questions... (see below)
>
>> Signed-off-by: Anna Neal <anna@cozybit.com>
>> Signed-off-by: Javier Cardona <javier@cozybit.com>
>> ---
>> drivers/net/wireless/libertas/cmd.c | 64 +++++++++++++++++++++++++++++++
>> drivers/net/wireless/libertas/cmd.h | 6 +++
>> drivers/net/wireless/libertas/defs.h | 9 ++++
>> drivers/net/wireless/libertas/host.h | 1 +
>> drivers/net/wireless/libertas/hostcmd.h | 24 +++++++++--
>> drivers/net/wireless/libertas/wext.c | 31 ++++++++++++++-
>> 6 files changed, 128 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
>> index 802547e..5fef05f 100644
>> --- a/drivers/net/wireless/libertas/cmd.c
>> +++ b/drivers/net/wireless/libertas/cmd.c
>> @@ -1971,6 +1971,70 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv)
>> }
>>
>>
>> +/**
>> + * @brief Configures the transmission power control functionality.
>> + *
>> + * @param priv A pointer to struct lbs_private structure
>> + * @param enable Transmission power control enable
>> + * @param p0 Power level when link quality is good (dBm).
>> + * @param p1 Power level when link quality is fair (dBm).
>> + * @param p2 Power level when link quality is poor (dBm).
>> + * @param usesnr Use Signal to Noise Ratio in TPC
>> + *
>> + * @return 0 on success
>> + */
>> +int lbs_set_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
>> + int8_t p2, int usesnr)
>> +{
>> + struct cmd_ds_802_11_tpc_cfg cmd;
>> + int ret;
>> +
>> + memset(&cmd, 0, sizeof(cmd));
>> + cmd.hdr.size = cpu_to_le16(sizeof(cmd));
>> + cmd.action = cpu_to_le16(CMD_ACT_SET);
>> + cmd.enable = !!enable;
>> + cmd.usesnr = !!enable;
>
> Hmm, do you mean !!usesnr here instead of !!enable? Otherwise the
> usesnr parameter goes unused and you can remove it from the parameter
> list. But I think you probably meant to use it :)
Sorry, yes I did, thanks for finding this. I will send an update soon.
>
>> + cmd.P0 = p0;
>> + cmd.P1 = p1;
>> + cmd.P2 = p2;
>> +
>> + ret = lbs_cmd_with_response(priv, CMD_802_11_TPC_CFG, &cmd);
>> +
>> + return ret;
>> +}
>> +
>> +/**
>> + * @brief Configures the power adaptation settings.
>> + *
>> + * @param priv A pointer to struct lbs_private structure
>> + * @param enable Power adaptation enable
>> + * @param p0 Power level for 1, 2, 5.5 and 11 Mbps (dBm).
>> + * @param p1 Power level for 6, 9, 12, 18, 22, 24 and 36 Mbps (dBm).
>> + * @param p2 Power level for 48 and 54 Mbps (dBm).
>> + *
>> + * @return 0 on Success
>> + */
>> +
>> +int lbs_set_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
>> + int8_t p1, int8_t p2)
>> +{
>> + struct cmd_ds_802_11_pa_cfg cmd;
>> + int ret;
>> +
>> + memset(&cmd, 0, sizeof(cmd));
>> + cmd.hdr.size = cpu_to_le16(sizeof(cmd));
>> + cmd.action = cpu_to_le16(CMD_ACT_SET);
>> + cmd.enable = !!enable;
>> + cmd.P0 = p0;
>> + cmd.P1 = p1;
>> + cmd.P2 = p2;
>> +
>> + ret = lbs_cmd_with_response(priv, CMD_802_11_PA_CFG , &cmd);
>> +
>> + return ret;
>> +}
>> +
>> +
>> static struct cmd_ctrl_node *__lbs_cmd_async(struct lbs_private *priv,
>> uint16_t command, struct cmd_header *in_cmd, int in_cmd_size,
>> int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
>> diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
>> index 11ac996..336a181 100644
>> --- a/drivers/net/wireless/libertas/cmd.h
>> +++ b/drivers/net/wireless/libertas/cmd.h
>> @@ -26,6 +26,12 @@ int __lbs_cmd(struct lbs_private *priv, uint16_t command,
>> int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
>> unsigned long callback_arg);
>>
>> +int lbs_set_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
>> + int8_t p1, int8_t p2);
>> +
>> +int lbs_set_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
>> + int8_t p2, int usesnr);
>> +
>> int lbs_cmd_copyback(struct lbs_private *priv, unsigned long extra,
>> struct cmd_header *resp);
>>
>> diff --git a/drivers/net/wireless/libertas/defs.h b/drivers/net/wireless/libertas/defs.h
>> index 4b2428a..c89d7a1 100644
>> --- a/drivers/net/wireless/libertas/defs.h
>> +++ b/drivers/net/wireless/libertas/defs.h
>> @@ -189,6 +189,15 @@ static inline void lbs_deb_hex(unsigned int grp, const char *prompt, u8 *buf, in
>> #define MRVDRV_CMD_UPLD_RDY 0x0008
>> #define MRVDRV_CARDEVENT 0x0010
>>
>> +
>> +/* Automatic TX control default levels */
>> +#define POW_ADAPT_DEFAULT_P0 13
>> +#define POW_ADAPT_DEFAULT_P1 15
>> +#define POW_ADAPT_DEFAULT_P2 18
>> +#define TPC_DEFAULT_P0 5
>> +#define TPC_DEFAULT_P1 10
>> +#define TPC_DEFAULT_P2 13
>> +
>> /** TxPD status */
>>
>> /* Station firmware use TxPD status field to report final Tx transmit
>> diff --git a/drivers/net/wireless/libertas/host.h b/drivers/net/wireless/libertas/host.h
>> index da618fc..a916bb9 100644
>> --- a/drivers/net/wireless/libertas/host.h
>> +++ b/drivers/net/wireless/libertas/host.h
>> @@ -83,6 +83,7 @@
>> #define CMD_802_11_INACTIVITY_TIMEOUT 0x0067
>> #define CMD_802_11_SLEEP_PERIOD 0x0068
>> #define CMD_802_11_TPC_CFG 0x0072
>> +#define CMD_802_11_PA_CFG 0x0073
>> #define CMD_802_11_FW_WAKE_METHOD 0x0074
>> #define CMD_802_11_SUBSCRIBE_EVENT 0x0075
>> #define CMD_802_11_RATE_ADAPT_RATESET 0x0076
>> diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h
>> index d27c276..630b799 100644
>> --- a/drivers/net/wireless/libertas/hostcmd.h
>> +++ b/drivers/net/wireless/libertas/hostcmd.h
>> @@ -607,14 +607,28 @@ struct cmd_ds_802_11_eeprom_access {
>> } __attribute__ ((packed));
>>
>> struct cmd_ds_802_11_tpc_cfg {
>> + struct cmd_header hdr;
>> +
>> __le16 action;
>> - u8 enable;
>> - s8 P0;
>> - s8 P1;
>> - s8 P2;
>> - u8 usesnr;
>> + uint8_t enable;
>> + int8_t P0;
>> + int8_t P1;
>> + int8_t P2;
>> + uint8_t usesnr;
>> } __attribute__ ((packed));
>>
>> +
>> +struct cmd_ds_802_11_pa_cfg {
>> + struct cmd_header hdr;
>> +
>> + __le16 action;
>> + uint8_t enable;
>> + int8_t P0;
>> + int8_t P1;
>> + int8_t P2;
>> +} __attribute__ ((packed));
>> +
>> +
>> struct cmd_ds_802_11_led_ctrl {
>> __le16 action;
>> __le16 numled;
>> diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c
>> index 426f1fe..e8cadad 100644
>> --- a/drivers/net/wireless/libertas/wext.c
>> +++ b/drivers/net/wireless/libertas/wext.c
>> @@ -1820,7 +1820,21 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
>> }
>>
>> if (vwrq->fixed == 0) {
>> - /* Auto power control */
>> + /* User requests automatic tx power control, however there are
>> + * many auto tx settings. For now use firmware defaults until
>> + * we come up with a good way to expose these to the user. */
>> + if (priv->fwrelease < 0x09000000) {
>> + ret = lbs_set_power_adapt_cfg(priv, 1,
>> + POW_ADAPT_DEFAULT_P0,
>> + POW_ADAPT_DEFAULT_P1,
>> + POW_ADAPT_DEFAULT_P2);
>> + if (ret)
>> + goto out;
>> + }
>> + ret = lbs_set_tpc_cfg(priv, 0, TPC_DEFAULT_P0, TPC_DEFAULT_P1,
>
> Did you mean to disable TPC here when the user specified "auto" power
> control? This would mean that PA gets used at every rate and TPC is
> disabled, while enabling TPC here would mean TPC gets used at the
> highest rate, and PA gets used at all other rates. What was your intent
> here? If you really mean to use '0' here to disable TPC, you might want
> to put the rationale in a comment.
My rationale for this was to keep the default functionality until we
could devise a way to control the PA and TPC functionality more
elegantly. I will add this to a comment like you suggest.
Thanks,
Anna
>
> Thanks!
> Dan
>
>> + TPC_DEFAULT_P2, 1);
>> + if (ret)
>> + goto out;
>> dbm = priv->txpower_max;
>> } else {
>> /* Userspace check in iwrange if it should use dBm or mW,
>> @@ -1830,7 +1844,8 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
>> goto out;
>> }
>>
>> - /* Validate requested power level against firmware allowed levels */
>> + /* Validate requested power level against firmware allowed
>> + * levels */
>> if (priv->txpower_min && (dbm < priv->txpower_min)) {
>> ret = -EINVAL;
>> goto out;
>> @@ -1840,6 +1855,18 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
>> ret = -EINVAL;
>> goto out;
>> }
>> + if (priv->fwrelease < 0x09000000) {
>> + ret = lbs_set_power_adapt_cfg(priv, 0,
>> + POW_ADAPT_DEFAULT_P0,
>> + POW_ADAPT_DEFAULT_P1,
>> + POW_ADAPT_DEFAULT_P2);
>> + if (ret)
>> + goto out;
>> + }
>> + ret = lbs_set_tpc_cfg(priv, 0, TPC_DEFAULT_P0, TPC_DEFAULT_P1,
>> + TPC_DEFAULT_P2, 1);
>> + if (ret)
>> + goto out;
>> }
>>
>> /* If the radio was off, turn it on */
>
>
^ permalink raw reply [flat|nested] 16+ messages in thread
* [PATCH] libertas: Improvements on automatic tx power control via SIOCSIWTXPOW.
@ 2008-09-10 23:45 Anna Neal
2008-09-11 15:34 ` Dan Williams
0 siblings, 1 reply; 16+ messages in thread
From: Anna Neal @ 2008-09-10 23:45 UTC (permalink / raw)
To: linux-wireless; +Cc: libertas-dev
Improved the tx power control configuration per Dan Williams suggestions. Added
a firmware version check because the current implementation will only work for
below version 9.
Signed-off-by: Anna Neal <anna@cozybit.com>
---
drivers/net/wireless/libertas/cmd.c | 4 +-
drivers/net/wireless/libertas/cmd.h | 4 +-
drivers/net/wireless/libertas/wext.c | 44 +++++++++++++++++++++------------
3 files changed, 32 insertions(+), 20 deletions(-)
diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
index 6cc4858..5fef05f 100644
--- a/drivers/net/wireless/libertas/cmd.c
+++ b/drivers/net/wireless/libertas/cmd.c
@@ -1983,7 +1983,7 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv)
*
* @return 0 on success
*/
-int lbs_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
+int lbs_set_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
int8_t p2, int usesnr)
{
struct cmd_ds_802_11_tpc_cfg cmd;
@@ -2015,7 +2015,7 @@ int lbs_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
* @return 0 on Success
*/
-int lbs_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
+int lbs_set_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
int8_t p1, int8_t p2)
{
struct cmd_ds_802_11_pa_cfg cmd;
diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
index 77bd070..336a181 100644
--- a/drivers/net/wireless/libertas/cmd.h
+++ b/drivers/net/wireless/libertas/cmd.h
@@ -26,10 +26,10 @@ int __lbs_cmd(struct lbs_private *priv, uint16_t command,
int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
unsigned long callback_arg);
-int lbs_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
+int lbs_set_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
int8_t p1, int8_t p2);
-int lbs_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
+int lbs_set_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
int8_t p2, int usesnr);
int lbs_cmd_copyback(struct lbs_private *priv, unsigned long extra,
diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c
index b08bad8..8a81aca 100644
--- a/drivers/net/wireless/libertas/wext.c
+++ b/drivers/net/wireless/libertas/wext.c
@@ -1823,14 +1823,20 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
/* User requests automatic tx power control, however there are
* many auto tx settings. For now use firmware defaults until
* we come up with a good way to expose these to the user. */
- ret = lbs_power_adapt_cfg(priv, 1, POW_ADAPT_DEFAULT_P0,
- POW_ADAPT_DEFAULT_P1, POW_ADAPT_DEFAULT_P2);
- if (ret)
- goto out;
- ret = lbs_tpc_cfg(priv, 0, TPC_DEFAULT_P0, TPC_DEFAULT_P1,
- TPC_DEFAULT_P2, 1);
- if (ret)
- goto out;
+ if (priv->fwrelease < 0x09000000) {
+ ret = lbs_set_power_adapt_cfg(priv, 1,
+ POW_ADAPT_DEFAULT_P0,
+ POW_ADAPT_DEFAULT_P1,
+ POW_ADAPT_DEFAULT_P2);
+ if (ret)
+ goto out;
+ ret = lbs_set_tpc_cfg(priv, 0,
+ TPC_DEFAULT_P0,
+ TPC_DEFAULT_P1,
+ TPC_DEFAULT_P2, 1);
+ if (ret)
+ goto out;
+ }
dbm = priv->txpower_max;
} else {
/* Userspace check in iwrange if it should use dBm or mW,
@@ -1851,14 +1857,20 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
ret = -EINVAL;
goto out;
}
- ret = lbs_power_adapt_cfg(priv, 0, POW_ADAPT_DEFAULT_P0,
- POW_ADAPT_DEFAULT_P1, POW_ADAPT_DEFAULT_P2);
- if (ret)
- goto out;
- ret = lbs_tpc_cfg(priv, 0, TPC_DEFAULT_P0, TPC_DEFAULT_P1,
- TPC_DEFAULT_P2, 1);
- if (ret)
- goto out;
+ if (priv->fwrelease < 0x09000000) {
+ ret = lbs_set_power_adapt_cfg(priv, 0,
+ POW_ADAPT_DEFAULT_P0,
+ POW_ADAPT_DEFAULT_P1,
+ POW_ADAPT_DEFAULT_P2);
+ if (ret)
+ goto out;
+ ret = lbs_set_tpc_cfg(priv, 0,
+ TPC_DEFAULT_P0,
+ TPC_DEFAULT_P1,
+ TPC_DEFAULT_P2, 1);
+ if (ret)
+ goto out;
+ }
}
/* If the radio was off, turn it on */
--
1.5.4.3
^ permalink raw reply related [flat|nested] 16+ messages in thread* Re: [PATCH] libertas: Improvements on automatic tx power control via SIOCSIWTXPOW.
2008-09-10 23:45 Anna Neal
@ 2008-09-11 15:34 ` Dan Williams
2008-09-11 17:03 ` Anna Neal
0 siblings, 1 reply; 16+ messages in thread
From: Dan Williams @ 2008-09-11 15:34 UTC (permalink / raw)
To: Anna Neal; +Cc: linux-wireless, libertas-dev
On Wed, 2008-09-10 at 16:45 -0700, Anna Neal wrote:
> Improved the tx power control configuration per Dan Williams suggestions. Added
> a firmware version check because the current implementation will only work for
> below version 9.
>
> Signed-off-by: Anna Neal <anna@cozybit.com>
One more round, sorry! :)
First, until the patch has actually been applied, could you post
complete diffs? This is a patch against the previous patch, but it's
best to keep the whole patch together until it's committed by John to
the master wireless tree.
Second, since you get to respin the patch anyway for this, the TPC
Config stuff should be just fine on V9+ firmware, only the
POWER_ADAPT_CFG command is incompatible on V9+. I probably wasn't clear
enough about this yesterday. Any chance you could move the TPC config
commands out of the firmware check and just the PACFG ones < V9?
Thanks!
Dan
> ---
> drivers/net/wireless/libertas/cmd.c | 4 +-
> drivers/net/wireless/libertas/cmd.h | 4 +-
> drivers/net/wireless/libertas/wext.c | 44 +++++++++++++++++++++------------
> 3 files changed, 32 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
> index 6cc4858..5fef05f 100644
> --- a/drivers/net/wireless/libertas/cmd.c
> +++ b/drivers/net/wireless/libertas/cmd.c
> @@ -1983,7 +1983,7 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv)
> *
> * @return 0 on success
> */
> -int lbs_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
> +int lbs_set_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
> int8_t p2, int usesnr)
> {
> struct cmd_ds_802_11_tpc_cfg cmd;
> @@ -2015,7 +2015,7 @@ int lbs_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
> * @return 0 on Success
> */
>
> -int lbs_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
> +int lbs_set_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
> int8_t p1, int8_t p2)
> {
> struct cmd_ds_802_11_pa_cfg cmd;
> diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
> index 77bd070..336a181 100644
> --- a/drivers/net/wireless/libertas/cmd.h
> +++ b/drivers/net/wireless/libertas/cmd.h
> @@ -26,10 +26,10 @@ int __lbs_cmd(struct lbs_private *priv, uint16_t command,
> int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
> unsigned long callback_arg);
>
> -int lbs_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
> +int lbs_set_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
> int8_t p1, int8_t p2);
>
> -int lbs_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
> +int lbs_set_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
> int8_t p2, int usesnr);
>
> int lbs_cmd_copyback(struct lbs_private *priv, unsigned long extra,
> diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c
> index b08bad8..8a81aca 100644
> --- a/drivers/net/wireless/libertas/wext.c
> +++ b/drivers/net/wireless/libertas/wext.c
> @@ -1823,14 +1823,20 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
> /* User requests automatic tx power control, however there are
> * many auto tx settings. For now use firmware defaults until
> * we come up with a good way to expose these to the user. */
> - ret = lbs_power_adapt_cfg(priv, 1, POW_ADAPT_DEFAULT_P0,
> - POW_ADAPT_DEFAULT_P1, POW_ADAPT_DEFAULT_P2);
> - if (ret)
> - goto out;
> - ret = lbs_tpc_cfg(priv, 0, TPC_DEFAULT_P0, TPC_DEFAULT_P1,
> - TPC_DEFAULT_P2, 1);
> - if (ret)
> - goto out;
> + if (priv->fwrelease < 0x09000000) {
> + ret = lbs_set_power_adapt_cfg(priv, 1,
> + POW_ADAPT_DEFAULT_P0,
> + POW_ADAPT_DEFAULT_P1,
> + POW_ADAPT_DEFAULT_P2);
> + if (ret)
> + goto out;
> + ret = lbs_set_tpc_cfg(priv, 0,
> + TPC_DEFAULT_P0,
> + TPC_DEFAULT_P1,
> + TPC_DEFAULT_P2, 1);
> + if (ret)
> + goto out;
> + }
> dbm = priv->txpower_max;
> } else {
> /* Userspace check in iwrange if it should use dBm or mW,
> @@ -1851,14 +1857,20 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
> ret = -EINVAL;
> goto out;
> }
> - ret = lbs_power_adapt_cfg(priv, 0, POW_ADAPT_DEFAULT_P0,
> - POW_ADAPT_DEFAULT_P1, POW_ADAPT_DEFAULT_P2);
> - if (ret)
> - goto out;
> - ret = lbs_tpc_cfg(priv, 0, TPC_DEFAULT_P0, TPC_DEFAULT_P1,
> - TPC_DEFAULT_P2, 1);
> - if (ret)
> - goto out;
> + if (priv->fwrelease < 0x09000000) {
> + ret = lbs_set_power_adapt_cfg(priv, 0,
> + POW_ADAPT_DEFAULT_P0,
> + POW_ADAPT_DEFAULT_P1,
> + POW_ADAPT_DEFAULT_P2);
> + if (ret)
> + goto out;
> + ret = lbs_set_tpc_cfg(priv, 0,
> + TPC_DEFAULT_P0,
> + TPC_DEFAULT_P1,
> + TPC_DEFAULT_P2, 1);
> + if (ret)
> + goto out;
> + }
> }
>
> /* If the radio was off, turn it on */
^ permalink raw reply [flat|nested] 16+ messages in thread* Re: [PATCH] libertas: Improvements on automatic tx power control via SIOCSIWTXPOW.
2008-09-11 15:34 ` Dan Williams
@ 2008-09-11 17:03 ` Anna Neal
2008-09-11 17:13 ` Anna Neal
0 siblings, 1 reply; 16+ messages in thread
From: Anna Neal @ 2008-09-11 17:03 UTC (permalink / raw)
To: Dan Williams; +Cc: linux-wireless, libertas-dev
On Thu, Sep 11, 2008 at 8:34 AM, Dan Williams <dcbw@redhat.com> wrote:
> On Wed, 2008-09-10 at 16:45 -0700, Anna Neal wrote:
>> Improved the tx power control configuration per Dan Williams suggestions. Added
>> a firmware version check because the current implementation will only work for
>> below version 9.
>>
>> Signed-off-by: Anna Neal <anna@cozybit.com>
>
> One more round, sorry! :)
>
> First, until the patch has actually been applied, could you post
> complete diffs? This is a patch against the previous patch, but it's
> best to keep the whole patch together until it's committed by John to
> the master wireless tree.
>
> Second, since you get to respin the patch anyway for this, the TPC
> Config stuff should be just fine on V9+ firmware, only the
> POWER_ADAPT_CFG command is incompatible on V9+. I probably wasn't clear
> enough about this yesterday. Any chance you could move the TPC config
> commands out of the firmware check and just the PACFG ones < V9?
>
> Thanks!
> Dan
No problem, will send a new patch later today.
I just wanted to point out that it seems the original patch was
already committed by John.
Here is the link:
http://git.kernel.org/?p=linux/kernel/git/linville/wireless-testing.git;a=commith=cdd799f13e3a2a47b501286551ba9386e8936272
Thanks,
Anna
>
>> ---
>> drivers/net/wireless/libertas/cmd.c | 4 +-
>> drivers/net/wireless/libertas/cmd.h | 4 +-
>> drivers/net/wireless/libertas/wext.c | 44 +++++++++++++++++++++------------
>> 3 files changed, 32 insertions(+), 20 deletions(-)
>>
>> diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
>> index 6cc4858..5fef05f 100644
>> --- a/drivers/net/wireless/libertas/cmd.c
>> +++ b/drivers/net/wireless/libertas/cmd.c
>> @@ -1983,7 +1983,7 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv)
>> *
>> * @return 0 on success
>> */
>> -int lbs_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
>> +int lbs_set_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
>> int8_t p2, int usesnr)
>> {
>> struct cmd_ds_802_11_tpc_cfg cmd;
>> @@ -2015,7 +2015,7 @@ int lbs_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
>> * @return 0 on Success
>> */
>>
>> -int lbs_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
>> +int lbs_set_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
>> int8_t p1, int8_t p2)
>> {
>> struct cmd_ds_802_11_pa_cfg cmd;
>> diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
>> index 77bd070..336a181 100644
>> --- a/drivers/net/wireless/libertas/cmd.h
>> +++ b/drivers/net/wireless/libertas/cmd.h
>> @@ -26,10 +26,10 @@ int __lbs_cmd(struct lbs_private *priv, uint16_t command,
>> int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
>> unsigned long callback_arg);
>>
>> -int lbs_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
>> +int lbs_set_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
>> int8_t p1, int8_t p2);
>>
>> -int lbs_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
>> +int lbs_set_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
>> int8_t p2, int usesnr);
>>
>> int lbs_cmd_copyback(struct lbs_private *priv, unsigned long extra,
>> diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c
>> index b08bad8..8a81aca 100644
>> --- a/drivers/net/wireless/libertas/wext.c
>> +++ b/drivers/net/wireless/libertas/wext.c
>> @@ -1823,14 +1823,20 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
>> /* User requests automatic tx power control, however there are
>> * many auto tx settings. For now use firmware defaults until
>> * we come up with a good way to expose these to the user. */
>> - ret = lbs_power_adapt_cfg(priv, 1, POW_ADAPT_DEFAULT_P0,
>> - POW_ADAPT_DEFAULT_P1, POW_ADAPT_DEFAULT_P2);
>> - if (ret)
>> - goto out;
>> - ret = lbs_tpc_cfg(priv, 0, TPC_DEFAULT_P0, TPC_DEFAULT_P1,
>> - TPC_DEFAULT_P2, 1);
>> - if (ret)
>> - goto out;
>> + if (priv->fwrelease < 0x09000000) {
>> + ret = lbs_set_power_adapt_cfg(priv, 1,
>> + POW_ADAPT_DEFAULT_P0,
>> + POW_ADAPT_DEFAULT_P1,
>> + POW_ADAPT_DEFAULT_P2);
>> + if (ret)
>> + goto out;
>> + ret = lbs_set_tpc_cfg(priv, 0,
>> + TPC_DEFAULT_P0,
>> + TPC_DEFAULT_P1,
>> + TPC_DEFAULT_P2, 1);
>> + if (ret)
>> + goto out;
>> + }
>> dbm = priv->txpower_max;
>> } else {
>> /* Userspace check in iwrange if it should use dBm or mW,
>> @@ -1851,14 +1857,20 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
>> ret = -EINVAL;
>> goto out;
>> }
>> - ret = lbs_power_adapt_cfg(priv, 0, POW_ADAPT_DEFAULT_P0,
>> - POW_ADAPT_DEFAULT_P1, POW_ADAPT_DEFAULT_P2);
>> - if (ret)
>> - goto out;
>> - ret = lbs_tpc_cfg(priv, 0, TPC_DEFAULT_P0, TPC_DEFAULT_P1,
>> - TPC_DEFAULT_P2, 1);
>> - if (ret)
>> - goto out;
>> + if (priv->fwrelease < 0x09000000) {
>> + ret = lbs_set_power_adapt_cfg(priv, 0,
>> + POW_ADAPT_DEFAULT_P0,
>> + POW_ADAPT_DEFAULT_P1,
>> + POW_ADAPT_DEFAULT_P2);
>> + if (ret)
>> + goto out;
>> + ret = lbs_set_tpc_cfg(priv, 0,
>> + TPC_DEFAULT_P0,
>> + TPC_DEFAULT_P1,
>> + TPC_DEFAULT_P2, 1);
>> + if (ret)
>> + goto out;
>> + }
>> }
>>
>> /* If the radio was off, turn it on */
>
>
^ permalink raw reply [flat|nested] 16+ messages in thread* Re: [PATCH] libertas: Improvements on automatic tx power control via SIOCSIWTXPOW.
2008-09-11 17:03 ` Anna Neal
@ 2008-09-11 17:13 ` Anna Neal
2008-09-11 17:24 ` John W. Linville
0 siblings, 1 reply; 16+ messages in thread
From: Anna Neal @ 2008-09-11 17:13 UTC (permalink / raw)
To: Dan Williams; +Cc: linux-wireless, libertas-dev
On Thu, Sep 11, 2008 at 10:03 AM, Anna Neal <anna@cozybit.com> wrote:
> On Thu, Sep 11, 2008 at 8:34 AM, Dan Williams <dcbw@redhat.com> wrote:
>> On Wed, 2008-09-10 at 16:45 -0700, Anna Neal wrote:
>>> Improved the tx power control configuration per Dan Williams suggestions. Added
>>> a firmware version check because the current implementation will only work for
>>> below version 9.
>>>
>>> Signed-off-by: Anna Neal <anna@cozybit.com>
>>
>> One more round, sorry! :)
>>
>> First, until the patch has actually been applied, could you post
>> complete diffs? This is a patch against the previous patch, but it's
>> best to keep the whole patch together until it's committed by John to
>> the master wireless tree.
>>
>> Second, since you get to respin the patch anyway for this, the TPC
>> Config stuff should be just fine on V9+ firmware, only the
>> POWER_ADAPT_CFG command is incompatible on V9+. I probably wasn't clear
>> enough about this yesterday. Any chance you could move the TPC config
>> commands out of the firmware check and just the PACFG ones < V9?
>>
>> Thanks!
>> Dan
>
> No problem, will send a new patch later today.
>
> I just wanted to point out that it seems the original patch was
> already committed by John.
>
> Here is the link:
> http://git.kernel.org/?p=linux/kernel/git/linville/wireless-testing.git;a=commith=cdd799f13e3a2a47b501286551ba9386e8936272
>
> Thanks,
> Anna
I'm sorry, I sent a bad link.
Here is a good one.
http://git.kernel.org/?p=linux/kernel/git/linville/wireless-testing.git;a=commit&h=cdd799f13e3a2a47b501286551ba9386e8936272
Thanks,
Anna
>
>>
>>> ---
>>> drivers/net/wireless/libertas/cmd.c | 4 +-
>>> drivers/net/wireless/libertas/cmd.h | 4 +-
>>> drivers/net/wireless/libertas/wext.c | 44 +++++++++++++++++++++------------
>>> 3 files changed, 32 insertions(+), 20 deletions(-)
>>>
>>> diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c
>>> index 6cc4858..5fef05f 100644
>>> --- a/drivers/net/wireless/libertas/cmd.c
>>> +++ b/drivers/net/wireless/libertas/cmd.c
>>> @@ -1983,7 +1983,7 @@ void lbs_ps_confirm_sleep(struct lbs_private *priv)
>>> *
>>> * @return 0 on success
>>> */
>>> -int lbs_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
>>> +int lbs_set_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
>>> int8_t p2, int usesnr)
>>> {
>>> struct cmd_ds_802_11_tpc_cfg cmd;
>>> @@ -2015,7 +2015,7 @@ int lbs_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
>>> * @return 0 on Success
>>> */
>>>
>>> -int lbs_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
>>> +int lbs_set_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
>>> int8_t p1, int8_t p2)
>>> {
>>> struct cmd_ds_802_11_pa_cfg cmd;
>>> diff --git a/drivers/net/wireless/libertas/cmd.h b/drivers/net/wireless/libertas/cmd.h
>>> index 77bd070..336a181 100644
>>> --- a/drivers/net/wireless/libertas/cmd.h
>>> +++ b/drivers/net/wireless/libertas/cmd.h
>>> @@ -26,10 +26,10 @@ int __lbs_cmd(struct lbs_private *priv, uint16_t command,
>>> int (*callback)(struct lbs_private *, unsigned long, struct cmd_header *),
>>> unsigned long callback_arg);
>>>
>>> -int lbs_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
>>> +int lbs_set_power_adapt_cfg(struct lbs_private *priv, int enable, int8_t p0,
>>> int8_t p1, int8_t p2);
>>>
>>> -int lbs_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
>>> +int lbs_set_tpc_cfg(struct lbs_private *priv, int enable, int8_t p0, int8_t p1,
>>> int8_t p2, int usesnr);
>>>
>>> int lbs_cmd_copyback(struct lbs_private *priv, unsigned long extra,
>>> diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c
>>> index b08bad8..8a81aca 100644
>>> --- a/drivers/net/wireless/libertas/wext.c
>>> +++ b/drivers/net/wireless/libertas/wext.c
>>> @@ -1823,14 +1823,20 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
>>> /* User requests automatic tx power control, however there are
>>> * many auto tx settings. For now use firmware defaults until
>>> * we come up with a good way to expose these to the user. */
>>> - ret = lbs_power_adapt_cfg(priv, 1, POW_ADAPT_DEFAULT_P0,
>>> - POW_ADAPT_DEFAULT_P1, POW_ADAPT_DEFAULT_P2);
>>> - if (ret)
>>> - goto out;
>>> - ret = lbs_tpc_cfg(priv, 0, TPC_DEFAULT_P0, TPC_DEFAULT_P1,
>>> - TPC_DEFAULT_P2, 1);
>>> - if (ret)
>>> - goto out;
>>> + if (priv->fwrelease < 0x09000000) {
>>> + ret = lbs_set_power_adapt_cfg(priv, 1,
>>> + POW_ADAPT_DEFAULT_P0,
>>> + POW_ADAPT_DEFAULT_P1,
>>> + POW_ADAPT_DEFAULT_P2);
>>> + if (ret)
>>> + goto out;
>>> + ret = lbs_set_tpc_cfg(priv, 0,
>>> + TPC_DEFAULT_P0,
>>> + TPC_DEFAULT_P1,
>>> + TPC_DEFAULT_P2, 1);
>>> + if (ret)
>>> + goto out;
>>> + }
>>> dbm = priv->txpower_max;
>>> } else {
>>> /* Userspace check in iwrange if it should use dBm or mW,
>>> @@ -1851,14 +1857,20 @@ static int lbs_set_txpow(struct net_device *dev, struct iw_request_info *info,
>>> ret = -EINVAL;
>>> goto out;
>>> }
>>> - ret = lbs_power_adapt_cfg(priv, 0, POW_ADAPT_DEFAULT_P0,
>>> - POW_ADAPT_DEFAULT_P1, POW_ADAPT_DEFAULT_P2);
>>> - if (ret)
>>> - goto out;
>>> - ret = lbs_tpc_cfg(priv, 0, TPC_DEFAULT_P0, TPC_DEFAULT_P1,
>>> - TPC_DEFAULT_P2, 1);
>>> - if (ret)
>>> - goto out;
>>> + if (priv->fwrelease < 0x09000000) {
>>> + ret = lbs_set_power_adapt_cfg(priv, 0,
>>> + POW_ADAPT_DEFAULT_P0,
>>> + POW_ADAPT_DEFAULT_P1,
>>> + POW_ADAPT_DEFAULT_P2);
>>> + if (ret)
>>> + goto out;
>>> + ret = lbs_set_tpc_cfg(priv, 0,
>>> + TPC_DEFAULT_P0,
>>> + TPC_DEFAULT_P1,
>>> + TPC_DEFAULT_P2, 1);
>>> + if (ret)
>>> + goto out;
>>> + }
>>> }
>>>
>>> /* If the radio was off, turn it on */
>>
>>
>
^ permalink raw reply [flat|nested] 16+ messages in thread* Re: [PATCH] libertas: Improvements on automatic tx power control via SIOCSIWTXPOW.
2008-09-11 17:13 ` Anna Neal
@ 2008-09-11 17:24 ` John W. Linville
0 siblings, 0 replies; 16+ messages in thread
From: John W. Linville @ 2008-09-11 17:24 UTC (permalink / raw)
To: Anna Neal; +Cc: Dan Williams, linux-wireless, libertas-dev
On Thu, Sep 11, 2008 at 10:13:20AM -0700, Anna Neal wrote:
> On Thu, Sep 11, 2008 at 10:03 AM, Anna Neal <anna@cozybit.com> wrote:
> > On Thu, Sep 11, 2008 at 8:34 AM, Dan Williams <dcbw@redhat.com> wrote:
> >> On Wed, 2008-09-10 at 16:45 -0700, Anna Neal wrote:
> >>> Improved the tx power control configuration per Dan Williams suggestions. Added
> >>> a firmware version check because the current implementation will only work for
> >>> below version 9.
> >>>
> >>> Signed-off-by: Anna Neal <anna@cozybit.com>
> >>
> >> One more round, sorry! :)
> >>
> >> First, until the patch has actually been applied, could you post
> >> complete diffs? This is a patch against the previous patch, but it's
> >> best to keep the whole patch together until it's committed by John to
> >> the master wireless tree.
> >>
> >> Second, since you get to respin the patch anyway for this, the TPC
> >> Config stuff should be just fine on V9+ firmware, only the
> >> POWER_ADAPT_CFG command is incompatible on V9+. I probably wasn't clear
> >> enough about this yesterday. Any chance you could move the TPC config
> >> commands out of the firmware check and just the PACFG ones < V9?
> >>
> >> Thanks!
> >> Dan
> >
> > No problem, will send a new patch later today.
> >
> > I just wanted to point out that it seems the original patch was
> > already committed by John.
> >
> > Here is the link:
> > http://git.kernel.org/?p=linux/kernel/git/linville/wireless-testing.git;a=commith=cdd799f13e3a2a47b501286551ba9386e8936272
> >
> > Thanks,
> > Anna
>
> I'm sorry, I sent a bad link.
>
> Here is a good one.
>
> http://git.kernel.org/?p=linux/kernel/git/linville/wireless-testing.git;a=commit&h=cdd799f13e3a2a47b501286551ba9386e8936272
FWIW, it hasn't been sent to Dave M. yet -- it's only in
wireless-testing.
That said, I'm fine with either a whole new patch or the incremental
one. But if Dan wants a new one and you don't mind...
John
--
John W. Linville
linville@tuxdriver.com
^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2008-09-29 21:21 UTC | newest]
Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-09-25 23:19 [PATCH] libertas: Improvements on automatic tx power control via SIOCSIWTXPOW Anna Neal
2008-09-26 14:49 ` Dan Williams
2008-09-26 16:26 ` John W. Linville
2008-09-29 20:59 ` Dan Williams
2008-09-29 21:20 ` John W. Linville
-- strict thread matches above, loose matches on Subject: below --
2008-09-11 18:17 Anna Neal
2008-09-11 18:37 ` Johannes Berg
2008-09-11 18:56 ` Anna Neal
2008-09-11 19:12 ` Johannes Berg
2008-09-15 5:44 ` Dan Williams
2008-09-17 18:23 ` Anna Neal
2008-09-10 23:45 Anna Neal
2008-09-11 15:34 ` Dan Williams
2008-09-11 17:03 ` Anna Neal
2008-09-11 17:13 ` Anna Neal
2008-09-11 17:24 ` John W. Linville
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).