2 * Platform driver for the Realtek RTL8366 ethernet switch
4 * Copyright (C) 2009 Gabor Juhos <juhosg@openwrt.org>
5 * Copyright (C) 2010 Antti Seppälä <a.seppala@gmail.com>
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License version 2 as published
9 * by the Free Software Foundation.
12 #include <linux/kernel.h>
13 #include <linux/module.h>
14 #include <linux/init.h>
15 #include <linux/platform_device.h>
16 #include <linux/delay.h>
17 #include <linux/gpio.h>
18 #include <linux/spinlock.h>
19 #include <linux/skbuff.h>
20 #include <linux/switch.h>
21 #include <linux/phy.h>
22 #include <linux/rtl8366_smi.h>
24 #ifdef CONFIG_RTL8366_SMI_DEBUG_FS
25 #include <linux/debugfs.h>
28 #define RTL8366_SMI_DRIVER_NAME "rtl8366-smi"
29 #define RTL8366_SMI_DRIVER_DESC "Realtek RTL8366 switch driver"
30 #define RTL8366_SMI_DRIVER_VER "0.1.1"
32 #define RTL8366S_PHY_NO_MAX 4
33 #define RTL8366S_PHY_PAGE_MAX 7
34 #define RTL8366S_PHY_ADDR_MAX 31
36 #define RTL8366_CHIP_GLOBAL_CTRL_REG 0x0000
37 #define RTL8366_CHIP_CTRL_VLAN (1 << 13)
39 #define RTL8366_RESET_CTRL_REG 0x0100
40 #define RTL8366_CHIP_CTRL_RESET_HW 1
41 #define RTL8366_CHIP_CTRL_RESET_SW (1 << 1)
43 #define RTL8366S_CHIP_VERSION_CTRL_REG 0x0104
44 #define RTL8366S_CHIP_VERSION_MASK 0xf
45 #define RTL8366S_CHIP_ID_REG 0x0105
46 #define RTL8366S_CHIP_ID_8366 0x8366
48 /* PHY registers control */
49 #define RTL8366S_PHY_ACCESS_CTRL_REG 0x8028
50 #define RTL8366S_PHY_ACCESS_DATA_REG 0x8029
52 #define RTL8366S_PHY_CTRL_READ 1
53 #define RTL8366S_PHY_CTRL_WRITE 0
55 #define RTL8366S_PHY_REG_MASK 0x1f
56 #define RTL8366S_PHY_PAGE_OFFSET 5
57 #define RTL8366S_PHY_PAGE_MASK (0x7 << 5)
58 #define RTL8366S_PHY_NO_OFFSET 9
59 #define RTL8366S_PHY_NO_MASK (0x1f << 9)
61 #define RTL8366_SMI_ACK_RETRY_COUNT 5
62 #define RTL8366_SMI_CLK_DELAY 10 /* nsec */
64 /* LED control registers */
65 #define RTL8366_LED_BLINKRATE_REG 0x0420
66 #define RTL8366_LED_BLINKRATE_BIT 0
67 #define RTL8366_LED_BLINKRATE_MASK 0x0007
69 #define RTL8366_LED_CTRL_REG 0x0421
70 #define RTL8366_LED_0_1_CTRL_REG 0x0422
71 #define RTL8366_LED_2_3_CTRL_REG 0x0423
73 #define RTL8366S_MIB_COUNT 33
74 #define RTL8366S_GLOBAL_MIB_COUNT 1
75 #define RTL8366S_MIB_COUNTER_PORT_OFFSET 0x0040
76 #define RTL8366S_MIB_COUNTER_BASE 0x1000
77 #define RTL8366S_MIB_CTRL_REG 0x11F0
78 #define RTL8366S_MIB_CTRL_USER_MASK 0x01FF
79 #define RTL8366S_MIB_CTRL_BUSY_MASK 0x0001
80 #define RTL8366S_MIB_CTRL_RESET_MASK 0x0002
82 #define RTL8366S_MIB_CTRL_GLOBAL_RESET_MASK 0x0004
83 #define RTL8366S_MIB_CTRL_PORT_RESET_BIT 0x0003
84 #define RTL8366S_MIB_CTRL_PORT_RESET_MASK 0x01FC
87 #define RTL8366S_PORT_VLAN_CTRL_BASE 0x0058
88 #define RTL8366S_PORT_VLAN_CTRL_REG(_p) \
89 (RTL8366S_PORT_VLAN_CTRL_BASE + (_p) / 4)
90 #define RTL8366S_PORT_VLAN_CTRL_MASK 0xf
91 #define RTL8366S_PORT_VLAN_CTRL_SHIFT(_p) (4 * ((_p) % 4))
94 #define RTL8366S_VLAN_TABLE_READ_BASE 0x018B
95 #define RTL8366S_VLAN_TABLE_WRITE_BASE 0x0185
97 #define RTL8366S_VLAN_TB_CTRL_REG 0x010F
99 #define RTL8366S_TABLE_ACCESS_CTRL_REG 0x0180
100 #define RTL8366S_TABLE_VLAN_READ_CTRL 0x0E01
101 #define RTL8366S_TABLE_VLAN_WRITE_CTRL 0x0F01
103 #define RTL8366S_VLAN_MEMCONF_BASE 0x0016
106 #define RTL8366S_PORT_LINK_STATUS_BASE 0x0060
107 #define RTL8366S_PORT_STATUS_SPEED_MASK 0x0003
108 #define RTL8366S_PORT_STATUS_DUPLEX_MASK 0x0004
109 #define RTL8366S_PORT_STATUS_LINK_MASK 0x0010
110 #define RTL8366S_PORT_STATUS_TXPAUSE_MASK 0x0020
111 #define RTL8366S_PORT_STATUS_RXPAUSE_MASK 0x0040
112 #define RTL8366S_PORT_STATUS_AN_MASK 0x0080
115 #define RTL8366_PORT_NUM_CPU 5
116 #define RTL8366_NUM_PORTS 6
117 #define RTL8366_NUM_VLANS 16
118 #define RTL8366_NUM_LEDGROUPS 4
119 #define RTL8366_NUM_VIDS 4096
120 #define RTL8366S_PRIORITYMAX 7
121 #define RTL8366S_FIDMAX 7
124 #define RTL8366_PORT_1 (1 << 0) /* In userspace port 0 */
125 #define RTL8366_PORT_2 (1 << 1) /* In userspace port 1 */
126 #define RTL8366_PORT_3 (1 << 2) /* In userspace port 2 */
127 #define RTL8366_PORT_4 (1 << 3) /* In userspace port 3 */
129 #define RTL8366_PORT_UNKNOWN (1 << 4) /* No known connection */
130 #define RTL8366_PORT_CPU (1 << 5) /* CPU port */
132 #define RTL8366_PORT_ALL (RTL8366_PORT_1 | \
136 RTL8366_PORT_UNKNOWN | \
139 #define RTL8366_PORT_ALL_BUT_CPU (RTL8366_PORT_1 | \
143 RTL8366_PORT_UNKNOWN)
145 #define RTL8366_PORT_ALL_EXTERNAL (RTL8366_PORT_1 | \
150 #define RTL8366_PORT_ALL_INTERNAL (RTL8366_PORT_UNKNOWN | \
153 struct rtl8366s_vlanconfig
{
164 struct rtl8366s_vlan4kentry
{
174 static const char *MIBCOUNTERS
[] = {
177 "EtherStatsUnderSizePkts ",
179 "EtherStatsPkts64Octets ",
180 "EtherStatsPkts65to127Octets ",
181 "EtherStatsPkts128to255Octets ",
182 "EtherStatsPkts256to511Octets ",
183 "EtherStatsPkts512to1023Octets ",
184 "EtherStatsPkts1024to1518Octets ",
185 "EtherOversizeStats ",
186 "EtherStatsJabbers ",
188 "EtherStatsMulticastPkts ",
189 "EtherStatsBroadcastPkts ",
190 "EtherStatsDropEvents ",
191 "Dot3StatsFCSErrors ",
192 "Dot3StatsSymbolErrors ",
193 "Dot3InPauseFrames ",
194 "Dot3ControlInUnknownOpcodes ",
196 "Dot3StatsSingleCollisionFrames ",
197 "Dot3StatMultipleCollisionFrames ",
198 "Dot3sDeferredTransmissions ",
199 "Dot3StatsLateCollisions ",
200 "EtherStatsCollisions ",
201 "Dot3StatsExcessiveCollisions ",
202 "Dot3OutPauseFrames ",
203 "Dot1dBasePortDelayExceededDiscards",
204 "Dot1dTpPortInDiscards ",
206 "IfOutMulticastPkts ",
207 "IfOutBroadcastPkts ",
212 struct device
*parent
;
213 unsigned int gpio_sda
;
214 unsigned int gpio_sck
;
216 struct mii_bus
*mii_bus
;
217 struct switch_dev dev
;
218 int mii_irq
[PHY_MAX_ADDR
];
220 #ifdef CONFIG_RTL8366_SMI_DEBUG_FS
221 struct dentry
*debugfs_root
;
225 #ifdef CONFIG_RTL8366_SMI_DEBUG_FS
229 static inline struct rtl8366_smi
*sw_to_rtl8366(struct switch_dev
*sw
)
231 return container_of(sw
, struct rtl8366_smi
, dev
);
234 static inline void rtl8366_smi_clk_delay(struct rtl8366_smi
*smi
)
236 ndelay(RTL8366_SMI_CLK_DELAY
);
239 static void rtl8366_smi_start(struct rtl8366_smi
*smi
)
241 unsigned int sda
= smi
->gpio_sda
;
242 unsigned int sck
= smi
->gpio_sck
;
245 * Set GPIO pins to output mode, with initial state:
248 gpio_direction_output(sck
, 0);
249 gpio_direction_output(sda
, 1);
250 rtl8366_smi_clk_delay(smi
);
252 /* CLK 1: 0 -> 1, 1 -> 0 */
253 gpio_set_value(sck
, 1);
254 rtl8366_smi_clk_delay(smi
);
255 gpio_set_value(sck
, 0);
256 rtl8366_smi_clk_delay(smi
);
259 gpio_set_value(sck
, 1);
260 rtl8366_smi_clk_delay(smi
);
261 gpio_set_value(sda
, 0);
262 rtl8366_smi_clk_delay(smi
);
263 gpio_set_value(sck
, 0);
264 rtl8366_smi_clk_delay(smi
);
265 gpio_set_value(sda
, 1);
268 static void rtl8366_smi_stop(struct rtl8366_smi
*smi
)
270 unsigned int sda
= smi
->gpio_sda
;
271 unsigned int sck
= smi
->gpio_sck
;
273 rtl8366_smi_clk_delay(smi
);
274 gpio_set_value(sda
, 0);
275 gpio_set_value(sck
, 1);
276 rtl8366_smi_clk_delay(smi
);
277 gpio_set_value(sda
, 1);
278 rtl8366_smi_clk_delay(smi
);
279 gpio_set_value(sck
, 1);
280 rtl8366_smi_clk_delay(smi
);
281 gpio_set_value(sck
, 0);
282 rtl8366_smi_clk_delay(smi
);
283 gpio_set_value(sck
, 1);
286 rtl8366_smi_clk_delay(smi
);
287 gpio_set_value(sck
, 0);
288 rtl8366_smi_clk_delay(smi
);
289 gpio_set_value(sck
, 1);
291 /* set GPIO pins to input mode */
292 gpio_direction_input(sda
);
293 gpio_direction_input(sck
);
296 static void rtl8366_smi_write_bits(struct rtl8366_smi
*smi
, u32 data
, u32 len
)
298 unsigned int sda
= smi
->gpio_sda
;
299 unsigned int sck
= smi
->gpio_sck
;
301 for (; len
> 0; len
--) {
302 rtl8366_smi_clk_delay(smi
);
305 if ( data
& ( 1 << (len
- 1)) )
306 gpio_set_value(sda
, 1);
308 gpio_set_value(sda
, 0);
309 rtl8366_smi_clk_delay(smi
);
312 gpio_set_value(sck
, 1);
313 rtl8366_smi_clk_delay(smi
);
314 gpio_set_value(sck
, 0);
318 static void rtl8366_smi_read_bits(struct rtl8366_smi
*smi
, u32 len
, u32
*data
)
320 unsigned int sda
= smi
->gpio_sda
;
321 unsigned int sck
= smi
->gpio_sck
;
323 gpio_direction_input(sda
);
325 for (*data
= 0; len
> 0; len
--) {
328 rtl8366_smi_clk_delay(smi
);
331 gpio_set_value(sck
, 1);
332 rtl8366_smi_clk_delay(smi
);
333 u
= gpio_get_value(sda
);
334 gpio_set_value(sck
, 0);
336 *data
|= (u
<< (len
- 1));
339 gpio_direction_output(sda
, 0);
342 static int rtl8366_smi_wait_for_ack(struct rtl8366_smi
*smi
)
350 rtl8366_smi_read_bits(smi
, 1, &ack
);
354 if (++retry_cnt
> RTL8366_SMI_ACK_RETRY_COUNT
)
361 static int rtl8366_smi_write_byte(struct rtl8366_smi
*smi
, u8 data
)
363 rtl8366_smi_write_bits(smi
, data
, 8);
364 return rtl8366_smi_wait_for_ack(smi
);
367 static int rtl8366_smi_read_byte0(struct rtl8366_smi
*smi
, u8
*data
)
372 rtl8366_smi_read_bits(smi
, 8, &t
);
376 rtl8366_smi_write_bits(smi
, 0x00, 1);
381 static int rtl8366_smi_read_byte1(struct rtl8366_smi
*smi
, u8
*data
)
386 rtl8366_smi_read_bits(smi
, 8, &t
);
390 rtl8366_smi_write_bits(smi
, 0x01, 1);
395 static int rtl8366_smi_read_reg(struct rtl8366_smi
*smi
, u32 addr
, u32
*data
)
402 spin_lock_irqsave(&smi
->lock
, flags
);
404 rtl8366_smi_start(smi
);
406 /* send READ command */
407 ret
= rtl8366_smi_write_byte(smi
, 0x0a << 4 | 0x04 << 1 | 0x01);
412 ret
= rtl8366_smi_write_byte(smi
, addr
& 0xff);
417 ret
= rtl8366_smi_write_byte(smi
, addr
>> 8);
422 rtl8366_smi_read_byte0(smi
, &lo
);
423 /* read DATA[15:8] */
424 rtl8366_smi_read_byte1(smi
, &hi
);
426 *data
= ((u32
) lo
) | (((u32
) hi
) << 8);
431 rtl8366_smi_stop(smi
);
432 spin_unlock_irqrestore(&smi
->lock
, flags
);
437 static int rtl8366_smi_write_reg(struct rtl8366_smi
*smi
, u32 addr
, u32 data
)
442 spin_lock_irqsave(&smi
->lock
, flags
);
444 rtl8366_smi_start(smi
);
446 /* send WRITE command */
447 ret
= rtl8366_smi_write_byte(smi
, 0x0a << 4 | 0x04 << 1 | 0x00);
452 ret
= rtl8366_smi_write_byte(smi
, addr
& 0xff);
457 ret
= rtl8366_smi_write_byte(smi
, addr
>> 8);
461 /* write DATA[7:0] */
462 ret
= rtl8366_smi_write_byte(smi
, data
& 0xff);
466 /* write DATA[15:8] */
467 ret
= rtl8366_smi_write_byte(smi
, data
>> 8);
474 rtl8366_smi_stop(smi
);
475 spin_unlock_irqrestore(&smi
->lock
, flags
);
480 static int rtl8366_smi_read_phy_reg(struct rtl8366_smi
*smi
,
481 u32 phy_no
, u32 page
, u32 addr
, u32
*data
)
486 if (phy_no
> RTL8366S_PHY_NO_MAX
)
489 if (page
> RTL8366S_PHY_PAGE_MAX
)
492 if (addr
> RTL8366S_PHY_ADDR_MAX
)
495 ret
= rtl8366_smi_write_reg(smi
, RTL8366S_PHY_ACCESS_CTRL_REG
,
496 RTL8366S_PHY_CTRL_READ
);
500 reg
= 0x8000 | (1 << (phy_no
+ RTL8366S_PHY_NO_OFFSET
)) |
501 ((page
<< RTL8366S_PHY_PAGE_OFFSET
) & RTL8366S_PHY_PAGE_MASK
) |
502 (addr
& RTL8366S_PHY_REG_MASK
);
504 ret
= rtl8366_smi_write_reg(smi
, reg
, 0);
508 ret
= rtl8366_smi_read_reg(smi
, RTL8366S_PHY_ACCESS_DATA_REG
, data
);
515 static int rtl8366_smi_write_phy_reg(struct rtl8366_smi
*smi
,
516 u32 phy_no
, u32 page
, u32 addr
, u32 data
)
521 if (phy_no
> RTL8366S_PHY_NO_MAX
)
524 if (page
> RTL8366S_PHY_PAGE_MAX
)
527 if (addr
> RTL8366S_PHY_ADDR_MAX
)
530 ret
= rtl8366_smi_write_reg(smi
, RTL8366S_PHY_ACCESS_CTRL_REG
,
531 RTL8366S_PHY_CTRL_WRITE
);
535 reg
= 0x8000 | (1 << (phy_no
+ RTL8366S_PHY_NO_OFFSET
)) |
536 ((page
<< RTL8366S_PHY_PAGE_OFFSET
) & RTL8366S_PHY_PAGE_MASK
) |
537 (addr
& RTL8366S_PHY_REG_MASK
);
539 ret
= rtl8366_smi_write_reg(smi
, reg
, data
);
546 static int rtl8366_get_mib_counter(struct rtl8366_smi
*smi
, int counter
,
547 int port
, unsigned long long *val
)
551 u32 addr
, data
, regoffset
;
554 /* address offset to MIBs counter */
555 const u16 mibLength
[RTL8366S_MIB_COUNT
] = {4, 4, 2, 2, 2, 2, 2, 2, 2,
556 2, 2, 2, 2, 2, 2, 2, 2, 2,
557 2, 2, 4, 2, 2, 2, 2, 2, 2,
560 if (port
> RTL8366_NUM_PORTS
|| counter
>= RTL8366S_MIB_COUNT
)
563 regoffset
= RTL8366S_MIB_COUNTER_PORT_OFFSET
* (port
);
565 for (i
= 0; i
< counter
; i
++)
566 regoffset
+= mibLength
[i
];
568 addr
= RTL8366S_MIB_COUNTER_BASE
+ regoffset
;
571 * Writing access counter address first
572 * then ASIC will prepare 64bits counter wait for being retrived
574 data
= 0; /* writing data will be discard by ASIC */
575 err
= rtl8366_smi_write_reg(smi
, addr
, data
);
579 /* read MIB control register */
580 err
= rtl8366_smi_read_reg(smi
, RTL8366S_MIB_CTRL_REG
, &data
);
584 if (data
& RTL8366S_MIB_CTRL_BUSY_MASK
)
587 if (data
& RTL8366S_MIB_CTRL_RESET_MASK
)
591 addr
= addr
+ mibLength
[counter
] - 1;
592 i
= mibLength
[counter
];
595 err
= rtl8366_smi_read_reg(smi
, addr
, &data
);
599 mibvalue
= (mibvalue
<< 16) | (data
& 0xFFFF);
609 static int rtl8366s_get_vlan_4k_entry(struct rtl8366_smi
*smi
, u32 vid
,
610 struct rtl8366s_vlan4kentry
*vlan4k
)
616 memset(vlan4k
, '\0', sizeof(struct rtl8366s_vlan4kentry
));
619 if (vid
>= RTL8366_NUM_VIDS
)
622 tableaddr
= (u16
*)vlan4k
;
626 err
= rtl8366_smi_write_reg(smi
, RTL8366S_VLAN_TABLE_WRITE_BASE
, data
);
630 /* write table access control word */
631 err
= rtl8366_smi_write_reg(smi
, RTL8366S_TABLE_ACCESS_CTRL_REG
,
632 RTL8366S_TABLE_VLAN_READ_CTRL
);
636 err
= rtl8366_smi_read_reg(smi
, RTL8366S_VLAN_TABLE_READ_BASE
, &data
);
643 err
= rtl8366_smi_read_reg(smi
, RTL8366S_VLAN_TABLE_READ_BASE
+ 1,
654 static int rtl8366s_set_vlan_4k_entry(struct rtl8366_smi
*smi
,
655 const struct rtl8366s_vlan4kentry
*vlan4k
)
661 if (vlan4k
->vid
>= RTL8366_NUM_VIDS
||
662 vlan4k
->member
> RTL8366_PORT_ALL
||
663 vlan4k
->untag
> RTL8366_PORT_ALL
||
664 vlan4k
->fid
> RTL8366S_FIDMAX
)
667 tableaddr
= (u16
*)vlan4k
;
671 err
= rtl8366_smi_write_reg(smi
, RTL8366S_VLAN_TABLE_WRITE_BASE
, data
);
679 err
= rtl8366_smi_write_reg(smi
, RTL8366S_VLAN_TABLE_WRITE_BASE
+ 1,
684 /* write table access control word */
685 err
= rtl8366_smi_write_reg(smi
, RTL8366S_TABLE_ACCESS_CTRL_REG
,
686 RTL8366S_TABLE_VLAN_WRITE_CTRL
);
691 static int rtl8366s_get_vlan_member_config(struct rtl8366_smi
*smi
, u32 index
,
692 struct rtl8366s_vlanconfig
*vlanmc
)
699 memset(vlanmc
, '\0', sizeof(struct rtl8366s_vlanconfig
));
701 if (index
>= RTL8366_NUM_VLANS
)
704 tableaddr
= (u16
*)vlanmc
;
706 addr
= RTL8366S_VLAN_MEMCONF_BASE
+ (index
<< 1);
707 err
= rtl8366_smi_read_reg(smi
, addr
, &data
);
714 addr
= RTL8366S_VLAN_MEMCONF_BASE
+ 1 + (index
<< 1);
715 err
= rtl8366_smi_read_reg(smi
, addr
, &data
);
724 static int rtl8366s_set_vlan_member_config(struct rtl8366_smi
*smi
, u32 index
,
725 const struct rtl8366s_vlanconfig
733 if (index
>= RTL8366_NUM_VLANS
||
734 vlanmc
->vid
>= RTL8366_NUM_VIDS
||
735 vlanmc
->priority
> RTL8366S_PRIORITYMAX
||
736 vlanmc
->member
> RTL8366_PORT_ALL
||
737 vlanmc
->untag
> RTL8366_PORT_ALL
||
738 vlanmc
->fid
> RTL8366S_FIDMAX
)
741 addr
= RTL8366S_VLAN_MEMCONF_BASE
+ (index
<< 1);
743 tableaddr
= (u16
*)vlanmc
;
746 err
= rtl8366_smi_write_reg(smi
, addr
, data
);
750 addr
= RTL8366S_VLAN_MEMCONF_BASE
+ 1 + (index
<< 1);
755 err
= rtl8366_smi_write_reg(smi
, addr
, data
);
762 static int rtl8366_get_port_vlan_index(struct rtl8366_smi
*smi
, int port
,
768 if (port
>= RTL8366_NUM_PORTS
)
771 err
= rtl8366_smi_read_reg(smi
, RTL8366S_PORT_VLAN_CTRL_REG(port
),
776 *val
= (data
>> RTL8366S_PORT_VLAN_CTRL_SHIFT(port
)) &
777 RTL8366S_PORT_VLAN_CTRL_MASK
;
783 static int rtl8366_get_vlan_port_pvid(struct rtl8366_smi
*smi
, int port
,
786 struct rtl8366s_vlanconfig vlanmc
;
790 err
= rtl8366_get_port_vlan_index(smi
, port
, &index
);
794 err
= rtl8366s_get_vlan_member_config(smi
, index
, &vlanmc
);
802 static int rtl8366_set_port_vlan_index(struct rtl8366_smi
*smi
, int port
,
808 if (port
>= RTL8366_NUM_PORTS
|| index
>= RTL8366_NUM_VLANS
)
811 err
= rtl8366_smi_read_reg(smi
, RTL8366S_PORT_VLAN_CTRL_REG(port
),
816 data
&= ~(RTL8366S_PORT_VLAN_CTRL_MASK
<<
817 RTL8366S_PORT_VLAN_CTRL_SHIFT(port
));
818 data
|= (index
& RTL8366S_PORT_VLAN_CTRL_MASK
) <<
819 RTL8366S_PORT_VLAN_CTRL_SHIFT(port
);
821 err
= rtl8366_smi_write_reg(smi
, RTL8366S_PORT_VLAN_CTRL_REG(port
),
826 static int rtl8366_set_vlan_port_pvid(struct rtl8366_smi
*smi
, int port
,
830 struct rtl8366s_vlanconfig vlanmc
;
831 struct rtl8366s_vlan4kentry vlan4k
;
833 if (port
>= RTL8366_NUM_PORTS
|| val
>= RTL8366_NUM_VIDS
)
836 /* Updating the 4K entry; lookup it and change the port member set */
837 rtl8366s_get_vlan_4k_entry(smi
, val
, &vlan4k
);
838 vlan4k
.member
|= ((1 << port
) | RTL8366_PORT_CPU
);
839 vlan4k
.untag
= RTL8366_PORT_ALL_BUT_CPU
;
840 rtl8366s_set_vlan_4k_entry(smi
, &vlan4k
);
843 * For the 16 entries more work needs to be done. First see if such
844 * VID is already there and change it
846 for (i
= 0; i
< RTL8366_NUM_VLANS
; ++i
) {
847 rtl8366s_get_vlan_member_config(smi
, i
, &vlanmc
);
849 /* Try to find an existing vid and update port member set */
850 if (val
== vlanmc
.vid
) {
851 vlanmc
.member
|= ((1 << port
) | RTL8366_PORT_CPU
);
852 rtl8366s_set_vlan_member_config(smi
, i
, &vlanmc
);
854 /* Now update PVID register settings */
855 rtl8366_set_port_vlan_index(smi
, port
, i
);
862 * PVID could not be found from vlan table. Replace unused (one that
863 * has no member ports) with new one
865 for (i
= 0; i
< RTL8366_NUM_VLANS
; ++i
) {
866 rtl8366s_get_vlan_member_config(smi
, i
, &vlanmc
);
869 * See if this vlan member configuration is unused. It is
870 * unused if member set contains no ports or CPU port only
872 if (!vlanmc
.member
|| vlanmc
.member
== RTL8366_PORT_CPU
) {
875 vlanmc
.untag
= RTL8366_PORT_ALL_BUT_CPU
;
876 vlanmc
.member
= ((1 << port
) | RTL8366_PORT_CPU
);
879 rtl8366s_set_vlan_member_config(smi
, i
, &vlanmc
);
881 /* Now update PVID register settings */
882 rtl8366_set_port_vlan_index(smi
, port
, i
);
889 "All 16 vlan member configurations are in use\n");
895 static int rtl8366_vlan_set_vlan(struct rtl8366_smi
*smi
, int enable
)
899 rtl8366_smi_read_reg(smi
, RTL8366_CHIP_GLOBAL_CTRL_REG
, &data
);
902 data
|= RTL8366_CHIP_CTRL_VLAN
;
904 data
&= ~RTL8366_CHIP_CTRL_VLAN
;
906 return rtl8366_smi_write_reg(smi
, RTL8366_CHIP_GLOBAL_CTRL_REG
, data
);
909 static int rtl8366_vlan_set_4ktable(struct rtl8366_smi
*smi
, int enable
)
913 rtl8366_smi_read_reg(smi
, RTL8366S_VLAN_TB_CTRL_REG
, &data
);
920 return rtl8366_smi_write_reg(smi
, RTL8366S_VLAN_TB_CTRL_REG
, data
);
923 static int rtl8366s_reset_vlan(struct rtl8366_smi
*smi
)
925 struct rtl8366s_vlan4kentry vlan4k
;
926 struct rtl8366s_vlanconfig vlanmc
;
930 /* clear 16 VLAN member configuration */
936 for (i
= 0; i
< RTL8366_NUM_VLANS
; i
++) {
937 err
= rtl8366s_set_vlan_member_config(smi
, i
, &vlanmc
);
942 /* Set a default VLAN with vid 1 to 4K table for all ports */
944 vlan4k
.member
= RTL8366_PORT_ALL
;
945 vlan4k
.untag
= RTL8366_PORT_ALL
;
947 err
= rtl8366s_set_vlan_4k_entry(smi
, &vlan4k
);
951 /* Set all ports PVID to default VLAN */
952 for (i
= 0; i
< RTL8366_NUM_PORTS
; i
++) {
953 err
= rtl8366_set_vlan_port_pvid(smi
, i
, 0);
961 #ifdef CONFIG_RTL8366_SMI_DEBUG_FS
962 static int rtl8366_debugfs_open(struct inode
*inode
, struct file
*file
)
964 file
->private_data
= inode
->i_private
;
968 static ssize_t
rtl8366_read_debugfs_mibs(struct file
*file
,
969 char __user
*user_buf
,
970 size_t count
, loff_t
*ppos
)
972 struct rtl8366_smi
*smi
= (struct rtl8366_smi
*)file
->private_data
;
974 char *buf
= smi
->buf
;
976 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "MIB Counters:\n");
977 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "Counter"
979 "Port 0 \t\t Port 1 \t\t Port 2 \t\t Port 3 \t\t "
982 for (i
= 0; i
< 33; ++i
) {
983 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "%d:%s ",
985 for (j
= 0; j
< RTL8366_NUM_PORTS
; ++j
) {
986 unsigned long long counter
= 0;
988 if (!rtl8366_get_mib_counter(smi
, i
, j
, &counter
))
989 len
+= snprintf(buf
+ len
,
990 sizeof(smi
->buf
) - len
,
993 len
+= snprintf(buf
+ len
,
994 sizeof(smi
->buf
) - len
,
997 if (j
!= RTL8366_NUM_PORTS
- 1) {
998 if (counter
< 100000)
999 len
+= snprintf(buf
+ len
,
1000 sizeof(smi
->buf
) - len
,
1003 len
+= snprintf(buf
+ len
,
1004 sizeof(smi
->buf
) - len
,
1008 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\n");
1011 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\n");
1013 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1016 static ssize_t
rtl8366_read_debugfs_vlan(struct file
*file
,
1017 char __user
*user_buf
,
1018 size_t count
, loff_t
*ppos
)
1020 struct rtl8366_smi
*smi
= (struct rtl8366_smi
*)file
->private_data
;
1022 char *buf
= smi
->buf
;
1024 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1025 "VLAN Member Config:\n");
1026 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1027 "\t id \t vid \t prio \t member \t untag \t fid "
1030 for (i
= 0; i
< RTL8366_NUM_VLANS
; ++i
) {
1031 struct rtl8366s_vlanconfig vlanmc
;
1033 rtl8366s_get_vlan_member_config(smi
, i
, &vlanmc
);
1035 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1036 "\t[%d] \t %d \t %d \t 0x%04x \t 0x%04x \t %d "
1037 "\t", i
, vlanmc
.vid
, vlanmc
.priority
,
1038 vlanmc
.member
, vlanmc
.untag
, vlanmc
.fid
);
1040 for (j
= 0; j
< RTL8366_NUM_PORTS
; ++j
) {
1042 if (!rtl8366_get_port_vlan_index(smi
, j
, &index
)) {
1044 len
+= snprintf(buf
+ len
,
1045 sizeof(smi
->buf
) - len
,
1049 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\n");
1052 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1055 static ssize_t
rtl8366_read_debugfs_reg(struct file
*file
,
1056 char __user
*user_buf
,
1057 size_t count
, loff_t
*ppos
)
1059 struct rtl8366_smi
*smi
= (struct rtl8366_smi
*)file
->private_data
;
1060 u32 t
, reg
= g_dbg_reg
;
1062 char *buf
= smi
->buf
;
1064 memset(buf
, '\0', sizeof(smi
->buf
));
1066 err
= rtl8366_smi_read_reg(smi
, reg
, &t
);
1068 len
+= snprintf(buf
, sizeof(smi
->buf
),
1069 "Read failed (reg: 0x%04x)\n", reg
);
1070 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1073 len
+= snprintf(buf
, sizeof(smi
->buf
), "reg = 0x%04x, val = 0x%04x\n",
1076 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1079 static ssize_t
rtl8366_write_debugfs_reg(struct file
*file
,
1080 const char __user
*user_buf
,
1081 size_t count
, loff_t
*ppos
)
1083 struct rtl8366_smi
*smi
= (struct rtl8366_smi
*)file
->private_data
;
1085 u32 reg
= g_dbg_reg
;
1088 char *buf
= smi
->buf
;
1090 len
= min(count
, sizeof(smi
->buf
) - 1);
1091 if (copy_from_user(buf
, user_buf
, len
)) {
1092 dev_err(smi
->parent
, "copy from user failed\n");
1097 if (len
> 0 && buf
[len
- 1] == '\n')
1098 buf
[len
- 1] = '\0';
1101 if (strict_strtoul(buf
, 16, &data
)) {
1102 dev_err(smi
->parent
, "Invalid reg value %s\n", buf
);
1104 err
= rtl8366_smi_write_reg(smi
, reg
, data
);
1106 dev_err(smi
->parent
,
1107 "writing reg 0x%04x val 0x%04lx failed\n",
1115 static const struct file_operations fops_rtl8366_regs
= {
1116 .read
= rtl8366_read_debugfs_reg
,
1117 .write
= rtl8366_write_debugfs_reg
,
1118 .open
= rtl8366_debugfs_open
,
1119 .owner
= THIS_MODULE
1122 static const struct file_operations fops_rtl8366_vlan
= {
1123 .read
= rtl8366_read_debugfs_vlan
,
1124 .open
= rtl8366_debugfs_open
,
1125 .owner
= THIS_MODULE
1128 static const struct file_operations fops_rtl8366_mibs
= {
1129 .read
= rtl8366_read_debugfs_mibs
,
1130 .open
= rtl8366_debugfs_open
,
1131 .owner
= THIS_MODULE
1134 static void rtl8366_debugfs_init(struct rtl8366_smi
*smi
)
1136 struct dentry
*node
;
1137 struct dentry
*root
;
1139 if (!smi
->debugfs_root
)
1140 smi
->debugfs_root
= debugfs_create_dir("rtl8366s", NULL
);
1142 if (!smi
->debugfs_root
) {
1143 dev_err(smi
->parent
, "Unable to create debugfs dir\n");
1146 root
= smi
->debugfs_root
;
1148 node
= debugfs_create_x16("reg", S_IRUGO
| S_IWUSR
, root
, &g_dbg_reg
);
1150 dev_err(smi
->parent
, "Creating debugfs file reg failed\n");
1154 node
= debugfs_create_file("val", S_IRUGO
| S_IWUSR
, root
, smi
,
1155 &fops_rtl8366_regs
);
1157 dev_err(smi
->parent
, "Creating debugfs file val failed\n");
1161 node
= debugfs_create_file("vlan", S_IRUSR
, root
, smi
,
1162 &fops_rtl8366_vlan
);
1164 dev_err(smi
->parent
,
1165 "Creating debugfs file vlan failed\n");
1169 node
= debugfs_create_file("mibs", S_IRUSR
, root
, smi
,
1170 &fops_rtl8366_mibs
);
1172 dev_err(smi
->parent
,
1173 "Creating debugfs file mibs failed\n");
1178 static void rtl8366_debugfs_remove(struct rtl8366_smi
*smi
)
1180 if (smi
->debugfs_root
) {
1181 debugfs_remove_recursive(smi
->debugfs_root
);
1182 smi
->debugfs_root
= NULL
;
1187 static inline void rtl8366_debugfs_init(struct rtl8366_smi
*smi
) {}
1188 static inline void rtl8366_debugfs_remove(struct rtl8366_smi
*smi
) {}
1189 #endif /* CONFIG_RTL8366_SMI_DEBUG_FS */
1191 static int rtl8366_sw_reset_mibs(struct switch_dev
*dev
,
1192 const struct switch_attr
*attr
,
1193 struct switch_val
*val
)
1195 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1198 if (val
->value
.i
== 1) {
1199 rtl8366_smi_read_reg(smi
, RTL8366S_MIB_CTRL_REG
, &data
);
1201 rtl8366_smi_write_reg(smi
, RTL8366S_MIB_CTRL_REG
, data
);
1207 static int rtl8366_sw_get_vlan_enable(struct switch_dev
*dev
,
1208 const struct switch_attr
*attr
,
1209 struct switch_val
*val
)
1211 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1214 if (attr
->ofs
== 1) {
1215 rtl8366_smi_read_reg(smi
, RTL8366_CHIP_GLOBAL_CTRL_REG
, &data
);
1217 if (data
& RTL8366_CHIP_CTRL_VLAN
)
1221 } else if (attr
->ofs
== 2) {
1222 rtl8366_smi_read_reg(smi
, RTL8366S_VLAN_TB_CTRL_REG
, &data
);
1233 static int rtl8366_sw_get_blinkrate(struct switch_dev
*dev
,
1234 const struct switch_attr
*attr
,
1235 struct switch_val
*val
)
1237 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1240 rtl8366_smi_read_reg(smi
, RTL8366_LED_BLINKRATE_REG
, &data
);
1242 val
->value
.i
= (data
& (RTL8366_LED_BLINKRATE_MASK
));
1247 static int rtl8366_sw_set_blinkrate(struct switch_dev
*dev
,
1248 const struct switch_attr
*attr
,
1249 struct switch_val
*val
)
1252 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1254 if (val
->value
.i
>= 6)
1257 rtl8366_smi_read_reg(smi
, RTL8366_LED_BLINKRATE_REG
, &data
);
1259 data
&= ~RTL8366_LED_BLINKRATE_MASK
;
1260 data
|= val
->value
.i
;
1262 rtl8366_smi_write_reg(smi
, RTL8366_LED_BLINKRATE_REG
, data
);
1267 static int rtl8366_sw_set_vlan_enable(struct switch_dev
*dev
,
1268 const struct switch_attr
*attr
,
1269 struct switch_val
*val
)
1271 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1274 return rtl8366_vlan_set_vlan(smi
, val
->value
.i
);
1276 return rtl8366_vlan_set_4ktable(smi
, val
->value
.i
);
1279 static const char *rtl8366_speed_str(unsigned speed
)
1293 static int rtl8366_sw_get_port_link(struct switch_dev
*dev
,
1294 const struct switch_attr
*attr
,
1295 struct switch_val
*val
)
1297 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1298 u32 len
= 0, data
= 0;
1300 if (val
->port_vlan
>= RTL8366_NUM_PORTS
)
1303 memset(smi
->buf
, '\0', sizeof(smi
->buf
));
1304 rtl8366_smi_read_reg(smi
, RTL8366S_PORT_LINK_STATUS_BASE
+
1305 (val
->port_vlan
/ 2), &data
);
1307 if (val
->port_vlan
% 2)
1310 len
= snprintf(smi
->buf
, sizeof(smi
->buf
),
1311 "port:%d link:%s speed:%s %s-duplex %s%s%s",
1313 (data
& RTL8366S_PORT_STATUS_LINK_MASK
) ? "up" : "down",
1314 rtl8366_speed_str(data
&
1315 RTL8366S_PORT_STATUS_SPEED_MASK
),
1316 (data
& RTL8366S_PORT_STATUS_DUPLEX_MASK
) ?
1318 (data
& RTL8366S_PORT_STATUS_TXPAUSE_MASK
) ?
1320 (data
& RTL8366S_PORT_STATUS_RXPAUSE_MASK
) ?
1322 (data
& RTL8366S_PORT_STATUS_AN_MASK
) ? "nway ": "");
1324 val
->value
.s
= smi
->buf
;
1330 static int rtl8366_sw_get_vlan_info(struct switch_dev
*dev
,
1331 const struct switch_attr
*attr
,
1332 struct switch_val
*val
)
1336 struct rtl8366s_vlanconfig vlanmc
;
1337 struct rtl8366s_vlan4kentry vlan4k
;
1338 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1339 char *buf
= smi
->buf
;
1341 if (val
->port_vlan
>= RTL8366_NUM_VLANS
)
1344 memset(buf
, '\0', sizeof(smi
->buf
));
1346 rtl8366s_get_vlan_member_config(smi
, val
->port_vlan
, &vlanmc
);
1347 rtl8366s_get_vlan_4k_entry(smi
, vlanmc
.vid
, &vlan4k
);
1349 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "VLAN %d: Ports: ",
1352 for (i
= 0; i
< RTL8366_NUM_PORTS
; ++i
) {
1354 if (!rtl8366_get_port_vlan_index(smi
, i
, &index
) &&
1355 index
== val
->port_vlan
)
1356 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1359 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\n");
1361 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1362 "\t\t vid \t prio \t member \t untag \t fid\n");
1363 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\tMC:\t");
1364 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1365 "%d \t %d \t 0x%04x \t 0x%04x \t %d\n",
1366 vlanmc
.vid
, vlanmc
.priority
, vlanmc
.member
,
1367 vlanmc
.untag
, vlanmc
.fid
);
1368 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\t4K:\t");
1369 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1370 "%d \t \t 0x%04x \t 0x%04x \t %d",
1371 vlan4k
.vid
, vlan4k
.member
, vlan4k
.untag
, vlan4k
.fid
);
1379 static int rtl8366_sw_set_port_led(struct switch_dev
*dev
,
1380 const struct switch_attr
*attr
,
1381 struct switch_val
*val
)
1383 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1386 if (val
->port_vlan
>= RTL8366_NUM_PORTS
||
1387 (1 << val
->port_vlan
) == RTL8366_PORT_UNKNOWN
)
1390 if (val
->port_vlan
== RTL8366_PORT_NUM_CPU
) {
1391 rtl8366_smi_read_reg(smi
, RTL8366_LED_BLINKRATE_REG
, &data
);
1392 data
= (data
& (~(0xF << 4))) | (val
->value
.i
<< 4);
1393 rtl8366_smi_write_reg(smi
, RTL8366_LED_BLINKRATE_REG
, data
);
1395 rtl8366_smi_read_reg(smi
, RTL8366_LED_CTRL_REG
, &data
);
1396 data
= (data
& (~(0xF << (val
->port_vlan
* 4)))) |
1397 (val
->value
.i
<< (val
->port_vlan
* 4));
1398 rtl8366_smi_write_reg(smi
, RTL8366_LED_CTRL_REG
, data
);
1404 static int rtl8366_sw_get_port_led(struct switch_dev
*dev
,
1405 const struct switch_attr
*attr
,
1406 struct switch_val
*val
)
1408 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1411 if (val
->port_vlan
>= RTL8366_NUM_LEDGROUPS
)
1414 rtl8366_smi_read_reg(smi
, RTL8366_LED_CTRL_REG
, &data
);
1415 val
->value
.i
= (data
>> (val
->port_vlan
* 4)) & 0x000F;
1420 static int rtl8366_sw_reset_port_mibs(struct switch_dev
*dev
,
1421 const struct switch_attr
*attr
,
1422 struct switch_val
*val
)
1424 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1427 if (val
->port_vlan
>= RTL8366_NUM_PORTS
)
1430 rtl8366_smi_read_reg(smi
, RTL8366S_MIB_CTRL_REG
, &data
);
1431 data
|= (1 << (val
->port_vlan
+ 3));
1432 rtl8366_smi_write_reg(smi
, RTL8366S_MIB_CTRL_REG
, data
);
1437 static int rtl8366_sw_get_port_mib(struct switch_dev
*dev
,
1438 const struct switch_attr
*attr
,
1439 struct switch_val
*val
)
1441 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1443 unsigned long long counter
= 0;
1444 char *buf
= smi
->buf
;
1446 if (val
->port_vlan
>= RTL8366_NUM_PORTS
)
1449 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1450 "Port %d MIB counters\n",
1453 for (i
= 0; i
< RTL8366S_MIB_COUNT
; ++i
) {
1454 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1455 "%d:%s\t", i
, MIBCOUNTERS
[i
]);
1456 if (!rtl8366_get_mib_counter(smi
, i
, val
->port_vlan
, &counter
))
1457 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1458 "[%llu]\n", counter
);
1460 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1469 static int rtl8366_sw_get_vlan_ports(struct switch_dev
*dev
,
1470 struct switch_val
*val
)
1472 struct rtl8366s_vlanconfig vlanmc
;
1473 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1474 struct switch_port
*port
;
1477 if (val
->port_vlan
>= RTL8366_NUM_VLANS
)
1480 rtl8366s_get_vlan_member_config(smi
, val
->port_vlan
, &vlanmc
);
1482 port
= &val
->value
.ports
[0];
1484 for (i
= 0; i
< RTL8366_NUM_PORTS
; i
++) {
1485 if (!(vlanmc
.member
& BIT(i
)))
1489 port
->flags
= (vlanmc
.untag
& BIT(i
)) ?
1490 0 : BIT(SWITCH_PORT_FLAG_TAGGED
);
1497 static int rtl8366_sw_set_vlan_ports(struct switch_dev
*dev
,
1498 struct switch_val
*val
)
1500 struct rtl8366s_vlanconfig vlanmc
;
1501 struct rtl8366s_vlan4kentry vlan4k
;
1502 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1503 struct switch_port
*port
;
1506 if (val
->port_vlan
>= RTL8366_NUM_VLANS
)
1509 rtl8366s_get_vlan_member_config(smi
, val
->port_vlan
, &vlanmc
);
1510 rtl8366s_get_vlan_4k_entry(smi
, vlanmc
.vid
, &vlan4k
);
1515 port
= &val
->value
.ports
[0];
1516 for (i
= 0; i
< val
->len
; i
++, port
++) {
1517 vlanmc
.member
|= BIT(port
->id
);
1519 if (!(port
->flags
& BIT(SWITCH_PORT_FLAG_TAGGED
)))
1520 vlanmc
.untag
|= BIT(port
->id
);
1523 vlan4k
.member
= vlanmc
.member
;
1524 vlan4k
.untag
= vlanmc
.untag
;
1526 rtl8366s_set_vlan_member_config(smi
, val
->port_vlan
, &vlanmc
);
1527 rtl8366s_set_vlan_4k_entry(smi
, &vlan4k
);
1531 static int rtl8366_sw_get_port_pvid(struct switch_dev
*dev
, int port
, int *val
)
1533 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1534 return rtl8366_get_vlan_port_pvid(smi
, port
, val
);
1537 static int rtl8366_sw_set_port_pvid(struct switch_dev
*dev
, int port
, int val
)
1539 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1540 return rtl8366_set_vlan_port_pvid(smi
, port
, val
);
1543 static int rtl8366_sw_reset_switch(struct switch_dev
*dev
)
1545 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1549 rtl8366_smi_write_reg(smi
, RTL8366_RESET_CTRL_REG
,
1550 RTL8366_CHIP_CTRL_RESET_HW
);
1553 if (rtl8366_smi_read_reg(smi
, RTL8366_RESET_CTRL_REG
, &data
))
1556 if (!(data
& RTL8366_CHIP_CTRL_RESET_HW
))
1558 } while (--timeout
);
1561 printk("Timeout waiting for the switch to reset\n");
1565 return rtl8366s_reset_vlan(smi
);
1568 static struct switch_attr rtl8366_globals
[] = {
1570 .type
= SWITCH_TYPE_INT
,
1571 .name
= "enable_vlan",
1572 .description
= "Enable VLAN mode",
1573 .set
= rtl8366_sw_set_vlan_enable
,
1574 .get
= rtl8366_sw_get_vlan_enable
,
1578 .type
= SWITCH_TYPE_INT
,
1579 .name
= "enable_vlan4k",
1580 .description
= "Enable VLAN 4K mode",
1581 .set
= rtl8366_sw_set_vlan_enable
,
1582 .get
= rtl8366_sw_get_vlan_enable
,
1586 .type
= SWITCH_TYPE_INT
,
1587 .name
= "reset_mibs",
1588 .description
= "Reset all MIB counters",
1589 .set
= rtl8366_sw_reset_mibs
,
1593 .type
= SWITCH_TYPE_INT
,
1594 .name
= "blinkrate",
1595 .description
= "Get/Set LED blinking rate (0 = 43ms, 1 = 84ms,"
1596 " 2 = 120ms, 3 = 170ms, 4 = 340ms, 5 = 670ms)",
1597 .set
= rtl8366_sw_set_blinkrate
,
1598 .get
= rtl8366_sw_get_blinkrate
,
1603 static struct switch_attr rtl8366_port
[] = {
1605 .type
= SWITCH_TYPE_STRING
,
1607 .description
= "Get port link information",
1610 .get
= rtl8366_sw_get_port_link
,
1612 .type
= SWITCH_TYPE_INT
,
1613 .name
= "reset_mib",
1614 .description
= "Reset single port MIB counters",
1616 .set
= rtl8366_sw_reset_port_mibs
,
1619 .type
= SWITCH_TYPE_STRING
,
1621 .description
= "Get MIB counters for port",
1624 .get
= rtl8366_sw_get_port_mib
,
1626 .type
= SWITCH_TYPE_INT
,
1628 .description
= "Get/Set port group (0 - 3) led mode (0 - 15)",
1630 .set
= rtl8366_sw_set_port_led
,
1631 .get
= rtl8366_sw_get_port_led
,
1635 static struct switch_attr rtl8366_vlan
[] = {
1637 .type
= SWITCH_TYPE_STRING
,
1639 .description
= "Get vlan information",
1642 .get
= rtl8366_sw_get_vlan_info
,
1648 static struct switch_dev rtldev
= {
1650 .cpu_port
= RTL8366_PORT_NUM_CPU
,
1651 .ports
= RTL8366_NUM_PORTS
,
1652 .vlans
= RTL8366_NUM_VLANS
,
1654 .attr
= rtl8366_globals
,
1655 .n_attr
= ARRAY_SIZE(rtl8366_globals
),
1658 .attr
= rtl8366_port
,
1659 .n_attr
= ARRAY_SIZE(rtl8366_port
),
1662 .attr
= rtl8366_vlan
,
1663 .n_attr
= ARRAY_SIZE(rtl8366_vlan
),
1666 .get_vlan_ports
= rtl8366_sw_get_vlan_ports
,
1667 .set_vlan_ports
= rtl8366_sw_set_vlan_ports
,
1668 .get_port_pvid
= rtl8366_sw_get_port_pvid
,
1669 .set_port_pvid
= rtl8366_sw_set_port_pvid
,
1670 .reset_switch
= rtl8366_sw_reset_switch
,
1673 static int rtl8366_smi_switch_init(struct rtl8366_smi
*smi
)
1675 struct switch_dev
*dev
= &smi
->dev
;
1678 memcpy(dev
, &rtldev
, sizeof(struct switch_dev
));
1680 dev
->devname
= dev_name(smi
->parent
);
1682 err
= register_switch(dev
, NULL
);
1684 dev_err(smi
->parent
, "switch registration failed\n");
1689 static void rtl8366_smi_switch_cleanup(struct rtl8366_smi
*smi
)
1691 unregister_switch(&smi
->dev
);
1694 static int rtl8366_smi_mii_read(struct mii_bus
*bus
, int addr
, int reg
)
1696 struct rtl8366_smi
*smi
= bus
->priv
;
1700 err
= rtl8366_smi_read_phy_reg(smi
, addr
, 0, reg
, &val
);
1707 static int rtl8366_smi_mii_write(struct mii_bus
*bus
, int addr
, int reg
,
1710 struct rtl8366_smi
*smi
= bus
->priv
;
1714 err
= rtl8366_smi_write_phy_reg(smi
, addr
, 0, reg
, val
);
1716 (void) rtl8366_smi_read_phy_reg(smi
, addr
, 0, reg
, &t
);
1721 static int rtl8366_smi_mii_init(struct rtl8366_smi
*smi
)
1726 smi
->mii_bus
= mdiobus_alloc();
1727 if (smi
->mii_bus
== NULL
) {
1732 spin_lock_init(&smi
->lock
);
1733 smi
->mii_bus
->priv
= (void *) smi
;
1734 smi
->mii_bus
->name
= "rtl8366-smi";
1735 smi
->mii_bus
->read
= rtl8366_smi_mii_read
;
1736 smi
->mii_bus
->write
= rtl8366_smi_mii_write
;
1737 snprintf(smi
->mii_bus
->id
, MII_BUS_ID_SIZE
, "%s",
1738 dev_name(smi
->parent
));
1739 smi
->mii_bus
->parent
= smi
->parent
;
1740 smi
->mii_bus
->phy_mask
= ~(0x1f);
1741 smi
->mii_bus
->irq
= smi
->mii_irq
;
1742 for (i
= 0; i
< PHY_MAX_ADDR
; i
++)
1743 smi
->mii_irq
[i
] = PHY_POLL
;
1745 ret
= mdiobus_register(smi
->mii_bus
);
1752 mdiobus_free(smi
->mii_bus
);
1757 static void rtl8366_smi_mii_cleanup(struct rtl8366_smi
*smi
)
1759 mdiobus_unregister(smi
->mii_bus
);
1760 mdiobus_free(smi
->mii_bus
);
1763 static int rtl8366_smi_mii_bus_match(struct mii_bus
*bus
)
1765 return (bus
->read
== rtl8366_smi_mii_read
&&
1766 bus
->write
== rtl8366_smi_mii_write
);
1769 static int rtl8366_smi_setup(struct rtl8366_smi
*smi
)
1775 ret
= rtl8366_smi_read_reg(smi
, RTL8366S_CHIP_ID_REG
, &chip_id
);
1777 dev_err(smi
->parent
, "unable to read chip id\n");
1782 case RTL8366S_CHIP_ID_8366
:
1785 dev_err(smi
->parent
, "unknown chip id (%04x)\n", chip_id
);
1789 ret
= rtl8366_smi_read_reg(smi
, RTL8366S_CHIP_VERSION_CTRL_REG
,
1792 dev_err(smi
->parent
, "unable to read chip version\n");
1796 dev_info(smi
->parent
, "RTL%04x ver. %u chip found\n",
1797 chip_id
, chip_ver
& RTL8366S_CHIP_VERSION_MASK
);
1799 rtl8366_debugfs_init(smi
);
1804 static int __init
rtl8366_smi_init(struct rtl8366_smi
*smi
)
1811 err
= gpio_request(smi
->gpio_sda
, dev_name(smi
->parent
));
1813 dev_err(smi
->parent
, "gpio_request failed for %u, err=%d\n",
1814 smi
->gpio_sda
, err
);
1818 err
= gpio_request(smi
->gpio_sck
, dev_name(smi
->parent
));
1820 dev_err(smi
->parent
, "gpio_request failed for %u, err=%d\n",
1821 smi
->gpio_sck
, err
);
1825 spin_lock_init(&smi
->lock
);
1827 dev_info(smi
->parent
, "using GPIO pins %u (SDA) and %u (SCK)\n",
1828 smi
->gpio_sda
, smi
->gpio_sck
);
1833 gpio_free(smi
->gpio_sda
);
1838 static void rtl8366_smi_cleanup(struct rtl8366_smi
*smi
)
1840 gpio_free(smi
->gpio_sck
);
1841 gpio_free(smi
->gpio_sda
);
1844 static int __init
rtl8366_smi_probe(struct platform_device
*pdev
)
1846 static int rtl8366_smi_version_printed
;
1847 struct rtl8366_smi_platform_data
*pdata
;
1848 struct rtl8366_smi
*smi
;
1851 if (!rtl8366_smi_version_printed
++)
1852 printk(KERN_NOTICE RTL8366_SMI_DRIVER_DESC
1853 " version " RTL8366_SMI_DRIVER_VER
"\n");
1855 pdata
= pdev
->dev
.platform_data
;
1857 dev_err(&pdev
->dev
, "no platform data specified\n");
1862 smi
= kzalloc(sizeof(struct rtl8366_smi
), GFP_KERNEL
);
1864 dev_err(&pdev
->dev
, "no memory for private data\n");
1869 smi
->parent
= &pdev
->dev
;
1870 smi
->gpio_sda
= pdata
->gpio_sda
;
1871 smi
->gpio_sck
= pdata
->gpio_sck
;
1873 err
= rtl8366_smi_init(smi
);
1877 platform_set_drvdata(pdev
, smi
);
1879 err
= rtl8366_smi_setup(smi
);
1881 goto err_clear_drvdata
;
1883 err
= rtl8366_smi_mii_init(smi
);
1885 goto err_clear_drvdata
;
1887 err
= rtl8366_smi_switch_init(smi
);
1889 goto err_mii_cleanup
;
1894 rtl8366_smi_mii_cleanup(smi
);
1896 platform_set_drvdata(pdev
, NULL
);
1903 static int rtl8366_phy_config_init(struct phy_device
*phydev
)
1905 if (!rtl8366_smi_mii_bus_match(phydev
->bus
))
1911 static int rtl8366_phy_config_aneg(struct phy_device
*phydev
)
1916 static struct phy_driver rtl8366_smi_phy_driver
= {
1917 .phy_id
= 0x001cc960,
1918 .name
= "Realtek RTL8366",
1919 .phy_id_mask
= 0x1ffffff0,
1920 .features
= PHY_GBIT_FEATURES
,
1921 .config_aneg
= rtl8366_phy_config_aneg
,
1922 .config_init
= rtl8366_phy_config_init
,
1923 .read_status
= genphy_read_status
,
1925 .owner
= THIS_MODULE
,
1929 static int __devexit
rtl8366_smi_remove(struct platform_device
*pdev
)
1931 struct rtl8366_smi
*smi
= platform_get_drvdata(pdev
);
1934 rtl8366_smi_switch_cleanup(smi
);
1935 rtl8366_debugfs_remove(smi
);
1936 rtl8366_smi_mii_cleanup(smi
);
1937 platform_set_drvdata(pdev
, NULL
);
1938 rtl8366_smi_cleanup(smi
);
1945 static struct platform_driver rtl8366_smi_driver
= {
1947 .name
= RTL8366_SMI_DRIVER_NAME
,
1948 .owner
= THIS_MODULE
,
1950 .probe
= rtl8366_smi_probe
,
1951 .remove
= __devexit_p(rtl8366_smi_remove
),
1954 static int __init
rtl8366_smi_module_init(void)
1957 ret
= platform_driver_register(&rtl8366_smi_driver
);
1961 ret
= phy_driver_register(&rtl8366_smi_phy_driver
);
1963 goto err_platform_unregister
;
1967 err_platform_unregister
:
1968 platform_driver_unregister(&rtl8366_smi_driver
);
1971 module_init(rtl8366_smi_module_init
);
1973 static void __exit
rtl8366_smi_exit(void)
1975 phy_driver_unregister(&rtl8366_smi_phy_driver
);
1976 platform_driver_unregister(&rtl8366_smi_driver
);
1978 module_exit(rtl8366_smi_exit
);
1980 MODULE_DESCRIPTION(RTL8366_SMI_DRIVER_DESC
);
1981 MODULE_VERSION(RTL8366_SMI_DRIVER_VER
);
1982 MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
1983 MODULE_AUTHOR("Antti Seppälä <a.seppala@gmail.com>");
1984 MODULE_LICENSE("GPL v2");
1985 MODULE_ALIAS("platform:" RTL8366_SMI_DRIVER_NAME
);