|
2 | 2 |
|
3 | 3 | #include <linux/phy.h>
|
4 | 4 | #include <linux/module.h>
|
5 |
| -#include <linux/ethtool_netlink.h> |
6 | 5 |
|
7 | 6 | #include "qcom.h"
|
8 | 7 |
|
|
63 | 62 | #define QCA808X_DBG_AN_TEST 0xb
|
64 | 63 | #define QCA808X_HIBERNATION_EN BIT(15)
|
65 | 64 |
|
66 |
| -#define QCA808X_CDT_ENABLE_TEST BIT(15) |
67 |
| -#define QCA808X_CDT_INTER_CHECK_DIS BIT(13) |
68 |
| -#define QCA808X_CDT_STATUS BIT(11) |
69 |
| -#define QCA808X_CDT_LENGTH_UNIT BIT(10) |
70 |
| - |
71 |
| -#define QCA808X_MMD3_CDT_STATUS 0x8064 |
72 |
| -#define QCA808X_MMD3_CDT_DIAG_PAIR_A 0x8065 |
73 |
| -#define QCA808X_MMD3_CDT_DIAG_PAIR_B 0x8066 |
74 |
| -#define QCA808X_MMD3_CDT_DIAG_PAIR_C 0x8067 |
75 |
| -#define QCA808X_MMD3_CDT_DIAG_PAIR_D 0x8068 |
76 |
| -#define QCA808X_CDT_DIAG_LENGTH_SAME_SHORT GENMASK(15, 8) |
77 |
| -#define QCA808X_CDT_DIAG_LENGTH_CROSS_SHORT GENMASK(7, 0) |
78 |
| - |
79 |
| -#define QCA808X_CDT_CODE_PAIR_A GENMASK(15, 12) |
80 |
| -#define QCA808X_CDT_CODE_PAIR_B GENMASK(11, 8) |
81 |
| -#define QCA808X_CDT_CODE_PAIR_C GENMASK(7, 4) |
82 |
| -#define QCA808X_CDT_CODE_PAIR_D GENMASK(3, 0) |
83 |
| - |
84 |
| -#define QCA808X_CDT_STATUS_STAT_TYPE GENMASK(1, 0) |
85 |
| -#define QCA808X_CDT_STATUS_STAT_FAIL FIELD_PREP_CONST(QCA808X_CDT_STATUS_STAT_TYPE, 0) |
86 |
| -#define QCA808X_CDT_STATUS_STAT_NORMAL FIELD_PREP_CONST(QCA808X_CDT_STATUS_STAT_TYPE, 1) |
87 |
| -#define QCA808X_CDT_STATUS_STAT_SAME_OPEN FIELD_PREP_CONST(QCA808X_CDT_STATUS_STAT_TYPE, 2) |
88 |
| -#define QCA808X_CDT_STATUS_STAT_SAME_SHORT FIELD_PREP_CONST(QCA808X_CDT_STATUS_STAT_TYPE, 3) |
89 |
| - |
90 |
| -#define QCA808X_CDT_STATUS_STAT_MDI GENMASK(3, 2) |
91 |
| -#define QCA808X_CDT_STATUS_STAT_MDI1 FIELD_PREP_CONST(QCA808X_CDT_STATUS_STAT_MDI, 1) |
92 |
| -#define QCA808X_CDT_STATUS_STAT_MDI2 FIELD_PREP_CONST(QCA808X_CDT_STATUS_STAT_MDI, 2) |
93 |
| -#define QCA808X_CDT_STATUS_STAT_MDI3 FIELD_PREP_CONST(QCA808X_CDT_STATUS_STAT_MDI, 3) |
94 |
| - |
95 |
| -/* NORMAL are MDI with type set to 0 */ |
96 |
| -#define QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI1_SAME_NORMAL QCA808X_CDT_STATUS_STAT_MDI1 |
97 |
| -#define QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI1_SAME_OPEN (QCA808X_CDT_STATUS_STAT_SAME_OPEN |\ |
98 |
| - QCA808X_CDT_STATUS_STAT_MDI1) |
99 |
| -#define QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI1_SAME_SHORT (QCA808X_CDT_STATUS_STAT_SAME_SHORT |\ |
100 |
| - QCA808X_CDT_STATUS_STAT_MDI1) |
101 |
| -#define QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI2_SAME_NORMAL QCA808X_CDT_STATUS_STAT_MDI2 |
102 |
| -#define QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI2_SAME_OPEN (QCA808X_CDT_STATUS_STAT_SAME_OPEN |\ |
103 |
| - QCA808X_CDT_STATUS_STAT_MDI2) |
104 |
| -#define QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI2_SAME_SHORT (QCA808X_CDT_STATUS_STAT_SAME_SHORT |\ |
105 |
| - QCA808X_CDT_STATUS_STAT_MDI2) |
106 |
| -#define QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI3_SAME_NORMAL QCA808X_CDT_STATUS_STAT_MDI3 |
107 |
| -#define QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI3_SAME_OPEN (QCA808X_CDT_STATUS_STAT_SAME_OPEN |\ |
108 |
| - QCA808X_CDT_STATUS_STAT_MDI3) |
109 |
| -#define QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI3_SAME_SHORT (QCA808X_CDT_STATUS_STAT_SAME_SHORT |\ |
110 |
| - QCA808X_CDT_STATUS_STAT_MDI3) |
111 |
| - |
112 |
| -/* Added for reference of existence but should be handled by wait_for_completion already */ |
113 |
| -#define QCA808X_CDT_STATUS_STAT_BUSY (BIT(1) | BIT(3)) |
114 |
| - |
115 | 65 | #define QCA808X_MMD7_LED_GLOBAL 0x8073
|
116 | 66 | #define QCA808X_LED_BLINK_1 GENMASK(11, 6)
|
117 | 67 | #define QCA808X_LED_BLINK_2 GENMASK(5, 0)
|
@@ -406,86 +356,6 @@ static int qca808x_soft_reset(struct phy_device *phydev)
|
406 | 356 | return ret;
|
407 | 357 | }
|
408 | 358 |
|
409 |
| -static bool qca808x_cdt_fault_length_valid(int cdt_code) |
410 |
| -{ |
411 |
| - switch (cdt_code) { |
412 |
| - case QCA808X_CDT_STATUS_STAT_SAME_SHORT: |
413 |
| - case QCA808X_CDT_STATUS_STAT_SAME_OPEN: |
414 |
| - case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI1_SAME_NORMAL: |
415 |
| - case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI1_SAME_OPEN: |
416 |
| - case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI1_SAME_SHORT: |
417 |
| - case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI2_SAME_NORMAL: |
418 |
| - case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI2_SAME_OPEN: |
419 |
| - case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI2_SAME_SHORT: |
420 |
| - case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI3_SAME_NORMAL: |
421 |
| - case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI3_SAME_OPEN: |
422 |
| - case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI3_SAME_SHORT: |
423 |
| - return true; |
424 |
| - default: |
425 |
| - return false; |
426 |
| - } |
427 |
| -} |
428 |
| - |
429 |
| -static int qca808x_cable_test_result_trans(int cdt_code) |
430 |
| -{ |
431 |
| - switch (cdt_code) { |
432 |
| - case QCA808X_CDT_STATUS_STAT_NORMAL: |
433 |
| - return ETHTOOL_A_CABLE_RESULT_CODE_OK; |
434 |
| - case QCA808X_CDT_STATUS_STAT_SAME_SHORT: |
435 |
| - return ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT; |
436 |
| - case QCA808X_CDT_STATUS_STAT_SAME_OPEN: |
437 |
| - return ETHTOOL_A_CABLE_RESULT_CODE_OPEN; |
438 |
| - case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI1_SAME_NORMAL: |
439 |
| - case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI1_SAME_OPEN: |
440 |
| - case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI1_SAME_SHORT: |
441 |
| - case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI2_SAME_NORMAL: |
442 |
| - case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI2_SAME_OPEN: |
443 |
| - case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI2_SAME_SHORT: |
444 |
| - case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI3_SAME_NORMAL: |
445 |
| - case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI3_SAME_OPEN: |
446 |
| - case QCA808X_CDT_STATUS_STAT_CROSS_SHORT_WITH_MDI3_SAME_SHORT: |
447 |
| - return ETHTOOL_A_CABLE_RESULT_CODE_CROSS_SHORT; |
448 |
| - case QCA808X_CDT_STATUS_STAT_FAIL: |
449 |
| - default: |
450 |
| - return ETHTOOL_A_CABLE_RESULT_CODE_UNSPEC; |
451 |
| - } |
452 |
| -} |
453 |
| - |
454 |
| -static int qca808x_cdt_fault_length(struct phy_device *phydev, int pair, |
455 |
| - int result) |
456 |
| -{ |
457 |
| - int val; |
458 |
| - u32 cdt_length_reg = 0; |
459 |
| - |
460 |
| - switch (pair) { |
461 |
| - case ETHTOOL_A_CABLE_PAIR_A: |
462 |
| - cdt_length_reg = QCA808X_MMD3_CDT_DIAG_PAIR_A; |
463 |
| - break; |
464 |
| - case ETHTOOL_A_CABLE_PAIR_B: |
465 |
| - cdt_length_reg = QCA808X_MMD3_CDT_DIAG_PAIR_B; |
466 |
| - break; |
467 |
| - case ETHTOOL_A_CABLE_PAIR_C: |
468 |
| - cdt_length_reg = QCA808X_MMD3_CDT_DIAG_PAIR_C; |
469 |
| - break; |
470 |
| - case ETHTOOL_A_CABLE_PAIR_D: |
471 |
| - cdt_length_reg = QCA808X_MMD3_CDT_DIAG_PAIR_D; |
472 |
| - break; |
473 |
| - default: |
474 |
| - return -EINVAL; |
475 |
| - } |
476 |
| - |
477 |
| - val = phy_read_mmd(phydev, MDIO_MMD_PCS, cdt_length_reg); |
478 |
| - if (val < 0) |
479 |
| - return val; |
480 |
| - |
481 |
| - if (result == ETHTOOL_A_CABLE_RESULT_CODE_SAME_SHORT) |
482 |
| - val = FIELD_GET(QCA808X_CDT_DIAG_LENGTH_SAME_SHORT, val); |
483 |
| - else |
484 |
| - val = FIELD_GET(QCA808X_CDT_DIAG_LENGTH_CROSS_SHORT, val); |
485 |
| - |
486 |
| - return at803x_cdt_fault_length(val); |
487 |
| -} |
488 |
| - |
489 | 359 | static int qca808x_cable_test_start(struct phy_device *phydev)
|
490 | 360 | {
|
491 | 361 | int ret;
|
@@ -527,81 +397,6 @@ static int qca808x_cable_test_start(struct phy_device *phydev)
|
527 | 397 | return 0;
|
528 | 398 | }
|
529 | 399 |
|
530 |
| -static int qca808x_cable_test_get_pair_status(struct phy_device *phydev, u8 pair, |
531 |
| - u16 status) |
532 |
| -{ |
533 |
| - int length, result; |
534 |
| - u16 pair_code; |
535 |
| - |
536 |
| - switch (pair) { |
537 |
| - case ETHTOOL_A_CABLE_PAIR_A: |
538 |
| - pair_code = FIELD_GET(QCA808X_CDT_CODE_PAIR_A, status); |
539 |
| - break; |
540 |
| - case ETHTOOL_A_CABLE_PAIR_B: |
541 |
| - pair_code = FIELD_GET(QCA808X_CDT_CODE_PAIR_B, status); |
542 |
| - break; |
543 |
| - case ETHTOOL_A_CABLE_PAIR_C: |
544 |
| - pair_code = FIELD_GET(QCA808X_CDT_CODE_PAIR_C, status); |
545 |
| - break; |
546 |
| - case ETHTOOL_A_CABLE_PAIR_D: |
547 |
| - pair_code = FIELD_GET(QCA808X_CDT_CODE_PAIR_D, status); |
548 |
| - break; |
549 |
| - default: |
550 |
| - return -EINVAL; |
551 |
| - } |
552 |
| - |
553 |
| - result = qca808x_cable_test_result_trans(pair_code); |
554 |
| - ethnl_cable_test_result(phydev, pair, result); |
555 |
| - |
556 |
| - if (qca808x_cdt_fault_length_valid(pair_code)) { |
557 |
| - length = qca808x_cdt_fault_length(phydev, pair, result); |
558 |
| - ethnl_cable_test_fault_length(phydev, pair, length); |
559 |
| - } |
560 |
| - |
561 |
| - return 0; |
562 |
| -} |
563 |
| - |
564 |
| -static int qca808x_cable_test_get_status(struct phy_device *phydev, bool *finished) |
565 |
| -{ |
566 |
| - int ret, val; |
567 |
| - |
568 |
| - *finished = false; |
569 |
| - |
570 |
| - val = QCA808X_CDT_ENABLE_TEST | |
571 |
| - QCA808X_CDT_LENGTH_UNIT; |
572 |
| - ret = at803x_cdt_start(phydev, val); |
573 |
| - if (ret) |
574 |
| - return ret; |
575 |
| - |
576 |
| - ret = at803x_cdt_wait_for_completion(phydev, QCA808X_CDT_ENABLE_TEST); |
577 |
| - if (ret) |
578 |
| - return ret; |
579 |
| - |
580 |
| - val = phy_read_mmd(phydev, MDIO_MMD_PCS, QCA808X_MMD3_CDT_STATUS); |
581 |
| - if (val < 0) |
582 |
| - return val; |
583 |
| - |
584 |
| - ret = qca808x_cable_test_get_pair_status(phydev, ETHTOOL_A_CABLE_PAIR_A, val); |
585 |
| - if (ret) |
586 |
| - return ret; |
587 |
| - |
588 |
| - ret = qca808x_cable_test_get_pair_status(phydev, ETHTOOL_A_CABLE_PAIR_B, val); |
589 |
| - if (ret) |
590 |
| - return ret; |
591 |
| - |
592 |
| - ret = qca808x_cable_test_get_pair_status(phydev, ETHTOOL_A_CABLE_PAIR_C, val); |
593 |
| - if (ret) |
594 |
| - return ret; |
595 |
| - |
596 |
| - ret = qca808x_cable_test_get_pair_status(phydev, ETHTOOL_A_CABLE_PAIR_D, val); |
597 |
| - if (ret) |
598 |
| - return ret; |
599 |
| - |
600 |
| - *finished = true; |
601 |
| - |
602 |
| - return 0; |
603 |
| -} |
604 |
| - |
605 | 400 | static int qca808x_get_features(struct phy_device *phydev)
|
606 | 401 | {
|
607 | 402 | int ret;
|
|
0 commit comments