mirror of
git://projects.qi-hardware.com/openwrt-xburst.git
synced 2024-08-20 05:23:21 +03:00
generic: swconfig: add a generic get_port_link implementation
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@30839 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
parent
6977635623
commit
e660b7606b
@ -129,6 +129,62 @@ swconfig_get_pvid(struct switch_dev *dev, const struct switch_attr *attr, struct
|
|||||||
return dev->ops->get_port_pvid(dev, val->port_vlan, &val->value.i);
|
return dev->ops->get_port_pvid(dev, val->port_vlan, &val->value.i);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
swconfig_speed_str(enum switch_port_speed speed)
|
||||||
|
{
|
||||||
|
switch (speed) {
|
||||||
|
case SWITCH_PORT_SPEED_10:
|
||||||
|
return "10baseT";
|
||||||
|
case SWITCH_PORT_SPEED_100:
|
||||||
|
return "100baseT";
|
||||||
|
case SWITCH_PORT_SPEED_1000:
|
||||||
|
return "1000baseT";
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
swconfig_get_link(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val)
|
||||||
|
{
|
||||||
|
struct switch_port_link link;
|
||||||
|
int len;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (val->port_vlan >= dev->ports)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (!dev->ops->get_port_link)
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
memset(&link, 0, sizeof(link));
|
||||||
|
ret = dev->ops->get_port_link(dev, val->port_vlan, &link);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
memset(dev->buf, 0, sizeof(dev->buf));
|
||||||
|
|
||||||
|
if (link.link)
|
||||||
|
len = snprintf(dev->buf, sizeof(dev->buf),
|
||||||
|
"port:%d link:up speed:%s %s-duplex %s%s%s",
|
||||||
|
val->port_vlan,
|
||||||
|
swconfig_speed_str(link.speed),
|
||||||
|
link.duplex ? "full" : "half",
|
||||||
|
link.tx_flow ? "txflow ": "",
|
||||||
|
link.rx_flow ? "rxflow " : "",
|
||||||
|
link.aneg ? "auto" : "");
|
||||||
|
else
|
||||||
|
len = snprintf(dev->buf, sizeof(dev->buf), "port:%d link:down",
|
||||||
|
val->port_vlan);
|
||||||
|
|
||||||
|
val->value.s = dev->buf;
|
||||||
|
val->len = len;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
swconfig_apply_config(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val)
|
swconfig_apply_config(struct switch_dev *dev, const struct switch_attr *attr, struct switch_val *val)
|
||||||
{
|
{
|
||||||
@ -160,6 +216,7 @@ enum vlan_defaults {
|
|||||||
|
|
||||||
enum port_defaults {
|
enum port_defaults {
|
||||||
PORT_PVID,
|
PORT_PVID,
|
||||||
|
PORT_LINK,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct switch_attr default_global[] = {
|
static struct switch_attr default_global[] = {
|
||||||
@ -184,6 +241,13 @@ static struct switch_attr default_port[] = {
|
|||||||
.description = "Primary VLAN ID",
|
.description = "Primary VLAN ID",
|
||||||
.set = swconfig_set_pvid,
|
.set = swconfig_set_pvid,
|
||||||
.get = swconfig_get_pvid,
|
.get = swconfig_get_pvid,
|
||||||
|
},
|
||||||
|
[PORT_LINK] = {
|
||||||
|
.type = SWITCH_TYPE_STRING,
|
||||||
|
.name = "link",
|
||||||
|
.description = "Get port link information",
|
||||||
|
.set = NULL,
|
||||||
|
.get = swconfig_get_link,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -197,6 +261,17 @@ static struct switch_attr default_vlan[] = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct switch_attr *
|
||||||
|
swconfig_find_attr_by_name(const struct switch_attrlist *alist, const char *name)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < alist->n_attr; i++)
|
||||||
|
if (strcmp(name, alist->attr[i].name) == 0)
|
||||||
|
return &alist->attr[i];
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static void swconfig_defaults_init(struct switch_dev *dev)
|
static void swconfig_defaults_init(struct switch_dev *dev)
|
||||||
{
|
{
|
||||||
@ -212,6 +287,10 @@ static void swconfig_defaults_init(struct switch_dev *dev)
|
|||||||
if (ops->get_port_pvid || ops->set_port_pvid)
|
if (ops->get_port_pvid || ops->set_port_pvid)
|
||||||
set_bit(PORT_PVID, &dev->def_port);
|
set_bit(PORT_PVID, &dev->def_port);
|
||||||
|
|
||||||
|
if (ops->get_port_link &&
|
||||||
|
!swconfig_find_attr_by_name(&ops->attr_port, "link"))
|
||||||
|
set_bit(PORT_LINK, &dev->def_port);
|
||||||
|
|
||||||
/* always present, can be no-op */
|
/* always present, can be no-op */
|
||||||
set_bit(GLOBAL_APPLY, &dev->def_global);
|
set_bit(GLOBAL_APPLY, &dev->def_global);
|
||||||
set_bit(GLOBAL_RESET, &dev->def_global);
|
set_bit(GLOBAL_RESET, &dev->def_global);
|
||||||
|
@ -194,6 +194,8 @@ struct switch_dev {
|
|||||||
spinlock_t lock;
|
spinlock_t lock;
|
||||||
struct switch_port *portbuf;
|
struct switch_port *portbuf;
|
||||||
|
|
||||||
|
char buf[128];
|
||||||
|
|
||||||
#ifdef CONFIG_SWCONFIG_LEDS
|
#ifdef CONFIG_SWCONFIG_LEDS
|
||||||
struct switch_led_trigger *led_trigger;
|
struct switch_led_trigger *led_trigger;
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user