rtl8366_smi: fix port->flags calculation in rtl8366_get_ports
[oweals/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 /* #define DEBUG 1 */
25
26 #ifdef DEBUG
27 #include <linux/debugfs.h>
28 #endif
29
30 #define RTL8366_SMI_DRIVER_NAME "rtl8366-smi"
31 #define RTL8366_SMI_DRIVER_DESC "Realtek RTL8366 switch driver"
32 #define RTL8366_SMI_DRIVER_VER  "0.1.1"
33
34 #define RTL8366S_PHY_NO_MAX                 4
35 #define RTL8366S_PHY_PAGE_MAX               7
36 #define RTL8366S_PHY_ADDR_MAX               31
37
38 #define RTL8366_CHIP_GLOBAL_CTRL_REG        0x0000
39 #define RTL8366_CHIP_CTRL_VLAN              (1 << 13)
40
41 #define RTL8366_RESET_CTRL_REG              0x0100
42 #define RTL8366_CHIP_CTRL_RESET_HW          1
43 #define RTL8366_CHIP_CTRL_RESET_SW          (1 << 1)
44
45 #define RTL8366S_CHIP_VERSION_CTRL_REG      0x0104
46 #define RTL8366S_CHIP_VERSION_MASK          0xf
47 #define RTL8366S_CHIP_ID_REG                0x0105
48 #define RTL8366S_CHIP_ID_8366               0x8366
49
50 /* PHY registers control */
51 #define RTL8366S_PHY_ACCESS_CTRL_REG        0x8028
52 #define RTL8366S_PHY_ACCESS_DATA_REG        0x8029
53
54 #define RTL8366S_PHY_CTRL_READ              1
55 #define RTL8366S_PHY_CTRL_WRITE             0
56
57 #define RTL8366S_PHY_REG_MASK               0x1f
58 #define RTL8366S_PHY_PAGE_OFFSET            5
59 #define RTL8366S_PHY_PAGE_MASK              (0x7 << 5)
60 #define RTL8366S_PHY_NO_OFFSET              9
61 #define RTL8366S_PHY_NO_MASK                (0x1f << 9)
62
63 #define RTL8366_SMI_ACK_RETRY_COUNT         5
64 #define RTL8366_SMI_CLK_DELAY               10 /* nsec */
65
66 /* LED control registers */
67 #define RTL8366_LED_BLINKRATE_REG           0x0420
68 #define RTL8366_LED_BLINKRATE_BIT           0
69 #define RTL8366_LED_BLINKRATE_MASK          0x0007
70
71 #define RTL8366_LED_CTRL_REG                0x0421
72 #define RTL8366_LED_0_1_CTRL_REG            0x0422
73 #define RTL8366_LED_2_3_CTRL_REG            0x0423
74
75 #define RTL8366S_MIB_COUNT                  33
76 #define RTL8366S_GLOBAL_MIB_COUNT           1
77 #define RTL8366S_MIB_COUNTER_PORT_OFFSET    0x0040
78 #define RTL8366S_MIB_COUNTER_BASE           0x1000
79 #define RTL8366S_MIB_CTRL_REG               0x11F0
80 #define RTL8366S_MIB_CTRL_USER_MASK         0x01FF
81 #define RTL8366S_MIB_CTRL_BUSY_MASK         0x0001
82 #define RTL8366S_MIB_CTRL_RESET_MASK        0x0002
83
84 #define RTL8366S_MIB_CTRL_GLOBAL_RESET_MASK 0x0004
85 #define RTL8366S_MIB_CTRL_PORT_RESET_BIT    0x0003
86 #define RTL8366S_MIB_CTRL_PORT_RESET_MASK   0x01FC
87
88
89 #define RTL8366S_PORT_VLAN_CTRL_BASE        0x0058
90 #define RTL8366S_VLAN_TABLE_READ_BASE       0x018B
91 #define RTL8366S_VLAN_TABLE_WRITE_BASE      0x0185
92
93 #define RTL8366S_VLAN_TB_CTRL_REG           0x010F
94
95 #define RTL8366S_TABLE_ACCESS_CTRL_REG      0x0180
96 #define RTL8366S_TABLE_VLAN_READ_CTRL       0x0E01
97 #define RTL8366S_TABLE_VLAN_WRITE_CTRL      0x0F01
98
99 #define RTL8366S_VLAN_MEMCONF_BASE          0x0016
100
101
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
109
110
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
118
119
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 */
124
125 #define RTL8366_PORT_UNKNOWN                (1 << 4) /* No known connection */
126 #define RTL8366_PORT_CPU                    (1 << 5) /* CPU port */
127
128 #define RTL8366_PORT_ALL                    (RTL8366_PORT_1 |       \
129                                              RTL8366_PORT_2 |       \
130                                              RTL8366_PORT_3 |       \
131                                              RTL8366_PORT_4 |       \
132                                              RTL8366_PORT_UNKNOWN | \
133                                              RTL8366_PORT_CPU)
134
135 #define RTL8366_PORT_ALL_BUT_CPU            (RTL8366_PORT_1 |       \
136                                              RTL8366_PORT_2 |       \
137                                              RTL8366_PORT_3 |       \
138                                              RTL8366_PORT_4 |       \
139                                              RTL8366_PORT_UNKNOWN)
140
141 #define RTL8366_PORT_ALL_EXTERNAL           (RTL8366_PORT_1 |       \
142                                              RTL8366_PORT_2 |       \
143                                              RTL8366_PORT_3 |       \
144                                              RTL8366_PORT_4)
145
146 #define RTL8366_PORT_ALL_INTERNAL           (RTL8366_PORT_UNKNOWN | \
147                                              RTL8366_PORT_CPU)
148
149 struct rtl8366s_vlanconfig {
150         u16     reserved2:1;
151         u16     priority:3;
152         u16     vid:12;
153
154         u16     reserved1:1;
155         u16     fid:3;
156         u16     untag:6;
157         u16     member:6;
158 };
159
160 struct rtl8366s_vlan4kentry {
161         u16     reserved1:4;
162         u16     vid:12;
163
164         u16     reserved2:1;
165         u16     fid:3;
166         u16     untag:6;
167         u16     member:6;
168 };
169
170 static const char *MIBCOUNTERS[] = { "IfInOctets                        ",
171                                      "EtherStatsOctets                  ",
172                                      "EtherStatsUnderSizePkts           ",
173                                      "EtherFregament                    ",
174                                      "EtherStatsPkts64Octets            ",
175                                      "EtherStatsPkts65to127Octets       ",
176                                      "EtherStatsPkts128to255Octets      ",
177                                      "EtherStatsPkts256to511Octets      ",
178                                      "EtherStatsPkts512to1023Octets     ",
179                                      "EtherStatsPkts1024to1518Octets    ",
180                                      "EtherOversizeStats                ",
181                                      "EtherStatsJabbers                 ",
182                                      "IfInUcastPkts                     ",
183                                      "EtherStatsMulticastPkts           ",
184                                      "EtherStatsBroadcastPkts           ",
185                                      "EtherStatsDropEvents              ",
186                                      "Dot3StatsFCSErrors                ",
187                                      "Dot3StatsSymbolErrors             ",
188                                      "Dot3InPauseFrames                 ",
189                                      "Dot3ControlInUnknownOpcodes       ",
190                                      "IfOutOctets                       ",
191                                      "Dot3StatsSingleCollisionFrames    ",
192                                      "Dot3StatMultipleCollisionFrames   ",
193                                      "Dot3sDeferredTransmissions        ",
194                                      "Dot3StatsLateCollisions           ",
195                                      "EtherStatsCollisions              ",
196                                      "Dot3StatsExcessiveCollisions      ",
197                                      "Dot3OutPauseFrames                ",
198                                      "Dot1dBasePortDelayExceededDiscards",
199                                      "Dot1dTpPortInDiscards             ",
200                                      "IfOutUcastPkts                    ",
201                                      "IfOutMulticastPkts                ",
202                                      "IfOutBroadcastPkts                ",
203                                      NULL };
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 DEBUG
214         struct dentry                      *debugfs_root;
215 #endif
216 };
217
218 #ifdef DEBUG
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         data = 0;/* writing data will be discard by ASIC */
570         err = rtl8366_smi_write_reg(smi, addr, data);
571         if (err)
572                 return err;
573
574         /* read MIB control register */
575         err =  rtl8366_smi_read_reg(smi, RTL8366S_MIB_CTRL_REG, &data);
576         if (err)
577                 return err;
578
579         if (data & RTL8366S_MIB_CTRL_BUSY_MASK)
580                 return -EBUSY;
581
582         if (data & RTL8366S_MIB_CTRL_RESET_MASK)
583                 return -EIO;
584
585         mibvalue = 0;
586         addr = addr + mibLength[counter] - 1;
587         i = mibLength[counter];
588
589         while (i) {
590                 err = rtl8366_smi_read_reg(smi, addr, &data);
591                 if (err)
592                         return err;
593
594                 mibvalue = (mibvalue << 16) | (data & 0xFFFF);
595
596                 addr--;
597                 i--;
598         }
599
600         *val = mibvalue;
601         return 0;
602 }
603
604 static int rtl8366s_get_vlan_4k_entry(struct rtl8366_smi *smi, u32 vid,
605                                       struct rtl8366s_vlan4kentry *vlan4k)
606 {
607         int err;
608         u32 data;
609         u16 *tableaddr;
610
611         memset(vlan4k, '\0', sizeof(struct rtl8366s_vlan4kentry));
612         vlan4k->vid = vid;
613
614         if (vid >= RTL8366_NUM_VIDS)
615                 return -EINVAL;
616
617         tableaddr = (u16 *)vlan4k;
618
619         /* write VID */
620         data = *tableaddr;
621         err = rtl8366_smi_write_reg(smi, RTL8366S_VLAN_TABLE_WRITE_BASE, data);
622         if (err)
623                 return err;
624
625         /* write table access control word */
626         err = rtl8366_smi_write_reg(smi, RTL8366S_TABLE_ACCESS_CTRL_REG,
627                                     RTL8366S_TABLE_VLAN_READ_CTRL);
628         if (err)
629                 return err;
630
631         err = rtl8366_smi_read_reg(smi, RTL8366S_VLAN_TABLE_READ_BASE, &data);
632         if (err)
633                 return err;
634
635         *tableaddr = data;
636         tableaddr++;
637
638         err = rtl8366_smi_read_reg(smi, RTL8366S_VLAN_TABLE_READ_BASE + 1,
639                                    &data);
640         if (err)
641                 return err;
642
643         *tableaddr = data;
644         vlan4k->vid = vid;
645
646         return 0;
647 }
648
649 static int rtl8366s_set_vlan_4k_entry(struct rtl8366_smi *smi,
650                                       const struct rtl8366s_vlan4kentry *vlan4k)
651 {
652         int err;
653         u32 data;
654         u16 *tableaddr;
655
656         if (vlan4k->vid >= RTL8366_NUM_VIDS ||
657             vlan4k->member > RTL8366_PORT_ALL ||
658             vlan4k->untag > RTL8366_PORT_ALL ||
659             vlan4k->fid > RTL8366S_FIDMAX)
660                 return -EINVAL;
661
662         tableaddr = (u16 *)vlan4k;
663
664         data = *tableaddr;
665
666         err = rtl8366_smi_write_reg(smi, RTL8366S_VLAN_TABLE_WRITE_BASE, data);
667         if (err)
668                 return err;
669
670         tableaddr++;
671
672         data = *tableaddr;
673
674         rtl8366_smi_write_reg(smi, RTL8366S_VLAN_TABLE_WRITE_BASE + 1, data);
675
676
677         /* write table access control word */
678         err = rtl8366_smi_write_reg(smi, RTL8366S_TABLE_ACCESS_CTRL_REG,
679                                     RTL8366S_TABLE_VLAN_WRITE_CTRL);
680         if (err)
681                 return err;
682
683         return 0;
684 }
685
686 static int rtl8366s_get_vlan_member_config(struct rtl8366_smi *smi, u32 index,
687                                            struct rtl8366s_vlanconfig *vlanmc)
688 {
689         int err;
690         u32 addr;
691         u32 data;
692         u16 *tableaddr;
693
694         memset(vlanmc, '\0', sizeof(struct rtl8366s_vlanconfig));
695
696         if (index >= RTL8366_NUM_VLANS)
697                 return -EINVAL;
698
699         tableaddr = (u16 *)vlanmc;
700
701         addr = RTL8366S_VLAN_MEMCONF_BASE + (index << 1);
702
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
712         err = rtl8366_smi_read_reg(smi, addr, &data);
713         if (err)
714                 return err;
715
716         *tableaddr = data;
717
718         return 0;
719 }
720
721 static int rtl8366s_set_vlan_member_config(struct rtl8366_smi *smi, u32 index,
722                                            const struct rtl8366s_vlanconfig
723                                            *vlanmc)
724 {
725         int err;
726         u32 addr;
727         u32 data;
728         u16 *tableaddr;
729
730         if (index >= RTL8366_NUM_VLANS ||
731            vlanmc->vid >= RTL8366_NUM_VIDS ||
732            vlanmc->priority > RTL8366S_PRIORITYMAX ||
733            vlanmc->member > RTL8366_PORT_ALL ||
734            vlanmc->untag > RTL8366_PORT_ALL ||
735            vlanmc->fid > RTL8366S_FIDMAX)
736                 return -EINVAL;
737
738         addr = RTL8366S_VLAN_MEMCONF_BASE + (index << 1);
739
740
741         tableaddr = (u16 *)vlanmc;
742         data = *tableaddr;
743
744         err = rtl8366_smi_write_reg(smi, addr, data);
745         if (err)
746                 return err;
747
748         addr = RTL8366S_VLAN_MEMCONF_BASE + 1 + (index << 1);
749
750         tableaddr++;
751         data = *tableaddr;
752
753         err = rtl8366_smi_write_reg(smi, addr, data);
754         if (err)
755                 return err;
756
757         return 0;
758 }
759
760 static int rtl8366_get_port_vlan_index(struct rtl8366_smi *smi, int port,
761                                        int *val)
762 {
763         int err;
764         u32 addr;
765         u32 data;
766
767         /* bits mapping to port vlan control register of port n */
768         const u16 bits[RTL8366_NUM_PORTS] = { 0x000F, 0x00F0, 0x0F00,
769                                              0xF000, 0x000F, 0x00F0 };
770         /* bits offset to port vlan control register of port n */
771         const u16 bitoffset[RTL8366_NUM_PORTS] = { 0, 4, 8, 12, 0, 4 };
772         /* address offset to port vlan control register of port n */
773         const u16 addroffset[RTL8366_NUM_PORTS] = { 0, 0, 0, 0, 1, 1 };
774
775         if (port >= RTL8366_NUM_PORTS)
776                 return -EINVAL;
777
778         addr = RTL8366S_PORT_VLAN_CTRL_BASE + addroffset[port];
779
780         err = rtl8366_smi_read_reg(smi, addr, &data);
781         if (err)
782                 return err;
783
784         *val = (data & bits[port]) >> bitoffset[port];
785
786         return 0;
787
788 }
789
790 static int rtl8366_get_vlan_port_pvid(struct rtl8366_smi *smi, int port,
791                                       int *val)
792 {
793         int err;
794         int index;
795         struct rtl8366s_vlanconfig vlanmc;
796
797         err = rtl8366_get_port_vlan_index(smi, port, &index);
798         if (err)
799                 return err;
800
801         err = rtl8366s_get_vlan_member_config(smi, index, &vlanmc);
802         if (err)
803                 return err;
804
805         *val = vlanmc.vid;
806         return 0;
807 }
808
809 static int rtl8366_set_port_vlan_index(struct rtl8366_smi *smi, int port,
810                                        int index)
811 {
812         int err;
813         u32 addr;
814         u32 data;
815         u32 vlan_data;
816         u32 bits;
817
818         /* bits mapping to port vlan control register of port n */
819         const u16 bitmasks[6] = { 0x000F, 0x00F0, 0x0F00,
820                                  0xF000, 0x000F, 0x00F0 };
821         /* bits offset to port vlan control register of port n */
822         const u16 bitOff[6] = { 0, 4, 8, 12, 0, 4 };
823         /* address offset to port vlan control register of port n */
824         const u16 addrOff[6] = { 0, 0, 0, 0, 1, 1 };
825
826         if (port >= RTL8366_NUM_PORTS || index >= RTL8366_NUM_VLANS)
827                 return -EINVAL;
828
829         addr = RTL8366S_PORT_VLAN_CTRL_BASE + addrOff[port];
830
831         bits = bitmasks[port];
832
833         data = (index << bitOff[port]) & bits;
834
835         err = rtl8366_smi_read_reg(smi, addr, &vlan_data);
836         if (err)
837                 return err;
838
839         vlan_data &= ~(vlan_data & bits);
840         vlan_data |= data;
841
842         err = rtl8366_smi_write_reg(smi, addr, vlan_data);
843         if (err)
844                 return err;
845
846         return 0;
847 }
848
849 static int rtl8366_set_vlan_port_pvid(struct rtl8366_smi *smi, int port,
850                                       int val)
851 {
852         int i;
853         struct rtl8366s_vlanconfig vlanmc;
854         struct rtl8366s_vlan4kentry vlan4k;
855
856         if (port >= RTL8366_NUM_PORTS || val >= RTL8366_NUM_VIDS)
857                 return -EINVAL;
858
859
860
861         /* Updating the 4K entry; lookup it and change the port member set */
862         rtl8366s_get_vlan_4k_entry(smi, val, &vlan4k);
863         vlan4k.member |= ((1 << port) | RTL8366_PORT_CPU);
864         vlan4k.untag = RTL8366_PORT_ALL_BUT_CPU;
865         rtl8366s_set_vlan_4k_entry(smi, &vlan4k);
866
867         /* For the 16 entries more work needs to be done. First see if such
868            VID is already there and change it */
869         for (i = 0; i < RTL8366_NUM_VLANS; ++i) {
870                 rtl8366s_get_vlan_member_config(smi, i, &vlanmc);
871
872                 /* Try to find an existing vid and update port member set */
873                 if (val == vlanmc.vid) {
874                         vlanmc.member |= ((1 << port) | RTL8366_PORT_CPU);
875                         rtl8366s_set_vlan_member_config(smi, i, &vlanmc);
876
877                         /* Now update PVID register settings */
878                         rtl8366_set_port_vlan_index(smi, port, i);
879
880                         return 0;
881                 }
882         }
883
884         /* PVID could not be found from vlan table. Replace unused (one that
885            has no member ports) with new one */
886         for (i = 0; i < RTL8366_NUM_VLANS; ++i) {
887                 rtl8366s_get_vlan_member_config(smi, i, &vlanmc);
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                 if (!vlanmc.member || vlanmc.member == RTL8366_PORT_CPU) {
892                         vlanmc.vid = val;
893                         vlanmc.priority = 0;
894                         vlanmc.untag = RTL8366_PORT_ALL_BUT_CPU;
895                         vlanmc.member = ((1 << port) | RTL8366_PORT_CPU);
896                         vlanmc.fid = 0;
897
898                         rtl8366s_set_vlan_member_config(smi, i, &vlanmc);
899
900                         /* Now update PVID register settings */
901                         rtl8366_set_port_vlan_index(smi, port, i);
902
903                         return 0;
904                 }
905         }
906
907         dev_err(&smi->pdev->dev, "All 16 vlan member configurations are in "
908                 "use\n");
909         return -EINVAL;
910 }
911
912
913 static int rtl8366_vlan_set_vlan(struct rtl8366_smi *smi, int enable)
914 {
915         u32 data = 0;
916         rtl8366_smi_read_reg(smi, RTL8366_CHIP_GLOBAL_CTRL_REG, &data);
917
918         data &= ~(data & RTL8366_CHIP_CTRL_VLAN);
919         if (enable)
920                 data |= RTL8366_CHIP_CTRL_VLAN;
921
922         return rtl8366_smi_write_reg(smi, RTL8366_CHIP_GLOBAL_CTRL_REG, data);
923 }
924
925 static int rtl8366_vlan_set_4ktable(struct rtl8366_smi *smi, int enable)
926 {
927         u32 data = 0;
928         rtl8366_smi_read_reg(smi, RTL8366S_VLAN_TB_CTRL_REG, &data);
929
930         data &= ~(data & 1);
931         if (enable)
932                 data |= 1;
933
934         return rtl8366_smi_write_reg(smi, RTL8366S_VLAN_TB_CTRL_REG, data);
935 }
936
937 static int rtl8366s_reset_vlan(struct rtl8366_smi *smi)
938 {
939         int i;
940         struct rtl8366s_vlan4kentry vlan4k;
941         struct rtl8366s_vlanconfig vlanmc;
942
943         /* clear 16 VLAN member configuration */
944         for (i = 0; i < RTL8366_NUM_VLANS; i++) {
945                 vlanmc.vid = 0;
946                 vlanmc.priority = 0;
947                 vlanmc.member = 0;
948                 vlanmc.untag = 0;
949                 vlanmc.fid = 0;
950                 if (rtl8366s_set_vlan_member_config(smi, i, &vlanmc) != 0)
951                         return -EIO;
952         }
953
954         /* Set a default VLAN with vid 1 to 4K table for all ports */
955         vlan4k.vid = 1;
956         vlan4k.member = RTL8366_PORT_ALL;
957         vlan4k.untag = RTL8366_PORT_ALL;
958         vlan4k.fid = 0;
959         if (rtl8366s_set_vlan_4k_entry(smi, &vlan4k) != 0)
960                 return -EIO;
961
962         /* Set all ports PVID to default VLAN */
963         for (i = 0; i < RTL8366_NUM_PORTS; i++) {
964                 if (rtl8366_set_vlan_port_pvid(smi, i, 0) != 0)
965                         return -EIO;
966         }
967
968         return 0;
969 }
970
971 #ifdef DEBUG
972 static int rtl8366_debugfs_open(struct inode *inode, struct file *file)
973 {
974         file->private_data = inode->i_private;
975         return 0;
976 }
977
978 static ssize_t rtl8366_read_debugfs_mibs(struct file *file,
979                                          char __user *user_buf,
980                                          size_t count, loff_t *ppos)
981 {
982         int i, j, len = 0;
983         struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
984         char *buf = smi->buf;
985
986         len += snprintf(buf + len, sizeof(smi->buf) - len, "MIB Counters:\n");
987         len += snprintf(buf + len, sizeof(smi->buf) - len, "Counter"
988                         "                            "
989                         "Port 0 \t\t Port 1 \t\t Port 2 \t\t Port 3 \t\t "
990                         "Port 4\n");
991
992         for (i = 0; i < 33; ++i) {
993
994                 len += snprintf(buf + len, sizeof(smi->buf) - len, "%d:%s ",
995                                 i, MIBCOUNTERS[i]);
996                 for (j = 0; j < RTL8366_NUM_PORTS; ++j) {
997                         unsigned long long counter = 0;
998
999                         if (!rtl8366_get_mib_counter(smi, i, j, &counter))
1000                                 len += snprintf(buf + len, sizeof(smi->buf) - len,
1001                                                 "[%llu]", counter);
1002                         else
1003                                 len += snprintf(buf + len, sizeof(smi->buf) - len,
1004                                                 "[error]");
1005
1006                         if (j != RTL8366_NUM_PORTS - 1) {
1007                                 if (counter < 100000)
1008                                         len += snprintf(buf + len,
1009                                                         sizeof(smi->buf) - len,
1010                                                         "\t");
1011
1012                                 len += snprintf(buf + len, sizeof(smi->buf) - len,
1013                                                 "\t");
1014                         }
1015                 }
1016                 len += snprintf(buf + len, sizeof(smi->buf) - len, "\n");
1017         }
1018
1019         len += snprintf(buf + len, sizeof(smi->buf) - len, "\n");
1020
1021         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1022 }
1023
1024 static ssize_t rtl8366_read_debugfs_vlan(struct file *file,
1025                                          char __user *user_buf,
1026                                          size_t count, loff_t *ppos)
1027 {
1028         int i, j, len = 0;
1029         struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
1030         char *buf = smi->buf;
1031
1032         len += snprintf(buf + len, sizeof(smi->buf) - len, "VLAN Member Config:\n");
1033         len += snprintf(buf + len, sizeof(smi->buf) - len,
1034                         "\t id \t vid \t prio \t member \t untag  \t fid "
1035                         "\tports\n");
1036
1037         for (i = 0; i < RTL8366_NUM_VLANS; ++i) {
1038                 struct rtl8366s_vlanconfig vlanmc;
1039
1040                 rtl8366s_get_vlan_member_config(smi, i, &vlanmc);
1041
1042                 len += snprintf(buf + len, sizeof(smi->buf) - len,
1043                                 "\t[%d] \t %d \t %d \t 0x%04x \t 0x%04x \t %d "
1044                                 "\t", i, vlanmc.vid, vlanmc.priority,
1045                                 vlanmc.member, vlanmc.untag, vlanmc.fid);
1046
1047                 for (j = 0; j < RTL8366_NUM_PORTS; ++j) {
1048                         int index = 0;
1049                         if (!rtl8366_get_port_vlan_index(smi, j, &index)) {
1050                                 if (index == i)
1051                                         len += snprintf(buf + len,
1052                                                         sizeof(smi->buf) - len,
1053                                                         "%d", j);
1054                         }
1055                 }
1056                 len += snprintf(buf + len, sizeof(smi->buf) - len, "\n");
1057         }
1058
1059         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1060 }
1061
1062 static ssize_t rtl8366_read_debugfs_reg(struct file *file,
1063                                         char __user *user_buf,
1064                                         size_t count, loff_t *ppos)
1065 {
1066         u32 t, reg = g_dbg_reg;
1067         int err, len = 0;
1068         struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
1069         char *buf = smi->buf;
1070
1071         memset(buf, '\0', sizeof(smi->buf));
1072
1073         err = rtl8366_smi_read_reg(smi, reg, &t);
1074         if (err) {
1075                 len += snprintf(buf, sizeof(smi->buf),
1076                                 "Read failed (reg: 0x%04x)\n", reg);
1077                 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1078         }
1079
1080         len += snprintf(buf, sizeof(smi->buf), "reg = 0x%04x, val = 0x%04x\n",
1081                         reg, t);
1082
1083         return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1084 }
1085
1086 static ssize_t rtl8366_write_debugfs_reg(struct file *file,
1087                                          const char __user *user_buf,
1088                                          size_t count, loff_t *ppos)
1089 {
1090         unsigned long data;
1091         u32 reg = g_dbg_reg;
1092         int err;
1093         size_t len;
1094         struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
1095         char *buf = smi->buf;
1096
1097         len = min(count, sizeof(smi->buf) - 1);
1098         if (copy_from_user(buf, user_buf, len)) {
1099                 dev_err(&smi->pdev->dev, "copy from user failed\n");
1100                 return -EFAULT;
1101         }
1102
1103         buf[len] = '\0';
1104         if (len > 0 && buf[len - 1] == '\n')
1105                 buf[len - 1] = '\0';
1106
1107
1108         if (strict_strtoul(buf, 16, &data)) {
1109                 dev_err(&smi->pdev->dev, "Invalid reg value %s\n", buf);
1110         } else {
1111                 err = rtl8366_smi_write_reg(smi, reg, data);
1112                 if (err) {
1113                         dev_err(&smi->pdev->dev,
1114                                 "writing reg 0x%04x val 0x%04lx failed\n",
1115                                 reg, data);
1116                 }
1117         }
1118
1119         return count;
1120 }
1121
1122 static const struct file_operations fops_rtl8366_regs = {
1123         .read = rtl8366_read_debugfs_reg,
1124         .write = rtl8366_write_debugfs_reg,
1125         .open = rtl8366_debugfs_open,
1126         .owner = THIS_MODULE
1127 };
1128
1129 static const struct file_operations fops_rtl8366_vlan = {
1130         .read = rtl8366_read_debugfs_vlan,
1131         .open = rtl8366_debugfs_open,
1132         .owner = THIS_MODULE
1133 };
1134
1135 static const struct file_operations fops_rtl8366_mibs = {
1136         .read = rtl8366_read_debugfs_mibs,
1137         .open = rtl8366_debugfs_open,
1138         .owner = THIS_MODULE
1139 };
1140
1141 static void rtl8366_debugfs_init(struct rtl8366_smi *smi)
1142 {
1143         struct dentry *node;
1144         struct dentry *root;
1145
1146         if (!smi->debugfs_root)
1147                 smi->debugfs_root = debugfs_create_dir("rtl8366s", NULL);
1148
1149         if (!smi->debugfs_root) {
1150                 dev_err(&smi->pdev->dev, "Unable to create debugfs dir\n");
1151                 return;
1152         }
1153         root = smi->debugfs_root;
1154
1155         node = debugfs_create_x16("reg", S_IRUGO | S_IWUSR, root, &g_dbg_reg);
1156         if (!node) {
1157                 dev_err(&smi->pdev->dev, "Creating debugfs file reg failed\n");
1158                 return;
1159         }
1160
1161         node = debugfs_create_file("val", S_IRUGO | S_IWUSR, root, smi,
1162                                    &fops_rtl8366_regs);
1163         if (!node) {
1164                 dev_err(&smi->pdev->dev, "Creating debugfs file val failed\n");
1165                 return;
1166         }
1167
1168         node = debugfs_create_file("vlan", S_IRUSR, root, smi,
1169                                    &fops_rtl8366_vlan);
1170         if (!node) {
1171                 dev_err(&smi->pdev->dev, "Creating debugfs file vlan "
1172                         "failed\n");
1173                 return;
1174         }
1175
1176         node = debugfs_create_file("mibs", S_IRUSR, root, smi,
1177                                    &fops_rtl8366_mibs);
1178         if (!node) {
1179                 dev_err(&smi->pdev->dev, "Creating debugfs file mibs "
1180                         "xfailed\n");
1181                 return;
1182         }
1183 }
1184
1185 static void rtl8366_debugfs_remove(struct rtl8366_smi *smi)
1186 {
1187         if (smi->debugfs_root) {
1188                 debugfs_remove_recursive(smi->debugfs_root);
1189                 smi->debugfs_root = NULL;
1190         }
1191 }
1192
1193 #else
1194 static inline void rtl8366_debugfs_init(struct rtl8366_smi *smi) {}
1195 static inline void rtl8366_debugfs_remove(struct rtl8366_smi *smi) {}
1196 #endif
1197
1198 static int rtl8366_global_reset_mibs(struct switch_dev *dev,
1199                                      const struct switch_attr *attr,
1200                                      struct switch_val *val)
1201 {
1202         u32 data = 0;
1203         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1204
1205         if (val->value.i == 1) {
1206                 rtl8366_smi_read_reg(smi, RTL8366S_MIB_CTRL_REG, &data);
1207                 data |= (1 << 2);
1208                 rtl8366_smi_write_reg(smi, RTL8366S_MIB_CTRL_REG, data);
1209         }
1210
1211         return 0;
1212 }
1213
1214 static int rtl8366_get_vlan(struct switch_dev *dev,
1215                             const struct switch_attr *attr,
1216                             struct switch_val *val)
1217 {
1218         u32 data;
1219         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1220
1221         if (attr->ofs == 1) {
1222                 rtl8366_smi_read_reg(smi, RTL8366_CHIP_GLOBAL_CTRL_REG, &data);
1223
1224                 if (data & RTL8366_CHIP_CTRL_VLAN)
1225                         val->value.i = 1;
1226                 else
1227                         val->value.i = 0;
1228         } else if (attr->ofs == 2) {
1229                 rtl8366_smi_read_reg(smi, RTL8366S_VLAN_TB_CTRL_REG, &data);
1230
1231                 if (data & 0x0001)
1232                         val->value.i = 1;
1233                 else
1234                         val->value.i = 0;
1235         }
1236
1237         return 0;
1238 }
1239
1240 static int rtl8366_global_get_blinkrate(struct switch_dev *dev,
1241                                         const struct switch_attr *attr,
1242                                         struct switch_val *val)
1243 {
1244         u32 data;
1245         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1246         rtl8366_smi_read_reg(smi, RTL8366_LED_BLINKRATE_REG, &data);
1247
1248         val->value.i = (data & (RTL8366_LED_BLINKRATE_MASK));
1249
1250         return 0;
1251 }
1252
1253 static int rtl8366_global_set_blinkrate(struct switch_dev *dev,
1254                                         const struct switch_attr *attr,
1255                                         struct switch_val *val)
1256 {
1257         u32 data;
1258         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1259
1260         if (val->value.i >= 6)
1261                 return -EINVAL;
1262
1263         rtl8366_smi_read_reg(smi, RTL8366_LED_BLINKRATE_REG, &data);
1264
1265         data &= ~(data & RTL8366_LED_BLINKRATE_MASK);
1266         data |= val->value.i;
1267
1268         rtl8366_smi_write_reg(smi, RTL8366_LED_BLINKRATE_REG, data);
1269
1270         return 0;
1271 }
1272
1273 static int rtl8366_set_vlan(struct switch_dev *dev,
1274                             const struct switch_attr *attr,
1275                             struct switch_val *val)
1276 {
1277         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1278
1279         if (attr->ofs == 1)
1280                 return rtl8366_vlan_set_vlan(smi, val->value.i);
1281         else
1282                 return rtl8366_vlan_set_4ktable(smi, val->value.i);
1283 }
1284
1285 static int rtl8366_attr_get_port_link(struct switch_dev *dev,
1286                                       const struct switch_attr *attr,
1287                                       struct switch_val *val)
1288 {
1289         u32 len = 0, data = 0;
1290         int speed, duplex, link, txpause, rxpause, nway;
1291         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1292         char *buf = smi->buf;
1293
1294         if (val->port_vlan >= RTL8366_NUM_PORTS)
1295                 return -EINVAL;
1296
1297         memset(buf, '\0', sizeof(smi->buf));
1298         rtl8366_smi_read_reg(smi, RTL8366S_PORT_LINK_STATUS_BASE +
1299                              (val->port_vlan >> 1),
1300                              &data);
1301
1302         if (val->port_vlan & 0x1)
1303                 data = data >> 8;
1304
1305         speed = (data & RTL8366S_PORT_STATUS_SPEED_MASK);
1306         duplex = (data & RTL8366S_PORT_STATUS_DUPLEX_MASK) >> 2;
1307         link = (data & RTL8366S_PORT_STATUS_LINK_MASK) >> 4;
1308         txpause = (data & RTL8366S_PORT_STATUS_TXPAUSE_MASK) >> 5;
1309         rxpause = (data & RTL8366S_PORT_STATUS_RXPAUSE_MASK) >> 6;
1310         nway = (data & RTL8366S_PORT_STATUS_AN_MASK) >> 7;
1311
1312         len += snprintf(buf + len, sizeof(smi->buf) - len, "Port %d: ",
1313                         val->port_vlan);
1314
1315         if (link)
1316                 len += snprintf(buf + len, sizeof(smi->buf) - len,
1317                                 "Link UP, Speed: ");
1318         else
1319                 len += snprintf(buf + len, sizeof(smi->buf) - len,
1320                                 "Link DOWN, Speed: ");
1321
1322         if (speed == 0)
1323                 len += snprintf(buf + len, sizeof(smi->buf) - len, "10Base-TX ");
1324         else if (speed == 1)
1325                 len += snprintf(buf + len, sizeof(smi->buf) - len, "100Base-TX ");
1326         else if (speed == 2)
1327                 len += snprintf(buf + len, sizeof(smi->buf) - len, "1000Base-TX ");
1328
1329         if (duplex)
1330                 len += snprintf(buf + len, sizeof(smi->buf) - len, "Full-Duplex, ");
1331         else
1332                 len += snprintf(buf + len, sizeof(smi->buf) - len, "Half-Duplex, ");
1333
1334         if (txpause)
1335                 len += snprintf(buf + len, sizeof(smi->buf) - len, "TX-Pause ");
1336         if (rxpause)
1337                 len += snprintf(buf + len, sizeof(smi->buf) - len, "RX-Pause ");
1338         if (nway)
1339                 len += snprintf(buf + len, sizeof(smi->buf) - len, "nway ");
1340
1341         val->value.s = buf;
1342         val->len = len;
1343
1344         return 0;
1345 }
1346
1347 static int rtl8366_attr_get_vlan_info(struct switch_dev *dev,
1348                                       const struct switch_attr *attr,
1349                                       struct switch_val *val)
1350 {
1351         int i;
1352         u32 len = 0;
1353         struct rtl8366s_vlanconfig vlanmc;
1354         struct rtl8366s_vlan4kentry vlan4k;
1355         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1356         char *buf = smi->buf;
1357
1358         if (val->port_vlan >= RTL8366_NUM_PORTS)
1359                 return -EINVAL;
1360
1361         memset(buf, '\0', sizeof(smi->buf));
1362
1363         rtl8366s_get_vlan_member_config(smi, val->port_vlan, &vlanmc);
1364         rtl8366s_get_vlan_4k_entry(smi, vlanmc.vid, &vlan4k);
1365
1366         len += snprintf(buf + len, sizeof(smi->buf) - len, "VLAN %d: Ports: ",
1367                         val->port_vlan);
1368
1369         for (i = 0; i < RTL8366_NUM_PORTS; ++i) {
1370                 int index = 0;
1371                 if (!rtl8366_get_port_vlan_index(smi, i, &index) &&
1372                     index == val->port_vlan)
1373                         len += snprintf(buf + len, sizeof(smi->buf) - len, "%d", i);
1374         }
1375         len += snprintf(buf + len, sizeof(smi->buf) - len, "\n");
1376
1377         len += snprintf(buf + len, sizeof(smi->buf) - len,
1378                         "\t\t vid \t prio \t member \t untag \t fid\n");
1379         len += snprintf(buf + len, sizeof(smi->buf) - len, "\tMC:\t");
1380         len += snprintf(buf + len, sizeof(smi->buf) - len,
1381                         "%d \t %d \t 0x%04x \t 0x%04x \t %d\n",
1382                         vlanmc.vid, vlanmc.priority, vlanmc.member,
1383                         vlanmc.untag, vlanmc.fid);
1384         len += snprintf(buf + len, sizeof(smi->buf) - len, "\t4K:\t");
1385         len += snprintf(buf + len, sizeof(smi->buf) - len,
1386                         "%d \t  \t 0x%04x \t 0x%04x \t %d",
1387                         vlan4k.vid, vlan4k.member, vlan4k.untag, vlan4k.fid);
1388
1389         val->value.s = buf;
1390         val->len = len;
1391
1392         return 0;
1393 }
1394
1395 static int rtl8366_set_port_led(struct switch_dev *dev,
1396                                 const struct switch_attr *attr,
1397                                 struct switch_val *val)
1398 {
1399         u32 data = 0;
1400         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1401         if (val->port_vlan >= RTL8366_NUM_PORTS ||
1402             (1 << val->port_vlan) == RTL8366_PORT_UNKNOWN)
1403                 return -EINVAL;
1404
1405         if (val->port_vlan == RTL8366_PORT_NUM_CPU) {
1406                 rtl8366_smi_read_reg(smi, RTL8366_LED_BLINKRATE_REG, &data);
1407                 data = (data & (~(0xF << 4))) | (val->value.i << 4);
1408                 rtl8366_smi_write_reg(smi, RTL8366_LED_BLINKRATE_REG, data);
1409         } else {
1410                 rtl8366_smi_read_reg(smi, RTL8366_LED_CTRL_REG, &data);
1411                 data = (data & (~(0xF << (val->port_vlan * 4)))) |
1412                         (val->value.i << (val->port_vlan * 4));
1413                 rtl8366_smi_write_reg(smi, RTL8366_LED_CTRL_REG, data);
1414         }
1415
1416         return 0;
1417 }
1418
1419 static int rtl8366_get_port_led(struct switch_dev *dev,
1420                                 const struct switch_attr *attr,
1421                                 struct switch_val *val)
1422 {
1423         u32 data = 0;
1424         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1425         if (val->port_vlan >= RTL8366_NUM_LEDGROUPS)
1426                 return -EINVAL;
1427
1428         rtl8366_smi_read_reg(smi, RTL8366_LED_CTRL_REG, &data);
1429         val->value.i = (data >> (val->port_vlan * 4)) & 0x000F;
1430
1431         return 0;
1432 }
1433
1434 static int rtl8366_reset_port_mibs(struct switch_dev *dev,
1435                                    const struct switch_attr *attr,
1436                                    struct switch_val *val)
1437 {
1438         u32 data = 0;
1439         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1440         if (val->port_vlan >= RTL8366_NUM_PORTS)
1441                 return -EINVAL;
1442
1443         rtl8366_smi_read_reg(smi, RTL8366S_MIB_CTRL_REG, &data);
1444         data |= (1 << (val->port_vlan + 3));
1445         rtl8366_smi_write_reg(smi, RTL8366S_MIB_CTRL_REG, data);
1446
1447         return 0;
1448 }
1449
1450 static int rtl8366_get_port_mib(struct switch_dev *dev,
1451                                 const struct switch_attr *attr,
1452                                 struct switch_val *val)
1453 {
1454         int i, len = 0;
1455         unsigned long long counter = 0;
1456         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1457         char *buf = smi->buf;
1458
1459         if (val->port_vlan >= RTL8366_NUM_PORTS)
1460                 return -EINVAL;
1461
1462         len += snprintf(buf + len, sizeof(smi->buf) - len, "Port %d MIB counters\n",
1463                         val->port_vlan);
1464         for (i = 0; i < RTL8366S_MIB_COUNT; ++i) {
1465
1466                 len += snprintf(buf + len, sizeof(smi->buf) - len,
1467                                 "%d:%s\t", i, MIBCOUNTERS[i]);
1468                 if (!rtl8366_get_mib_counter(smi, i, val->port_vlan, &counter))
1469                         len += snprintf(buf + len, sizeof(smi->buf) - len,
1470                                         "[%llu]\n", counter);
1471                 else
1472                         len += snprintf(buf + len, sizeof(smi->buf) - len,
1473                                         "[error]\n");
1474         }
1475
1476         val->value.s = buf;
1477         val->len = len;
1478         return 0;
1479 }
1480
1481 static int rtl8366_get_ports(struct switch_dev *dev,
1482                              struct switch_val *val)
1483 {
1484         struct rtl8366s_vlanconfig vlanmc;
1485         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1486         struct switch_port *port;
1487         int i;
1488
1489         if (val->port_vlan >= RTL8366_NUM_VLANS)
1490                 return -EINVAL;
1491
1492         rtl8366s_get_vlan_member_config(smi, val->port_vlan, &vlanmc);
1493
1494         port = &val->value.ports[0];
1495         val->len = 0;
1496         for (i = 0; i < RTL8366_NUM_PORTS; i++) {
1497                 if (!(vlanmc.member & BIT(i)))
1498                         continue;
1499
1500                 port->id = i;
1501                 port->flags = (vlanmc.untag & BIT(i)) ?
1502                                         0 : BIT(SWITCH_PORT_FLAG_TAGGED);
1503                 val->len++;
1504                 port++;
1505         }
1506         return 0;
1507 }
1508
1509 static int rtl8366_set_ports(struct switch_dev *dev,
1510                              struct switch_val *val)
1511 {
1512         struct rtl8366s_vlanconfig vlanmc;
1513         struct rtl8366s_vlan4kentry vlan4k;
1514         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1515         struct switch_port *port;
1516         int i;
1517
1518         if (val->port_vlan >= RTL8366_NUM_VLANS)
1519                 return -EINVAL;
1520
1521         rtl8366s_get_vlan_member_config(smi, val->port_vlan, &vlanmc);
1522         rtl8366s_get_vlan_4k_entry(smi, vlanmc.vid, &vlan4k);
1523
1524         vlanmc.untag = 0;
1525         vlanmc.member = 0;
1526
1527         port = &val->value.ports[0];
1528         for (i = 0; i < val->len; i++, port++) {
1529                 vlanmc.member |= BIT(port->id);
1530
1531                 if (!(port->flags & BIT(SWITCH_PORT_FLAG_TAGGED)))
1532                         vlanmc.untag |= BIT(port->id);
1533         }
1534
1535         vlan4k.member = vlanmc.member;
1536         vlan4k.untag = vlanmc.untag;
1537
1538         rtl8366s_set_vlan_member_config(smi, val->port_vlan, &vlanmc);
1539         rtl8366s_set_vlan_4k_entry(smi, &vlan4k);
1540         return 0;
1541 }
1542
1543 static int rtl8366_get_port_pvid(struct switch_dev *dev, int port, int *val)
1544 {
1545         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1546         return rtl8366_get_vlan_port_pvid(smi, port, val);
1547 }
1548
1549 static int rtl8366_set_port_pvid(struct switch_dev *dev, int port, int val)
1550 {
1551         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1552         return rtl8366_set_vlan_port_pvid(smi, port, val);
1553 }
1554
1555 static int rtl8366_reset_switch(struct switch_dev *dev)
1556 {
1557         struct rtl8366_smi *smi = sw_to_rtl8366(dev);
1558         int timeout = 10;
1559         u32 data;
1560
1561         rtl8366_smi_write_reg(smi, RTL8366_RESET_CTRL_REG,
1562                               RTL8366_CHIP_CTRL_RESET_HW);
1563         do {
1564                 msleep(1);
1565                 if (rtl8366_smi_read_reg(smi, RTL8366_RESET_CTRL_REG, &data))
1566                         return -EIO;
1567
1568                 if (!(data & RTL8366_CHIP_CTRL_RESET_HW))
1569                         break;
1570         } while (--timeout);
1571
1572         if (!timeout) {
1573                 printk("Timeout waiting for the switch to reset\n");
1574                 return -EIO;
1575         }
1576
1577         return rtl8366s_reset_vlan(smi);
1578 }
1579
1580 static struct switch_attr rtl8366_globals[] = {
1581         {
1582                 .type = SWITCH_TYPE_INT,
1583                 .name = "enable_vlan",
1584                 .description = "Enable VLAN mode",
1585                 .set = rtl8366_set_vlan,
1586                 .get = rtl8366_get_vlan,
1587                 .max = 1,
1588                 .ofs = 1
1589         },
1590         {
1591                 .type = SWITCH_TYPE_INT,
1592                 .name = "enable_vlan4k",
1593                 .description = "Enable VLAN 4K mode",
1594                 .set = rtl8366_set_vlan,
1595                 .get = rtl8366_get_vlan,
1596                 .max = 1,
1597                 .ofs = 2
1598         },
1599         {
1600                 .type = SWITCH_TYPE_INT,
1601                 .name = "reset_mibs",
1602                 .description = "Reset all MIB counters",
1603                 .set = rtl8366_global_reset_mibs,
1604                 .get = NULL,
1605                 .max = 1
1606         },
1607         {
1608                 .type = SWITCH_TYPE_INT,
1609                 .name = "blinkrate",
1610                 .description = "Get/Set LED blinking rate (0 = 43ms, 1 = 84ms,"
1611                 " 2 = 120ms, 3 = 170ms, 4 = 340ms, 5 = 670ms)",
1612                 .set = rtl8366_global_set_blinkrate,
1613                 .get = rtl8366_global_get_blinkrate,
1614                 .max = 5
1615         },
1616 };
1617
1618 static struct switch_attr rtl8366_port[] = {
1619         {
1620                 .type = SWITCH_TYPE_STRING,
1621                 .name = "link",
1622                 .description = "Get port link information",
1623                 .max = 1,
1624                 .set = NULL,
1625                 .get = rtl8366_attr_get_port_link
1626         },
1627         {
1628                 .type = SWITCH_TYPE_INT,
1629                 .name = "reset_mib",
1630                 .description = "Reset single port MIB counters",
1631                 .max = 1,
1632                 .set = rtl8366_reset_port_mibs,
1633                 .get = NULL
1634         },
1635         {
1636                 .type = SWITCH_TYPE_STRING,
1637                 .name = "mib",
1638                 .description = "Get MIB counters for port",
1639                 .max = 33,
1640                 .set = NULL,
1641                 .get = rtl8366_get_port_mib
1642         },
1643         {
1644                 .type = SWITCH_TYPE_INT,
1645                 .name = "led",
1646                 .description = "Get/Set port group (0 - 3) led mode (0 - 15)",
1647                 .max = 15,
1648                 .set = rtl8366_set_port_led,
1649                 .get = rtl8366_get_port_led
1650         },
1651 };
1652
1653 static struct switch_attr rtl8366_vlan[] = {
1654         {
1655                 .type = SWITCH_TYPE_STRING,
1656                 .name = "info",
1657                 .description = "Get vlan information",
1658                 .max = 1,
1659                 .set = NULL,
1660                 .get = rtl8366_attr_get_vlan_info
1661         },
1662 };
1663
1664
1665 /* template */
1666 static struct switch_dev rtldev = {
1667         .name = "RTL8366S",
1668         .cpu_port = RTL8366_PORT_NUM_CPU,
1669         .ports = RTL8366_NUM_PORTS,
1670         .vlans = RTL8366_NUM_VLANS,
1671         .attr_global = {
1672                 .attr = rtl8366_globals,
1673                 .n_attr = ARRAY_SIZE(rtl8366_globals),
1674         },
1675         .attr_port = {
1676                 .attr = rtl8366_port,
1677                 .n_attr = ARRAY_SIZE(rtl8366_port),
1678         },
1679         .attr_vlan = {
1680                 .attr = rtl8366_vlan,
1681                 .n_attr = ARRAY_SIZE(rtl8366_vlan),
1682         },
1683
1684         .get_vlan_ports = rtl8366_get_ports,
1685         .set_vlan_ports = rtl8366_set_ports,
1686         .get_port_pvid = rtl8366_get_port_pvid,
1687         .set_port_pvid = rtl8366_set_port_pvid,
1688         .reset_switch = rtl8366_reset_switch,
1689 };
1690
1691 static int rtl8366_smi_switch_init(struct rtl8366_smi *smi)
1692 {
1693         struct switch_dev *dev = &smi->dev;
1694         int err;
1695
1696         memcpy(dev, &rtldev, sizeof(struct switch_dev));
1697         dev->priv = smi;
1698         dev->devname = dev_name(&smi->pdev->dev);
1699
1700         err = register_switch(dev, NULL);
1701         if (err)
1702                 dev_err(&smi->pdev->dev, "switch registration failed\n");
1703
1704         return err;
1705 }
1706
1707 static void rtl8366_smi_switch_cleanup(struct rtl8366_smi *smi)
1708 {
1709         unregister_switch(&smi->dev);
1710 }
1711
1712 static int rtl8366_smi_mii_read(struct mii_bus *bus, int addr, int reg)
1713 {
1714         struct rtl8366_smi *smi = bus->priv;
1715         u32 val = 0;
1716         int err;
1717
1718         err = rtl8366_smi_read_phy_reg(smi, addr, 0, reg, &val);
1719         if (err)
1720                 return 0xffff;
1721
1722         return val;
1723 }
1724
1725 static int rtl8366_smi_mii_write(struct mii_bus *bus, int addr, int reg,
1726                                      u16 val)
1727 {
1728         struct rtl8366_smi *smi = bus->priv;
1729         u32 t;
1730         int err;
1731
1732         err = rtl8366_smi_write_phy_reg(smi, addr, 0, reg, val);
1733         /* flush write */
1734         (void) rtl8366_smi_read_phy_reg(smi, addr, 0, reg, &t);
1735
1736         return err;
1737 }
1738
1739 static int rtl8366_smi_mii_init(struct rtl8366_smi *smi)
1740 {
1741         int ret;
1742         int i;
1743
1744         smi->mii_bus = mdiobus_alloc();
1745         if (smi->mii_bus == NULL) {
1746                 ret = -ENOMEM;
1747                 goto err;
1748         }
1749
1750         spin_lock_init(&smi->lock);
1751         smi->mii_bus->priv = (void *) smi;
1752         smi->mii_bus->name = "rtl8366-smi";
1753         smi->mii_bus->read = rtl8366_smi_mii_read;
1754         smi->mii_bus->write = rtl8366_smi_mii_write;
1755         snprintf(smi->mii_bus->id, MII_BUS_ID_SIZE, "%s",
1756                         dev_name(&smi->pdev->dev));
1757         smi->mii_bus->parent = &smi->pdev->dev;
1758         smi->mii_bus->phy_mask = ~(0x1f);
1759         smi->mii_bus->irq = smi->mii_irq;
1760         for (i = 0; i < PHY_MAX_ADDR; i++)
1761                 smi->mii_irq[i] = PHY_POLL;
1762
1763         ret = mdiobus_register(smi->mii_bus);
1764         if (ret)
1765                 goto err_free;
1766
1767         return 0;
1768
1769  err_free:
1770         mdiobus_free(smi->mii_bus);
1771  err:
1772         return ret;
1773 }
1774
1775 static void rtl8366_smi_mii_cleanup(struct rtl8366_smi *smi)
1776 {
1777         mdiobus_unregister(smi->mii_bus);
1778         mdiobus_free(smi->mii_bus);
1779 }
1780
1781 static int rtl8366_smi_mii_bus_match(struct mii_bus *bus)
1782 {
1783         return (bus->read == rtl8366_smi_mii_read &&
1784                 bus->write == rtl8366_smi_mii_write);
1785 }
1786
1787 static int rtl8366_smi_setup(struct rtl8366_smi *smi)
1788 {
1789         u32 chip_id = 0;
1790         u32 chip_ver = 0;
1791         int ret;
1792
1793         ret = rtl8366_smi_read_reg(smi, RTL8366S_CHIP_ID_REG, &chip_id);
1794         if (ret) {
1795                 dev_err(&smi->pdev->dev, "unable to read chip id\n");
1796                 return ret;
1797         }
1798
1799         switch (chip_id) {
1800         case RTL8366S_CHIP_ID_8366:
1801                 break;
1802         default:
1803                 dev_err(&smi->pdev->dev, "unknown chip id (%04x)\n", chip_id);
1804                 return -ENODEV;
1805         }
1806
1807         ret = rtl8366_smi_read_reg(smi, RTL8366S_CHIP_VERSION_CTRL_REG,
1808                                    &chip_ver);
1809         if (ret) {
1810                 dev_err(&smi->pdev->dev, "unable to read chip version\n");
1811                 return ret;
1812         }
1813
1814         dev_info(&smi->pdev->dev, "RTL%04x ver. %u chip found\n",
1815                  chip_id, chip_ver & RTL8366S_CHIP_VERSION_MASK);
1816
1817         rtl8366_debugfs_init(smi);
1818
1819         return 0;
1820 }
1821
1822 static int __init rtl8366_smi_probe(struct platform_device *pdev)
1823 {
1824         static int rtl8366_smi_version_printed;
1825         struct rtl8366_smi_platform_data *pdata;
1826         struct rtl8366_smi *smi;
1827         int err;
1828
1829         if (!rtl8366_smi_version_printed++)
1830                 printk(KERN_NOTICE RTL8366_SMI_DRIVER_DESC
1831                        " version " RTL8366_SMI_DRIVER_VER"\n");
1832
1833         pdata = pdev->dev.platform_data;
1834         if (!pdata) {
1835                 dev_err(&pdev->dev, "no platform data specified\n");
1836                 err = -EINVAL;
1837                 goto err_out;
1838         }
1839
1840         smi = kzalloc(sizeof(struct rtl8366_smi), GFP_KERNEL);
1841         if (!smi) {
1842                 dev_err(&pdev->dev, "no memory for private data\n");
1843                 err = -ENOMEM;
1844                 goto err_out;
1845         }
1846
1847         err = gpio_request(pdata->gpio_sda, dev_name(&pdev->dev));
1848         if (err) {
1849                 dev_err(&pdev->dev, "gpio_request failed for %u, err=%d\n",
1850                         pdata->gpio_sda, err);
1851                 goto err_free_smi;
1852         }
1853
1854         err = gpio_request(pdata->gpio_sck, dev_name(&pdev->dev));
1855         if (err) {
1856                 dev_err(&pdev->dev, "gpio_request failed for %u, err=%d\n",
1857                         pdata->gpio_sck, err);
1858                 goto err_free_sda;
1859         }
1860
1861         smi->pdev = pdev;
1862         smi->pdata = pdata;
1863         spin_lock_init(&smi->lock);
1864
1865         platform_set_drvdata(pdev, smi);
1866
1867         dev_info(&pdev->dev, "using GPIO pins %u (SDA) and %u (SCK)\n",
1868                  pdata->gpio_sda, pdata->gpio_sck);
1869
1870         err = rtl8366_smi_setup(smi);
1871         if (err)
1872                 goto err_clear_drvdata;
1873
1874         err = rtl8366_smi_mii_init(smi);
1875         if (err)
1876                 goto err_clear_drvdata;
1877
1878         err = rtl8366_smi_switch_init(smi);
1879         if (err)
1880                 goto err_mii_cleanup;
1881
1882         return 0;
1883
1884  err_mii_cleanup:
1885         rtl8366_smi_mii_cleanup(smi);
1886  err_clear_drvdata:
1887         platform_set_drvdata(pdev, NULL);
1888         gpio_free(pdata->gpio_sck);
1889  err_free_sda:
1890         gpio_free(pdata->gpio_sda);
1891  err_free_smi:
1892         kfree(smi);
1893  err_out:
1894         return err;
1895 }
1896
1897 int rtl8366_phy_config_init(struct phy_device *phydev)
1898 {
1899         if (!rtl8366_smi_mii_bus_match(phydev->bus))
1900                 return -EINVAL;
1901
1902         return 0;
1903 }
1904
1905 int rtl8366_phy_config_aneg(struct phy_device *phydev)
1906 {
1907         return 0;
1908 }
1909
1910 static struct phy_driver rtl8366_smi_phy_driver = {
1911         .phy_id         = 0x001cc960,
1912         .name           = "Realtek RTL8366",
1913         .phy_id_mask    = 0x1ffffff0,
1914         .features       = PHY_GBIT_FEATURES,
1915         .config_aneg    = rtl8366_phy_config_aneg,
1916         .config_init    = rtl8366_phy_config_init,
1917         .read_status    = genphy_read_status,
1918         .driver         = {
1919                 .owner = THIS_MODULE,
1920         },
1921 };
1922
1923 static int __devexit rtl8366_smi_remove(struct platform_device *pdev)
1924 {
1925         struct rtl8366_smi *smi = platform_get_drvdata(pdev);
1926
1927         if (smi) {
1928                 struct rtl8366_smi_platform_data *pdata;
1929
1930                 pdata = pdev->dev.platform_data;
1931
1932                 rtl8366_smi_switch_cleanup(smi);
1933                 rtl8366_debugfs_remove(smi);
1934                 rtl8366_smi_mii_cleanup(smi);
1935                 platform_set_drvdata(pdev, NULL);
1936                 gpio_free(pdata->gpio_sck);
1937                 gpio_free(pdata->gpio_sda);
1938                 kfree(smi);
1939         }
1940
1941         return 0;
1942 }
1943
1944 static struct platform_driver rtl8366_smi_driver = {
1945         .driver = {
1946                 .name           = RTL8366_SMI_DRIVER_NAME,
1947                 .owner          = THIS_MODULE,
1948         },
1949         .probe          = rtl8366_smi_probe,
1950         .remove         = __devexit_p(rtl8366_smi_remove),
1951 };
1952
1953 static int __init rtl8366_smi_init(void)
1954 {
1955         int ret;
1956         ret = platform_driver_register(&rtl8366_smi_driver);
1957         if (ret)
1958                 return ret;
1959
1960         ret = phy_driver_register(&rtl8366_smi_phy_driver);
1961         if (ret)
1962                 goto err_platform_unregister;
1963
1964         return 0;
1965
1966  err_platform_unregister:
1967         platform_driver_unregister(&rtl8366_smi_driver);
1968         return ret;
1969 }
1970 module_init(rtl8366_smi_init);
1971
1972 static void __exit rtl8366_smi_exit(void)
1973 {
1974         phy_driver_unregister(&rtl8366_smi_phy_driver);
1975         platform_driver_unregister(&rtl8366_smi_driver);
1976 }
1977 module_exit(rtl8366_smi_exit);
1978
1979 MODULE_DESCRIPTION(RTL8366_SMI_DRIVER_DESC);
1980 MODULE_VERSION(RTL8366_SMI_DRIVER_VER);
1981 MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
1982 MODULE_AUTHOR("Antti Seppälä <a.seppala@gmail.com>");
1983 MODULE_LICENSE("GPL v2");
1984 MODULE_ALIAS("platform:" RTL8366_SMI_DRIVER_NAME);