| target/linux/generic/files/drivers/net/phy/rtl8366_smi.c |
| 448 | 448 | return -ENOSPC; |
| 449 | 449 | } |
| 450 | 450 | |
| 451 | static int rtl8366_enable_vlan(struct rtl8366_smi *smi, int enable) |
| 452 | { |
| 453 | int err; |
| 454 | |
| 455 | err = smi->ops->enable_vlan(smi, enable); |
| 456 | if (err) |
| 457 | return err; |
| 458 | |
| 459 | smi->vlan_enabled = enable; |
| 460 | |
| 461 | if (!enable) { |
| 462 | smi->vlan4k_enabled = 0; |
| 463 | err = smi->ops->enable_vlan4k(smi, enable); |
| 464 | } |
| 465 | |
| 466 | return err; |
| 467 | } |
| 468 | |
| 469 | static int rtl8366_enable_vlan4k(struct rtl8366_smi *smi, int enable) |
| 470 | { |
| 471 | int err; |
| 472 | |
| 473 | if (enable) { |
| 474 | err = smi->ops->enable_vlan(smi, enable); |
| 475 | if (err) |
| 476 | return err; |
| 477 | |
| 478 | smi->vlan_enabled = enable; |
| 479 | } |
| 480 | |
| 481 | err = smi->ops->enable_vlan4k(smi, enable); |
| 482 | if (err) |
| 483 | return err; |
| 484 | |
| 485 | smi->vlan4k_enabled = enable; |
| 486 | return 0; |
| 487 | } |
| 488 | |
| 451 | 489 | int rtl8366_reset_vlan(struct rtl8366_smi *smi) |
| 452 | 490 | { |
| 453 | 491 | struct rtl8366_vlan_mc vlanmc; |
| 454 | 492 | int err; |
| 455 | 493 | int i; |
| 456 | 494 | |
| 495 | rtl8366_enable_vlan(smi, 0); |
| 496 | rtl8366_enable_vlan4k(smi, 0); |
| 497 | |
| 457 | 498 | /* clear VLAN member configurations */ |
| 458 | 499 | vlanmc.vid = 0; |
| 459 | 500 | vlanmc.priority = 0; |
| ... | ... | |
| 922 | 963 | } |
| 923 | 964 | EXPORT_SYMBOL_GPL(rtl8366_sw_set_vlan_ports); |
| 924 | 965 | |
| 966 | int rtl8366_sw_get_vlan_enable(struct switch_dev *dev, |
| 967 | const struct switch_attr *attr, |
| 968 | struct switch_val *val) |
| 969 | { |
| 970 | struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev); |
| 971 | |
| 972 | if (attr->ofs > 2) |
| 973 | return -EINVAL; |
| 974 | |
| 975 | if (attr->ofs == 1) |
| 976 | val->value.i = smi->vlan_enabled; |
| 977 | else |
| 978 | val->value.i = smi->vlan4k_enabled; |
| 979 | |
| 980 | return 0; |
| 981 | } |
| 982 | EXPORT_SYMBOL_GPL(rtl8366_sw_get_vlan_enable); |
| 983 | |
| 984 | int rtl8366_sw_set_vlan_enable(struct switch_dev *dev, |
| 985 | const struct switch_attr *attr, |
| 986 | struct switch_val *val) |
| 987 | { |
| 988 | struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev); |
| 989 | int err; |
| 990 | |
| 991 | if (attr->ofs > 2) |
| 992 | return -EINVAL; |
| 993 | |
| 994 | if (attr->ofs == 1) |
| 995 | err = rtl8366_enable_vlan(smi, val->value.i); |
| 996 | else |
| 997 | err = rtl8366_enable_vlan4k(smi, val->value.i); |
| 998 | |
| 999 | return err; |
| 1000 | } |
| 1001 | EXPORT_SYMBOL_GPL(rtl8366_sw_set_vlan_enable); |
| 1002 | |
| 925 | 1003 | struct rtl8366_smi *rtl8366_smi_alloc(struct device *parent) |
| 926 | 1004 | { |
| 927 | 1005 | struct rtl8366_smi *smi; |
| target/linux/generic/files/drivers/net/phy/rtl8366_smi.h |
| 45 | 45 | |
| 46 | 46 | struct rtl8366_smi_ops *ops; |
| 47 | 47 | |
| 48 | int vlan_enabled; |
| 49 | int vlan4k_enabled; |
| 50 | |
| 48 | 51 | char buf[4096]; |
| 49 | 52 | #ifdef CONFIG_RTL8366S_PHY_DEBUG_FS |
| 50 | 53 | struct dentry *debugfs_root; |
| ... | ... | |
| 119 | 122 | struct switch_val *val); |
| 120 | 123 | int rtl8366_sw_get_vlan_ports(struct switch_dev *dev, struct switch_val *val); |
| 121 | 124 | int rtl8366_sw_set_vlan_ports(struct switch_dev *dev, struct switch_val *val); |
| 125 | int rtl8366_sw_get_vlan_enable(struct switch_dev *dev, |
| 126 | const struct switch_attr *attr, |
| 127 | struct switch_val *val); |
| 128 | int rtl8366_sw_set_vlan_enable(struct switch_dev *dev, |
| 129 | const struct switch_attr *attr, |
| 130 | struct switch_val *val); |
| 122 | 131 | |
| 123 | 132 | #endif /* _RTL8366_SMI_H */ |
| target/linux/generic/files/drivers/net/phy/rtl8366rb.c |
| 583 | 583 | RTL8366RB_MIB_CTRL_GLOBAL_RESET); |
| 584 | 584 | } |
| 585 | 585 | |
| 586 | | static int rtl8366rb_sw_get_vlan_enable(struct switch_dev *dev, |
| 587 | | const struct switch_attr *attr, |
| 588 | | struct switch_val *val) |
| 589 | | { |
| 590 | | struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev); |
| 591 | | u32 data; |
| 592 | | |
| 593 | | if (attr->ofs == 1) { |
| 594 | | rtl8366_smi_read_reg(smi, RTL8366RB_SGCR, &data); |
| 595 | | |
| 596 | | if (data & RTL8366RB_SGCR_EN_VLAN) |
| 597 | | val->value.i = 1; |
| 598 | | else |
| 599 | | val->value.i = 0; |
| 600 | | } else if (attr->ofs == 2) { |
| 601 | | rtl8366_smi_read_reg(smi, RTL8366RB_SGCR, &data); |
| 602 | | |
| 603 | | if (data & RTL8366RB_SGCR_EN_VLAN_4KTB) |
| 604 | | val->value.i = 1; |
| 605 | | else |
| 606 | | val->value.i = 0; |
| 607 | | } |
| 608 | | |
| 609 | | return 0; |
| 610 | | } |
| 611 | | |
| 612 | 586 | static int rtl8366rb_sw_get_blinkrate(struct switch_dev *dev, |
| 613 | 587 | const struct switch_attr *attr, |
| 614 | 588 | struct switch_val *val) |
| ... | ... | |
| 637 | 611 | val->value.i); |
| 638 | 612 | } |
| 639 | 613 | |
| 640 | | static int rtl8366rb_sw_set_vlan_enable(struct switch_dev *dev, |
| 641 | | const struct switch_attr *attr, |
| 642 | | struct switch_val *val) |
| 643 | | { |
| 644 | | struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev); |
| 645 | | |
| 646 | | if (attr->ofs == 1) |
| 647 | | return rtl8366rb_enable_vlan(smi, val->value.i); |
| 648 | | else |
| 649 | | return rtl8366rb_enable_vlan4k(smi, val->value.i); |
| 650 | | } |
| 651 | | |
| 652 | 614 | static int rtl8366rb_sw_get_learning_enable(struct switch_dev *dev, |
| 653 | 615 | const struct switch_attr *attr, |
| 654 | 616 | struct switch_val *val) |
| ... | ... | |
| 822 | 784 | .type = SWITCH_TYPE_INT, |
| 823 | 785 | .name = "enable_vlan", |
| 824 | 786 | .description = "Enable VLAN mode", |
| 825 | | .set = rtl8366rb_sw_set_vlan_enable, |
| 826 | | .get = rtl8366rb_sw_get_vlan_enable, |
| 787 | .set = rtl8366_sw_set_vlan_enable, |
| 788 | .get = rtl8366_sw_get_vlan_enable, |
| 827 | 789 | .max = 1, |
| 828 | 790 | .ofs = 1 |
| 829 | 791 | }, { |
| 830 | 792 | .type = SWITCH_TYPE_INT, |
| 831 | 793 | .name = "enable_vlan4k", |
| 832 | 794 | .description = "Enable VLAN 4K mode", |
| 833 | | .set = rtl8366rb_sw_set_vlan_enable, |
| 834 | | .get = rtl8366rb_sw_get_vlan_enable, |
| 795 | .set = rtl8366_sw_set_vlan_enable, |
| 796 | .get = rtl8366_sw_get_vlan_enable, |
| 835 | 797 | .max = 1, |
| 836 | 798 | .ofs = 2 |
| 837 | 799 | }, { |
| target/linux/generic/files/drivers/net/phy/rtl8366s.c |
| 608 | 608 | return rtl8366_smi_rmwr(smi, RTL8366S_MIB_CTRL_REG, 0, (1 << 2)); |
| 609 | 609 | } |
| 610 | 610 | |
| 611 | | static int rtl8366s_sw_get_vlan_enable(struct switch_dev *dev, |
| 612 | | const struct switch_attr *attr, |
| 613 | | struct switch_val *val) |
| 614 | | { |
| 615 | | struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev); |
| 616 | | u32 data; |
| 617 | | |
| 618 | | if (attr->ofs == 1) { |
| 619 | | rtl8366_smi_read_reg(smi, RTL8366S_SGCR, &data); |
| 620 | | |
| 621 | | if (data & RTL8366S_SGCR_EN_VLAN) |
| 622 | | val->value.i = 1; |
| 623 | | else |
| 624 | | val->value.i = 0; |
| 625 | | } else if (attr->ofs == 2) { |
| 626 | | rtl8366_smi_read_reg(smi, RTL8366S_VLAN_TB_CTRL_REG, &data); |
| 627 | | |
| 628 | | if (data & 0x0001) |
| 629 | | val->value.i = 1; |
| 630 | | else |
| 631 | | val->value.i = 0; |
| 632 | | } |
| 633 | | |
| 634 | | return 0; |
| 635 | | } |
| 636 | | |
| 637 | 611 | static int rtl8366s_sw_get_blinkrate(struct switch_dev *dev, |
| 638 | 612 | const struct switch_attr *attr, |
| 639 | 613 | struct switch_val *val) |
| ... | ... | |
| 662 | 636 | val->value.i); |
| 663 | 637 | } |
| 664 | 638 | |
| 665 | | static int rtl8366s_sw_set_vlan_enable(struct switch_dev *dev, |
| 666 | | const struct switch_attr *attr, |
| 667 | | struct switch_val *val) |
| 668 | | { |
| 669 | | struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev); |
| 670 | | |
| 671 | | if (attr->ofs == 1) |
| 672 | | return rtl8366s_enable_vlan(smi, val->value.i); |
| 673 | | else |
| 674 | | return rtl8366s_enable_vlan4k(smi, val->value.i); |
| 675 | | } |
| 676 | | |
| 677 | 639 | static int rtl8366s_sw_get_learning_enable(struct switch_dev *dev, |
| 678 | 640 | const struct switch_attr *attr, |
| 679 | 641 | struct switch_val *val) |
| ... | ... | |
| 849 | 811 | .type = SWITCH_TYPE_INT, |
| 850 | 812 | .name = "enable_vlan", |
| 851 | 813 | .description = "Enable VLAN mode", |
| 852 | | .set = rtl8366s_sw_set_vlan_enable, |
| 853 | | .get = rtl8366s_sw_get_vlan_enable, |
| 814 | .set = rtl8366_sw_set_vlan_enable, |
| 815 | .get = rtl8366_sw_get_vlan_enable, |
| 854 | 816 | .max = 1, |
| 855 | 817 | .ofs = 1 |
| 856 | 818 | }, { |
| 857 | 819 | .type = SWITCH_TYPE_INT, |
| 858 | 820 | .name = "enable_vlan4k", |
| 859 | 821 | .description = "Enable VLAN 4K mode", |
| 860 | | .set = rtl8366s_sw_set_vlan_enable, |
| 861 | | .get = rtl8366s_sw_get_vlan_enable, |
| 822 | .set = rtl8366_sw_set_vlan_enable, |
| 823 | .get = rtl8366_sw_get_vlan_enable, |
| 862 | 824 | .max = 1, |
| 863 | 825 | .ofs = 2 |
| 864 | 826 | }, { |