mirror of https://gitee.com/openkylin/linux.git
r8169: check firmware content sooner.
Firmware checking is only performed when the firmware is loaded instead of each time the driver inits the phy. Signed-off-by: Francois Romieu <romieu@fr.zoreil.com>
This commit is contained in:
parent
960aee6c7d
commit
fd112f2e15
|
@ -1815,18 +1815,12 @@ static bool rtl_fw_format_ok(struct rtl8169_private *tp, struct rtl_fw *rtl_fw)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rtl_phy_write_fw(struct rtl8169_private *tp, struct rtl_fw *rtl_fw)
|
static bool rtl_fw_data_ok(struct rtl8169_private *tp, struct net_device *dev,
|
||||||
|
struct rtl_fw_phy_action *pa)
|
||||||
{
|
{
|
||||||
struct rtl_fw_phy_action *pa = &rtl_fw->phy_action;
|
bool rc = false;
|
||||||
struct net_device *dev = tp->dev;
|
|
||||||
u32 predata, count;
|
|
||||||
size_t index;
|
size_t index;
|
||||||
|
|
||||||
if (!rtl_fw_format_ok(tp, rtl_fw)) {
|
|
||||||
netif_err(tp, probe, dev, "invalid firwmare\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (index = 0; index < pa->size; index++) {
|
for (index = 0; index < pa->size; index++) {
|
||||||
u32 action = le32_to_cpu(pa->code[index]);
|
u32 action = le32_to_cpu(pa->code[index]);
|
||||||
u32 regno = (action & 0x0fff0000) >> 16;
|
u32 regno = (action & 0x0fff0000) >> 16;
|
||||||
|
@ -1844,25 +1838,25 @@ static void rtl_phy_write_fw(struct rtl8169_private *tp, struct rtl_fw *rtl_fw)
|
||||||
|
|
||||||
case PHY_BJMPN:
|
case PHY_BJMPN:
|
||||||
if (regno > index) {
|
if (regno > index) {
|
||||||
netif_err(tp, probe, tp->dev,
|
netif_err(tp, ifup, tp->dev,
|
||||||
"Out of range of firmware\n");
|
"Out of range of firmware\n");
|
||||||
return;
|
goto out;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PHY_READCOUNT_EQ_SKIP:
|
case PHY_READCOUNT_EQ_SKIP:
|
||||||
if (index + 2 >= pa->size) {
|
if (index + 2 >= pa->size) {
|
||||||
netif_err(tp, probe, tp->dev,
|
netif_err(tp, ifup, tp->dev,
|
||||||
"Out of range of firmware\n");
|
"Out of range of firmware\n");
|
||||||
return;
|
goto out;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PHY_COMP_EQ_SKIPN:
|
case PHY_COMP_EQ_SKIPN:
|
||||||
case PHY_COMP_NEQ_SKIPN:
|
case PHY_COMP_NEQ_SKIPN:
|
||||||
case PHY_SKIPN:
|
case PHY_SKIPN:
|
||||||
if (index + 1 + regno >= pa->size) {
|
if (index + 1 + regno >= pa->size) {
|
||||||
netif_err(tp, probe, tp->dev,
|
netif_err(tp, ifup, tp->dev,
|
||||||
"Out of range of firmware\n");
|
"Out of range of firmware\n");
|
||||||
return;
|
goto out;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -1870,14 +1864,39 @@ static void rtl_phy_write_fw(struct rtl8169_private *tp, struct rtl_fw *rtl_fw)
|
||||||
case PHY_WRITE_MAC_BYTE:
|
case PHY_WRITE_MAC_BYTE:
|
||||||
case PHY_WRITE_ERI_WORD:
|
case PHY_WRITE_ERI_WORD:
|
||||||
default:
|
default:
|
||||||
netif_err(tp, probe, tp->dev,
|
netif_err(tp, ifup, tp->dev,
|
||||||
"Invalid action 0x%08x\n", action);
|
"Invalid action 0x%08x\n", action);
|
||||||
return;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
rc = true;
|
||||||
|
out:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
predata = 0;
|
static int rtl_check_firmware(struct rtl8169_private *tp, struct rtl_fw *rtl_fw)
|
||||||
count = 0;
|
{
|
||||||
|
struct net_device *dev = tp->dev;
|
||||||
|
int rc = -EINVAL;
|
||||||
|
|
||||||
|
if (!rtl_fw_format_ok(tp, rtl_fw)) {
|
||||||
|
netif_err(tp, ifup, dev, "invalid firwmare\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rtl_fw_data_ok(tp, dev, &rtl_fw->phy_action))
|
||||||
|
rc = 0;
|
||||||
|
out:
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void rtl_phy_write_fw(struct rtl8169_private *tp, struct rtl_fw *rtl_fw)
|
||||||
|
{
|
||||||
|
struct rtl_fw_phy_action *pa = &rtl_fw->phy_action;
|
||||||
|
u32 predata, count;
|
||||||
|
size_t index;
|
||||||
|
|
||||||
|
predata = count = 0;
|
||||||
|
|
||||||
for (index = 0; index < pa->size; ) {
|
for (index = 0; index < pa->size; ) {
|
||||||
u32 action = le32_to_cpu(pa->code[index]);
|
u32 action = le32_to_cpu(pa->code[index]);
|
||||||
|
@ -3605,10 +3624,16 @@ static void rtl_request_uncached_firmware(struct rtl8169_private *tp)
|
||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto err_free;
|
goto err_free;
|
||||||
|
|
||||||
|
rc = rtl_check_firmware(tp, rtl_fw);
|
||||||
|
if (rc < 0)
|
||||||
|
goto err_release_firmware;
|
||||||
|
|
||||||
tp->rtl_fw = rtl_fw;
|
tp->rtl_fw = rtl_fw;
|
||||||
out:
|
out:
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
err_release_firmware:
|
||||||
|
release_firmware(rtl_fw->fw);
|
||||||
err_free:
|
err_free:
|
||||||
kfree(rtl_fw);
|
kfree(rtl_fw);
|
||||||
err_warn:
|
err_warn:
|
||||||
|
|
Loading…
Reference in New Issue