mvsw61xx: match swconfig function names
[openwrt.git] / target / linux / generic / files / drivers / net / phy / mvsw61xx.c
index 116f6cf..f879056 100644 (file)
@@ -196,7 +196,7 @@ mvsw61xx_set_port_qmode(struct switch_dev *dev,
 }
 
 static int
-mvsw61xx_get_pvid(struct switch_dev *dev, int port, int *val)
+mvsw61xx_get_port_pvid(struct switch_dev *dev, int port, int *val)
 {
        struct mvsw61xx_state *state = get_state(dev);
 
@@ -206,7 +206,7 @@ mvsw61xx_get_pvid(struct switch_dev *dev, int port, int *val)
 }
 
 static int
-mvsw61xx_set_pvid(struct switch_dev *dev, int port, int val)
+mvsw61xx_set_port_pvid(struct switch_dev *dev, int port, int val)
 {
        struct mvsw61xx_state *state = get_state(dev);
 
@@ -219,73 +219,32 @@ mvsw61xx_set_pvid(struct switch_dev *dev, int port, int val)
 }
 
 static int
-mvsw61xx_get_port_status(struct switch_dev *dev,
-               const struct switch_attr *attr, struct switch_val *val)
+mvsw61xx_get_port_link(struct switch_dev *dev, int port,
+               struct switch_port_link *link)
 {
-       struct mvsw61xx_state *state = get_state(dev);
-       char *buf = state->buf;
        u16 status, speed;
-       int len;
-
-       status = sr16(dev, MV_PORTREG(STATUS, val->port_vlan));
-       speed = (status & MV_PORT_STATUS_SPEED_MASK) >>
-                       MV_PORT_STATUS_SPEED_SHIFT;
-
-       len = sprintf(buf, "link: ");
-       if (status & MV_PORT_STATUS_LINK) {
-               len += sprintf(buf + len, "up, speed: ");
-
-               switch (speed) {
-               case MV_PORT_STATUS_SPEED_10:
-                       len += sprintf(buf + len, "10");
-                       break;
-               case MV_PORT_STATUS_SPEED_100:
-                       len += sprintf(buf + len, "100");
-                       break;
-               case MV_PORT_STATUS_SPEED_1000:
-                       len += sprintf(buf + len, "1000");
-                       break;
-               }
 
-               len += sprintf(buf + len, " Mbps, duplex: ");
+       status = sr16(dev, MV_PORTREG(STATUS, port));
 
-               if (status & MV_PORT_STATUS_FDX)
-                       len += sprintf(buf + len, "full");
-               else
-                       len += sprintf(buf + len, "half");
-       } else {
-               len += sprintf(buf + len, "down");
-       }
-
-       val->value.s = buf;
-
-       return 0;
-}
+       link->link = status & MV_PORT_STATUS_LINK;
+       if (!link->link)
+               return 0;
 
-static int
-mvsw61xx_get_port_speed(struct switch_dev *dev,
-               const struct switch_attr *attr, struct switch_val *val)
-{
-       u16 status, speed;
+       link->duplex = status & MV_PORT_STATUS_FDX;
 
-       status = sr16(dev, MV_PORTREG(STATUS, val->port_vlan));
        speed = (status & MV_PORT_STATUS_SPEED_MASK) >>
                        MV_PORT_STATUS_SPEED_SHIFT;
 
-       val->value.i = 0;
-
-       if (status & MV_PORT_STATUS_LINK) {
-               switch (speed) {
-               case MV_PORT_STATUS_SPEED_10:
-                       val->value.i = 10;
-                       break;
-               case MV_PORT_STATUS_SPEED_100:
-                       val->value.i = 100;
-                       break;
-               case MV_PORT_STATUS_SPEED_1000:
-                       val->value.i = 1000;
-                       break;
-               }
+       switch (speed) {
+       case MV_PORT_STATUS_SPEED_10:
+               link->speed = SWITCH_PORT_SPEED_10;
+               break;
+       case MV_PORT_STATUS_SPEED_100:
+               link->speed = SWITCH_PORT_SPEED_100;
+               break;
+       case MV_PORT_STATUS_SPEED_1000:
+               link->speed = SWITCH_PORT_SPEED_1000;
+               break;
        }
 
        return 0;
@@ -493,7 +452,7 @@ static int mvsw61xx_vtu_program(struct switch_dev *dev)
                sw16(dev, MV_GLOBALREG(VTU_VID),
                                MV_VTU_VID_VALID | state->vlans[i].vid);
                sw16(dev, MV_GLOBALREG(VTU_SID), i);
-               sw16(dev, MV_GLOBALREG(VTU_FID), 0);
+               sw16(dev, MV_GLOBALREG(VTU_FID), i);
                sw16(dev, MV_GLOBALREG(VTU_DATA1), v1);
                sw16(dev, MV_GLOBALREG(VTU_DATA2), v2);
                sw16(dev, MV_GLOBALREG(VTU_DATA3), 0);
@@ -521,8 +480,10 @@ static void mvsw61xx_vlan_port_config(struct switch_dev *dev, int vno)
                if(mode != MV_VTUCTL_EGRESS_TAGGED)
                        state->ports[i].pvid = state->vlans[vno].vid;
 
-               if (state->vlans[vno].port_based)
+               if (state->vlans[vno].port_based) {
                        state->ports[i].mask |= state->vlans[vno].mask;
+                       state->ports[i].fdb = vno;
+               }
                else
                        state->ports[i].qmode = MV_8021Q_MODE_SECURE;
        }
@@ -579,8 +540,14 @@ static int mvsw61xx_update_state(struct switch_dev *dev)
 
                state->ports[i].mask &= ~(1 << i);
 
-               reg = sr16(dev, MV_PORTREG(VLANMAP, i)) & ~MV_PORTS_MASK;
-               reg |= state->ports[i].mask;
+               /* set default forwarding DB number and port mask */
+               reg = sr16(dev, MV_PORTREG(CONTROL1, i)) & ~MV_FDB_HI_MASK;
+               reg |= (state->ports[i].fdb >> MV_FDB_HI_SHIFT) &
+                       MV_FDB_HI_MASK;
+               sw16(dev, MV_PORTREG(CONTROL1, i), reg);
+
+               reg = ((state->ports[i].fdb & 0xf) << MV_FDB_LO_SHIFT) |
+                       state->ports[i].mask;
                sw16(dev, MV_PORTREG(VLANMAP, i), reg);
 
                reg = sr16(dev, MV_PORTREG(CONTROL2, i)) &
@@ -620,6 +587,7 @@ static int mvsw61xx_reset(struct switch_dev *dev)
                return -ETIMEDOUT;
 
        for (i = 0; i < dev->ports; i++) {
+               state->ports[i].fdb = 0;
                state->ports[i].qmode = 0;
                state->ports[i].mask = 0;
                state->ports[i].pvid = 0;
@@ -667,8 +635,6 @@ enum {
 enum {
        MVSW61XX_PORT_MASK,
        MVSW61XX_PORT_QMODE,
-       MVSW61XX_PORT_STATUS,
-       MVSW61XX_PORT_LINK,
 };
 
 static const struct switch_attr mvsw61xx_global[] = {
@@ -718,22 +684,6 @@ static const struct switch_attr mvsw61xx_port[] = {
                .get = mvsw61xx_get_port_qmode,
                .set = mvsw61xx_set_port_qmode,
        },
-       [MVSW61XX_PORT_STATUS] = {
-               .id = MVSW61XX_PORT_STATUS,
-               .type = SWITCH_TYPE_STRING,
-               .description = "Return port status",
-               .name = "status",
-               .get = mvsw61xx_get_port_status,
-               .set = NULL,
-       },
-       [MVSW61XX_PORT_LINK] = {
-               .id = MVSW61XX_PORT_LINK,
-               .type = SWITCH_TYPE_INT,
-               .description = "Get link speed",
-               .name = "link",
-               .get = mvsw61xx_get_port_speed,
-               .set = NULL,
-       },
 };
 
 static const struct switch_dev_ops mvsw61xx_ops = {
@@ -749,8 +699,9 @@ static const struct switch_dev_ops mvsw61xx_ops = {
                .attr = mvsw61xx_port,
                .n_attr = ARRAY_SIZE(mvsw61xx_port),
        },
-       .get_port_pvid = mvsw61xx_get_pvid,
-       .set_port_pvid = mvsw61xx_set_pvid,
+       .get_port_link = mvsw61xx_get_port_link,
+       .get_port_pvid = mvsw61xx_get_port_pvid,
+       .set_port_pvid = mvsw61xx_set_port_pvid,
        .get_vlan_ports = mvsw61xx_get_vlan_ports,
        .set_vlan_ports = mvsw61xx_set_vlan_ports,
        .apply_config = mvsw61xx_apply,