Changeset 24988


Ignore:
Timestamp:
2011-01-14T19:19:05+01:00 (7 years ago)
Author:
juhosg
Message:

backfire: generic: add rtl8366rb switch port rate, port and qos enable/disable support (backport of r23126)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/backfire/target/linux/generic-2.6/files/drivers/net/phy/rtl8366rb.c

    r23659 r24988  
    44 * Copyright (C) 2009-2010 Gabor Juhos <juhosg@openwrt.org> 
    55 * Copyright (C) 2010 Antti SeppÀlÀ <a.seppala@gmail.com> 
     6 * Copyright (C) 2010 Roman Yeryomin <roman@advem.lv> 
    67 * 
    78 * This program is free software; you can redistribute it and/or modify it 
     
    164165#define RTL8366RB_VLAN_MEMBER_MASK      0xff 
    165166#define RTL8366RB_VLAN_FID_MASK         0x7 
     167 
     168 
     169/* Port ingress bandwidth control */ 
     170#define RTL8366RB_IB_BASE               0x0200 
     171#define RTL8366RB_IB_REG(pnum)          (RTL8366RB_IB_BASE + pnum) 
     172#define RTL8366RB_IB_BDTH_MASK          0x3fff 
     173#define RTL8366RB_IB_PREIFG_OFFSET      14 
     174#define RTL8366RB_IB_PREIFG_MASK        (1 << RTL8366RB_IB_PREIFG_OFFSET) 
     175 
     176/* Port egress bandwidth control */ 
     177#define RTL8366RB_EB_BASE               0x02d1 
     178#define RTL8366RB_EB_REG(pnum)          (RTL8366RB_EB_BASE + pnum) 
     179#define RTL8366RB_EB_BDTH_MASK          0x3fff 
     180#define RTL8366RB_EB_PREIFG_REG 0x02f8 
     181#define RTL8366RB_EB_PREIFG_OFFSET      9 
     182#define RTL8366RB_EB_PREIFG_MASK        (1 << RTL8366RB_EB_PREIFG_OFFSET) 
     183 
     184#define RTL8366RB_BDTH_SW_MAX           1048512 
     185#define RTL8366RB_BDTH_BASE             64 
     186#define RTL8366RB_BDTH_REG_DEFAULT      16383 
     187 
     188/* QOS */ 
     189#define RTL8366RB_QOS_BIT               15 
     190#define RTL8366RB_QOS_MASK              (1 << RTL8366RB_QOS_BIT) 
     191/* Include/Exclude Preamble and IFG (20 bytes). 0:Exclude, 1:Include. */ 
     192#define RTL8366RB_QOS_DEFAULT_PREIFG    1 
     193 
    166194 
    167195static struct rtl8366_mib_counter rtl8366rb_mib_counters[] = { 
     
    746774        rtl8366_smi_read_reg(smi, RTL8366RB_LED_CTRL_REG, &data); 
    747775        val->value.i = (data >> (val->port_vlan * 4)) & 0x000F; 
     776 
     777        return 0; 
     778} 
     779 
     780static int rtl8366rb_sw_set_port_disable(struct switch_dev *dev, 
     781                                    const struct switch_attr *attr, 
     782                                    struct switch_val *val) 
     783{ 
     784        struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev); 
     785        u32 mask, data; 
     786 
     787        if (val->port_vlan >= RTL8366RB_NUM_PORTS) 
     788                return -EINVAL; 
     789 
     790        mask = 1 << val->port_vlan ; 
     791        if (val->value.i) 
     792                data = mask; 
     793        else 
     794                data = 0; 
     795 
     796        return rtl8366_smi_rmwr(smi, RTL8366RB_PECR, mask, data); 
     797} 
     798 
     799static int rtl8366rb_sw_get_port_disable(struct switch_dev *dev, 
     800                                    const struct switch_attr *attr, 
     801                                    struct switch_val *val) 
     802{ 
     803        struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev); 
     804        u32 data; 
     805 
     806        if (val->port_vlan >= RTL8366RB_NUM_PORTS) 
     807                return -EINVAL; 
     808 
     809        rtl8366_smi_read_reg(smi, RTL8366RB_PECR, &data); 
     810        if (data & (1 << val->port_vlan)) 
     811                val->value.i = 1; 
     812        else 
     813                val->value.i = 0; 
     814 
     815        return 0; 
     816} 
     817 
     818static int rtl8366rb_sw_set_port_rate_in(struct switch_dev *dev, 
     819                                    const struct switch_attr *attr, 
     820                                    struct switch_val *val) 
     821{ 
     822        struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev); 
     823 
     824        if (val->port_vlan >= RTL8366RB_NUM_PORTS) 
     825                return -EINVAL; 
     826 
     827        if (val->value.i > 0 && val->value.i < RTL8366RB_BDTH_SW_MAX) 
     828                val->value.i = (val->value.i - 1) / RTL8366RB_BDTH_BASE; 
     829        else 
     830                val->value.i = RTL8366RB_BDTH_REG_DEFAULT; 
     831 
     832        return rtl8366_smi_rmwr(smi, RTL8366RB_IB_REG(val->port_vlan), 
     833                RTL8366RB_IB_BDTH_MASK | RTL8366RB_IB_PREIFG_MASK, 
     834                val->value.i | 
     835                (RTL8366RB_QOS_DEFAULT_PREIFG << RTL8366RB_IB_PREIFG_OFFSET)); 
     836 
     837} 
     838 
     839static int rtl8366rb_sw_get_port_rate_in(struct switch_dev *dev, 
     840                                    const struct switch_attr *attr, 
     841                                    struct switch_val *val) 
     842{ 
     843        struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev); 
     844        u32 data; 
     845 
     846        if (val->port_vlan >= RTL8366RB_NUM_PORTS) 
     847                return -EINVAL; 
     848 
     849        rtl8366_smi_read_reg(smi, RTL8366RB_IB_REG(val->port_vlan), &data); 
     850        data &= RTL8366RB_IB_BDTH_MASK; 
     851        if (data < RTL8366RB_IB_BDTH_MASK) 
     852                data += 1; 
     853 
     854        val->value.i = (int)data * RTL8366RB_BDTH_BASE; 
     855 
     856        return 0; 
     857} 
     858 
     859static int rtl8366rb_sw_set_port_rate_out(struct switch_dev *dev, 
     860                                    const struct switch_attr *attr, 
     861                                    struct switch_val *val) 
     862{ 
     863        struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev); 
     864 
     865        if (val->port_vlan >= RTL8366RB_NUM_PORTS) 
     866                return -EINVAL; 
     867 
     868        rtl8366_smi_rmwr(smi, RTL8366RB_EB_PREIFG_REG, 
     869                RTL8366RB_EB_PREIFG_MASK, 
     870                (RTL8366RB_QOS_DEFAULT_PREIFG << RTL8366RB_EB_PREIFG_OFFSET)); 
     871 
     872        if (val->value.i > 0 && val->value.i < RTL8366RB_BDTH_SW_MAX) 
     873                val->value.i = (val->value.i - 1) / RTL8366RB_BDTH_BASE; 
     874        else 
     875                val->value.i = RTL8366RB_BDTH_REG_DEFAULT; 
     876 
     877        return rtl8366_smi_rmwr(smi, RTL8366RB_EB_REG(val->port_vlan), 
     878                        RTL8366RB_EB_BDTH_MASK, val->value.i ); 
     879 
     880} 
     881 
     882static int rtl8366rb_sw_get_port_rate_out(struct switch_dev *dev, 
     883                                    const struct switch_attr *attr, 
     884                                    struct switch_val *val) 
     885{ 
     886        struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev); 
     887        u32 data; 
     888 
     889        if (val->port_vlan >= RTL8366RB_NUM_PORTS) 
     890                return -EINVAL; 
     891 
     892        rtl8366_smi_read_reg(smi, RTL8366RB_EB_REG(val->port_vlan), &data); 
     893        data &= RTL8366RB_EB_BDTH_MASK; 
     894        if (data < RTL8366RB_EB_BDTH_MASK) 
     895                data += 1; 
     896 
     897        val->value.i = (int)data * RTL8366RB_BDTH_BASE; 
     898 
     899        return 0; 
     900} 
     901 
     902static int rtl8366rb_sw_set_qos_enable(struct switch_dev *dev, 
     903                                    const struct switch_attr *attr, 
     904                                    struct switch_val *val) 
     905{ 
     906        struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev); 
     907        u32 data; 
     908 
     909        if (val->value.i) 
     910                data = RTL8366RB_QOS_MASK; 
     911        else 
     912                data = 0; 
     913 
     914        return rtl8366_smi_rmwr(smi, RTL8366RB_SGCR, RTL8366RB_QOS_MASK, data); 
     915} 
     916 
     917static int rtl8366rb_sw_get_qos_enable(struct switch_dev *dev, 
     918                                    const struct switch_attr *attr, 
     919                                    struct switch_val *val) 
     920{ 
     921        struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev); 
     922        u32 data; 
     923 
     924        rtl8366_smi_read_reg(smi, RTL8366RB_SGCR, &data); 
     925        if (data & RTL8366RB_QOS_MASK) 
     926                val->value.i = 1; 
     927        else 
     928                val->value.i = 0; 
    748929 
    749930        return 0; 
     
    816997                .get = rtl8366rb_sw_get_blinkrate, 
    817998                .max = 5 
     999        }, { 
     1000                .type = SWITCH_TYPE_INT, 
     1001                .name = "enable_qos", 
     1002                .description = "Enable QOS", 
     1003                .set = rtl8366rb_sw_set_qos_enable, 
     1004                .get = rtl8366rb_sw_get_qos_enable, 
     1005                .max = 1 
    8181006        }, 
    8191007}; 
     
    8461034                .set = rtl8366rb_sw_set_port_led, 
    8471035                .get = rtl8366rb_sw_get_port_led, 
     1036        }, { 
     1037                .type = SWITCH_TYPE_INT, 
     1038                .name = "disable", 
     1039                .description = "Get/Set port state (enabled or disabled)", 
     1040                .max = 1, 
     1041                .set = rtl8366rb_sw_set_port_disable, 
     1042                .get = rtl8366rb_sw_get_port_disable, 
     1043        }, { 
     1044                .type = SWITCH_TYPE_INT, 
     1045                .name = "rate_in", 
     1046                .description = "Get/Set port ingress (incoming) bandwidth limit in kbps", 
     1047                .max = RTL8366RB_BDTH_SW_MAX, 
     1048                .set = rtl8366rb_sw_set_port_rate_in, 
     1049                .get = rtl8366rb_sw_get_port_rate_in, 
     1050        }, { 
     1051                .type = SWITCH_TYPE_INT, 
     1052                .name = "rate_out", 
     1053                .description = "Get/Set port egress (outgoing) bandwidth limit in kbps", 
     1054                .max = RTL8366RB_BDTH_SW_MAX, 
     1055                .set = rtl8366rb_sw_set_port_rate_out, 
     1056                .get = rtl8366rb_sw_get_port_rate_out, 
    8481057        }, 
    8491058}; 
     
    11381347MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>"); 
    11391348MODULE_AUTHOR("Antti SeppÀlÀ <a.seppala@gmail.com>"); 
     1349MODULE_AUTHOR("Roman Yeryomin <roman@advem.lv>"); 
    11401350MODULE_LICENSE("GPL v2"); 
    11411351MODULE_ALIAS("platform:" RTL8366RB_DRIVER_NAME); 
Note: See TracChangeset for help on using the changeset viewer.