aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/cw1200
diff options
context:
space:
mode:
authorSolomon Peachy <pizza@shaftnet.org>2013-06-11 09:49:39 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-06-11 12:48:10 -0400
commit19db577868e94c80dc9a569d937109f95c34d0f4 (patch)
treeb6ea03b4f84dcd89b0fce8634a571c57d783cce6 /drivers/net/wireless/cw1200
parentfa8eeae102570dfdf3fd14347a0671cff8a2cfe4 (diff)
cw1200: Eliminate the ETF debug/engineering code.
This is only really useful for people who are bringing up new hardware designs and have access to the proprietary vendor tools that interface with this mode. It'll live out of tree until it's rewritten to use a less kludgy interface. Signed-off-by: Solomon Peachy <pizza@shaftnet.org> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/cw1200')
-rw-r--r--drivers/net/wireless/cw1200/Kconfig10
-rw-r--r--drivers/net/wireless/cw1200/cw1200.h9
-rw-r--r--drivers/net/wireless/cw1200/debug.c236
-rw-r--r--drivers/net/wireless/cw1200/fwio.c5
-rw-r--r--drivers/net/wireless/cw1200/main.c30
-rw-r--r--drivers/net/wireless/cw1200/wsm.c56
-rw-r--r--drivers/net/wireless/cw1200/wsm.h5
7 files changed, 2 insertions, 349 deletions
diff --git a/drivers/net/wireless/cw1200/Kconfig b/drivers/net/wireless/cw1200/Kconfig
index fc1b472460c8..0880742eab17 100644
--- a/drivers/net/wireless/cw1200/Kconfig
+++ b/drivers/net/wireless/cw1200/Kconfig
@@ -27,14 +27,4 @@ config CW1200_WLAN_SPI
27 need to add appropriate platform data glue in your board setup 27 need to add appropriate platform data glue in your board setup
28 file. 28 file.
29 29
30menu "Driver debug features"
31 depends on CW1200 && DEBUG_FS
32
33config CW1200_ETF
34 bool "Enable CW1200 Engineering Test Framework hooks"
35 help
36 If you don't know what this is, just say N.
37
38endmenu
39
40endif 30endif
diff --git a/drivers/net/wireless/cw1200/cw1200.h b/drivers/net/wireless/cw1200/cw1200.h
index 95320f2b25eb..91ff7f19c4f0 100644
--- a/drivers/net/wireless/cw1200/cw1200.h
+++ b/drivers/net/wireless/cw1200/cw1200.h
@@ -35,11 +35,6 @@ struct task_struct;
35struct cw1200_debug_priv; 35struct cw1200_debug_priv;
36struct firmware; 36struct firmware;
37 37
38#ifdef CONFIG_CW1200_ETF
39extern int etf_mode;
40extern char *etf_firmware;
41#endif
42
43#define CW1200_MAX_CTRL_FRAME_LEN (0x1000) 38#define CW1200_MAX_CTRL_FRAME_LEN (0x1000)
44 39
45#define CW1200_MAX_STA_IN_AP_MODE (5) 40#define CW1200_MAX_STA_IN_AP_MODE (5)
@@ -287,10 +282,6 @@ struct cw1200_common {
287 struct work_struct linkid_reset_work; 282 struct work_struct linkid_reset_work;
288 u8 action_frame_sa[ETH_ALEN]; 283 u8 action_frame_sa[ETH_ALEN];
289 u8 action_linkid; 284 u8 action_linkid;
290
291#ifdef CONFIG_CW1200_ETF
292 struct sk_buff_head etf_q;
293#endif
294}; 285};
295 286
296struct cw1200_sta_priv { 287struct cw1200_sta_priv {
diff --git a/drivers/net/wireless/cw1200/debug.c b/drivers/net/wireless/cw1200/debug.c
index ac9c219c6330..e323b4d54338 100644
--- a/drivers/net/wireless/cw1200/debug.c
+++ b/drivers/net/wireless/cw1200/debug.c
@@ -357,144 +357,6 @@ static const struct file_operations fops_counters = {
357 .owner = THIS_MODULE, 357 .owner = THIS_MODULE,
358}; 358};
359 359
360#ifdef CONFIG_CW1200_ETF
361static int cw1200_etf_out_show(struct seq_file *seq, void *v)
362{
363 struct cw1200_common *priv = seq->private;
364 struct sk_buff *skb;
365 u32 len = 0;
366
367 skb = skb_dequeue(&priv->etf_q);
368
369 if (skb)
370 len = skb->len;
371
372 seq_write(seq, &len, sizeof(len));
373
374 if (skb) {
375 seq_write(seq, skb->data, len);
376 kfree_skb(skb);
377 }
378
379 return 0;
380}
381
382static int cw1200_etf_out_open(struct inode *inode, struct file *file)
383{
384 return single_open(file, &cw1200_etf_out_show,
385 inode->i_private);
386}
387
388static const struct file_operations fops_etf_out = {
389 .open = cw1200_etf_out_open,
390 .read = seq_read,
391 .llseek = seq_lseek,
392 .release = single_release,
393 .owner = THIS_MODULE,
394};
395
396struct etf_req_msg;
397static int etf_request(struct cw1200_common *priv,
398 struct etf_req_msg *msg, u32 len);
399
400#define MAX_RX_SIZE 2600
401
402struct etf_in_state {
403 struct cw1200_common *priv;
404 u16 total_len;
405 u16 written;
406 u8 buf[MAX_RX_SIZE];
407};
408
409static int cw1200_etf_in_open(struct inode *inode, struct file *file)
410{
411 struct etf_in_state *etf = kmalloc(sizeof(struct etf_in_state),
412 GFP_KERNEL);
413
414 if (!etf)
415 return -ENOMEM;
416
417 etf->written = 0;
418 etf->total_len = 0;
419 etf->priv = inode->i_private;
420
421 file->private_data = etf;
422
423 return 0;
424}
425
426static int cw1200_etf_in_release(struct inode *inode, struct file *file)
427{
428 kfree(file->private_data);
429 return 0;
430}
431
432static ssize_t cw1200_etf_in_write(struct file *file,
433 const char __user *user_buf, size_t count, loff_t *ppos)
434{
435 struct etf_in_state *etf = file->private_data;
436
437 ssize_t written = 0;
438
439 if (!etf->total_len) {
440 if (count < sizeof(etf->total_len)) {
441 pr_err("count < sizeof(total_len)\n");
442 return -EINVAL;
443 }
444
445 if (copy_from_user(&etf->total_len, user_buf,
446 sizeof(etf->total_len))) {
447 pr_err("copy_from_user (len) failed\n");
448 return -EFAULT;
449 }
450
451 if (etf->total_len > MAX_RX_SIZE) {
452 pr_err("requested length > MAX_RX_SIZE\n");
453 return -EINVAL;
454 }
455
456 written += sizeof(etf->total_len);
457 count -= sizeof(etf->total_len);
458 }
459
460 if (!count)
461 goto done;
462
463 if (count > (etf->total_len - written)) {
464 pr_err("Tried to write > MAX_RX_SIZE\n");
465 return -EINVAL;
466 }
467
468 if (copy_from_user(etf->buf + etf->written, user_buf + written,
469 count)) {
470 pr_err("copy_from_user (payload %zu) failed\n", count);
471 return -EFAULT;
472 }
473
474 written += count;
475 etf->written += count;
476
477 if (etf->written >= etf->total_len) {
478 if (etf_request(etf->priv, (struct etf_req_msg *)etf->buf,
479 etf->total_len)) {
480 pr_err("etf_request failed\n");
481 return -EIO;
482 }
483 }
484
485done:
486 return written;
487}
488
489static const struct file_operations fops_etf_in = {
490 .open = cw1200_etf_in_open,
491 .release = cw1200_etf_in_release,
492 .write = cw1200_etf_in_write,
493 .llseek = default_llseek,
494 .owner = THIS_MODULE,
495};
496#endif /* CONFIG_CW1200_ETF */
497
498static ssize_t cw1200_wsm_dumps(struct file *file, 360static ssize_t cw1200_wsm_dumps(struct file *file,
499 const char __user *user_buf, size_t count, loff_t *ppos) 361 const char __user *user_buf, size_t count, loff_t *ppos)
500{ 362{
@@ -542,19 +404,6 @@ int cw1200_debug_init(struct cw1200_common *priv)
542 priv, &fops_counters)) 404 priv, &fops_counters))
543 goto err; 405 goto err;
544 406
545#ifdef CONFIG_CW1200_ETF
546 if (etf_mode) {
547 skb_queue_head_init(&priv->etf_q);
548
549 if (!debugfs_create_file("etf_out", S_IRUSR, d->debugfs_phy,
550 priv, &fops_etf_out))
551 goto err;
552 if (!debugfs_create_file("etf_in", S_IWUSR, d->debugfs_phy,
553 priv, &fops_etf_in))
554 goto err;
555 }
556#endif /* CONFIG_CW1200_ETF */
557
558 if (!debugfs_create_file("wsm_dumps", S_IWUSR, d->debugfs_phy, 407 if (!debugfs_create_file("wsm_dumps", S_IWUSR, d->debugfs_phy,
559 priv, &fops_wsm_dumps)) 408 priv, &fops_wsm_dumps))
560 goto err; 409 goto err;
@@ -577,88 +426,3 @@ void cw1200_debug_release(struct cw1200_common *priv)
577 kfree(d); 426 kfree(d);
578 } 427 }
579} 428}
580
581#ifdef CONFIG_CW1200_ETF
582struct cw1200_sdd {
583 u8 id;
584 u8 len;
585 u8 data[];
586};
587
588struct etf_req_msg {
589 u32 id;
590 u32 len;
591 u8 data[];
592};
593
594static int parse_sdd_file(struct cw1200_common *priv, u8 *data, u32 length)
595{
596 struct cw1200_sdd *ie;
597
598 while (length > 0) {
599 ie = (struct cw1200_sdd *)data;
600 if (ie->id == SDD_REFERENCE_FREQUENCY_ELT_ID) {
601 priv->hw_refclk = cpu_to_le16(*((u16 *)ie->data));
602 pr_info("Using Reference clock frequency %d KHz\n",
603 priv->hw_refclk);
604 break;
605 }
606
607 length -= ie->len + sizeof(*ie);
608 data += ie->len + sizeof(*ie);
609 }
610 return 0;
611}
612
613char *etf_firmware;
614
615#define ST90TDS_START_ADAPTER 0x09 /* Loads firmware too */
616#define ST90TDS_STOP_ADAPTER 0x0A
617#define ST90TDS_CONFIG_ADAPTER 0x0E /* Send configuration params */
618#define ST90TDS_SBUS_READ 0x13
619#define ST90TDS_SBUS_WRITE 0x14
620#define ST90TDS_GET_DEVICE_OPTION 0x19
621#define ST90TDS_SET_DEVICE_OPTION 0x1A
622#define ST90TDS_SEND_SDD 0x1D /* SDD File used to find DPLL */
623
624#include "fwio.h"
625
626static int etf_request(struct cw1200_common *priv,
627 struct etf_req_msg *msg,
628 u32 len)
629{
630 int rval = -1;
631 switch (msg->id) {
632 case ST90TDS_START_ADAPTER:
633 etf_firmware = "cw1200_etf.bin";
634 pr_info("ETF_START (len %d, '%s')\n", len, etf_firmware);
635 rval = cw1200_load_firmware(priv);
636 break;
637 case ST90TDS_STOP_ADAPTER:
638 pr_info("ETF_STOP (unhandled)\n");
639 break;
640 case ST90TDS_SEND_SDD:
641 pr_info("ETF_SDD\n");
642 rval = parse_sdd_file(priv, msg->data, msg->len);
643 break;
644 case ST90TDS_CONFIG_ADAPTER:
645 pr_info("ETF_CONFIG_ADAP (unhandled)\n");
646 break;
647 case ST90TDS_SBUS_READ:
648 pr_info("ETF_SBUS_READ (unhandled)\n");
649 break;
650 case ST90TDS_SBUS_WRITE:
651 pr_info("ETF_SBUS_WRITE (unhandled)\n");
652 break;
653 case ST90TDS_SET_DEVICE_OPTION:
654 pr_info("ETF_SET_DEV_OPT (unhandled)\n");
655 break;
656 default:
657 pr_info("ETF_PASSTHRU (0x%08x)\n", msg->id);
658 rval = wsm_raw_cmd(priv, (u8 *)msg, len);
659 break;
660 }
661
662 return rval;
663}
664#endif /* CONFIG_CW1200_ETF */
diff --git a/drivers/net/wireless/cw1200/fwio.c b/drivers/net/wireless/cw1200/fwio.c
index 427c9f24b94e..acdff0f7f952 100644
--- a/drivers/net/wireless/cw1200/fwio.c
+++ b/drivers/net/wireless/cw1200/fwio.c
@@ -139,11 +139,6 @@ static int cw1200_load_firmware_cw1200(struct cw1200_common *priv)
139 val32 &= ~ST90TDS_CONFIG_CPU_CLK_DIS_BIT; 139 val32 &= ~ST90TDS_CONFIG_CPU_CLK_DIS_BIT;
140 REG_WRITE(ST90TDS_CONFIG_REG_ID, val32); 140 REG_WRITE(ST90TDS_CONFIG_REG_ID, val32);
141 141
142#ifdef CONFIG_CW1200_ETF
143 if (etf_mode)
144 fw_path = etf_firmware;
145#endif
146
147 /* Load a firmware file */ 142 /* Load a firmware file */
148 ret = request_firmware(&firmware, fw_path, priv->pdev); 143 ret = request_firmware(&firmware, fw_path, priv->pdev);
149 if (ret) { 144 if (ret) {
diff --git a/drivers/net/wireless/cw1200/main.c b/drivers/net/wireless/cw1200/main.c
index 2ea1bada7207..9f9adb4fbfb8 100644
--- a/drivers/net/wireless/cw1200/main.c
+++ b/drivers/net/wireless/cw1200/main.c
@@ -61,12 +61,6 @@ int cw1200_power_mode = wsm_power_mode_quiescent;
61module_param(cw1200_power_mode, int, 0644); 61module_param(cw1200_power_mode, int, 0644);
62MODULE_PARM_DESC(cw1200_power_mode, "WSM power mode. 0 == active, 1 == doze, 2 == quiescent (default)"); 62MODULE_PARM_DESC(cw1200_power_mode, "WSM power mode. 0 == active, 1 == doze, 2 == quiescent (default)");
63 63
64#ifdef CONFIG_CW1200_ETF
65int etf_mode;
66module_param(etf_mode, int, 0644);
67MODULE_PARM_DESC(etf_mode, "Enable EngineeringTestingFramework operation");
68#endif
69
70#define RATETAB_ENT(_rate, _rateid, _flags) \ 64#define RATETAB_ENT(_rate, _rateid, _flags) \
71 { \ 65 { \
72 .bitrate = (_rate), \ 66 .bitrate = (_rate), \
@@ -418,11 +412,6 @@ static int cw1200_register_common(struct ieee80211_hw *dev)
418 struct cw1200_common *priv = dev->priv; 412 struct cw1200_common *priv = dev->priv;
419 int err; 413 int err;
420 414
421#ifdef CONFIG_CW1200_ETF
422 if (etf_mode)
423 goto done;
424#endif
425
426#ifdef CONFIG_PM 415#ifdef CONFIG_PM
427 err = cw1200_pm_init(&priv->pm_state, priv); 416 err = cw1200_pm_init(&priv->pm_state, priv);
428 if (err) { 417 if (err) {
@@ -442,9 +431,6 @@ static int cw1200_register_common(struct ieee80211_hw *dev)
442 return err; 431 return err;
443 } 432 }
444 433
445#ifdef CONFIG_CW1200_ETF
446done:
447#endif
448 cw1200_debug_init(priv); 434 cw1200_debug_init(priv);
449 435
450 pr_info("Registered as '%s'\n", wiphy_name(dev->wiphy)); 436 pr_info("Registered as '%s'\n", wiphy_name(dev->wiphy));
@@ -461,13 +447,7 @@ static void cw1200_unregister_common(struct ieee80211_hw *dev)
461 struct cw1200_common *priv = dev->priv; 447 struct cw1200_common *priv = dev->priv;
462 int i; 448 int i;
463 449
464#ifdef CONFIG_CW1200_ETF 450 ieee80211_unregister_hw(dev);
465 if (!etf_mode) {
466#endif
467 ieee80211_unregister_hw(dev);
468#ifdef CONFIG_CW1200_ETF
469 }
470#endif
471 451
472 del_timer_sync(&priv->mcast_timeout); 452 del_timer_sync(&priv->mcast_timeout);
473 cw1200_unregister_bh(priv); 453 cw1200_unregister_bh(priv);
@@ -568,11 +548,6 @@ int cw1200_core_probe(const struct hwbus_ops *hwbus_ops,
568 if (err) 548 if (err)
569 goto err1; 549 goto err1;
570 550
571#ifdef CONFIG_CW1200_ETF
572 if (etf_mode)
573 goto skip_fw;
574#endif
575
576 err = cw1200_load_firmware(priv); 551 err = cw1200_load_firmware(priv);
577 if (err) 552 if (err)
578 goto err2; 553 goto err2;
@@ -594,9 +569,6 @@ int cw1200_core_probe(const struct hwbus_ops *hwbus_ops,
594 /* Enable multi-TX confirmation */ 569 /* Enable multi-TX confirmation */
595 wsm_use_multi_tx_conf(priv, true); 570 wsm_use_multi_tx_conf(priv, true);
596 571
597#ifdef CONFIG_CW1200_ETF
598skip_fw:
599#endif
600 err = cw1200_register_common(dev); 572 err = cw1200_register_common(dev);
601 if (err) 573 if (err)
602 goto err2; 574 goto err2;
diff --git a/drivers/net/wireless/cw1200/wsm.c b/drivers/net/wireless/cw1200/wsm.c
index e99f34e7604d..d185f29efb7e 100644
--- a/drivers/net/wireless/cw1200/wsm.c
+++ b/drivers/net/wireless/cw1200/wsm.c
@@ -1111,10 +1111,7 @@ static int wsm_cmd_send(struct cw1200_common *priv,
1111 * pad the message by a few bytes to ensure 1111 * pad the message by a few bytes to ensure
1112 * that it's completely received. 1112 * that it's completely received.
1113 */ 1113 */
1114#ifdef CONFIG_CW1200_ETF 1114 buf_len += 4;
1115 if (!etf_mode)
1116#endif
1117 buf_len += 4;
1118 1115
1119 /* Fill HI message header */ 1116 /* Fill HI message header */
1120 /* BH will add sequence number */ 1117 /* BH will add sequence number */
@@ -1165,29 +1162,6 @@ done:
1165 return ret; 1162 return ret;
1166} 1163}
1167 1164
1168#ifdef CONFIG_CW1200_ETF
1169int wsm_raw_cmd(struct cw1200_common *priv, u8 *data, size_t len)
1170{
1171 struct wsm_buf *buf = &priv->wsm_cmd_buf;
1172 int ret;
1173
1174 u16 *cmd = (u16 *)(data + 2);
1175
1176 wsm_cmd_lock(priv);
1177
1178 WSM_PUT(buf, data + 4, len - 4); /* Skip over header (u16+u16) */
1179
1180 ret = wsm_cmd_send(priv, buf, NULL, __le16_to_cpu(*cmd), WSM_CMD_TIMEOUT);
1181
1182 wsm_cmd_unlock(priv);
1183 return ret;
1184
1185nomem:
1186 wsm_cmd_unlock(priv);
1187 return -ENOMEM;
1188}
1189#endif /* CONFIG_CW1200_ETF */
1190
1191/* ******************************************************************** */ 1165/* ******************************************************************** */
1192/* WSM TX port control */ 1166/* WSM TX port control */
1193 1167
@@ -1343,34 +1317,6 @@ int wsm_handle_rx(struct cw1200_common *priv, u16 id,
1343 pr_debug("[WSM] <<< 0x%.4X (%td)\n", id, 1317 pr_debug("[WSM] <<< 0x%.4X (%td)\n", id,
1344 wsm_buf.end - wsm_buf.begin); 1318 wsm_buf.end - wsm_buf.begin);
1345 1319
1346#ifdef CONFIG_CW1200_ETF
1347 if (etf_mode) {
1348 struct sk_buff *skb = alloc_skb(wsm_buf.end - wsm_buf.begin, GFP_KERNEL);
1349
1350 /* Strip out Sequence num before passing up */
1351 wsm->id = __le16_to_cpu(wsm->id);
1352 wsm->id &= 0x0FFF;
1353 wsm->id = __cpu_to_le16(wsm->id);
1354
1355 memcpy(skb_put(skb, wsm_buf.end - wsm_buf.begin),
1356 wsm_buf.begin,
1357 wsm_buf.end - wsm_buf.begin);
1358 skb_queue_tail(&priv->etf_q, skb);
1359
1360 /* Special case for startup */
1361 if (id == WSM_STARTUP_IND_ID) {
1362 wsm_startup_indication(priv, &wsm_buf);
1363 } else if (id & 0x0400) {
1364 spin_lock(&priv->wsm_cmd.lock);
1365 priv->wsm_cmd.done = 1;
1366 spin_unlock(&priv->wsm_cmd.lock);
1367 wake_up(&priv->wsm_cmd_wq);
1368 }
1369
1370 goto out;
1371 }
1372#endif
1373
1374 if (id == WSM_TX_CONFIRM_IND_ID) { 1320 if (id == WSM_TX_CONFIRM_IND_ID) {
1375 ret = wsm_tx_confirm(priv, &wsm_buf, link_id); 1321 ret = wsm_tx_confirm(priv, &wsm_buf, link_id);
1376 } else if (id == WSM_MULTI_TX_CONFIRM_ID) { 1322 } else if (id == WSM_MULTI_TX_CONFIRM_ID) {
diff --git a/drivers/net/wireless/cw1200/wsm.h b/drivers/net/wireless/cw1200/wsm.h
index 8d902d6a7dc4..4689dffa3d89 100644
--- a/drivers/net/wireless/cw1200/wsm.h
+++ b/drivers/net/wireless/cw1200/wsm.h
@@ -1871,9 +1871,4 @@ static inline u8 wsm_queue_id_to_wsm(u8 queue_id)
1871 return queue_mapping[queue_id]; 1871 return queue_mapping[queue_id];
1872} 1872}
1873 1873
1874
1875#ifdef CONFIG_CW1200_ETF
1876int wsm_raw_cmd(struct cw1200_common *priv, u8 *data, size_t len);
1877#endif
1878
1879#endif /* CW1200_HWIO_H_INCLUDED */ 1874#endif /* CW1200_HWIO_H_INCLUDED */