Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 361903 | Differences between
and this patch

Collapse All | Expand All

(-)linux-2.6.38-gentoo-r6/drivers/net/r8169.c (-26 / +68 lines)
Lines 165-170 Link Here
165
};
165
};
166
#undef _R
166
#undef _R
167
167
168
static const struct rtl_firmware_info {
169
	int mac_version;
170
	const char *fw_name;
171
} rtl_firmware_infos[] = {
172
	{ .mac_version = RTL_GIGA_MAC_VER_25, .fw_name = FIRMWARE_8168D_1 },
173
	{ .mac_version = RTL_GIGA_MAC_VER_26, .fw_name = FIRMWARE_8168D_2 }
174
};
175
168
enum cfg_version {
176
enum cfg_version {
169
	RTL_CFG_0 = 0x00,
177
	RTL_CFG_0 = 0x00,
170
	RTL_CFG_1,
178
	RTL_CFG_1,
Lines 557-562 Link Here
557
	u32 saved_wolopts;
565
	u32 saved_wolopts;
558
566
559
	const struct firmware *fw;
567
	const struct firmware *fw;
568
#define RTL_FIRMWARE_UNKNOWN	ERR_PTR(-EAGAIN);
560
};
569
};
561
570
562
MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>");
571
MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>");
Lines 1773-1797 Link Here
1773
1782
1774
static void rtl_release_firmware(struct rtl8169_private *tp)
1783
static void rtl_release_firmware(struct rtl8169_private *tp)
1775
{
1784
{
1776
	release_firmware(tp->fw);
1785
	if (!IS_ERR_OR_NULL(tp->fw))
1777
	tp->fw = NULL;
1786
		release_firmware(tp->fw);
1787
	tp->fw = RTL_FIRMWARE_UNKNOWN;
1778
}
1788
}
1779
1789
1780
static int rtl_apply_firmware(struct rtl8169_private *tp, const char *fw_name)
1790
static void rtl_apply_firmware(struct rtl8169_private *tp)
1781
{
1791
{
1782
	const struct firmware **fw = &tp->fw;
1792
	const struct firmware *fw = tp->fw;
1783
	int rc = !*fw;
1784
1785
	if (rc) {
1786
		rc = request_firmware(fw, fw_name, &tp->pci_dev->dev);
1787
		if (rc < 0)
1788
			goto out;
1789
	}
1790
1793
1791
	/* TODO: release firmware once rtl_phy_write_fw signals failures. */
1794
	/* TODO: release firmware once rtl_phy_write_fw signals failures. */
1792
	rtl_phy_write_fw(tp, *fw);
1795
	if (!IS_ERR_OR_NULL(fw))
1793
out:
1796
		rtl_phy_write_fw(tp, fw);
1794
	return rc;
1797
}
1798
1799
static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val)
1800
{
1801
	if (rtl_readphy(tp, reg) != val)
1802
		netif_warn(tp, hw, tp->dev, "chipset not ready for firmware\n");
1803
	else
1804
		rtl_apply_firmware(tp);
1795
}
1805
}
1796
1806
1797
static void rtl8169s_hw_phy_config(struct rtl8169_private *tp)
1807
static void rtl8169s_hw_phy_config(struct rtl8169_private *tp)
Lines 2230-2239 Link Here
2230
2240
2231
	rtl_writephy(tp, 0x1f, 0x0005);
2241
	rtl_writephy(tp, 0x1f, 0x0005);
2232
	rtl_writephy(tp, 0x05, 0x001b);
2242
	rtl_writephy(tp, 0x05, 0x001b);
2233
	if ((rtl_readphy(tp, 0x06) != 0xbf00) ||
2243
2234
	    (rtl_apply_firmware(tp, FIRMWARE_8168D_1) < 0)) {
2244
	rtl_apply_firmware_cond(tp, MII_EXPANSION, 0xbf00);
2235
		netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n");
2236
	}
2237
2245
2238
	rtl_writephy(tp, 0x1f, 0x0000);
2246
	rtl_writephy(tp, 0x1f, 0x0000);
2239
}
2247
}
Lines 2335-2344 Link Here
2335
2343
2336
	rtl_writephy(tp, 0x1f, 0x0005);
2344
	rtl_writephy(tp, 0x1f, 0x0005);
2337
	rtl_writephy(tp, 0x05, 0x001b);
2345
	rtl_writephy(tp, 0x05, 0x001b);
2338
	if ((rtl_readphy(tp, 0x06) != 0xb300) ||
2346
2339
	    (rtl_apply_firmware(tp, FIRMWARE_8168D_2) < 0)) {
2347
	rtl_apply_firmware_cond(tp, MII_EXPANSION, 0xb300);
2340
		netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n");
2341
	}
2342
2348
2343
	rtl_writephy(tp, 0x1f, 0x0000);
2349
	rtl_writephy(tp, 0x1f, 0x0000);
2344
}
2350
}
Lines 3186-3191 Link Here
3186
	tp->timer.data = (unsigned long) dev;
3192
	tp->timer.data = (unsigned long) dev;
3187
	tp->timer.function = rtl8169_phy_timer;
3193
	tp->timer.function = rtl8169_phy_timer;
3188
3194
3195
	tp->fw = RTL_FIRMWARE_UNKNOWN;
3196
3189
	rc = register_netdev(dev);
3197
	rc = register_netdev(dev);
3190
	if (rc < 0)
3198
	if (rc < 0)
3191
		goto err_out_msi_4;
3199
		goto err_out_msi_4;
Lines 3237-3246 Link Here
3237
3245
3238
	cancel_delayed_work_sync(&tp->task);
3246
	cancel_delayed_work_sync(&tp->task);
3239
3247
3240
	rtl_release_firmware(tp);
3241
3242
	unregister_netdev(dev);
3248
	unregister_netdev(dev);
3243
3249
3250
	rtl_release_firmware(tp);
3251
3244
	if (pci_dev_run_wake(pdev))
3252
	if (pci_dev_run_wake(pdev))
3245
		pm_runtime_get_noresume(&pdev->dev);
3253
		pm_runtime_get_noresume(&pdev->dev);
3246
3254
Lines 3252-3257 Link Here
3252
	pci_set_drvdata(pdev, NULL);
3260
	pci_set_drvdata(pdev, NULL);
3253
}
3261
}
3254
3262
3263
static void rtl_request_firmware(struct rtl8169_private *tp)
3264
{
3265
	int i;
3266
3267
	/* Return early if the firmware is already loaded / cached. */
3268
	if (!IS_ERR(tp->fw))
3269
		goto out;
3270
3271
	for (i = 0; i < ARRAY_SIZE(rtl_firmware_infos); i++) {
3272
		const struct rtl_firmware_info *info = rtl_firmware_infos + i;
3273
3274
		if (info->mac_version == tp->mac_version) {
3275
			const char *name = info->fw_name;
3276
			int rc;
3277
3278
			rc = request_firmware(&tp->fw, name, &tp->pci_dev->dev);
3279
			if (rc < 0) {
3280
				netif_warn(tp, ifup, tp->dev, "unable to load "
3281
					"firmware patch %s (%d)\n", name, rc);
3282
				goto out_disable_request_firmware;
3283
			}
3284
			goto out;
3285
		}
3286
	}
3287
3288
out_disable_request_firmware:
3289
	tp->fw = NULL;
3290
out:
3291
	return;
3292
}
3293
3255
static int rtl8169_open(struct net_device *dev)
3294
static int rtl8169_open(struct net_device *dev)
3256
{
3295
{
3257
	struct rtl8169_private *tp = netdev_priv(dev);
3296
	struct rtl8169_private *tp = netdev_priv(dev);
Lines 3283-3293 Link Here
3283
3322
3284
	smp_mb();
3323
	smp_mb();
3285
3324
3325
	rtl_request_firmware(tp);
3326
3286
	retval = request_irq(dev->irq, rtl8169_interrupt,
3327
	retval = request_irq(dev->irq, rtl8169_interrupt,
3287
			     (tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED,
3328
			     (tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED,
3288
			     dev->name, dev);
3329
			     dev->name, dev);
3289
	if (retval < 0)
3330
	if (retval < 0)
3290
		goto err_release_ring_2;
3331
		goto err_release_fw_2;
3291
3332
3292
	napi_enable(&tp->napi);
3333
	napi_enable(&tp->napi);
3293
3334
Lines 3313-3319 Link Here
3313
out:
3354
out:
3314
	return retval;
3355
	return retval;
3315
3356
3316
err_release_ring_2:
3357
err_release_fw_2:
3358
	rtl_release_firmware(tp);
3317
	rtl8169_rx_clear(tp);
3359
	rtl8169_rx_clear(tp);
3318
err_free_rx_1:
3360
err_free_rx_1:
3319
	dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray,
3361
	dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray,

Return to bug 361903