kernel: require admin permissions for swconfig set operations
[openwrt/openwrt.git] / target / linux / generic / files / drivers / net / phy / rtl8367b.c
index 5775fa4e98f68607964161aefcb02ffb9390f580..a82f696d7f9daf341950ea5499219af56dc64fc5 100644 (file)
@@ -863,19 +863,26 @@ static int rtl8367b_extif_init(struct rtl8366_smi *smi, int id,
 }
 
 #ifdef CONFIG_OF
-static int rtl8367b_extif_init_of(struct rtl8366_smi *smi, int id, const char *name)
+static int rtl8367b_extif_init_of(struct rtl8366_smi *smi, int id,
+                                 const char *name)
 {
        struct rtl8367_extif_config *cfg;
        const __be32 *prop;
        int size;
+       int err;
 
        prop = of_get_property(smi->parent->of_node, name, &size);
-       if (!prop || size != (9 * sizeof(*prop)))
-               return 0;
+       if (!prop)
+               return rtl8367b_extif_init(smi, id, NULL);
+
+       if (size != (9 * sizeof(*prop))) {
+               dev_err(smi->parent, "%s property is invalid\n", name);
+               return -EINVAL;
+       }
 
        cfg = kzalloc(sizeof(struct rtl8367_extif_config), GFP_KERNEL);
        if (!cfg)
-               return -1;
+               return -ENOMEM;
 
        cfg->txdelay = be32_to_cpup(prop++);
        cfg->rxdelay = be32_to_cpup(prop++);
@@ -887,12 +894,16 @@ static int rtl8367b_extif_init_of(struct rtl8366_smi *smi, int id, const char *n
        cfg->ability.duplex = be32_to_cpup(prop++);
        cfg->ability.speed = be32_to_cpup(prop++);
 
-       return rtl8367b_extif_init(smi, id, cfg);
+       err = rtl8367b_extif_init(smi, id, cfg);
+       kfree(cfg);
+
+       return err;
 }
 #else
-static int rtl8367b_extif_init_of(struct rtl8366_smi *smi, int id, const char *name)
+static int rtl8367b_extif_init_of(struct rtl8366_smi *smi, int id,
+                                 const char *name)
 {
-       return -1;
+       return -EINVAL;
 }
 #endif
 
@@ -1562,6 +1573,7 @@ static void rtl8367b_shutdown(struct platform_device *pdev)
 
 #ifdef CONFIG_OF
 static const struct of_device_id rtl8367b_match[] = {
+       { .compatible = "realtek,rtl8367b" },
        { .compatible = "rtl8367b" },
        {},
 };