diff options
author | Zhu Yi <yi.zhu@intel.com> | 2007-09-26 23:27:42 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-10-10 19:53:26 -0400 |
commit | 98d7e09af513da19389128f23d49893b11de81fa (patch) | |
tree | 3d9d31a105de2b714c6a27e8a50e4b91411a2dc8 | |
parent | 1b696de23bb21b89f4a4c4fd6b12e26fe2cc4a37 (diff) |
[PATCH] iwlwifi: set fixed rate through debugfs
This patch adds fixed rate setting through debugfs
$ echo <rate_n_flags> > \
/sys/kernel/debug/ieee80211/phy<X>/stations/<mac>/rate_scale_table
Currently there is no way to turn to rate scaling working again.
Will be fixed in later.
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Zhu Yi <yi.zhu@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-4965-rs.c | 72 |
1 files changed, 70 insertions, 2 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965-rs.c b/drivers/net/wireless/iwlwifi/iwl-4965-rs.c index c4b8ca128495..e5f8cce443ba 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965-rs.c | |||
@@ -123,7 +123,9 @@ struct iwl_rate_scale_priv { | |||
123 | struct iwl_link_quality_cmd lq; | 123 | struct iwl_link_quality_cmd lq; |
124 | struct iwl_scale_tbl_info lq_info[LQ_SIZE]; | 124 | struct iwl_scale_tbl_info lq_info[LQ_SIZE]; |
125 | #ifdef CONFIG_MAC80211_DEBUGFS | 125 | #ifdef CONFIG_MAC80211_DEBUGFS |
126 | struct dentry *rs_sta_dbgfs_scale_table_file; | 126 | struct dentry *rs_sta_dbgfs_scale_table_file; |
127 | struct iwl_rate dbg_fixed; | ||
128 | struct iwl_priv *drv; | ||
127 | #endif | 129 | #endif |
128 | }; | 130 | }; |
129 | 131 | ||
@@ -136,6 +138,14 @@ static void rs_fill_link_cmd(struct iwl_rate_scale_priv *lq_data, | |||
136 | struct iwl_link_quality_cmd *tbl); | 138 | struct iwl_link_quality_cmd *tbl); |
137 | 139 | ||
138 | 140 | ||
141 | #ifdef CONFIG_MAC80211_DEBUGFS | ||
142 | static void rs_dbgfs_set_mcs(struct iwl_rate_scale_priv *rs_priv, | ||
143 | struct iwl_rate *mcs, int index); | ||
144 | #else | ||
145 | static void rs_dbgfs_set_mcs(struct iwl_rate_scale_priv *rs_priv, | ||
146 | struct iwl_rate *mcs, int index) | ||
147 | {} | ||
148 | #endif | ||
139 | static s32 expected_tpt_A[IWL_RATE_COUNT] = { | 149 | static s32 expected_tpt_A[IWL_RATE_COUNT] = { |
140 | 0, 0, 0, 0, 40, 57, 72, 98, 121, 154, 177, 186, 186 | 150 | 0, 0, 0, 0, 40, 57, 72, 98, 121, 154, 177, 186, 186 |
141 | }; | 151 | }; |
@@ -1866,6 +1876,9 @@ static void rs_rate_init(void *priv_rate, void *priv_sta, | |||
1866 | IWL_DEBUG_HT("MIMO RATE 0x%X SISO MASK 0x%X\n", crl->active_siso_rate, | 1876 | IWL_DEBUG_HT("MIMO RATE 0x%X SISO MASK 0x%X\n", crl->active_siso_rate, |
1867 | crl->active_mimo_rate); | 1877 | crl->active_mimo_rate); |
1868 | #endif /*CONFIG_IWLWIFI_HT*/ | 1878 | #endif /*CONFIG_IWLWIFI_HT*/ |
1879 | #ifdef CONFIG_MAC80211_DEBUGFS | ||
1880 | crl->drv = priv; | ||
1881 | #endif | ||
1869 | 1882 | ||
1870 | if (priv->assoc_station_added) | 1883 | if (priv->assoc_station_added) |
1871 | priv->lq_mngr.lq_ready = 1; | 1884 | priv->lq_mngr.lq_ready = 1; |
@@ -1885,6 +1898,8 @@ static void rs_fill_link_cmd(struct iwl_rate_scale_priv *lq_data, | |||
1885 | struct iwl_rate new_rate; | 1898 | struct iwl_rate new_rate; |
1886 | struct iwl_scale_tbl_info tbl_type = { 0 }; | 1899 | struct iwl_scale_tbl_info tbl_type = { 0 }; |
1887 | 1900 | ||
1901 | rs_dbgfs_set_mcs(lq_data, tx_mcs, index); | ||
1902 | |||
1888 | rs_get_tbl_info_from_mcs(tx_mcs, lq_data->phymode, | 1903 | rs_get_tbl_info_from_mcs(tx_mcs, lq_data->phymode, |
1889 | &tbl_type, &rate_idx); | 1904 | &tbl_type, &rate_idx); |
1890 | 1905 | ||
@@ -1919,6 +1934,8 @@ static void rs_fill_link_cmd(struct iwl_rate_scale_priv *lq_data, | |||
1919 | ant_toggle_count = 1; | 1934 | ant_toggle_count = 1; |
1920 | } | 1935 | } |
1921 | } | 1936 | } |
1937 | |||
1938 | rs_dbgfs_set_mcs(lq_data, &new_rate, index); | ||
1922 | lq_cmd->rs_table[index].rate_n_flags = | 1939 | lq_cmd->rs_table[index].rate_n_flags = |
1923 | cpu_to_le32(new_rate.rate_n_flags); | 1940 | cpu_to_le32(new_rate.rate_n_flags); |
1924 | repeat_rate--; | 1941 | repeat_rate--; |
@@ -1947,6 +1964,7 @@ static void rs_fill_link_cmd(struct iwl_rate_scale_priv *lq_data, | |||
1947 | 1964 | ||
1948 | use_ht_possible = 0; | 1965 | use_ht_possible = 0; |
1949 | 1966 | ||
1967 | rs_dbgfs_set_mcs(lq_data, &new_rate, index); | ||
1950 | lq_cmd->rs_table[index].rate_n_flags = | 1968 | lq_cmd->rs_table[index].rate_n_flags = |
1951 | cpu_to_le32(new_rate.rate_n_flags); | 1969 | cpu_to_le32(new_rate.rate_n_flags); |
1952 | 1970 | ||
@@ -2002,7 +2020,54 @@ static int open_file_generic(struct inode *inode, struct file *file) | |||
2002 | file->private_data = inode->i_private; | 2020 | file->private_data = inode->i_private; |
2003 | return 0; | 2021 | return 0; |
2004 | } | 2022 | } |
2023 | static void rs_dbgfs_set_mcs(struct iwl_rate_scale_priv *rs_priv, | ||
2024 | struct iwl_rate *mcs, int index) | ||
2025 | { | ||
2026 | const u32 cck_rate = 0x820A; | ||
2027 | if (rs_priv->dbg_fixed.rate_n_flags) { | ||
2028 | if (index < 12) | ||
2029 | mcs->rate_n_flags = rs_priv->dbg_fixed.rate_n_flags; | ||
2030 | else | ||
2031 | mcs->rate_n_flags = cck_rate; | ||
2032 | IWL_DEBUG_RATE("Fixed rate ON\n"); | ||
2033 | return; | ||
2034 | } | ||
2035 | |||
2036 | IWL_DEBUG_RATE("Fixed rate OFF\n"); | ||
2037 | } | ||
2005 | 2038 | ||
2039 | static ssize_t rs_sta_dbgfs_scale_table_write(struct file *file, | ||
2040 | const char __user *user_buf, size_t count, loff_t *ppos) | ||
2041 | { | ||
2042 | struct iwl_rate_scale_priv *rs_priv = file->private_data; | ||
2043 | char buf[64]; | ||
2044 | int buf_size; | ||
2045 | u32 parsed_rate; | ||
2046 | |||
2047 | memset(buf, 0, sizeof(buf)); | ||
2048 | buf_size = min(count, sizeof(buf) - 1); | ||
2049 | if (copy_from_user(buf, user_buf, buf_size)) | ||
2050 | return -EFAULT; | ||
2051 | |||
2052 | if (sscanf(buf, "%x", &parsed_rate) == 1) | ||
2053 | rs_priv->dbg_fixed.rate_n_flags = parsed_rate; | ||
2054 | else | ||
2055 | rs_priv->dbg_fixed.rate_n_flags = 0; | ||
2056 | |||
2057 | rs_priv->active_rate = 0x0FFF; | ||
2058 | rs_priv->active_siso_rate = 0x1FD0; | ||
2059 | rs_priv->active_mimo_rate = 0x1FD0; | ||
2060 | |||
2061 | IWL_DEBUG_RATE("sta_id %d rate 0x%X\n", | ||
2062 | rs_priv->lq.sta_id, rs_priv->dbg_fixed.rate_n_flags); | ||
2063 | |||
2064 | if (rs_priv->dbg_fixed.rate_n_flags) { | ||
2065 | rs_fill_link_cmd(rs_priv, &rs_priv->dbg_fixed, &rs_priv->lq); | ||
2066 | rs_send_lq_cmd(rs_priv->drv, &rs_priv->lq, CMD_ASYNC); | ||
2067 | } | ||
2068 | |||
2069 | return count; | ||
2070 | } | ||
2006 | static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file, | 2071 | static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file, |
2007 | char __user *user_buf, size_t count, loff_t *ppos) | 2072 | char __user *user_buf, size_t count, loff_t *ppos) |
2008 | { | 2073 | { |
@@ -2013,9 +2078,11 @@ static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file, | |||
2013 | struct iwl_rate_scale_priv *rs_priv = file->private_data; | 2078 | struct iwl_rate_scale_priv *rs_priv = file->private_data; |
2014 | 2079 | ||
2015 | desc += sprintf(buff+desc, "sta_id %d\n", rs_priv->lq.sta_id); | 2080 | desc += sprintf(buff+desc, "sta_id %d\n", rs_priv->lq.sta_id); |
2016 | desc += sprintf(buff+desc, "failed=%d success=%d rate=%X\n", | 2081 | desc += sprintf(buff+desc, "failed=%d success=%d rate=0%X\n", |
2017 | rs_priv->total_failed, rs_priv->total_success, | 2082 | rs_priv->total_failed, rs_priv->total_success, |
2018 | rs_priv->active_rate); | 2083 | rs_priv->active_rate); |
2084 | desc += sprintf(buff+desc, "fixed rate 0x%X\n", | ||
2085 | rs_priv->dbg_fixed.rate_n_flags); | ||
2019 | desc += sprintf(buff+desc, "general:" | 2086 | desc += sprintf(buff+desc, "general:" |
2020 | "flags=0x%X mimo-d=%d s-ant0x%x d-ant=0x%x\n", | 2087 | "flags=0x%X mimo-d=%d s-ant0x%x d-ant=0x%x\n", |
2021 | rs_priv->lq.general_params.flags, | 2088 | rs_priv->lq.general_params.flags, |
@@ -2045,6 +2112,7 @@ static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file, | |||
2045 | } | 2112 | } |
2046 | 2113 | ||
2047 | static const struct file_operations rs_sta_dbgfs_scale_table_ops = { | 2114 | static const struct file_operations rs_sta_dbgfs_scale_table_ops = { |
2115 | .write = rs_sta_dbgfs_scale_table_write, | ||
2048 | .read = rs_sta_dbgfs_scale_table_read, | 2116 | .read = rs_sta_dbgfs_scale_table_read, |
2049 | .open = open_file_generic, | 2117 | .open = open_file_generic, |
2050 | }; | 2118 | }; |