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_VLAN_TABLE_READ_BASE 0x018B
89 #define RTL8366S_VLAN_TABLE_WRITE_BASE 0x0185
91 #define RTL8366S_VLAN_TB_CTRL_REG 0x010F
93 #define RTL8366S_TABLE_ACCESS_CTRL_REG 0x0180
94 #define RTL8366S_TABLE_VLAN_READ_CTRL 0x0E01
95 #define RTL8366S_TABLE_VLAN_WRITE_CTRL 0x0F01
97 #define RTL8366S_VLAN_MEMCONF_BASE 0x0016
100 #define RTL8366S_PORT_LINK_STATUS_BASE 0x0060
101 #define RTL8366S_PORT_STATUS_SPEED_MASK 0x0003
102 #define RTL8366S_PORT_STATUS_DUPLEX_MASK 0x0004
103 #define RTL8366S_PORT_STATUS_LINK_MASK 0x0010
104 #define RTL8366S_PORT_STATUS_TXPAUSE_MASK 0x0020
105 #define RTL8366S_PORT_STATUS_RXPAUSE_MASK 0x0040
106 #define RTL8366S_PORT_STATUS_AN_MASK 0x0080
109 #define RTL8366_PORT_NUM_CPU 5
110 #define RTL8366_NUM_PORTS 6
111 #define RTL8366_NUM_VLANS 16
112 #define RTL8366_NUM_LEDGROUPS 4
113 #define RTL8366_NUM_VIDS 4096
114 #define RTL8366S_PRIORITYMAX 7
115 #define RTL8366S_FIDMAX 7
118 #define RTL8366_PORT_1 (1 << 0) /* In userspace port 0 */
119 #define RTL8366_PORT_2 (1 << 1) /* In userspace port 1 */
120 #define RTL8366_PORT_3 (1 << 2) /* In userspace port 2 */
121 #define RTL8366_PORT_4 (1 << 3) /* In userspace port 3 */
123 #define RTL8366_PORT_UNKNOWN (1 << 4) /* No known connection */
124 #define RTL8366_PORT_CPU (1 << 5) /* CPU port */
126 #define RTL8366_PORT_ALL (RTL8366_PORT_1 | \
130 RTL8366_PORT_UNKNOWN | \
133 #define RTL8366_PORT_ALL_BUT_CPU (RTL8366_PORT_1 | \
137 RTL8366_PORT_UNKNOWN)
139 #define RTL8366_PORT_ALL_EXTERNAL (RTL8366_PORT_1 | \
144 #define RTL8366_PORT_ALL_INTERNAL (RTL8366_PORT_UNKNOWN | \
147 struct rtl8366s_vlanconfig
{
158 struct rtl8366s_vlan4kentry
{
168 static const char *MIBCOUNTERS
[] = {
171 "EtherStatsUnderSizePkts ",
173 "EtherStatsPkts64Octets ",
174 "EtherStatsPkts65to127Octets ",
175 "EtherStatsPkts128to255Octets ",
176 "EtherStatsPkts256to511Octets ",
177 "EtherStatsPkts512to1023Octets ",
178 "EtherStatsPkts1024to1518Octets ",
179 "EtherOversizeStats ",
180 "EtherStatsJabbers ",
182 "EtherStatsMulticastPkts ",
183 "EtherStatsBroadcastPkts ",
184 "EtherStatsDropEvents ",
185 "Dot3StatsFCSErrors ",
186 "Dot3StatsSymbolErrors ",
187 "Dot3InPauseFrames ",
188 "Dot3ControlInUnknownOpcodes ",
190 "Dot3StatsSingleCollisionFrames ",
191 "Dot3StatMultipleCollisionFrames ",
192 "Dot3sDeferredTransmissions ",
193 "Dot3StatsLateCollisions ",
194 "EtherStatsCollisions ",
195 "Dot3StatsExcessiveCollisions ",
196 "Dot3OutPauseFrames ",
197 "Dot1dBasePortDelayExceededDiscards",
198 "Dot1dTpPortInDiscards ",
200 "IfOutMulticastPkts ",
201 "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
];
213 #ifdef CONFIG_RTL8366_SMI_DEBUG_FS
214 struct dentry
*debugfs_root
;
218 #ifdef CONFIG_RTL8366_SMI_DEBUG_FS
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
570 data
= 0; /* writing data will be discard by ASIC */
571 err
= rtl8366_smi_write_reg(smi
, addr
, data
);
575 /* read MIB control register */
576 err
= rtl8366_smi_read_reg(smi
, RTL8366S_MIB_CTRL_REG
, &data
);
580 if (data
& RTL8366S_MIB_CTRL_BUSY_MASK
)
583 if (data
& RTL8366S_MIB_CTRL_RESET_MASK
)
587 addr
= addr
+ mibLength
[counter
] - 1;
588 i
= mibLength
[counter
];
591 err
= rtl8366_smi_read_reg(smi
, addr
, &data
);
595 mibvalue
= (mibvalue
<< 16) | (data
& 0xFFFF);
605 static int rtl8366s_get_vlan_4k_entry(struct rtl8366_smi
*smi
, u32 vid
,
606 struct rtl8366s_vlan4kentry
*vlan4k
)
612 memset(vlan4k
, '\0', sizeof(struct rtl8366s_vlan4kentry
));
615 if (vid
>= RTL8366_NUM_VIDS
)
618 tableaddr
= (u16
*)vlan4k
;
622 err
= rtl8366_smi_write_reg(smi
, RTL8366S_VLAN_TABLE_WRITE_BASE
, data
);
626 /* write table access control word */
627 err
= rtl8366_smi_write_reg(smi
, RTL8366S_TABLE_ACCESS_CTRL_REG
,
628 RTL8366S_TABLE_VLAN_READ_CTRL
);
632 err
= rtl8366_smi_read_reg(smi
, RTL8366S_VLAN_TABLE_READ_BASE
, &data
);
639 err
= rtl8366_smi_read_reg(smi
, RTL8366S_VLAN_TABLE_READ_BASE
+ 1,
650 static int rtl8366s_set_vlan_4k_entry(struct rtl8366_smi
*smi
,
651 const struct rtl8366s_vlan4kentry
*vlan4k
)
657 if (vlan4k
->vid
>= RTL8366_NUM_VIDS
||
658 vlan4k
->member
> RTL8366_PORT_ALL
||
659 vlan4k
->untag
> RTL8366_PORT_ALL
||
660 vlan4k
->fid
> RTL8366S_FIDMAX
)
663 tableaddr
= (u16
*)vlan4k
;
667 err
= rtl8366_smi_write_reg(smi
, RTL8366S_VLAN_TABLE_WRITE_BASE
, data
);
675 err
= rtl8366_smi_write_reg(smi
, RTL8366S_VLAN_TABLE_WRITE_BASE
+ 1,
680 /* write table access control word */
681 err
= rtl8366_smi_write_reg(smi
, RTL8366S_TABLE_ACCESS_CTRL_REG
,
682 RTL8366S_TABLE_VLAN_WRITE_CTRL
);
687 static int rtl8366s_get_vlan_member_config(struct rtl8366_smi
*smi
, u32 index
,
688 struct rtl8366s_vlanconfig
*vlanmc
)
695 memset(vlanmc
, '\0', sizeof(struct rtl8366s_vlanconfig
));
697 if (index
>= RTL8366_NUM_VLANS
)
700 tableaddr
= (u16
*)vlanmc
;
702 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);
711 err
= rtl8366_smi_read_reg(smi
, addr
, &data
);
720 static int rtl8366s_set_vlan_member_config(struct rtl8366_smi
*smi
, u32 index
,
721 const struct rtl8366s_vlanconfig
729 if (index
>= RTL8366_NUM_VLANS
||
730 vlanmc
->vid
>= RTL8366_NUM_VIDS
||
731 vlanmc
->priority
> RTL8366S_PRIORITYMAX
||
732 vlanmc
->member
> RTL8366_PORT_ALL
||
733 vlanmc
->untag
> RTL8366_PORT_ALL
||
734 vlanmc
->fid
> RTL8366S_FIDMAX
)
737 addr
= RTL8366S_VLAN_MEMCONF_BASE
+ (index
<< 1);
739 tableaddr
= (u16
*)vlanmc
;
742 err
= rtl8366_smi_write_reg(smi
, addr
, data
);
746 addr
= RTL8366S_VLAN_MEMCONF_BASE
+ 1 + (index
<< 1);
751 err
= rtl8366_smi_write_reg(smi
, addr
, data
);
758 static int rtl8366_get_port_vlan_index(struct rtl8366_smi
*smi
, int port
,
765 /* bits mapping to port vlan control register of port n */
766 const u16 bits
[RTL8366_NUM_PORTS
] = { 0x000F, 0x00F0, 0x0F00,
767 0xF000, 0x000F, 0x00F0 };
768 /* bits offset to port vlan control register of port n */
769 const u16 bitoffset
[RTL8366_NUM_PORTS
] = { 0, 4, 8, 12, 0, 4 };
770 /* address offset to port vlan control register of port n */
771 const u16 addroffset
[RTL8366_NUM_PORTS
] = { 0, 0, 0, 0, 1, 1 };
773 if (port
>= RTL8366_NUM_PORTS
)
776 addr
= RTL8366S_PORT_VLAN_CTRL_BASE
+ addroffset
[port
];
777 err
= rtl8366_smi_read_reg(smi
, addr
, &data
);
781 *val
= (data
& bits
[port
]) >> bitoffset
[port
];
787 static int rtl8366_get_vlan_port_pvid(struct rtl8366_smi
*smi
, int port
,
790 struct rtl8366s_vlanconfig vlanmc
;
794 err
= rtl8366_get_port_vlan_index(smi
, port
, &index
);
798 err
= rtl8366s_get_vlan_member_config(smi
, index
, &vlanmc
);
806 static int rtl8366_set_port_vlan_index(struct rtl8366_smi
*smi
, int port
,
815 /* bits mapping to port vlan control register of port n */
816 const u16 bitmasks
[6] = { 0x000F, 0x00F0, 0x0F00,
817 0xF000, 0x000F, 0x00F0 };
818 /* bits offset to port vlan control register of port n */
819 const u16 bitOff
[6] = { 0, 4, 8, 12, 0, 4 };
820 /* address offset to port vlan control register of port n */
821 const u16 addrOff
[6] = { 0, 0, 0, 0, 1, 1 };
823 if (port
>= RTL8366_NUM_PORTS
|| index
>= RTL8366_NUM_VLANS
)
826 addr
= RTL8366S_PORT_VLAN_CTRL_BASE
+ addrOff
[port
];
828 bits
= bitmasks
[port
];
830 data
= (index
<< bitOff
[port
]) & bits
;
832 err
= rtl8366_smi_read_reg(smi
, addr
, &vlan_data
);
836 vlan_data
&= ~(vlan_data
& bits
);
839 err
= rtl8366_smi_write_reg(smi
, addr
, vlan_data
);
846 static int rtl8366_set_vlan_port_pvid(struct rtl8366_smi
*smi
, int port
,
850 struct rtl8366s_vlanconfig vlanmc
;
851 struct rtl8366s_vlan4kentry vlan4k
;
853 if (port
>= RTL8366_NUM_PORTS
|| val
>= RTL8366_NUM_VIDS
)
856 /* Updating the 4K entry; lookup it and change the port member set */
857 rtl8366s_get_vlan_4k_entry(smi
, val
, &vlan4k
);
858 vlan4k
.member
|= ((1 << port
) | RTL8366_PORT_CPU
);
859 vlan4k
.untag
= RTL8366_PORT_ALL_BUT_CPU
;
860 rtl8366s_set_vlan_4k_entry(smi
, &vlan4k
);
863 * For the 16 entries more work needs to be done. First see if such
864 * VID is already there and change it
866 for (i
= 0; i
< RTL8366_NUM_VLANS
; ++i
) {
867 rtl8366s_get_vlan_member_config(smi
, i
, &vlanmc
);
869 /* Try to find an existing vid and update port member set */
870 if (val
== vlanmc
.vid
) {
871 vlanmc
.member
|= ((1 << port
) | RTL8366_PORT_CPU
);
872 rtl8366s_set_vlan_member_config(smi
, i
, &vlanmc
);
874 /* Now update PVID register settings */
875 rtl8366_set_port_vlan_index(smi
, port
, i
);
882 * PVID could not be found from vlan table. Replace unused (one that
883 * has no member ports) with new one
885 for (i
= 0; i
< RTL8366_NUM_VLANS
; ++i
) {
886 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
892 if (!vlanmc
.member
|| vlanmc
.member
== RTL8366_PORT_CPU
) {
895 vlanmc
.untag
= RTL8366_PORT_ALL_BUT_CPU
;
896 vlanmc
.member
= ((1 << port
) | RTL8366_PORT_CPU
);
899 rtl8366s_set_vlan_member_config(smi
, i
, &vlanmc
);
901 /* Now update PVID register settings */
902 rtl8366_set_port_vlan_index(smi
, port
, i
);
908 dev_err(&smi
->pdev
->dev
,
909 "All 16 vlan member configurations are in use\n");
915 static int rtl8366_vlan_set_vlan(struct rtl8366_smi
*smi
, int enable
)
919 rtl8366_smi_read_reg(smi
, RTL8366_CHIP_GLOBAL_CTRL_REG
, &data
);
921 data
&= ~(data
& RTL8366_CHIP_CTRL_VLAN
);
923 data
|= RTL8366_CHIP_CTRL_VLAN
;
925 return rtl8366_smi_write_reg(smi
, RTL8366_CHIP_GLOBAL_CTRL_REG
, data
);
928 static int rtl8366_vlan_set_4ktable(struct rtl8366_smi
*smi
, int enable
)
932 rtl8366_smi_read_reg(smi
, RTL8366S_VLAN_TB_CTRL_REG
, &data
);
938 return rtl8366_smi_write_reg(smi
, RTL8366S_VLAN_TB_CTRL_REG
, data
);
941 static int rtl8366s_reset_vlan(struct rtl8366_smi
*smi
)
943 struct rtl8366s_vlan4kentry vlan4k
;
944 struct rtl8366s_vlanconfig vlanmc
;
948 /* clear 16 VLAN member configuration */
954 for (i
= 0; i
< RTL8366_NUM_VLANS
; i
++) {
955 err
= rtl8366s_set_vlan_member_config(smi
, i
, &vlanmc
);
960 /* Set a default VLAN with vid 1 to 4K table for all ports */
962 vlan4k
.member
= RTL8366_PORT_ALL
;
963 vlan4k
.untag
= RTL8366_PORT_ALL
;
965 err
= rtl8366s_set_vlan_4k_entry(smi
, &vlan4k
);
969 /* Set all ports PVID to default VLAN */
970 for (i
= 0; i
< RTL8366_NUM_PORTS
; i
++) {
971 err
= rtl8366_set_vlan_port_pvid(smi
, i
, 0);
979 #ifdef CONFIG_RTL8366_SMI_DEBUG_FS
980 static int rtl8366_debugfs_open(struct inode
*inode
, struct file
*file
)
982 file
->private_data
= inode
->i_private
;
986 static ssize_t
rtl8366_read_debugfs_mibs(struct file
*file
,
987 char __user
*user_buf
,
988 size_t count
, loff_t
*ppos
)
990 struct rtl8366_smi
*smi
= (struct rtl8366_smi
*)file
->private_data
;
992 char *buf
= smi
->buf
;
994 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "MIB Counters:\n");
995 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "Counter"
997 "Port 0 \t\t Port 1 \t\t Port 2 \t\t Port 3 \t\t "
1000 for (i
= 0; i
< 33; ++i
) {
1001 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "%d:%s ",
1003 for (j
= 0; j
< RTL8366_NUM_PORTS
; ++j
) {
1004 unsigned long long counter
= 0;
1006 if (!rtl8366_get_mib_counter(smi
, i
, j
, &counter
))
1007 len
+= snprintf(buf
+ len
,
1008 sizeof(smi
->buf
) - len
,
1011 len
+= snprintf(buf
+ len
,
1012 sizeof(smi
->buf
) - len
,
1015 if (j
!= RTL8366_NUM_PORTS
- 1) {
1016 if (counter
< 100000)
1017 len
+= snprintf(buf
+ len
,
1018 sizeof(smi
->buf
) - len
,
1021 len
+= snprintf(buf
+ len
,
1022 sizeof(smi
->buf
) - len
,
1026 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\n");
1029 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\n");
1031 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1034 static ssize_t
rtl8366_read_debugfs_vlan(struct file
*file
,
1035 char __user
*user_buf
,
1036 size_t count
, loff_t
*ppos
)
1038 struct rtl8366_smi
*smi
= (struct rtl8366_smi
*)file
->private_data
;
1040 char *buf
= smi
->buf
;
1042 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1043 "VLAN Member Config:\n");
1044 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1045 "\t id \t vid \t prio \t member \t untag \t fid "
1048 for (i
= 0; i
< RTL8366_NUM_VLANS
; ++i
) {
1049 struct rtl8366s_vlanconfig vlanmc
;
1051 rtl8366s_get_vlan_member_config(smi
, i
, &vlanmc
);
1053 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1054 "\t[%d] \t %d \t %d \t 0x%04x \t 0x%04x \t %d "
1055 "\t", i
, vlanmc
.vid
, vlanmc
.priority
,
1056 vlanmc
.member
, vlanmc
.untag
, vlanmc
.fid
);
1058 for (j
= 0; j
< RTL8366_NUM_PORTS
; ++j
) {
1060 if (!rtl8366_get_port_vlan_index(smi
, j
, &index
)) {
1062 len
+= snprintf(buf
+ len
,
1063 sizeof(smi
->buf
) - len
,
1067 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\n");
1070 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1073 static ssize_t
rtl8366_read_debugfs_reg(struct file
*file
,
1074 char __user
*user_buf
,
1075 size_t count
, loff_t
*ppos
)
1077 struct rtl8366_smi
*smi
= (struct rtl8366_smi
*)file
->private_data
;
1078 u32 t
, reg
= g_dbg_reg
;
1080 char *buf
= smi
->buf
;
1082 memset(buf
, '\0', sizeof(smi
->buf
));
1084 err
= rtl8366_smi_read_reg(smi
, reg
, &t
);
1086 len
+= snprintf(buf
, sizeof(smi
->buf
),
1087 "Read failed (reg: 0x%04x)\n", reg
);
1088 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1091 len
+= snprintf(buf
, sizeof(smi
->buf
), "reg = 0x%04x, val = 0x%04x\n",
1094 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1097 static ssize_t
rtl8366_write_debugfs_reg(struct file
*file
,
1098 const char __user
*user_buf
,
1099 size_t count
, loff_t
*ppos
)
1101 struct rtl8366_smi
*smi
= (struct rtl8366_smi
*)file
->private_data
;
1103 u32 reg
= g_dbg_reg
;
1106 char *buf
= smi
->buf
;
1108 len
= min(count
, sizeof(smi
->buf
) - 1);
1109 if (copy_from_user(buf
, user_buf
, len
)) {
1110 dev_err(&smi
->pdev
->dev
, "copy from user failed\n");
1115 if (len
> 0 && buf
[len
- 1] == '\n')
1116 buf
[len
- 1] = '\0';
1119 if (strict_strtoul(buf
, 16, &data
)) {
1120 dev_err(&smi
->pdev
->dev
, "Invalid reg value %s\n", buf
);
1122 err
= rtl8366_smi_write_reg(smi
, reg
, data
);
1124 dev_err(&smi
->pdev
->dev
,
1125 "writing reg 0x%04x val 0x%04lx failed\n",
1133 static const struct file_operations fops_rtl8366_regs
= {
1134 .read
= rtl8366_read_debugfs_reg
,
1135 .write
= rtl8366_write_debugfs_reg
,
1136 .open
= rtl8366_debugfs_open
,
1137 .owner
= THIS_MODULE
1140 static const struct file_operations fops_rtl8366_vlan
= {
1141 .read
= rtl8366_read_debugfs_vlan
,
1142 .open
= rtl8366_debugfs_open
,
1143 .owner
= THIS_MODULE
1146 static const struct file_operations fops_rtl8366_mibs
= {
1147 .read
= rtl8366_read_debugfs_mibs
,
1148 .open
= rtl8366_debugfs_open
,
1149 .owner
= THIS_MODULE
1152 static void rtl8366_debugfs_init(struct rtl8366_smi
*smi
)
1154 struct dentry
*node
;
1155 struct dentry
*root
;
1157 if (!smi
->debugfs_root
)
1158 smi
->debugfs_root
= debugfs_create_dir("rtl8366s", NULL
);
1160 if (!smi
->debugfs_root
) {
1161 dev_err(&smi
->pdev
->dev
, "Unable to create debugfs dir\n");
1164 root
= smi
->debugfs_root
;
1166 node
= debugfs_create_x16("reg", S_IRUGO
| S_IWUSR
, root
, &g_dbg_reg
);
1168 dev_err(&smi
->pdev
->dev
, "Creating debugfs file reg failed\n");
1172 node
= debugfs_create_file("val", S_IRUGO
| S_IWUSR
, root
, smi
,
1173 &fops_rtl8366_regs
);
1175 dev_err(&smi
->pdev
->dev
, "Creating debugfs file val failed\n");
1179 node
= debugfs_create_file("vlan", S_IRUSR
, root
, smi
,
1180 &fops_rtl8366_vlan
);
1182 dev_err(&smi
->pdev
->dev
,
1183 "Creating debugfs file vlan failed\n");
1187 node
= debugfs_create_file("mibs", S_IRUSR
, root
, smi
,
1188 &fops_rtl8366_mibs
);
1190 dev_err(&smi
->pdev
->dev
,
1191 "Creating debugfs file mibs failed\n");
1196 static void rtl8366_debugfs_remove(struct rtl8366_smi
*smi
)
1198 if (smi
->debugfs_root
) {
1199 debugfs_remove_recursive(smi
->debugfs_root
);
1200 smi
->debugfs_root
= NULL
;
1205 static inline void rtl8366_debugfs_init(struct rtl8366_smi
*smi
) {}
1206 static inline void rtl8366_debugfs_remove(struct rtl8366_smi
*smi
) {}
1207 #endif /* CONFIG_RTL8366_SMI_DEBUG_FS */
1209 static int rtl8366_global_reset_mibs(struct switch_dev
*dev
,
1210 const struct switch_attr
*attr
,
1211 struct switch_val
*val
)
1213 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1216 if (val
->value
.i
== 1) {
1217 rtl8366_smi_read_reg(smi
, RTL8366S_MIB_CTRL_REG
, &data
);
1219 rtl8366_smi_write_reg(smi
, RTL8366S_MIB_CTRL_REG
, data
);
1225 static int rtl8366_get_vlan(struct switch_dev
*dev
,
1226 const struct switch_attr
*attr
,
1227 struct switch_val
*val
)
1229 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1232 if (attr
->ofs
== 1) {
1233 rtl8366_smi_read_reg(smi
, RTL8366_CHIP_GLOBAL_CTRL_REG
, &data
);
1235 if (data
& RTL8366_CHIP_CTRL_VLAN
)
1239 } else if (attr
->ofs
== 2) {
1240 rtl8366_smi_read_reg(smi
, RTL8366S_VLAN_TB_CTRL_REG
, &data
);
1251 static int rtl8366_global_get_blinkrate(struct switch_dev
*dev
,
1252 const struct switch_attr
*attr
,
1253 struct switch_val
*val
)
1255 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1258 rtl8366_smi_read_reg(smi
, RTL8366_LED_BLINKRATE_REG
, &data
);
1260 val
->value
.i
= (data
& (RTL8366_LED_BLINKRATE_MASK
));
1265 static int rtl8366_global_set_blinkrate(struct switch_dev
*dev
,
1266 const struct switch_attr
*attr
,
1267 struct switch_val
*val
)
1270 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1272 if (val
->value
.i
>= 6)
1275 rtl8366_smi_read_reg(smi
, RTL8366_LED_BLINKRATE_REG
, &data
);
1277 data
&= ~(data
& RTL8366_LED_BLINKRATE_MASK
);
1278 data
|= val
->value
.i
;
1280 rtl8366_smi_write_reg(smi
, RTL8366_LED_BLINKRATE_REG
, data
);
1285 static int rtl8366_set_vlan(struct switch_dev
*dev
,
1286 const struct switch_attr
*attr
,
1287 struct switch_val
*val
)
1289 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1292 return rtl8366_vlan_set_vlan(smi
, val
->value
.i
);
1294 return rtl8366_vlan_set_4ktable(smi
, val
->value
.i
);
1297 static int rtl8366_attr_get_port_link(struct switch_dev
*dev
,
1298 const struct switch_attr
*attr
,
1299 struct switch_val
*val
)
1301 u32 len
= 0, data
= 0;
1302 int speed
, duplex
, link
, txpause
, rxpause
, nway
;
1303 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1304 char *buf
= smi
->buf
;
1306 if (val
->port_vlan
>= RTL8366_NUM_PORTS
)
1309 memset(buf
, '\0', sizeof(smi
->buf
));
1310 rtl8366_smi_read_reg(smi
, RTL8366S_PORT_LINK_STATUS_BASE
+
1311 (val
->port_vlan
>> 1),
1314 if (val
->port_vlan
& 0x1)
1317 speed
= (data
& RTL8366S_PORT_STATUS_SPEED_MASK
);
1318 duplex
= (data
& RTL8366S_PORT_STATUS_DUPLEX_MASK
) >> 2;
1319 link
= (data
& RTL8366S_PORT_STATUS_LINK_MASK
) >> 4;
1320 txpause
= (data
& RTL8366S_PORT_STATUS_TXPAUSE_MASK
) >> 5;
1321 rxpause
= (data
& RTL8366S_PORT_STATUS_RXPAUSE_MASK
) >> 6;
1322 nway
= (data
& RTL8366S_PORT_STATUS_AN_MASK
) >> 7;
1324 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "Port %d: ",
1328 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1329 "Link UP, Speed: ");
1331 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1332 "Link DOWN, Speed: ");
1335 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1337 else if (speed
== 1)
1338 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1340 else if (speed
== 2)
1341 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1345 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1348 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1352 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1355 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1358 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1367 static int rtl8366_attr_get_vlan_info(struct switch_dev
*dev
,
1368 const struct switch_attr
*attr
,
1369 struct switch_val
*val
)
1373 struct rtl8366s_vlanconfig vlanmc
;
1374 struct rtl8366s_vlan4kentry vlan4k
;
1375 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1376 char *buf
= smi
->buf
;
1378 if (val
->port_vlan
>= RTL8366_NUM_VLANS
)
1381 memset(buf
, '\0', sizeof(smi
->buf
));
1383 rtl8366s_get_vlan_member_config(smi
, val
->port_vlan
, &vlanmc
);
1384 rtl8366s_get_vlan_4k_entry(smi
, vlanmc
.vid
, &vlan4k
);
1386 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "VLAN %d: Ports: ",
1389 for (i
= 0; i
< RTL8366_NUM_PORTS
; ++i
) {
1391 if (!rtl8366_get_port_vlan_index(smi
, i
, &index
) &&
1392 index
== val
->port_vlan
)
1393 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1396 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\n");
1398 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1399 "\t\t vid \t prio \t member \t untag \t fid\n");
1400 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\tMC:\t");
1401 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1402 "%d \t %d \t 0x%04x \t 0x%04x \t %d\n",
1403 vlanmc
.vid
, vlanmc
.priority
, vlanmc
.member
,
1404 vlanmc
.untag
, vlanmc
.fid
);
1405 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\t4K:\t");
1406 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1407 "%d \t \t 0x%04x \t 0x%04x \t %d",
1408 vlan4k
.vid
, vlan4k
.member
, vlan4k
.untag
, vlan4k
.fid
);
1416 static int rtl8366_set_port_led(struct switch_dev
*dev
,
1417 const struct switch_attr
*attr
,
1418 struct switch_val
*val
)
1420 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1423 if (val
->port_vlan
>= RTL8366_NUM_PORTS
||
1424 (1 << val
->port_vlan
) == RTL8366_PORT_UNKNOWN
)
1427 if (val
->port_vlan
== RTL8366_PORT_NUM_CPU
) {
1428 rtl8366_smi_read_reg(smi
, RTL8366_LED_BLINKRATE_REG
, &data
);
1429 data
= (data
& (~(0xF << 4))) | (val
->value
.i
<< 4);
1430 rtl8366_smi_write_reg(smi
, RTL8366_LED_BLINKRATE_REG
, data
);
1432 rtl8366_smi_read_reg(smi
, RTL8366_LED_CTRL_REG
, &data
);
1433 data
= (data
& (~(0xF << (val
->port_vlan
* 4)))) |
1434 (val
->value
.i
<< (val
->port_vlan
* 4));
1435 rtl8366_smi_write_reg(smi
, RTL8366_LED_CTRL_REG
, data
);
1441 static int rtl8366_get_port_led(struct switch_dev
*dev
,
1442 const struct switch_attr
*attr
,
1443 struct switch_val
*val
)
1445 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1448 if (val
->port_vlan
>= RTL8366_NUM_LEDGROUPS
)
1451 rtl8366_smi_read_reg(smi
, RTL8366_LED_CTRL_REG
, &data
);
1452 val
->value
.i
= (data
>> (val
->port_vlan
* 4)) & 0x000F;
1457 static int rtl8366_reset_port_mibs(struct switch_dev
*dev
,
1458 const struct switch_attr
*attr
,
1459 struct switch_val
*val
)
1461 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1464 if (val
->port_vlan
>= RTL8366_NUM_PORTS
)
1467 rtl8366_smi_read_reg(smi
, RTL8366S_MIB_CTRL_REG
, &data
);
1468 data
|= (1 << (val
->port_vlan
+ 3));
1469 rtl8366_smi_write_reg(smi
, RTL8366S_MIB_CTRL_REG
, data
);
1474 static int rtl8366_get_port_mib(struct switch_dev
*dev
,
1475 const struct switch_attr
*attr
,
1476 struct switch_val
*val
)
1478 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1480 unsigned long long counter
= 0;
1481 char *buf
= smi
->buf
;
1483 if (val
->port_vlan
>= RTL8366_NUM_PORTS
)
1486 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1487 "Port %d MIB counters\n",
1490 for (i
= 0; i
< RTL8366S_MIB_COUNT
; ++i
) {
1491 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1492 "%d:%s\t", i
, MIBCOUNTERS
[i
]);
1493 if (!rtl8366_get_mib_counter(smi
, i
, val
->port_vlan
, &counter
))
1494 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1495 "[%llu]\n", counter
);
1497 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1506 static int rtl8366_get_ports(struct switch_dev
*dev
,
1507 struct switch_val
*val
)
1509 struct rtl8366s_vlanconfig vlanmc
;
1510 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1511 struct switch_port
*port
;
1514 if (val
->port_vlan
>= RTL8366_NUM_VLANS
)
1517 rtl8366s_get_vlan_member_config(smi
, val
->port_vlan
, &vlanmc
);
1519 port
= &val
->value
.ports
[0];
1521 for (i
= 0; i
< RTL8366_NUM_PORTS
; i
++) {
1522 if (!(vlanmc
.member
& BIT(i
)))
1526 port
->flags
= (vlanmc
.untag
& BIT(i
)) ?
1527 0 : BIT(SWITCH_PORT_FLAG_TAGGED
);
1534 static int rtl8366_set_ports(struct switch_dev
*dev
,
1535 struct switch_val
*val
)
1537 struct rtl8366s_vlanconfig vlanmc
;
1538 struct rtl8366s_vlan4kentry vlan4k
;
1539 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1540 struct switch_port
*port
;
1543 if (val
->port_vlan
>= RTL8366_NUM_VLANS
)
1546 rtl8366s_get_vlan_member_config(smi
, val
->port_vlan
, &vlanmc
);
1547 rtl8366s_get_vlan_4k_entry(smi
, vlanmc
.vid
, &vlan4k
);
1552 port
= &val
->value
.ports
[0];
1553 for (i
= 0; i
< val
->len
; i
++, port
++) {
1554 vlanmc
.member
|= BIT(port
->id
);
1556 if (!(port
->flags
& BIT(SWITCH_PORT_FLAG_TAGGED
)))
1557 vlanmc
.untag
|= BIT(port
->id
);
1560 vlan4k
.member
= vlanmc
.member
;
1561 vlan4k
.untag
= vlanmc
.untag
;
1563 rtl8366s_set_vlan_member_config(smi
, val
->port_vlan
, &vlanmc
);
1564 rtl8366s_set_vlan_4k_entry(smi
, &vlan4k
);
1568 static int rtl8366_get_port_pvid(struct switch_dev
*dev
, int port
, int *val
)
1570 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1571 return rtl8366_get_vlan_port_pvid(smi
, port
, val
);
1574 static int rtl8366_set_port_pvid(struct switch_dev
*dev
, int port
, int val
)
1576 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1577 return rtl8366_set_vlan_port_pvid(smi
, port
, val
);
1580 static int rtl8366_reset_switch(struct switch_dev
*dev
)
1582 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1586 rtl8366_smi_write_reg(smi
, RTL8366_RESET_CTRL_REG
,
1587 RTL8366_CHIP_CTRL_RESET_HW
);
1590 if (rtl8366_smi_read_reg(smi
, RTL8366_RESET_CTRL_REG
, &data
))
1593 if (!(data
& RTL8366_CHIP_CTRL_RESET_HW
))
1595 } while (--timeout
);
1598 printk("Timeout waiting for the switch to reset\n");
1602 return rtl8366s_reset_vlan(smi
);
1605 static struct switch_attr rtl8366_globals
[] = {
1607 .type
= SWITCH_TYPE_INT
,
1608 .name
= "enable_vlan",
1609 .description
= "Enable VLAN mode",
1610 .set
= rtl8366_set_vlan
,
1611 .get
= rtl8366_get_vlan
,
1615 .type
= SWITCH_TYPE_INT
,
1616 .name
= "enable_vlan4k",
1617 .description
= "Enable VLAN 4K mode",
1618 .set
= rtl8366_set_vlan
,
1619 .get
= rtl8366_get_vlan
,
1623 .type
= SWITCH_TYPE_INT
,
1624 .name
= "reset_mibs",
1625 .description
= "Reset all MIB counters",
1626 .set
= rtl8366_global_reset_mibs
,
1630 .type
= SWITCH_TYPE_INT
,
1631 .name
= "blinkrate",
1632 .description
= "Get/Set LED blinking rate (0 = 43ms, 1 = 84ms,"
1633 " 2 = 120ms, 3 = 170ms, 4 = 340ms, 5 = 670ms)",
1634 .set
= rtl8366_global_set_blinkrate
,
1635 .get
= rtl8366_global_get_blinkrate
,
1640 static struct switch_attr rtl8366_port
[] = {
1642 .type
= SWITCH_TYPE_STRING
,
1644 .description
= "Get port link information",
1647 .get
= rtl8366_attr_get_port_link
1649 .type
= SWITCH_TYPE_INT
,
1650 .name
= "reset_mib",
1651 .description
= "Reset single port MIB counters",
1653 .set
= rtl8366_reset_port_mibs
,
1656 .type
= SWITCH_TYPE_STRING
,
1658 .description
= "Get MIB counters for port",
1661 .get
= rtl8366_get_port_mib
1663 .type
= SWITCH_TYPE_INT
,
1665 .description
= "Get/Set port group (0 - 3) led mode (0 - 15)",
1667 .set
= rtl8366_set_port_led
,
1668 .get
= rtl8366_get_port_led
1672 static struct switch_attr rtl8366_vlan
[] = {
1674 .type
= SWITCH_TYPE_STRING
,
1676 .description
= "Get vlan information",
1679 .get
= rtl8366_attr_get_vlan_info
1685 static struct switch_dev rtldev
= {
1687 .cpu_port
= RTL8366_PORT_NUM_CPU
,
1688 .ports
= RTL8366_NUM_PORTS
,
1689 .vlans
= RTL8366_NUM_VLANS
,
1691 .attr
= rtl8366_globals
,
1692 .n_attr
= ARRAY_SIZE(rtl8366_globals
),
1695 .attr
= rtl8366_port
,
1696 .n_attr
= ARRAY_SIZE(rtl8366_port
),
1699 .attr
= rtl8366_vlan
,
1700 .n_attr
= ARRAY_SIZE(rtl8366_vlan
),
1703 .get_vlan_ports
= rtl8366_get_ports
,
1704 .set_vlan_ports
= rtl8366_set_ports
,
1705 .get_port_pvid
= rtl8366_get_port_pvid
,
1706 .set_port_pvid
= rtl8366_set_port_pvid
,
1707 .reset_switch
= rtl8366_reset_switch
,
1710 static int rtl8366_smi_switch_init(struct rtl8366_smi
*smi
)
1712 struct switch_dev
*dev
= &smi
->dev
;
1715 memcpy(dev
, &rtldev
, sizeof(struct switch_dev
));
1717 dev
->devname
= dev_name(&smi
->pdev
->dev
);
1719 err
= register_switch(dev
, NULL
);
1721 dev_err(&smi
->pdev
->dev
, "switch registration failed\n");
1726 static void rtl8366_smi_switch_cleanup(struct rtl8366_smi
*smi
)
1728 unregister_switch(&smi
->dev
);
1731 static int rtl8366_smi_mii_read(struct mii_bus
*bus
, int addr
, int reg
)
1733 struct rtl8366_smi
*smi
= bus
->priv
;
1737 err
= rtl8366_smi_read_phy_reg(smi
, addr
, 0, reg
, &val
);
1744 static int rtl8366_smi_mii_write(struct mii_bus
*bus
, int addr
, int reg
,
1747 struct rtl8366_smi
*smi
= bus
->priv
;
1751 err
= rtl8366_smi_write_phy_reg(smi
, addr
, 0, reg
, val
);
1753 (void) rtl8366_smi_read_phy_reg(smi
, addr
, 0, reg
, &t
);
1758 static int rtl8366_smi_mii_init(struct rtl8366_smi
*smi
)
1763 smi
->mii_bus
= mdiobus_alloc();
1764 if (smi
->mii_bus
== NULL
) {
1769 spin_lock_init(&smi
->lock
);
1770 smi
->mii_bus
->priv
= (void *) smi
;
1771 smi
->mii_bus
->name
= "rtl8366-smi";
1772 smi
->mii_bus
->read
= rtl8366_smi_mii_read
;
1773 smi
->mii_bus
->write
= rtl8366_smi_mii_write
;
1774 snprintf(smi
->mii_bus
->id
, MII_BUS_ID_SIZE
, "%s",
1775 dev_name(&smi
->pdev
->dev
));
1776 smi
->mii_bus
->parent
= &smi
->pdev
->dev
;
1777 smi
->mii_bus
->phy_mask
= ~(0x1f);
1778 smi
->mii_bus
->irq
= smi
->mii_irq
;
1779 for (i
= 0; i
< PHY_MAX_ADDR
; i
++)
1780 smi
->mii_irq
[i
] = PHY_POLL
;
1782 ret
= mdiobus_register(smi
->mii_bus
);
1789 mdiobus_free(smi
->mii_bus
);
1794 static void rtl8366_smi_mii_cleanup(struct rtl8366_smi
*smi
)
1796 mdiobus_unregister(smi
->mii_bus
);
1797 mdiobus_free(smi
->mii_bus
);
1800 static int rtl8366_smi_mii_bus_match(struct mii_bus
*bus
)
1802 return (bus
->read
== rtl8366_smi_mii_read
&&
1803 bus
->write
== rtl8366_smi_mii_write
);
1806 static int rtl8366_smi_setup(struct rtl8366_smi
*smi
)
1812 ret
= rtl8366_smi_read_reg(smi
, RTL8366S_CHIP_ID_REG
, &chip_id
);
1814 dev_err(&smi
->pdev
->dev
, "unable to read chip id\n");
1819 case RTL8366S_CHIP_ID_8366
:
1822 dev_err(&smi
->pdev
->dev
, "unknown chip id (%04x)\n", chip_id
);
1826 ret
= rtl8366_smi_read_reg(smi
, RTL8366S_CHIP_VERSION_CTRL_REG
,
1829 dev_err(&smi
->pdev
->dev
, "unable to read chip version\n");
1833 dev_info(&smi
->pdev
->dev
, "RTL%04x ver. %u chip found\n",
1834 chip_id
, chip_ver
& RTL8366S_CHIP_VERSION_MASK
);
1836 rtl8366_debugfs_init(smi
);
1841 static int __init
rtl8366_smi_probe(struct platform_device
*pdev
)
1843 static int rtl8366_smi_version_printed
;
1844 struct rtl8366_smi_platform_data
*pdata
;
1845 struct rtl8366_smi
*smi
;
1848 if (!rtl8366_smi_version_printed
++)
1849 printk(KERN_NOTICE RTL8366_SMI_DRIVER_DESC
1850 " version " RTL8366_SMI_DRIVER_VER
"\n");
1852 pdata
= pdev
->dev
.platform_data
;
1854 dev_err(&pdev
->dev
, "no platform data specified\n");
1859 smi
= kzalloc(sizeof(struct rtl8366_smi
), GFP_KERNEL
);
1861 dev_err(&pdev
->dev
, "no memory for private data\n");
1866 err
= gpio_request(pdata
->gpio_sda
, dev_name(&pdev
->dev
));
1868 dev_err(&pdev
->dev
, "gpio_request failed for %u, err=%d\n",
1869 pdata
->gpio_sda
, err
);
1873 err
= gpio_request(pdata
->gpio_sck
, dev_name(&pdev
->dev
));
1875 dev_err(&pdev
->dev
, "gpio_request failed for %u, err=%d\n",
1876 pdata
->gpio_sck
, err
);
1882 spin_lock_init(&smi
->lock
);
1884 platform_set_drvdata(pdev
, smi
);
1886 dev_info(&pdev
->dev
, "using GPIO pins %u (SDA) and %u (SCK)\n",
1887 pdata
->gpio_sda
, pdata
->gpio_sck
);
1889 err
= rtl8366_smi_setup(smi
);
1891 goto err_clear_drvdata
;
1893 err
= rtl8366_smi_mii_init(smi
);
1895 goto err_clear_drvdata
;
1897 err
= rtl8366_smi_switch_init(smi
);
1899 goto err_mii_cleanup
;
1904 rtl8366_smi_mii_cleanup(smi
);
1906 platform_set_drvdata(pdev
, NULL
);
1907 gpio_free(pdata
->gpio_sck
);
1909 gpio_free(pdata
->gpio_sda
);
1916 int rtl8366_phy_config_init(struct phy_device
*phydev
)
1918 if (!rtl8366_smi_mii_bus_match(phydev
->bus
))
1924 int rtl8366_phy_config_aneg(struct phy_device
*phydev
)
1929 static struct phy_driver rtl8366_smi_phy_driver
= {
1930 .phy_id
= 0x001cc960,
1931 .name
= "Realtek RTL8366",
1932 .phy_id_mask
= 0x1ffffff0,
1933 .features
= PHY_GBIT_FEATURES
,
1934 .config_aneg
= rtl8366_phy_config_aneg
,
1935 .config_init
= rtl8366_phy_config_init
,
1936 .read_status
= genphy_read_status
,
1938 .owner
= THIS_MODULE
,
1942 static int __devexit
rtl8366_smi_remove(struct platform_device
*pdev
)
1944 struct rtl8366_smi
*smi
= platform_get_drvdata(pdev
);
1947 struct rtl8366_smi_platform_data
*pdata
;
1949 pdata
= pdev
->dev
.platform_data
;
1951 rtl8366_smi_switch_cleanup(smi
);
1952 rtl8366_debugfs_remove(smi
);
1953 rtl8366_smi_mii_cleanup(smi
);
1954 platform_set_drvdata(pdev
, NULL
);
1955 gpio_free(pdata
->gpio_sck
);
1956 gpio_free(pdata
->gpio_sda
);
1963 static struct platform_driver rtl8366_smi_driver
= {
1965 .name
= RTL8366_SMI_DRIVER_NAME
,
1966 .owner
= THIS_MODULE
,
1968 .probe
= rtl8366_smi_probe
,
1969 .remove
= __devexit_p(rtl8366_smi_remove
),
1972 static int __init
rtl8366_smi_init(void)
1975 ret
= platform_driver_register(&rtl8366_smi_driver
);
1979 ret
= phy_driver_register(&rtl8366_smi_phy_driver
);
1981 goto err_platform_unregister
;
1985 err_platform_unregister
:
1986 platform_driver_unregister(&rtl8366_smi_driver
);
1989 module_init(rtl8366_smi_init
);
1991 static void __exit
rtl8366_smi_exit(void)
1993 phy_driver_unregister(&rtl8366_smi_phy_driver
);
1994 platform_driver_unregister(&rtl8366_smi_driver
);
1996 module_exit(rtl8366_smi_exit
);
1998 MODULE_DESCRIPTION(RTL8366_SMI_DRIVER_DESC
);
1999 MODULE_VERSION(RTL8366_SMI_DRIVER_VER
);
2000 MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
2001 MODULE_AUTHOR("Antti Seppälä <a.seppala@gmail.com>");
2002 MODULE_LICENSE("GPL v2");
2003 MODULE_ALIAS("platform:" RTL8366_SMI_DRIVER_NAME
);