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