diff options
author | Wey-Yi Guy <wey-yi.w.guy@intel.com> | 2011-05-30 13:29:37 -0400 |
---|---|---|
committer | Wey-Yi Guy <wey-yi.w.guy@intel.com> | 2011-06-11 10:08:12 -0400 |
commit | 49b72100165e3b2046be15a8e4f766f5169e708d (patch) | |
tree | c609da8bdee7460fc2001654f9e3a93259b94a9e | |
parent | 7101f4043cdaa5dc2bf8974313744246f3955de7 (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.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-sv-open.c | 28 | ||||
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-testmode.h | 7 |
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 |
1172 | struct iwl_testmode_trace { | 1172 | struct 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 |