aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWey-Yi Guy <wey-yi.w.guy@intel.com>2011-05-30 13:29:37 -0400
committerWey-Yi Guy <wey-yi.w.guy@intel.com>2011-06-11 10:08:12 -0400
commit49b72100165e3b2046be15a8e4f766f5169e708d (patch)
treec609da8bdee7460fc2001654f9e3a93259b94a9e
parent7101f4043cdaa5dc2bf8974313744246f3955de7 (diff)
iwlagn: usersapce application decide the size of trace buffer
For testmode trace function, allow userspace application to request the size of trace buffer. Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-dev.h2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-sv-open.c28
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-testmode.h7
3 files changed, 29 insertions, 8 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
index c8de236c141..a7d2159537a 100644
--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
+++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
@@ -1170,6 +1170,8 @@ enum iwl_scan_type {
1170 1170
1171#ifdef CONFIG_IWLWIFI_DEVICE_SVTOOL 1171#ifdef CONFIG_IWLWIFI_DEVICE_SVTOOL
1172struct iwl_testmode_trace { 1172struct iwl_testmode_trace {
1173 u32 buff_size;
1174 u32 total_size;
1173 u8 *cpu_addr; 1175 u8 *cpu_addr;
1174 u8 *trace_addr; 1176 u8 *trace_addr;
1175 dma_addr_t dma_addr; 1177 dma_addr_t dma_addr;
diff --git a/drivers/net/wireless/iwlwifi/iwl-sv-open.c b/drivers/net/wireless/iwlwifi/iwl-sv-open.c
index 69b7e6bf2d6..135c1b5f25a 100644
--- a/drivers/net/wireless/iwlwifi/iwl-sv-open.c
+++ b/drivers/net/wireless/iwlwifi/iwl-sv-open.c
@@ -69,7 +69,6 @@
69#include <net/mac80211.h> 69#include <net/mac80211.h>
70#include <net/netlink.h> 70#include <net/netlink.h>
71 71
72
73#include "iwl-dev.h" 72#include "iwl-dev.h"
74#include "iwl-core.h" 73#include "iwl-core.h"
75#include "iwl-debug.h" 74#include "iwl-debug.h"
@@ -102,8 +101,10 @@ struct nla_policy iwl_testmode_gnl_msg_policy[IWL_TM_ATTR_MAX] = {
102 101
103 [IWL_TM_ATTR_TRACE_ADDR] = { .type = NLA_UNSPEC, }, 102 [IWL_TM_ATTR_TRACE_ADDR] = { .type = NLA_UNSPEC, },
104 [IWL_TM_ATTR_TRACE_DATA] = { .type = NLA_UNSPEC, }, 103 [IWL_TM_ATTR_TRACE_DATA] = { .type = NLA_UNSPEC, },
104 [IWL_TM_ATTR_TRACE_SIZE] = { .type = NLA_U32, },
105 105
106 [IWL_TM_ATTR_FIXRATE] = { .type = NLA_U32, }, 106 [IWL_TM_ATTR_FIXRATE] = { .type = NLA_U32, },
107
107}; 108};
108 109
109/* 110/*
@@ -185,13 +186,15 @@ static void iwl_trace_cleanup(struct iwl_priv *priv)
185 if (priv->testmode_trace.cpu_addr && 186 if (priv->testmode_trace.cpu_addr &&
186 priv->testmode_trace.dma_addr) 187 priv->testmode_trace.dma_addr)
187 dma_free_coherent(dev, 188 dma_free_coherent(dev,
188 TRACE_TOTAL_SIZE, 189 priv->testmode_trace.total_size,
189 priv->testmode_trace.cpu_addr, 190 priv->testmode_trace.cpu_addr,
190 priv->testmode_trace.dma_addr); 191 priv->testmode_trace.dma_addr);
191 priv->testmode_trace.trace_enabled = false; 192 priv->testmode_trace.trace_enabled = false;
192 priv->testmode_trace.cpu_addr = NULL; 193 priv->testmode_trace.cpu_addr = NULL;
193 priv->testmode_trace.trace_addr = NULL; 194 priv->testmode_trace.trace_addr = NULL;
194 priv->testmode_trace.dma_addr = 0; 195 priv->testmode_trace.dma_addr = 0;
196 priv->testmode_trace.buff_size = 0;
197 priv->testmode_trace.total_size = 0;
195 } 198 }
196} 199}
197 200
@@ -489,9 +492,22 @@ static int iwl_testmode_trace(struct ieee80211_hw *hw, struct nlattr **tb)
489 if (priv->testmode_trace.trace_enabled) 492 if (priv->testmode_trace.trace_enabled)
490 return -EBUSY; 493 return -EBUSY;
491 494
495 if (!tb[IWL_TM_ATTR_TRACE_SIZE])
496 priv->testmode_trace.buff_size = TRACE_BUFF_SIZE_DEF;
497 else
498 priv->testmode_trace.buff_size =
499 nla_get_u32(tb[IWL_TM_ATTR_TRACE_SIZE]);
500 if (!priv->testmode_trace.buff_size)
501 return -EINVAL;
502 if (priv->testmode_trace.buff_size < TRACE_BUFF_SIZE_MIN ||
503 priv->testmode_trace.buff_size > TRACE_BUFF_SIZE_MAX)
504 return -EINVAL;
505
506 priv->testmode_trace.total_size =
507 priv->testmode_trace.buff_size + TRACE_BUFF_PADD;
492 priv->testmode_trace.cpu_addr = 508 priv->testmode_trace.cpu_addr =
493 dma_alloc_coherent(dev, 509 dma_alloc_coherent(dev,
494 TRACE_TOTAL_SIZE, 510 priv->testmode_trace.total_size,
495 &priv->testmode_trace.dma_addr, 511 &priv->testmode_trace.dma_addr,
496 GFP_KERNEL); 512 GFP_KERNEL);
497 if (!priv->testmode_trace.cpu_addr) 513 if (!priv->testmode_trace.cpu_addr)
@@ -500,7 +516,7 @@ static int iwl_testmode_trace(struct ieee80211_hw *hw, struct nlattr **tb)
500 priv->testmode_trace.trace_addr = (u8 *)PTR_ALIGN( 516 priv->testmode_trace.trace_addr = (u8 *)PTR_ALIGN(
501 priv->testmode_trace.cpu_addr, 0x100); 517 priv->testmode_trace.cpu_addr, 0x100);
502 memset(priv->testmode_trace.trace_addr, 0x03B, 518 memset(priv->testmode_trace.trace_addr, 0x03B,
503 TRACE_BUFF_SIZE); 519 priv->testmode_trace.buff_size);
504 skb = cfg80211_testmode_alloc_reply_skb(hw->wiphy, 520 skb = cfg80211_testmode_alloc_reply_skb(hw->wiphy,
505 sizeof(priv->testmode_trace.dma_addr) + 20); 521 sizeof(priv->testmode_trace.dma_addr) + 20);
506 if (!skb) { 522 if (!skb) {
@@ -528,14 +544,14 @@ static int iwl_testmode_trace(struct ieee80211_hw *hw, struct nlattr **tb)
528 if (priv->testmode_trace.trace_enabled && 544 if (priv->testmode_trace.trace_enabled &&
529 priv->testmode_trace.trace_addr) { 545 priv->testmode_trace.trace_addr) {
530 skb = cfg80211_testmode_alloc_reply_skb(hw->wiphy, 546 skb = cfg80211_testmode_alloc_reply_skb(hw->wiphy,
531 20 + TRACE_BUFF_SIZE); 547 20 + priv->testmode_trace.buff_size);
532 if (skb == NULL) { 548 if (skb == NULL) {
533 IWL_DEBUG_INFO(priv, 549 IWL_DEBUG_INFO(priv,
534 "Error allocating memory\n"); 550 "Error allocating memory\n");
535 return -ENOMEM; 551 return -ENOMEM;
536 } 552 }
537 NLA_PUT(skb, IWL_TM_ATTR_TRACE_DATA, 553 NLA_PUT(skb, IWL_TM_ATTR_TRACE_DATA,
538 TRACE_BUFF_SIZE, 554 priv->testmode_trace.buff_size,
539 priv->testmode_trace.trace_addr); 555 priv->testmode_trace.trace_addr);
540 status = cfg80211_testmode_reply(skb); 556 status = cfg80211_testmode_reply(skb);
541 if (status < 0) { 557 if (status < 0) {
diff --git a/drivers/net/wireless/iwlwifi/iwl-testmode.h b/drivers/net/wireless/iwlwifi/iwl-testmode.h
index a88085e9b36..f3f406e1766 100644
--- a/drivers/net/wireless/iwlwifi/iwl-testmode.h
+++ b/drivers/net/wireless/iwlwifi/iwl-testmode.h
@@ -167,6 +167,7 @@ enum iwl_tm_attr_t {
167 */ 167 */
168 IWL_TM_ATTR_TRACE_ADDR, 168 IWL_TM_ATTR_TRACE_ADDR,
169 IWL_TM_ATTR_TRACE_DATA, 169 IWL_TM_ATTR_TRACE_DATA,
170 IWL_TM_ATTR_TRACE_SIZE,
170 171
171 /* When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_FIXRATE_REQ, 172 /* When IWL_TM_ATTR_COMMAND is IWL_TM_CMD_APP2DEV_FIXRATE_REQ,
172 * The mandatory fields are: 173 * The mandatory fields are:
@@ -178,8 +179,10 @@ enum iwl_tm_attr_t {
178}; 179};
179 180
180/* uCode trace buffer */ 181/* uCode trace buffer */
181#define TRACE_BUFF_SIZE 0x20000 182#define TRACE_BUFF_SIZE_MAX 0x200000
183#define TRACE_BUFF_SIZE_MIN 0x20000
184#define TRACE_BUFF_SIZE_DEF TRACE_BUFF_SIZE_MIN
185
182#define TRACE_BUFF_PADD 0x2000 186#define TRACE_BUFF_PADD 0x2000
183#define TRACE_TOTAL_SIZE (TRACE_BUFF_SIZE + TRACE_BUFF_PADD)
184 187
185#endif 188#endif