|
1 | 1 | /*
|
2 |
| - * Texas Instruments 3-Port Ethernet Switch Address Lookup Engine |
| 2 | + * Texas Instruments N-Port Ethernet Switch Address Lookup Engine |
3 | 3 | *
|
4 | 4 | * Copyright (C) 2012 Texas Instruments
|
5 | 5 | *
|
|
27 | 27 |
|
28 | 28 | #define BITMASK(bits) (BIT(bits) - 1)
|
29 | 29 |
|
30 |
| -#define ALE_VERSION_MAJOR(rev) ((rev >> 8) & 0xff) |
| 30 | +#define ALE_VERSION_MAJOR(rev, mask) (((rev) >> 8) & (mask)) |
31 | 31 | #define ALE_VERSION_MINOR(rev) (rev & 0xff)
|
| 32 | +#define ALE_VERSION_1R4 0x0104 |
32 | 33 |
|
33 | 34 | /* ALE Registers */
|
34 | 35 | #define ALE_IDVER 0x00
|
|
39 | 40 | #define ALE_TABLE 0x34
|
40 | 41 | #define ALE_PORTCTL 0x40
|
41 | 42 |
|
| 43 | +/* ALE NetCP NU switch specific Registers */ |
| 44 | +#define ALE_UNKNOWNVLAN_MEMBER 0x90 |
| 45 | +#define ALE_UNKNOWNVLAN_UNREG_MCAST_FLOOD 0x94 |
| 46 | +#define ALE_UNKNOWNVLAN_REG_MCAST_FLOOD 0x98 |
| 47 | +#define ALE_UNKNOWNVLAN_FORCE_UNTAG_EGRESS 0x9C |
| 48 | + |
42 | 49 | #define ALE_TABLE_WRITE BIT(31)
|
43 | 50 |
|
44 | 51 | #define ALE_TYPE_FREE 0
|
@@ -464,7 +471,7 @@ struct ale_control_info {
|
464 | 471 | int bits;
|
465 | 472 | };
|
466 | 473 |
|
467 |
| -static const struct ale_control_info ale_controls[ALE_NUM_CONTROLS] = { |
| 474 | +static struct ale_control_info ale_controls[ALE_NUM_CONTROLS] = { |
468 | 475 | [ALE_ENABLE] = {
|
469 | 476 | .name = "enable",
|
470 | 477 | .offset = ALE_CONTROL,
|
@@ -724,8 +731,41 @@ void cpsw_ale_start(struct cpsw_ale *ale)
|
724 | 731 | u32 rev;
|
725 | 732 |
|
726 | 733 | rev = __raw_readl(ale->params.ale_regs + ALE_IDVER);
|
727 |
| - dev_dbg(ale->params.dev, "initialized cpsw ale revision %d.%d\n", |
728 |
| - ALE_VERSION_MAJOR(rev), ALE_VERSION_MINOR(rev)); |
| 734 | + if (!ale->params.major_ver_mask) |
| 735 | + ale->params.major_ver_mask = 0xff; |
| 736 | + ale->version = |
| 737 | + (ALE_VERSION_MAJOR(rev, ale->params.major_ver_mask) << 8) | |
| 738 | + ALE_VERSION_MINOR(rev); |
| 739 | + dev_info(ale->params.dev, "initialized cpsw ale version %d.%d\n", |
| 740 | + ALE_VERSION_MAJOR(rev, ale->params.major_ver_mask), |
| 741 | + ALE_VERSION_MINOR(rev)); |
| 742 | + |
| 743 | + if (ale->params.nu_switch_ale) { |
| 744 | + /* Separate registers for unknown vlan configuration. |
| 745 | + * Also there are N bits, where N is number of ale |
| 746 | + * ports and shift value should be 0 |
| 747 | + */ |
| 748 | + ale_controls[ALE_PORT_UNKNOWN_VLAN_MEMBER].bits = |
| 749 | + ale->params.ale_ports; |
| 750 | + ale_controls[ALE_PORT_UNKNOWN_VLAN_MEMBER].offset = |
| 751 | + ALE_UNKNOWNVLAN_MEMBER; |
| 752 | + ale_controls[ALE_PORT_UNKNOWN_MCAST_FLOOD].bits = |
| 753 | + ale->params.ale_ports; |
| 754 | + ale_controls[ALE_PORT_UNKNOWN_MCAST_FLOOD].shift = 0; |
| 755 | + ale_controls[ALE_PORT_UNKNOWN_MCAST_FLOOD].offset = |
| 756 | + ALE_UNKNOWNVLAN_UNREG_MCAST_FLOOD; |
| 757 | + ale_controls[ALE_PORT_UNKNOWN_REG_MCAST_FLOOD].bits = |
| 758 | + ale->params.ale_ports; |
| 759 | + ale_controls[ALE_PORT_UNKNOWN_REG_MCAST_FLOOD].shift = 0; |
| 760 | + ale_controls[ALE_PORT_UNKNOWN_REG_MCAST_FLOOD].offset = |
| 761 | + ALE_UNKNOWNVLAN_REG_MCAST_FLOOD; |
| 762 | + ale_controls[ALE_PORT_UNTAGGED_EGRESS].bits = |
| 763 | + ale->params.ale_ports; |
| 764 | + ale_controls[ALE_PORT_UNTAGGED_EGRESS].shift = 0; |
| 765 | + ale_controls[ALE_PORT_UNTAGGED_EGRESS].offset = |
| 766 | + ALE_UNKNOWNVLAN_FORCE_UNTAG_EGRESS; |
| 767 | + } |
| 768 | + |
729 | 769 | cpsw_ale_control_set(ale, 0, ALE_ENABLE, 1);
|
730 | 770 | cpsw_ale_control_set(ale, 0, ALE_CLEAR, 1);
|
731 | 771 |
|
|
0 commit comments