rtl8366_smi: coding style cleanup
[openwrt.git] / target / linux / ar71xx / files / drivers / net / phy / rtl8366_smi.c
1 /*
2  * Platform driver for the Realtek RTL8366 ethernet switch
3  *
4  * Copyright (C) 2009 Gabor Juhos <juhosg@openwrt.org>
5  * Copyright (C) 2010 Antti Seppälä <a.seppala@gmail.com>
6  *
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.
10  */
11
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>
23
24 #ifdef CONFIG_RTL8366_SMI_DEBUG_FS
25 #include <linux/debugfs.h>
26 #endif
27
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"
31
32 #define RTL8366S_PHY_NO_MAX                 4
33 #define RTL8366S_PHY_PAGE_MAX               7
34 #define RTL8366S_PHY_ADDR_MAX               31
35
36 #define RTL8366_CHIP_GLOBAL_CTRL_REG        0x0000
37 #define RTL8366_CHIP_CTRL_VLAN              (1 << 13)
38
39 #define RTL8366_RESET_CTRL_REG              0x0100
40 #define RTL8366_CHIP_CTRL_RESET_HW          1
41 #define RTL8366_CHIP_CTRL_RESET_SW          (1 << 1)
42
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
47
48 /* PHY registers control */
49 #define RTL8366S_PHY_ACCESS_CTRL_REG        0x8028
50 #define RTL8366S_PHY_ACCESS_DATA_REG        0x8029
51
52 #define RTL8366S_PHY_CTRL_READ              1
53 #define RTL8366S_PHY_CTRL_WRITE             0
54
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)
60
61 #define RTL8366_SMI_ACK_RETRY_COUNT         5
62 #define RTL8366_SMI_CLK_DELAY               10 /* nsec */
63
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
68
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
72
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
81
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
85
86
87 #define RTL8366S_PORT_VLAN_CTRL_BASE        0x0058
88 #define RTL8366S_VLAN_TABLE_READ_BASE       0x018B
89 #define RTL8366S_VLAN_TABLE_WRITE_BASE      0x0185
90
91 #define RTL8366S_VLAN_TB_CTRL_REG           0x010F
92
93 #define RTL8366S_TABLE_ACCESS_CTRL_REG      0x0180
94 #define RTL8366S_TABLE_VLAN_READ_CTRL       0x0E01
95 #define RTL8366S_TABLE_VLAN_WRITE_CTRL      0x0F01
96
97 #define RTL8366S_VLAN_MEMCONF_BASE          0x0016
98
99
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
107
108
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
116
117
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 */
122
123 #define RTL8366_PORT_UNKNOWN                (1 << 4) /* No known connection */
124 #define RTL8366_PORT_CPU                    (1 << 5) /* CPU port */
125
126 #define RTL8366_PORT_ALL                    (RTL8366_PORT_1 |       \
127                                              RTL8366_PORT_2 |       \
128                                              RTL8366_PORT_3 |       \
129                                              RTL8366_PORT_4 |       \
130                                              RTL8366_PORT_UNKNOWN | \
131                                              RTL8366_PORT_CPU)
132
133 #define RTL8366_PORT_ALL_BUT_CPU            (RTL8366_PORT_1 |       \
134                                              RTL8366_PORT_2 |       \
135                                              RTL8366_PORT_3 |       \
136                                              RTL8366_PORT_4 |       \
137                                              RTL8366_PORT_UNKNOWN)
138
139 #define RTL8366_PORT_ALL_EXTERNAL           (RTL8366_PORT_1 |       \
140                                              RTL8366_PORT_2 |       \
141                                              RTL8366_PORT_3 |       \
142                                              RTL8366_PORT_4)
143
144 #define RTL8366_PORT_ALL_INTERNAL           (RTL8366_PORT_UNKNOWN | \
145                                              RTL8366_PORT_CPU)
146
147 struct rtl8366s_vlanconfig {
148         u16     reserved2:1;
149         u16     priority:3;
150         u16     vid:12;
151
152         u16     reserved1:1;
153         u16     fid:3;
154         u16     untag:6;
155         u16     member:6;
156 };
157
158 struct rtl8366s_vlan4kentry {
159         u16     reserved1:4;
160         u16     vid:12;
161
162         u16     reserved2:1;
163         u16     fid:3;
164         u16     untag:6;
165         u16     member:6;
166 };
167
168 static const char *MIBCOUNTERS[] = {
169         "IfInOctets                        ",
170         "EtherStatsOctets                  ",
171         "EtherStatsUnderSizePkts           ",
172         "EtherFregament                    ",
173         "EtherStatsPkts64Octets            ",
174         "EtherStatsPkts65to127Octets       ",
175         "EtherStatsPkts128to255Octets      ",
176         "EtherStatsPkts256to511Octets      ",
177         "EtherStatsPkts512to1023Octets     ",
178         "EtherStatsPkts1024to1518Octets    ",
179         "EtherOversizeStats                ",
180         "EtherStatsJabbers                 ",
181         "IfInUcastPkts                     ",
182         "EtherStatsMulticastPkts           ",
183         "EtherStatsBroadcastPkts           ",
184         "EtherStatsDropEvents              ",
185         "Dot3StatsFCSErrors                ",
186         "Dot3StatsSymbolErrors             ",
187         "Dot3InPauseFrames                 ",
188         "Dot3ControlInUnknownOpcodes       ",
189         "IfOutOctets                       ",
190         "Dot3StatsSingleCollisionFrames    ",
191         "Dot3StatMultipleCollisionFrames   ",
192         "Dot3sDeferredTransmissions        ",
193         "Dot3StatsLateCollisions           ",
194         "EtherStatsCollisions              ",
195         "Dot3StatsExcessiveCollisions      ",
196         "Dot3OutPauseFrames                ",
197         "Dot1dBasePortDelayExceededDiscards",
198         "Dot1dTpPortInDiscards             ",
199         "IfOutUcastPkts                    ",
200         "IfOutMulticastPkts                ",
201         "IfOutBroadcastPkts                ",
202         NULL,
203 };
204
205 struct rtl8366_smi {
206         struct platform_device             *pdev;
207         struct rtl8366_smi_platform_data   *pdata;
208         spinlock_t                         lock;
209         struct mii_bus                     *mii_bus;
210         struct switch_dev                  dev;
211         int                                mii_irq[PHY_MAX_ADDR];
212         char                               buf[4096];
213 #ifdef CONFIG_RTL8366_SMI_DEBUG_FS
214         struct dentry                      *debugfs_root;
215 #endif
216 };
217
218 #ifdef CONFIG_RTL8366_SMI_DEBUG_FS
219 u16 g_dbg_reg;
220 #endif
221
222 static inline struct rtl8366_smi *sw_to_rtl8366(struct switch_dev *sw)
223 {
224         return container_of(sw, struct rtl8366_smi, dev);
225 }
226
227 static inline void rtl8366_smi_clk_delay(struct rtl8366_smi *smi)
228 {
229         ndelay(RTL8366_SMI_CLK_DELAY);
230 }
231
232 static void rtl8366_smi_start(struct rtl8366_smi *smi)
233 {
234         unsigned int sda = smi->pdata->gpio_sda;
235         unsigned int sck = smi->pdata->gpio_sck;
236
237         /*
238          * Set GPIO pins to output mode, with initial state:
239          * SCK = 0, SDA = 1
240          */
241         gpio_direction_output(sck, 0);
242         gpio_direction_output(sda, 1);
243         rtl8366_smi_clk_delay(smi);
244
245         /* CLK 1: 0 -> 1, 1 -> 0 */
246         gpio_set_value(sck, 1);
247         rtl8366_smi_clk_delay(smi);
248         gpio_set_value(sck, 0);
249         rtl8366_smi_clk_delay(smi);
250
251         /* CLK 2: */
252         gpio_set_value(sck, 1);
253         rtl8366_smi_clk_delay(smi);
254         gpio_set_value(sda, 0);
255         rtl8366_smi_clk_delay(smi);
256         gpio_set_value(sck, 0);
257         rtl8366_smi_clk_delay(smi);
258         gpio_set_value(sda, 1);
259 }
260
261 static void rtl8366_smi_stop(struct rtl8366_smi *smi)
262 {
263         unsigned int sda = smi->pdata->gpio_sda;
264         unsigned int sck = smi->pdata->gpio_sck;
265
266         rtl8366_smi_clk_delay(smi);
267         gpio_set_value(sda, 0);
268         gpio_set_value(sck, 1);
269         rtl8366_smi_clk_delay(smi);
270         gpio_set_value(sda, 1);
271         rtl8366_smi_clk_delay(smi);
272         gpio_set_value(sck, 1);
273         rtl8366_smi_clk_delay(smi);
274         gpio_set_value(sck, 0);
275         rtl8366_smi_clk_delay(smi);
276         gpio_set_value(sck, 1);
277
278         /* add a click */
279         rtl8366_smi_clk_delay(smi);
280         gpio_set_value(sck, 0);
281         rtl8366_smi_clk_delay(smi);
282         gpio_set_value(sck, 1);
283
284         /* set GPIO pins to input mode */
285         gpio_direction_input(sda);
286         gpio_direction_input(sck);
287 }
288
289 static void rtl8366_smi_write_bits(struct rtl8366_smi *smi, u32 data, u32 len)
290 {
291         unsigned int sda = smi->pdata->gpio_sda;
292         unsigned int sck = smi->pdata->gpio_sck;
293
294         for (; len > 0; len--) {
295                 rtl8366_smi_clk_delay(smi);
296
297                 /* prepare data */
298                 if ( data & ( 1 << (len - 1)) )
299                         gpio_set_value(sda, 1);
300                 else
301                         gpio_set_value(sda, 0);
302                 rtl8366_smi_clk_delay(smi);
303
304                 /* clocking */
305                 gpio_set_value(sck, 1);
306                 rtl8366_smi_clk_delay(smi);
307                 gpio_set_value(sck, 0);
308         }
309 }
310
311 static void rtl8366_smi_read_bits(struct rtl8366_smi *smi, u32 len, u32 *data)
312 {
313         unsigned int sda = smi->pdata->gpio_sda;
314         unsigned int sck = smi->pdata->gpio_sck;
315
316         gpio_direction_input(sda);
317
318         for (*data = 0; len > 0; len--) {
319                 u32 u;
320
321                 rtl8366_smi_clk_delay(smi);
322
323                 /* clocking */
324                 gpio_set_value(sck, 1);
325                 rtl8366_smi_clk_delay(smi);
326                 u = gpio_get_value(sda);
327                 gpio_set_value(sck, 0);
328
329                 *data |= (u << (len - 1));
330         }
331
332         gpio_direction_output(sda, 0);
333 }
334
335 static int rtl8366_smi_wait_for_ack(struct rtl8366_smi *smi)
336 {
337         int retry_cnt;
338
339         retry_cnt = 0;
340         do {
341                 u32 ack;
342
343                 rtl8366_smi_read_bits(smi, 1, &ack);
344                 if (ack == 0)
345                         break;
346
347                 if (++retry_cnt > RTL8366_SMI_ACK_RETRY_COUNT)
348                         return -EIO;
349         } while (1);
350
351         return 0;
352 }
353
354 static int rtl8366_smi_write_byte(struct rtl8366_smi *smi, u8 data)
355 {
356         rtl8366_smi_write_bits(smi, data, 8);
357         return rtl8366_smi_wait_for_ack(smi);
358 }
359
360 static int rtl8366_smi_read_byte0(struct rtl8366_smi *smi, u8 *data)
361 {
362         u32 t;
363
364         /* read data */
365         rtl8366_smi_read_bits(smi, 8, &t);
366         *data = (t & 0xff);
367
368         /* send an ACK */
369         rtl8366_smi_write_bits(smi, 0x00, 1);
370
371         return 0;
372 }
373
374 static int rtl8366_smi_read_byte1(struct rtl8366_smi *smi, u8 *data)
375 {
376         u32 t;
377
378         /* read data */
379         rtl8366_smi_read_bits(smi, 8, &t);
380         *data = (t & 0xff);
381
382         /* send an ACK */
383         rtl8366_smi_write_bits(smi, 0x01, 1);
384
385         return 0;
386 }
387
388 static int rtl8366_smi_read_reg(struct rtl8366_smi *smi, u32 addr, u32 *data)
389 {
390         unsigned long flags;
391         u8 lo = 0;
392         u8 hi = 0;
393         int ret;
394
395         spin_lock_irqsave(&smi->lock, flags);
396
397         rtl8366_smi_start(smi);
398
399         /* send READ command */
400         ret = rtl8366_smi_write_byte(smi, 0x0a << 4 | 0x04 << 1 | 0x01);
401         if (ret)
402                 goto out;
403
404         /* set ADDR[7:0] */
405         ret = rtl8366_smi_write_byte(smi, addr & 0xff);
406         if (ret)
407                 goto out;
408
409         /* set ADDR[15:8] */
410         ret = rtl8366_smi_write_byte(smi, addr >> 8);
411         if (ret)
412                 goto out;
413
414         /* read DATA[7:0] */
415         rtl8366_smi_read_byte0(smi, &lo);
416         /* read DATA[15:8] */
417         rtl8366_smi_read_byte1(smi, &hi);
418
419         *data = ((u32) lo) | (((u32) hi) << 8);
420
421         ret = 0;
422
423  out:
424         rtl8366_smi_stop(smi);
425         spin_unlock_irqrestore(&smi->lock, flags);
426
427         return ret;
428 }
429
430 static int rtl8366_smi_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data)
431 {
432         unsigned long flags;
433         int ret;
434
435         spin_lock_irqsave(&smi->lock, flags);
436
437         rtl8366_smi_start(smi);
438
439         /* send WRITE command */
440         ret = rtl8366_smi_write_byte(smi, 0x0a << 4 | 0x04 << 1 | 0x00);
441         if (ret)
442                 goto out;
443
444         /* set ADDR[7:0] */
445         ret = rtl8366_smi_write_byte(smi, addr & 0xff);
446         if (ret)
447                 goto out;
448
449         /* set ADDR[15:8] */
450         ret = rtl8366_smi_write_byte(smi, addr >> 8);
451         if (ret)
452                 goto out;
453
454         /* write DATA[7:0] */
455         ret = rtl8366_smi_write_byte(smi, data & 0xff);
456         if (ret)
457                 goto out;
458
459         /* write DATA[15:8] */
460         ret = rtl8366_smi_write_byte(smi, data >> 8);
461         if (ret)
462                 goto out;
463
464         ret = 0;
465
466  out:
467         rtl8366_smi_stop(smi);
468         spin_unlock_irqrestore(&smi->lock, flags);
469
470         return ret;
471 }
472
473 static int rtl8366_smi_read_phy_reg(struct rtl8366_smi *smi,
474                                     u32 phy_no, u32 page, u32 addr, u32 *data)
475 {
476         u32 reg;
477         int ret;
478
479         if (phy_no > RTL8366S_PHY_NO_MAX)
480                 return -EINVAL;
481
482         if (page > RTL8366S_PHY_PAGE_MAX)
483                 return -EINVAL;
484
485         if (addr > RTL8366S_PHY_ADDR_MAX)
486                 return -EINVAL;
487
488         ret = rtl8366_smi_write_reg(smi, RTL8366S_PHY_ACCESS_CTRL_REG,
489                                     RTL8366S_PHY_CTRL_READ);
490         if (ret)
491                 return ret;
492
493         reg = 0x8000 | (1 << (phy_no + RTL8366S_PHY_NO_OFFSET)) |
494               ((page << RTL8366S_PHY_PAGE_OFFSET) & RTL8366S_PHY_PAGE_MASK) |
495               (addr & RTL8366S_PHY_REG_MASK);
496
497         ret = rtl8366_smi_write_reg(smi, reg, 0);
498         if (ret)
499                 return ret;
500
501         ret = rtl8366_smi_read_reg(smi, RTL8366S_PHY_ACCESS_DATA_REG, data);
502         if (ret)
503                 return ret;
504
505         return 0;
506 }
507
508 static int rtl8366_smi_write_phy_reg(struct rtl8366_smi *smi,
509                                      u32 phy_no, u32 page, u32 addr, u32 data)
510 {
511         u32 reg;
512         int ret;
513
514         if (phy_no > RTL8366S_PHY_NO_MAX)
515                 return -EINVAL;
516
517         if (page > RTL8366S_PHY_PAGE_MAX)
518                 return -EINVAL;
519
520         if (addr > RTL8366S_PHY_ADDR_MAX)
521                 return -EINVAL;
522
523         ret = rtl8366_smi_write_reg(smi, RTL8366S_PHY_ACCESS_CTRL_REG,
524                                     RTL8366S_PHY_CTRL_WRITE);
525         if (ret)
526                 return ret;
527
528         reg = 0x8000 | (1 << (phy_no + RTL8366S_PHY_NO_OFFSET)) |
529               ((page << RTL8366S_PHY_PAGE_OFFSET) & RTL8366S_PHY_PAGE_MASK) |
530               (addr & RTL8366S_PHY_REG_MASK);
531
532         ret = rtl8366_smi_write_reg(smi, reg, data);
533         if (ret)
534                 return ret;
535
536         return 0;
537 }
538
539 static int rtl8366_get_mib_counter(struct rtl8366_smi *smi, int counter,
540                                    int port, unsigned long long *val)
541 {
542         int i;
543         int err;
544         u32 addr, data, regoffset;
545         u64 mibvalue;
546
547         /* address offset to MIBs counter */
548         const u16 mibLength[RTL8366S_MIB_COUNT] = {4, 4, 2, 2, 2, 2, 2, 2, 2,
549                                                    2, 2, 2, 2, 2, 2, 2, 2, 2,
550                                                    2, 2, 4, 2, 2, 2, 2, 2, 2,
551                                                    2, 2, 2, 2, 2, 2};
552
553         if (port > RTL8366_NUM_PORTS || counter >= RTL8366S_MIB_COUNT)
554                 return -EINVAL;
555
556         i = 0;
557         regoffset = RTL8366S_MIB_COUNTER_PORT_OFFSET * (port);
558
559         while (i < counter) {
560                 regoffset += mibLength[i];
561                 i++;
562         }
563
564         addr = RTL8366S_MIB_COUNTER_BASE + regoffset;
565
566         /*
567          * Writing access counter address first
568          * then ASIC will prepare 64bits counter wait for being retrived
569          */
570         data = 0; /* writing data will be discard by ASIC */
571         err = rtl8366_smi_write_reg(smi, addr, data);
572         if (err)
573                 return err;
574
575         /* read MIB control register */
576         err =  rtl8366_smi_read_reg(smi, RTL8366S_MIB_CTRL_REG, &data);
577         if (err)
578                 return err;
579
580         if (data & RTL8366S_MIB_CTRL_BUSY_MASK)
581                 return -EBUSY;
582
583         if (data & RTL8366S_MIB_CTRL_RESET_MASK)
584                 return -EIO;
585
586         mibvalue = 0;
587         addr = addr + mibLength[counter] - 1;
588         i = mibLength[counter];
589
590         while (i) {
591                 err = rtl8366_smi_read_reg(smi, addr, &data);
592                 if (err)
593                         return err;
594
595                 mibvalue = (mibvalue << 16) | (data & 0xFFFF);
596
597                 addr--;
598                 i--;
599         }
600
601         *val = mibvalue;
602         return 0;
603 }
604
605 static int rtl8366s_get_vlan_4k_entry(struct rtl8366_smi *smi, u32 vid,
606                                       struct rtl8366s_vlan4kentry *vlan4k)
607 {
608         int err;
609         u32 data;
610         u16 *tableaddr;
611
612         memset(vlan4k, '\0', sizeof(struct rtl8366s_vlan4kentry));
613         vlan4k->vid = vid;
614
615         if (vid >= RTL8366_NUM_VIDS)
616                 return -EINVAL;
617
618         tableaddr = (u16 *)vlan4k;
619
620         /* write VID */
621         data = *tableaddr;
622         err = rtl8366_smi_write_reg(smi, RTL8366S_VLAN_TABLE_WRITE_BASE, data);
623         if (err)
624                 return err;
625
626         /* write table access control word */
627         err = rtl8366_smi_write_reg(smi, RTL8366S_TABLE_ACCESS_CTRL_REG,
628                                     RTL8366S_TABLE_VLAN_READ_CTRL);
629         if (err)
630                 return err;
631
632         err = rtl8366_smi_read_reg(smi, RTL8366S_VLAN_TABLE_READ_BASE, &data);
633         if (err)
634                 return err;
635
636         *tableaddr = data;
637         tableaddr++;
638
639         err = rtl8366_smi_read_reg(smi, RTL8366S_VLAN_TABLE_READ_BASE + 1,
640                                    &data);
641         if (err)
642                 return err;
643
644         *tableaddr = data;
645         vlan4k->vid = vid;
646
647         return 0;
648 }
649
650 static int rtl8366s_set_vlan_4k_entry(struct rtl8366_smi *smi,
651                                       const struct rtl8366s_vlan4kentry *vlan4k)
652 {
653         int err;
654         u32 data;
655         u16 *tableaddr;
656
657         if (vlan4k->vid >= RTL8366_NUM_VIDS ||
658             vlan4k->member > RTL8366_PORT_ALL ||
659             vlan4k->untag > RTL8366_PORT_ALL ||
660             vlan4k->fid > RTL8366S_FIDMAX)
661                 return -EINVAL;
662
663         tableaddr = (u16 *)vlan4k;
664
665         data = *tableaddr;
666
667         err = rtl8366_smi_write_reg(smi, RTL8366S_VLAN_TABLE_WRITE_BASE, data);
668         if (err)
669                 return err;
670
671         tableaddr++;
672
673         data = *tableaddr;
674
675         err = rtl8366_smi_write_reg(smi, RTL8366S_VLAN_TABLE_WRITE_BASE + 1,
676                                     data);
677         if (err)
678                 return err;
679
680         /* write table access control word */
681         err = rtl8366_smi_write_reg(smi, RTL8366S_TABLE_ACCESS_CTRL_REG,
682                                     RTL8366S_TABLE_VLAN_WRITE_CTRL);
683
684         return err;
685 }
686
687 static int rtl8366s_get_vlan_member_config(struct rtl8366_smi *smi, u32 index,
688                                            struct rtl8366s_vlanconfig *vlanmc)
689 {
690         int err;
691         u32 addr;
692         u32 data;
693         u16 *tableaddr;
694
695         memset(vlanmc, '\0', sizeof(struct rtl8366s_vlanconfig));
696
697         if (index >= RTL8366_NUM_VLANS)
698                 return -EINVAL;
699
700         tableaddr = (u16 *)vlanmc;
701
702         addr = RTL8366S_VLAN_MEMCONF_BASE + (index << 1);
703         err = rtl8366_smi_read_reg(smi, addr, &data);
704         if (err)
705                 return err;
706
707         *tableaddr = data;
708         tableaddr++;
709
710         addr = RTL8366S_VLAN_MEMCONF_BASE + 1 + (index << 1);
711         err = rtl8366_smi_read_reg(smi, addr, &data);
712         if (err)
713                 return err;
714
715         *tableaddr = data;
716
717         return 0;
718 }
719
720 static int rtl8366s_set_vlan_member_config(struct rtl8366_smi *smi, u32 index,
721                                            const struct rtl8366s_vlanconfig
722                                            *vlanmc)
723 {
724         int err;
725         u32 addr;
726         u32 data;
727         u16 *tableaddr;
728
729         if (index >= RTL8366_NUM_VLANS ||
730             vlanmc->vid >= RTL8366_NUM_VIDS ||
731             vlanmc->priority > RTL8366S_PRIORITYMAX ||
732             vlanmc->member > RTL8366_PORT_ALL ||
733             vlanmc->untag > RTL8366_PORT_ALL ||
734             vlanmc->fid > RTL8366S_FIDMAX)
735                 return -EINVAL;
736
737         addr = RTL8366S_VLAN_MEMCONF_BASE + (index << 1);
738
739         tableaddr = (u16 *)vlanmc;
740         data = *tableaddr;
741
742         err = rtl8366_smi_write_reg(smi, addr, data);
743         if (err)
744                 return err;
745
746         addr = RTL8366S_VLAN_MEMCONF_BASE + 1 + (index << 1);
747
748         tableaddr++;
749         data = *tableaddr;
750
751         err = rtl8366_smi_write_reg(smi, addr, data);
752         if (err)
753                 return err;
754
755         return 0;
756 }
757
758 static int rtl8366_get_port_vlan_index(struct rtl8366_smi *smi, int port,
759                                        int *val)
760 {
761         int err;
762         u32 addr;
763         u32 data;
764
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 };
772
773         if (port >= RTL8366_NUM_PORTS)
774                 return -EINVAL;
775
776         addr = RTL8366S_PORT_VLAN_CTRL_BASE + addroffset[port];
777         err = rtl8366_smi_read_reg(smi, addr, &data);
778         if (err)
779                 return err;
780
781         *val = (data & bits[port]) >> bitoffset[port];
782
783         return 0;
784
785 }
786
787 static int rtl8366_get_vlan_port_pvid(struct rtl8366_smi *smi, int port,
788                                       int *val)
789 {
790         struct rtl8366s_vlanconfig vlanmc;
791         int err;
792         int index;
793
794         err = rtl8366_get_port_vlan_index(smi, port, &index);
795         if (err)
796                 return err;
797
798         err = rtl8366s_get_vlan_member_config(smi, index, &vlanmc);
799         if (err)
800                 return err;
801
802         *val = vlanmc.vid;
803         return 0;
804 }
805
806 static int rtl8366_set_port_vlan_index(struct rtl8366_smi *smi, int port,
807                                        int index)
808 {
809         int err;
810         u32 addr;
811         u32 data;
812         u32 vlan_data;
813         u32 bits;
814
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 };
822
823         if (port >= RTL8366_NUM_PORTS || index >= RTL8366_NUM_VLANS)
824                 return -EINVAL;
825
826         addr = RTL8366S_PORT_VLAN_CTRL_BASE + addrOff[port];
827
828         bits = bitmasks[port];
829
830         data = (index << bitOff[port]) & bits;
831
832         err = rtl8366_smi_read_reg(smi, addr, &vlan_data);
833         if (err)
834                 return err;
835
836         vlan_data &= ~(vlan_data & bits);
837         vlan_data |= data;
838
839         err = rtl8366_smi_write_reg(smi, addr, vlan_data);
840         if (err)
841                 return err;
842
843         return 0;
844 }
845
846 static int rtl8366_set_vlan_port_pvid(struct rtl8366_smi *smi, int port,
847                                       int val)
848 {
849         int i;
850         struct rtl8366s_vlanconfig vlanmc;
851         struct rtl8366s_vlan4kentry vlan4k;
852
853         if (port >= RTL8366_NUM_PORTS || val >= RTL8366_NUM_VIDS)
854                 return -EINVAL;
855
856         /* Updating the 4K entry; lookup it and change the port member set */
857         rtl8366s_get_vlan_4k_entry(smi, val, &vlan4k);
858         vlan4k.member |= ((1 << port) | RTL8366_PORT_CPU);
859         vlan4k.untag = RTL8366_PORT_ALL_BUT_CPU;
860         rtl8366s_set_vlan_4k_entry(smi, &vlan4k);
861
862         /*
863          * For the 16 entries more work needs to be done. First see if such
864          * VID is already there and change it
865          */
866         for (i = 0; i < RTL8366_NUM_VLANS; ++i) {
867                 rtl8366s_get_vlan_member_config(smi, i, &vlanmc);
868
869                 /* Try to find an existing vid and update port member set */
870                 if (val == vlanmc.vid) {
871                         vlanmc.member |= ((1 << port) | RTL8366_PORT_CPU);
872                         rtl8366s_set_vlan_member_config(smi, i, &vlanmc);
873
874                         /* Now update PVID register settings */
875                         rtl8366_set_port_vlan_index(smi, port, i);
876
877                         return 0;
878                 }
879         }
880
881         /*
882          * PVID could not be found from vlan table. Replace unused (one that
883          * has no member ports) with new one
884          */
885         for (i = 0; i < RTL8366_NUM_VLANS; ++i) {
886                 rtl8366s_get_vlan_member_config(smi, i, &vlanmc);
887
888                 /*
889                  * See if this vlan member configuration is unused. It is
890                  * unused if member set contains no ports or CPU port only
891                  */
892                 if (!vlanmc.member || vlanmc.member == RTL8366_PORT_CPU) {
893                         vlanmc.vid = val;
894                         vlanmc.priority = 0;
895                         vlanmc.untag = RTL8366_PORT_ALL_BUT_CPU;
896                         vlanmc.member = ((1 << port) | RTL8366_PORT_CPU);
897                         vlanmc.fid = 0;
898
899                         rtl8366s_set_vlan_member_config(smi, i, &vlanmc);
900
901                         /* Now update PVID register settings */
902                         rtl8366_set_port_vlan_index(smi, port, i);
903
904                         return 0;
905                 }
906         }
907
908         dev_err(&smi->pdev->dev,
909                 "All 16 vlan member configurations are in use\n");
910
911         return -EINVAL;
912 }
913
914
915 static int rtl8366_vlan_set_vlan(struct rtl8366_smi *smi, int enable)
916 {
917         u32 data = 0;
918
919         rtl8366_smi_read_reg(smi, RTL8366_CHIP_GLOBAL_CTRL_REG, &data);
920
921         data &= ~(data & RTL8366_CHIP_CTRL_VLAN);
922         if (enable)
923                 data |= RTL8366_CHIP_CTRL_VLAN;
924
925         return rtl8366_smi_write_reg(smi, RTL8366_CHIP_GLOBAL_CTRL_REG, data);
926 }
927
928 static int rtl8366_vlan_set_4ktable(struct rtl8366_smi *smi, int enable)
929 {
930         u32 data = 0;
931
932         rtl8366_smi_read_reg(smi, RTL8366S_VLAN_TB_CTRL_REG, &data);
933
934         data &= ~(data & 1);
935         if (enable)
936                 data |= 1;
937
938         return rtl8366_smi_write_reg(smi, RTL8366S_VLAN_TB_CTRL_REG, data);
939 }
940
941 static int rtl8366s_reset_vlan(struct rtl8366_smi *smi)
942 {
943         struct rtl8366s_vlan4kentry vlan4k;
944         struct rtl8366s_vlanconfig vlanmc;
945         int err;
946         int i;
947
948         /* clear 16 VLAN member configuration */
949         vlanmc.vid = 0;
950         vlanmc.priority = 0;
951         vlanmc.member = 0;
952         vlanmc.untag = 0;
953         vlanmc.fid = 0;
954         for (i = 0; i < RTL8366_NUM_VLANS; i++) {
955                 err = rtl8366s_set_vlan_member_config(smi, i, &vlanmc);
956                 if (err)
957                         return err;
958         }
959
960         /* Set a default VLAN with vid 1 to 4K table for all ports */
961         vlan4k.vid = 1;
962         vlan4k.member = RTL8366_PORT_ALL;
963         vlan4k.untag = RTL8366_PORT_ALL;
964         vlan4k.fid = 0;
965         err = rtl8366s_set_vlan_4k_entry(smi, &vlan4k);
966         if (err)
967                 return err;
968
969         /* Set all ports PVID to default VLAN */
970         for (i = 0; i < RTL8366_NUM_PORTS; i++) {
971                 err = rtl8366_set_vlan_port_pvid(smi, i, 0);
972                 if (err)
973                         return err;
974         }
975
976         return 0;
977 }
978
979 #ifdef CONFIG_RTL8366_SMI_DEBUG_FS
980 static int rtl8366_debugfs_open(struct inode *inode, struct file *file)
981 {
982         file->private_data = inode->i_private;
983         return 0;
984 }
985
986 static ssize_t rtl8366_read_debugfs_mibs(struct file *file,
987                                          char __user *user_buf,
988                                          size_t count, loff_t *ppos)
989 {
990         struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
991         int i, j, len = 0;
992         char *buf = smi->buf;
993
994         len += snprintf(buf + len, sizeof(smi->buf) - len, "MIB Counters:\n");
995         len += snprintf(buf + len, sizeof(smi->buf) - len, "Counter"
996                         "                            "
997                         "Port 0 \t\t Port 1 \t\t Port 2 \t\t Port 3 \t\t "
998                         "Port 4\n");
999
1000         for (i = 0; i < 33; ++i) {
1001                 len += snprintf(buf + len, sizeof(smi->buf) - len, "%d:%s ",
1002                                 i, MIBCOUNTERS[i]);
1003                 for (j = 0; j < RTL8366_NUM_PORTS; ++j) {
1004                         unsigned long long counter = 0;
1005
1006                         if (!rtl8366_get_mib_counter(smi, i, j, &counter))
1007                                 len += snprintf(buf + len,
1008                                                 sizeof(smi->buf) - len,
1009                                                 "[%llu]", counter);
1010                         else
1011                                 len += snprintf(buf + len,
1012                                                 sizeof(smi->buf) - len,
1013                                                 "[error]");
1014
1015                         if (j != RTL8366_NUM_PORTS - 1) {
1016                                 if (counter < 100000)
1017                                         len += snprintf(buf + len,
1018                                                         sizeof(smi->buf) - len,
1019                                                         "\t");
1020
1021                                 len += snprintf(buf + len,
1022                                                 sizeof(smi->buf) - len,
1023                                                 "\t");
1024                         }
1025                 }
1026                 len += snprintf(buf + len, sizeof(smi->buf) - len, "\n");
1027         }
1028
1029         len += snprintf(buf + len, sizeof(smi->buf) - len, "\n");
1030
1031         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1032 }
1033
1034 static ssize_t rtl8366_read_debugfs_vlan(struct file *file,
1035                                          char __user *user_buf,
1036                                          size_t count, loff_t *ppos)
1037 {
1038         struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
1039         int i, j, len = 0;
1040         char *buf = smi->buf;
1041
1042         len += snprintf(buf + len, sizeof(smi->buf) - len,
1043                         "VLAN Member Config:\n");
1044         len += snprintf(buf + len, sizeof(smi->buf) - len,
1045                         "\t id \t vid \t prio \t member \t untag  \t fid "
1046                         "\tports\n");
1047
1048         for (i = 0; i < RTL8366_NUM_VLANS; ++i) {
1049                 struct rtl8366s_vlanconfig vlanmc;
1050
1051                 rtl8366s_get_vlan_member_config(smi, i, &vlanmc);
1052
1053                 len += snprintf(buf + len, sizeof(smi->buf) - len,
1054                                 "\t[%d] \t %d \t %d \t 0x%04x \t 0x%04x \t %d "
1055                                 "\t", i, vlanmc.vid, vlanmc.priority,
1056                                 vlanmc.member, vlanmc.untag, vlanmc.fid);
1057
1058                 for (j = 0; j < RTL8366_NUM_PORTS; ++j) {
1059                         int index = 0;
1060                         if (!rtl8366_get_port_vlan_index(smi, j, &index)) {
1061                                 if (index == i)
1062                                         len += snprintf(buf + len,
1063                                                         sizeof(smi->buf) - len,
1064                                                         "%d", j);
1065                         }
1066                 }
1067                 len += snprintf(buf + len, sizeof(smi->buf) - len, "\n");
1068         }
1069
1070         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1071 }
1072
1073 static ssize_t rtl8366_read_debugfs_reg(struct file *file,
1074                                         char __user *user_buf,
1075                                         size_t count, loff_t *ppos)
1076 {
1077         struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
1078         u32 t, reg = g_dbg_reg;
1079         int err, len = 0;
1080         char *buf = smi->buf;
1081
1082         memset(buf, '\0', sizeof(smi->buf));
1083
1084         err = rtl8366_smi_read_reg(smi, reg, &t);
1085         if (err) {
1086                 len += snprintf(buf, sizeof(smi->buf),
1087                                 "Read failed (reg: 0x%04x)\n", reg);
1088                 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1089         }
1090
1091         len += snprintf(buf, sizeof(smi->buf), "reg = 0x%04x, val = 0x%04x\n",
1092                         reg, t);
1093
1094         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1095 }
1096
1097 static ssize_t rtl8366_write_debugfs_reg(struct file *file,
1098                                          const char __user *user_buf,
1099                                          size_t count, loff_t *ppos)
1100 {
1101         struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
1102         unsigned long data;
1103         u32 reg = g_dbg_reg;
1104         int err;
1105         size_t len;
1106         char *buf = smi->buf;
1107
1108         len = min(count, sizeof(smi->buf) - 1);
1109         if (copy_from_user(buf, user_buf, len)) {
1110                 dev_err(&smi->pdev->dev, "copy from user failed\n");
1111                 return -EFAULT;
1112         }
1113
1114         buf[len] = '\0';
1115         if (len > 0 && buf[len - 1] == '\n')
1116                 buf[len - 1] = '\0';
1117
1118
1119         if (strict_strtoul(buf, 16, &data)) {
1120                 dev_err(&smi->pdev->dev, "Invalid reg value %s\n", buf);
1121         } else {
1122                 err = rtl8366_smi_write_reg(smi, reg, data);
1123                 if (err) {
1124                         dev_err(&smi->pdev->dev,
1125                                 "writing reg 0x%04x val 0x%04lx failed\n",
1126                                 reg, data);
1127                 }
1128         }
1129
1130         return count;
1131 }
1132
1133 static const struct file_operations fops_rtl8366_regs = {
1134         .read = rtl8366_read_debugfs_reg,
1135         .write = rtl8366_write_debugfs_reg,
1136         .open = rtl8366_debugfs_open,
1137         .owner = THIS_MODULE
1138 };
1139
1140 static const struct file_operations fops_rtl8366_vlan = {
1141         .read = rtl8366_read_debugfs_vlan,
1142         .open = rtl8366_debugfs_open,
1143         .owner = THIS_MODULE
1144 };
1145
1146 static const struct file_operations fops_rtl8366_mibs = {
1147         .read = rtl8366_read_debugfs_mibs,
1148         .open = rtl8366_debugfs_open,
1149         .owner = THIS_MODULE
1150 };
1151
1152 static void rtl8366_debugfs_init(struct rtl8366_smi *smi)
1153 {
1154         struct dentry *node;
1155         struct dentry *root;
1156
1157         if (!smi->debugfs_root)
1158                 smi->debugfs_root = debugfs_create_dir("rtl8366s", NULL);
1159
1160         if (!smi->debugfs_root) {
1161                 dev_err(&smi->pdev->dev, "Unable to create debugfs dir\n");
1162                 return;
1163         }
1164         root = smi->debugfs_root;
1165
1166         node = debugfs_create_x16("reg", S_IRUGO | S_IWUSR, root, &g_dbg_reg);
1167         if (!node) {
1168                 dev_err(&smi->pdev->dev, "Creating debugfs file reg failed\n");
1169                 return;
1170         }
1171
1172         node = debugfs_create_file("val", S_IRUGO | S_IWUSR, root, smi,
1173                                    &fops_rtl8366_regs);
1174         if (!node) {
1175                 dev_err(&smi->pdev->dev, "Creating debugfs file val failed\n");
1176                 return;
1177         }
1178
1179         node = debugfs_create_file("vlan", S_IRUSR, root, smi,
1180                                    &fops_rtl8366_vlan);
1181         if (!node) {
1182                 dev_err(&smi->pdev->dev,
1183                         "Creating debugfs file vlan failed\n");
1184                 return;
1185         }
1186
1187         node = debugfs_create_file("mibs", S_IRUSR, root, smi,
1188                                    &fops_rtl8366_mibs);
1189         if (!node) {
1190                 dev_err(&smi->pdev->dev,
1191                         "Creating debugfs file mibs failed\n");
1192                 return;
1193         }
1194 }
1195
1196 static void rtl8366_debugfs_remove(struct rtl8366_smi *smi)
1197 {
1198         if (smi->debugfs_root) {
1199                 debugfs_remove_recursive(smi->debugfs_root);
1200                 smi->debugfs_root = NULL;
1201         }
1202 }
1203
1204 #else
1205 static inline void rtl8366_debugfs_init(struct rtl8366_smi *smi) {}
1206 static inline void rtl8366_debugfs_remove(struct rtl8366_smi *smi) {}
1207 #endif /* CONFIG_RTL8366_SMI_DEBUG_FS */
1208
1209 static int rtl8366_global_reset_mibs(struct switch_dev *dev,
1210                                      const struct switch_attr *attr,
1211                                      struct switch_val *val)
1212 {
1213         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1214         u32 data = 0;
1215
1216         if (val->value.i == 1) {
1217                 rtl8366_smi_read_reg(smi, RTL8366S_MIB_CTRL_REG, &data);
1218                 data |= (1 << 2);
1219                 rtl8366_smi_write_reg(smi, RTL8366S_MIB_CTRL_REG, data);
1220         }
1221
1222         return 0;
1223 }
1224
1225 static int rtl8366_get_vlan(struct switch_dev *dev,
1226                             const struct switch_attr *attr,
1227                             struct switch_val *val)
1228 {
1229         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1230         u32 data;
1231
1232         if (attr->ofs == 1) {
1233                 rtl8366_smi_read_reg(smi, RTL8366_CHIP_GLOBAL_CTRL_REG, &data);
1234
1235                 if (data & RTL8366_CHIP_CTRL_VLAN)
1236                         val->value.i = 1;
1237                 else
1238                         val->value.i = 0;
1239         } else if (attr->ofs == 2) {
1240                 rtl8366_smi_read_reg(smi, RTL8366S_VLAN_TB_CTRL_REG, &data);
1241
1242                 if (data & 0x0001)
1243                         val->value.i = 1;
1244                 else
1245                         val->value.i = 0;
1246         }
1247
1248         return 0;
1249 }
1250
1251 static int rtl8366_global_get_blinkrate(struct switch_dev *dev,
1252                                         const struct switch_attr *attr,
1253                                         struct switch_val *val)
1254 {
1255         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1256         u32 data;
1257
1258         rtl8366_smi_read_reg(smi, RTL8366_LED_BLINKRATE_REG, &data);
1259
1260         val->value.i = (data & (RTL8366_LED_BLINKRATE_MASK));
1261
1262         return 0;
1263 }
1264
1265 static int rtl8366_global_set_blinkrate(struct switch_dev *dev,
1266                                         const struct switch_attr *attr,
1267                                         struct switch_val *val)
1268 {
1269         u32 data;
1270         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1271
1272         if (val->value.i >= 6)
1273                 return -EINVAL;
1274
1275         rtl8366_smi_read_reg(smi, RTL8366_LED_BLINKRATE_REG, &data);
1276
1277         data &= ~(data & RTL8366_LED_BLINKRATE_MASK);
1278         data |= val->value.i;
1279
1280         rtl8366_smi_write_reg(smi, RTL8366_LED_BLINKRATE_REG, data);
1281
1282         return 0;
1283 }
1284
1285 static int rtl8366_set_vlan(struct switch_dev *dev,
1286                             const struct switch_attr *attr,
1287                             struct switch_val *val)
1288 {
1289         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1290
1291         if (attr->ofs == 1)
1292                 return rtl8366_vlan_set_vlan(smi, val->value.i);
1293         else
1294                 return rtl8366_vlan_set_4ktable(smi, val->value.i);
1295 }
1296
1297 static int rtl8366_attr_get_port_link(struct switch_dev *dev,
1298                                       const struct switch_attr *attr,
1299                                       struct switch_val *val)
1300 {
1301         u32 len = 0, data = 0;
1302         int speed, duplex, link, txpause, rxpause, nway;
1303         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1304         char *buf = smi->buf;
1305
1306         if (val->port_vlan >= RTL8366_NUM_PORTS)
1307                 return -EINVAL;
1308
1309         memset(buf, '\0', sizeof(smi->buf));
1310         rtl8366_smi_read_reg(smi, RTL8366S_PORT_LINK_STATUS_BASE +
1311                              (val->port_vlan >> 1),
1312                              &data);
1313
1314         if (val->port_vlan & 0x1)
1315                 data = data >> 8;
1316
1317         speed = (data & RTL8366S_PORT_STATUS_SPEED_MASK);
1318         duplex = (data & RTL8366S_PORT_STATUS_DUPLEX_MASK) >> 2;
1319         link = (data & RTL8366S_PORT_STATUS_LINK_MASK) >> 4;
1320         txpause = (data & RTL8366S_PORT_STATUS_TXPAUSE_MASK) >> 5;
1321         rxpause = (data & RTL8366S_PORT_STATUS_RXPAUSE_MASK) >> 6;
1322         nway = (data & RTL8366S_PORT_STATUS_AN_MASK) >> 7;
1323
1324         len += snprintf(buf + len, sizeof(smi->buf) - len, "Port %d: ",
1325                         val->port_vlan);
1326
1327         if (link)
1328                 len += snprintf(buf + len, sizeof(smi->buf) - len,
1329                                 "Link UP, Speed: ");
1330         else
1331                 len += snprintf(buf + len, sizeof(smi->buf) - len,
1332                                 "Link DOWN, Speed: ");
1333
1334         if (speed == 0)
1335                 len += snprintf(buf + len, sizeof(smi->buf) - len,
1336                                 "10Base-TX ");
1337         else if (speed == 1)
1338                 len += snprintf(buf + len, sizeof(smi->buf) - len,
1339                                 "100Base-TX ");
1340         else if (speed == 2)
1341                 len += snprintf(buf + len, sizeof(smi->buf) - len,
1342                                 "1000Base-TX ");
1343
1344         if (duplex)
1345                 len += snprintf(buf + len, sizeof(smi->buf) - len,
1346                                 "Full-Duplex, ");
1347         else
1348                 len += snprintf(buf + len, sizeof(smi->buf) - len,
1349                                 "Half-Duplex, ");
1350
1351         if (txpause)
1352                 len += snprintf(buf + len, sizeof(smi->buf) - len,
1353                                 "TX-Pause ");
1354         if (rxpause)
1355                 len += snprintf(buf + len, sizeof(smi->buf) - len,
1356                                 "RX-Pause ");
1357         if (nway)
1358                 len += snprintf(buf + len, sizeof(smi->buf) - len,
1359                                 "nway ");
1360
1361         val->value.s = buf;
1362         val->len = len;
1363
1364         return 0;
1365 }
1366
1367 static int rtl8366_attr_get_vlan_info(struct switch_dev *dev,
1368                                       const struct switch_attr *attr,
1369                                       struct switch_val *val)
1370 {
1371         int i;
1372         u32 len = 0;
1373         struct rtl8366s_vlanconfig vlanmc;
1374         struct rtl8366s_vlan4kentry vlan4k;
1375         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1376         char *buf = smi->buf;
1377
1378         if (val->port_vlan >= RTL8366_NUM_VLANS)
1379                 return -EINVAL;
1380
1381         memset(buf, '\0', sizeof(smi->buf));
1382
1383         rtl8366s_get_vlan_member_config(smi, val->port_vlan, &vlanmc);
1384         rtl8366s_get_vlan_4k_entry(smi, vlanmc.vid, &vlan4k);
1385
1386         len += snprintf(buf + len, sizeof(smi->buf) - len, "VLAN %d: Ports: ",
1387                         val->port_vlan);
1388
1389         for (i = 0; i < RTL8366_NUM_PORTS; ++i) {
1390                 int index = 0;
1391                 if (!rtl8366_get_port_vlan_index(smi, i, &index) &&
1392                     index == val->port_vlan)
1393                         len += snprintf(buf + len, sizeof(smi->buf) - len,
1394                                         "%d", i);
1395         }
1396         len += snprintf(buf + len, sizeof(smi->buf) - len, "\n");
1397
1398         len += snprintf(buf + len, sizeof(smi->buf) - len,
1399                         "\t\t vid \t prio \t member \t untag \t fid\n");
1400         len += snprintf(buf + len, sizeof(smi->buf) - len, "\tMC:\t");
1401         len += snprintf(buf + len, sizeof(smi->buf) - len,
1402                         "%d \t %d \t 0x%04x \t 0x%04x \t %d\n",
1403                         vlanmc.vid, vlanmc.priority, vlanmc.member,
1404                         vlanmc.untag, vlanmc.fid);
1405         len += snprintf(buf + len, sizeof(smi->buf) - len, "\t4K:\t");
1406         len += snprintf(buf + len, sizeof(smi->buf) - len,
1407                         "%d \t  \t 0x%04x \t 0x%04x \t %d",
1408                         vlan4k.vid, vlan4k.member, vlan4k.untag, vlan4k.fid);
1409
1410         val->value.s = buf;
1411         val->len = len;
1412
1413         return 0;
1414 }
1415
1416 static int rtl8366_set_port_led(struct switch_dev *dev,
1417                                 const struct switch_attr *attr,
1418                                 struct switch_val *val)
1419 {
1420         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1421         u32 data = 0;
1422
1423         if (val->port_vlan >= RTL8366_NUM_PORTS ||
1424             (1 << val->port_vlan) == RTL8366_PORT_UNKNOWN)
1425                 return -EINVAL;
1426
1427         if (val->port_vlan == RTL8366_PORT_NUM_CPU) {
1428                 rtl8366_smi_read_reg(smi, RTL8366_LED_BLINKRATE_REG, &data);
1429                 data = (data & (~(0xF << 4))) | (val->value.i << 4);
1430                 rtl8366_smi_write_reg(smi, RTL8366_LED_BLINKRATE_REG, data);
1431         } else {
1432                 rtl8366_smi_read_reg(smi, RTL8366_LED_CTRL_REG, &data);
1433                 data = (data & (~(0xF << (val->port_vlan * 4)))) |
1434                         (val->value.i << (val->port_vlan * 4));
1435                 rtl8366_smi_write_reg(smi, RTL8366_LED_CTRL_REG, data);
1436         }
1437
1438         return 0;
1439 }
1440
1441 static int rtl8366_get_port_led(struct switch_dev *dev,
1442                                 const struct switch_attr *attr,
1443                                 struct switch_val *val)
1444 {
1445         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1446         u32 data = 0;
1447
1448         if (val->port_vlan >= RTL8366_NUM_LEDGROUPS)
1449                 return -EINVAL;
1450
1451         rtl8366_smi_read_reg(smi, RTL8366_LED_CTRL_REG, &data);
1452         val->value.i = (data >> (val->port_vlan * 4)) & 0x000F;
1453
1454         return 0;
1455 }
1456
1457 static int rtl8366_reset_port_mibs(struct switch_dev *dev,
1458                                    const struct switch_attr *attr,
1459                                    struct switch_val *val)
1460 {
1461         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1462         u32 data = 0;
1463
1464         if (val->port_vlan >= RTL8366_NUM_PORTS)
1465                 return -EINVAL;
1466
1467         rtl8366_smi_read_reg(smi, RTL8366S_MIB_CTRL_REG, &data);
1468         data |= (1 << (val->port_vlan + 3));
1469         rtl8366_smi_write_reg(smi, RTL8366S_MIB_CTRL_REG, data);
1470
1471         return 0;
1472 }
1473
1474 static int rtl8366_get_port_mib(struct switch_dev *dev,
1475                                 const struct switch_attr *attr,
1476                                 struct switch_val *val)
1477 {
1478         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1479         int i, len = 0;
1480         unsigned long long counter = 0;
1481         char *buf = smi->buf;
1482
1483         if (val->port_vlan >= RTL8366_NUM_PORTS)
1484                 return -EINVAL;
1485
1486         len += snprintf(buf + len, sizeof(smi->buf) - len,
1487                         "Port %d MIB counters\n",
1488                         val->port_vlan);
1489
1490         for (i = 0; i < RTL8366S_MIB_COUNT; ++i) {
1491                 len += snprintf(buf + len, sizeof(smi->buf) - len,
1492                                 "%d:%s\t", i, MIBCOUNTERS[i]);
1493                 if (!rtl8366_get_mib_counter(smi, i, val->port_vlan, &counter))
1494                         len += snprintf(buf + len, sizeof(smi->buf) - len,
1495                                         "[%llu]\n", counter);
1496                 else
1497                         len += snprintf(buf + len, sizeof(smi->buf) - len,
1498                                         "[error]\n");
1499         }
1500
1501         val->value.s = buf;
1502         val->len = len;
1503         return 0;
1504 }
1505
1506 static int rtl8366_get_ports(struct switch_dev *dev,
1507                              struct switch_val *val)
1508 {
1509         struct rtl8366s_vlanconfig vlanmc;
1510         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1511         struct switch_port *port;
1512         int i;
1513
1514         if (val->port_vlan >= RTL8366_NUM_VLANS)
1515                 return -EINVAL;
1516
1517         rtl8366s_get_vlan_member_config(smi, val->port_vlan, &vlanmc);
1518
1519         port = &val->value.ports[0];
1520         val->len = 0;
1521         for (i = 0; i < RTL8366_NUM_PORTS; i++) {
1522                 if (!(vlanmc.member & BIT(i)))
1523                         continue;
1524
1525                 port->id = i;
1526                 port->flags = (vlanmc.untag & BIT(i)) ?
1527                                         0 : BIT(SWITCH_PORT_FLAG_TAGGED);
1528                 val->len++;
1529                 port++;
1530         }
1531         return 0;
1532 }
1533
1534 static int rtl8366_set_ports(struct switch_dev *dev,
1535                              struct switch_val *val)
1536 {
1537         struct rtl8366s_vlanconfig vlanmc;
1538         struct rtl8366s_vlan4kentry vlan4k;
1539         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1540         struct switch_port *port;
1541         int i;
1542
1543         if (val->port_vlan >= RTL8366_NUM_VLANS)
1544                 return -EINVAL;
1545
1546         rtl8366s_get_vlan_member_config(smi, val->port_vlan, &vlanmc);
1547         rtl8366s_get_vlan_4k_entry(smi, vlanmc.vid, &vlan4k);
1548
1549         vlanmc.untag = 0;
1550         vlanmc.member = 0;
1551
1552         port = &val->value.ports[0];
1553         for (i = 0; i < val->len; i++, port++) {
1554                 vlanmc.member |= BIT(port->id);
1555
1556                 if (!(port->flags & BIT(SWITCH_PORT_FLAG_TAGGED)))
1557                         vlanmc.untag |= BIT(port->id);
1558         }
1559
1560         vlan4k.member = vlanmc.member;
1561         vlan4k.untag = vlanmc.untag;
1562
1563         rtl8366s_set_vlan_member_config(smi, val->port_vlan, &vlanmc);
1564         rtl8366s_set_vlan_4k_entry(smi, &vlan4k);
1565         return 0;
1566 }
1567
1568 static int rtl8366_get_port_pvid(struct switch_dev *dev, int port, int *val)
1569 {
1570         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1571         return rtl8366_get_vlan_port_pvid(smi, port, val);
1572 }
1573
1574 static int rtl8366_set_port_pvid(struct switch_dev *dev, int port, int val)
1575 {
1576         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1577         return rtl8366_set_vlan_port_pvid(smi, port, val);
1578 }
1579
1580 static int rtl8366_reset_switch(struct switch_dev *dev)
1581 {
1582         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1583         int timeout = 10;
1584         u32 data;
1585
1586         rtl8366_smi_write_reg(smi, RTL8366_RESET_CTRL_REG,
1587                               RTL8366_CHIP_CTRL_RESET_HW);
1588         do {
1589                 msleep(1);
1590                 if (rtl8366_smi_read_reg(smi, RTL8366_RESET_CTRL_REG, &data))
1591                         return -EIO;
1592
1593                 if (!(data & RTL8366_CHIP_CTRL_RESET_HW))
1594                         break;
1595         } while (--timeout);
1596
1597         if (!timeout) {
1598                 printk("Timeout waiting for the switch to reset\n");
1599                 return -EIO;
1600         }
1601
1602         return rtl8366s_reset_vlan(smi);
1603 }
1604
1605 static struct switch_attr rtl8366_globals[] = {
1606         {
1607                 .type = SWITCH_TYPE_INT,
1608                 .name = "enable_vlan",
1609                 .description = "Enable VLAN mode",
1610                 .set = rtl8366_set_vlan,
1611                 .get = rtl8366_get_vlan,
1612                 .max = 1,
1613                 .ofs = 1
1614         }, {
1615                 .type = SWITCH_TYPE_INT,
1616                 .name = "enable_vlan4k",
1617                 .description = "Enable VLAN 4K mode",
1618                 .set = rtl8366_set_vlan,
1619                 .get = rtl8366_get_vlan,
1620                 .max = 1,
1621                 .ofs = 2
1622         }, {
1623                 .type = SWITCH_TYPE_INT,
1624                 .name = "reset_mibs",
1625                 .description = "Reset all MIB counters",
1626                 .set = rtl8366_global_reset_mibs,
1627                 .get = NULL,
1628                 .max = 1
1629         }, {
1630                 .type = SWITCH_TYPE_INT,
1631                 .name = "blinkrate",
1632                 .description = "Get/Set LED blinking rate (0 = 43ms, 1 = 84ms,"
1633                 " 2 = 120ms, 3 = 170ms, 4 = 340ms, 5 = 670ms)",
1634                 .set = rtl8366_global_set_blinkrate,
1635                 .get = rtl8366_global_get_blinkrate,
1636                 .max = 5
1637         },
1638 };
1639
1640 static struct switch_attr rtl8366_port[] = {
1641         {
1642                 .type = SWITCH_TYPE_STRING,
1643                 .name = "link",
1644                 .description = "Get port link information",
1645                 .max = 1,
1646                 .set = NULL,
1647                 .get = rtl8366_attr_get_port_link
1648         }, {
1649                 .type = SWITCH_TYPE_INT,
1650                 .name = "reset_mib",
1651                 .description = "Reset single port MIB counters",
1652                 .max = 1,
1653                 .set = rtl8366_reset_port_mibs,
1654                 .get = NULL
1655         }, {
1656                 .type = SWITCH_TYPE_STRING,
1657                 .name = "mib",
1658                 .description = "Get MIB counters for port",
1659                 .max = 33,
1660                 .set = NULL,
1661                 .get = rtl8366_get_port_mib
1662         }, {
1663                 .type = SWITCH_TYPE_INT,
1664                 .name = "led",
1665                 .description = "Get/Set port group (0 - 3) led mode (0 - 15)",
1666                 .max = 15,
1667                 .set = rtl8366_set_port_led,
1668                 .get = rtl8366_get_port_led
1669         },
1670 };
1671
1672 static struct switch_attr rtl8366_vlan[] = {
1673         {
1674                 .type = SWITCH_TYPE_STRING,
1675                 .name = "info",
1676                 .description = "Get vlan information",
1677                 .max = 1,
1678                 .set = NULL,
1679                 .get = rtl8366_attr_get_vlan_info
1680         },
1681 };
1682
1683
1684 /* template */
1685 static struct switch_dev rtldev = {
1686         .name = "RTL8366S",
1687         .cpu_port = RTL8366_PORT_NUM_CPU,
1688         .ports = RTL8366_NUM_PORTS,
1689         .vlans = RTL8366_NUM_VLANS,
1690         .attr_global = {
1691                 .attr = rtl8366_globals,
1692                 .n_attr = ARRAY_SIZE(rtl8366_globals),
1693         },
1694         .attr_port = {
1695                 .attr = rtl8366_port,
1696                 .n_attr = ARRAY_SIZE(rtl8366_port),
1697         },
1698         .attr_vlan = {
1699                 .attr = rtl8366_vlan,
1700                 .n_attr = ARRAY_SIZE(rtl8366_vlan),
1701         },
1702
1703         .get_vlan_ports = rtl8366_get_ports,
1704         .set_vlan_ports = rtl8366_set_ports,
1705         .get_port_pvid = rtl8366_get_port_pvid,
1706         .set_port_pvid = rtl8366_set_port_pvid,
1707         .reset_switch = rtl8366_reset_switch,
1708 };
1709
1710 static int rtl8366_smi_switch_init(struct rtl8366_smi *smi)
1711 {
1712         struct switch_dev *dev = &smi->dev;
1713         int err;
1714
1715         memcpy(dev, &rtldev, sizeof(struct switch_dev));
1716         dev->priv = smi;
1717         dev->devname = dev_name(&smi->pdev->dev);
1718
1719         err = register_switch(dev, NULL);
1720         if (err)
1721                 dev_err(&smi->pdev->dev, "switch registration failed\n");
1722
1723         return err;
1724 }
1725
1726 static void rtl8366_smi_switch_cleanup(struct rtl8366_smi *smi)
1727 {
1728         unregister_switch(&smi->dev);
1729 }
1730
1731 static int rtl8366_smi_mii_read(struct mii_bus *bus, int addr, int reg)
1732 {
1733         struct rtl8366_smi *smi = bus->priv;
1734         u32 val = 0;
1735         int err;
1736
1737         err = rtl8366_smi_read_phy_reg(smi, addr, 0, reg, &val);
1738         if (err)
1739                 return 0xffff;
1740
1741         return val;
1742 }
1743
1744 static int rtl8366_smi_mii_write(struct mii_bus *bus, int addr, int reg,
1745                                      u16 val)
1746 {
1747         struct rtl8366_smi *smi = bus->priv;
1748         u32 t;
1749         int err;
1750
1751         err = rtl8366_smi_write_phy_reg(smi, addr, 0, reg, val);
1752         /* flush write */
1753         (void) rtl8366_smi_read_phy_reg(smi, addr, 0, reg, &t);
1754
1755         return err;
1756 }
1757
1758 static int rtl8366_smi_mii_init(struct rtl8366_smi *smi)
1759 {
1760         int ret;
1761         int i;
1762
1763         smi->mii_bus = mdiobus_alloc();
1764         if (smi->mii_bus == NULL) {
1765                 ret = -ENOMEM;
1766                 goto err;
1767         }
1768
1769         spin_lock_init(&smi->lock);
1770         smi->mii_bus->priv = (void *) smi;
1771         smi->mii_bus->name = "rtl8366-smi";
1772         smi->mii_bus->read = rtl8366_smi_mii_read;
1773         smi->mii_bus->write = rtl8366_smi_mii_write;
1774         snprintf(smi->mii_bus->id, MII_BUS_ID_SIZE, "%s",
1775                         dev_name(&smi->pdev->dev));
1776         smi->mii_bus->parent = &smi->pdev->dev;
1777         smi->mii_bus->phy_mask = ~(0x1f);
1778         smi->mii_bus->irq = smi->mii_irq;
1779         for (i = 0; i < PHY_MAX_ADDR; i++)
1780                 smi->mii_irq[i] = PHY_POLL;
1781
1782         ret = mdiobus_register(smi->mii_bus);
1783         if (ret)
1784                 goto err_free;
1785
1786         return 0;
1787
1788  err_free:
1789         mdiobus_free(smi->mii_bus);
1790  err:
1791         return ret;
1792 }
1793
1794 static void rtl8366_smi_mii_cleanup(struct rtl8366_smi *smi)
1795 {
1796         mdiobus_unregister(smi->mii_bus);
1797         mdiobus_free(smi->mii_bus);
1798 }
1799
1800 static int rtl8366_smi_mii_bus_match(struct mii_bus *bus)
1801 {
1802         return (bus->read == rtl8366_smi_mii_read &&
1803                 bus->write == rtl8366_smi_mii_write);
1804 }
1805
1806 static int rtl8366_smi_setup(struct rtl8366_smi *smi)
1807 {
1808         u32 chip_id = 0;
1809         u32 chip_ver = 0;
1810         int ret;
1811
1812         ret = rtl8366_smi_read_reg(smi, RTL8366S_CHIP_ID_REG, &chip_id);
1813         if (ret) {
1814                 dev_err(&smi->pdev->dev, "unable to read chip id\n");
1815                 return ret;
1816         }
1817
1818         switch (chip_id) {
1819         case RTL8366S_CHIP_ID_8366:
1820                 break;
1821         default:
1822                 dev_err(&smi->pdev->dev, "unknown chip id (%04x)\n", chip_id);
1823                 return -ENODEV;
1824         }
1825
1826         ret = rtl8366_smi_read_reg(smi, RTL8366S_CHIP_VERSION_CTRL_REG,
1827                                    &chip_ver);
1828         if (ret) {
1829                 dev_err(&smi->pdev->dev, "unable to read chip version\n");
1830                 return ret;
1831         }
1832
1833         dev_info(&smi->pdev->dev, "RTL%04x ver. %u chip found\n",
1834                  chip_id, chip_ver & RTL8366S_CHIP_VERSION_MASK);
1835
1836         rtl8366_debugfs_init(smi);
1837
1838         return 0;
1839 }
1840
1841 static int __init rtl8366_smi_probe(struct platform_device *pdev)
1842 {
1843         static int rtl8366_smi_version_printed;
1844         struct rtl8366_smi_platform_data *pdata;
1845         struct rtl8366_smi *smi;
1846         int err;
1847
1848         if (!rtl8366_smi_version_printed++)
1849                 printk(KERN_NOTICE RTL8366_SMI_DRIVER_DESC
1850                        " version " RTL8366_SMI_DRIVER_VER"\n");
1851
1852         pdata = pdev->dev.platform_data;
1853         if (!pdata) {
1854                 dev_err(&pdev->dev, "no platform data specified\n");
1855                 err = -EINVAL;
1856                 goto err_out;
1857         }
1858
1859         smi = kzalloc(sizeof(struct rtl8366_smi), GFP_KERNEL);
1860         if (!smi) {
1861                 dev_err(&pdev->dev, "no memory for private data\n");
1862                 err = -ENOMEM;
1863                 goto err_out;
1864         }
1865
1866         err = gpio_request(pdata->gpio_sda, dev_name(&pdev->dev));
1867         if (err) {
1868                 dev_err(&pdev->dev, "gpio_request failed for %u, err=%d\n",
1869                         pdata->gpio_sda, err);
1870                 goto err_free_smi;
1871         }
1872
1873         err = gpio_request(pdata->gpio_sck, dev_name(&pdev->dev));
1874         if (err) {
1875                 dev_err(&pdev->dev, "gpio_request failed for %u, err=%d\n",
1876                         pdata->gpio_sck, err);
1877                 goto err_free_sda;
1878         }
1879
1880         smi->pdev = pdev;
1881         smi->pdata = pdata;
1882         spin_lock_init(&smi->lock);
1883
1884         platform_set_drvdata(pdev, smi);
1885
1886         dev_info(&pdev->dev, "using GPIO pins %u (SDA) and %u (SCK)\n",
1887                  pdata->gpio_sda, pdata->gpio_sck);
1888
1889         err = rtl8366_smi_setup(smi);
1890         if (err)
1891                 goto err_clear_drvdata;
1892
1893         err = rtl8366_smi_mii_init(smi);
1894         if (err)
1895                 goto err_clear_drvdata;
1896
1897         err = rtl8366_smi_switch_init(smi);
1898         if (err)
1899                 goto err_mii_cleanup;
1900
1901         return 0;
1902
1903  err_mii_cleanup:
1904         rtl8366_smi_mii_cleanup(smi);
1905  err_clear_drvdata:
1906         platform_set_drvdata(pdev, NULL);
1907         gpio_free(pdata->gpio_sck);
1908  err_free_sda:
1909         gpio_free(pdata->gpio_sda);
1910  err_free_smi:
1911         kfree(smi);
1912  err_out:
1913         return err;
1914 }
1915
1916 int rtl8366_phy_config_init(struct phy_device *phydev)
1917 {
1918         if (!rtl8366_smi_mii_bus_match(phydev->bus))
1919                 return -EINVAL;
1920
1921         return 0;
1922 }
1923
1924 int rtl8366_phy_config_aneg(struct phy_device *phydev)
1925 {
1926         return 0;
1927 }
1928
1929 static struct phy_driver rtl8366_smi_phy_driver = {
1930         .phy_id         = 0x001cc960,
1931         .name           = "Realtek RTL8366",
1932         .phy_id_mask    = 0x1ffffff0,
1933         .features       = PHY_GBIT_FEATURES,
1934         .config_aneg    = rtl8366_phy_config_aneg,
1935         .config_init    = rtl8366_phy_config_init,
1936         .read_status    = genphy_read_status,
1937         .driver         = {
1938                 .owner = THIS_MODULE,
1939         },
1940 };
1941
1942 static int __devexit rtl8366_smi_remove(struct platform_device *pdev)
1943 {
1944         struct rtl8366_smi *smi = platform_get_drvdata(pdev);
1945
1946         if (smi) {
1947                 struct rtl8366_smi_platform_data *pdata;
1948
1949                 pdata = pdev->dev.platform_data;
1950
1951                 rtl8366_smi_switch_cleanup(smi);
1952                 rtl8366_debugfs_remove(smi);
1953                 rtl8366_smi_mii_cleanup(smi);
1954                 platform_set_drvdata(pdev, NULL);
1955                 gpio_free(pdata->gpio_sck);
1956                 gpio_free(pdata->gpio_sda);
1957                 kfree(smi);
1958         }
1959
1960         return 0;
1961 }
1962
1963 static struct platform_driver rtl8366_smi_driver = {
1964         .driver = {
1965                 .name           = RTL8366_SMI_DRIVER_NAME,
1966                 .owner          = THIS_MODULE,
1967         },
1968         .probe          = rtl8366_smi_probe,
1969         .remove         = __devexit_p(rtl8366_smi_remove),
1970 };
1971
1972 static int __init rtl8366_smi_init(void)
1973 {
1974         int ret;
1975         ret = platform_driver_register(&rtl8366_smi_driver);
1976         if (ret)
1977                 return ret;
1978
1979         ret = phy_driver_register(&rtl8366_smi_phy_driver);
1980         if (ret)
1981                 goto err_platform_unregister;
1982
1983         return 0;
1984
1985  err_platform_unregister:
1986         platform_driver_unregister(&rtl8366_smi_driver);
1987         return ret;
1988 }
1989 module_init(rtl8366_smi_init);
1990
1991 static void __exit rtl8366_smi_exit(void)
1992 {
1993         phy_driver_unregister(&rtl8366_smi_phy_driver);
1994         platform_driver_unregister(&rtl8366_smi_driver);
1995 }
1996 module_exit(rtl8366_smi_exit);
1997
1998 MODULE_DESCRIPTION(RTL8366_SMI_DRIVER_DESC);
1999 MODULE_VERSION(RTL8366_SMI_DRIVER_VER);
2000 MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
2001 MODULE_AUTHOR("Antti Seppälä <a.seppala@gmail.com>");
2002 MODULE_LICENSE("GPL v2");
2003 MODULE_ALIAS("platform:" RTL8366_SMI_DRIVER_NAME);