make rtl8366 driver OF capable
[openwrt/openwrt.git] / target / linux / generic / files / drivers / net / phy / rtl8366_smi.c
1 /*
2 * Realtek RTL8366 SMI interface driver
3 *
4 * Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org>
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 as published
8 * by the Free Software Foundation.
9 */
10
11 #include <linux/kernel.h>
12 #include <linux/module.h>
13 #include <linux/device.h>
14 #include <linux/delay.h>
15 #include <linux/gpio.h>
16 #include <linux/spinlock.h>
17 #include <linux/skbuff.h>
18 #include <linux/of_platform.h>
19 #include <linux/of_gpio.h>
20 #include <linux/rtl8366.h>
21
22 #ifdef CONFIG_RTL8366_SMI_DEBUG_FS
23 #include <linux/debugfs.h>
24 #endif
25
26 #include "rtl8366_smi.h"
27
28 #define RTL8366_SMI_ACK_RETRY_COUNT 5
29
30 #define RTL8366_SMI_HW_STOP_DELAY 25 /* msecs */
31 #define RTL8366_SMI_HW_START_DELAY 100 /* msecs */
32
33 static inline void rtl8366_smi_clk_delay(struct rtl8366_smi *smi)
34 {
35 ndelay(smi->clk_delay);
36 }
37
38 static void rtl8366_smi_start(struct rtl8366_smi *smi)
39 {
40 unsigned int sda = smi->gpio_sda;
41 unsigned int sck = smi->gpio_sck;
42
43 /*
44 * Set GPIO pins to output mode, with initial state:
45 * SCK = 0, SDA = 1
46 */
47 gpio_direction_output(sck, 0);
48 gpio_direction_output(sda, 1);
49 rtl8366_smi_clk_delay(smi);
50
51 /* CLK 1: 0 -> 1, 1 -> 0 */
52 gpio_set_value(sck, 1);
53 rtl8366_smi_clk_delay(smi);
54 gpio_set_value(sck, 0);
55 rtl8366_smi_clk_delay(smi);
56
57 /* CLK 2: */
58 gpio_set_value(sck, 1);
59 rtl8366_smi_clk_delay(smi);
60 gpio_set_value(sda, 0);
61 rtl8366_smi_clk_delay(smi);
62 gpio_set_value(sck, 0);
63 rtl8366_smi_clk_delay(smi);
64 gpio_set_value(sda, 1);
65 }
66
67 static void rtl8366_smi_stop(struct rtl8366_smi *smi)
68 {
69 unsigned int sda = smi->gpio_sda;
70 unsigned int sck = smi->gpio_sck;
71
72 rtl8366_smi_clk_delay(smi);
73 gpio_set_value(sda, 0);
74 gpio_set_value(sck, 1);
75 rtl8366_smi_clk_delay(smi);
76 gpio_set_value(sda, 1);
77 rtl8366_smi_clk_delay(smi);
78 gpio_set_value(sck, 1);
79 rtl8366_smi_clk_delay(smi);
80 gpio_set_value(sck, 0);
81 rtl8366_smi_clk_delay(smi);
82 gpio_set_value(sck, 1);
83
84 /* add a click */
85 rtl8366_smi_clk_delay(smi);
86 gpio_set_value(sck, 0);
87 rtl8366_smi_clk_delay(smi);
88 gpio_set_value(sck, 1);
89
90 /* set GPIO pins to input mode */
91 gpio_direction_input(sda);
92 gpio_direction_input(sck);
93 }
94
95 static void rtl8366_smi_write_bits(struct rtl8366_smi *smi, u32 data, u32 len)
96 {
97 unsigned int sda = smi->gpio_sda;
98 unsigned int sck = smi->gpio_sck;
99
100 for (; len > 0; len--) {
101 rtl8366_smi_clk_delay(smi);
102
103 /* prepare data */
104 gpio_set_value(sda, !!(data & ( 1 << (len - 1))));
105 rtl8366_smi_clk_delay(smi);
106
107 /* clocking */
108 gpio_set_value(sck, 1);
109 rtl8366_smi_clk_delay(smi);
110 gpio_set_value(sck, 0);
111 }
112 }
113
114 static void rtl8366_smi_read_bits(struct rtl8366_smi *smi, u32 len, u32 *data)
115 {
116 unsigned int sda = smi->gpio_sda;
117 unsigned int sck = smi->gpio_sck;
118
119 gpio_direction_input(sda);
120
121 for (*data = 0; len > 0; len--) {
122 u32 u;
123
124 rtl8366_smi_clk_delay(smi);
125
126 /* clocking */
127 gpio_set_value(sck, 1);
128 rtl8366_smi_clk_delay(smi);
129 u = !!gpio_get_value(sda);
130 gpio_set_value(sck, 0);
131
132 *data |= (u << (len - 1));
133 }
134
135 gpio_direction_output(sda, 0);
136 }
137
138 static int rtl8366_smi_wait_for_ack(struct rtl8366_smi *smi)
139 {
140 int retry_cnt;
141
142 retry_cnt = 0;
143 do {
144 u32 ack;
145
146 rtl8366_smi_read_bits(smi, 1, &ack);
147 if (ack == 0)
148 break;
149
150 if (++retry_cnt > RTL8366_SMI_ACK_RETRY_COUNT) {
151 dev_err(smi->parent, "ACK timeout\n");
152 return -ETIMEDOUT;
153 }
154 } while (1);
155
156 return 0;
157 }
158
159 static int rtl8366_smi_write_byte(struct rtl8366_smi *smi, u8 data)
160 {
161 rtl8366_smi_write_bits(smi, data, 8);
162 return rtl8366_smi_wait_for_ack(smi);
163 }
164
165 static int rtl8366_smi_write_byte_noack(struct rtl8366_smi *smi, u8 data)
166 {
167 rtl8366_smi_write_bits(smi, data, 8);
168 return 0;
169 }
170
171 static int rtl8366_smi_read_byte0(struct rtl8366_smi *smi, u8 *data)
172 {
173 u32 t;
174
175 /* read data */
176 rtl8366_smi_read_bits(smi, 8, &t);
177 *data = (t & 0xff);
178
179 /* send an ACK */
180 rtl8366_smi_write_bits(smi, 0x00, 1);
181
182 return 0;
183 }
184
185 static int rtl8366_smi_read_byte1(struct rtl8366_smi *smi, u8 *data)
186 {
187 u32 t;
188
189 /* read data */
190 rtl8366_smi_read_bits(smi, 8, &t);
191 *data = (t & 0xff);
192
193 /* send an ACK */
194 rtl8366_smi_write_bits(smi, 0x01, 1);
195
196 return 0;
197 }
198
199 int rtl8366_smi_read_reg(struct rtl8366_smi *smi, u32 addr, u32 *data)
200 {
201 unsigned long flags;
202 u8 lo = 0;
203 u8 hi = 0;
204 int ret;
205
206 spin_lock_irqsave(&smi->lock, flags);
207
208 rtl8366_smi_start(smi);
209
210 /* send READ command */
211 ret = rtl8366_smi_write_byte(smi, smi->cmd_read);
212 if (ret)
213 goto out;
214
215 /* set ADDR[7:0] */
216 ret = rtl8366_smi_write_byte(smi, addr & 0xff);
217 if (ret)
218 goto out;
219
220 /* set ADDR[15:8] */
221 ret = rtl8366_smi_write_byte(smi, addr >> 8);
222 if (ret)
223 goto out;
224
225 /* read DATA[7:0] */
226 rtl8366_smi_read_byte0(smi, &lo);
227 /* read DATA[15:8] */
228 rtl8366_smi_read_byte1(smi, &hi);
229
230 *data = ((u32) lo) | (((u32) hi) << 8);
231
232 ret = 0;
233
234 out:
235 rtl8366_smi_stop(smi);
236 spin_unlock_irqrestore(&smi->lock, flags);
237
238 return ret;
239 }
240 EXPORT_SYMBOL_GPL(rtl8366_smi_read_reg);
241
242 static int __rtl8366_smi_write_reg(struct rtl8366_smi *smi,
243 u32 addr, u32 data, bool ack)
244 {
245 unsigned long flags;
246 int ret;
247
248 spin_lock_irqsave(&smi->lock, flags);
249
250 rtl8366_smi_start(smi);
251
252 /* send WRITE command */
253 ret = rtl8366_smi_write_byte(smi, smi->cmd_write);
254 if (ret)
255 goto out;
256
257 /* set ADDR[7:0] */
258 ret = rtl8366_smi_write_byte(smi, addr & 0xff);
259 if (ret)
260 goto out;
261
262 /* set ADDR[15:8] */
263 ret = rtl8366_smi_write_byte(smi, addr >> 8);
264 if (ret)
265 goto out;
266
267 /* write DATA[7:0] */
268 ret = rtl8366_smi_write_byte(smi, data & 0xff);
269 if (ret)
270 goto out;
271
272 /* write DATA[15:8] */
273 if (ack)
274 ret = rtl8366_smi_write_byte(smi, data >> 8);
275 else
276 ret = rtl8366_smi_write_byte_noack(smi, data >> 8);
277 if (ret)
278 goto out;
279
280 ret = 0;
281
282 out:
283 rtl8366_smi_stop(smi);
284 spin_unlock_irqrestore(&smi->lock, flags);
285
286 return ret;
287 }
288
289 int rtl8366_smi_write_reg(struct rtl8366_smi *smi, u32 addr, u32 data)
290 {
291 return __rtl8366_smi_write_reg(smi, addr, data, true);
292 }
293 EXPORT_SYMBOL_GPL(rtl8366_smi_write_reg);
294
295 int rtl8366_smi_write_reg_noack(struct rtl8366_smi *smi, u32 addr, u32 data)
296 {
297 return __rtl8366_smi_write_reg(smi, addr, data, false);
298 }
299 EXPORT_SYMBOL_GPL(rtl8366_smi_write_reg_noack);
300
301 int rtl8366_smi_rmwr(struct rtl8366_smi *smi, u32 addr, u32 mask, u32 data)
302 {
303 u32 t;
304 int err;
305
306 err = rtl8366_smi_read_reg(smi, addr, &t);
307 if (err)
308 return err;
309
310 err = rtl8366_smi_write_reg(smi, addr, (t & ~mask) | data);
311 return err;
312
313 }
314 EXPORT_SYMBOL_GPL(rtl8366_smi_rmwr);
315
316 static int rtl8366_reset(struct rtl8366_smi *smi)
317 {
318 if (smi->hw_reset) {
319 smi->hw_reset(true);
320 msleep(RTL8366_SMI_HW_STOP_DELAY);
321 smi->hw_reset(false);
322 msleep(RTL8366_SMI_HW_START_DELAY);
323 return 0;
324 }
325
326 return smi->ops->reset_chip(smi);
327 }
328
329 static int rtl8366_mc_is_used(struct rtl8366_smi *smi, int mc_index, int *used)
330 {
331 int err;
332 int i;
333
334 *used = 0;
335 for (i = 0; i < smi->num_ports; i++) {
336 int index = 0;
337
338 err = smi->ops->get_mc_index(smi, i, &index);
339 if (err)
340 return err;
341
342 if (mc_index == index) {
343 *used = 1;
344 break;
345 }
346 }
347
348 return 0;
349 }
350
351 static int rtl8366_set_vlan(struct rtl8366_smi *smi, int vid, u32 member,
352 u32 untag, u32 fid)
353 {
354 struct rtl8366_vlan_4k vlan4k;
355 int err;
356 int i;
357
358 /* Update the 4K table */
359 err = smi->ops->get_vlan_4k(smi, vid, &vlan4k);
360 if (err)
361 return err;
362
363 vlan4k.member = member;
364 vlan4k.untag = untag;
365 vlan4k.fid = fid;
366 err = smi->ops->set_vlan_4k(smi, &vlan4k);
367 if (err)
368 return err;
369
370 /* Try to find an existing MC entry for this VID */
371 for (i = 0; i < smi->num_vlan_mc; i++) {
372 struct rtl8366_vlan_mc vlanmc;
373
374 err = smi->ops->get_vlan_mc(smi, i, &vlanmc);
375 if (err)
376 return err;
377
378 if (vid == vlanmc.vid) {
379 /* update the MC entry */
380 vlanmc.member = member;
381 vlanmc.untag = untag;
382 vlanmc.fid = fid;
383
384 err = smi->ops->set_vlan_mc(smi, i, &vlanmc);
385 break;
386 }
387 }
388
389 return err;
390 }
391
392 static int rtl8366_get_pvid(struct rtl8366_smi *smi, int port, int *val)
393 {
394 struct rtl8366_vlan_mc vlanmc;
395 int err;
396 int index;
397
398 err = smi->ops->get_mc_index(smi, port, &index);
399 if (err)
400 return err;
401
402 err = smi->ops->get_vlan_mc(smi, index, &vlanmc);
403 if (err)
404 return err;
405
406 *val = vlanmc.vid;
407 return 0;
408 }
409
410 static int rtl8366_set_pvid(struct rtl8366_smi *smi, unsigned port,
411 unsigned vid)
412 {
413 struct rtl8366_vlan_mc vlanmc;
414 struct rtl8366_vlan_4k vlan4k;
415 int err;
416 int i;
417
418 /* Try to find an existing MC entry for this VID */
419 for (i = 0; i < smi->num_vlan_mc; i++) {
420 err = smi->ops->get_vlan_mc(smi, i, &vlanmc);
421 if (err)
422 return err;
423
424 if (vid == vlanmc.vid) {
425 err = smi->ops->set_vlan_mc(smi, i, &vlanmc);
426 if (err)
427 return err;
428
429 err = smi->ops->set_mc_index(smi, port, i);
430 return err;
431 }
432 }
433
434 /* We have no MC entry for this VID, try to find an empty one */
435 for (i = 0; i < smi->num_vlan_mc; i++) {
436 err = smi->ops->get_vlan_mc(smi, i, &vlanmc);
437 if (err)
438 return err;
439
440 if (vlanmc.vid == 0 && vlanmc.member == 0) {
441 /* Update the entry from the 4K table */
442 err = smi->ops->get_vlan_4k(smi, vid, &vlan4k);
443 if (err)
444 return err;
445
446 vlanmc.vid = vid;
447 vlanmc.member = vlan4k.member;
448 vlanmc.untag = vlan4k.untag;
449 vlanmc.fid = vlan4k.fid;
450 err = smi->ops->set_vlan_mc(smi, i, &vlanmc);
451 if (err)
452 return err;
453
454 err = smi->ops->set_mc_index(smi, port, i);
455 return err;
456 }
457 }
458
459 /* MC table is full, try to find an unused entry and replace it */
460 for (i = 0; i < smi->num_vlan_mc; i++) {
461 int used;
462
463 err = rtl8366_mc_is_used(smi, i, &used);
464 if (err)
465 return err;
466
467 if (!used) {
468 /* Update the entry from the 4K table */
469 err = smi->ops->get_vlan_4k(smi, vid, &vlan4k);
470 if (err)
471 return err;
472
473 vlanmc.vid = vid;
474 vlanmc.member = vlan4k.member;
475 vlanmc.untag = vlan4k.untag;
476 vlanmc.fid = vlan4k.fid;
477 err = smi->ops->set_vlan_mc(smi, i, &vlanmc);
478 if (err)
479 return err;
480
481 err = smi->ops->set_mc_index(smi, port, i);
482 return err;
483 }
484 }
485
486 dev_err(smi->parent,
487 "all VLAN member configurations are in use\n");
488
489 return -ENOSPC;
490 }
491
492 int rtl8366_enable_vlan(struct rtl8366_smi *smi, int enable)
493 {
494 int err;
495
496 err = smi->ops->enable_vlan(smi, enable);
497 if (err)
498 return err;
499
500 smi->vlan_enabled = enable;
501
502 if (!enable) {
503 smi->vlan4k_enabled = 0;
504 err = smi->ops->enable_vlan4k(smi, enable);
505 }
506
507 return err;
508 }
509 EXPORT_SYMBOL_GPL(rtl8366_enable_vlan);
510
511 static int rtl8366_enable_vlan4k(struct rtl8366_smi *smi, int enable)
512 {
513 int err;
514
515 if (enable) {
516 err = smi->ops->enable_vlan(smi, enable);
517 if (err)
518 return err;
519
520 smi->vlan_enabled = enable;
521 }
522
523 err = smi->ops->enable_vlan4k(smi, enable);
524 if (err)
525 return err;
526
527 smi->vlan4k_enabled = enable;
528 return 0;
529 }
530
531 int rtl8366_enable_all_ports(struct rtl8366_smi *smi, int enable)
532 {
533 int port;
534 int err;
535
536 for (port = 0; port < smi->num_ports; port++) {
537 err = smi->ops->enable_port(smi, port, enable);
538 if (err)
539 return err;
540 }
541
542 return 0;
543 }
544 EXPORT_SYMBOL_GPL(rtl8366_enable_all_ports);
545
546 int rtl8366_reset_vlan(struct rtl8366_smi *smi)
547 {
548 struct rtl8366_vlan_mc vlanmc;
549 int err;
550 int i;
551
552 rtl8366_enable_vlan(smi, 0);
553 rtl8366_enable_vlan4k(smi, 0);
554
555 /* clear VLAN member configurations */
556 vlanmc.vid = 0;
557 vlanmc.priority = 0;
558 vlanmc.member = 0;
559 vlanmc.untag = 0;
560 vlanmc.fid = 0;
561 for (i = 0; i < smi->num_vlan_mc; i++) {
562 err = smi->ops->set_vlan_mc(smi, i, &vlanmc);
563 if (err)
564 return err;
565 }
566
567 return 0;
568 }
569 EXPORT_SYMBOL_GPL(rtl8366_reset_vlan);
570
571 static int rtl8366_init_vlan(struct rtl8366_smi *smi)
572 {
573 int port;
574 int err;
575
576 err = rtl8366_reset_vlan(smi);
577 if (err)
578 return err;
579
580 for (port = 0; port < smi->num_ports; port++) {
581 u32 mask;
582
583 if (port == smi->cpu_port)
584 mask = (1 << smi->num_ports) - 1;
585 else
586 mask = (1 << port) | (1 << smi->cpu_port);
587
588 err = rtl8366_set_vlan(smi, (port + 1), mask, mask, 0);
589 if (err)
590 return err;
591
592 err = rtl8366_set_pvid(smi, port, (port + 1));
593 if (err)
594 return err;
595 }
596
597 return rtl8366_enable_vlan(smi, 1);
598 }
599
600 #ifdef CONFIG_RTL8366_SMI_DEBUG_FS
601 int rtl8366_debugfs_open(struct inode *inode, struct file *file)
602 {
603 file->private_data = inode->i_private;
604 return 0;
605 }
606 EXPORT_SYMBOL_GPL(rtl8366_debugfs_open);
607
608 static ssize_t rtl8366_read_debugfs_vlan_mc(struct file *file,
609 char __user *user_buf,
610 size_t count, loff_t *ppos)
611 {
612 struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
613 int i, len = 0;
614 char *buf = smi->buf;
615
616 len += snprintf(buf + len, sizeof(smi->buf) - len,
617 "%2s %6s %4s %6s %6s %3s\n",
618 "id", "vid","prio", "member", "untag", "fid");
619
620 for (i = 0; i < smi->num_vlan_mc; ++i) {
621 struct rtl8366_vlan_mc vlanmc;
622
623 smi->ops->get_vlan_mc(smi, i, &vlanmc);
624
625 len += snprintf(buf + len, sizeof(smi->buf) - len,
626 "%2d %6d %4d 0x%04x 0x%04x %3d\n",
627 i, vlanmc.vid, vlanmc.priority,
628 vlanmc.member, vlanmc.untag, vlanmc.fid);
629 }
630
631 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
632 }
633
634 #define RTL8366_VLAN4K_PAGE_SIZE 64
635 #define RTL8366_VLAN4K_NUM_PAGES (4096 / RTL8366_VLAN4K_PAGE_SIZE)
636
637 static ssize_t rtl8366_read_debugfs_vlan_4k(struct file *file,
638 char __user *user_buf,
639 size_t count, loff_t *ppos)
640 {
641 struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
642 int i, len = 0;
643 int offset;
644 char *buf = smi->buf;
645
646 if (smi->dbg_vlan_4k_page >= RTL8366_VLAN4K_NUM_PAGES) {
647 len += snprintf(buf + len, sizeof(smi->buf) - len,
648 "invalid page: %u\n", smi->dbg_vlan_4k_page);
649 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
650 }
651
652 len += snprintf(buf + len, sizeof(smi->buf) - len,
653 "%4s %6s %6s %3s\n",
654 "vid", "member", "untag", "fid");
655
656 offset = RTL8366_VLAN4K_PAGE_SIZE * smi->dbg_vlan_4k_page;
657 for (i = 0; i < RTL8366_VLAN4K_PAGE_SIZE; i++) {
658 struct rtl8366_vlan_4k vlan4k;
659
660 smi->ops->get_vlan_4k(smi, offset + i, &vlan4k);
661
662 len += snprintf(buf + len, sizeof(smi->buf) - len,
663 "%4d 0x%04x 0x%04x %3d\n",
664 vlan4k.vid, vlan4k.member,
665 vlan4k.untag, vlan4k.fid);
666 }
667
668 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
669 }
670
671 static ssize_t rtl8366_read_debugfs_pvid(struct file *file,
672 char __user *user_buf,
673 size_t count, loff_t *ppos)
674 {
675 struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
676 char *buf = smi->buf;
677 int len = 0;
678 int i;
679
680 len += snprintf(buf + len, sizeof(smi->buf) - len, "%4s %4s\n",
681 "port", "pvid");
682
683 for (i = 0; i < smi->num_ports; i++) {
684 int pvid;
685 int err;
686
687 err = rtl8366_get_pvid(smi, i, &pvid);
688 if (err)
689 len += snprintf(buf + len, sizeof(smi->buf) - len,
690 "%4d error\n", i);
691 else
692 len += snprintf(buf + len, sizeof(smi->buf) - len,
693 "%4d %4d\n", i, pvid);
694 }
695
696 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
697 }
698
699 static ssize_t rtl8366_read_debugfs_reg(struct file *file,
700 char __user *user_buf,
701 size_t count, loff_t *ppos)
702 {
703 struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
704 u32 t, reg = smi->dbg_reg;
705 int err, len = 0;
706 char *buf = smi->buf;
707
708 memset(buf, '\0', sizeof(smi->buf));
709
710 err = rtl8366_smi_read_reg(smi, reg, &t);
711 if (err) {
712 len += snprintf(buf, sizeof(smi->buf),
713 "Read failed (reg: 0x%04x)\n", reg);
714 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
715 }
716
717 len += snprintf(buf, sizeof(smi->buf), "reg = 0x%04x, val = 0x%04x\n",
718 reg, t);
719
720 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
721 }
722
723 static ssize_t rtl8366_write_debugfs_reg(struct file *file,
724 const char __user *user_buf,
725 size_t count, loff_t *ppos)
726 {
727 struct rtl8366_smi *smi = (struct rtl8366_smi *)file->private_data;
728 unsigned long data;
729 u32 reg = smi->dbg_reg;
730 int err;
731 size_t len;
732 char *buf = smi->buf;
733
734 len = min(count, sizeof(smi->buf) - 1);
735 if (copy_from_user(buf, user_buf, len)) {
736 dev_err(smi->parent, "copy from user failed\n");
737 return -EFAULT;
738 }
739
740 buf[len] = '\0';
741 if (len > 0 && buf[len - 1] == '\n')
742 buf[len - 1] = '\0';
743
744
745 if (strict_strtoul(buf, 16, &data)) {
746 dev_err(smi->parent, "Invalid reg value %s\n", buf);
747 } else {
748 err = rtl8366_smi_write_reg(smi, reg, data);
749 if (err) {
750 dev_err(smi->parent,
751 "writing reg 0x%04x val 0x%04lx failed\n",
752 reg, data);
753 }
754 }
755
756 return count;
757 }
758
759 static ssize_t rtl8366_read_debugfs_mibs(struct file *file,
760 char __user *user_buf,
761 size_t count, loff_t *ppos)
762 {
763 struct rtl8366_smi *smi = file->private_data;
764 int i, j, len = 0;
765 char *buf = smi->buf;
766
767 len += snprintf(buf + len, sizeof(smi->buf) - len, "%-36s",
768 "Counter");
769
770 for (i = 0; i < smi->num_ports; i++) {
771 char port_buf[10];
772
773 snprintf(port_buf, sizeof(port_buf), "Port %d", i);
774 len += snprintf(buf + len, sizeof(smi->buf) - len, " %12s",
775 port_buf);
776 }
777 len += snprintf(buf + len, sizeof(smi->buf) - len, "\n");
778
779 for (i = 0; i < smi->num_mib_counters; i++) {
780 len += snprintf(buf + len, sizeof(smi->buf) - len, "%-36s ",
781 smi->mib_counters[i].name);
782 for (j = 0; j < smi->num_ports; j++) {
783 unsigned long long counter = 0;
784
785 if (!smi->ops->get_mib_counter(smi, i, j, &counter))
786 len += snprintf(buf + len,
787 sizeof(smi->buf) - len,
788 "%12llu ", counter);
789 else
790 len += snprintf(buf + len,
791 sizeof(smi->buf) - len,
792 "%12s ", "error");
793 }
794 len += snprintf(buf + len, sizeof(smi->buf) - len, "\n");
795 }
796
797 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
798 }
799
800 static const struct file_operations fops_rtl8366_regs = {
801 .read = rtl8366_read_debugfs_reg,
802 .write = rtl8366_write_debugfs_reg,
803 .open = rtl8366_debugfs_open,
804 .owner = THIS_MODULE
805 };
806
807 static const struct file_operations fops_rtl8366_vlan_mc = {
808 .read = rtl8366_read_debugfs_vlan_mc,
809 .open = rtl8366_debugfs_open,
810 .owner = THIS_MODULE
811 };
812
813 static const struct file_operations fops_rtl8366_vlan_4k = {
814 .read = rtl8366_read_debugfs_vlan_4k,
815 .open = rtl8366_debugfs_open,
816 .owner = THIS_MODULE
817 };
818
819 static const struct file_operations fops_rtl8366_pvid = {
820 .read = rtl8366_read_debugfs_pvid,
821 .open = rtl8366_debugfs_open,
822 .owner = THIS_MODULE
823 };
824
825 static const struct file_operations fops_rtl8366_mibs = {
826 .read = rtl8366_read_debugfs_mibs,
827 .open = rtl8366_debugfs_open,
828 .owner = THIS_MODULE
829 };
830
831 static void rtl8366_debugfs_init(struct rtl8366_smi *smi)
832 {
833 struct dentry *node;
834 struct dentry *root;
835
836 if (!smi->debugfs_root)
837 smi->debugfs_root = debugfs_create_dir(dev_name(smi->parent),
838 NULL);
839
840 if (!smi->debugfs_root) {
841 dev_err(smi->parent, "Unable to create debugfs dir\n");
842 return;
843 }
844 root = smi->debugfs_root;
845
846 node = debugfs_create_x16("reg", S_IRUGO | S_IWUSR, root,
847 &smi->dbg_reg);
848 if (!node) {
849 dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
850 "reg");
851 return;
852 }
853
854 node = debugfs_create_file("val", S_IRUGO | S_IWUSR, root, smi,
855 &fops_rtl8366_regs);
856 if (!node) {
857 dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
858 "val");
859 return;
860 }
861
862 node = debugfs_create_file("vlan_mc", S_IRUSR, root, smi,
863 &fops_rtl8366_vlan_mc);
864 if (!node) {
865 dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
866 "vlan_mc");
867 return;
868 }
869
870 node = debugfs_create_u8("vlan_4k_page", S_IRUGO | S_IWUSR, root,
871 &smi->dbg_vlan_4k_page);
872 if (!node) {
873 dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
874 "vlan_4k_page");
875 return;
876 }
877
878 node = debugfs_create_file("vlan_4k", S_IRUSR, root, smi,
879 &fops_rtl8366_vlan_4k);
880 if (!node) {
881 dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
882 "vlan_4k");
883 return;
884 }
885
886 node = debugfs_create_file("pvid", S_IRUSR, root, smi,
887 &fops_rtl8366_pvid);
888 if (!node) {
889 dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
890 "pvid");
891 return;
892 }
893
894 node = debugfs_create_file("mibs", S_IRUSR, smi->debugfs_root, smi,
895 &fops_rtl8366_mibs);
896 if (!node)
897 dev_err(smi->parent, "Creating debugfs file '%s' failed\n",
898 "mibs");
899 }
900
901 static void rtl8366_debugfs_remove(struct rtl8366_smi *smi)
902 {
903 if (smi->debugfs_root) {
904 debugfs_remove_recursive(smi->debugfs_root);
905 smi->debugfs_root = NULL;
906 }
907 }
908 #else
909 static inline void rtl8366_debugfs_init(struct rtl8366_smi *smi) {}
910 static inline void rtl8366_debugfs_remove(struct rtl8366_smi *smi) {}
911 #endif /* CONFIG_RTL8366_SMI_DEBUG_FS */
912
913 static int rtl8366_smi_mii_init(struct rtl8366_smi *smi)
914 {
915 int ret;
916 int i;
917
918 smi->mii_bus = mdiobus_alloc();
919 if (smi->mii_bus == NULL) {
920 ret = -ENOMEM;
921 goto err;
922 }
923
924 smi->mii_bus->priv = (void *) smi;
925 smi->mii_bus->name = dev_name(smi->parent);
926 smi->mii_bus->read = smi->ops->mii_read;
927 smi->mii_bus->write = smi->ops->mii_write;
928 snprintf(smi->mii_bus->id, MII_BUS_ID_SIZE, "%s",
929 dev_name(smi->parent));
930 smi->mii_bus->parent = smi->parent;
931 smi->mii_bus->phy_mask = ~(0x1f);
932 smi->mii_bus->irq = smi->mii_irq;
933 for (i = 0; i < PHY_MAX_ADDR; i++)
934 smi->mii_irq[i] = PHY_POLL;
935
936 ret = mdiobus_register(smi->mii_bus);
937 if (ret)
938 goto err_free;
939
940 return 0;
941
942 err_free:
943 mdiobus_free(smi->mii_bus);
944 err:
945 return ret;
946 }
947
948 static void rtl8366_smi_mii_cleanup(struct rtl8366_smi *smi)
949 {
950 mdiobus_unregister(smi->mii_bus);
951 mdiobus_free(smi->mii_bus);
952 }
953
954 int rtl8366_sw_reset_switch(struct switch_dev *dev)
955 {
956 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
957 int err;
958
959 err = rtl8366_reset(smi);
960 if (err)
961 return err;
962
963 err = smi->ops->setup(smi);
964 if (err)
965 return err;
966
967 err = rtl8366_reset_vlan(smi);
968 if (err)
969 return err;
970
971 err = rtl8366_enable_vlan(smi, 1);
972 if (err)
973 return err;
974
975 return rtl8366_enable_all_ports(smi, 1);
976 }
977 EXPORT_SYMBOL_GPL(rtl8366_sw_reset_switch);
978
979 int rtl8366_sw_get_port_pvid(struct switch_dev *dev, int port, int *val)
980 {
981 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
982 return rtl8366_get_pvid(smi, port, val);
983 }
984 EXPORT_SYMBOL_GPL(rtl8366_sw_get_port_pvid);
985
986 int rtl8366_sw_set_port_pvid(struct switch_dev *dev, int port, int val)
987 {
988 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
989 return rtl8366_set_pvid(smi, port, val);
990 }
991 EXPORT_SYMBOL_GPL(rtl8366_sw_set_port_pvid);
992
993 int rtl8366_sw_get_port_mib(struct switch_dev *dev,
994 const struct switch_attr *attr,
995 struct switch_val *val)
996 {
997 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
998 int i, len = 0;
999 unsigned long long counter = 0;
1000 char *buf = smi->buf;
1001
1002 if (val->port_vlan >= smi->num_ports)
1003 return -EINVAL;
1004
1005 len += snprintf(buf + len, sizeof(smi->buf) - len,
1006 "Port %d MIB counters\n",
1007 val->port_vlan);
1008
1009 for (i = 0; i < smi->num_mib_counters; ++i) {
1010 len += snprintf(buf + len, sizeof(smi->buf) - len,
1011 "%-36s: ", smi->mib_counters[i].name);
1012 if (!smi->ops->get_mib_counter(smi, i, val->port_vlan,
1013 &counter))
1014 len += snprintf(buf + len, sizeof(smi->buf) - len,
1015 "%llu\n", counter);
1016 else
1017 len += snprintf(buf + len, sizeof(smi->buf) - len,
1018 "%s\n", "error");
1019 }
1020
1021 val->value.s = buf;
1022 val->len = len;
1023 return 0;
1024 }
1025 EXPORT_SYMBOL_GPL(rtl8366_sw_get_port_mib);
1026
1027 int rtl8366_sw_get_vlan_info(struct switch_dev *dev,
1028 const struct switch_attr *attr,
1029 struct switch_val *val)
1030 {
1031 int i;
1032 u32 len = 0;
1033 struct rtl8366_vlan_4k vlan4k;
1034 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
1035 char *buf = smi->buf;
1036 int err;
1037
1038 if (!smi->ops->is_vlan_valid(smi, val->port_vlan))
1039 return -EINVAL;
1040
1041 memset(buf, '\0', sizeof(smi->buf));
1042
1043 err = smi->ops->get_vlan_4k(smi, val->port_vlan, &vlan4k);
1044 if (err)
1045 return err;
1046
1047 len += snprintf(buf + len, sizeof(smi->buf) - len,
1048 "VLAN %d: Ports: '", vlan4k.vid);
1049
1050 for (i = 0; i < smi->num_ports; i++) {
1051 if (!(vlan4k.member & (1 << i)))
1052 continue;
1053
1054 len += snprintf(buf + len, sizeof(smi->buf) - len, "%d%s", i,
1055 (vlan4k.untag & (1 << i)) ? "" : "t");
1056 }
1057
1058 len += snprintf(buf + len, sizeof(smi->buf) - len,
1059 "', members=%04x, untag=%04x, fid=%u",
1060 vlan4k.member, vlan4k.untag, vlan4k.fid);
1061
1062 val->value.s = buf;
1063 val->len = len;
1064
1065 return 0;
1066 }
1067 EXPORT_SYMBOL_GPL(rtl8366_sw_get_vlan_info);
1068
1069 int rtl8366_sw_get_vlan_ports(struct switch_dev *dev, struct switch_val *val)
1070 {
1071 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
1072 struct switch_port *port;
1073 struct rtl8366_vlan_4k vlan4k;
1074 int i;
1075
1076 if (!smi->ops->is_vlan_valid(smi, val->port_vlan))
1077 return -EINVAL;
1078
1079 smi->ops->get_vlan_4k(smi, val->port_vlan, &vlan4k);
1080
1081 port = &val->value.ports[0];
1082 val->len = 0;
1083 for (i = 0; i < smi->num_ports; i++) {
1084 if (!(vlan4k.member & BIT(i)))
1085 continue;
1086
1087 port->id = i;
1088 port->flags = (vlan4k.untag & BIT(i)) ?
1089 0 : BIT(SWITCH_PORT_FLAG_TAGGED);
1090 val->len++;
1091 port++;
1092 }
1093 return 0;
1094 }
1095 EXPORT_SYMBOL_GPL(rtl8366_sw_get_vlan_ports);
1096
1097 int rtl8366_sw_set_vlan_ports(struct switch_dev *dev, struct switch_val *val)
1098 {
1099 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
1100 struct switch_port *port;
1101 u32 member = 0;
1102 u32 untag = 0;
1103 int err;
1104 int i;
1105
1106 if (!smi->ops->is_vlan_valid(smi, val->port_vlan))
1107 return -EINVAL;
1108
1109 port = &val->value.ports[0];
1110 for (i = 0; i < val->len; i++, port++) {
1111 member |= BIT(port->id);
1112
1113 if (!(port->flags & BIT(SWITCH_PORT_FLAG_TAGGED)))
1114 untag |= BIT(port->id);
1115
1116 /*
1117 * To ensure that we have a valid MC entry for this VLAN,
1118 * initialize the port VLAN ID here.
1119 */
1120 err = rtl8366_set_pvid(smi, port->id, val->port_vlan);
1121 if (err < 0)
1122 return err;
1123 }
1124
1125 return rtl8366_set_vlan(smi, val->port_vlan, member, untag, 0);
1126 }
1127 EXPORT_SYMBOL_GPL(rtl8366_sw_set_vlan_ports);
1128
1129 int rtl8366_sw_get_vlan_fid(struct switch_dev *dev,
1130 const struct switch_attr *attr,
1131 struct switch_val *val)
1132 {
1133 struct rtl8366_vlan_4k vlan4k;
1134 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
1135 int err;
1136
1137 if (!smi->ops->is_vlan_valid(smi, val->port_vlan))
1138 return -EINVAL;
1139
1140 err = smi->ops->get_vlan_4k(smi, val->port_vlan, &vlan4k);
1141 if (err)
1142 return err;
1143
1144 val->value.i = vlan4k.fid;
1145
1146 return 0;
1147 }
1148 EXPORT_SYMBOL_GPL(rtl8366_sw_get_vlan_fid);
1149
1150 int rtl8366_sw_set_vlan_fid(struct switch_dev *dev,
1151 const struct switch_attr *attr,
1152 struct switch_val *val)
1153 {
1154 struct rtl8366_vlan_4k vlan4k;
1155 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
1156 int err;
1157
1158 if (!smi->ops->is_vlan_valid(smi, val->port_vlan))
1159 return -EINVAL;
1160
1161 if (val->value.i < 0 || val->value.i > attr->max)
1162 return -EINVAL;
1163
1164 err = smi->ops->get_vlan_4k(smi, val->port_vlan, &vlan4k);
1165 if (err)
1166 return err;
1167
1168 return rtl8366_set_vlan(smi, val->port_vlan,
1169 vlan4k.member,
1170 vlan4k.untag,
1171 val->value.i);
1172 }
1173 EXPORT_SYMBOL_GPL(rtl8366_sw_set_vlan_fid);
1174
1175 int rtl8366_sw_get_vlan_enable(struct switch_dev *dev,
1176 const struct switch_attr *attr,
1177 struct switch_val *val)
1178 {
1179 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
1180
1181 if (attr->ofs > 2)
1182 return -EINVAL;
1183
1184 if (attr->ofs == 1)
1185 val->value.i = smi->vlan_enabled;
1186 else
1187 val->value.i = smi->vlan4k_enabled;
1188
1189 return 0;
1190 }
1191 EXPORT_SYMBOL_GPL(rtl8366_sw_get_vlan_enable);
1192
1193 int rtl8366_sw_set_vlan_enable(struct switch_dev *dev,
1194 const struct switch_attr *attr,
1195 struct switch_val *val)
1196 {
1197 struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
1198 int err;
1199
1200 if (attr->ofs > 2)
1201 return -EINVAL;
1202
1203 if (attr->ofs == 1)
1204 err = rtl8366_enable_vlan(smi, val->value.i);
1205 else
1206 err = rtl8366_enable_vlan4k(smi, val->value.i);
1207
1208 return err;
1209 }
1210 EXPORT_SYMBOL_GPL(rtl8366_sw_set_vlan_enable);
1211
1212 struct rtl8366_smi *rtl8366_smi_alloc(struct device *parent)
1213 {
1214 struct rtl8366_smi *smi;
1215
1216 BUG_ON(!parent);
1217
1218 smi = kzalloc(sizeof(*smi), GFP_KERNEL);
1219 if (!smi) {
1220 dev_err(parent, "no memory for private data\n");
1221 return NULL;
1222 }
1223
1224 smi->parent = parent;
1225 return smi;
1226 }
1227 EXPORT_SYMBOL_GPL(rtl8366_smi_alloc);
1228
1229 static int __rtl8366_smi_init(struct rtl8366_smi *smi, const char *name)
1230 {
1231 int err;
1232
1233 err = gpio_request(smi->gpio_sda, name);
1234 if (err) {
1235 printk(KERN_ERR "rtl8366_smi: gpio_request failed for %u, err=%d\n",
1236 smi->gpio_sda, err);
1237 goto err_out;
1238 }
1239
1240 err = gpio_request(smi->gpio_sck, name);
1241 if (err) {
1242 printk(KERN_ERR "rtl8366_smi: gpio_request failed for %u, err=%d\n",
1243 smi->gpio_sck, err);
1244 goto err_free_sda;
1245 }
1246
1247 spin_lock_init(&smi->lock);
1248
1249 /* start the switch */
1250 if (smi->hw_reset) {
1251 smi->hw_reset(false);
1252 msleep(RTL8366_SMI_HW_START_DELAY);
1253 }
1254
1255 return 0;
1256
1257 err_free_sda:
1258 gpio_free(smi->gpio_sda);
1259 err_out:
1260 return err;
1261 }
1262
1263 static void __rtl8366_smi_cleanup(struct rtl8366_smi *smi)
1264 {
1265 if (smi->hw_reset)
1266 smi->hw_reset(true);
1267
1268 gpio_free(smi->gpio_sck);
1269 gpio_free(smi->gpio_sda);
1270 }
1271
1272 enum rtl8366_type rtl8366_smi_detect(struct rtl8366_platform_data *pdata)
1273 {
1274 static struct rtl8366_smi smi;
1275 enum rtl8366_type type = RTL8366_TYPE_UNKNOWN;
1276 u32 reg = 0;
1277
1278 memset(&smi, 0, sizeof(smi));
1279 smi.gpio_sda = pdata->gpio_sda;
1280 smi.gpio_sck = pdata->gpio_sck;
1281 smi.clk_delay = 10;
1282 smi.cmd_read = 0xa9;
1283 smi.cmd_write = 0xa8;
1284
1285 if (__rtl8366_smi_init(&smi, "rtl8366"))
1286 goto out;
1287
1288 if (rtl8366_smi_read_reg(&smi, 0x5c, &reg))
1289 goto cleanup;
1290
1291 switch(reg) {
1292 case 0x6027:
1293 printk("Found an RTL8366S switch\n");
1294 type = RTL8366_TYPE_S;
1295 break;
1296 case 0x5937:
1297 printk("Found an RTL8366RB switch\n");
1298 type = RTL8366_TYPE_RB;
1299 break;
1300 default:
1301 printk("Found an Unknown RTL8366 switch (id=0x%04x)\n", reg);
1302 break;
1303 }
1304
1305 cleanup:
1306 __rtl8366_smi_cleanup(&smi);
1307 out:
1308 return type;
1309 }
1310
1311 int rtl8366_smi_init(struct rtl8366_smi *smi)
1312 {
1313 int err;
1314
1315 if (!smi->ops)
1316 return -EINVAL;
1317
1318 err = __rtl8366_smi_init(smi, dev_name(smi->parent));
1319 if (err)
1320 goto err_out;
1321
1322 dev_info(smi->parent, "using GPIO pins %u (SDA) and %u (SCK)\n",
1323 smi->gpio_sda, smi->gpio_sck);
1324
1325 err = smi->ops->detect(smi);
1326 if (err) {
1327 dev_err(smi->parent, "chip detection failed, err=%d\n", err);
1328 goto err_free_sck;
1329 }
1330
1331 err = rtl8366_reset(smi);
1332 if (err)
1333 goto err_free_sck;
1334
1335 err = smi->ops->setup(smi);
1336 if (err) {
1337 dev_err(smi->parent, "chip setup failed, err=%d\n", err);
1338 goto err_free_sck;
1339 }
1340
1341 err = rtl8366_init_vlan(smi);
1342 if (err) {
1343 dev_err(smi->parent, "VLAN initialization failed, err=%d\n",
1344 err);
1345 goto err_free_sck;
1346 }
1347
1348 err = rtl8366_enable_all_ports(smi, 1);
1349 if (err)
1350 goto err_free_sck;
1351
1352 err = rtl8366_smi_mii_init(smi);
1353 if (err)
1354 goto err_free_sck;
1355
1356 rtl8366_debugfs_init(smi);
1357
1358 return 0;
1359
1360 err_free_sck:
1361 __rtl8366_smi_cleanup(smi);
1362 err_out:
1363 return err;
1364 }
1365 EXPORT_SYMBOL_GPL(rtl8366_smi_init);
1366
1367 void rtl8366_smi_cleanup(struct rtl8366_smi *smi)
1368 {
1369 rtl8366_debugfs_remove(smi);
1370 rtl8366_smi_mii_cleanup(smi);
1371 __rtl8366_smi_cleanup(smi);
1372 }
1373 EXPORT_SYMBOL_GPL(rtl8366_smi_cleanup);
1374
1375 #ifdef CONFIG_OF
1376 int rtl8366_smi_probe_of(struct platform_device *pdev, struct rtl8366_smi *smi)
1377 {
1378 int sck = of_get_named_gpio(pdev->dev.of_node, "gpio-sck", 0);
1379 int sda = of_get_named_gpio(pdev->dev.of_node, "gpio-sda", 0);
1380
1381 if (!sck || !sda) {
1382 dev_err(&pdev->dev, "gpios missing in devictree\n");
1383 return -EINVAL;
1384 }
1385
1386 smi->gpio_sda = sda;
1387 smi->gpio_sck = sck;
1388
1389 return 0;
1390 }
1391 #else
1392 static inline int rtl8366_smi_probe_of(struct device_node *np, struct rtl8366_smi *smi)
1393 {
1394 return -ENODEV;
1395 }
1396 #endif
1397
1398 int rtl8366_smi_probe_plat(struct platform_device *pdev, struct rtl8366_smi *smi)
1399 {
1400 struct rtl8366_platform_data *pdata = pdev->dev.platform_data;
1401
1402 if (!pdev->dev.platform_data) {
1403 dev_err(&pdev->dev, "no platform data specified\n");
1404 return -EINVAL;
1405 }
1406
1407 smi->gpio_sda = pdata->gpio_sda;
1408 smi->gpio_sck = pdata->gpio_sck;
1409 smi->hw_reset = pdata->hw_reset;
1410
1411 return 0;
1412 }
1413
1414
1415 struct rtl8366_smi *rtl8366_smi_probe(struct platform_device *pdev)
1416 {
1417 struct rtl8366_smi *smi;
1418 int err;
1419
1420 smi = rtl8366_smi_alloc(&pdev->dev);
1421 if (!smi)
1422 return NULL;
1423
1424 if (pdev->dev.of_node)
1425 err = rtl8366_smi_probe_of(pdev, smi);
1426 else
1427 err = rtl8366_smi_probe_plat(pdev, smi);
1428
1429 if (err)
1430 goto free_smi;
1431
1432 return smi;
1433
1434 free_smi:
1435 kfree(smi);
1436 return NULL;
1437 }
1438 EXPORT_SYMBOL_GPL(rtl8366_smi_probe);
1439
1440 MODULE_DESCRIPTION("Realtek RTL8366 SMI interface driver");
1441 MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>");
1442 MODULE_LICENSE("GPL v2");