+static int ar7240_get_port_state(struct switch_dev *dev,
+ const struct switch_attr *attr,
+ struct switch_val *val)
+{
+ struct ar7240sw *as = sw_to_ar7240(dev);
+ struct mii_bus *mii = as->mii_bus;
+ u32 state;
+
+ if (val->port_vlan > AR7240_NUM_PORTS)
+ return -EINVAL;
+
+ state = ar7240sw_reg_read(mii, AR7240_REG_PORT_CTRL(val->port_vlan));
+ val->value.i = state & AR7240_PORT_CTRL_STATE_M;
+ return 0;
+}
+
+static int ar7240_set_port_state(struct switch_dev *dev,
+ const struct switch_attr *attr,
+ struct switch_val *val)
+{
+ struct ar7240sw *as = sw_to_ar7240(dev);
+ struct mii_bus *mii = as->mii_bus;
+
+ if (val->port_vlan > AR7240_NUM_PORTS)
+ return -EINVAL;
+
+ ar7240sw_reg_rmw(mii, AR7240_REG_PORT_CTRL(val->port_vlan),
+ AR7240_PORT_CTRL_STATE_M, val->value.i);
+ return 0;
+}
+
+static int ar7240_get_port_storm_ctrl(struct switch_dev *dev,
+ const struct switch_attr *attr,
+ struct switch_val *val)
+{
+ struct ar7240sw *as = sw_to_ar7240(dev);
+ struct mii_bus *mii = as->mii_bus;
+
+ if (val->port_vlan > AR7240_NUM_PORTS)
+ return -EINVAL;
+
+ val->value.i = ar7240sw_reg_read(mii, AR7240_REG_PORT_STORM_CTRL(val->port_vlan));
+ return 0;
+}
+
+static int ar7240_set_port_storm_ctrl(struct switch_dev *dev,
+ const struct switch_attr *attr,
+ struct switch_val *val)
+{
+ struct ar7240sw *as = sw_to_ar7240(dev);
+ struct mii_bus *mii = as->mii_bus;
+ u32 i;
+
+ if (val->port_vlan > AR7240_NUM_PORTS)
+ return -EINVAL;
+
+ i = val->value.i;
+ if (i & AR7240_STORM_CTRL_RES_M)
+ return -EINVAL;
+ if ((i & AR7240_STORM_CTRL_STORM_RATE_M) > AR7240_STORM_CTRL_STORM_RATE_MAX)
+ return -EINVAL;
+
+ ar7240sw_reg_write(mii, AR7240_REG_PORT_STORM_CTRL(val->port_vlan), i);
+ return 0;
+}
+