|
|
@@ -655,6 +655,49 @@ static int rtl8366s_sw_set_blinkrate(struct switch_dev *dev,
|
|
|
val->value.i);
|
|
|
}
|
|
|
|
|
|
+static int rtl8366s_sw_get_max_length(struct switch_dev *dev,
|
|
|
+ const struct switch_attr *attr,
|
|
|
+ struct switch_val *val)
|
|
|
+{
|
|
|
+ struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
|
|
|
+ u32 data;
|
|
|
+
|
|
|
+ rtl8366_smi_read_reg(smi, RTL8366S_SGCR, &data);
|
|
|
+
|
|
|
+ val->value.i = ((data & (RTL8366S_SGCR_MAX_LENGTH_MASK)) >> 4);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int rtl8366s_sw_set_max_length(struct switch_dev *dev,
|
|
|
+ const struct switch_attr *attr,
|
|
|
+ struct switch_val *val)
|
|
|
+{
|
|
|
+ struct rtl8366_smi *smi = sw_to_rtl8366_smi(dev);
|
|
|
+ char length_code;
|
|
|
+
|
|
|
+ switch (val->value.i) {
|
|
|
+ case 0:
|
|
|
+ length_code = RTL8366S_SGCR_MAX_LENGTH_1522;
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ length_code = RTL8366S_SGCR_MAX_LENGTH_1536;
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ length_code = RTL8366S_SGCR_MAX_LENGTH_1552;
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ length_code = RTL8366S_SGCR_MAX_LENGTH_16000;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+
|
|
|
+ return rtl8366_smi_rmwr(smi, RTL8366S_SGCR,
|
|
|
+ RTL8366S_SGCR_MAX_LENGTH_MASK,
|
|
|
+ length_code);
|
|
|
+}
|
|
|
+
|
|
|
static int rtl8366s_sw_get_learning_enable(struct switch_dev *dev,
|
|
|
const struct switch_attr *attr,
|
|
|
struct switch_val *val)
|
|
|
@@ -863,6 +906,14 @@ static struct switch_attr rtl8366s_globals[] = {
|
|
|
.set = rtl8366s_sw_set_blinkrate,
|
|
|
.get = rtl8366s_sw_get_blinkrate,
|
|
|
.max = 5
|
|
|
+ }, {
|
|
|
+ .type = SWITCH_TYPE_INT,
|
|
|
+ .name = "max_length",
|
|
|
+ .description = "Get/Set the maximum length of valid packets"
|
|
|
+ " (0 = 1522, 1 = 1536, 2 = 1552, 3 = 16000 (9216?))",
|
|
|
+ .set = rtl8366s_sw_set_max_length,
|
|
|
+ .get = rtl8366s_sw_get_max_length,
|
|
|
+ .max = 3,
|
|
|
},
|
|
|
};
|
|
|
|