2 * Microchip switch driver main logic
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include <linux/delay.h>
20 #include <linux/export.h>
21 #include <linux/gpio.h>
22 #include <linux/kernel.h>
23 #include <linux/module.h>
24 #include <linux/platform_data/microchip-ksz.h>
25 #include <linux/phy.h>
26 #include <linux/etherdevice.h>
27 #include <linux/if_bridge.h>
29 #include <net/switchdev.h>
35 char string
[ETH_GSTRING_LEN
];
36 } mib_names
[TOTAL_SWITCH_COUNTER_NUM
] = {
38 { 0x01, "rx_undersize" },
39 { 0x02, "rx_fragments" },
40 { 0x03, "rx_oversize" },
41 { 0x04, "rx_jabbers" },
42 { 0x05, "rx_symbol_err" },
43 { 0x06, "rx_crc_err" },
44 { 0x07, "rx_align_err" },
45 { 0x08, "rx_mac_ctrl" },
50 { 0x0D, "rx_64_or_less" },
51 { 0x0E, "rx_65_127" },
52 { 0x0F, "rx_128_255" },
53 { 0x10, "rx_256_511" },
54 { 0x11, "rx_512_1023" },
55 { 0x12, "rx_1024_1522" },
56 { 0x13, "rx_1523_2000" },
59 { 0x16, "tx_late_col" },
64 { 0x1B, "tx_deferred" },
65 { 0x1C, "tx_total_col" },
66 { 0x1D, "tx_exc_col" },
67 { 0x1E, "tx_single_col" },
68 { 0x1F, "tx_mult_col" },
71 { 0x82, "rx_discards" },
72 { 0x83, "tx_discards" },
75 static void ksz_cfg(struct ksz_device
*dev
, u32 addr
, u8 bits
, bool set
)
79 ksz_read8(dev
, addr
, &data
);
84 ksz_write8(dev
, addr
, data
);
87 static void ksz_cfg32(struct ksz_device
*dev
, u32 addr
, u32 bits
, bool set
)
91 ksz_read32(dev
, addr
, &data
);
96 ksz_write32(dev
, addr
, data
);
99 static void ksz_port_cfg(struct ksz_device
*dev
, int port
, int offset
, u8 bits
,
105 addr
= PORT_CTRL_ADDR(port
, offset
);
106 ksz_read8(dev
, addr
, &data
);
113 ksz_write8(dev
, addr
, data
);
116 static void ksz_port_cfg32(struct ksz_device
*dev
, int port
, int offset
,
122 addr
= PORT_CTRL_ADDR(port
, offset
);
123 ksz_read32(dev
, addr
, &data
);
130 ksz_write32(dev
, addr
, data
);
133 static int wait_vlan_ctrl_ready(struct ksz_device
*dev
, u32 waiton
, int timeout
)
138 ksz_read8(dev
, REG_SW_VLAN_CTRL
, &data
);
139 if (!(data
& waiton
))
142 } while (timeout
-- > 0);
150 static int get_vlan_table(struct dsa_switch
*ds
, u16 vid
, u32
*vlan_table
)
152 struct ksz_device
*dev
= ds
->priv
;
155 mutex_lock(&dev
->vlan_mutex
);
157 ksz_write16(dev
, REG_SW_VLAN_ENTRY_INDEX__2
, vid
& VLAN_INDEX_M
);
158 ksz_write8(dev
, REG_SW_VLAN_CTRL
, VLAN_READ
| VLAN_START
);
160 /* wait to be cleared */
161 ret
= wait_vlan_ctrl_ready(dev
, VLAN_START
, 1000);
163 dev_dbg(dev
->dev
, "Failed to read vlan table\n");
167 ksz_read32(dev
, REG_SW_VLAN_ENTRY__4
, &vlan_table
[0]);
168 ksz_read32(dev
, REG_SW_VLAN_ENTRY_UNTAG__4
, &vlan_table
[1]);
169 ksz_read32(dev
, REG_SW_VLAN_ENTRY_PORTS__4
, &vlan_table
[2]);
171 ksz_write8(dev
, REG_SW_VLAN_CTRL
, 0);
174 mutex_unlock(&dev
->vlan_mutex
);
179 static int set_vlan_table(struct dsa_switch
*ds
, u16 vid
, u32
*vlan_table
)
181 struct ksz_device
*dev
= ds
->priv
;
184 mutex_lock(&dev
->vlan_mutex
);
186 ksz_write32(dev
, REG_SW_VLAN_ENTRY__4
, vlan_table
[0]);
187 ksz_write32(dev
, REG_SW_VLAN_ENTRY_UNTAG__4
, vlan_table
[1]);
188 ksz_write32(dev
, REG_SW_VLAN_ENTRY_PORTS__4
, vlan_table
[2]);
190 ksz_write16(dev
, REG_SW_VLAN_ENTRY_INDEX__2
, vid
& VLAN_INDEX_M
);
191 ksz_write8(dev
, REG_SW_VLAN_CTRL
, VLAN_START
| VLAN_WRITE
);
193 /* wait to be cleared */
194 ret
= wait_vlan_ctrl_ready(dev
, VLAN_START
, 1000);
196 dev_dbg(dev
->dev
, "Failed to write vlan table\n");
200 ksz_write8(dev
, REG_SW_VLAN_CTRL
, 0);
202 /* update vlan cache table */
203 dev
->vlan_cache
[vid
].table
[0] = vlan_table
[0];
204 dev
->vlan_cache
[vid
].table
[1] = vlan_table
[1];
205 dev
->vlan_cache
[vid
].table
[2] = vlan_table
[2];
208 mutex_unlock(&dev
->vlan_mutex
);
213 static void read_table(struct dsa_switch
*ds
, u32
*table
)
215 struct ksz_device
*dev
= ds
->priv
;
217 ksz_read32(dev
, REG_SW_ALU_VAL_A
, &table
[0]);
218 ksz_read32(dev
, REG_SW_ALU_VAL_B
, &table
[1]);
219 ksz_read32(dev
, REG_SW_ALU_VAL_C
, &table
[2]);
220 ksz_read32(dev
, REG_SW_ALU_VAL_D
, &table
[3]);
223 static void write_table(struct dsa_switch
*ds
, u32
*table
)
225 struct ksz_device
*dev
= ds
->priv
;
227 ksz_write32(dev
, REG_SW_ALU_VAL_A
, table
[0]);
228 ksz_write32(dev
, REG_SW_ALU_VAL_B
, table
[1]);
229 ksz_write32(dev
, REG_SW_ALU_VAL_C
, table
[2]);
230 ksz_write32(dev
, REG_SW_ALU_VAL_D
, table
[3]);
233 static int wait_alu_ready(struct ksz_device
*dev
, u32 waiton
, int timeout
)
238 ksz_read32(dev
, REG_SW_ALU_CTRL__4
, &data
);
239 if (!(data
& waiton
))
242 } while (timeout
-- > 0);
250 static int wait_alu_sta_ready(struct ksz_device
*dev
, u32 waiton
, int timeout
)
255 ksz_read32(dev
, REG_SW_ALU_STAT_CTRL__4
, &data
);
256 if (!(data
& waiton
))
259 } while (timeout
-- > 0);
267 static int ksz_reset_switch(struct dsa_switch
*ds
)
269 struct ksz_device
*dev
= ds
->priv
;
275 ksz_cfg(dev
, REG_SW_OPERATION
, SW_RESET
, true);
277 /* turn off SPI DO Edge select */
278 ksz_read8(dev
, REG_SW_GLOBAL_SERIAL_CTRL_0
, &data8
);
279 data8
&= ~SPI_AUTO_EDGE_DETECTION
;
280 ksz_write8(dev
, REG_SW_GLOBAL_SERIAL_CTRL_0
, data8
);
282 /* default configuration */
283 ksz_read8(dev
, REG_SW_LUE_CTRL_1
, &data8
);
284 data8
= SW_AGING_ENABLE
| SW_LINK_AUTO_AGING
|
285 SW_SRC_ADDR_FILTER
| SW_FLUSH_STP_TABLE
| SW_FLUSH_MSTP_TABLE
;
286 ksz_write8(dev
, REG_SW_LUE_CTRL_1
, data8
);
288 /* disable interrupts */
289 ksz_write32(dev
, REG_SW_INT_MASK__4
, SWITCH_INT_MASK
);
290 ksz_write32(dev
, REG_SW_PORT_INT_MASK__4
, 0x7F);
291 ksz_read32(dev
, REG_SW_PORT_INT_STATUS__4
, &data32
);
293 /* set broadcast storm protection 10% rate */
294 ksz_read16(dev
, REG_SW_MAC_CTRL_2
, &data16
);
295 data16
&= ~BROADCAST_STORM_RATE
;
296 data16
|= (BROADCAST_STORM_VALUE
* BROADCAST_STORM_PROT_RATE
) / 100;
297 ksz_write16(dev
, REG_SW_MAC_CTRL_2
, data16
);
302 static void port_setup(struct ksz_device
*dev
, int port
, bool cpu_port
)
307 /* enable tag tail for host port */
309 ksz_port_cfg(dev
, port
, REG_PORT_CTRL_0
, PORT_TAIL_TAG_ENABLE
,
312 ksz_port_cfg(dev
, port
, REG_PORT_CTRL_0
, PORT_MAC_LOOPBACK
, false);
314 /* set back pressure */
315 ksz_port_cfg(dev
, port
, REG_PORT_MAC_CTRL_1
, PORT_BACK_PRESSURE
, true);
317 /* set flow control */
318 ksz_port_cfg(dev
, port
, REG_PORT_CTRL_0
,
319 PORT_FORCE_TX_FLOW_CTRL
| PORT_FORCE_RX_FLOW_CTRL
, true);
321 /* enable broadcast storm limit */
322 ksz_port_cfg(dev
, port
, P_BCAST_STORM_CTRL
, PORT_BROADCAST_STORM
, true);
324 /* disable DiffServ priority */
325 ksz_port_cfg(dev
, port
, P_PRIO_CTRL
, PORT_DIFFSERV_PRIO_ENABLE
, false);
327 /* replace priority */
328 ksz_port_cfg(dev
, port
, REG_PORT_MRI_MAC_CTRL
, PORT_USER_PRIO_CEILING
,
330 ksz_port_cfg32(dev
, port
, REG_PORT_MTI_QUEUE_CTRL_0__4
,
331 MTI_PVID_REPLACE
, false);
333 /* enable 802.1p priority */
334 ksz_port_cfg(dev
, port
, P_PRIO_CTRL
, PORT_802_1P_PRIO_ENABLE
, true);
336 /* configure MAC to 1G & RGMII mode */
337 ksz_pread8(dev
, port
, REG_PORT_XMII_CTRL_1
, &data8
);
338 data8
|= PORT_RGMII_ID_EG_ENABLE
;
339 data8
&= ~PORT_MII_NOT_1GBIT
;
340 data8
&= ~PORT_MII_SEL_M
;
341 data8
|= PORT_RGMII_SEL
;
342 ksz_pwrite8(dev
, port
, REG_PORT_XMII_CTRL_1
, data8
);
344 /* clear pending interrupts */
345 ksz_pread16(dev
, port
, REG_PORT_PHY_INT_ENABLE
, &data16
);
348 static void ksz_config_cpu_port(struct dsa_switch
*ds
)
350 struct ksz_device
*dev
= ds
->priv
;
353 ds
->num_ports
= dev
->port_cnt
;
355 for (i
= 0; i
< ds
->num_ports
; i
++) {
356 if (dsa_is_cpu_port(ds
, i
) && (dev
->cpu_ports
& (1 << i
))) {
359 /* enable cpu port */
360 port_setup(dev
, i
, true);
365 static int ksz_setup(struct dsa_switch
*ds
)
367 struct ksz_device
*dev
= ds
->priv
;
370 dev
->vlan_cache
= devm_kcalloc(dev
->dev
, sizeof(struct vlan_table
),
371 dev
->num_vlans
, GFP_KERNEL
);
372 if (!dev
->vlan_cache
)
375 ret
= ksz_reset_switch(ds
);
377 dev_err(ds
->dev
, "failed to reset switch\n");
381 /* accept packet up to 2000bytes */
382 ksz_cfg(dev
, REG_SW_MAC_CTRL_1
, SW_LEGAL_PACKET_DISABLE
, true);
384 ksz_config_cpu_port(ds
);
386 ksz_cfg(dev
, REG_SW_MAC_CTRL_1
, MULTICAST_STORM_DISABLE
, true);
388 /* queue based egress rate limit */
389 ksz_cfg(dev
, REG_SW_MAC_CTRL_5
, SW_OUT_RATE_LIMIT_QUEUE_BASED
, true);
392 ksz_cfg(dev
, REG_SW_OPERATION
, SW_START
, true);
397 static enum dsa_tag_protocol
ksz_get_tag_protocol(struct dsa_switch
*ds
,
400 return DSA_TAG_PROTO_KSZ
;
403 static int ksz_phy_read16(struct dsa_switch
*ds
, int addr
, int reg
)
405 struct ksz_device
*dev
= ds
->priv
;
408 ksz_pread16(dev
, addr
, 0x100 + (reg
<< 1), &val
);
413 static int ksz_phy_write16(struct dsa_switch
*ds
, int addr
, int reg
, u16 val
)
415 struct ksz_device
*dev
= ds
->priv
;
417 ksz_pwrite16(dev
, addr
, 0x100 + (reg
<< 1), val
);
422 static int ksz_enable_port(struct dsa_switch
*ds
, int port
,
423 struct phy_device
*phy
)
425 struct ksz_device
*dev
= ds
->priv
;
427 /* setup slave port */
428 port_setup(dev
, port
, false);
433 static void ksz_disable_port(struct dsa_switch
*ds
, int port
,
434 struct phy_device
*phy
)
436 struct ksz_device
*dev
= ds
->priv
;
438 /* there is no port disable */
439 ksz_port_cfg(dev
, port
, REG_PORT_CTRL_0
, PORT_MAC_LOOPBACK
, true);
442 static int ksz_sset_count(struct dsa_switch
*ds
, int port
, int sset
)
444 if (sset
!= ETH_SS_STATS
)
447 return TOTAL_SWITCH_COUNTER_NUM
;
450 static void ksz_get_strings(struct dsa_switch
*ds
, int port
,
451 u32 stringset
, uint8_t *buf
)
455 if (stringset
!= ETH_SS_STATS
)
458 for (i
= 0; i
< TOTAL_SWITCH_COUNTER_NUM
; i
++) {
459 memcpy(buf
+ i
* ETH_GSTRING_LEN
, mib_names
[i
].string
,
464 static void ksz_get_ethtool_stats(struct dsa_switch
*ds
, int port
,
467 struct ksz_device
*dev
= ds
->priv
;
472 mutex_lock(&dev
->stats_mutex
);
474 for (i
= 0; i
< TOTAL_SWITCH_COUNTER_NUM
; i
++) {
475 data
= MIB_COUNTER_READ
;
476 data
|= ((mib_names
[i
].index
& 0xFF) << MIB_COUNTER_INDEX_S
);
477 ksz_pwrite32(dev
, port
, REG_PORT_MIB_CTRL_STAT__4
, data
);
481 ksz_pread32(dev
, port
, REG_PORT_MIB_CTRL_STAT__4
,
484 if (!(data
& MIB_COUNTER_READ
))
486 } while (timeout
-- > 0);
488 /* failed to read MIB. get out of loop */
490 dev_dbg(dev
->dev
, "Failed to get MIB\n");
494 /* count resets upon read */
495 ksz_pread32(dev
, port
, REG_PORT_MIB_DATA
, &data
);
497 dev
->mib_value
[i
] += (uint64_t)data
;
498 buf
[i
] = dev
->mib_value
[i
];
501 mutex_unlock(&dev
->stats_mutex
);
504 static void ksz_port_stp_state_set(struct dsa_switch
*ds
, int port
, u8 state
)
506 struct ksz_device
*dev
= ds
->priv
;
509 ksz_pread8(dev
, port
, P_STP_CTRL
, &data
);
510 data
&= ~(PORT_TX_ENABLE
| PORT_RX_ENABLE
| PORT_LEARN_DISABLE
);
513 case BR_STATE_DISABLED
:
514 data
|= PORT_LEARN_DISABLE
;
516 case BR_STATE_LISTENING
:
517 data
|= (PORT_RX_ENABLE
| PORT_LEARN_DISABLE
);
519 case BR_STATE_LEARNING
:
520 data
|= PORT_RX_ENABLE
;
522 case BR_STATE_FORWARDING
:
523 data
|= (PORT_TX_ENABLE
| PORT_RX_ENABLE
);
525 case BR_STATE_BLOCKING
:
526 data
|= PORT_LEARN_DISABLE
;
529 dev_err(ds
->dev
, "invalid STP state: %d\n", state
);
533 ksz_pwrite8(dev
, port
, P_STP_CTRL
, data
);
536 static void ksz_port_fast_age(struct dsa_switch
*ds
, int port
)
538 struct ksz_device
*dev
= ds
->priv
;
541 ksz_read8(dev
, REG_SW_LUE_CTRL_1
, &data8
);
542 data8
|= SW_FAST_AGING
;
543 ksz_write8(dev
, REG_SW_LUE_CTRL_1
, data8
);
545 data8
&= ~SW_FAST_AGING
;
546 ksz_write8(dev
, REG_SW_LUE_CTRL_1
, data8
);
549 static int ksz_port_vlan_filtering(struct dsa_switch
*ds
, int port
, bool flag
)
551 struct ksz_device
*dev
= ds
->priv
;
554 ksz_port_cfg(dev
, port
, REG_PORT_LUE_CTRL
,
555 PORT_VLAN_LOOKUP_VID_0
, true);
556 ksz_cfg32(dev
, REG_SW_QM_CTRL__4
, UNICAST_VLAN_BOUNDARY
, true);
557 ksz_cfg(dev
, REG_SW_LUE_CTRL_0
, SW_VLAN_ENABLE
, true);
559 ksz_cfg(dev
, REG_SW_LUE_CTRL_0
, SW_VLAN_ENABLE
, false);
560 ksz_cfg32(dev
, REG_SW_QM_CTRL__4
, UNICAST_VLAN_BOUNDARY
, false);
561 ksz_port_cfg(dev
, port
, REG_PORT_LUE_CTRL
,
562 PORT_VLAN_LOOKUP_VID_0
, false);
568 static int ksz_port_vlan_prepare(struct dsa_switch
*ds
, int port
,
569 const struct switchdev_obj_port_vlan
*vlan
)
576 static void ksz_port_vlan_add(struct dsa_switch
*ds
, int port
,
577 const struct switchdev_obj_port_vlan
*vlan
)
579 struct ksz_device
*dev
= ds
->priv
;
582 bool untagged
= vlan
->flags
& BRIDGE_VLAN_INFO_UNTAGGED
;
584 for (vid
= vlan
->vid_begin
; vid
<= vlan
->vid_end
; vid
++) {
585 if (get_vlan_table(ds
, vid
, vlan_table
)) {
586 dev_dbg(dev
->dev
, "Failed to get vlan table\n");
590 vlan_table
[0] = VLAN_VALID
| (vid
& VLAN_FID_M
);
592 vlan_table
[1] |= BIT(port
);
594 vlan_table
[1] &= ~BIT(port
);
595 vlan_table
[1] &= ~(BIT(dev
->cpu_port
));
597 vlan_table
[2] |= BIT(port
) | BIT(dev
->cpu_port
);
599 if (set_vlan_table(ds
, vid
, vlan_table
)) {
600 dev_dbg(dev
->dev
, "Failed to set vlan table\n");
605 if (vlan
->flags
& BRIDGE_VLAN_INFO_PVID
)
606 ksz_pwrite16(dev
, port
, REG_PORT_DEFAULT_VID
, vid
);
610 static int ksz_port_vlan_del(struct dsa_switch
*ds
, int port
,
611 const struct switchdev_obj_port_vlan
*vlan
)
613 struct ksz_device
*dev
= ds
->priv
;
614 bool untagged
= vlan
->flags
& BRIDGE_VLAN_INFO_UNTAGGED
;
619 ksz_pread16(dev
, port
, REG_PORT_DEFAULT_VID
, &pvid
);
622 for (vid
= vlan
->vid_begin
; vid
<= vlan
->vid_end
; vid
++) {
623 if (get_vlan_table(ds
, vid
, vlan_table
)) {
624 dev_dbg(dev
->dev
, "Failed to get vlan table\n");
628 vlan_table
[2] &= ~BIT(port
);
634 vlan_table
[1] &= ~BIT(port
);
636 if (set_vlan_table(ds
, vid
, vlan_table
)) {
637 dev_dbg(dev
->dev
, "Failed to set vlan table\n");
642 ksz_pwrite16(dev
, port
, REG_PORT_DEFAULT_VID
, pvid
);
666 static int ksz_port_fdb_add(struct dsa_switch
*ds
, int port
,
667 const unsigned char *addr
, u16 vid
)
669 struct ksz_device
*dev
= ds
->priv
;
674 mutex_lock(&dev
->alu_mutex
);
676 /* find any entry with mac & vid */
677 data
= vid
<< ALU_FID_INDEX_S
;
678 data
|= ((addr
[0] << 8) | addr
[1]);
679 ksz_write32(dev
, REG_SW_ALU_INDEX_0
, data
);
681 data
= ((addr
[2] << 24) | (addr
[3] << 16));
682 data
|= ((addr
[4] << 8) | addr
[5]);
683 ksz_write32(dev
, REG_SW_ALU_INDEX_1
, data
);
685 /* start read operation */
686 ksz_write32(dev
, REG_SW_ALU_CTRL__4
, ALU_READ
| ALU_START
);
688 /* wait to be finished */
689 ret
= wait_alu_ready(dev
, ALU_START
, 1000);
691 dev_dbg(dev
->dev
, "Failed to read ALU\n");
696 read_table(ds
, alu_table
);
698 /* update ALU entry */
699 alu_table
[0] = ALU_V_STATIC_VALID
;
700 alu_table
[1] |= BIT(port
);
702 alu_table
[1] |= ALU_V_USE_FID
;
703 alu_table
[2] = (vid
<< ALU_V_FID_S
);
704 alu_table
[2] |= ((addr
[0] << 8) | addr
[1]);
705 alu_table
[3] = ((addr
[2] << 24) | (addr
[3] << 16));
706 alu_table
[3] |= ((addr
[4] << 8) | addr
[5]);
708 write_table(ds
, alu_table
);
710 ksz_write32(dev
, REG_SW_ALU_CTRL__4
, ALU_WRITE
| ALU_START
);
712 /* wait to be finished */
713 ret
= wait_alu_ready(dev
, ALU_START
, 1000);
715 dev_dbg(dev
->dev
, "Failed to write ALU\n");
718 mutex_unlock(&dev
->alu_mutex
);
723 static int ksz_port_fdb_del(struct dsa_switch
*ds
, int port
,
724 const unsigned char *addr
, u16 vid
)
726 struct ksz_device
*dev
= ds
->priv
;
731 mutex_lock(&dev
->alu_mutex
);
733 /* read any entry with mac & vid */
734 data
= vid
<< ALU_FID_INDEX_S
;
735 data
|= ((addr
[0] << 8) | addr
[1]);
736 ksz_write32(dev
, REG_SW_ALU_INDEX_0
, data
);
738 data
= ((addr
[2] << 24) | (addr
[3] << 16));
739 data
|= ((addr
[4] << 8) | addr
[5]);
740 ksz_write32(dev
, REG_SW_ALU_INDEX_1
, data
);
742 /* start read operation */
743 ksz_write32(dev
, REG_SW_ALU_CTRL__4
, ALU_READ
| ALU_START
);
745 /* wait to be finished */
746 ret
= wait_alu_ready(dev
, ALU_START
, 1000);
748 dev_dbg(dev
->dev
, "Failed to read ALU\n");
752 ksz_read32(dev
, REG_SW_ALU_VAL_A
, &alu_table
[0]);
753 if (alu_table
[0] & ALU_V_STATIC_VALID
) {
754 ksz_read32(dev
, REG_SW_ALU_VAL_B
, &alu_table
[1]);
755 ksz_read32(dev
, REG_SW_ALU_VAL_C
, &alu_table
[2]);
756 ksz_read32(dev
, REG_SW_ALU_VAL_D
, &alu_table
[3]);
758 /* clear forwarding port */
759 alu_table
[2] &= ~BIT(port
);
761 /* if there is no port to forward, clear table */
762 if ((alu_table
[2] & ALU_V_PORT_MAP
) == 0) {
775 write_table(ds
, alu_table
);
777 ksz_write32(dev
, REG_SW_ALU_CTRL__4
, ALU_WRITE
| ALU_START
);
779 /* wait to be finished */
780 ret
= wait_alu_ready(dev
, ALU_START
, 1000);
782 dev_dbg(dev
->dev
, "Failed to write ALU\n");
785 mutex_unlock(&dev
->alu_mutex
);
790 static void convert_alu(struct alu_struct
*alu
, u32
*alu_table
)
792 alu
->is_static
= !!(alu_table
[0] & ALU_V_STATIC_VALID
);
793 alu
->is_src_filter
= !!(alu_table
[0] & ALU_V_SRC_FILTER
);
794 alu
->is_dst_filter
= !!(alu_table
[0] & ALU_V_DST_FILTER
);
795 alu
->prio_age
= (alu_table
[0] >> ALU_V_PRIO_AGE_CNT_S
) &
796 ALU_V_PRIO_AGE_CNT_M
;
797 alu
->mstp
= alu_table
[0] & ALU_V_MSTP_M
;
799 alu
->is_override
= !!(alu_table
[1] & ALU_V_OVERRIDE
);
800 alu
->is_use_fid
= !!(alu_table
[1] & ALU_V_USE_FID
);
801 alu
->port_forward
= alu_table
[1] & ALU_V_PORT_MAP
;
803 alu
->fid
= (alu_table
[2] >> ALU_V_FID_S
) & ALU_V_FID_M
;
805 alu
->mac
[0] = (alu_table
[2] >> 8) & 0xFF;
806 alu
->mac
[1] = alu_table
[2] & 0xFF;
807 alu
->mac
[2] = (alu_table
[3] >> 24) & 0xFF;
808 alu
->mac
[3] = (alu_table
[3] >> 16) & 0xFF;
809 alu
->mac
[4] = (alu_table
[3] >> 8) & 0xFF;
810 alu
->mac
[5] = alu_table
[3] & 0xFF;
813 static int ksz_port_fdb_dump(struct dsa_switch
*ds
, int port
,
814 dsa_fdb_dump_cb_t
*cb
, void *data
)
816 struct ksz_device
*dev
= ds
->priv
;
820 struct alu_struct alu
;
823 mutex_lock(&dev
->alu_mutex
);
825 /* start ALU search */
826 ksz_write32(dev
, REG_SW_ALU_CTRL__4
, ALU_START
| ALU_SEARCH
);
831 ksz_read32(dev
, REG_SW_ALU_CTRL__4
, &ksz_data
);
832 if ((ksz_data
& ALU_VALID
) || !(ksz_data
& ALU_START
))
835 } while (timeout
-- > 0);
838 dev_dbg(dev
->dev
, "Failed to search ALU\n");
844 read_table(ds
, alu_table
);
846 convert_alu(&alu
, alu_table
);
848 if (alu
.port_forward
& BIT(port
)) {
849 ret
= cb(alu
.mac
, alu
.fid
, alu
.is_static
, data
);
853 } while (ksz_data
& ALU_START
);
857 /* stop ALU search */
858 ksz_write32(dev
, REG_SW_ALU_CTRL__4
, 0);
860 mutex_unlock(&dev
->alu_mutex
);
865 static int ksz_port_mdb_prepare(struct dsa_switch
*ds
, int port
,
866 const struct switchdev_obj_port_mdb
*mdb
)
872 static void ksz_port_mdb_add(struct dsa_switch
*ds
, int port
,
873 const struct switchdev_obj_port_mdb
*mdb
)
875 struct ksz_device
*dev
= ds
->priv
;
881 mac_hi
= ((mdb
->addr
[0] << 8) | mdb
->addr
[1]);
882 mac_lo
= ((mdb
->addr
[2] << 24) | (mdb
->addr
[3] << 16));
883 mac_lo
|= ((mdb
->addr
[4] << 8) | mdb
->addr
[5]);
885 mutex_lock(&dev
->alu_mutex
);
887 for (index
= 0; index
< dev
->num_statics
; index
++) {
888 /* find empty slot first */
889 data
= (index
<< ALU_STAT_INDEX_S
) |
890 ALU_STAT_READ
| ALU_STAT_START
;
891 ksz_write32(dev
, REG_SW_ALU_STAT_CTRL__4
, data
);
893 /* wait to be finished */
894 if (wait_alu_sta_ready(dev
, ALU_STAT_START
, 1000) < 0) {
895 dev_dbg(dev
->dev
, "Failed to read ALU STATIC\n");
899 /* read ALU static table */
900 read_table(ds
, static_table
);
902 if (static_table
[0] & ALU_V_STATIC_VALID
) {
903 /* check this has same vid & mac address */
904 if (((static_table
[2] >> ALU_V_FID_S
) == (mdb
->vid
)) &&
905 ((static_table
[2] & ALU_V_MAC_ADDR_HI
) == mac_hi
) &&
906 (static_table
[3] == mac_lo
)) {
907 /* found matching one */
911 /* found empty one */
916 /* no available entry */
917 if (index
== dev
->num_statics
)
921 static_table
[0] = ALU_V_STATIC_VALID
;
922 static_table
[1] |= BIT(port
);
924 static_table
[1] |= ALU_V_USE_FID
;
925 static_table
[2] = (mdb
->vid
<< ALU_V_FID_S
);
926 static_table
[2] |= mac_hi
;
927 static_table
[3] = mac_lo
;
929 write_table(ds
, static_table
);
931 data
= (index
<< ALU_STAT_INDEX_S
) | ALU_STAT_START
;
932 ksz_write32(dev
, REG_SW_ALU_STAT_CTRL__4
, data
);
934 /* wait to be finished */
935 if (wait_alu_sta_ready(dev
, ALU_STAT_START
, 1000) < 0)
936 dev_dbg(dev
->dev
, "Failed to read ALU STATIC\n");
939 mutex_unlock(&dev
->alu_mutex
);
942 static int ksz_port_mdb_del(struct dsa_switch
*ds
, int port
,
943 const struct switchdev_obj_port_mdb
*mdb
)
945 struct ksz_device
*dev
= ds
->priv
;
952 mac_hi
= ((mdb
->addr
[0] << 8) | mdb
->addr
[1]);
953 mac_lo
= ((mdb
->addr
[2] << 24) | (mdb
->addr
[3] << 16));
954 mac_lo
|= ((mdb
->addr
[4] << 8) | mdb
->addr
[5]);
956 mutex_lock(&dev
->alu_mutex
);
958 for (index
= 0; index
< dev
->num_statics
; index
++) {
959 /* find empty slot first */
960 data
= (index
<< ALU_STAT_INDEX_S
) |
961 ALU_STAT_READ
| ALU_STAT_START
;
962 ksz_write32(dev
, REG_SW_ALU_STAT_CTRL__4
, data
);
964 /* wait to be finished */
965 ret
= wait_alu_sta_ready(dev
, ALU_STAT_START
, 1000);
967 dev_dbg(dev
->dev
, "Failed to read ALU STATIC\n");
971 /* read ALU static table */
972 read_table(ds
, static_table
);
974 if (static_table
[0] & ALU_V_STATIC_VALID
) {
975 /* check this has same vid & mac address */
977 if (((static_table
[2] >> ALU_V_FID_S
) == (mdb
->vid
)) &&
978 ((static_table
[2] & ALU_V_MAC_ADDR_HI
) == mac_hi
) &&
979 (static_table
[3] == mac_lo
)) {
980 /* found matching one */
986 /* no available entry */
987 if (index
== dev
->num_statics
) {
993 static_table
[1] &= ~BIT(port
);
995 if ((static_table
[1] & ALU_V_PORT_MAP
) == 0) {
1000 static_table
[3] = 0;
1003 write_table(ds
, static_table
);
1005 data
= (index
<< ALU_STAT_INDEX_S
) | ALU_STAT_START
;
1006 ksz_write32(dev
, REG_SW_ALU_STAT_CTRL__4
, data
);
1008 /* wait to be finished */
1009 ret
= wait_alu_sta_ready(dev
, ALU_STAT_START
, 1000);
1011 dev_dbg(dev
->dev
, "Failed to read ALU STATIC\n");
1014 mutex_unlock(&dev
->alu_mutex
);
1019 static int ksz_port_mirror_add(struct dsa_switch
*ds
, int port
,
1020 struct dsa_mall_mirror_tc_entry
*mirror
,
1023 struct ksz_device
*dev
= ds
->priv
;
1026 ksz_port_cfg(dev
, port
, P_MIRROR_CTRL
, PORT_MIRROR_RX
, true);
1028 ksz_port_cfg(dev
, port
, P_MIRROR_CTRL
, PORT_MIRROR_TX
, true);
1030 ksz_port_cfg(dev
, port
, P_MIRROR_CTRL
, PORT_MIRROR_SNIFFER
, false);
1032 /* configure mirror port */
1033 ksz_port_cfg(dev
, mirror
->to_local_port
, P_MIRROR_CTRL
,
1034 PORT_MIRROR_SNIFFER
, true);
1036 ksz_cfg(dev
, S_MIRROR_CTRL
, SW_MIRROR_RX_TX
, false);
1041 static void ksz_port_mirror_del(struct dsa_switch
*ds
, int port
,
1042 struct dsa_mall_mirror_tc_entry
*mirror
)
1044 struct ksz_device
*dev
= ds
->priv
;
1047 if (mirror
->ingress
)
1048 ksz_port_cfg(dev
, port
, P_MIRROR_CTRL
, PORT_MIRROR_RX
, false);
1050 ksz_port_cfg(dev
, port
, P_MIRROR_CTRL
, PORT_MIRROR_TX
, false);
1052 ksz_pread8(dev
, port
, P_MIRROR_CTRL
, &data
);
1054 if (!(data
& (PORT_MIRROR_RX
| PORT_MIRROR_TX
)))
1055 ksz_port_cfg(dev
, mirror
->to_local_port
, P_MIRROR_CTRL
,
1056 PORT_MIRROR_SNIFFER
, false);
1059 static const struct dsa_switch_ops ksz_switch_ops
= {
1060 .get_tag_protocol
= ksz_get_tag_protocol
,
1062 .phy_read
= ksz_phy_read16
,
1063 .phy_write
= ksz_phy_write16
,
1064 .port_enable
= ksz_enable_port
,
1065 .port_disable
= ksz_disable_port
,
1066 .get_strings
= ksz_get_strings
,
1067 .get_ethtool_stats
= ksz_get_ethtool_stats
,
1068 .get_sset_count
= ksz_sset_count
,
1069 .port_stp_state_set
= ksz_port_stp_state_set
,
1070 .port_fast_age
= ksz_port_fast_age
,
1071 .port_vlan_filtering
= ksz_port_vlan_filtering
,
1072 .port_vlan_prepare
= ksz_port_vlan_prepare
,
1073 .port_vlan_add
= ksz_port_vlan_add
,
1074 .port_vlan_del
= ksz_port_vlan_del
,
1075 .port_fdb_dump
= ksz_port_fdb_dump
,
1076 .port_fdb_add
= ksz_port_fdb_add
,
1077 .port_fdb_del
= ksz_port_fdb_del
,
1078 .port_mdb_prepare
= ksz_port_mdb_prepare
,
1079 .port_mdb_add
= ksz_port_mdb_add
,
1080 .port_mdb_del
= ksz_port_mdb_del
,
1081 .port_mirror_add
= ksz_port_mirror_add
,
1082 .port_mirror_del
= ksz_port_mirror_del
,
1085 struct ksz_chip_data
{
1087 const char *dev_name
;
1095 static const struct ksz_chip_data ksz_switch_chips
[] = {
1097 .chip_id
= 0x00947700,
1098 .dev_name
= "KSZ9477",
1102 .cpu_ports
= 0x7F, /* can be configured as cpu port */
1103 .port_cnt
= 7, /* total physical port count */
1106 .chip_id
= 0x00989700,
1107 .dev_name
= "KSZ9897",
1111 .cpu_ports
= 0x7F, /* can be configured as cpu port */
1112 .port_cnt
= 7, /* total physical port count */
1116 static int ksz_switch_init(struct ksz_device
*dev
)
1120 dev
->ds
->ops
= &ksz_switch_ops
;
1122 for (i
= 0; i
< ARRAY_SIZE(ksz_switch_chips
); i
++) {
1123 const struct ksz_chip_data
*chip
= &ksz_switch_chips
[i
];
1125 if (dev
->chip_id
== chip
->chip_id
) {
1126 dev
->name
= chip
->dev_name
;
1127 dev
->num_vlans
= chip
->num_vlans
;
1128 dev
->num_alus
= chip
->num_alus
;
1129 dev
->num_statics
= chip
->num_statics
;
1130 dev
->port_cnt
= chip
->port_cnt
;
1131 dev
->cpu_ports
= chip
->cpu_ports
;
1137 /* no switch found */
1144 struct ksz_device
*ksz_switch_alloc(struct device
*base
,
1145 const struct ksz_io_ops
*ops
,
1148 struct dsa_switch
*ds
;
1149 struct ksz_device
*swdev
;
1151 ds
= dsa_switch_alloc(base
, DSA_MAX_PORTS
);
1155 swdev
= devm_kzalloc(base
, sizeof(*swdev
), GFP_KERNEL
);
1168 EXPORT_SYMBOL(ksz_switch_alloc
);
1170 int ksz_switch_detect(struct ksz_device
*dev
)
1176 /* turn off SPI DO Edge select */
1177 ret
= ksz_read8(dev
, REG_SW_GLOBAL_SERIAL_CTRL_0
, &data8
);
1181 data8
&= ~SPI_AUTO_EDGE_DETECTION
;
1182 ret
= ksz_write8(dev
, REG_SW_GLOBAL_SERIAL_CTRL_0
, data8
);
1187 ret
= ksz_read32(dev
, REG_CHIP_ID0__1
, &id32
);
1191 dev
->chip_id
= id32
;
1195 EXPORT_SYMBOL(ksz_switch_detect
);
1197 int ksz_switch_register(struct ksz_device
*dev
)
1202 dev
->chip_id
= dev
->pdata
->chip_id
;
1204 mutex_init(&dev
->reg_mutex
);
1205 mutex_init(&dev
->stats_mutex
);
1206 mutex_init(&dev
->alu_mutex
);
1207 mutex_init(&dev
->vlan_mutex
);
1209 if (ksz_switch_detect(dev
))
1212 ret
= ksz_switch_init(dev
);
1216 return dsa_register_switch(dev
->ds
);
1218 EXPORT_SYMBOL(ksz_switch_register
);
1220 void ksz_switch_remove(struct ksz_device
*dev
)
1222 dsa_unregister_switch(dev
->ds
);
1224 EXPORT_SYMBOL(ksz_switch_remove
);
1226 MODULE_AUTHOR("Woojung Huh <Woojung.Huh@microchip.com>");
1227 MODULE_DESCRIPTION("Microchip KSZ Series Switch DSA Driver");
1228 MODULE_LICENSE("GPL");