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];
213 struct dentry *debugfs_root;
221 #define to_rtl8366(_dev) container_of(_dev, struct rtl8366_smi, dev)
223 static inline void rtl8366_smi_clk_delay(struct rtl8366_smi *smi)
225 ndelay(RTL8366_SMI_CLK_DELAY);
228 static void rtl8366_smi_start(struct rtl8366_smi *smi)
230 unsigned int sda = smi->pdata->gpio_sda;
231 unsigned int sck = smi->pdata->gpio_sck;
234 * Set GPIO pins to output mode, with initial state:
237 gpio_direction_output(sck, 0);
238 gpio_direction_output(sda, 1);
239 rtl8366_smi_clk_delay(smi);
241 /* CLK 1: 0 -> 1, 1 -> 0 */
242 gpio_set_value(sck, 1);
243 rtl8366_smi_clk_delay(smi);
244 gpio_set_value(sck, 0);
245 rtl8366_smi_clk_delay(smi);
248 gpio_set_value(sck, 1);
249 rtl8366_smi_clk_delay(smi);
250 gpio_set_value(sda, 0);
251 rtl8366_smi_clk_delay(smi);
252 gpio_set_value(sck, 0);
253 rtl8366_smi_clk_delay(smi);
254 gpio_set_value(sda, 1);
257 static void rtl8366_smi_stop(struct rtl8366_smi *smi)
259 unsigned int sda = smi->pdata->gpio_sda;
260 unsigned int sck = smi->pdata->gpio_sck;
262 rtl8366_smi_clk_delay(smi);
263 gpio_set_value(sda, 0);
264 gpio_set_value(sck, 1);
265 rtl8366_smi_clk_delay(smi);
266 gpio_set_value(sda, 1);
267 rtl8366_smi_clk_delay(smi);
268 gpio_set_value(sck, 1);
269 rtl8366_smi_clk_delay(smi);
270 gpio_set_value(sck, 0);
271 rtl8366_smi_clk_delay(smi);
272 gpio_set_value(sck, 1);
275 rtl8366_smi_clk_delay(smi);
276 gpio_set_value(sck, 0);
277 rtl8366_smi_clk_delay(smi);
278 gpio_set_value(sck, 1);
280 /* set GPIO pins to input mode */
281 gpio_direction_input(sda);
282 gpio_direction_input(sck);
285 static void rtl8366_smi_write_bits(struct rtl8366_smi *smi, u32 data, u32 len)
287 unsigned int sda = smi->pdata->gpio_sda;
288 unsigned int sck = smi->pdata->gpio_sck;
290 for (; len > 0; len--) {
291 rtl8366_smi_clk_delay(smi);
294 if ( data & ( 1 << (len - 1)) )
295 gpio_set_value(sda, 1);
297 gpio_set_value(sda, 0);
298 rtl8366_smi_clk_delay(smi);
301 gpio_set_value(sck, 1);
302 rtl8366_smi_clk_delay(smi);
303 gpio_set_value(sck, 0);
307 static void rtl8366_smi_read_bits(struct rtl8366_smi *smi, u32 len, u32 *data)
309 unsigned int sda = smi->pdata->gpio_sda;
310 unsigned int sck = smi->pdata->gpio_sck;
312 gpio_direction_input(sda);
314 for (*data = 0; len > 0; len--) {
317 rtl8366_smi_clk_delay(smi);
320 gpio_set_value(sck, 1);
321 rtl8366_smi_clk_delay(smi);
322 u = gpio_get_value(sda);
323 gpio_set_value(sck, 0);
325 *data |= (u << (len - 1));
328 gpio_direction_output(sda, 0);
331 static int rtl8366_smi_wait_for_ack(struct rtl8366_smi *smi)
339 rtl8366_smi_read_bits(smi, 1, &ack);
343 if (++retry_cnt > RTL8366_SMI_ACK_RETRY_COUNT)
350 static int rtl8366_smi_write_byte(struct rtl8366_smi *smi, u8 data)
352 rtl8366_smi_write_bits(smi, data, 8);
353 return rtl8366_smi_wait_for_ack(smi);
356 static int rtl8366_smi_read_byte0(struct rtl8366_smi *smi, u8 *data)
361 rtl8366_smi_read_bits(smi, 8, &t);
365 rtl8366_smi_write_bits(smi, 0x00, 1);
370 static int rtl8366_smi_read_byte1(struct rtl8366_smi *smi, u8 *data)
375 rtl8366_smi_read_bits(smi, 8, &t);
379 rtl8366_smi_write_bits(smi, 0x01, 1);
384 static int rtl8366_smi_read_reg(struct rtl8366_smi *smi, u32 addr, u32 *data)
391 spin_lock_irqsave(&smi->lock, flags);
393 rtl8366_smi_start(smi);
395 /* send READ command */
396 ret = rtl8366_smi_write_byte(smi, 0x0a << 4 | 0x04 << 1 | 0x01);
401 ret = rtl8366_smi_write_byte(smi, addr & 0xff);
406 ret = rtl8366_smi_write_byte(smi, addr >> 8);
411 rtl8366_smi_read_byte0(smi, &lo);
412 /* read DATA[15:8] */
413 rtl8366_smi_read_byte1(smi, &hi);
415 *data = ((u32) lo) | (((u32) hi) << 8);
420 rtl8366_smi_stop(smi);
421 spin_unlock_irqrestore(&smi->lock, flags);
426 static int rtl8366_smi_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data)
431 spin_lock_irqsave(&smi->lock, flags);
433 rtl8366_smi_start(smi);
435 /* send WRITE command */
436 ret = rtl8366_smi_write_byte(smi, 0x0a << 4 | 0x04 << 1 | 0x00);
441 ret = rtl8366_smi_write_byte(smi, addr & 0xff);
446 ret = rtl8366_smi_write_byte(smi, addr >> 8);
450 /* write DATA[7:0] */
451 ret = rtl8366_smi_write_byte(smi, data & 0xff);
455 /* write DATA[15:8] */
456 ret = rtl8366_smi_write_byte(smi, data >> 8);
463 rtl8366_smi_stop(smi);
464 spin_unlock_irqrestore(&smi->lock, flags);
469 static int rtl8366_smi_read_phy_reg(struct rtl8366_smi *smi,
470 u32 phy_no, u32 page, u32 addr, u32 *data)
475 if (phy_no > RTL8366S_PHY_NO_MAX)
478 if (page > RTL8366S_PHY_PAGE_MAX)
481 if (addr > RTL8366S_PHY_ADDR_MAX)
484 ret = rtl8366_smi_write_reg(smi, RTL8366S_PHY_ACCESS_CTRL_REG,
485 RTL8366S_PHY_CTRL_READ);
489 reg = 0x8000 | (1 << (phy_no + RTL8366S_PHY_NO_OFFSET)) |
490 ((page << RTL8366S_PHY_PAGE_OFFSET) & RTL8366S_PHY_PAGE_MASK) |
491 (addr & RTL8366S_PHY_REG_MASK);
493 ret = rtl8366_smi_write_reg(smi, reg, 0);
497 ret = rtl8366_smi_read_reg(smi, RTL8366S_PHY_ACCESS_DATA_REG, data);
504 static int rtl8366_smi_write_phy_reg(struct rtl8366_smi *smi,
505 u32 phy_no, u32 page, u32 addr, u32 data)
510 if (phy_no > RTL8366S_PHY_NO_MAX)
513 if (page > RTL8366S_PHY_PAGE_MAX)
516 if (addr > RTL8366S_PHY_ADDR_MAX)
519 ret = rtl8366_smi_write_reg(smi, RTL8366S_PHY_ACCESS_CTRL_REG,
520 RTL8366S_PHY_CTRL_WRITE);
524 reg = 0x8000 | (1 << (phy_no + RTL8366S_PHY_NO_OFFSET)) |
525 ((page << RTL8366S_PHY_PAGE_OFFSET) & RTL8366S_PHY_PAGE_MASK) |
526 (addr & RTL8366S_PHY_REG_MASK);
528 ret = rtl8366_smi_write_reg(smi, reg, data);
535 static int rtl8366_get_mib_counter(struct rtl8366_smi *smi, int counter,
536 int port, unsigned long long *val)
540 u32 addr, data, regoffset;
543 /* address offset to MIBs counter */
544 const u16 mibLength[RTL8366S_MIB_COUNT] = {4, 4, 2, 2, 2, 2, 2, 2, 2,
545 2, 2, 2, 2, 2, 2, 2, 2, 2,
546 2, 2, 4, 2, 2, 2, 2, 2, 2,
549 if (port > RTL8366_NUM_PORTS || counter >= RTL8366S_MIB_COUNT)
553 regoffset = RTL8366S_MIB_COUNTER_PORT_OFFSET * (port);
555 while (i < counter) {
556 regoffset += mibLength[i];
560 addr = RTL8366S_MIB_COUNTER_BASE + regoffset;
563 /* writing access counter address first */
564 /* then ASIC will prepare 64bits counter wait for being retrived */
565 data = 0;/* writing data will be discard by ASIC */
566 err = rtl8366_smi_write_reg(smi, addr, data);
570 /* read MIB control register */
571 err = rtl8366_smi_read_reg(smi, RTL8366S_MIB_CTRL_REG, &data);
575 if (data & RTL8366S_MIB_CTRL_BUSY_MASK)
578 if (data & RTL8366S_MIB_CTRL_RESET_MASK)
582 addr = addr + mibLength[counter] - 1;
583 i = mibLength[counter];
586 err = rtl8366_smi_read_reg(smi, addr, &data);
590 mibvalue = (mibvalue << 16) | (data & 0xFFFF);
600 static int rtl8366s_get_vlan_4k_entry(struct rtl8366_smi *smi, u32 vid,
601 struct rtl8366s_vlan4kentry *vlan4k)
607 memset(vlan4k, '\0', sizeof(struct rtl8366s_vlan4kentry));
610 if (vid >= RTL8366_NUM_VIDS)
613 tableaddr = (u16 *)vlan4k;
617 err = rtl8366_smi_write_reg(smi, RTL8366S_VLAN_TABLE_WRITE_BASE, data);
621 /* write table access control word */
622 err = rtl8366_smi_write_reg(smi, RTL8366S_TABLE_ACCESS_CTRL_REG,
623 RTL8366S_TABLE_VLAN_READ_CTRL);
627 err = rtl8366_smi_read_reg(smi, RTL8366S_VLAN_TABLE_READ_BASE, &data);
634 err = rtl8366_smi_read_reg(smi, RTL8366S_VLAN_TABLE_READ_BASE + 1,
645 static int rtl8366s_set_vlan_4k_entry(struct rtl8366_smi *smi,
646 const struct rtl8366s_vlan4kentry *vlan4k)
652 if (vlan4k->vid >= RTL8366_NUM_VIDS ||
653 vlan4k->member > RTL8366_PORT_ALL ||
654 vlan4k->untag > RTL8366_PORT_ALL ||
655 vlan4k->fid > RTL8366S_FIDMAX)
658 tableaddr = (u16 *)vlan4k;
662 err = rtl8366_smi_write_reg(smi, RTL8366S_VLAN_TABLE_WRITE_BASE, data);
670 rtl8366_smi_write_reg(smi, RTL8366S_VLAN_TABLE_WRITE_BASE + 1, data);
673 /* write table access control word */
674 err = rtl8366_smi_write_reg(smi, RTL8366S_TABLE_ACCESS_CTRL_REG,
675 RTL8366S_TABLE_VLAN_WRITE_CTRL);
682 static int rtl8366s_get_vlan_member_config(struct rtl8366_smi *smi, u32 index,
683 struct rtl8366s_vlanconfig
691 if (index >= RTL8366_NUM_VLANS)
694 tableaddr = (u16 *)vlanmconf;
696 addr = RTL8366S_VLAN_MEMCONF_BASE + (index << 1);
698 err = rtl8366_smi_read_reg(smi, addr, &data);
705 addr = RTL8366S_VLAN_MEMCONF_BASE + 1 + (index << 1);
707 err = rtl8366_smi_read_reg(smi, addr, &data);
716 static int rtl8366s_set_vlan_member_config(struct rtl8366_smi *smi, u32 index,
717 const struct rtl8366s_vlanconfig
725 if (index >= RTL8366_NUM_VLANS ||
726 vlanmconf->vid >= RTL8366_NUM_VIDS ||
727 vlanmconf->priority > RTL8366S_PRIORITYMAX ||
728 vlanmconf->member > RTL8366_PORT_ALL ||
729 vlanmconf->untag > RTL8366_PORT_ALL ||
730 vlanmconf->fid > RTL8366S_FIDMAX)
733 addr = RTL8366S_VLAN_MEMCONF_BASE + (index << 1);
736 tableaddr = (u16 *)vlanmconf;
739 err = rtl8366_smi_write_reg(smi, addr, data);
743 addr = RTL8366S_VLAN_MEMCONF_BASE + 1 + (index << 1);
748 err = rtl8366_smi_write_reg(smi, addr, data);
755 static int rtl8366_get_port_vlan_index(struct rtl8366_smi *smi, int port,
762 /* bits mapping to port vlan control register of port n */
763 const u16 bits[RTL8366_NUM_PORTS] = { 0x000F, 0x00F0, 0x0F00,
764 0xF000, 0x000F, 0x00F0 };
765 /* bits offset to port vlan control register of port n */
766 const u16 bitoffset[RTL8366_NUM_PORTS] = { 0, 4, 8, 12, 0, 4 };
767 /* address offset to port vlan control register of port n */
768 const u16 addroffset[RTL8366_NUM_PORTS] = { 0, 0, 0, 0, 1, 1 };
770 if (port >= RTL8366_NUM_PORTS)
773 addr = RTL8366S_PORT_VLAN_CTRL_BASE + addroffset[port];
775 err = rtl8366_smi_read_reg(smi, addr, &data);
779 *val = (data & bits[port]) >> bitoffset[port];
785 static int rtl8366_get_vlan_port_pvid(struct rtl8366_smi *smi, int port,
790 struct rtl8366s_vlanconfig vlanMC;
792 memset(&vlanMC, '\0', sizeof(struct rtl8366s_vlanconfig));
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)
858 /* Updating the 4K entry; lookup it and change the port member set */
859 rtl8366s_get_vlan_4k_entry(smi, val, &vlan4K);
860 vlan4K.member |= ((1 << port) | RTL8366_PORT_CPU);
861 vlan4K.untag = RTL8366_PORT_ALL_BUT_CPU;
862 rtl8366s_set_vlan_4k_entry(smi, &vlan4K);
864 /* For the 16 entries more work needs to be done. First see if such
865 VID is already there and change it */
866 for (i = 0; i < RTL8366_NUM_VLANS; ++i) {
867 memset(&vlanMC, '\0', sizeof(struct rtl8366s_vlanconfig));
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 memset(&vlanMC, '\0', sizeof(struct rtl8366s_vlanconfig));
886 rtl8366s_get_vlan_member_config(smi, i, &vlanMC);
888 /* See if this vlan member configuration is unused. It is
889 unused if member set contains no ports or CPU port only */
890 if (!vlanMC.member || vlanMC.member == RTL8366_PORT_CPU) {
893 vlanMC.untag = RTL8366_PORT_ALL_BUT_CPU;
894 vlanMC.member = ((1 << port) | RTL8366_PORT_CPU);
897 rtl8366s_set_vlan_member_config(smi, i, &vlanMC);
899 /* Now update PVID register settings */
900 rtl8366_set_port_vlan_index(smi, port, i);
906 dev_err(&smi->pdev->dev, "All 16 vlan member configurations are in "
912 static int rtl8366_vlan_set_vlan(struct rtl8366_smi *smi, int enable)
915 rtl8366_smi_read_reg(smi, RTL8366_CHIP_GLOBAL_CTRL_REG, &data);
917 data &= ~(data & RTL8366_CHIP_CTRL_VLAN);
919 data |= RTL8366_CHIP_CTRL_VLAN;
921 return rtl8366_smi_write_reg(smi, RTL8366_CHIP_GLOBAL_CTRL_REG, data);
924 static int rtl8366_vlan_set_4ktable(struct rtl8366_smi *smi, int enable)
927 rtl8366_smi_read_reg(smi, RTL8366S_VLAN_TB_CTRL_REG, &data);
933 return rtl8366_smi_write_reg(smi, RTL8366S_VLAN_TB_CTRL_REG, data);
936 static int rtl8366s_reset_vlan(struct rtl8366_smi *smi)
939 struct rtl8366s_vlan4kentry vlan4K;
940 struct rtl8366s_vlanconfig vlanMC;
942 /* clear 16 VLAN member configuration */
943 for (i = 0; i < RTL8366_NUM_VLANS; i++) {
949 if (rtl8366s_set_vlan_member_config(smi, i, &vlanMC) != 0)
953 /* Set a default VLAN with vid 1 to 4K table for all ports */
955 vlan4K.member = RTL8366_PORT_ALL;
956 vlan4K.untag = RTL8366_PORT_ALL;
958 if (rtl8366s_set_vlan_4k_entry(smi, &vlan4K) != 0)
961 /* Set all ports PVID to default VLAN */
962 for (i = 0; i < RTL8366_NUM_PORTS; i++) {
963 if (rtl8366_set_vlan_port_pvid(smi, i, 0) != 0)
971 static int rtl8366_debugfs_open(struct inode *inode, struct file *file)
973 file->private_data = inode->i_private;
977 static ssize_t rtl8366_read_debugfs_mibs(struct file *file,
978 char __user *user_buf,
979 size_t count, loff_t *ppos)
983 struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
985 len += snprintf(buf + len, sizeof(buf) - len, "MIB Counters:\n");
986 len += snprintf(buf + len, sizeof(buf) - len, "Counter"
988 "Port 0 \t\t Port 1 \t\t Port 2 \t\t Port 3 \t\t "
991 for (i = 0; i < 33; ++i) {
993 len += snprintf(buf + len, sizeof(buf) - len, "%d:%s ",
995 for (j = 0; j < RTL8366_NUM_PORTS; ++j) {
996 unsigned long long counter = 0;
998 if (!rtl8366_get_mib_counter(smi, i, j, &counter))
999 len += snprintf(buf + len, sizeof(buf) - len,
1002 len += snprintf(buf + len, sizeof(buf) - len,
1005 if (j != RTL8366_NUM_PORTS - 1) {
1006 if (counter < 100000)
1007 len += snprintf(buf + len,
1011 len += snprintf(buf + len, sizeof(buf) - len,
1015 len += snprintf(buf + len, sizeof(buf) - len, "\n");
1018 len += snprintf(buf + len, sizeof(buf) - len, "\n");
1020 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1023 static ssize_t rtl8366_read_debugfs_vlan(struct file *file,
1024 char __user *user_buf,
1025 size_t count, loff_t *ppos)
1029 struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
1031 len += snprintf(buf + len, sizeof(buf) - len, "VLAN Member Config:\n");
1032 len += snprintf(buf + len, sizeof(buf) - len,
1033 "\t id \t vid \t prio \t member \t untag \t fid "
1036 for (i = 0; i < RTL8366_NUM_VLANS; ++i) {
1037 struct rtl8366s_vlanconfig vlanMC;
1038 memset(&vlanMC, '\0', sizeof(struct rtl8366s_vlanconfig));
1039 rtl8366s_get_vlan_member_config(smi, i, &vlanMC);
1041 len += snprintf(buf + len, sizeof(buf) - len,
1042 "\t[%d] \t %d \t %d \t 0x%04x \t 0x%04x \t %d "
1043 "\t", i, vlanMC.vid, vlanMC.priority,
1044 vlanMC.member, vlanMC.untag, vlanMC.fid);
1046 for (j = 0; j < RTL8366_NUM_PORTS; ++j) {
1048 if (!rtl8366_get_port_vlan_index(smi, j, &index)) {
1050 len += snprintf(buf + len,
1055 len += snprintf(buf + len, sizeof(buf) - len, "\n");
1058 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1061 static ssize_t rtl8366_read_debugfs_reg(struct file *file,
1062 char __user *user_buf,
1063 size_t count, loff_t *ppos)
1065 u32 t, reg = g_dbg_reg;
1068 struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
1070 memset(buf, '\0', sizeof(buf));
1072 err = rtl8366_smi_read_reg(smi, reg, &t);
1074 len += snprintf(buf, sizeof(buf),
1075 "Read failed (reg: 0x%04x)\n", reg);
1076 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1079 len += snprintf(buf, sizeof(buf), "reg = 0x%04x, val = 0x%04x\n",
1082 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1085 static ssize_t rtl8366_write_debugfs_reg(struct file *file,
1086 const char __user *user_buf,
1087 size_t count, loff_t *ppos)
1090 u32 reg = g_dbg_reg;
1094 struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
1096 len = min(count, sizeof(buf) - 1);
1097 if (copy_from_user(buf, user_buf, len)) {
1098 dev_err(&smi->pdev->dev, "copy from user failed\n");
1103 if (len > 0 && buf[len - 1] == '\n')
1104 buf[len - 1] = '\0';
1107 if (strict_strtoul(buf, 16, &data)) {
1108 dev_err(&smi->pdev->dev, "Invalid reg value %s\n", buf);
1110 err = rtl8366_smi_write_reg(smi, reg, data);
1112 dev_err(&smi->pdev->dev,
1113 "writing reg 0x%04x val 0x%04lx failed\n",
1121 static const struct file_operations fops_rtl8366_regs = {
1122 .read = rtl8366_read_debugfs_reg,
1123 .write = rtl8366_write_debugfs_reg,
1124 .open = rtl8366_debugfs_open,
1125 .owner = THIS_MODULE
1128 static const struct file_operations fops_rtl8366_vlan = {
1129 .read = rtl8366_read_debugfs_vlan,
1130 .open = rtl8366_debugfs_open,
1131 .owner = THIS_MODULE
1134 static const struct file_operations fops_rtl8366_mibs = {
1135 .read = rtl8366_read_debugfs_mibs,
1136 .open = rtl8366_debugfs_open,
1137 .owner = THIS_MODULE
1140 static void rtl8366_debugfs_init(struct rtl8366_smi *smi)
1142 struct dentry *node;
1143 struct dentry *root;
1145 if (!smi->debugfs_root)
1146 smi->debugfs_root = debugfs_create_dir("rtl8366s", NULL);
1148 if (!smi->debugfs_root) {
1149 dev_err(&smi->pdev->dev, "Unable to create debugfs dir\n");
1152 root = smi->debugfs_root;
1154 node = debugfs_create_x16("reg", S_IRUGO | S_IWUSR, root, &g_dbg_reg);
1156 dev_err(&smi->pdev->dev, "Creating debugfs file reg failed\n");
1160 node = debugfs_create_file("val", S_IRUGO | S_IWUSR, root, smi,
1161 &fops_rtl8366_regs);
1163 dev_err(&smi->pdev->dev, "Creating debugfs file val failed\n");
1167 node = debugfs_create_file("vlan", S_IRUSR, root, smi,
1168 &fops_rtl8366_vlan);
1170 dev_err(&smi->pdev->dev, "Creating debugfs file vlan "
1175 node = debugfs_create_file("mibs", S_IRUSR, root, smi,
1176 &fops_rtl8366_mibs);
1178 dev_err(&smi->pdev->dev, "Creating debugfs file mibs "
1184 static void rtl8366_debugfs_remove(struct rtl8366_smi *smi)
1186 if (smi->debugfs_root) {
1187 debugfs_remove_recursive(smi->debugfs_root);
1188 smi->debugfs_root = NULL;
1193 static inline void rtl8366_debugfs_init(struct rtl8366_smi *smi) {}
1194 static inline void rtl8366_debugfs_remove(struct rtl8366_smi *smi) {}
1197 static int rtl8366_global_reset_mibs(struct switch_dev *dev,
1198 const struct switch_attr *attr,
1199 struct switch_val *val)
1202 struct rtl8366_smi *smi = to_rtl8366(dev);
1204 if (val->value.i == 1) {
1205 rtl8366_smi_read_reg(smi, RTL8366S_MIB_CTRL_REG, &data);
1207 rtl8366_smi_write_reg(smi, RTL8366S_MIB_CTRL_REG, data);
1213 static int rtl8366_get_vlan(struct switch_dev *dev,
1214 const struct switch_attr *attr,
1215 struct switch_val *val)
1218 struct rtl8366_smi *smi = to_rtl8366(dev);
1220 if (attr->ofs == 1) {
1221 rtl8366_smi_read_reg(smi, RTL8366_CHIP_GLOBAL_CTRL_REG, &data);
1223 if (data & RTL8366_CHIP_CTRL_VLAN)
1227 } else if (attr->ofs == 2) {
1228 rtl8366_smi_read_reg(smi, RTL8366S_VLAN_TB_CTRL_REG, &data);
1239 static int rtl8366_global_get_blinkrate(struct switch_dev *dev,
1240 const struct switch_attr *attr,
1241 struct switch_val *val)
1244 struct rtl8366_smi *smi = to_rtl8366(dev);
1245 rtl8366_smi_read_reg(smi, RTL8366_LED_BLINKRATE_REG, &data);
1247 val->value.i = (data & (RTL8366_LED_BLINKRATE_MASK));
1252 static int rtl8366_global_set_blinkrate(struct switch_dev *dev,
1253 const struct switch_attr *attr,
1254 struct switch_val *val)
1257 struct rtl8366_smi *smi = to_rtl8366(dev);
1259 if (val->value.i >= 6)
1262 rtl8366_smi_read_reg(smi, RTL8366_LED_BLINKRATE_REG, &data);
1264 data &= ~(data & RTL8366_LED_BLINKRATE_MASK);
1265 data |= val->value.i;
1267 rtl8366_smi_write_reg(smi, RTL8366_LED_BLINKRATE_REG, data);
1272 static int rtl8366_set_vlan(struct switch_dev *dev,
1273 const struct switch_attr *attr,
1274 struct switch_val *val)
1276 struct rtl8366_smi *smi = to_rtl8366(dev);
1279 return rtl8366_vlan_set_vlan(smi, val->value.i);
1281 return rtl8366_vlan_set_4ktable(smi, val->value.i);
1284 static int rtl8366_init_vlan(struct switch_dev *dev,
1285 const struct switch_attr *attr,
1286 struct switch_val *val)
1288 struct rtl8366_smi *smi = to_rtl8366(dev);
1289 return rtl8366s_reset_vlan(smi);
1292 static int rtl8366_attr_get_port_link(struct switch_dev *dev,
1293 const struct switch_attr *attr,
1294 struct switch_val *val)
1297 u32 len = 0, data = 0;
1298 int speed, duplex, link, txpause, rxpause, nway;
1299 struct rtl8366_smi *smi = to_rtl8366(dev);
1301 if (val->port_vlan >= RTL8366_NUM_PORTS)
1304 memset(buf, '\0', sizeof(buf));
1305 rtl8366_smi_read_reg(smi, RTL8366S_PORT_LINK_STATUS_BASE +
1306 (val->port_vlan >> 1),
1309 if (val->port_vlan & 0x1)
1312 speed = (data & RTL8366S_PORT_STATUS_SPEED_MASK);
1313 duplex = (data & RTL8366S_PORT_STATUS_DUPLEX_MASK) >> 2;
1314 link = (data & RTL8366S_PORT_STATUS_LINK_MASK) >> 4;
1315 txpause = (data & RTL8366S_PORT_STATUS_TXPAUSE_MASK) >> 5;
1316 rxpause = (data & RTL8366S_PORT_STATUS_RXPAUSE_MASK) >> 6;
1317 nway = (data & RTL8366S_PORT_STATUS_AN_MASK) >> 7;
1319 len += snprintf(buf + len, sizeof(buf) - len, "Port %d: ",
1323 len += snprintf(buf + len, sizeof(buf) - len,
1324 "Link UP, Speed: ");
1326 len += snprintf(buf + len, sizeof(buf) - len,
1327 "Link DOWN, Speed: ");
1330 len += snprintf(buf + len, sizeof(buf) - len, "10Base-TX ");
1331 else if (speed == 1)
1332 len += snprintf(buf + len, sizeof(buf) - len, "100Base-TX ");
1333 else if (speed == 2)
1334 len += snprintf(buf + len, sizeof(buf) - len, "1000Base-TX ");
1337 len += snprintf(buf + len, sizeof(buf) - len, "Full-Duplex, ");
1339 len += snprintf(buf + len, sizeof(buf) - len, "Half-Duplex, ");
1342 len += snprintf(buf + len, sizeof(buf) - len, "TX-Pause ");
1344 len += snprintf(buf + len, sizeof(buf) - len, "RX-Pause ");
1346 len += snprintf(buf + len, sizeof(buf) - len, "nway ");
1354 static int rtl8366_attr_get_vlan_info(struct switch_dev *dev,
1355 const struct switch_attr *attr,
1356 struct switch_val *val)
1361 struct rtl8366s_vlanconfig vlanMC;
1362 struct rtl8366s_vlan4kentry vlan4K;
1363 struct rtl8366_smi *smi = to_rtl8366(dev);
1365 if (val->port_vlan >= RTL8366_NUM_PORTS)
1368 memset(buf, '\0', sizeof(buf));
1369 memset(&vlanMC, '\0', sizeof(struct rtl8366s_vlanconfig));
1371 rtl8366s_get_vlan_member_config(smi, val->port_vlan, &vlanMC);
1372 rtl8366s_get_vlan_4k_entry(smi, vlanMC.vid, &vlan4K);
1374 len += snprintf(buf + len, sizeof(buf) - len, "VLAN %d: Ports: ",
1377 for (i = 0; i < RTL8366_NUM_PORTS; ++i) {
1379 if (!rtl8366_get_port_vlan_index(smi, i, &index) &&
1380 index == val->port_vlan)
1381 len += snprintf(buf + len, sizeof(buf) - len, "%d", i);
1383 len += snprintf(buf + len, sizeof(buf) - len, "\n");
1385 len += snprintf(buf + len, sizeof(buf) - len,
1386 "\t\t vid \t prio \t member \t untag \t fid\n");
1387 len += snprintf(buf + len, sizeof(buf) - len, "\tMC:\t");
1388 len += snprintf(buf + len, sizeof(buf) - len,
1389 "%d \t %d \t 0x%04x \t 0x%04x \t %d\n",
1390 vlanMC.vid, vlanMC.priority, vlanMC.member,
1391 vlanMC.untag, vlanMC.fid);
1392 len += snprintf(buf + len, sizeof(buf) - len, "\t4K:\t");
1393 len += snprintf(buf + len, sizeof(buf) - len,
1394 "%d \t \t 0x%04x \t 0x%04x \t %d",
1395 vlan4K.vid, vlan4K.member, vlan4K.untag, vlan4K.fid);
1403 static int rtl8366_set_port_led(struct switch_dev *dev,
1404 const struct switch_attr *attr,
1405 struct switch_val *val)
1408 struct rtl8366_smi *smi = to_rtl8366(dev);
1409 if (val->port_vlan >= RTL8366_NUM_PORTS ||
1410 (1 << val->port_vlan) == RTL8366_PORT_UNKNOWN)
1413 if (val->port_vlan == RTL8366_PORT_NUM_CPU) {
1414 rtl8366_smi_read_reg(smi, RTL8366_LED_BLINKRATE_REG, &data);
1415 data = (data & (~(0xF << 4))) | (val->value.i << 4);
1416 rtl8366_smi_write_reg(smi, RTL8366_LED_BLINKRATE_REG, data);
1418 rtl8366_smi_read_reg(smi, RTL8366_LED_CTRL_REG, &data);
1419 data = (data & (~(0xF << (val->port_vlan * 4)))) |
1420 (val->value.i << (val->port_vlan * 4));
1421 rtl8366_smi_write_reg(smi, RTL8366_LED_CTRL_REG, data);
1427 static int rtl8366_get_port_led(struct switch_dev *dev,
1428 const struct switch_attr *attr,
1429 struct switch_val *val)
1432 struct rtl8366_smi *smi = to_rtl8366(dev);
1433 if (val->port_vlan >= RTL8366_NUM_LEDGROUPS)
1436 rtl8366_smi_read_reg(smi, RTL8366_LED_CTRL_REG, &data);
1437 val->value.i = (data >> (val->port_vlan * 4)) & 0x000F;
1442 static int rtl8366_reset_port_mibs(struct switch_dev *dev,
1443 const struct switch_attr *attr,
1444 struct switch_val *val)
1447 struct rtl8366_smi *smi = to_rtl8366(dev);
1448 if (val->port_vlan >= RTL8366_NUM_PORTS)
1451 rtl8366_smi_read_reg(smi, RTL8366S_MIB_CTRL_REG, &data);
1452 data |= (1 << (val->port_vlan + 3));
1453 rtl8366_smi_write_reg(smi, RTL8366S_MIB_CTRL_REG, data);
1458 static int rtl8366_get_port_mib(struct switch_dev *dev,
1459 const struct switch_attr *attr,
1460 struct switch_val *val)
1464 unsigned long long counter = 0;
1465 struct rtl8366_smi *smi = to_rtl8366(dev);
1466 if (val->port_vlan >= RTL8366_NUM_PORTS)
1469 len += snprintf(buf + len, sizeof(buf) - len, "Port %d MIB counters\n",
1471 for (i = 0; i < RTL8366S_MIB_COUNT; ++i) {
1473 len += snprintf(buf + len, sizeof(buf) - len,
1474 "%d:%s\t", i, MIBCOUNTERS[i]);
1475 if (!rtl8366_get_mib_counter(smi, i, val->port_vlan, &counter))
1476 len += snprintf(buf + len, sizeof(buf) - len,
1477 "[%llu]\n", counter);
1479 len += snprintf(buf + len, sizeof(buf) - len,
1488 static int rtl8366_set_member(struct switch_dev *dev,
1489 const struct switch_attr *attr,
1490 struct switch_val *val)
1492 struct rtl8366s_vlanconfig vlanMC;
1493 struct rtl8366s_vlan4kentry vlan4K;
1494 struct rtl8366_smi *smi = to_rtl8366(dev);
1495 memset(&vlanMC, '\0', sizeof(struct rtl8366s_vlanconfig));
1497 if (val->port_vlan >= RTL8366_NUM_VLANS)
1500 rtl8366s_get_vlan_member_config(smi, val->port_vlan, &vlanMC);
1502 rtl8366s_get_vlan_4k_entry(smi, vlanMC.vid, &vlan4K);
1504 vlan4K.member = vlanMC.member = val->value.i;
1505 rtl8366s_set_vlan_member_config(smi, val->port_vlan, &vlanMC);
1506 rtl8366s_set_vlan_4k_entry(smi, &vlan4K);
1511 static int rtl8366_get_member(struct switch_dev *dev,
1512 const struct switch_attr *attr,
1513 struct switch_val *val)
1515 struct rtl8366s_vlanconfig vlanMC;
1516 struct rtl8366s_vlan4kentry vlan4K;
1517 struct rtl8366_smi *smi = to_rtl8366(dev);
1518 memset(&vlanMC, '\0', sizeof(struct rtl8366s_vlanconfig));
1520 if (val->port_vlan >= RTL8366_NUM_VLANS)
1523 rtl8366s_get_vlan_member_config(smi, val->port_vlan, &vlanMC);
1525 rtl8366s_get_vlan_4k_entry(smi, vlanMC.vid, &vlan4K);
1527 val->value.i = vlanMC.member;
1532 static int rtl8366_set_untag(struct switch_dev *dev,
1533 const struct switch_attr *attr,
1534 struct switch_val *val)
1536 struct rtl8366s_vlanconfig vlanMC;
1537 struct rtl8366s_vlan4kentry vlan4K;
1538 struct rtl8366_smi *smi = to_rtl8366(dev);
1539 memset(&vlanMC, '\0', sizeof(struct rtl8366s_vlanconfig));
1541 if (val->port_vlan >= RTL8366_NUM_VLANS)
1544 rtl8366s_get_vlan_member_config(smi, val->port_vlan, &vlanMC);
1545 rtl8366s_get_vlan_4k_entry(smi, vlanMC.vid, &vlan4K);
1547 vlan4K.untag = vlanMC.untag = val->value.i;
1548 rtl8366s_set_vlan_member_config(smi, val->port_vlan, &vlanMC);
1549 rtl8366s_set_vlan_4k_entry(smi, &vlan4K);
1554 static int rtl8366_get_untag(struct switch_dev *dev,
1555 const struct switch_attr *attr,
1556 struct switch_val *val)
1558 struct rtl8366s_vlanconfig vlanMC;
1559 struct rtl8366s_vlan4kentry vlan4K;
1560 struct rtl8366_smi *smi = to_rtl8366(dev);
1561 memset(&vlanMC, '\0', sizeof(struct rtl8366s_vlanconfig));
1563 if (val->port_vlan >= RTL8366_NUM_VLANS)
1566 rtl8366s_get_vlan_member_config(smi, val->port_vlan, &vlanMC);
1567 rtl8366s_get_vlan_4k_entry(smi, vlanMC.vid, &vlan4K);
1570 val->value.i = vlanMC.untag;
1575 static int rtl8366_get_port_pvid(struct switch_dev *dev, int port, int *val)
1577 struct rtl8366_smi *smi = to_rtl8366(dev);
1578 return rtl8366_get_vlan_port_pvid(smi, port, val);
1581 static int rtl8366_set_port_pvid(struct switch_dev *dev, int port, int val)
1583 struct rtl8366_smi *smi = to_rtl8366(dev);
1584 return rtl8366_set_vlan_port_pvid(smi, port, val);
1587 static int rtl8366_reset_switch(struct switch_dev *dev)
1589 struct rtl8366_smi *smi = to_rtl8366(dev);
1590 rtl8366_smi_write_reg(smi, RTL8366_RESET_CTRL_REG,
1591 RTL8366_CHIP_CTRL_RESET_HW);
1595 static struct switch_attr rtl8366_globals[] = {
1597 .type = SWITCH_TYPE_INT,
1598 .name = "enable_vlan",
1599 .description = "Enable VLAN mode",
1600 .set = rtl8366_set_vlan,
1601 .get = rtl8366_get_vlan,
1606 .type = SWITCH_TYPE_INT,
1607 .name = "enable_vlan4k",
1608 .description = "Enable VLAN 4K mode",
1609 .set = rtl8366_set_vlan,
1610 .get = rtl8366_get_vlan,
1615 .type = SWITCH_TYPE_INT,
1616 .name = "init_vlan",
1617 .description = "Initialize VLAN tables to defaults",
1618 .set = rtl8366_init_vlan,
1624 .type = SWITCH_TYPE_INT,
1625 .name = "reset_mibs",
1626 .description = "Reset all MIB counters",
1627 .set = rtl8366_global_reset_mibs,
1632 .type = SWITCH_TYPE_INT,
1633 .name = "blinkrate",
1634 .description = "Get/Set LED blinking rate (0 = 43ms, 1 = 84ms,"
1635 " 2 = 120ms, 3 = 170ms, 4 = 340ms, 5 = 670ms)",
1636 .set = rtl8366_global_set_blinkrate,
1637 .get = rtl8366_global_get_blinkrate,
1642 static struct switch_attr rtl8366_port[] = {
1644 .type = SWITCH_TYPE_STRING,
1646 .description = "Get port link information",
1649 .get = rtl8366_attr_get_port_link
1652 .type = SWITCH_TYPE_INT,
1653 .name = "reset_mib",
1654 .description = "Reset single port MIB counters",
1656 .set = rtl8366_reset_port_mibs,
1660 .type = SWITCH_TYPE_STRING,
1662 .description = "Get MIB counters for port",
1665 .get = rtl8366_get_port_mib
1668 .type = SWITCH_TYPE_INT,
1670 .description = "Get/Set port group (0 - 3) led mode (0 - 15)",
1672 .set = rtl8366_set_port_led,
1673 .get = rtl8366_get_port_led
1677 static struct switch_attr rtl8366_vlan[] = {
1679 .type = SWITCH_TYPE_INT,
1681 .description = "Get/Set VLAN untag port set (bitmask)",
1682 .set = rtl8366_set_untag,
1683 .get = rtl8366_get_untag,
1687 .type = SWITCH_TYPE_INT,
1689 .description = "Get/Set VLAN member port set (bitmask)",
1690 .set = rtl8366_set_member,
1691 .get = rtl8366_get_member,
1695 .type = SWITCH_TYPE_STRING,
1697 .description = "Get vlan information",
1700 .get = rtl8366_attr_get_vlan_info
1706 static struct switch_dev rtldev = {
1708 .cpu_port = RTL8366_PORT_NUM_CPU,
1709 .ports = RTL8366_NUM_PORTS,
1710 .vlans = RTL8366_NUM_VLANS,
1712 .attr = rtl8366_globals,
1713 .n_attr = ARRAY_SIZE(rtl8366_globals),
1716 .attr = rtl8366_port,
1717 .n_attr = ARRAY_SIZE(rtl8366_port),
1720 .attr = rtl8366_vlan,
1721 .n_attr = ARRAY_SIZE(rtl8366_vlan),
1724 .get_port_pvid = rtl8366_get_port_pvid,
1725 .set_port_pvid = rtl8366_set_port_pvid,
1726 .reset_switch = rtl8366_reset_switch,
1729 static int rtl8366_smi_mii_read(struct mii_bus *bus, int addr, int reg)
1731 struct rtl8366_smi *smi = bus->priv;
1735 err = rtl8366_smi_read_phy_reg(smi, addr, 0, reg, &val);
1742 static int rtl8366_smi_mii_write(struct mii_bus *bus, int addr, int reg,
1745 struct rtl8366_smi *smi = bus->priv;
1749 err = rtl8366_smi_write_phy_reg(smi, addr, 0, reg, val);
1751 (void) rtl8366_smi_read_phy_reg(smi, addr, 0, reg, &t);
1756 static int rtl8366_smi_mii_init(struct rtl8366_smi *smi)
1761 smi->mii_bus = mdiobus_alloc();
1762 if (smi->mii_bus == NULL) {
1767 spin_lock_init(&smi->lock);
1768 smi->mii_bus->priv = (void *) smi;
1769 smi->mii_bus->name = "rtl8366-smi";
1770 smi->mii_bus->read = rtl8366_smi_mii_read;
1771 smi->mii_bus->write = rtl8366_smi_mii_write;
1772 snprintf(smi->mii_bus->id, MII_BUS_ID_SIZE, "%s",
1773 dev_name(&smi->pdev->dev));
1774 smi->mii_bus->parent = &smi->pdev->dev;
1775 smi->mii_bus->phy_mask = ~(0x1f);
1776 smi->mii_bus->irq = smi->mii_irq;
1777 for (i = 0; i < PHY_MAX_ADDR; i++)
1778 smi->mii_irq[i] = PHY_POLL;
1780 ret = mdiobus_register(smi->mii_bus);
1787 mdiobus_free(smi->mii_bus);
1792 static void rtl8366_smi_mii_cleanup(struct rtl8366_smi *smi)
1794 mdiobus_unregister(smi->mii_bus);
1795 mdiobus_free(smi->mii_bus);
1798 static int rtl8366_smi_setup(struct rtl8366_smi *smi)
1804 ret = rtl8366_smi_read_reg(smi, RTL8366S_CHIP_ID_REG, &chip_id);
1806 dev_err(&smi->pdev->dev, "unable to read chip id\n");
1811 case RTL8366S_CHIP_ID_8366:
1814 dev_err(&smi->pdev->dev, "unknown chip id (%04x)\n", chip_id);
1818 ret = rtl8366_smi_read_reg(smi, RTL8366S_CHIP_VERSION_CTRL_REG,
1821 dev_err(&smi->pdev->dev, "unable to read chip version\n");
1825 dev_info(&smi->pdev->dev, "RTL%04x ver. %u chip found\n",
1826 chip_id, chip_ver & RTL8366S_CHIP_VERSION_MASK);
1828 rtl8366_debugfs_init(smi);
1833 static int __init rtl8366_smi_probe(struct platform_device *pdev)
1835 static int rtl8366_smi_version_printed;
1836 struct rtl8366_smi_platform_data *pdata;
1837 struct rtl8366_smi *smi;
1840 if (!rtl8366_smi_version_printed++)
1841 printk(KERN_NOTICE RTL8366_SMI_DRIVER_DESC
1842 " version " RTL8366_SMI_DRIVER_VER"\n");
1844 pdata = pdev->dev.platform_data;
1846 dev_err(&pdev->dev, "no platform data specified\n");
1851 smi = kzalloc(sizeof(struct rtl8366_smi), GFP_KERNEL);
1853 dev_err(&pdev->dev, "no memory for private data\n");
1858 err = gpio_request(pdata->gpio_sda, dev_name(&pdev->dev));
1860 dev_err(&pdev->dev, "gpio_request failed for %u, err=%d\n",
1861 pdata->gpio_sda, err);
1865 err = gpio_request(pdata->gpio_sck, dev_name(&pdev->dev));
1867 dev_err(&pdev->dev, "gpio_request failed for %u, err=%d\n",
1868 pdata->gpio_sck, err);
1874 spin_lock_init(&smi->lock);
1876 platform_set_drvdata(pdev, smi);
1878 dev_info(&pdev->dev, "using GPIO pins %u (SDA) and %u (SCK)\n",
1879 pdata->gpio_sda, pdata->gpio_sck);
1881 err = rtl8366_smi_setup(smi);
1883 goto err_clear_drvdata;
1885 err = rtl8366_smi_mii_init(smi);
1887 goto err_clear_drvdata;
1892 platform_set_drvdata(pdev, NULL);
1893 gpio_free(pdata->gpio_sck);
1895 gpio_free(pdata->gpio_sda);
1902 int rtl8366_phy_config_init(struct phy_device *phydev)
1905 struct net_device *netdev = phydev->attached_dev;
1906 struct rtl8366_smi *smi = phydev->bus->priv;
1907 struct switch_dev *dev = &smi->dev;
1909 /* Only init the switch for the primary PHY */
1910 if (phydev->addr != 4) {
1911 printk(KERN_INFO "Discarding address: %d\n", phydev->addr);
1915 memcpy(&smi->dev, &rtldev, sizeof(struct switch_dev));
1917 dev->netdev = netdev;
1919 err = register_switch(dev, netdev);
1921 printk(KERN_INFO "Switch registration failed\n");
1928 int rtl8366_phy_config_aneg(struct phy_device *phydev)
1933 static struct phy_driver rtl8366_smi_phy_driver = {
1934 .phy_id = 0x001cc960,
1935 .name = "Realtek RTL8366",
1936 .phy_id_mask = 0x1ffffff0,
1937 .features = PHY_GBIT_FEATURES,
1938 .config_aneg = rtl8366_phy_config_aneg,
1939 .config_init = rtl8366_phy_config_init,
1940 .read_status = genphy_read_status,
1942 .owner = THIS_MODULE,
1946 static int __devexit rtl8366_smi_remove(struct platform_device *pdev)
1948 struct rtl8366_smi *smi = platform_get_drvdata(pdev);
1951 struct rtl8366_smi_platform_data *pdata;
1953 pdata = pdev->dev.platform_data;
1955 rtl8366_debugfs_remove(smi);
1956 phy_driver_unregister(&rtl8366_smi_phy_driver);
1957 rtl8366_smi_mii_cleanup(smi);
1958 platform_set_drvdata(pdev, NULL);
1959 gpio_free(pdata->gpio_sck);
1960 gpio_free(pdata->gpio_sda);
1967 static struct platform_driver rtl8366_smi_driver = {
1969 .name = RTL8366_SMI_DRIVER_NAME,
1970 .owner = THIS_MODULE,
1972 .probe = rtl8366_smi_probe,
1973 .remove = __devexit_p(rtl8366_smi_remove),
1976 static int __init rtl8366_smi_init(void)
1979 ret = platform_driver_register(&rtl8366_smi_driver);
1983 ret = phy_driver_register(&rtl8366_smi_phy_driver);
1985 goto err_platform_unregister;
1989 err_platform_unregister:
1990 platform_driver_unregister(&rtl8366_smi_driver);
1993 module_init(rtl8366_smi_init);
1995 static void __exit rtl8366_smi_exit(void)
1997 phy_driver_unregister(&rtl8366_smi_phy_driver);
1998 platform_driver_unregister(&rtl8366_smi_driver);
2000 module_exit(rtl8366_smi_exit);
2002 MODULE_DESCRIPTION(RTL8366_SMI_DRIVER_DESC);
2003 MODULE_VERSION(RTL8366_SMI_DRIVER_VER);
2004 MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
2005 MODULE_AUTHOR("Antti Seppälä <a.seppala@gmail.com>");
2006 MODULE_LICENSE("GPL v2");
2007 MODULE_ALIAS("platform:" RTL8366_SMI_DRIVER_NAME);