Skip to content

Commit 254764e

Browse files
hkallweitdavem330
authored andcommitted
r8169: improve firmware handling
So far member rtl_fw has three states: - IS_ERR(rtl_fw): firmware not loaded - !rtl_fw: no firmware available - other: firmware loaded This can be made simpler and clearer by adding the firmware name as member fw_name to struct rtl8169_private. Then: - !fw_name: no firmware available - !rtl_fw: firmware not loaded - rtl_fw: firmware loaded This change also allows to easily merge rtl_request_uncached_firmware into rtl_request_firmware. Signed-off-by: Heiner Kallweit <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent a56d7b9 commit 254764e

File tree

1 file changed

+15
-32
lines changed
  • drivers/net/ethernet/realtek

1 file changed

+15
-32
lines changed

drivers/net/ethernet/realtek/r8169.c

Lines changed: 15 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -684,6 +684,7 @@ struct rtl8169_private {
684684
struct rtl8169_tc_offsets tc_offset;
685685
u32 saved_wolopts;
686686

687+
const char *fw_name;
687688
struct rtl_fw {
688689
const struct firmware *fw;
689690

@@ -696,7 +697,6 @@ struct rtl8169_private {
696697
size_t size;
697698
} phy_action;
698699
} *rtl_fw;
699-
#define RTL_FIRMWARE_UNKNOWN ERR_PTR(-EAGAIN)
700700

701701
u32 ocp_base;
702702
};
@@ -1510,11 +1510,6 @@ static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
15101510
return 0;
15111511
}
15121512

1513-
static const char *rtl_lookup_firmware_name(struct rtl8169_private *tp)
1514-
{
1515-
return rtl_chip_infos[tp->mac_version].fw_name;
1516-
}
1517-
15181513
static void rtl8169_get_drvinfo(struct net_device *dev,
15191514
struct ethtool_drvinfo *info)
15201515
{
@@ -1524,7 +1519,7 @@ static void rtl8169_get_drvinfo(struct net_device *dev,
15241519
strlcpy(info->driver, MODULENAME, sizeof(info->driver));
15251520
strlcpy(info->bus_info, pci_name(tp->pci_dev), sizeof(info->bus_info));
15261521
BUILD_BUG_ON(sizeof(info->fw_version) < sizeof(rtl_fw->version));
1527-
if (!IS_ERR_OR_NULL(rtl_fw))
1522+
if (rtl_fw)
15281523
strlcpy(info->fw_version, rtl_fw->version,
15291524
sizeof(info->fw_version));
15301525
}
@@ -2201,7 +2196,7 @@ static bool rtl_fw_format_ok(struct rtl8169_private *tp, struct rtl_fw *rtl_fw)
22012196
if (fw->size % FW_OPCODE_SIZE)
22022197
goto out;
22032198

2204-
strlcpy(version, rtl_lookup_firmware_name(tp), RTL_VER_SIZE);
2199+
strlcpy(version, tp->fw_name, RTL_VER_SIZE);
22052200

22062201
pa->code = (__le32 *)fw->data;
22072202
pa->size = fw->size / FW_OPCODE_SIZE;
@@ -2376,20 +2371,18 @@ static void rtl_phy_write_fw(struct rtl8169_private *tp, struct rtl_fw *rtl_fw)
23762371

23772372
static void rtl_release_firmware(struct rtl8169_private *tp)
23782373
{
2379-
if (!IS_ERR_OR_NULL(tp->rtl_fw)) {
2374+
if (tp->rtl_fw) {
23802375
release_firmware(tp->rtl_fw->fw);
23812376
kfree(tp->rtl_fw);
2377+
tp->rtl_fw = NULL;
23822378
}
2383-
tp->rtl_fw = RTL_FIRMWARE_UNKNOWN;
23842379
}
23852380

23862381
static void rtl_apply_firmware(struct rtl8169_private *tp)
23872382
{
2388-
struct rtl_fw *rtl_fw = tp->rtl_fw;
2389-
23902383
/* TODO: release firmware once rtl_phy_write_fw signals failures. */
2391-
if (!IS_ERR_OR_NULL(rtl_fw))
2392-
rtl_phy_write_fw(tp, rtl_fw);
2384+
if (tp->rtl_fw)
2385+
rtl_phy_write_fw(tp, tp->rtl_fw);
23932386
}
23942387

23952388
static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val)
@@ -4377,21 +4370,20 @@ static void rtl_hw_reset(struct rtl8169_private *tp)
43774370
rtl_udelay_loop_wait_low(tp, &rtl_chipcmd_cond, 100, 100);
43784371
}
43794372

4380-
static void rtl_request_uncached_firmware(struct rtl8169_private *tp)
4373+
static void rtl_request_firmware(struct rtl8169_private *tp)
43814374
{
43824375
struct rtl_fw *rtl_fw;
4383-
const char *name;
43844376
int rc = -ENOMEM;
43854377

4386-
name = rtl_lookup_firmware_name(tp);
4387-
if (!name)
4388-
goto out_no_firmware;
4378+
/* firmware loaded already or no firmware available */
4379+
if (tp->rtl_fw || !tp->fw_name)
4380+
return;
43894381

43904382
rtl_fw = kzalloc(sizeof(*rtl_fw), GFP_KERNEL);
43914383
if (!rtl_fw)
43924384
goto err_warn;
43934385

4394-
rc = request_firmware(&rtl_fw->fw, name, tp_to_dev(tp));
4386+
rc = request_firmware(&rtl_fw->fw, tp->fw_name, tp_to_dev(tp));
43954387
if (rc < 0)
43964388
goto err_free;
43974389

@@ -4400,7 +4392,7 @@ static void rtl_request_uncached_firmware(struct rtl8169_private *tp)
44004392
goto err_release_firmware;
44014393

44024394
tp->rtl_fw = rtl_fw;
4403-
out:
4395+
44044396
return;
44054397

44064398
err_release_firmware:
@@ -4409,16 +4401,7 @@ static void rtl_request_uncached_firmware(struct rtl8169_private *tp)
44094401
kfree(rtl_fw);
44104402
err_warn:
44114403
netif_warn(tp, ifup, tp->dev, "unable to load firmware patch %s (%d)\n",
4412-
name, rc);
4413-
out_no_firmware:
4414-
tp->rtl_fw = NULL;
4415-
goto out;
4416-
}
4417-
4418-
static void rtl_request_firmware(struct rtl8169_private *tp)
4419-
{
4420-
if (IS_ERR(tp->rtl_fw))
4421-
rtl_request_uncached_firmware(tp);
4404+
tp->fw_name, rc);
44224405
}
44234406

44244407
static void rtl_rx_close(struct rtl8169_private *tp)
@@ -7331,7 +7314,7 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
73317314
tp->irq_mask = RTL_EVENT_NAPI | cfg->irq_mask;
73327315
tp->coalesce_info = cfg->coalesce_info;
73337316

7334-
tp->rtl_fw = RTL_FIRMWARE_UNKNOWN;
7317+
tp->fw_name = rtl_chip_infos[chipset].fw_name;
73357318

73367319
tp->counters = dmam_alloc_coherent (&pdev->dev, sizeof(*tp->counters),
73377320
&tp->counters_phys_addr,

0 commit comments

Comments
 (0)