2 * Platform driver for the Realtek RTL8366S ethernet switch
4 * Copyright (C) 2009-2010 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/skbuff.h>
18 #include <linux/switch.h>
19 #include <linux/phy.h>
20 #include <linux/rtl8366s.h>
22 #include "rtl8366_smi.h"
24 #ifdef CONFIG_RTL8366S_PHY_DEBUG_FS
25 #include <linux/debugfs.h>
28 #define RTL8366S_DRIVER_DESC "Realtek RTL8366S ethernet switch driver"
29 #define RTL8366S_DRIVER_VER "0.2.0"
31 #define RTL8366S_PHY_NO_MAX 4
32 #define RTL8366S_PHY_PAGE_MAX 7
33 #define RTL8366S_PHY_ADDR_MAX 31
35 #define RTL8366_CHIP_GLOBAL_CTRL_REG 0x0000
36 #define RTL8366_CHIP_CTRL_VLAN (1 << 13)
38 #define RTL8366_RESET_CTRL_REG 0x0100
39 #define RTL8366_CHIP_CTRL_RESET_HW 1
40 #define RTL8366_CHIP_CTRL_RESET_SW (1 << 1)
42 #define RTL8366S_CHIP_VERSION_CTRL_REG 0x0104
43 #define RTL8366S_CHIP_VERSION_MASK 0xf
44 #define RTL8366S_CHIP_ID_REG 0x0105
45 #define RTL8366S_CHIP_ID_8366 0x8366
47 /* PHY registers control */
48 #define RTL8366S_PHY_ACCESS_CTRL_REG 0x8028
49 #define RTL8366S_PHY_ACCESS_DATA_REG 0x8029
51 #define RTL8366S_PHY_CTRL_READ 1
52 #define RTL8366S_PHY_CTRL_WRITE 0
54 #define RTL8366S_PHY_REG_MASK 0x1f
55 #define RTL8366S_PHY_PAGE_OFFSET 5
56 #define RTL8366S_PHY_PAGE_MASK (0x7 << 5)
57 #define RTL8366S_PHY_NO_OFFSET 9
58 #define RTL8366S_PHY_NO_MASK (0x1f << 9)
60 /* LED control registers */
61 #define RTL8366_LED_BLINKRATE_REG 0x0420
62 #define RTL8366_LED_BLINKRATE_BIT 0
63 #define RTL8366_LED_BLINKRATE_MASK 0x0007
65 #define RTL8366_LED_CTRL_REG 0x0421
66 #define RTL8366_LED_0_1_CTRL_REG 0x0422
67 #define RTL8366_LED_2_3_CTRL_REG 0x0423
69 #define RTL8366S_MIB_COUNT 33
70 #define RTL8366S_GLOBAL_MIB_COUNT 1
71 #define RTL8366S_MIB_COUNTER_PORT_OFFSET 0x0040
72 #define RTL8366S_MIB_COUNTER_BASE 0x1000
73 #define RTL8366S_MIB_CTRL_REG 0x11F0
74 #define RTL8366S_MIB_CTRL_USER_MASK 0x01FF
75 #define RTL8366S_MIB_CTRL_BUSY_MASK 0x0001
76 #define RTL8366S_MIB_CTRL_RESET_MASK 0x0002
78 #define RTL8366S_MIB_CTRL_GLOBAL_RESET_MASK 0x0004
79 #define RTL8366S_MIB_CTRL_PORT_RESET_BIT 0x0003
80 #define RTL8366S_MIB_CTRL_PORT_RESET_MASK 0x01FC
83 #define RTL8366S_PORT_VLAN_CTRL_BASE 0x0058
84 #define RTL8366S_PORT_VLAN_CTRL_REG(_p) \
85 (RTL8366S_PORT_VLAN_CTRL_BASE + (_p) / 4)
86 #define RTL8366S_PORT_VLAN_CTRL_MASK 0xf
87 #define RTL8366S_PORT_VLAN_CTRL_SHIFT(_p) (4 * ((_p) % 4))
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 | \
150 struct device
*parent
;
151 struct rtl8366_smi smi
;
152 struct mii_bus
*mii_bus
;
153 int mii_irq
[PHY_MAX_ADDR
];
154 struct switch_dev dev
;
156 #ifdef CONFIG_RTL8366S_PHY_DEBUG_FS
157 struct dentry
*debugfs_root
;
161 struct rtl8366s_vlanconfig
{
172 struct rtl8366s_vlan4kentry
{
182 #ifdef CONFIG_RTL8366S_PHY_DEBUG_FS
186 static const char *MIBCOUNTERS
[] = {
189 "EtherStatsUnderSizePkts ",
191 "EtherStatsPkts64Octets ",
192 "EtherStatsPkts65to127Octets ",
193 "EtherStatsPkts128to255Octets ",
194 "EtherStatsPkts256to511Octets ",
195 "EtherStatsPkts512to1023Octets ",
196 "EtherStatsPkts1024to1518Octets ",
197 "EtherOversizeStats ",
198 "EtherStatsJabbers ",
200 "EtherStatsMulticastPkts ",
201 "EtherStatsBroadcastPkts ",
202 "EtherStatsDropEvents ",
203 "Dot3StatsFCSErrors ",
204 "Dot3StatsSymbolErrors ",
205 "Dot3InPauseFrames ",
206 "Dot3ControlInUnknownOpcodes ",
208 "Dot3StatsSingleCollisionFrames ",
209 "Dot3StatMultipleCollisionFrames ",
210 "Dot3sDeferredTransmissions ",
211 "Dot3StatsLateCollisions ",
212 "EtherStatsCollisions ",
213 "Dot3StatsExcessiveCollisions ",
214 "Dot3OutPauseFrames ",
215 "Dot1dBasePortDelayExceededDiscards",
216 "Dot1dTpPortInDiscards ",
218 "IfOutMulticastPkts ",
219 "IfOutBroadcastPkts ",
223 static inline struct rtl8366s
*sw_to_rtl8366s(struct switch_dev
*sw
)
225 return container_of(sw
, struct rtl8366s
, dev
);
228 static int rtl8366s_read_phy_reg(struct rtl8366s
*rtl
,
229 u32 phy_no
, u32 page
, u32 addr
, u32
*data
)
231 struct rtl8366_smi
*smi
= &rtl
->smi
;
235 if (phy_no
> RTL8366S_PHY_NO_MAX
)
238 if (page
> RTL8366S_PHY_PAGE_MAX
)
241 if (addr
> RTL8366S_PHY_ADDR_MAX
)
244 ret
= rtl8366_smi_write_reg(smi
, RTL8366S_PHY_ACCESS_CTRL_REG
,
245 RTL8366S_PHY_CTRL_READ
);
249 reg
= 0x8000 | (1 << (phy_no
+ RTL8366S_PHY_NO_OFFSET
)) |
250 ((page
<< RTL8366S_PHY_PAGE_OFFSET
) & RTL8366S_PHY_PAGE_MASK
) |
251 (addr
& RTL8366S_PHY_REG_MASK
);
253 ret
= rtl8366_smi_write_reg(smi
, reg
, 0);
257 ret
= rtl8366_smi_read_reg(smi
, RTL8366S_PHY_ACCESS_DATA_REG
, data
);
264 static int rtl8366s_write_phy_reg(struct rtl8366s
*rtl
,
265 u32 phy_no
, u32 page
, u32 addr
, u32 data
)
267 struct rtl8366_smi
*smi
= &rtl
->smi
;
271 if (phy_no
> RTL8366S_PHY_NO_MAX
)
274 if (page
> RTL8366S_PHY_PAGE_MAX
)
277 if (addr
> RTL8366S_PHY_ADDR_MAX
)
280 ret
= rtl8366_smi_write_reg(smi
, RTL8366S_PHY_ACCESS_CTRL_REG
,
281 RTL8366S_PHY_CTRL_WRITE
);
285 reg
= 0x8000 | (1 << (phy_no
+ RTL8366S_PHY_NO_OFFSET
)) |
286 ((page
<< RTL8366S_PHY_PAGE_OFFSET
) & RTL8366S_PHY_PAGE_MASK
) |
287 (addr
& RTL8366S_PHY_REG_MASK
);
289 ret
= rtl8366_smi_write_reg(smi
, reg
, data
);
296 static int rtl8366_get_mib_counter(struct rtl8366s
*rtl
, int counter
,
297 int port
, unsigned long long *val
)
299 struct rtl8366_smi
*smi
= &rtl
->smi
;
302 u32 addr
, data
, regoffset
;
305 /* address offset to MIBs counter */
306 const u16 mibLength
[RTL8366S_MIB_COUNT
] = {4, 4, 2, 2, 2, 2, 2, 2, 2,
307 2, 2, 2, 2, 2, 2, 2, 2, 2,
308 2, 2, 4, 2, 2, 2, 2, 2, 2,
311 if (port
> RTL8366_NUM_PORTS
|| counter
>= RTL8366S_MIB_COUNT
)
314 regoffset
= RTL8366S_MIB_COUNTER_PORT_OFFSET
* (port
);
316 for (i
= 0; i
< counter
; i
++)
317 regoffset
+= mibLength
[i
];
319 addr
= RTL8366S_MIB_COUNTER_BASE
+ regoffset
;
322 * Writing access counter address first
323 * then ASIC will prepare 64bits counter wait for being retrived
325 data
= 0; /* writing data will be discard by ASIC */
326 err
= rtl8366_smi_write_reg(smi
, addr
, data
);
330 /* read MIB control register */
331 err
= rtl8366_smi_read_reg(smi
, RTL8366S_MIB_CTRL_REG
, &data
);
335 if (data
& RTL8366S_MIB_CTRL_BUSY_MASK
)
338 if (data
& RTL8366S_MIB_CTRL_RESET_MASK
)
342 addr
= addr
+ mibLength
[counter
] - 1;
343 i
= mibLength
[counter
];
346 err
= rtl8366_smi_read_reg(smi
, addr
, &data
);
350 mibvalue
= (mibvalue
<< 16) | (data
& 0xFFFF);
360 static int rtl8366s_get_vlan_4k_entry(struct rtl8366s
*rtl
, u32 vid
,
361 struct rtl8366s_vlan4kentry
*vlan4k
)
363 struct rtl8366_smi
*smi
= &rtl
->smi
;
368 memset(vlan4k
, '\0', sizeof(struct rtl8366s_vlan4kentry
));
371 if (vid
>= RTL8366_NUM_VIDS
)
374 tableaddr
= (u16
*)vlan4k
;
378 err
= rtl8366_smi_write_reg(smi
, RTL8366S_VLAN_TABLE_WRITE_BASE
, data
);
382 /* write table access control word */
383 err
= rtl8366_smi_write_reg(smi
, RTL8366S_TABLE_ACCESS_CTRL_REG
,
384 RTL8366S_TABLE_VLAN_READ_CTRL
);
388 err
= rtl8366_smi_read_reg(smi
, RTL8366S_VLAN_TABLE_READ_BASE
, &data
);
395 err
= rtl8366_smi_read_reg(smi
, RTL8366S_VLAN_TABLE_READ_BASE
+ 1,
406 static int rtl8366s_set_vlan_4k_entry(struct rtl8366s
*rtl
,
407 const struct rtl8366s_vlan4kentry
*vlan4k
)
409 struct rtl8366_smi
*smi
= &rtl
->smi
;
414 if (vlan4k
->vid
>= RTL8366_NUM_VIDS
||
415 vlan4k
->member
> RTL8366_PORT_ALL
||
416 vlan4k
->untag
> RTL8366_PORT_ALL
||
417 vlan4k
->fid
> RTL8366S_FIDMAX
)
420 tableaddr
= (u16
*)vlan4k
;
424 err
= rtl8366_smi_write_reg(smi
, RTL8366S_VLAN_TABLE_WRITE_BASE
, data
);
432 err
= rtl8366_smi_write_reg(smi
, RTL8366S_VLAN_TABLE_WRITE_BASE
+ 1,
437 /* write table access control word */
438 err
= rtl8366_smi_write_reg(smi
, RTL8366S_TABLE_ACCESS_CTRL_REG
,
439 RTL8366S_TABLE_VLAN_WRITE_CTRL
);
444 static int rtl8366s_get_vlan_member_config(struct rtl8366s
*rtl
, u32 index
,
445 struct rtl8366s_vlanconfig
*vlanmc
)
447 struct rtl8366_smi
*smi
= &rtl
->smi
;
453 memset(vlanmc
, '\0', sizeof(struct rtl8366s_vlanconfig
));
455 if (index
>= RTL8366_NUM_VLANS
)
458 tableaddr
= (u16
*)vlanmc
;
460 addr
= RTL8366S_VLAN_MEMCONF_BASE
+ (index
<< 1);
461 err
= rtl8366_smi_read_reg(smi
, addr
, &data
);
468 addr
= RTL8366S_VLAN_MEMCONF_BASE
+ 1 + (index
<< 1);
469 err
= rtl8366_smi_read_reg(smi
, addr
, &data
);
478 static int rtl8366s_set_vlan_member_config(struct rtl8366s
*rtl
, u32 index
,
479 const struct rtl8366s_vlanconfig
482 struct rtl8366_smi
*smi
= &rtl
->smi
;
488 if (index
>= RTL8366_NUM_VLANS
||
489 vlanmc
->vid
>= RTL8366_NUM_VIDS
||
490 vlanmc
->priority
> RTL8366S_PRIORITYMAX
||
491 vlanmc
->member
> RTL8366_PORT_ALL
||
492 vlanmc
->untag
> RTL8366_PORT_ALL
||
493 vlanmc
->fid
> RTL8366S_FIDMAX
)
496 addr
= RTL8366S_VLAN_MEMCONF_BASE
+ (index
<< 1);
498 tableaddr
= (u16
*)vlanmc
;
501 err
= rtl8366_smi_write_reg(smi
, addr
, data
);
505 addr
= RTL8366S_VLAN_MEMCONF_BASE
+ 1 + (index
<< 1);
510 err
= rtl8366_smi_write_reg(smi
, addr
, data
);
517 static int rtl8366s_get_port_vlan_index(struct rtl8366s
*rtl
, int port
,
520 struct rtl8366_smi
*smi
= &rtl
->smi
;
524 if (port
>= RTL8366_NUM_PORTS
)
527 err
= rtl8366_smi_read_reg(smi
, RTL8366S_PORT_VLAN_CTRL_REG(port
),
532 *val
= (data
>> RTL8366S_PORT_VLAN_CTRL_SHIFT(port
)) &
533 RTL8366S_PORT_VLAN_CTRL_MASK
;
539 static int rtl8366s_get_vlan_port_pvid(struct rtl8366s
*rtl
, int port
,
542 struct rtl8366s_vlanconfig vlanmc
;
546 err
= rtl8366s_get_port_vlan_index(rtl
, port
, &index
);
550 err
= rtl8366s_get_vlan_member_config(rtl
, index
, &vlanmc
);
558 static int rtl8366s_set_port_vlan_index(struct rtl8366s
*rtl
, int port
,
561 struct rtl8366_smi
*smi
= &rtl
->smi
;
565 if (port
>= RTL8366_NUM_PORTS
|| index
>= RTL8366_NUM_VLANS
)
568 err
= rtl8366_smi_read_reg(smi
, RTL8366S_PORT_VLAN_CTRL_REG(port
),
573 data
&= ~(RTL8366S_PORT_VLAN_CTRL_MASK
<<
574 RTL8366S_PORT_VLAN_CTRL_SHIFT(port
));
575 data
|= (index
& RTL8366S_PORT_VLAN_CTRL_MASK
) <<
576 RTL8366S_PORT_VLAN_CTRL_SHIFT(port
);
578 err
= rtl8366_smi_write_reg(smi
, RTL8366S_PORT_VLAN_CTRL_REG(port
),
583 static int rtl8366s_set_vlan_port_pvid(struct rtl8366s
*rtl
, int port
, int val
)
586 struct rtl8366s_vlanconfig vlanmc
;
587 struct rtl8366s_vlan4kentry vlan4k
;
589 if (port
>= RTL8366_NUM_PORTS
|| val
>= RTL8366_NUM_VIDS
)
592 /* Updating the 4K entry; lookup it and change the port member set */
593 rtl8366s_get_vlan_4k_entry(rtl
, val
, &vlan4k
);
594 vlan4k
.member
|= ((1 << port
) | RTL8366_PORT_CPU
);
595 vlan4k
.untag
= RTL8366_PORT_ALL_BUT_CPU
;
596 rtl8366s_set_vlan_4k_entry(rtl
, &vlan4k
);
599 * For the 16 entries more work needs to be done. First see if such
600 * VID is already there and change it
602 for (i
= 0; i
< RTL8366_NUM_VLANS
; ++i
) {
603 rtl8366s_get_vlan_member_config(rtl
, i
, &vlanmc
);
605 /* Try to find an existing vid and update port member set */
606 if (val
== vlanmc
.vid
) {
607 vlanmc
.member
|= ((1 << port
) | RTL8366_PORT_CPU
);
608 rtl8366s_set_vlan_member_config(rtl
, i
, &vlanmc
);
610 /* Now update PVID register settings */
611 rtl8366s_set_port_vlan_index(rtl
, port
, i
);
618 * PVID could not be found from vlan table. Replace unused (one that
619 * has no member ports) with new one
621 for (i
= 0; i
< RTL8366_NUM_VLANS
; ++i
) {
622 rtl8366s_get_vlan_member_config(rtl
, i
, &vlanmc
);
625 * See if this vlan member configuration is unused. It is
626 * unused if member set contains no ports or CPU port only
628 if (!vlanmc
.member
|| vlanmc
.member
== RTL8366_PORT_CPU
) {
631 vlanmc
.untag
= RTL8366_PORT_ALL_BUT_CPU
;
632 vlanmc
.member
= ((1 << port
) | RTL8366_PORT_CPU
);
635 rtl8366s_set_vlan_member_config(rtl
, i
, &vlanmc
);
637 /* Now update PVID register settings */
638 rtl8366s_set_port_vlan_index(rtl
, port
, i
);
645 "All 16 vlan member configurations are in use\n");
651 static int rtl8366s_vlan_set_vlan(struct rtl8366s
*rtl
, int enable
)
653 struct rtl8366_smi
*smi
= &rtl
->smi
;
656 rtl8366_smi_read_reg(smi
, RTL8366_CHIP_GLOBAL_CTRL_REG
, &data
);
659 data
|= RTL8366_CHIP_CTRL_VLAN
;
661 data
&= ~RTL8366_CHIP_CTRL_VLAN
;
663 return rtl8366_smi_write_reg(smi
, RTL8366_CHIP_GLOBAL_CTRL_REG
, data
);
666 static int rtl8366s_vlan_set_4ktable(struct rtl8366s
*rtl
, int enable
)
668 struct rtl8366_smi
*smi
= &rtl
->smi
;
671 rtl8366_smi_read_reg(smi
, RTL8366S_VLAN_TB_CTRL_REG
, &data
);
678 return rtl8366_smi_write_reg(smi
, RTL8366S_VLAN_TB_CTRL_REG
, data
);
681 static int rtl8366s_reset_vlan(struct rtl8366s
*rtl
)
683 struct rtl8366s_vlan4kentry vlan4k
;
684 struct rtl8366s_vlanconfig vlanmc
;
688 /* clear 16 VLAN member configuration */
694 for (i
= 0; i
< RTL8366_NUM_VLANS
; i
++) {
695 err
= rtl8366s_set_vlan_member_config(rtl
, i
, &vlanmc
);
700 /* Set a default VLAN with vid 1 to 4K table for all ports */
702 vlan4k
.member
= RTL8366_PORT_ALL
;
703 vlan4k
.untag
= RTL8366_PORT_ALL
;
705 err
= rtl8366s_set_vlan_4k_entry(rtl
, &vlan4k
);
709 /* Set all ports PVID to default VLAN */
710 for (i
= 0; i
< RTL8366_NUM_PORTS
; i
++) {
711 err
= rtl8366s_set_vlan_port_pvid(rtl
, i
, 0);
719 #ifdef CONFIG_RTL8366S_PHY_DEBUG_FS
720 static int rtl8366s_debugfs_open(struct inode
*inode
, struct file
*file
)
722 file
->private_data
= inode
->i_private
;
726 static ssize_t
rtl8366s_read_debugfs_mibs(struct file
*file
,
727 char __user
*user_buf
,
728 size_t count
, loff_t
*ppos
)
730 struct rtl8366s
*rtl
= (struct rtl8366s
*)file
->private_data
;
732 char *buf
= rtl
->buf
;
734 len
+= snprintf(buf
+ len
, sizeof(rtl
->buf
) - len
, "MIB Counters:\n");
735 len
+= snprintf(buf
+ len
, sizeof(rtl
->buf
) - len
, "Counter"
737 "Port 0 \t\t Port 1 \t\t Port 2 \t\t Port 3 \t\t "
740 for (i
= 0; i
< 33; ++i
) {
741 len
+= snprintf(buf
+ len
, sizeof(rtl
->buf
) - len
, "%d:%s ",
743 for (j
= 0; j
< RTL8366_NUM_PORTS
; ++j
) {
744 unsigned long long counter
= 0;
746 if (!rtl8366_get_mib_counter(rtl
, i
, j
, &counter
))
747 len
+= snprintf(buf
+ len
,
748 sizeof(rtl
->buf
) - len
,
751 len
+= snprintf(buf
+ len
,
752 sizeof(rtl
->buf
) - len
,
755 if (j
!= RTL8366_NUM_PORTS
- 1) {
756 if (counter
< 100000)
757 len
+= snprintf(buf
+ len
,
758 sizeof(rtl
->buf
) - len
,
761 len
+= snprintf(buf
+ len
,
762 sizeof(rtl
->buf
) - len
,
766 len
+= snprintf(buf
+ len
, sizeof(rtl
->buf
) - len
, "\n");
769 len
+= snprintf(buf
+ len
, sizeof(rtl
->buf
) - len
, "\n");
771 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
774 static ssize_t
rtl8366s_read_debugfs_vlan(struct file
*file
,
775 char __user
*user_buf
,
776 size_t count
, loff_t
*ppos
)
778 struct rtl8366s
*rtl
= (struct rtl8366s
*)file
->private_data
;
780 char *buf
= rtl
->buf
;
782 len
+= snprintf(buf
+ len
, sizeof(rtl
->buf
) - len
,
783 "VLAN Member Config:\n");
784 len
+= snprintf(buf
+ len
, sizeof(rtl
->buf
) - len
,
785 "\t id \t vid \t prio \t member \t untag \t fid "
788 for (i
= 0; i
< RTL8366_NUM_VLANS
; ++i
) {
789 struct rtl8366s_vlanconfig vlanmc
;
791 rtl8366s_get_vlan_member_config(rtl
, i
, &vlanmc
);
793 len
+= snprintf(buf
+ len
, sizeof(rtl
->buf
) - len
,
794 "\t[%d] \t %d \t %d \t 0x%04x \t 0x%04x \t %d "
795 "\t", i
, vlanmc
.vid
, vlanmc
.priority
,
796 vlanmc
.member
, vlanmc
.untag
, vlanmc
.fid
);
798 for (j
= 0; j
< RTL8366_NUM_PORTS
; ++j
) {
800 if (!rtl8366s_get_port_vlan_index(rtl
, j
, &index
)) {
802 len
+= snprintf(buf
+ len
,
803 sizeof(rtl
->buf
) - len
,
807 len
+= snprintf(buf
+ len
, sizeof(rtl
->buf
) - len
, "\n");
810 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
813 static ssize_t
rtl8366s_read_debugfs_reg(struct file
*file
,
814 char __user
*user_buf
,
815 size_t count
, loff_t
*ppos
)
817 struct rtl8366s
*rtl
= (struct rtl8366s
*)file
->private_data
;
818 struct rtl8366_smi
*smi
= &rtl
->smi
;
819 u32 t
, reg
= g_dbg_reg
;
821 char *buf
= rtl
->buf
;
823 memset(buf
, '\0', sizeof(rtl
->buf
));
825 err
= rtl8366_smi_read_reg(smi
, reg
, &t
);
827 len
+= snprintf(buf
, sizeof(rtl
->buf
),
828 "Read failed (reg: 0x%04x)\n", reg
);
829 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
832 len
+= snprintf(buf
, sizeof(rtl
->buf
), "reg = 0x%04x, val = 0x%04x\n",
835 return simple_read_from_buffer(user_buf
, count
, ppos
, buf
, len
);
838 static ssize_t
rtl8366s_write_debugfs_reg(struct file
*file
,
839 const char __user
*user_buf
,
840 size_t count
, loff_t
*ppos
)
842 struct rtl8366s
*rtl
= (struct rtl8366s
*)file
->private_data
;
843 struct rtl8366_smi
*smi
= &rtl
->smi
;
848 char *buf
= rtl
->buf
;
850 len
= min(count
, sizeof(rtl
->buf
) - 1);
851 if (copy_from_user(buf
, user_buf
, len
)) {
852 dev_err(rtl
->parent
, "copy from user failed\n");
857 if (len
> 0 && buf
[len
- 1] == '\n')
861 if (strict_strtoul(buf
, 16, &data
)) {
862 dev_err(rtl
->parent
, "Invalid reg value %s\n", buf
);
864 err
= rtl8366_smi_write_reg(smi
, reg
, data
);
867 "writing reg 0x%04x val 0x%04lx failed\n",
875 static const struct file_operations fops_rtl8366s_regs
= {
876 .read
= rtl8366s_read_debugfs_reg
,
877 .write
= rtl8366s_write_debugfs_reg
,
878 .open
= rtl8366s_debugfs_open
,
882 static const struct file_operations fops_rtl8366s_vlan
= {
883 .read
= rtl8366s_read_debugfs_vlan
,
884 .open
= rtl8366s_debugfs_open
,
888 static const struct file_operations fops_rtl8366s_mibs
= {
889 .read
= rtl8366s_read_debugfs_mibs
,
890 .open
= rtl8366s_debugfs_open
,
894 static void rtl8366s_debugfs_init(struct rtl8366s
*rtl
)
899 if (!rtl
->debugfs_root
)
900 rtl
->debugfs_root
= debugfs_create_dir("rtl8366s", NULL
);
902 if (!rtl
->debugfs_root
) {
903 dev_err(rtl
->parent
, "Unable to create debugfs dir\n");
906 root
= rtl
->debugfs_root
;
908 node
= debugfs_create_x16("reg", S_IRUGO
| S_IWUSR
, root
, &g_dbg_reg
);
910 dev_err(rtl
->parent
, "Creating debugfs file reg failed\n");
914 node
= debugfs_create_file("val", S_IRUGO
| S_IWUSR
, root
, rtl
,
915 &fops_rtl8366s_regs
);
917 dev_err(rtl
->parent
, "Creating debugfs file val failed\n");
921 node
= debugfs_create_file("vlan", S_IRUSR
, root
, rtl
,
922 &fops_rtl8366s_vlan
);
925 "Creating debugfs file vlan failed\n");
929 node
= debugfs_create_file("mibs", S_IRUSR
, root
, rtl
,
930 &fops_rtl8366s_mibs
);
933 "Creating debugfs file mibs failed\n");
938 static void rtl8366s_debugfs_remove(struct rtl8366s
*rtl
)
940 if (rtl
->debugfs_root
) {
941 debugfs_remove_recursive(rtl
->debugfs_root
);
942 rtl
->debugfs_root
= NULL
;
947 static inline void rtl8366s_debugfs_init(struct rtl8366s
*rtl
) {}
948 static inline void rtl8366s_debugfs_remove(struct rtl8366s
*rtl
) {}
949 #endif /* CONFIG_RTL8366S_PHY_DEBUG_FS */
951 static int rtl8366s_sw_reset_mibs(struct switch_dev
*dev
,
952 const struct switch_attr
*attr
,
953 struct switch_val
*val
)
955 struct rtl8366s
*rtl
= sw_to_rtl8366s(dev
);
956 struct rtl8366_smi
*smi
= &rtl
->smi
;
959 if (val
->value
.i
== 1) {
960 rtl8366_smi_read_reg(smi
, RTL8366S_MIB_CTRL_REG
, &data
);
962 rtl8366_smi_write_reg(smi
, RTL8366S_MIB_CTRL_REG
, data
);
968 static int rtl8366s_sw_get_vlan_enable(struct switch_dev
*dev
,
969 const struct switch_attr
*attr
,
970 struct switch_val
*val
)
972 struct rtl8366s
*rtl
= sw_to_rtl8366s(dev
);
973 struct rtl8366_smi
*smi
= &rtl
->smi
;
976 if (attr
->ofs
== 1) {
977 rtl8366_smi_read_reg(smi
, RTL8366_CHIP_GLOBAL_CTRL_REG
, &data
);
979 if (data
& RTL8366_CHIP_CTRL_VLAN
)
983 } else if (attr
->ofs
== 2) {
984 rtl8366_smi_read_reg(smi
, RTL8366S_VLAN_TB_CTRL_REG
, &data
);
995 static int rtl8366s_sw_get_blinkrate(struct switch_dev
*dev
,
996 const struct switch_attr
*attr
,
997 struct switch_val
*val
)
999 struct rtl8366s
*rtl
= sw_to_rtl8366s(dev
);
1000 struct rtl8366_smi
*smi
= &rtl
->smi
;
1003 rtl8366_smi_read_reg(smi
, RTL8366_LED_BLINKRATE_REG
, &data
);
1005 val
->value
.i
= (data
& (RTL8366_LED_BLINKRATE_MASK
));
1010 static int rtl8366s_sw_set_blinkrate(struct switch_dev
*dev
,
1011 const struct switch_attr
*attr
,
1012 struct switch_val
*val
)
1014 struct rtl8366s
*rtl
= sw_to_rtl8366s(dev
);
1015 struct rtl8366_smi
*smi
= &rtl
->smi
;
1018 if (val
->value
.i
>= 6)
1021 rtl8366_smi_read_reg(smi
, RTL8366_LED_BLINKRATE_REG
, &data
);
1023 data
&= ~RTL8366_LED_BLINKRATE_MASK
;
1024 data
|= val
->value
.i
;
1026 rtl8366_smi_write_reg(smi
, RTL8366_LED_BLINKRATE_REG
, data
);
1031 static int rtl8366s_sw_set_vlan_enable(struct switch_dev
*dev
,
1032 const struct switch_attr
*attr
,
1033 struct switch_val
*val
)
1035 struct rtl8366s
*rtl
= sw_to_rtl8366s(dev
);
1038 return rtl8366s_vlan_set_vlan(rtl
, val
->value
.i
);
1040 return rtl8366s_vlan_set_4ktable(rtl
, val
->value
.i
);
1043 static const char *rtl8366s_speed_str(unsigned speed
)
1057 static int rtl8366s_sw_get_port_link(struct switch_dev
*dev
,
1058 const struct switch_attr
*attr
,
1059 struct switch_val
*val
)
1061 struct rtl8366s
*rtl
= sw_to_rtl8366s(dev
);
1062 struct rtl8366_smi
*smi
= &rtl
->smi
;
1063 u32 len
= 0, data
= 0;
1065 if (val
->port_vlan
>= RTL8366_NUM_PORTS
)
1068 memset(rtl
->buf
, '\0', sizeof(rtl
->buf
));
1069 rtl8366_smi_read_reg(smi
, RTL8366S_PORT_LINK_STATUS_BASE
+
1070 (val
->port_vlan
/ 2), &data
);
1072 if (val
->port_vlan
% 2)
1075 len
= snprintf(rtl
->buf
, sizeof(rtl
->buf
),
1076 "port:%d link:%s speed:%s %s-duplex %s%s%s",
1078 (data
& RTL8366S_PORT_STATUS_LINK_MASK
) ? "up" : "down",
1079 rtl8366s_speed_str(data
&
1080 RTL8366S_PORT_STATUS_SPEED_MASK
),
1081 (data
& RTL8366S_PORT_STATUS_DUPLEX_MASK
) ?
1083 (data
& RTL8366S_PORT_STATUS_TXPAUSE_MASK
) ?
1085 (data
& RTL8366S_PORT_STATUS_RXPAUSE_MASK
) ?
1087 (data
& RTL8366S_PORT_STATUS_AN_MASK
) ? "nway ": "");
1089 val
->value
.s
= rtl
->buf
;
1095 static int rtl8366s_sw_get_vlan_info(struct switch_dev
*dev
,
1096 const struct switch_attr
*attr
,
1097 struct switch_val
*val
)
1101 struct rtl8366s_vlanconfig vlanmc
;
1102 struct rtl8366s_vlan4kentry vlan4k
;
1103 struct rtl8366s
*rtl
= sw_to_rtl8366s(dev
);
1104 char *buf
= rtl
->buf
;
1106 if (val
->port_vlan
>= RTL8366_NUM_VLANS
)
1109 memset(buf
, '\0', sizeof(rtl
->buf
));
1111 rtl8366s_get_vlan_member_config(rtl
, val
->port_vlan
, &vlanmc
);
1112 rtl8366s_get_vlan_4k_entry(rtl
, vlanmc
.vid
, &vlan4k
);
1114 len
+= snprintf(buf
+ len
, sizeof(rtl
->buf
) - len
, "VLAN %d: Ports: ",
1117 for (i
= 0; i
< RTL8366_NUM_PORTS
; ++i
) {
1119 if (!rtl8366s_get_port_vlan_index(rtl
, i
, &index
) &&
1120 index
== val
->port_vlan
)
1121 len
+= snprintf(buf
+ len
, sizeof(rtl
->buf
) - len
,
1124 len
+= snprintf(buf
+ len
, sizeof(rtl
->buf
) - len
, "\n");
1126 len
+= snprintf(buf
+ len
, sizeof(rtl
->buf
) - len
,
1127 "\t\t vid \t prio \t member \t untag \t fid\n");
1128 len
+= snprintf(buf
+ len
, sizeof(rtl
->buf
) - len
, "\tMC:\t");
1129 len
+= snprintf(buf
+ len
, sizeof(rtl
->buf
) - len
,
1130 "%d \t %d \t 0x%04x \t 0x%04x \t %d\n",
1131 vlanmc
.vid
, vlanmc
.priority
, vlanmc
.member
,
1132 vlanmc
.untag
, vlanmc
.fid
);
1133 len
+= snprintf(buf
+ len
, sizeof(rtl
->buf
) - len
, "\t4K:\t");
1134 len
+= snprintf(buf
+ len
, sizeof(rtl
->buf
) - len
,
1135 "%d \t \t 0x%04x \t 0x%04x \t %d",
1136 vlan4k
.vid
, vlan4k
.member
, vlan4k
.untag
, vlan4k
.fid
);
1144 static int rtl8366s_sw_set_port_led(struct switch_dev
*dev
,
1145 const struct switch_attr
*attr
,
1146 struct switch_val
*val
)
1148 struct rtl8366s
*rtl
= sw_to_rtl8366s(dev
);
1149 struct rtl8366_smi
*smi
= &rtl
->smi
;
1152 if (val
->port_vlan
>= RTL8366_NUM_PORTS
||
1153 (1 << val
->port_vlan
) == RTL8366_PORT_UNKNOWN
)
1156 if (val
->port_vlan
== RTL8366_PORT_NUM_CPU
) {
1157 rtl8366_smi_read_reg(smi
, RTL8366_LED_BLINKRATE_REG
, &data
);
1158 data
= (data
& (~(0xF << 4))) | (val
->value
.i
<< 4);
1159 rtl8366_smi_write_reg(smi
, RTL8366_LED_BLINKRATE_REG
, data
);
1161 rtl8366_smi_read_reg(smi
, RTL8366_LED_CTRL_REG
, &data
);
1162 data
= (data
& (~(0xF << (val
->port_vlan
* 4)))) |
1163 (val
->value
.i
<< (val
->port_vlan
* 4));
1164 rtl8366_smi_write_reg(smi
, RTL8366_LED_CTRL_REG
, data
);
1170 static int rtl8366s_sw_get_port_led(struct switch_dev
*dev
,
1171 const struct switch_attr
*attr
,
1172 struct switch_val
*val
)
1174 struct rtl8366s
*rtl
= sw_to_rtl8366s(dev
);
1175 struct rtl8366_smi
*smi
= &rtl
->smi
;
1178 if (val
->port_vlan
>= RTL8366_NUM_LEDGROUPS
)
1181 rtl8366_smi_read_reg(smi
, RTL8366_LED_CTRL_REG
, &data
);
1182 val
->value
.i
= (data
>> (val
->port_vlan
* 4)) & 0x000F;
1187 static int rtl8366s_sw_reset_port_mibs(struct switch_dev
*dev
,
1188 const struct switch_attr
*attr
,
1189 struct switch_val
*val
)
1191 struct rtl8366s
*rtl
= sw_to_rtl8366s(dev
);
1192 struct rtl8366_smi
*smi
= &rtl
->smi
;
1195 if (val
->port_vlan
>= RTL8366_NUM_PORTS
)
1198 rtl8366_smi_read_reg(smi
, RTL8366S_MIB_CTRL_REG
, &data
);
1199 data
|= (1 << (val
->port_vlan
+ 3));
1200 rtl8366_smi_write_reg(smi
, RTL8366S_MIB_CTRL_REG
, data
);
1205 static int rtl8366s_sw_get_port_mib(struct switch_dev
*dev
,
1206 const struct switch_attr
*attr
,
1207 struct switch_val
*val
)
1209 struct rtl8366s
*rtl
= sw_to_rtl8366s(dev
);
1211 unsigned long long counter
= 0;
1212 char *buf
= rtl
->buf
;
1214 if (val
->port_vlan
>= RTL8366_NUM_PORTS
)
1217 len
+= snprintf(buf
+ len
, sizeof(rtl
->buf
) - len
,
1218 "Port %d MIB counters\n",
1221 for (i
= 0; i
< RTL8366S_MIB_COUNT
; ++i
) {
1222 len
+= snprintf(buf
+ len
, sizeof(rtl
->buf
) - len
,
1223 "%d:%s\t", i
, MIBCOUNTERS
[i
]);
1224 if (!rtl8366_get_mib_counter(rtl
, i
, val
->port_vlan
, &counter
))
1225 len
+= snprintf(buf
+ len
, sizeof(rtl
->buf
) - len
,
1226 "[%llu]\n", counter
);
1228 len
+= snprintf(buf
+ len
, sizeof(rtl
->buf
) - len
,
1237 static int rtl8366s_sw_get_vlan_ports(struct switch_dev
*dev
,
1238 struct switch_val
*val
)
1240 struct rtl8366s_vlanconfig vlanmc
;
1241 struct rtl8366s
*rtl
= sw_to_rtl8366s(dev
);
1242 struct switch_port
*port
;
1245 if (val
->port_vlan
>= RTL8366_NUM_VLANS
)
1248 rtl8366s_get_vlan_member_config(rtl
, val
->port_vlan
, &vlanmc
);
1250 port
= &val
->value
.ports
[0];
1252 for (i
= 0; i
< RTL8366_NUM_PORTS
; i
++) {
1253 if (!(vlanmc
.member
& BIT(i
)))
1257 port
->flags
= (vlanmc
.untag
& BIT(i
)) ?
1258 0 : BIT(SWITCH_PORT_FLAG_TAGGED
);
1265 static int rtl8366s_sw_set_vlan_ports(struct switch_dev
*dev
,
1266 struct switch_val
*val
)
1268 struct rtl8366s_vlanconfig vlanmc
;
1269 struct rtl8366s_vlan4kentry vlan4k
;
1270 struct rtl8366s
*rtl
= sw_to_rtl8366s(dev
);
1271 struct switch_port
*port
;
1274 if (val
->port_vlan
>= RTL8366_NUM_VLANS
)
1277 rtl8366s_get_vlan_member_config(rtl
, val
->port_vlan
, &vlanmc
);
1278 rtl8366s_get_vlan_4k_entry(rtl
, vlanmc
.vid
, &vlan4k
);
1283 port
= &val
->value
.ports
[0];
1284 for (i
= 0; i
< val
->len
; i
++, port
++) {
1285 vlanmc
.member
|= BIT(port
->id
);
1287 if (!(port
->flags
& BIT(SWITCH_PORT_FLAG_TAGGED
)))
1288 vlanmc
.untag
|= BIT(port
->id
);
1291 vlan4k
.member
= vlanmc
.member
;
1292 vlan4k
.untag
= vlanmc
.untag
;
1294 rtl8366s_set_vlan_member_config(rtl
, val
->port_vlan
, &vlanmc
);
1295 rtl8366s_set_vlan_4k_entry(rtl
, &vlan4k
);
1299 static int rtl8366s_sw_get_port_pvid(struct switch_dev
*dev
, int port
, int *val
)
1301 struct rtl8366s
*rtl
= sw_to_rtl8366s(dev
);
1302 return rtl8366s_get_vlan_port_pvid(rtl
, port
, val
);
1305 static int rtl8366s_sw_set_port_pvid(struct switch_dev
*dev
, int port
, int val
)
1307 struct rtl8366s
*rtl
= sw_to_rtl8366s(dev
);
1308 return rtl8366s_set_vlan_port_pvid(rtl
, port
, val
);
1311 static int rtl8366s_sw_reset_switch(struct switch_dev
*dev
)
1313 struct rtl8366s
*rtl
= sw_to_rtl8366s(dev
);
1314 struct rtl8366_smi
*smi
= &rtl
->smi
;
1318 rtl8366_smi_write_reg(smi
, RTL8366_RESET_CTRL_REG
,
1319 RTL8366_CHIP_CTRL_RESET_HW
);
1322 if (rtl8366_smi_read_reg(smi
, RTL8366_RESET_CTRL_REG
, &data
))
1325 if (!(data
& RTL8366_CHIP_CTRL_RESET_HW
))
1327 } while (--timeout
);
1330 printk("Timeout waiting for the switch to reset\n");
1334 return rtl8366s_reset_vlan(rtl
);
1337 static struct switch_attr rtl8366s_globals
[] = {
1339 .type
= SWITCH_TYPE_INT
,
1340 .name
= "enable_vlan",
1341 .description
= "Enable VLAN mode",
1342 .set
= rtl8366s_sw_set_vlan_enable
,
1343 .get
= rtl8366s_sw_get_vlan_enable
,
1347 .type
= SWITCH_TYPE_INT
,
1348 .name
= "enable_vlan4k",
1349 .description
= "Enable VLAN 4K mode",
1350 .set
= rtl8366s_sw_set_vlan_enable
,
1351 .get
= rtl8366s_sw_get_vlan_enable
,
1355 .type
= SWITCH_TYPE_INT
,
1356 .name
= "reset_mibs",
1357 .description
= "Reset all MIB counters",
1358 .set
= rtl8366s_sw_reset_mibs
,
1362 .type
= SWITCH_TYPE_INT
,
1363 .name
= "blinkrate",
1364 .description
= "Get/Set LED blinking rate (0 = 43ms, 1 = 84ms,"
1365 " 2 = 120ms, 3 = 170ms, 4 = 340ms, 5 = 670ms)",
1366 .set
= rtl8366s_sw_set_blinkrate
,
1367 .get
= rtl8366s_sw_get_blinkrate
,
1372 static struct switch_attr rtl8366s_port
[] = {
1374 .type
= SWITCH_TYPE_STRING
,
1376 .description
= "Get port link information",
1379 .get
= rtl8366s_sw_get_port_link
,
1381 .type
= SWITCH_TYPE_INT
,
1382 .name
= "reset_mib",
1383 .description
= "Reset single port MIB counters",
1385 .set
= rtl8366s_sw_reset_port_mibs
,
1388 .type
= SWITCH_TYPE_STRING
,
1390 .description
= "Get MIB counters for port",
1393 .get
= rtl8366s_sw_get_port_mib
,
1395 .type
= SWITCH_TYPE_INT
,
1397 .description
= "Get/Set port group (0 - 3) led mode (0 - 15)",
1399 .set
= rtl8366s_sw_set_port_led
,
1400 .get
= rtl8366s_sw_get_port_led
,
1404 static struct switch_attr rtl8366s_vlan
[] = {
1406 .type
= SWITCH_TYPE_STRING
,
1408 .description
= "Get vlan information",
1411 .get
= rtl8366s_sw_get_vlan_info
,
1416 static struct switch_dev rtl8366_switch_dev
= {
1418 .cpu_port
= RTL8366_PORT_NUM_CPU
,
1419 .ports
= RTL8366_NUM_PORTS
,
1420 .vlans
= RTL8366_NUM_VLANS
,
1422 .attr
= rtl8366s_globals
,
1423 .n_attr
= ARRAY_SIZE(rtl8366s_globals
),
1426 .attr
= rtl8366s_port
,
1427 .n_attr
= ARRAY_SIZE(rtl8366s_port
),
1430 .attr
= rtl8366s_vlan
,
1431 .n_attr
= ARRAY_SIZE(rtl8366s_vlan
),
1434 .get_vlan_ports
= rtl8366s_sw_get_vlan_ports
,
1435 .set_vlan_ports
= rtl8366s_sw_set_vlan_ports
,
1436 .get_port_pvid
= rtl8366s_sw_get_port_pvid
,
1437 .set_port_pvid
= rtl8366s_sw_set_port_pvid
,
1438 .reset_switch
= rtl8366s_sw_reset_switch
,
1441 static int rtl8366s_switch_init(struct rtl8366s
*rtl
)
1443 struct switch_dev
*dev
= &rtl
->dev
;
1446 memcpy(dev
, &rtl8366_switch_dev
, sizeof(struct switch_dev
));
1448 dev
->devname
= dev_name(rtl
->parent
);
1450 err
= register_switch(dev
, NULL
);
1452 dev_err(rtl
->parent
, "switch registration failed\n");
1457 static void rtl8366s_switch_cleanup(struct rtl8366s
*rtl
)
1459 unregister_switch(&rtl
->dev
);
1462 static int rtl8366s_mii_read(struct mii_bus
*bus
, int addr
, int reg
)
1464 struct rtl8366s
*rtl
= bus
->priv
;
1468 err
= rtl8366s_read_phy_reg(rtl
, addr
, 0, reg
, &val
);
1475 static int rtl8366s_mii_write(struct mii_bus
*bus
, int addr
, int reg
, u16 val
)
1477 struct rtl8366s
*rtl
= bus
->priv
;
1481 err
= rtl8366s_write_phy_reg(rtl
, addr
, 0, reg
, val
);
1483 (void) rtl8366s_read_phy_reg(rtl
, addr
, 0, reg
, &t
);
1488 static int rtl8366s_mii_init(struct rtl8366s
*rtl
)
1493 rtl
->mii_bus
= mdiobus_alloc();
1494 if (rtl
->mii_bus
== NULL
) {
1499 rtl
->mii_bus
->priv
= (void *) rtl
;
1500 rtl
->mii_bus
->name
= "rtl8366-rtl";
1501 rtl
->mii_bus
->read
= rtl8366s_mii_read
;
1502 rtl
->mii_bus
->write
= rtl8366s_mii_write
;
1503 snprintf(rtl
->mii_bus
->id
, MII_BUS_ID_SIZE
, "%s",
1504 dev_name(rtl
->parent
));
1505 rtl
->mii_bus
->parent
= rtl
->parent
;
1506 rtl
->mii_bus
->phy_mask
= ~(0x1f);
1507 rtl
->mii_bus
->irq
= rtl
->mii_irq
;
1508 for (i
= 0; i
< PHY_MAX_ADDR
; i
++)
1509 rtl
->mii_irq
[i
] = PHY_POLL
;
1511 ret
= mdiobus_register(rtl
->mii_bus
);
1518 mdiobus_free(rtl
->mii_bus
);
1523 static void rtl8366s_mii_cleanup(struct rtl8366s
*rtl
)
1525 mdiobus_unregister(rtl
->mii_bus
);
1526 mdiobus_free(rtl
->mii_bus
);
1529 static int rtl8366s_mii_bus_match(struct mii_bus
*bus
)
1531 return (bus
->read
== rtl8366s_mii_read
&&
1532 bus
->write
== rtl8366s_mii_write
);
1535 static int rtl8366s_setup(struct rtl8366s
*rtl
)
1537 struct rtl8366_smi
*smi
= &rtl
->smi
;
1542 ret
= rtl8366_smi_read_reg(smi
, RTL8366S_CHIP_ID_REG
, &chip_id
);
1544 dev_err(rtl
->parent
, "unable to read chip id\n");
1549 case RTL8366S_CHIP_ID_8366
:
1552 dev_err(rtl
->parent
, "unknown chip id (%04x)\n", chip_id
);
1556 ret
= rtl8366_smi_read_reg(smi
, RTL8366S_CHIP_VERSION_CTRL_REG
,
1559 dev_err(rtl
->parent
, "unable to read chip version\n");
1563 dev_info(rtl
->parent
, "RTL%04x ver. %u chip found\n",
1564 chip_id
, chip_ver
& RTL8366S_CHIP_VERSION_MASK
);
1566 rtl8366s_debugfs_init(rtl
);
1571 static int __init
rtl8366s_probe(struct platform_device
*pdev
)
1573 static int rtl8366_smi_version_printed
;
1574 struct rtl8366s_platform_data
*pdata
;
1575 struct rtl8366s
*rtl
;
1576 struct rtl8366_smi
*smi
;
1579 if (!rtl8366_smi_version_printed
++)
1580 printk(KERN_NOTICE RTL8366S_DRIVER_DESC
1581 " version " RTL8366S_DRIVER_VER
"\n");
1583 pdata
= pdev
->dev
.platform_data
;
1585 dev_err(&pdev
->dev
, "no platform data specified\n");
1590 rtl
= kzalloc(sizeof(*rtl
), GFP_KERNEL
);
1592 dev_err(&pdev
->dev
, "no memory for private data\n");
1597 rtl
->parent
= &pdev
->dev
;
1600 smi
->parent
= &pdev
->dev
;
1601 smi
->gpio_sda
= pdata
->gpio_sda
;
1602 smi
->gpio_sck
= pdata
->gpio_sck
;
1604 err
= rtl8366_smi_init(smi
);
1608 platform_set_drvdata(pdev
, rtl
);
1610 err
= rtl8366s_setup(rtl
);
1612 goto err_clear_drvdata
;
1614 err
= rtl8366s_mii_init(rtl
);
1616 goto err_clear_drvdata
;
1618 err
= rtl8366s_switch_init(rtl
);
1620 goto err_mii_cleanup
;
1625 rtl8366s_mii_cleanup(rtl
);
1627 platform_set_drvdata(pdev
, NULL
);
1628 rtl8366_smi_cleanup(smi
);
1635 static int rtl8366s_phy_config_init(struct phy_device
*phydev
)
1637 if (!rtl8366s_mii_bus_match(phydev
->bus
))
1643 static int rtl8366s_phy_config_aneg(struct phy_device
*phydev
)
1648 static struct phy_driver rtl8366s_phy_driver
= {
1649 .phy_id
= 0x001cc960,
1650 .name
= "Realtek RTL8366S",
1651 .phy_id_mask
= 0x1ffffff0,
1652 .features
= PHY_GBIT_FEATURES
,
1653 .config_aneg
= rtl8366s_phy_config_aneg
,
1654 .config_init
= rtl8366s_phy_config_init
,
1655 .read_status
= genphy_read_status
,
1657 .owner
= THIS_MODULE
,
1661 static int __devexit
rtl8366s_remove(struct platform_device
*pdev
)
1663 struct rtl8366s
*rtl
= platform_get_drvdata(pdev
);
1666 rtl8366s_switch_cleanup(rtl
);
1667 rtl8366s_debugfs_remove(rtl
);
1668 rtl8366s_mii_cleanup(rtl
);
1669 platform_set_drvdata(pdev
, NULL
);
1670 rtl8366_smi_cleanup(&rtl
->smi
);
1677 static struct platform_driver rtl8366s_driver
= {
1679 .name
= RTL8366S_DRIVER_NAME
,
1680 .owner
= THIS_MODULE
,
1682 .probe
= rtl8366s_probe
,
1683 .remove
= __devexit_p(rtl8366s_remove
),
1686 static int __init
rtl8366s_module_init(void)
1689 ret
= platform_driver_register(&rtl8366s_driver
);
1693 ret
= phy_driver_register(&rtl8366s_phy_driver
);
1695 goto err_platform_unregister
;
1699 err_platform_unregister
:
1700 platform_driver_unregister(&rtl8366s_driver
);
1703 module_init(rtl8366s_module_init
);
1705 static void __exit
rtl8366s_module_exit(void)
1707 phy_driver_unregister(&rtl8366s_phy_driver
);
1708 platform_driver_unregister(&rtl8366s_driver
);
1710 module_exit(rtl8366s_module_exit
);
1712 MODULE_DESCRIPTION(RTL8366S_DRIVER_DESC
);
1713 MODULE_VERSION(RTL8366S_DRIVER_VER
);
1714 MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
1715 MODULE_AUTHOR("Antti Seppälä <a.seppala@gmail.com>");
1716 MODULE_LICENSE("GPL v2");
1717 MODULE_ALIAS("platform:" RTL8366S_DRIVER_NAME
);