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
[] = { "IfInOctets ",
170 "EtherStatsUnderSizePkts ",
172 "EtherStatsPkts64Octets ",
173 "EtherStatsPkts65to127Octets ",
174 "EtherStatsPkts128to255Octets ",
175 "EtherStatsPkts256to511Octets ",
176 "EtherStatsPkts512to1023Octets ",
177 "EtherStatsPkts1024to1518Octets ",
178 "EtherOversizeStats ",
179 "EtherStatsJabbers ",
181 "EtherStatsMulticastPkts ",
182 "EtherStatsBroadcastPkts ",
183 "EtherStatsDropEvents ",
184 "Dot3StatsFCSErrors ",
185 "Dot3StatsSymbolErrors ",
186 "Dot3InPauseFrames ",
187 "Dot3ControlInUnknownOpcodes ",
189 "Dot3StatsSingleCollisionFrames ",
190 "Dot3StatMultipleCollisionFrames ",
191 "Dot3sDeferredTransmissions ",
192 "Dot3StatsLateCollisions ",
193 "EtherStatsCollisions ",
194 "Dot3StatsExcessiveCollisions ",
195 "Dot3OutPauseFrames ",
196 "Dot1dBasePortDelayExceededDiscards",
197 "Dot1dTpPortInDiscards ",
199 "IfOutMulticastPkts ",
200 "IfOutBroadcastPkts ",
204 struct platform_device
*pdev
;
205 struct rtl8366_smi_platform_data
*pdata
;
207 struct mii_bus
*mii_bus
;
208 struct switch_dev dev
;
209 int mii_irq
[PHY_MAX_ADDR
];
211 #ifdef CONFIG_RTL8366_SMI_DEBUG_FS
212 struct dentry
*debugfs_root
;
216 #ifdef CONFIG_RTL8366_SMI_DEBUG_FS
220 static inline struct rtl8366_smi
*sw_to_rtl8366(struct switch_dev
*sw
)
222 return container_of(sw
, struct rtl8366_smi
, dev
);
225 static inline void rtl8366_smi_clk_delay(struct rtl8366_smi
*smi
)
227 ndelay(RTL8366_SMI_CLK_DELAY
);
230 static void rtl8366_smi_start(struct rtl8366_smi
*smi
)
232 unsigned int sda
= smi
->pdata
->gpio_sda
;
233 unsigned int sck
= smi
->pdata
->gpio_sck
;
236 * Set GPIO pins to output mode, with initial state:
239 gpio_direction_output(sck
, 0);
240 gpio_direction_output(sda
, 1);
241 rtl8366_smi_clk_delay(smi
);
243 /* CLK 1: 0 -> 1, 1 -> 0 */
244 gpio_set_value(sck
, 1);
245 rtl8366_smi_clk_delay(smi
);
246 gpio_set_value(sck
, 0);
247 rtl8366_smi_clk_delay(smi
);
250 gpio_set_value(sck
, 1);
251 rtl8366_smi_clk_delay(smi
);
252 gpio_set_value(sda
, 0);
253 rtl8366_smi_clk_delay(smi
);
254 gpio_set_value(sck
, 0);
255 rtl8366_smi_clk_delay(smi
);
256 gpio_set_value(sda
, 1);
259 static void rtl8366_smi_stop(struct rtl8366_smi
*smi
)
261 unsigned int sda
= smi
->pdata
->gpio_sda
;
262 unsigned int sck
= smi
->pdata
->gpio_sck
;
264 rtl8366_smi_clk_delay(smi
);
265 gpio_set_value(sda
, 0);
266 gpio_set_value(sck
, 1);
267 rtl8366_smi_clk_delay(smi
);
268 gpio_set_value(sda
, 1);
269 rtl8366_smi_clk_delay(smi
);
270 gpio_set_value(sck
, 1);
271 rtl8366_smi_clk_delay(smi
);
272 gpio_set_value(sck
, 0);
273 rtl8366_smi_clk_delay(smi
);
274 gpio_set_value(sck
, 1);
277 rtl8366_smi_clk_delay(smi
);
278 gpio_set_value(sck
, 0);
279 rtl8366_smi_clk_delay(smi
);
280 gpio_set_value(sck
, 1);
282 /* set GPIO pins to input mode */
283 gpio_direction_input(sda
);
284 gpio_direction_input(sck
);
287 static void rtl8366_smi_write_bits(struct rtl8366_smi
*smi
, u32 data
, u32 len
)
289 unsigned int sda
= smi
->pdata
->gpio_sda
;
290 unsigned int sck
= smi
->pdata
->gpio_sck
;
292 for (; len
> 0; len
--) {
293 rtl8366_smi_clk_delay(smi
);
296 if ( data
& ( 1 << (len
- 1)) )
297 gpio_set_value(sda
, 1);
299 gpio_set_value(sda
, 0);
300 rtl8366_smi_clk_delay(smi
);
303 gpio_set_value(sck
, 1);
304 rtl8366_smi_clk_delay(smi
);
305 gpio_set_value(sck
, 0);
309 static void rtl8366_smi_read_bits(struct rtl8366_smi
*smi
, u32 len
, u32
*data
)
311 unsigned int sda
= smi
->pdata
->gpio_sda
;
312 unsigned int sck
= smi
->pdata
->gpio_sck
;
314 gpio_direction_input(sda
);
316 for (*data
= 0; len
> 0; len
--) {
319 rtl8366_smi_clk_delay(smi
);
322 gpio_set_value(sck
, 1);
323 rtl8366_smi_clk_delay(smi
);
324 u
= gpio_get_value(sda
);
325 gpio_set_value(sck
, 0);
327 *data
|= (u
<< (len
- 1));
330 gpio_direction_output(sda
, 0);
333 static int rtl8366_smi_wait_for_ack(struct rtl8366_smi
*smi
)
341 rtl8366_smi_read_bits(smi
, 1, &ack
);
345 if (++retry_cnt
> RTL8366_SMI_ACK_RETRY_COUNT
)
352 static int rtl8366_smi_write_byte(struct rtl8366_smi
*smi
, u8 data
)
354 rtl8366_smi_write_bits(smi
, data
, 8);
355 return rtl8366_smi_wait_for_ack(smi
);
358 static int rtl8366_smi_read_byte0(struct rtl8366_smi
*smi
, u8
*data
)
363 rtl8366_smi_read_bits(smi
, 8, &t
);
367 rtl8366_smi_write_bits(smi
, 0x00, 1);
372 static int rtl8366_smi_read_byte1(struct rtl8366_smi
*smi
, u8
*data
)
377 rtl8366_smi_read_bits(smi
, 8, &t
);
381 rtl8366_smi_write_bits(smi
, 0x01, 1);
386 static int rtl8366_smi_read_reg(struct rtl8366_smi
*smi
, u32 addr
, u32
*data
)
393 spin_lock_irqsave(&smi
->lock
, flags
);
395 rtl8366_smi_start(smi
);
397 /* send READ command */
398 ret
= rtl8366_smi_write_byte(smi
, 0x0a << 4 | 0x04 << 1 | 0x01);
403 ret
= rtl8366_smi_write_byte(smi
, addr
& 0xff);
408 ret
= rtl8366_smi_write_byte(smi
, addr
>> 8);
413 rtl8366_smi_read_byte0(smi
, &lo
);
414 /* read DATA[15:8] */
415 rtl8366_smi_read_byte1(smi
, &hi
);
417 *data
= ((u32
) lo
) | (((u32
) hi
) << 8);
422 rtl8366_smi_stop(smi
);
423 spin_unlock_irqrestore(&smi
->lock
, flags
);
428 static int rtl8366_smi_write_reg(struct rtl8366_smi
*smi
, u32 addr
, u32 data
)
433 spin_lock_irqsave(&smi
->lock
, flags
);
435 rtl8366_smi_start(smi
);
437 /* send WRITE command */
438 ret
= rtl8366_smi_write_byte(smi
, 0x0a << 4 | 0x04 << 1 | 0x00);
443 ret
= rtl8366_smi_write_byte(smi
, addr
& 0xff);
448 ret
= rtl8366_smi_write_byte(smi
, addr
>> 8);
452 /* write DATA[7:0] */
453 ret
= rtl8366_smi_write_byte(smi
, data
& 0xff);
457 /* write DATA[15:8] */
458 ret
= rtl8366_smi_write_byte(smi
, data
>> 8);
465 rtl8366_smi_stop(smi
);
466 spin_unlock_irqrestore(&smi
->lock
, flags
);
471 static int rtl8366_smi_read_phy_reg(struct rtl8366_smi
*smi
,
472 u32 phy_no
, u32 page
, u32 addr
, u32
*data
)
477 if (phy_no
> RTL8366S_PHY_NO_MAX
)
480 if (page
> RTL8366S_PHY_PAGE_MAX
)
483 if (addr
> RTL8366S_PHY_ADDR_MAX
)
486 ret
= rtl8366_smi_write_reg(smi
, RTL8366S_PHY_ACCESS_CTRL_REG
,
487 RTL8366S_PHY_CTRL_READ
);
491 reg
= 0x8000 | (1 << (phy_no
+ RTL8366S_PHY_NO_OFFSET
)) |
492 ((page
<< RTL8366S_PHY_PAGE_OFFSET
) & RTL8366S_PHY_PAGE_MASK
) |
493 (addr
& RTL8366S_PHY_REG_MASK
);
495 ret
= rtl8366_smi_write_reg(smi
, reg
, 0);
499 ret
= rtl8366_smi_read_reg(smi
, RTL8366S_PHY_ACCESS_DATA_REG
, data
);
506 static int rtl8366_smi_write_phy_reg(struct rtl8366_smi
*smi
,
507 u32 phy_no
, u32 page
, u32 addr
, u32 data
)
512 if (phy_no
> RTL8366S_PHY_NO_MAX
)
515 if (page
> RTL8366S_PHY_PAGE_MAX
)
518 if (addr
> RTL8366S_PHY_ADDR_MAX
)
521 ret
= rtl8366_smi_write_reg(smi
, RTL8366S_PHY_ACCESS_CTRL_REG
,
522 RTL8366S_PHY_CTRL_WRITE
);
526 reg
= 0x8000 | (1 << (phy_no
+ RTL8366S_PHY_NO_OFFSET
)) |
527 ((page
<< RTL8366S_PHY_PAGE_OFFSET
) & RTL8366S_PHY_PAGE_MASK
) |
528 (addr
& RTL8366S_PHY_REG_MASK
);
530 ret
= rtl8366_smi_write_reg(smi
, reg
, data
);
537 static int rtl8366_get_mib_counter(struct rtl8366_smi
*smi
, int counter
,
538 int port
, unsigned long long *val
)
542 u32 addr
, data
, regoffset
;
545 /* address offset to MIBs counter */
546 const u16 mibLength
[RTL8366S_MIB_COUNT
] = {4, 4, 2, 2, 2, 2, 2, 2, 2,
547 2, 2, 2, 2, 2, 2, 2, 2, 2,
548 2, 2, 4, 2, 2, 2, 2, 2, 2,
551 if (port
> RTL8366_NUM_PORTS
|| counter
>= RTL8366S_MIB_COUNT
)
555 regoffset
= RTL8366S_MIB_COUNTER_PORT_OFFSET
* (port
);
557 while (i
< counter
) {
558 regoffset
+= mibLength
[i
];
562 addr
= RTL8366S_MIB_COUNTER_BASE
+ regoffset
;
565 /* writing access counter address first */
566 /* then ASIC will prepare 64bits counter wait for being retrived */
567 data
= 0;/* writing data will be discard by ASIC */
568 err
= rtl8366_smi_write_reg(smi
, addr
, data
);
572 /* read MIB control register */
573 err
= rtl8366_smi_read_reg(smi
, RTL8366S_MIB_CTRL_REG
, &data
);
577 if (data
& RTL8366S_MIB_CTRL_BUSY_MASK
)
580 if (data
& RTL8366S_MIB_CTRL_RESET_MASK
)
584 addr
= addr
+ mibLength
[counter
] - 1;
585 i
= mibLength
[counter
];
588 err
= rtl8366_smi_read_reg(smi
, addr
, &data
);
592 mibvalue
= (mibvalue
<< 16) | (data
& 0xFFFF);
602 static int rtl8366s_get_vlan_4k_entry(struct rtl8366_smi
*smi
, u32 vid
,
603 struct rtl8366s_vlan4kentry
*vlan4k
)
609 memset(vlan4k
, '\0', sizeof(struct rtl8366s_vlan4kentry
));
612 if (vid
>= RTL8366_NUM_VIDS
)
615 tableaddr
= (u16
*)vlan4k
;
619 err
= rtl8366_smi_write_reg(smi
, RTL8366S_VLAN_TABLE_WRITE_BASE
, data
);
623 /* write table access control word */
624 err
= rtl8366_smi_write_reg(smi
, RTL8366S_TABLE_ACCESS_CTRL_REG
,
625 RTL8366S_TABLE_VLAN_READ_CTRL
);
629 err
= rtl8366_smi_read_reg(smi
, RTL8366S_VLAN_TABLE_READ_BASE
, &data
);
636 err
= rtl8366_smi_read_reg(smi
, RTL8366S_VLAN_TABLE_READ_BASE
+ 1,
647 static int rtl8366s_set_vlan_4k_entry(struct rtl8366_smi
*smi
,
648 const struct rtl8366s_vlan4kentry
*vlan4k
)
654 if (vlan4k
->vid
>= RTL8366_NUM_VIDS
||
655 vlan4k
->member
> RTL8366_PORT_ALL
||
656 vlan4k
->untag
> RTL8366_PORT_ALL
||
657 vlan4k
->fid
> RTL8366S_FIDMAX
)
660 tableaddr
= (u16
*)vlan4k
;
664 err
= rtl8366_smi_write_reg(smi
, RTL8366S_VLAN_TABLE_WRITE_BASE
, data
);
672 err
= rtl8366_smi_write_reg(smi
, RTL8366S_VLAN_TABLE_WRITE_BASE
+ 1,
677 /* write table access control word */
678 err
= rtl8366_smi_write_reg(smi
, RTL8366S_TABLE_ACCESS_CTRL_REG
,
679 RTL8366S_TABLE_VLAN_WRITE_CTRL
);
684 static int rtl8366s_get_vlan_member_config(struct rtl8366_smi
*smi
, u32 index
,
685 struct rtl8366s_vlanconfig
*vlanmc
)
692 memset(vlanmc
, '\0', sizeof(struct rtl8366s_vlanconfig
));
694 if (index
>= RTL8366_NUM_VLANS
)
697 tableaddr
= (u16
*)vlanmc
;
699 addr
= RTL8366S_VLAN_MEMCONF_BASE
+ (index
<< 1);
701 err
= rtl8366_smi_read_reg(smi
, addr
, &data
);
708 addr
= RTL8366S_VLAN_MEMCONF_BASE
+ 1 + (index
<< 1);
710 err
= rtl8366_smi_read_reg(smi
, addr
, &data
);
719 static int rtl8366s_set_vlan_member_config(struct rtl8366_smi
*smi
, u32 index
,
720 const struct rtl8366s_vlanconfig
728 if (index
>= RTL8366_NUM_VLANS
||
729 vlanmc
->vid
>= RTL8366_NUM_VIDS
||
730 vlanmc
->priority
> RTL8366S_PRIORITYMAX
||
731 vlanmc
->member
> RTL8366_PORT_ALL
||
732 vlanmc
->untag
> RTL8366_PORT_ALL
||
733 vlanmc
->fid
> RTL8366S_FIDMAX
)
736 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
];
778 err
= rtl8366_smi_read_reg(smi
, addr
, &data
);
782 *val
= (data
& bits
[port
]) >> bitoffset
[port
];
788 static int rtl8366_get_vlan_port_pvid(struct rtl8366_smi
*smi
, int port
,
793 struct rtl8366s_vlanconfig vlanmc
;
795 err
= rtl8366_get_port_vlan_index(smi
, port
, &index
);
799 err
= rtl8366s_get_vlan_member_config(smi
, index
, &vlanmc
);
807 static int rtl8366_set_port_vlan_index(struct rtl8366_smi
*smi
, int port
,
816 /* bits mapping to port vlan control register of port n */
817 const u16 bitmasks
[6] = { 0x000F, 0x00F0, 0x0F00,
818 0xF000, 0x000F, 0x00F0 };
819 /* bits offset to port vlan control register of port n */
820 const u16 bitOff
[6] = { 0, 4, 8, 12, 0, 4 };
821 /* address offset to port vlan control register of port n */
822 const u16 addrOff
[6] = { 0, 0, 0, 0, 1, 1 };
824 if (port
>= RTL8366_NUM_PORTS
|| index
>= RTL8366_NUM_VLANS
)
827 addr
= RTL8366S_PORT_VLAN_CTRL_BASE
+ addrOff
[port
];
829 bits
= bitmasks
[port
];
831 data
= (index
<< bitOff
[port
]) & bits
;
833 err
= rtl8366_smi_read_reg(smi
, addr
, &vlan_data
);
837 vlan_data
&= ~(vlan_data
& bits
);
840 err
= rtl8366_smi_write_reg(smi
, addr
, vlan_data
);
847 static int rtl8366_set_vlan_port_pvid(struct rtl8366_smi
*smi
, int port
,
851 struct rtl8366s_vlanconfig vlanmc
;
852 struct rtl8366s_vlan4kentry vlan4k
;
854 if (port
>= RTL8366_NUM_PORTS
|| val
>= RTL8366_NUM_VIDS
)
859 /* Updating the 4K entry; lookup it and change the port member set */
860 rtl8366s_get_vlan_4k_entry(smi
, val
, &vlan4k
);
861 vlan4k
.member
|= ((1 << port
) | RTL8366_PORT_CPU
);
862 vlan4k
.untag
= RTL8366_PORT_ALL_BUT_CPU
;
863 rtl8366s_set_vlan_4k_entry(smi
, &vlan4k
);
865 /* For the 16 entries more work needs to be done. First see if such
866 VID is already there and change it */
867 for (i
= 0; i
< RTL8366_NUM_VLANS
; ++i
) {
868 rtl8366s_get_vlan_member_config(smi
, i
, &vlanmc
);
870 /* Try to find an existing vid and update port member set */
871 if (val
== vlanmc
.vid
) {
872 vlanmc
.member
|= ((1 << port
) | RTL8366_PORT_CPU
);
873 rtl8366s_set_vlan_member_config(smi
, i
, &vlanmc
);
875 /* Now update PVID register settings */
876 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 */
884 for (i
= 0; i
< RTL8366_NUM_VLANS
; ++i
) {
885 rtl8366s_get_vlan_member_config(smi
, i
, &vlanmc
);
887 /* See if this vlan member configuration is unused. It is
888 unused if member set contains no ports or CPU port only */
889 if (!vlanmc
.member
|| vlanmc
.member
== RTL8366_PORT_CPU
) {
892 vlanmc
.untag
= RTL8366_PORT_ALL_BUT_CPU
;
893 vlanmc
.member
= ((1 << port
) | RTL8366_PORT_CPU
);
896 rtl8366s_set_vlan_member_config(smi
, i
, &vlanmc
);
898 /* Now update PVID register settings */
899 rtl8366_set_port_vlan_index(smi
, port
, i
);
905 dev_err(&smi
->pdev
->dev
, "All 16 vlan member configurations are in "
911 static int rtl8366_vlan_set_vlan(struct rtl8366_smi
*smi
, int enable
)
914 rtl8366_smi_read_reg(smi
, RTL8366_CHIP_GLOBAL_CTRL_REG
, &data
);
916 data
&= ~(data
& RTL8366_CHIP_CTRL_VLAN
);
918 data
|= RTL8366_CHIP_CTRL_VLAN
;
920 return rtl8366_smi_write_reg(smi
, RTL8366_CHIP_GLOBAL_CTRL_REG
, data
);
923 static int rtl8366_vlan_set_4ktable(struct rtl8366_smi
*smi
, int enable
)
926 rtl8366_smi_read_reg(smi
, RTL8366S_VLAN_TB_CTRL_REG
, &data
);
932 return rtl8366_smi_write_reg(smi
, RTL8366S_VLAN_TB_CTRL_REG
, data
);
935 static int rtl8366s_reset_vlan(struct rtl8366_smi
*smi
)
937 struct rtl8366s_vlan4kentry vlan4k
;
938 struct rtl8366s_vlanconfig vlanmc
;
942 /* clear 16 VLAN member configuration */
948 for (i
= 0; i
< RTL8366_NUM_VLANS
; i
++) {
949 err
= rtl8366s_set_vlan_member_config(smi
, i
, &vlanmc
);
954 /* Set a default VLAN with vid 1 to 4K table for all ports */
956 vlan4k
.member
= RTL8366_PORT_ALL
;
957 vlan4k
.untag
= RTL8366_PORT_ALL
;
959 err
= rtl8366s_set_vlan_4k_entry(smi
, &vlan4k
);
963 /* Set all ports PVID to default VLAN */
964 for (i
= 0; i
< RTL8366_NUM_PORTS
; i
++) {
965 err
= rtl8366_set_vlan_port_pvid(smi
, i
, 0);
973 #ifdef CONFIG_RTL8366_SMI_DEBUG_FS
974 static int rtl8366_debugfs_open(struct inode
*inode
, struct file
*file
)
976 file
->private_data
= inode
->i_private
;
980 static ssize_t
rtl8366_read_debugfs_mibs(struct file
*file
,
981 char __user
*user_buf
,
982 size_t count
, loff_t
*ppos
)
985 struct rtl8366_smi
*smi
= (struct rtl8366_smi
*)file
->private_data
;
986 char *buf
= smi
->buf
;
988 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "MIB Counters:\n");
989 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "Counter"
991 "Port 0 \t\t Port 1 \t\t Port 2 \t\t Port 3 \t\t "
994 for (i
= 0; i
< 33; ++i
) {
996 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "%d:%s ",
998 for (j
= 0; j
< RTL8366_NUM_PORTS
; ++j
) {
999 unsigned long long counter
= 0;
1001 if (!rtl8366_get_mib_counter(smi
, i
, j
, &counter
))
1002 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1005 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1008 if (j
!= RTL8366_NUM_PORTS
- 1) {
1009 if (counter
< 100000)
1010 len
+= snprintf(buf
+ len
,
1011 sizeof(smi
->buf
) - len
,
1014 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1018 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\n");
1021 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\n");
1023 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1026 static ssize_t
rtl8366_read_debugfs_vlan(struct file
*file
,
1027 char __user
*user_buf
,
1028 size_t count
, loff_t
*ppos
)
1031 struct rtl8366_smi
*smi
= (struct rtl8366_smi
*)file
->private_data
;
1032 char *buf
= smi
->buf
;
1034 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "VLAN Member Config:\n");
1035 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1036 "\t id \t vid \t prio \t member \t untag \t fid "
1039 for (i
= 0; i
< RTL8366_NUM_VLANS
; ++i
) {
1040 struct rtl8366s_vlanconfig vlanmc
;
1042 rtl8366s_get_vlan_member_config(smi
, i
, &vlanmc
);
1044 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1045 "\t[%d] \t %d \t %d \t 0x%04x \t 0x%04x \t %d "
1046 "\t", i
, vlanmc
.vid
, vlanmc
.priority
,
1047 vlanmc
.member
, vlanmc
.untag
, vlanmc
.fid
);
1049 for (j
= 0; j
< RTL8366_NUM_PORTS
; ++j
) {
1051 if (!rtl8366_get_port_vlan_index(smi
, j
, &index
)) {
1053 len
+= snprintf(buf
+ len
,
1054 sizeof(smi
->buf
) - len
,
1058 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\n");
1061 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1064 static ssize_t
rtl8366_read_debugfs_reg(struct file
*file
,
1065 char __user
*user_buf
,
1066 size_t count
, loff_t
*ppos
)
1068 u32 t
, reg
= g_dbg_reg
;
1070 struct rtl8366_smi
*smi
= (struct rtl8366_smi
*)file
->private_data
;
1071 char *buf
= smi
->buf
;
1073 memset(buf
, '\0', sizeof(smi
->buf
));
1075 err
= rtl8366_smi_read_reg(smi
, reg
, &t
);
1077 len
+= snprintf(buf
, sizeof(smi
->buf
),
1078 "Read failed (reg: 0x%04x)\n", reg
);
1079 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1082 len
+= snprintf(buf
, sizeof(smi
->buf
), "reg = 0x%04x, val = 0x%04x\n",
1085 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
1088 static ssize_t
rtl8366_write_debugfs_reg(struct file
*file
,
1089 const char __user
*user_buf
,
1090 size_t count
, loff_t
*ppos
)
1093 u32 reg
= g_dbg_reg
;
1096 struct rtl8366_smi
*smi
= (struct rtl8366_smi
*)file
->private_data
;
1097 char *buf
= smi
->buf
;
1099 len
= min(count
, sizeof(smi
->buf
) - 1);
1100 if (copy_from_user(buf
, user_buf
, len
)) {
1101 dev_err(&smi
->pdev
->dev
, "copy from user failed\n");
1106 if (len
> 0 && buf
[len
- 1] == '\n')
1107 buf
[len
- 1] = '\0';
1110 if (strict_strtoul(buf
, 16, &data
)) {
1111 dev_err(&smi
->pdev
->dev
, "Invalid reg value %s\n", buf
);
1113 err
= rtl8366_smi_write_reg(smi
, reg
, data
);
1115 dev_err(&smi
->pdev
->dev
,
1116 "writing reg 0x%04x val 0x%04lx failed\n",
1124 static const struct file_operations fops_rtl8366_regs
= {
1125 .read
= rtl8366_read_debugfs_reg
,
1126 .write
= rtl8366_write_debugfs_reg
,
1127 .open
= rtl8366_debugfs_open
,
1128 .owner
= THIS_MODULE
1131 static const struct file_operations fops_rtl8366_vlan
= {
1132 .read
= rtl8366_read_debugfs_vlan
,
1133 .open
= rtl8366_debugfs_open
,
1134 .owner
= THIS_MODULE
1137 static const struct file_operations fops_rtl8366_mibs
= {
1138 .read
= rtl8366_read_debugfs_mibs
,
1139 .open
= rtl8366_debugfs_open
,
1140 .owner
= THIS_MODULE
1143 static void rtl8366_debugfs_init(struct rtl8366_smi
*smi
)
1145 struct dentry
*node
;
1146 struct dentry
*root
;
1148 if (!smi
->debugfs_root
)
1149 smi
->debugfs_root
= debugfs_create_dir("rtl8366s", NULL
);
1151 if (!smi
->debugfs_root
) {
1152 dev_err(&smi
->pdev
->dev
, "Unable to create debugfs dir\n");
1155 root
= smi
->debugfs_root
;
1157 node
= debugfs_create_x16("reg", S_IRUGO
| S_IWUSR
, root
, &g_dbg_reg
);
1159 dev_err(&smi
->pdev
->dev
, "Creating debugfs file reg failed\n");
1163 node
= debugfs_create_file("val", S_IRUGO
| S_IWUSR
, root
, smi
,
1164 &fops_rtl8366_regs
);
1166 dev_err(&smi
->pdev
->dev
, "Creating debugfs file val failed\n");
1170 node
= debugfs_create_file("vlan", S_IRUSR
, root
, smi
,
1171 &fops_rtl8366_vlan
);
1173 dev_err(&smi
->pdev
->dev
, "Creating debugfs file vlan "
1178 node
= debugfs_create_file("mibs", S_IRUSR
, root
, smi
,
1179 &fops_rtl8366_mibs
);
1181 dev_err(&smi
->pdev
->dev
, "Creating debugfs file mibs "
1187 static void rtl8366_debugfs_remove(struct rtl8366_smi
*smi
)
1189 if (smi
->debugfs_root
) {
1190 debugfs_remove_recursive(smi
->debugfs_root
);
1191 smi
->debugfs_root
= NULL
;
1196 static inline void rtl8366_debugfs_init(struct rtl8366_smi
*smi
) {}
1197 static inline void rtl8366_debugfs_remove(struct rtl8366_smi
*smi
) {}
1198 #endif /* CONFIG_RTL8366_SMI_DEBUG_FS */
1200 static int rtl8366_global_reset_mibs(struct switch_dev
*dev
,
1201 const struct switch_attr
*attr
,
1202 struct switch_val
*val
)
1205 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1207 if (val
->value
.i
== 1) {
1208 rtl8366_smi_read_reg(smi
, RTL8366S_MIB_CTRL_REG
, &data
);
1210 rtl8366_smi_write_reg(smi
, RTL8366S_MIB_CTRL_REG
, data
);
1216 static int rtl8366_get_vlan(struct switch_dev
*dev
,
1217 const struct switch_attr
*attr
,
1218 struct switch_val
*val
)
1221 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1223 if (attr
->ofs
== 1) {
1224 rtl8366_smi_read_reg(smi
, RTL8366_CHIP_GLOBAL_CTRL_REG
, &data
);
1226 if (data
& RTL8366_CHIP_CTRL_VLAN
)
1230 } else if (attr
->ofs
== 2) {
1231 rtl8366_smi_read_reg(smi
, RTL8366S_VLAN_TB_CTRL_REG
, &data
);
1242 static int rtl8366_global_get_blinkrate(struct switch_dev
*dev
,
1243 const struct switch_attr
*attr
,
1244 struct switch_val
*val
)
1247 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1248 rtl8366_smi_read_reg(smi
, RTL8366_LED_BLINKRATE_REG
, &data
);
1250 val
->value
.i
= (data
& (RTL8366_LED_BLINKRATE_MASK
));
1255 static int rtl8366_global_set_blinkrate(struct switch_dev
*dev
,
1256 const struct switch_attr
*attr
,
1257 struct switch_val
*val
)
1260 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1262 if (val
->value
.i
>= 6)
1265 rtl8366_smi_read_reg(smi
, RTL8366_LED_BLINKRATE_REG
, &data
);
1267 data
&= ~(data
& RTL8366_LED_BLINKRATE_MASK
);
1268 data
|= val
->value
.i
;
1270 rtl8366_smi_write_reg(smi
, RTL8366_LED_BLINKRATE_REG
, data
);
1275 static int rtl8366_set_vlan(struct switch_dev
*dev
,
1276 const struct switch_attr
*attr
,
1277 struct switch_val
*val
)
1279 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1282 return rtl8366_vlan_set_vlan(smi
, val
->value
.i
);
1284 return rtl8366_vlan_set_4ktable(smi
, val
->value
.i
);
1287 static int rtl8366_attr_get_port_link(struct switch_dev
*dev
,
1288 const struct switch_attr
*attr
,
1289 struct switch_val
*val
)
1291 u32 len
= 0, data
= 0;
1292 int speed
, duplex
, link
, txpause
, rxpause
, nway
;
1293 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1294 char *buf
= smi
->buf
;
1296 if (val
->port_vlan
>= RTL8366_NUM_PORTS
)
1299 memset(buf
, '\0', sizeof(smi
->buf
));
1300 rtl8366_smi_read_reg(smi
, RTL8366S_PORT_LINK_STATUS_BASE
+
1301 (val
->port_vlan
>> 1),
1304 if (val
->port_vlan
& 0x1)
1307 speed
= (data
& RTL8366S_PORT_STATUS_SPEED_MASK
);
1308 duplex
= (data
& RTL8366S_PORT_STATUS_DUPLEX_MASK
) >> 2;
1309 link
= (data
& RTL8366S_PORT_STATUS_LINK_MASK
) >> 4;
1310 txpause
= (data
& RTL8366S_PORT_STATUS_TXPAUSE_MASK
) >> 5;
1311 rxpause
= (data
& RTL8366S_PORT_STATUS_RXPAUSE_MASK
) >> 6;
1312 nway
= (data
& RTL8366S_PORT_STATUS_AN_MASK
) >> 7;
1314 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "Port %d: ",
1318 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1319 "Link UP, Speed: ");
1321 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1322 "Link DOWN, Speed: ");
1325 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "10Base-TX ");
1326 else if (speed
== 1)
1327 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "100Base-TX ");
1328 else if (speed
== 2)
1329 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "1000Base-TX ");
1332 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "Full-Duplex, ");
1334 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "Half-Duplex, ");
1337 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "TX-Pause ");
1339 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "RX-Pause ");
1341 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "nway ");
1349 static int rtl8366_attr_get_vlan_info(struct switch_dev
*dev
,
1350 const struct switch_attr
*attr
,
1351 struct switch_val
*val
)
1355 struct rtl8366s_vlanconfig vlanmc
;
1356 struct rtl8366s_vlan4kentry vlan4k
;
1357 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1358 char *buf
= smi
->buf
;
1360 if (val
->port_vlan
>= RTL8366_NUM_VLANS
)
1363 memset(buf
, '\0', sizeof(smi
->buf
));
1365 rtl8366s_get_vlan_member_config(smi
, val
->port_vlan
, &vlanmc
);
1366 rtl8366s_get_vlan_4k_entry(smi
, vlanmc
.vid
, &vlan4k
);
1368 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "VLAN %d: Ports: ",
1371 for (i
= 0; i
< RTL8366_NUM_PORTS
; ++i
) {
1373 if (!rtl8366_get_port_vlan_index(smi
, i
, &index
) &&
1374 index
== val
->port_vlan
)
1375 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "%d", i
);
1377 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\n");
1379 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1380 "\t\t vid \t prio \t member \t untag \t fid\n");
1381 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\tMC:\t");
1382 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1383 "%d \t %d \t 0x%04x \t 0x%04x \t %d\n",
1384 vlanmc
.vid
, vlanmc
.priority
, vlanmc
.member
,
1385 vlanmc
.untag
, vlanmc
.fid
);
1386 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "\t4K:\t");
1387 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1388 "%d \t \t 0x%04x \t 0x%04x \t %d",
1389 vlan4k
.vid
, vlan4k
.member
, vlan4k
.untag
, vlan4k
.fid
);
1397 static int rtl8366_set_port_led(struct switch_dev
*dev
,
1398 const struct switch_attr
*attr
,
1399 struct switch_val
*val
)
1402 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1403 if (val
->port_vlan
>= RTL8366_NUM_PORTS
||
1404 (1 << val
->port_vlan
) == RTL8366_PORT_UNKNOWN
)
1407 if (val
->port_vlan
== RTL8366_PORT_NUM_CPU
) {
1408 rtl8366_smi_read_reg(smi
, RTL8366_LED_BLINKRATE_REG
, &data
);
1409 data
= (data
& (~(0xF << 4))) | (val
->value
.i
<< 4);
1410 rtl8366_smi_write_reg(smi
, RTL8366_LED_BLINKRATE_REG
, data
);
1412 rtl8366_smi_read_reg(smi
, RTL8366_LED_CTRL_REG
, &data
);
1413 data
= (data
& (~(0xF << (val
->port_vlan
* 4)))) |
1414 (val
->value
.i
<< (val
->port_vlan
* 4));
1415 rtl8366_smi_write_reg(smi
, RTL8366_LED_CTRL_REG
, data
);
1421 static int rtl8366_get_port_led(struct switch_dev
*dev
,
1422 const struct switch_attr
*attr
,
1423 struct switch_val
*val
)
1426 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1427 if (val
->port_vlan
>= RTL8366_NUM_LEDGROUPS
)
1430 rtl8366_smi_read_reg(smi
, RTL8366_LED_CTRL_REG
, &data
);
1431 val
->value
.i
= (data
>> (val
->port_vlan
* 4)) & 0x000F;
1436 static int rtl8366_reset_port_mibs(struct switch_dev
*dev
,
1437 const struct switch_attr
*attr
,
1438 struct switch_val
*val
)
1441 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1442 if (val
->port_vlan
>= RTL8366_NUM_PORTS
)
1445 rtl8366_smi_read_reg(smi
, RTL8366S_MIB_CTRL_REG
, &data
);
1446 data
|= (1 << (val
->port_vlan
+ 3));
1447 rtl8366_smi_write_reg(smi
, RTL8366S_MIB_CTRL_REG
, data
);
1452 static int rtl8366_get_port_mib(struct switch_dev
*dev
,
1453 const struct switch_attr
*attr
,
1454 struct switch_val
*val
)
1457 unsigned long long counter
= 0;
1458 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1459 char *buf
= smi
->buf
;
1461 if (val
->port_vlan
>= RTL8366_NUM_PORTS
)
1464 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
, "Port %d MIB counters\n",
1466 for (i
= 0; i
< RTL8366S_MIB_COUNT
; ++i
) {
1468 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1469 "%d:%s\t", i
, MIBCOUNTERS
[i
]);
1470 if (!rtl8366_get_mib_counter(smi
, i
, val
->port_vlan
, &counter
))
1471 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1472 "[%llu]\n", counter
);
1474 len
+= snprintf(buf
+ len
, sizeof(smi
->buf
) - len
,
1483 static int rtl8366_get_ports(struct switch_dev
*dev
,
1484 struct switch_val
*val
)
1486 struct rtl8366s_vlanconfig vlanmc
;
1487 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1488 struct switch_port
*port
;
1491 if (val
->port_vlan
>= RTL8366_NUM_VLANS
)
1494 rtl8366s_get_vlan_member_config(smi
, val
->port_vlan
, &vlanmc
);
1496 port
= &val
->value
.ports
[0];
1498 for (i
= 0; i
< RTL8366_NUM_PORTS
; i
++) {
1499 if (!(vlanmc
.member
& BIT(i
)))
1503 port
->flags
= (vlanmc
.untag
& BIT(i
)) ?
1504 0 : BIT(SWITCH_PORT_FLAG_TAGGED
);
1511 static int rtl8366_set_ports(struct switch_dev
*dev
,
1512 struct switch_val
*val
)
1514 struct rtl8366s_vlanconfig vlanmc
;
1515 struct rtl8366s_vlan4kentry vlan4k
;
1516 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1517 struct switch_port
*port
;
1520 if (val
->port_vlan
>= RTL8366_NUM_VLANS
)
1523 rtl8366s_get_vlan_member_config(smi
, val
->port_vlan
, &vlanmc
);
1524 rtl8366s_get_vlan_4k_entry(smi
, vlanmc
.vid
, &vlan4k
);
1529 port
= &val
->value
.ports
[0];
1530 for (i
= 0; i
< val
->len
; i
++, port
++) {
1531 vlanmc
.member
|= BIT(port
->id
);
1533 if (!(port
->flags
& BIT(SWITCH_PORT_FLAG_TAGGED
)))
1534 vlanmc
.untag
|= BIT(port
->id
);
1537 vlan4k
.member
= vlanmc
.member
;
1538 vlan4k
.untag
= vlanmc
.untag
;
1540 rtl8366s_set_vlan_member_config(smi
, val
->port_vlan
, &vlanmc
);
1541 rtl8366s_set_vlan_4k_entry(smi
, &vlan4k
);
1545 static int rtl8366_get_port_pvid(struct switch_dev
*dev
, int port
, int *val
)
1547 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1548 return rtl8366_get_vlan_port_pvid(smi
, port
, val
);
1551 static int rtl8366_set_port_pvid(struct switch_dev
*dev
, int port
, int val
)
1553 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1554 return rtl8366_set_vlan_port_pvid(smi
, port
, val
);
1557 static int rtl8366_reset_switch(struct switch_dev
*dev
)
1559 struct rtl8366_smi
*smi
= sw_to_rtl8366(dev
);
1563 rtl8366_smi_write_reg(smi
, RTL8366_RESET_CTRL_REG
,
1564 RTL8366_CHIP_CTRL_RESET_HW
);
1567 if (rtl8366_smi_read_reg(smi
, RTL8366_RESET_CTRL_REG
, &data
))
1570 if (!(data
& RTL8366_CHIP_CTRL_RESET_HW
))
1572 } while (--timeout
);
1575 printk("Timeout waiting for the switch to reset\n");
1579 return rtl8366s_reset_vlan(smi
);
1582 static struct switch_attr rtl8366_globals
[] = {
1584 .type
= SWITCH_TYPE_INT
,
1585 .name
= "enable_vlan",
1586 .description
= "Enable VLAN mode",
1587 .set
= rtl8366_set_vlan
,
1588 .get
= rtl8366_get_vlan
,
1593 .type
= SWITCH_TYPE_INT
,
1594 .name
= "enable_vlan4k",
1595 .description
= "Enable VLAN 4K mode",
1596 .set
= rtl8366_set_vlan
,
1597 .get
= rtl8366_get_vlan
,
1602 .type
= SWITCH_TYPE_INT
,
1603 .name
= "reset_mibs",
1604 .description
= "Reset all MIB counters",
1605 .set
= rtl8366_global_reset_mibs
,
1610 .type
= SWITCH_TYPE_INT
,
1611 .name
= "blinkrate",
1612 .description
= "Get/Set LED blinking rate (0 = 43ms, 1 = 84ms,"
1613 " 2 = 120ms, 3 = 170ms, 4 = 340ms, 5 = 670ms)",
1614 .set
= rtl8366_global_set_blinkrate
,
1615 .get
= rtl8366_global_get_blinkrate
,
1620 static struct switch_attr rtl8366_port
[] = {
1622 .type
= SWITCH_TYPE_STRING
,
1624 .description
= "Get port link information",
1627 .get
= rtl8366_attr_get_port_link
1630 .type
= SWITCH_TYPE_INT
,
1631 .name
= "reset_mib",
1632 .description
= "Reset single port MIB counters",
1634 .set
= rtl8366_reset_port_mibs
,
1638 .type
= SWITCH_TYPE_STRING
,
1640 .description
= "Get MIB counters for port",
1643 .get
= rtl8366_get_port_mib
1646 .type
= SWITCH_TYPE_INT
,
1648 .description
= "Get/Set port group (0 - 3) led mode (0 - 15)",
1650 .set
= rtl8366_set_port_led
,
1651 .get
= rtl8366_get_port_led
1655 static struct switch_attr rtl8366_vlan
[] = {
1657 .type
= SWITCH_TYPE_STRING
,
1659 .description
= "Get vlan information",
1662 .get
= rtl8366_attr_get_vlan_info
1668 static struct switch_dev rtldev
= {
1670 .cpu_port
= RTL8366_PORT_NUM_CPU
,
1671 .ports
= RTL8366_NUM_PORTS
,
1672 .vlans
= RTL8366_NUM_VLANS
,
1674 .attr
= rtl8366_globals
,
1675 .n_attr
= ARRAY_SIZE(rtl8366_globals
),
1678 .attr
= rtl8366_port
,
1679 .n_attr
= ARRAY_SIZE(rtl8366_port
),
1682 .attr
= rtl8366_vlan
,
1683 .n_attr
= ARRAY_SIZE(rtl8366_vlan
),
1686 .get_vlan_ports
= rtl8366_get_ports
,
1687 .set_vlan_ports
= rtl8366_set_ports
,
1688 .get_port_pvid
= rtl8366_get_port_pvid
,
1689 .set_port_pvid
= rtl8366_set_port_pvid
,
1690 .reset_switch
= rtl8366_reset_switch
,
1693 static int rtl8366_smi_switch_init(struct rtl8366_smi
*smi
)
1695 struct switch_dev
*dev
= &smi
->dev
;
1698 memcpy(dev
, &rtldev
, sizeof(struct switch_dev
));
1700 dev
->devname
= dev_name(&smi
->pdev
->dev
);
1702 err
= register_switch(dev
, NULL
);
1704 dev_err(&smi
->pdev
->dev
, "switch registration failed\n");
1709 static void rtl8366_smi_switch_cleanup(struct rtl8366_smi
*smi
)
1711 unregister_switch(&smi
->dev
);
1714 static int rtl8366_smi_mii_read(struct mii_bus
*bus
, int addr
, int reg
)
1716 struct rtl8366_smi
*smi
= bus
->priv
;
1720 err
= rtl8366_smi_read_phy_reg(smi
, addr
, 0, reg
, &val
);
1727 static int rtl8366_smi_mii_write(struct mii_bus
*bus
, int addr
, int reg
,
1730 struct rtl8366_smi
*smi
= bus
->priv
;
1734 err
= rtl8366_smi_write_phy_reg(smi
, addr
, 0, reg
, val
);
1736 (void) rtl8366_smi_read_phy_reg(smi
, addr
, 0, reg
, &t
);
1741 static int rtl8366_smi_mii_init(struct rtl8366_smi
*smi
)
1746 smi
->mii_bus
= mdiobus_alloc();
1747 if (smi
->mii_bus
== NULL
) {
1752 spin_lock_init(&smi
->lock
);
1753 smi
->mii_bus
->priv
= (void *) smi
;
1754 smi
->mii_bus
->name
= "rtl8366-smi";
1755 smi
->mii_bus
->read
= rtl8366_smi_mii_read
;
1756 smi
->mii_bus
->write
= rtl8366_smi_mii_write
;
1757 snprintf(smi
->mii_bus
->id
, MII_BUS_ID_SIZE
, "%s",
1758 dev_name(&smi
->pdev
->dev
));
1759 smi
->mii_bus
->parent
= &smi
->pdev
->dev
;
1760 smi
->mii_bus
->phy_mask
= ~(0x1f);
1761 smi
->mii_bus
->irq
= smi
->mii_irq
;
1762 for (i
= 0; i
< PHY_MAX_ADDR
; i
++)
1763 smi
->mii_irq
[i
] = PHY_POLL
;
1765 ret
= mdiobus_register(smi
->mii_bus
);
1772 mdiobus_free(smi
->mii_bus
);
1777 static void rtl8366_smi_mii_cleanup(struct rtl8366_smi
*smi
)
1779 mdiobus_unregister(smi
->mii_bus
);
1780 mdiobus_free(smi
->mii_bus
);
1783 static int rtl8366_smi_mii_bus_match(struct mii_bus
*bus
)
1785 return (bus
->read
== rtl8366_smi_mii_read
&&
1786 bus
->write
== rtl8366_smi_mii_write
);
1789 static int rtl8366_smi_setup(struct rtl8366_smi
*smi
)
1795 ret
= rtl8366_smi_read_reg(smi
, RTL8366S_CHIP_ID_REG
, &chip_id
);
1797 dev_err(&smi
->pdev
->dev
, "unable to read chip id\n");
1802 case RTL8366S_CHIP_ID_8366
:
1805 dev_err(&smi
->pdev
->dev
, "unknown chip id (%04x)\n", chip_id
);
1809 ret
= rtl8366_smi_read_reg(smi
, RTL8366S_CHIP_VERSION_CTRL_REG
,
1812 dev_err(&smi
->pdev
->dev
, "unable to read chip version\n");
1816 dev_info(&smi
->pdev
->dev
, "RTL%04x ver. %u chip found\n",
1817 chip_id
, chip_ver
& RTL8366S_CHIP_VERSION_MASK
);
1819 rtl8366_debugfs_init(smi
);
1824 static int __init
rtl8366_smi_probe(struct platform_device
*pdev
)
1826 static int rtl8366_smi_version_printed
;
1827 struct rtl8366_smi_platform_data
*pdata
;
1828 struct rtl8366_smi
*smi
;
1831 if (!rtl8366_smi_version_printed
++)
1832 printk(KERN_NOTICE RTL8366_SMI_DRIVER_DESC
1833 " version " RTL8366_SMI_DRIVER_VER
"\n");
1835 pdata
= pdev
->dev
.platform_data
;
1837 dev_err(&pdev
->dev
, "no platform data specified\n");
1842 smi
= kzalloc(sizeof(struct rtl8366_smi
), GFP_KERNEL
);
1844 dev_err(&pdev
->dev
, "no memory for private data\n");
1849 err
= gpio_request(pdata
->gpio_sda
, dev_name(&pdev
->dev
));
1851 dev_err(&pdev
->dev
, "gpio_request failed for %u, err=%d\n",
1852 pdata
->gpio_sda
, err
);
1856 err
= gpio_request(pdata
->gpio_sck
, dev_name(&pdev
->dev
));
1858 dev_err(&pdev
->dev
, "gpio_request failed for %u, err=%d\n",
1859 pdata
->gpio_sck
, err
);
1865 spin_lock_init(&smi
->lock
);
1867 platform_set_drvdata(pdev
, smi
);
1869 dev_info(&pdev
->dev
, "using GPIO pins %u (SDA) and %u (SCK)\n",
1870 pdata
->gpio_sda
, pdata
->gpio_sck
);
1872 err
= rtl8366_smi_setup(smi
);
1874 goto err_clear_drvdata
;
1876 err
= rtl8366_smi_mii_init(smi
);
1878 goto err_clear_drvdata
;
1880 err
= rtl8366_smi_switch_init(smi
);
1882 goto err_mii_cleanup
;
1887 rtl8366_smi_mii_cleanup(smi
);
1889 platform_set_drvdata(pdev
, NULL
);
1890 gpio_free(pdata
->gpio_sck
);
1892 gpio_free(pdata
->gpio_sda
);
1899 int rtl8366_phy_config_init(struct phy_device
*phydev
)
1901 if (!rtl8366_smi_mii_bus_match(phydev
->bus
))
1907 int rtl8366_phy_config_aneg(struct phy_device
*phydev
)
1912 static struct phy_driver rtl8366_smi_phy_driver
= {
1913 .phy_id
= 0x001cc960,
1914 .name
= "Realtek RTL8366",
1915 .phy_id_mask
= 0x1ffffff0,
1916 .features
= PHY_GBIT_FEATURES
,
1917 .config_aneg
= rtl8366_phy_config_aneg
,
1918 .config_init
= rtl8366_phy_config_init
,
1919 .read_status
= genphy_read_status
,
1921 .owner
= THIS_MODULE
,
1925 static int __devexit
rtl8366_smi_remove(struct platform_device
*pdev
)
1927 struct rtl8366_smi
*smi
= platform_get_drvdata(pdev
);
1930 struct rtl8366_smi_platform_data
*pdata
;
1932 pdata
= pdev
->dev
.platform_data
;
1934 rtl8366_smi_switch_cleanup(smi
);
1935 rtl8366_debugfs_remove(smi
);
1936 rtl8366_smi_mii_cleanup(smi
);
1937 platform_set_drvdata(pdev
, NULL
);
1938 gpio_free(pdata
->gpio_sck
);
1939 gpio_free(pdata
->gpio_sda
);
1946 static struct platform_driver rtl8366_smi_driver
= {
1948 .name
= RTL8366_SMI_DRIVER_NAME
,
1949 .owner
= THIS_MODULE
,
1951 .probe
= rtl8366_smi_probe
,
1952 .remove
= __devexit_p(rtl8366_smi_remove
),
1955 static int __init
rtl8366_smi_init(void)
1958 ret
= platform_driver_register(&rtl8366_smi_driver
);
1962 ret
= phy_driver_register(&rtl8366_smi_phy_driver
);
1964 goto err_platform_unregister
;
1968 err_platform_unregister
:
1969 platform_driver_unregister(&rtl8366_smi_driver
);
1972 module_init(rtl8366_smi_init
);
1974 static void __exit
rtl8366_smi_exit(void)
1976 phy_driver_unregister(&rtl8366_smi_phy_driver
);
1977 platform_driver_unregister(&rtl8366_smi_driver
);
1979 module_exit(rtl8366_smi_exit
);
1981 MODULE_DESCRIPTION(RTL8366_SMI_DRIVER_DESC
);
1982 MODULE_VERSION(RTL8366_SMI_DRIVER_VER
);
1983 MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
1984 MODULE_AUTHOR("Antti Seppälä <a.seppala@gmail.com>");
1985 MODULE_LICENSE("GPL v2");
1986 MODULE_ALIAS("platform:" RTL8366_SMI_DRIVER_NAME
);