|
|
@ -1073,6 +1073,51 @@ static int rtl8367_led_blinkrate_set(struct rtl8366_smi *smi, unsigned int rate) |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_OF |
|
|
|
|
|
|
|
static int rtl8367_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) |
|
|
|
|
|
|
|
return rtl8367_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 -ENOMEM; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cfg->txdelay = be32_to_cpup(prop++); |
|
|
|
|
|
|
|
cfg->rxdelay = be32_to_cpup(prop++); |
|
|
|
|
|
|
|
cfg->mode = be32_to_cpup(prop++); |
|
|
|
|
|
|
|
cfg->ability.force_mode = be32_to_cpup(prop++); |
|
|
|
|
|
|
|
cfg->ability.txpause = be32_to_cpup(prop++); |
|
|
|
|
|
|
|
cfg->ability.rxpause = be32_to_cpup(prop++); |
|
|
|
|
|
|
|
cfg->ability.link = be32_to_cpup(prop++); |
|
|
|
|
|
|
|
cfg->ability.duplex = be32_to_cpup(prop++); |
|
|
|
|
|
|
|
cfg->ability.speed = be32_to_cpup(prop++); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
err = rtl8367_extif_init(smi, id, cfg); |
|
|
|
|
|
|
|
kfree(cfg); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return err; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
static int rtl8367_extif_init_of(struct rtl8366_smi *smi, int id, |
|
|
|
|
|
|
|
const char *name) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
return -EINVAL; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
static int rtl8367_setup(struct rtl8366_smi *smi) |
|
|
|
static int rtl8367_setup(struct rtl8366_smi *smi) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct rtl8367_platform_data *pdata; |
|
|
|
struct rtl8367_platform_data *pdata; |
|
|
@ -1086,13 +1131,23 @@ static int rtl8367_setup(struct rtl8366_smi *smi) |
|
|
|
return err; |
|
|
|
return err; |
|
|
|
|
|
|
|
|
|
|
|
/* initialize external interfaces */ |
|
|
|
/* initialize external interfaces */ |
|
|
|
err = rtl8367_extif_init(smi, 0, pdata->extif0_cfg); |
|
|
|
if (smi->parent->of_node) { |
|
|
|
if (err) |
|
|
|
err = rtl8367_extif_init_of(smi, 0, "realtek,extif0"); |
|
|
|
return err; |
|
|
|
if (err) |
|
|
|
|
|
|
|
return err; |
|
|
|
|
|
|
|
|
|
|
|
err = rtl8367_extif_init(smi, 1, pdata->extif1_cfg); |
|
|
|
err = rtl8367_extif_init_of(smi, 1, "realtek,extif1"); |
|
|
|
if (err) |
|
|
|
if (err) |
|
|
|
return err; |
|
|
|
return err; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
err = rtl8367_extif_init(smi, 0, pdata->extif0_cfg); |
|
|
|
|
|
|
|
if (err) |
|
|
|
|
|
|
|
return err; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
err = rtl8367_extif_init(smi, 1, pdata->extif1_cfg); |
|
|
|
|
|
|
|
if (err) |
|
|
|
|
|
|
|
return err; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* set maximum packet length to 1536 bytes */ |
|
|
|
/* set maximum packet length to 1536 bytes */ |
|
|
|
REG_RMW(smi, RTL8367_SWC0_REG, RTL8367_SWC0_MAX_LENGTH_MASK, |
|
|
|
REG_RMW(smi, RTL8367_SWC0_REG, RTL8367_SWC0_MAX_LENGTH_MASK, |
|
|
|