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>
27 #include <linux/debugfs.h>
30 #define RTL8366_SMI_DRIVER_NAME "rtl8366-smi"
31 #define RTL8366_SMI_DRIVER_DESC "Realtek RTL8366 switch driver"
32 #define RTL8366_SMI_DRIVER_VER "0.1.1"
34 #define RTL8366S_PHY_NO_MAX 4
35 #define RTL8366S_PHY_PAGE_MAX 7
36 #define RTL8366S_PHY_ADDR_MAX 31
38 #define RTL8366_CHIP_GLOBAL_CTRL_REG 0x0000
39 #define RTL8366_CHIP_CTRL_VLAN (1 << 13)
41 #define RTL8366_RESET_CTRL_REG 0x0100
42 #define RTL8366_CHIP_CTRL_RESET_HW 1
43 #define RTL8366_CHIP_CTRL_RESET_SW (1 << 1)
45 #define RTL8366S_CHIP_VERSION_CTRL_REG 0x0104
46 #define RTL8366S_CHIP_VERSION_MASK 0xf
47 #define RTL8366S_CHIP_ID_REG 0x0105
48 #define RTL8366S_CHIP_ID_8366 0x8366
50 /* PHY registers control */
51 #define RTL8366S_PHY_ACCESS_CTRL_REG 0x8028
52 #define RTL8366S_PHY_ACCESS_DATA_REG 0x8029
54 #define RTL8366S_PHY_CTRL_READ 1
55 #define RTL8366S_PHY_CTRL_WRITE 0
57 #define RTL8366S_PHY_REG_MASK 0x1f
58 #define RTL8366S_PHY_PAGE_OFFSET 5
59 #define RTL8366S_PHY_PAGE_MASK (0x7 << 5)
60 #define RTL8366S_PHY_NO_OFFSET 9
61 #define RTL8366S_PHY_NO_MASK (0x1f << 9)
63 #define RTL8366_SMI_ACK_RETRY_COUNT 5
64 #define RTL8366_SMI_CLK_DELAY 10 /* nsec */
66 /* LED control registers */
67 #define RTL8366_LED_BLINKRATE_REG 0x0420
68 #define RTL8366_LED_BLINKRATE_BIT 0
69 #define RTL8366_LED_BLINKRATE_MASK 0x0007
71 #define RTL8366_LED_CTRL_REG 0x0421
72 #define RTL8366_LED_0_1_CTRL_REG 0x0422
73 #define RTL8366_LED_2_3_CTRL_REG 0x0423
75 #define RTL8366S_MIB_COUNT 33
76 #define RTL8366S_GLOBAL_MIB_COUNT 1
77 #define RTL8366S_MIB_COUNTER_PORT_OFFSET 0x0040
78 #define RTL8366S_MIB_COUNTER_BASE 0x1000
79 #define RTL8366S_MIB_CTRL_REG 0x11F0
80 #define RTL8366S_MIB_CTRL_USER_MASK 0x01FF
81 #define RTL8366S_MIB_CTRL_BUSY_MASK 0x0001
82 #define RTL8366S_MIB_CTRL_RESET_MASK 0x0002
84 #define RTL8366S_MIB_CTRL_GLOBAL_RESET_MASK 0x0004
85 #define RTL8366S_MIB_CTRL_PORT_RESET_BIT 0x0003
86 #define RTL8366S_MIB_CTRL_PORT_RESET_MASK 0x01FC
89 #define RTL8366S_PORT_VLAN_CTRL_BASE 0x0058
90 #define RTL8366S_VLAN_TABLE_READ_BASE 0x018B
91 #define RTL8366S_VLAN_TABLE_WRITE_BASE 0x0185
93 #define RTL8366S_VLAN_TB_CTRL_REG 0x010F
95 #define RTL8366S_TABLE_ACCESS_CTRL_REG 0x0180
96 #define RTL8366S_TABLE_VLAN_READ_CTRL 0x0E01
97 #define RTL8366S_TABLE_VLAN_WRITE_CTRL 0x0F01
99 #define RTL8366S_VLAN_MEMCONF_BASE 0x0016
102 #define RTL8366S_PORT_LINK_STATUS_BASE 0x0060
103 #define RTL8366S_PORT_STATUS_SPEED_MASK 0x0003
104 #define RTL8366S_PORT_STATUS_DUPLEX_MASK 0x0004
105 #define RTL8366S_PORT_STATUS_LINK_MASK 0x0010
106 #define RTL8366S_PORT_STATUS_TXPAUSE_MASK 0x0020
107 #define RTL8366S_PORT_STATUS_RXPAUSE_MASK 0x0040
108 #define RTL8366S_PORT_STATUS_AN_MASK 0x0080
111 #define RTL8366_PORT_NUM_CPU 5
112 #define RTL8366_NUM_PORTS 6
113 #define RTL8366_NUM_VLANS 16
114 #define RTL8366_NUM_LEDGROUPS 4
115 #define RTL8366_NUM_VIDS 4096
116 #define RTL8366S_PRIORITYMAX 7
117 #define RTL8366S_FIDMAX 7
120 #define RTL8366_PORT_1 (1 << 0) /* In userspace port 0 */
121 #define RTL8366_PORT_2 (1 << 1) /* In userspace port 1 */
122 #define RTL8366_PORT_3 (1 << 2) /* In userspace port 2 */
123 #define RTL8366_PORT_4 (1 << 3) /* In userspace port 3 */
125 #define RTL8366_PORT_UNKNOWN (1 << 4) /* No known connection */
126 #define RTL8366_PORT_CPU (1 << 5) /* CPU port */
128 #define RTL8366_PORT_ALL (RTL8366_PORT_1 | \
132 RTL8366_PORT_UNKNOWN | \
135 #define RTL8366_PORT_ALL_BUT_CPU (RTL8366_PORT_1 | \
139 RTL8366_PORT_UNKNOWN)
141 #define RTL8366_PORT_ALL_EXTERNAL (RTL8366_PORT_1 | \
146 #define RTL8366_PORT_ALL_INTERNAL (RTL8366_PORT_UNKNOWN | \
149 struct rtl8366s_vlanconfig
{
160 struct rtl8366s_vlan4kentry
{
170 static const char *MIBCOUNTERS
[] = { "IfInOctets ",
172 "EtherStatsUnderSizePkts ",
174 "EtherStatsPkts64Octets ",
175 "EtherStatsPkts65to127Octets ",
176 "EtherStatsPkts128to255Octets ",
177 "EtherStatsPkts256to511Octets ",
178 "EtherStatsPkts512to1023Octets ",
179 "EtherStatsPkts1024to1518Octets ",
180 "EtherOversizeStats ",
181 "EtherStatsJabbers ",
183 "EtherStatsMulticastPkts ",
184 "EtherStatsBroadcastPkts ",
185 "EtherStatsDropEvents ",
186 "Dot3StatsFCSErrors ",
187 "Dot3StatsSymbolErrors ",
188 "Dot3InPauseFrames ",
189 "Dot3ControlInUnknownOpcodes ",
191 "Dot3StatsSingleCollisionFrames ",
192 "Dot3StatMultipleCollisionFrames ",
193 "Dot3sDeferredTransmissions ",
194 "Dot3StatsLateCollisions ",
195 "EtherStatsCollisions ",
196 "Dot3StatsExcessiveCollisions ",
197 "Dot3OutPauseFrames ",
198 "Dot1dBasePortDelayExceededDiscards",
199 "Dot1dTpPortInDiscards ",
201 "IfOutMulticastPkts ",
202 "IfOutBroadcastPkts ",
206 struct platform_device
*pdev
;
207 struct rtl8366_smi_platform_data
*pdata
;
209 struct mii_bus
*mii_bus
;
210 struct switch_dev dev
;
211 int mii_irq
[PHY_MAX_ADDR
];
214 struct dentry
*debugfs_root
;
222 static inline struct rtl8366_smi
*sw_to_rtl8366(struct switch_dev
*sw
)
224 return container_of(sw
, struct rtl8366_smi
, dev
);
227 static inline void rtl8366_smi_clk_delay(struct rtl8366_smi
*smi
)
229 ndelay(RTL8366_SMI_CLK_DELAY
);
232 static void rtl8366_smi_start(struct rtl8366_smi
*smi
)
234 unsigned int sda
= smi
->pdata
->gpio_sda
;
235 unsigned int sck
= smi
->pdata
->gpio_sck
;
238 * Set GPIO pins to output mode, with initial state:
241 gpio_direction_output(sck
, 0);
242 gpio_direction_output(sda
, 1);
243 rtl8366_smi_clk_delay(smi
);
245 /* CLK 1: 0 -> 1, 1 -> 0 */
246 gpio_set_value(sck
, 1);
247 rtl8366_smi_clk_delay(smi
);
248 gpio_set_value(sck
, 0);
249 rtl8366_smi_clk_delay(smi
);
252 gpio_set_value(sck
, 1);
253 rtl8366_smi_clk_delay(smi
);
254 gpio_set_value(sda
, 0);
255 rtl8366_smi_clk_delay(smi
);
256 gpio_set_value(sck
, 0);
257 rtl8366_smi_clk_delay(smi
);
258 gpio_set_value(sda
, 1);
261 static void rtl8366_smi_stop(struct rtl8366_smi
*smi
)
263 unsigned int sda
= smi
->pdata
->gpio_sda
;
264 unsigned int sck
= smi
->pdata
->gpio_sck
;
266 rtl8366_smi_clk_delay(smi
);
267 gpio_set_value(sda
, 0);
268 gpio_set_value(sck
, 1);
269 rtl8366_smi_clk_delay(smi
);
270 gpio_set_value(sda
, 1);
271 rtl8366_smi_clk_delay(smi
);
272 gpio_set_value(sck
, 1);
273 rtl8366_smi_clk_delay(smi
);
274 gpio_set_value(sck
, 0);
275 rtl8366_smi_clk_delay(smi
);
276 gpio_set_value(sck
, 1);
279 rtl8366_smi_clk_delay(smi
);
280 gpio_set_value(sck
, 0);
281 rtl8366_smi_clk_delay(smi
);
282 gpio_set_value(sck
, 1);
284 /* set GPIO pins to input mode */
285 gpio_direction_input(sda
);
286 gpio_direction_input(sck
);
289 static void rtl8366_smi_write_bits(struct rtl8366_smi
*smi
, u32 data
, u32 len
)
291 unsigned int sda
= smi
->pdata
->gpio_sda
;
292 unsigned int sck
= smi
->pdata
->gpio_sck
;
294 for (; len
> 0; len
--) {
295 rtl8366_smi_clk_delay(smi
);
298 if ( data
& ( 1 << (len
- 1)) )
299 gpio_set_value(sda
, 1);
301 gpio_set_value(sda
, 0);
302 rtl8366_smi_clk_delay(smi
);
305 gpio_set_value(sck
, 1);
306 rtl8366_smi_clk_delay(smi
);
307 gpio_set_value(sck
, 0);
311 static void rtl8366_smi_read_bits(struct rtl8366_smi
*smi
, u32 len
, u32
*data
)
313 unsigned int sda
= smi
->pdata
->gpio_sda
;
314 unsigned int sck
= smi
->pdata
->gpio_sck
;
316 gpio_direction_input(sda
);
318 for (*data
= 0; len
> 0; len
--) {
321 rtl8366_smi_clk_delay(smi
);
324 gpio_set_value(sck
, 1);
325 rtl8366_smi_clk_delay(smi
);
326 u
= gpio_get_value(sda
);
327 gpio_set_value(sck
, 0);
329 *data
|= (u
<< (len
- 1));
332 gpio_direction_output(sda
, 0);
335 static int rtl8366_smi_wait_for_ack(struct rtl8366_smi
*smi
)
343 rtl8366_smi_read_bits(smi
, 1, &ack
);
347 if (++retry_cnt
> RTL8366_SMI_ACK_RETRY_COUNT
)
354 static int rtl8366_smi_write_byte(struct rtl8366_smi
*smi
, u8 data
)
356 rtl8366_smi_write_bits(smi
, data
, 8);
357 return rtl8366_smi_wait_for_ack(smi
);
360 static int rtl8366_smi_read_byte0(struct rtl8366_smi
*smi
, u8
*data
)
365 rtl8366_smi_read_bits(smi
, 8, &t
);
369 rtl8366_smi_write_bits(smi
, 0x00, 1);
374 static int rtl8366_smi_read_byte1(struct rtl8366_smi
*smi
, u8
*data
)
379 rtl8366_smi_read_bits(smi
, 8, &t
);
383 rtl8366_smi_write_bits(smi
, 0x01, 1);
388 static int rtl8366_smi_read_reg(struct rtl8366_smi
*smi
, u32 addr
, u32
*data
)
395 spin_lock_irqsave(&smi
->lock
, flags
);
397 rtl8366_smi_start(smi
);
399 /* send READ command */
400 ret
= rtl8366_smi_write_byte(smi
, 0x0a << 4 | 0x04 << 1 | 0x01);
405 ret
= rtl8366_smi_write_byte(smi
, addr
& 0xff);
410 ret
= rtl8366_smi_write_byte(smi
, addr
>> 8);
415 rtl8366_smi_read_byte0(smi
, &lo
);
416 /* read DATA[15:8] */
417 rtl8366_smi_read_byte1(smi
, &hi
);
419 *data
= ((u32
) lo
) | (((u32
) hi
) << 8);
424 rtl8366_smi_stop(smi
);
425 spin_unlock_irqrestore(&smi
->lock
, flags
);
430 static int rtl8366_smi_write_reg(struct rtl8366_smi
*smi
, u32 addr
, u32 data
)
435 spin_lock_irqsave(&smi
->lock
, flags
);
437 rtl8366_smi_start(smi
);
439 /* send WRITE command */
440 ret
= rtl8366_smi_write_byte(smi
, 0x0a << 4 | 0x04 << 1 | 0x00);
445 ret
= rtl8366_smi_write_byte(smi
, addr
& 0xff);
450 ret
= rtl8366_smi_write_byte(smi
, addr
>> 8);
454 /* write DATA[7:0] */
455 ret
= rtl8366_smi_write_byte(smi
, data
& 0xff);
459 /* write DATA[15:8] */
460 ret
= rtl8366_smi_write_byte(smi
, data
>> 8);
467 rtl8366_smi_stop(smi
);
468 spin_unlock_irqrestore(&smi
->lock
, flags
);
473 static int rtl8366_smi_read_phy_reg(struct rtl8366_smi
*smi
,
474 u32 phy_no
, u32 page
, u32 addr
, u32
*data
)
479 if (phy_no
> RTL8366S_PHY_NO_MAX
)
482 if (page
> RTL8366S_PHY_PAGE_MAX
)
485 if (addr
> RTL8366S_PHY_ADDR_MAX
)
488 ret
= rtl8366_smi_write_reg(smi
, RTL8366S_PHY_ACCESS_CTRL_REG
,
489 RTL8366S_PHY_CTRL_READ
);
493 reg
= 0x8000 | (1 << (phy_no
+ RTL8366S_PHY_NO_OFFSET
)) |
494 ((page
<< RTL8366S_PHY_PAGE_OFFSET
) & RTL8366S_PHY_PAGE_MASK
) |
495 (addr
& RTL8366S_PHY_REG_MASK
);
497 ret
= rtl8366_smi_write_reg(smi
, reg
, 0);
501 ret
= rtl8366_smi_read_reg(smi
, RTL8366S_PHY_ACCESS_DATA_REG
, data
);
508 static int rtl8366_smi_write_phy_reg(struct rtl8366_smi
*smi
,
509 u32 phy_no
, u32 page
, u32 addr
, u32 data
)
514 if (phy_no
> RTL8366S_PHY_NO_MAX
)
517 if (page
> RTL8366S_PHY_PAGE_MAX
)
520 if (addr
> RTL8366S_PHY_ADDR_MAX
)
523 ret
= rtl8366_smi_write_reg(smi
, RTL8366S_PHY_ACCESS_CTRL_REG
,
524 RTL8366S_PHY_CTRL_WRITE
);
528 reg
= 0x8000 | (1 << (phy_no
+ RTL8366S_PHY_NO_OFFSET
)) |
529 ((page
<< RTL8366S_PHY_PAGE_OFFSET
) & RTL8366S_PHY_PAGE_MASK
) |
530 (addr
& RTL8366S_PHY_REG_MASK
);
532 ret
= rtl8366_smi_write_reg(smi
, reg
, data
);
539 static int rtl8366_get_mib_counter(struct rtl8366_smi
*smi
, int counter
,
540 int port
, unsigned long long *val
)
544 u32 addr
, data
, regoffset
;
547 /* address offset to MIBs counter */
548 const u16 mibLength
[RTL8366S_MIB_COUNT
] = {4, 4, 2, 2, 2, 2, 2, 2, 2,
549 2, 2, 2, 2, 2, 2, 2, 2, 2,
550 2, 2, 4, 2, 2, 2, 2, 2, 2,
553 if (port
> RTL8366_NUM_PORTS
|| counter
>= RTL8366S_MIB_COUNT
)
557 regoffset
= RTL8366S_MIB_COUNTER_PORT_OFFSET
* (port
);
559 while (i
< counter
) {
560 regoffset
+= mibLength
[i
];
564 addr
= RTL8366S_MIB_COUNTER_BASE
+ regoffset
;
567 /* writing access counter address first */
568 /* then ASIC will prepare 64bits counter wait for being retrived */
569 data
= 0;/* writing data will be discard by ASIC */
570 err
= rtl8366_smi_write_reg(smi
, addr
, data
);
574 /* read MIB control register */
575 err
= rtl8366_smi_read_reg(smi
, RTL8366S_MIB_CTRL_REG
, &data
);
579 if (data
& RTL8366S_MIB_CTRL_BUSY_MASK
)
582 if (data
& RTL8366S_MIB_CTRL_RESET_MASK
)
586 addr
= addr
+ mibLength
[counter
] - 1;
587 i
= mibLength
[counter
];
590 err
= rtl8366_smi_read_reg(smi
, addr
, &data
);
594 mibvalue
= (mibvalue
<< 16) | (data
& 0xFFFF);
604 static int rtl8366s_get_vlan_4k_entry(struct rtl8366_smi
*smi
, u32 vid
,
605 struct rtl8366s_vlan4kentry
*vlan4k
)
611 memset(vlan4k
, '\0', sizeof(struct rtl8366s_vlan4kentry
));
614 if (vid
>= RTL8366_NUM_VIDS
)
617 tableaddr
= (u16
*)vlan4k
;
621 err
= rtl8366_smi_write_reg(smi
, RTL8366S_VLAN_TABLE_WRITE_BASE
, data
);
625 /* write table access control word */
626 err
= rtl8366_smi_write_reg(smi
, RTL8366S_TABLE_ACCESS_CTRL_REG
,
627 RTL8366S_TABLE_VLAN_READ_CTRL
);
631 err
= rtl8366_smi_read_reg(smi
, RTL8366S_VLAN_TABLE_READ_BASE
, &data
);
638 err
= rtl8366_smi_read_reg(smi
, RTL8366S_VLAN_TABLE_READ_BASE
+ 1,
649 static int rtl8366s_set_vlan_4k_entry(struct rtl8366_smi
*smi
,
650 const struct rtl8366s_vlan4kentry
*vlan4k
)
656 if (vlan4k
->vid
>= RTL8366_NUM_VIDS
||
657 vlan4k
->member
> RTL8366_PORT_ALL
||
658 vlan4k
->untag
> RTL8366_PORT_ALL
||
659 vlan4k
->fid
> RTL8366S_FIDMAX
)
662 tableaddr
= (u16
*)vlan4k
;
666 err
= rtl8366_smi_write_reg(smi
, RTL8366S_VLAN_TABLE_WRITE_BASE
, data
);
674 rtl8366_smi_write_reg(smi
, RTL8366S_VLAN_TABLE_WRITE_BASE
+ 1, data
);
677 /* write table access control word */
678 err
= rtl8366_smi_write_reg(smi
, RTL8366S_TABLE_ACCESS_CTRL_REG
,
679 RTL8366S_TABLE_VLAN_WRITE_CTRL
);
686 static int rtl8366s_get_vlan_member_config(struct rtl8366_smi
*smi
, u32 index
,
687 struct rtl8366s_vlanconfig
*vlanmc
)
694 memset(vlanmc
, '\0', sizeof(struct rtl8366s_vlanconfig
));
696 if (index
>= RTL8366_NUM_VLANS
)
699 tableaddr
= (u16
*)vlanmc
;
701 addr
= RTL8366S_VLAN_MEMCONF_BASE
+ (index
<< 1);
703 err
= rtl8366_smi_read_reg(smi
, addr
, &data
);
710 addr
= RTL8366S_VLAN_MEMCONF_BASE
+ 1 + (index
<< 1);
712 err
= rtl8366_smi_read_reg(smi
, addr
, &data
);
721 static int rtl8366s_set_vlan_member_config(struct rtl8366_smi
*smi
, u32 index
,
722 const struct rtl8366s_vlanconfig
730 if (index
>= RTL8366_NUM_VLANS
||
731 vlanmc
->vid
>= RTL8366_NUM_VIDS
||
732 vlanmc
->priority
> RTL8366S_PRIORITYMAX
||
733 vlanmc
->member
> RTL8366_PORT_ALL
||
734 vlanmc
->untag
> RTL8366_PORT_ALL
||
735 vlanmc
->fid
> RTL8366S_FIDMAX
)
738 addr
= RTL8366S_VLAN_MEMCONF_BASE
+ (index
<< 1);
741 tableaddr
= (u16
*)vlanmc
;
744 err
= rtl8366_smi_write_reg(smi
, addr
, data
);
748 addr
= RTL8366S_VLAN_MEMCONF_BASE
+ 1 + (index
<< 1);
753 err
= rtl8366_smi_write_reg(smi
, addr
, data
);
760 static int rtl8366_get_port_vlan_index(struct rtl8366_smi
*smi
, int port
,
767 /* bits mapping to port vlan control register of port n */
768 const u16 bits
[RTL8366_NUM_PORTS
] = { 0x000F, 0x00F0, 0x0F00,
769 0xF000, 0x000F, 0x00F0 };
770 /* bits offset to port vlan control register of port n */
771 const u16 bitoffset
[RTL8366_NUM_PORTS
] = { 0, 4, 8, 12, 0, 4 };
772 /* address offset to port vlan control register of port n */
773 const u16 addroffset
[RTL8366_NUM_PORTS
] = { 0, 0, 0, 0, 1, 1 };
775 if (port
>= RTL8366_NUM_PORTS
)
778 addr
= RTL8366S_PORT_VLAN_CTRL_BASE
+ addroffset
[port
];
780 err
= rtl8366_smi_read_reg(smi
, addr
, &data
);
784 *val
= (data
& bits
[port
]) >> bitoffset
[port
];
790 static int rtl8366_get_vlan_port_pvid(struct rtl8366_smi
*smi
, int port
,
795 struct rtl8366s_vlanconfig vlanmc
;
797 err
= rtl8366_get_port_vlan_index(smi
, port
, &index
);
801 err
= rtl8366s_get_vlan_member_config(smi
, index
, &vlanmc
);
809 static int rtl8366_set_port_vlan_index(struct rtl8366_smi
*smi
, int port
,
818 /* bits mapping to port vlan control register of port n */
819 const u16 bitmasks
[6] = { 0x000F, 0x00F0, 0x0F00,
820 0xF000, 0x000F, 0x00F0 };
821 /* bits offset to port vlan control register of port n */
822 const u16 bitOff
[6] = { 0, 4, 8, 12, 0, 4 };
823 /* address offset to port vlan control register of port n */
824 const u16 addrOff
[6] = { 0, 0, 0, 0, 1, 1 };
826 if (port
>= RTL8366_NUM_PORTS
|| index
>= RTL8366_NUM_VLANS
)
829 addr
= RTL8366S_PORT_VLAN_CTRL_BASE
+ addrOff
[port
];
831 bits
= bitmasks
[port
];
833 data
= (index
<< bitOff
[port
]) & bits
;
835 err
= rtl8366_smi_read_reg(smi
, addr
, &vlan_data
);
839 vlan_data
&= ~(vlan_data
& bits
);
842 err
= rtl8366_smi_write_reg(smi
, addr
, vlan_data
);
849 static int rtl8366_set_vlan_port_pvid(struct rtl8366_smi
*smi
, int port
,
853 struct rtl8366s_vlanconfig vlanmc
;
854 struct rtl8366s_vlan4kentry vlan4k
;
856 if (port
>= RTL8366_NUM_PORTS
|| val
>= RTL8366_NUM_VIDS
)
861 /* Updating the 4K entry; lookup it and change the port member set */
862 rtl8366s_get_vlan_4k_entry(smi
, val
, &vlan4k
);
863 vlan4k
.member
|= ((1 << port
) | RTL8366_PORT_CPU
);
864 vlan4k
.untag
= RTL8366_PORT_ALL_BUT_CPU
;
865 rtl8366s_set_vlan_4k_entry(smi
, &vlan4k
);
867 /* For the 16 entries more work needs to be done. First see if such
868 VID is already there and change it */
869 for (i
= 0; i
< RTL8366_NUM_VLANS
; ++i
) {
870 rtl8366s_get_vlan_member_config(smi
, i
, &vlanmc
);
872 /* Try to find an existing vid and update port member set */
873 if (val
== vlanmc
.vid
) {
874 vlanmc
.member
|= ((1 << port
) | RTL8366_PORT_CPU
);
875 rtl8366s_set_vlan_member_config(smi
, i
, &vlanmc
);
877 /* Now update PVID register settings */
878 rtl8366_set_port_vlan_index(smi
, port
, i
);
884 /* PVID could not be found from vlan table. Replace unused (one that
885 has no member ports) with new one */
886 for (i
= 0; i
< RTL8366_NUM_VLANS
; ++i
) {
887 rtl8366s_get_vlan_member_config(smi
, i
, &vlanmc
);
889 /* See if this vlan member configuration is unused. It is
890 unused if member set contains no ports or CPU port only */
891 if (!vlanmc
.member
|| vlanmc
.member
== RTL8366_PORT_CPU
) {
894 vlanmc
.untag
= RTL8366_PORT_ALL_BUT_CPU
;
895 vlanmc
.member
= ((1 << port
) | RTL8366_PORT_CPU
);
898 rtl8366s_set_vlan_member_config(smi
, i
, &vlanmc
);
900 /* Now update PVID register settings */
901 rtl8366_set_port_vlan_index(smi
, port
, i
);
907 dev_err(&smi
->pdev
->dev
, "All 16 vlan member configurations are in "
913 static int rtl8366_vlan_set_vlan(struct rtl8366_smi
*smi
, int enable
)
916 rtl8366_smi_read_reg(smi
, RTL8366_CHIP_GLOBAL_CTRL_REG
, &data
);
918 data
&= ~(data
& RTL8366_CHIP_CTRL_VLAN
);
920 data
|= RTL8366_CHIP_CTRL_VLAN
;
922 return rtl8366_smi_write_reg(smi
, RTL8366_CHIP_GLOBAL_CTRL_REG
, data
);
925 static int rtl8366_vlan_set_4ktable(struct rtl8366_smi
*smi
, int enable
)
928 rtl8366_smi_read_reg(smi
, RTL8366S_VLAN_TB_CTRL_REG
, &data
);
934 return rtl8366_smi_write_reg(smi
, RTL8366S_VLAN_TB_CTRL_REG
, data
);
937 static int rtl8366s_reset_vlan(struct rtl8366_smi
*smi
)
939 struct rtl8366s_vlan4kentry vlan4k
;
940 struct rtl8366s_vlanconfig vlanmc
;
944 /* clear 16 VLAN member configuration */
950 for (i
= 0; i
< RTL8366_NUM_VLANS
; i
++) {
951 err
= rtl8366s_set_vlan_member_config(smi
, i
, &vlanmc
);
956 /* Set a default VLAN with vid 1 to 4K table for all ports */
958 vlan4k
.member
= RTL8366_PORT_ALL
;
959 vlan4k
.untag
= RTL8366_PORT_ALL
;
961 err
= rtl8366s_set_vlan_4k_entry(smi
, &vlan4k
);
965 /* Set all ports PVID to default VLAN */
966 for (i
= 0; i
< RTL8366_NUM_PORTS
; i
++) {
967 err
= rtl8366_set_vlan_port_pvid(smi
, i
, 0);
976 static int rtl8366_debugfs_open(struct inode
*inode
, struct file
*file
)
978 file
->private_data
= inode
->i_private
;
982 static ssize_t
rtl8366_read_debugfs_mibs(struct file
*file
,
983 char __user
*user_buf
,
984 size_t count
, loff_t
*ppos
)
987 struct rtl8366_smi
*smi
= (struct rtl8366_smi
*)file
->private_data
;
988 char *buf
= smi
->buf
;
990 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "MIB Counters:\n");
991 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "Counter"
993 "Port 0 \t\t Port 1 \t\t Port 2 \t\t Port 3 \t\t "
996 for (i
= 0; i
< 33; ++i
) {
998 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "%d:%s ",
1000 for (j
= 0; j
< RTL8366_NUM_PORTS
; ++j
) {
1001 unsigned long long counter
= 0;
1003 if (!rtl8366_get_mib_counter(smi
, i
, j
, &counter
))
1004 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1007 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1010 if (j
!= RTL8366_NUM_PORTS
- 1) {
1011 if (counter
< 100000)
1012 len
+= snprintf(buf
+ len
,
1013 sizeof(smi
->buf
) - len
,
1016 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1020 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\n");
1023 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\n");
1025 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1028 static ssize_t
rtl8366_read_debugfs_vlan(struct file
*file
,
1029 char __user
*user_buf
,
1030 size_t count
, loff_t
*ppos
)
1033 struct rtl8366_smi
*smi
= (struct rtl8366_smi
*)file
->private_data
;
1034 char *buf
= smi
->buf
;
1036 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "VLAN Member Config:\n");
1037 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1038 "\t id \t vid \t prio \t member \t untag \t fid "
1041 for (i
= 0; i
< RTL8366_NUM_VLANS
; ++i
) {
1042 struct rtl8366s_vlanconfig vlanmc
;
1044 rtl8366s_get_vlan_member_config(smi
, i
, &vlanmc
);
1046 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1047 "\t[%d] \t %d \t %d \t 0x%04x \t 0x%04x \t %d "
1048 "\t", i
, vlanmc
.vid
, vlanmc
.priority
,
1049 vlanmc
.member
, vlanmc
.untag
, vlanmc
.fid
);
1051 for (j
= 0; j
< RTL8366_NUM_PORTS
; ++j
) {
1053 if (!rtl8366_get_port_vlan_index(smi
, j
, &index
)) {
1055 len
+= snprintf(buf
+ len
,
1056 sizeof(smi
->buf
) - len
,
1060 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\n");
1063 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1066 static ssize_t
rtl8366_read_debugfs_reg(struct file
*file
,
1067 char __user
*user_buf
,
1068 size_t count
, loff_t
*ppos
)
1070 u32 t
, reg
= g_dbg_reg
;
1072 struct rtl8366_smi
*smi
= (struct rtl8366_smi
*)file
->private_data
;
1073 char *buf
= smi
->buf
;
1075 memset(buf
, '\0', sizeof(smi
->buf
));
1077 err
= rtl8366_smi_read_reg(smi
, reg
, &t
);
1079 len
+= snprintf(buf
, sizeof(smi
->buf
),
1080 "Read failed (reg: 0x%04x)\n", reg
);
1081 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1084 len
+= snprintf(buf
, sizeof(smi
->buf
), "reg = 0x%04x, val = 0x%04x\n",
1087 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1090 static ssize_t
rtl8366_write_debugfs_reg(struct file
*file
,
1091 const char __user
*user_buf
,
1092 size_t count
, loff_t
*ppos
)
1095 u32 reg
= g_dbg_reg
;
1098 struct rtl8366_smi
*smi
= (struct rtl8366_smi
*)file
->private_data
;
1099 char *buf
= smi
->buf
;
1101 len
= min(count
, sizeof(smi
->buf
) - 1);
1102 if (copy_from_user(buf
, user_buf
, len
)) {
1103 dev_err(&smi
->pdev
->dev
, "copy from user failed\n");
1108 if (len
> 0 && buf
[len
- 1] == '\n')
1109 buf
[len
- 1] = '\0';
1112 if (strict_strtoul(buf
, 16, &data
)) {
1113 dev_err(&smi
->pdev
->dev
, "Invalid reg value %s\n", buf
);
1115 err
= rtl8366_smi_write_reg(smi
, reg
, data
);
1117 dev_err(&smi
->pdev
->dev
,
1118 "writing reg 0x%04x val 0x%04lx failed\n",
1126 static const struct file_operations fops_rtl8366_regs
= {
1127 .read
= rtl8366_read_debugfs_reg
,
1128 .write
= rtl8366_write_debugfs_reg
,
1129 .open
= rtl8366_debugfs_open
,
1130 .owner
= THIS_MODULE
1133 static const struct file_operations fops_rtl8366_vlan
= {
1134 .read
= rtl8366_read_debugfs_vlan
,
1135 .open
= rtl8366_debugfs_open
,
1136 .owner
= THIS_MODULE
1139 static const struct file_operations fops_rtl8366_mibs
= {
1140 .read
= rtl8366_read_debugfs_mibs
,
1141 .open
= rtl8366_debugfs_open
,
1142 .owner
= THIS_MODULE
1145 static void rtl8366_debugfs_init(struct rtl8366_smi
*smi
)
1147 struct dentry
*node
;
1148 struct dentry
*root
;
1150 if (!smi
->debugfs_root
)
1151 smi
->debugfs_root
= debugfs_create_dir("rtl8366s", NULL
);
1153 if (!smi
->debugfs_root
) {
1154 dev_err(&smi
->pdev
->dev
, "Unable to create debugfs dir\n");
1157 root
= smi
->debugfs_root
;
1159 node
= debugfs_create_x16("reg", S_IRUGO
| S_IWUSR
, root
, &g_dbg_reg
);
1161 dev_err(&smi
->pdev
->dev
, "Creating debugfs file reg failed\n");
1165 node
= debugfs_create_file("val", S_IRUGO
| S_IWUSR
, root
, smi
,
1166 &fops_rtl8366_regs
);
1168 dev_err(&smi
->pdev
->dev
, "Creating debugfs file val failed\n");
1172 node
= debugfs_create_file("vlan", S_IRUSR
, root
, smi
,
1173 &fops_rtl8366_vlan
);
1175 dev_err(&smi
->pdev
->dev
, "Creating debugfs file vlan "
1180 node
= debugfs_create_file("mibs", S_IRUSR
, root
, smi
,
1181 &fops_rtl8366_mibs
);
1183 dev_err(&smi
->pdev
->dev
, "Creating debugfs file mibs "
1189 static void rtl8366_debugfs_remove(struct rtl8366_smi
*smi
)
1191 if (smi
->debugfs_root
) {
1192 debugfs_remove_recursive(smi
->debugfs_root
);
1193 smi
->debugfs_root
= NULL
;
1198 static inline void rtl8366_debugfs_init(struct rtl8366_smi
*smi
) {}
1199 static inline void rtl8366_debugfs_remove(struct rtl8366_smi
*smi
) {}
1202 static int rtl8366_global_reset_mibs(struct switch_dev
*dev
,
1203 const struct switch_attr
*attr
,
1204 struct switch_val
*val
)
1207 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1209 if (val
->value
.i
== 1) {
1210 rtl8366_smi_read_reg(smi
, RTL8366S_MIB_CTRL_REG
, &data
);
1212 rtl8366_smi_write_reg(smi
, RTL8366S_MIB_CTRL_REG
, data
);
1218 static int rtl8366_get_vlan(struct switch_dev
*dev
,
1219 const struct switch_attr
*attr
,
1220 struct switch_val
*val
)
1223 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1225 if (attr
->ofs
== 1) {
1226 rtl8366_smi_read_reg(smi
, RTL8366_CHIP_GLOBAL_CTRL_REG
, &data
);
1228 if (data
& RTL8366_CHIP_CTRL_VLAN
)
1232 } else if (attr
->ofs
== 2) {
1233 rtl8366_smi_read_reg(smi
, RTL8366S_VLAN_TB_CTRL_REG
, &data
);
1244 static int rtl8366_global_get_blinkrate(struct switch_dev
*dev
,
1245 const struct switch_attr
*attr
,
1246 struct switch_val
*val
)
1249 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1250 rtl8366_smi_read_reg(smi
, RTL8366_LED_BLINKRATE_REG
, &data
);
1252 val
->value
.i
= (data
& (RTL8366_LED_BLINKRATE_MASK
));
1257 static int rtl8366_global_set_blinkrate(struct switch_dev
*dev
,
1258 const struct switch_attr
*attr
,
1259 struct switch_val
*val
)
1262 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1264 if (val
->value
.i
>= 6)
1267 rtl8366_smi_read_reg(smi
, RTL8366_LED_BLINKRATE_REG
, &data
);
1269 data
&= ~(data
& RTL8366_LED_BLINKRATE_MASK
);
1270 data
|= val
->value
.i
;
1272 rtl8366_smi_write_reg(smi
, RTL8366_LED_BLINKRATE_REG
, data
);
1277 static int rtl8366_set_vlan(struct switch_dev
*dev
,
1278 const struct switch_attr
*attr
,
1279 struct switch_val
*val
)
1281 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1284 return rtl8366_vlan_set_vlan(smi
, val
->value
.i
);
1286 return rtl8366_vlan_set_4ktable(smi
, val
->value
.i
);
1289 static int rtl8366_attr_get_port_link(struct switch_dev
*dev
,
1290 const struct switch_attr
*attr
,
1291 struct switch_val
*val
)
1293 u32 len
= 0, data
= 0;
1294 int speed
, duplex
, link
, txpause
, rxpause
, nway
;
1295 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1296 char *buf
= smi
->buf
;
1298 if (val
->port_vlan
>= RTL8366_NUM_PORTS
)
1301 memset(buf
, '\0', sizeof(smi
->buf
));
1302 rtl8366_smi_read_reg(smi
, RTL8366S_PORT_LINK_STATUS_BASE
+
1303 (val
->port_vlan
>> 1),
1306 if (val
->port_vlan
& 0x1)
1309 speed
= (data
& RTL8366S_PORT_STATUS_SPEED_MASK
);
1310 duplex
= (data
& RTL8366S_PORT_STATUS_DUPLEX_MASK
) >> 2;
1311 link
= (data
& RTL8366S_PORT_STATUS_LINK_MASK
) >> 4;
1312 txpause
= (data
& RTL8366S_PORT_STATUS_TXPAUSE_MASK
) >> 5;
1313 rxpause
= (data
& RTL8366S_PORT_STATUS_RXPAUSE_MASK
) >> 6;
1314 nway
= (data
& RTL8366S_PORT_STATUS_AN_MASK
) >> 7;
1316 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "Port %d: ",
1320 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1321 "Link UP, Speed: ");
1323 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1324 "Link DOWN, Speed: ");
1327 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "10Base-TX ");
1328 else if (speed
== 1)
1329 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "100Base-TX ");
1330 else if (speed
== 2)
1331 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "1000Base-TX ");
1334 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "Full-Duplex, ");
1336 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "Half-Duplex, ");
1339 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "TX-Pause ");
1341 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "RX-Pause ");
1343 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "nway ");
1351 static int rtl8366_attr_get_vlan_info(struct switch_dev
*dev
,
1352 const struct switch_attr
*attr
,
1353 struct switch_val
*val
)
1357 struct rtl8366s_vlanconfig vlanmc
;
1358 struct rtl8366s_vlan4kentry vlan4k
;
1359 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1360 char *buf
= smi
->buf
;
1362 if (val
->port_vlan
>= RTL8366_NUM_VLANS
)
1365 memset(buf
, '\0', sizeof(smi
->buf
));
1367 rtl8366s_get_vlan_member_config(smi
, val
->port_vlan
, &vlanmc
);
1368 rtl8366s_get_vlan_4k_entry(smi
, vlanmc
.vid
, &vlan4k
);
1370 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "VLAN %d: Ports: ",
1373 for (i
= 0; i
< RTL8366_NUM_PORTS
; ++i
) {
1375 if (!rtl8366_get_port_vlan_index(smi
, i
, &index
) &&
1376 index
== val
->port_vlan
)
1377 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "%d", i
);
1379 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\n");
1381 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1382 "\t\t vid \t prio \t member \t untag \t fid\n");
1383 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\tMC:\t");
1384 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1385 "%d \t %d \t 0x%04x \t 0x%04x \t %d\n",
1386 vlanmc
.vid
, vlanmc
.priority
, vlanmc
.member
,
1387 vlanmc
.untag
, vlanmc
.fid
);
1388 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\t4K:\t");
1389 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1390 "%d \t \t 0x%04x \t 0x%04x \t %d",
1391 vlan4k
.vid
, vlan4k
.member
, vlan4k
.untag
, vlan4k
.fid
);
1399 static int rtl8366_set_port_led(struct switch_dev
*dev
,
1400 const struct switch_attr
*attr
,
1401 struct switch_val
*val
)
1404 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1405 if (val
->port_vlan
>= RTL8366_NUM_PORTS
||
1406 (1 << val
->port_vlan
) == RTL8366_PORT_UNKNOWN
)
1409 if (val
->port_vlan
== RTL8366_PORT_NUM_CPU
) {
1410 rtl8366_smi_read_reg(smi
, RTL8366_LED_BLINKRATE_REG
, &data
);
1411 data
= (data
& (~(0xF << 4))) | (val
->value
.i
<< 4);
1412 rtl8366_smi_write_reg(smi
, RTL8366_LED_BLINKRATE_REG
, data
);
1414 rtl8366_smi_read_reg(smi
, RTL8366_LED_CTRL_REG
, &data
);
1415 data
= (data
& (~(0xF << (val
->port_vlan
* 4)))) |
1416 (val
->value
.i
<< (val
->port_vlan
* 4));
1417 rtl8366_smi_write_reg(smi
, RTL8366_LED_CTRL_REG
, data
);
1423 static int rtl8366_get_port_led(struct switch_dev
*dev
,
1424 const struct switch_attr
*attr
,
1425 struct switch_val
*val
)
1428 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1429 if (val
->port_vlan
>= RTL8366_NUM_LEDGROUPS
)
1432 rtl8366_smi_read_reg(smi
, RTL8366_LED_CTRL_REG
, &data
);
1433 val
->value
.i
= (data
>> (val
->port_vlan
* 4)) & 0x000F;
1438 static int rtl8366_reset_port_mibs(struct switch_dev
*dev
,
1439 const struct switch_attr
*attr
,
1440 struct switch_val
*val
)
1443 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1444 if (val
->port_vlan
>= RTL8366_NUM_PORTS
)
1447 rtl8366_smi_read_reg(smi
, RTL8366S_MIB_CTRL_REG
, &data
);
1448 data
|= (1 << (val
->port_vlan
+ 3));
1449 rtl8366_smi_write_reg(smi
, RTL8366S_MIB_CTRL_REG
, data
);
1454 static int rtl8366_get_port_mib(struct switch_dev
*dev
,
1455 const struct switch_attr
*attr
,
1456 struct switch_val
*val
)
1459 unsigned long long counter
= 0;
1460 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1461 char *buf
= smi
->buf
;
1463 if (val
->port_vlan
>= RTL8366_NUM_PORTS
)
1466 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "Port %d MIB counters\n",
1468 for (i
= 0; i
< RTL8366S_MIB_COUNT
; ++i
) {
1470 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1471 "%d:%s\t", i
, MIBCOUNTERS
[i
]);
1472 if (!rtl8366_get_mib_counter(smi
, i
, val
->port_vlan
, &counter
))
1473 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1474 "[%llu]\n", counter
);
1476 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1485 static int rtl8366_get_ports(struct switch_dev
*dev
,
1486 struct switch_val
*val
)
1488 struct rtl8366s_vlanconfig vlanmc
;
1489 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1490 struct switch_port
*port
;
1493 if (val
->port_vlan
>= RTL8366_NUM_VLANS
)
1496 rtl8366s_get_vlan_member_config(smi
, val
->port_vlan
, &vlanmc
);
1498 port
= &val
->value
.ports
[0];
1500 for (i
= 0; i
< RTL8366_NUM_PORTS
; i
++) {
1501 if (!(vlanmc
.member
& BIT(i
)))
1505 port
->flags
= (vlanmc
.untag
& BIT(i
)) ?
1506 0 : BIT(SWITCH_PORT_FLAG_TAGGED
);
1513 static int rtl8366_set_ports(struct switch_dev
*dev
,
1514 struct switch_val
*val
)
1516 struct rtl8366s_vlanconfig vlanmc
;
1517 struct rtl8366s_vlan4kentry vlan4k
;
1518 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1519 struct switch_port
*port
;
1522 if (val
->port_vlan
>= RTL8366_NUM_VLANS
)
1525 rtl8366s_get_vlan_member_config(smi
, val
->port_vlan
, &vlanmc
);
1526 rtl8366s_get_vlan_4k_entry(smi
, vlanmc
.vid
, &vlan4k
);
1531 port
= &val
->value
.ports
[0];
1532 for (i
= 0; i
< val
->len
; i
++, port
++) {
1533 vlanmc
.member
|= BIT(port
->id
);
1535 if (!(port
->flags
& BIT(SWITCH_PORT_FLAG_TAGGED
)))
1536 vlanmc
.untag
|= BIT(port
->id
);
1539 vlan4k
.member
= vlanmc
.member
;
1540 vlan4k
.untag
= vlanmc
.untag
;
1542 rtl8366s_set_vlan_member_config(smi
, val
->port_vlan
, &vlanmc
);
1543 rtl8366s_set_vlan_4k_entry(smi
, &vlan4k
);
1547 static int rtl8366_get_port_pvid(struct switch_dev
*dev
, int port
, int *val
)
1549 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1550 return rtl8366_get_vlan_port_pvid(smi
, port
, val
);
1553 static int rtl8366_set_port_pvid(struct switch_dev
*dev
, int port
, int val
)
1555 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1556 return rtl8366_set_vlan_port_pvid(smi
, port
, val
);
1559 static int rtl8366_reset_switch(struct switch_dev
*dev
)
1561 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1565 rtl8366_smi_write_reg(smi
, RTL8366_RESET_CTRL_REG
,
1566 RTL8366_CHIP_CTRL_RESET_HW
);
1569 if (rtl8366_smi_read_reg(smi
, RTL8366_RESET_CTRL_REG
, &data
))
1572 if (!(data
& RTL8366_CHIP_CTRL_RESET_HW
))
1574 } while (--timeout
);
1577 printk("Timeout waiting for the switch to reset\n");
1581 return rtl8366s_reset_vlan(smi
);
1584 static struct switch_attr rtl8366_globals
[] = {
1586 .type
= SWITCH_TYPE_INT
,
1587 .name
= "enable_vlan",
1588 .description
= "Enable VLAN mode",
1589 .set
= rtl8366_set_vlan
,
1590 .get
= rtl8366_get_vlan
,
1595 .type
= SWITCH_TYPE_INT
,
1596 .name
= "enable_vlan4k",
1597 .description
= "Enable VLAN 4K mode",
1598 .set
= rtl8366_set_vlan
,
1599 .get
= rtl8366_get_vlan
,
1604 .type
= SWITCH_TYPE_INT
,
1605 .name
= "reset_mibs",
1606 .description
= "Reset all MIB counters",
1607 .set
= rtl8366_global_reset_mibs
,
1612 .type
= SWITCH_TYPE_INT
,
1613 .name
= "blinkrate",
1614 .description
= "Get/Set LED blinking rate (0 = 43ms, 1 = 84ms,"
1615 " 2 = 120ms, 3 = 170ms, 4 = 340ms, 5 = 670ms)",
1616 .set
= rtl8366_global_set_blinkrate
,
1617 .get
= rtl8366_global_get_blinkrate
,
1622 static struct switch_attr rtl8366_port
[] = {
1624 .type
= SWITCH_TYPE_STRING
,
1626 .description
= "Get port link information",
1629 .get
= rtl8366_attr_get_port_link
1632 .type
= SWITCH_TYPE_INT
,
1633 .name
= "reset_mib",
1634 .description
= "Reset single port MIB counters",
1636 .set
= rtl8366_reset_port_mibs
,
1640 .type
= SWITCH_TYPE_STRING
,
1642 .description
= "Get MIB counters for port",
1645 .get
= rtl8366_get_port_mib
1648 .type
= SWITCH_TYPE_INT
,
1650 .description
= "Get/Set port group (0 - 3) led mode (0 - 15)",
1652 .set
= rtl8366_set_port_led
,
1653 .get
= rtl8366_get_port_led
1657 static struct switch_attr rtl8366_vlan
[] = {
1659 .type
= SWITCH_TYPE_STRING
,
1661 .description
= "Get vlan information",
1664 .get
= rtl8366_attr_get_vlan_info
1670 static struct switch_dev rtldev
= {
1672 .cpu_port
= RTL8366_PORT_NUM_CPU
,
1673 .ports
= RTL8366_NUM_PORTS
,
1674 .vlans
= RTL8366_NUM_VLANS
,
1676 .attr
= rtl8366_globals
,
1677 .n_attr
= ARRAY_SIZE(rtl8366_globals
),
1680 .attr
= rtl8366_port
,
1681 .n_attr
= ARRAY_SIZE(rtl8366_port
),
1684 .attr
= rtl8366_vlan
,
1685 .n_attr
= ARRAY_SIZE(rtl8366_vlan
),
1688 .get_vlan_ports
= rtl8366_get_ports
,
1689 .set_vlan_ports
= rtl8366_set_ports
,
1690 .get_port_pvid
= rtl8366_get_port_pvid
,
1691 .set_port_pvid
= rtl8366_set_port_pvid
,
1692 .reset_switch
= rtl8366_reset_switch
,
1695 static int rtl8366_smi_switch_init(struct rtl8366_smi
*smi
)
1697 struct switch_dev
*dev
= &smi
->dev
;
1700 memcpy(dev
, &rtldev
, sizeof(struct switch_dev
));
1702 dev
->devname
= dev_name(&smi
->pdev
->dev
);
1704 err
= register_switch(dev
, NULL
);
1706 dev_err(&smi
->pdev
->dev
, "switch registration failed\n");
1711 static void rtl8366_smi_switch_cleanup(struct rtl8366_smi
*smi
)
1713 unregister_switch(&smi
->dev
);
1716 static int rtl8366_smi_mii_read(struct mii_bus
*bus
, int addr
, int reg
)
1718 struct rtl8366_smi
*smi
= bus
->priv
;
1722 err
= rtl8366_smi_read_phy_reg(smi
, addr
, 0, reg
, &val
);
1729 static int rtl8366_smi_mii_write(struct mii_bus
*bus
, int addr
, int reg
,
1732 struct rtl8366_smi
*smi
= bus
->priv
;
1736 err
= rtl8366_smi_write_phy_reg(smi
, addr
, 0, reg
, val
);
1738 (void) rtl8366_smi_read_phy_reg(smi
, addr
, 0, reg
, &t
);
1743 static int rtl8366_smi_mii_init(struct rtl8366_smi
*smi
)
1748 smi
->mii_bus
= mdiobus_alloc();
1749 if (smi
->mii_bus
== NULL
) {
1754 spin_lock_init(&smi
->lock
);
1755 smi
->mii_bus
->priv
= (void *) smi
;
1756 smi
->mii_bus
->name
= "rtl8366-smi";
1757 smi
->mii_bus
->read
= rtl8366_smi_mii_read
;
1758 smi
->mii_bus
->write
= rtl8366_smi_mii_write
;
1759 snprintf(smi
->mii_bus
->id
, MII_BUS_ID_SIZE
, "%s",
1760 dev_name(&smi
->pdev
->dev
));
1761 smi
->mii_bus
->parent
= &smi
->pdev
->dev
;
1762 smi
->mii_bus
->phy_mask
= ~(0x1f);
1763 smi
->mii_bus
->irq
= smi
->mii_irq
;
1764 for (i
= 0; i
< PHY_MAX_ADDR
; i
++)
1765 smi
->mii_irq
[i
] = PHY_POLL
;
1767 ret
= mdiobus_register(smi
->mii_bus
);
1774 mdiobus_free(smi
->mii_bus
);
1779 static void rtl8366_smi_mii_cleanup(struct rtl8366_smi
*smi
)
1781 mdiobus_unregister(smi
->mii_bus
);
1782 mdiobus_free(smi
->mii_bus
);
1785 static int rtl8366_smi_mii_bus_match(struct mii_bus
*bus
)
1787 return (bus
->read
== rtl8366_smi_mii_read
&&
1788 bus
->write
== rtl8366_smi_mii_write
);
1791 static int rtl8366_smi_setup(struct rtl8366_smi
*smi
)
1797 ret
= rtl8366_smi_read_reg(smi
, RTL8366S_CHIP_ID_REG
, &chip_id
);
1799 dev_err(&smi
->pdev
->dev
, "unable to read chip id\n");
1804 case RTL8366S_CHIP_ID_8366
:
1807 dev_err(&smi
->pdev
->dev
, "unknown chip id (%04x)\n", chip_id
);
1811 ret
= rtl8366_smi_read_reg(smi
, RTL8366S_CHIP_VERSION_CTRL_REG
,
1814 dev_err(&smi
->pdev
->dev
, "unable to read chip version\n");
1818 dev_info(&smi
->pdev
->dev
, "RTL%04x ver. %u chip found\n",
1819 chip_id
, chip_ver
& RTL8366S_CHIP_VERSION_MASK
);
1821 rtl8366_debugfs_init(smi
);
1826 static int __init
rtl8366_smi_probe(struct platform_device
*pdev
)
1828 static int rtl8366_smi_version_printed
;
1829 struct rtl8366_smi_platform_data
*pdata
;
1830 struct rtl8366_smi
*smi
;
1833 if (!rtl8366_smi_version_printed
++)
1834 printk(KERN_NOTICE RTL8366_SMI_DRIVER_DESC
1835 " version " RTL8366_SMI_DRIVER_VER
"\n");
1837 pdata
= pdev
->dev
.platform_data
;
1839 dev_err(&pdev
->dev
, "no platform data specified\n");
1844 smi
= kzalloc(sizeof(struct rtl8366_smi
), GFP_KERNEL
);
1846 dev_err(&pdev
->dev
, "no memory for private data\n");
1851 err
= gpio_request(pdata
->gpio_sda
, dev_name(&pdev
->dev
));
1853 dev_err(&pdev
->dev
, "gpio_request failed for %u, err=%d\n",
1854 pdata
->gpio_sda
, err
);
1858 err
= gpio_request(pdata
->gpio_sck
, dev_name(&pdev
->dev
));
1860 dev_err(&pdev
->dev
, "gpio_request failed for %u, err=%d\n",
1861 pdata
->gpio_sck
, err
);
1867 spin_lock_init(&smi
->lock
);
1869 platform_set_drvdata(pdev
, smi
);
1871 dev_info(&pdev
->dev
, "using GPIO pins %u (SDA) and %u (SCK)\n",
1872 pdata
->gpio_sda
, pdata
->gpio_sck
);
1874 err
= rtl8366_smi_setup(smi
);
1876 goto err_clear_drvdata
;
1878 err
= rtl8366_smi_mii_init(smi
);
1880 goto err_clear_drvdata
;
1882 err
= rtl8366_smi_switch_init(smi
);
1884 goto err_mii_cleanup
;
1889 rtl8366_smi_mii_cleanup(smi
);
1891 platform_set_drvdata(pdev
, NULL
);
1892 gpio_free(pdata
->gpio_sck
);
1894 gpio_free(pdata
->gpio_sda
);
1901 int rtl8366_phy_config_init(struct phy_device
*phydev
)
1903 if (!rtl8366_smi_mii_bus_match(phydev
->bus
))
1909 int rtl8366_phy_config_aneg(struct phy_device
*phydev
)
1914 static struct phy_driver rtl8366_smi_phy_driver
= {
1915 .phy_id
= 0x001cc960,
1916 .name
= "Realtek RTL8366",
1917 .phy_id_mask
= 0x1ffffff0,
1918 .features
= PHY_GBIT_FEATURES
,
1919 .config_aneg
= rtl8366_phy_config_aneg
,
1920 .config_init
= rtl8366_phy_config_init
,
1921 .read_status
= genphy_read_status
,
1923 .owner
= THIS_MODULE
,
1927 static int __devexit
rtl8366_smi_remove(struct platform_device
*pdev
)
1929 struct rtl8366_smi
*smi
= platform_get_drvdata(pdev
);
1932 struct rtl8366_smi_platform_data
*pdata
;
1934 pdata
= pdev
->dev
.platform_data
;
1936 rtl8366_smi_switch_cleanup(smi
);
1937 rtl8366_debugfs_remove(smi
);
1938 rtl8366_smi_mii_cleanup(smi
);
1939 platform_set_drvdata(pdev
, NULL
);
1940 gpio_free(pdata
->gpio_sck
);
1941 gpio_free(pdata
->gpio_sda
);
1948 static struct platform_driver rtl8366_smi_driver
= {
1950 .name
= RTL8366_SMI_DRIVER_NAME
,
1951 .owner
= THIS_MODULE
,
1953 .probe
= rtl8366_smi_probe
,
1954 .remove
= __devexit_p(rtl8366_smi_remove
),
1957 static int __init
rtl8366_smi_init(void)
1960 ret
= platform_driver_register(&rtl8366_smi_driver
);
1964 ret
= phy_driver_register(&rtl8366_smi_phy_driver
);
1966 goto err_platform_unregister
;
1970 err_platform_unregister
:
1971 platform_driver_unregister(&rtl8366_smi_driver
);
1974 module_init(rtl8366_smi_init
);
1976 static void __exit
rtl8366_smi_exit(void)
1978 phy_driver_unregister(&rtl8366_smi_phy_driver
);
1979 platform_driver_unregister(&rtl8366_smi_driver
);
1981 module_exit(rtl8366_smi_exit
);
1983 MODULE_DESCRIPTION(RTL8366_SMI_DRIVER_DESC
);
1984 MODULE_VERSION(RTL8366_SMI_DRIVER_VER
);
1985 MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
1986 MODULE_AUTHOR("Antti Seppälä <a.seppala@gmail.com>");
1987 MODULE_LICENSE("GPL v2");
1988 MODULE_ALIAS("platform:" RTL8366_SMI_DRIVER_NAME
);