Lines 170-175
static const struct {
Link Here
|
170 |
}; |
170 |
}; |
171 |
#undef _R |
171 |
#undef _R |
172 |
|
172 |
|
|
|
173 |
static const struct rtl_firmware_info { |
174 |
int mac_version; |
175 |
const char *fw_name; |
176 |
} rtl_firmware_infos[] = { |
177 |
{ .mac_version = RTL_GIGA_MAC_VER_25, .fw_name = FIRMWARE_8168D_1 }, |
178 |
{ .mac_version = RTL_GIGA_MAC_VER_26, .fw_name = FIRMWARE_8168D_2 }, |
179 |
{ .mac_version = RTL_GIGA_MAC_VER_29, .fw_name = FIRMWARE_8105E_1 }, |
180 |
{ .mac_version = RTL_GIGA_MAC_VER_30, .fw_name = FIRMWARE_8105E_1 } |
181 |
}; |
182 |
|
173 |
enum cfg_version { |
183 |
enum cfg_version { |
174 |
RTL_CFG_0 = 0x00, |
184 |
RTL_CFG_0 = 0x00, |
175 |
RTL_CFG_1, |
185 |
RTL_CFG_1, |
Lines 565-570
struct rtl8169_private {
Link Here
|
565 |
u32 saved_wolopts; |
575 |
u32 saved_wolopts; |
566 |
|
576 |
|
567 |
const struct firmware *fw; |
577 |
const struct firmware *fw; |
|
|
578 |
#define RTL_FIRMWARE_UNKNOWN ERR_PTR(-EAGAIN); |
568 |
}; |
579 |
}; |
569 |
|
580 |
|
570 |
MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>"); |
581 |
MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>"); |
Lines 1789-1813
rtl_phy_write_fw(struct rtl8169_private *tp, const struct firmware *fw)
Link Here
|
1789 |
|
1800 |
|
1790 |
static void rtl_release_firmware(struct rtl8169_private *tp) |
1801 |
static void rtl_release_firmware(struct rtl8169_private *tp) |
1791 |
{ |
1802 |
{ |
1792 |
release_firmware(tp->fw); |
1803 |
if (!IS_ERR_OR_NULL(tp->fw)) |
1793 |
tp->fw = NULL; |
1804 |
release_firmware(tp->fw); |
|
|
1805 |
tp->fw = RTL_FIRMWARE_UNKNOWN; |
1794 |
} |
1806 |
} |
1795 |
|
1807 |
|
1796 |
static int rtl_apply_firmware(struct rtl8169_private *tp, const char *fw_name) |
1808 |
static void rtl_apply_firmware(struct rtl8169_private *tp) |
1797 |
{ |
1809 |
{ |
1798 |
const struct firmware **fw = &tp->fw; |
1810 |
const struct firmware *fw = tp->fw; |
1799 |
int rc = !*fw; |
|
|
1800 |
|
1801 |
if (rc) { |
1802 |
rc = request_firmware(fw, fw_name, &tp->pci_dev->dev); |
1803 |
if (rc < 0) |
1804 |
goto out; |
1805 |
} |
1806 |
|
1811 |
|
1807 |
/* TODO: release firmware once rtl_phy_write_fw signals failures. */ |
1812 |
/* TODO: release firmware once rtl_phy_write_fw signals failures. */ |
1808 |
rtl_phy_write_fw(tp, *fw); |
1813 |
if (!IS_ERR_OR_NULL(fw)) |
1809 |
out: |
1814 |
rtl_phy_write_fw(tp, fw); |
1810 |
return rc; |
1815 |
} |
|
|
1816 |
|
1817 |
static void rtl_apply_firmware_cond(struct rtl8169_private *tp, u8 reg, u16 val) |
1818 |
{ |
1819 |
if (rtl_readphy(tp, reg) != val) |
1820 |
netif_warn(tp, hw, tp->dev, "chipset not ready for firmware\n"); |
1821 |
else |
1822 |
rtl_apply_firmware(tp); |
1811 |
} |
1823 |
} |
1812 |
|
1824 |
|
1813 |
static void rtl8169s_hw_phy_config(struct rtl8169_private *tp) |
1825 |
static void rtl8169s_hw_phy_config(struct rtl8169_private *tp) |
Lines 2246-2255
static void rtl8168d_1_hw_phy_config(struct rtl8169_private *tp)
Link Here
|
2246 |
|
2258 |
|
2247 |
rtl_writephy(tp, 0x1f, 0x0005); |
2259 |
rtl_writephy(tp, 0x1f, 0x0005); |
2248 |
rtl_writephy(tp, 0x05, 0x001b); |
2260 |
rtl_writephy(tp, 0x05, 0x001b); |
2249 |
if ((rtl_readphy(tp, 0x06) != 0xbf00) || |
2261 |
|
2250 |
(rtl_apply_firmware(tp, FIRMWARE_8168D_1) < 0)) { |
2262 |
rtl_apply_firmware_cond(tp, MII_EXPANSION, 0xbf00); |
2251 |
netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n"); |
|
|
2252 |
} |
2253 |
|
2263 |
|
2254 |
rtl_writephy(tp, 0x1f, 0x0000); |
2264 |
rtl_writephy(tp, 0x1f, 0x0000); |
2255 |
} |
2265 |
} |
Lines 2351-2360
static void rtl8168d_2_hw_phy_config(struct rtl8169_private *tp)
Link Here
|
2351 |
|
2361 |
|
2352 |
rtl_writephy(tp, 0x1f, 0x0005); |
2362 |
rtl_writephy(tp, 0x1f, 0x0005); |
2353 |
rtl_writephy(tp, 0x05, 0x001b); |
2363 |
rtl_writephy(tp, 0x05, 0x001b); |
2354 |
if ((rtl_readphy(tp, 0x06) != 0xb300) || |
2364 |
|
2355 |
(rtl_apply_firmware(tp, FIRMWARE_8168D_2) < 0)) { |
2365 |
rtl_apply_firmware_cond(tp, MII_EXPANSION, 0xb300); |
2356 |
netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n"); |
|
|
2357 |
} |
2358 |
|
2366 |
|
2359 |
rtl_writephy(tp, 0x1f, 0x0000); |
2367 |
rtl_writephy(tp, 0x1f, 0x0000); |
2360 |
} |
2368 |
} |
Lines 2474-2481
static void rtl8105e_hw_phy_config(struct rtl8169_private *tp)
Link Here
|
2474 |
rtl_writephy(tp, 0x18, 0x0310); |
2482 |
rtl_writephy(tp, 0x18, 0x0310); |
2475 |
msleep(100); |
2483 |
msleep(100); |
2476 |
|
2484 |
|
2477 |
if (rtl_apply_firmware(tp, FIRMWARE_8105E_1) < 0) |
2485 |
rtl_apply_firmware(tp); |
2478 |
netif_warn(tp, probe, tp->dev, "unable to apply firmware patch\n"); |
|
|
2479 |
|
2486 |
|
2480 |
rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init)); |
2487 |
rtl_writephy_batch(tp, phy_reg_init, ARRAY_SIZE(phy_reg_init)); |
2481 |
} |
2488 |
} |
Lines 3237-3242
rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
Link Here
|
3237 |
tp->timer.data = (unsigned long) dev; |
3244 |
tp->timer.data = (unsigned long) dev; |
3238 |
tp->timer.function = rtl8169_phy_timer; |
3245 |
tp->timer.function = rtl8169_phy_timer; |
3239 |
|
3246 |
|
|
|
3247 |
tp->fw = RTL_FIRMWARE_UNKNOWN; |
3248 |
|
3240 |
rc = register_netdev(dev); |
3249 |
rc = register_netdev(dev); |
3241 |
if (rc < 0) |
3250 |
if (rc < 0) |
3242 |
goto err_out_msi_4; |
3251 |
goto err_out_msi_4; |
Lines 3288-3297
static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
Link Here
|
3288 |
|
3297 |
|
3289 |
cancel_delayed_work_sync(&tp->task); |
3298 |
cancel_delayed_work_sync(&tp->task); |
3290 |
|
3299 |
|
3291 |
rtl_release_firmware(tp); |
|
|
3292 |
|
3293 |
unregister_netdev(dev); |
3300 |
unregister_netdev(dev); |
3294 |
|
3301 |
|
|
|
3302 |
rtl_release_firmware(tp); |
3303 |
|
3295 |
if (pci_dev_run_wake(pdev)) |
3304 |
if (pci_dev_run_wake(pdev)) |
3296 |
pm_runtime_get_noresume(&pdev->dev); |
3305 |
pm_runtime_get_noresume(&pdev->dev); |
3297 |
|
3306 |
|
Lines 3303-3308
static void __devexit rtl8169_remove_one(struct pci_dev *pdev)
Link Here
|
3303 |
pci_set_drvdata(pdev, NULL); |
3312 |
pci_set_drvdata(pdev, NULL); |
3304 |
} |
3313 |
} |
3305 |
|
3314 |
|
|
|
3315 |
static void rtl_request_firmware(struct rtl8169_private *tp) |
3316 |
{ |
3317 |
int i; |
3318 |
|
3319 |
/* Return early if the firmware is already loaded / cached. */ |
3320 |
if (!IS_ERR(tp->fw)) |
3321 |
goto out; |
3322 |
|
3323 |
for (i = 0; i < ARRAY_SIZE(rtl_firmware_infos); i++) { |
3324 |
const struct rtl_firmware_info *info = rtl_firmware_infos + i; |
3325 |
|
3326 |
if (info->mac_version == tp->mac_version) { |
3327 |
const char *name = info->fw_name; |
3328 |
int rc; |
3329 |
|
3330 |
rc = request_firmware(&tp->fw, name, &tp->pci_dev->dev); |
3331 |
if (rc < 0) { |
3332 |
netif_warn(tp, ifup, tp->dev, "unable to load " |
3333 |
"firmware patch %s (%d)\n", name, rc); |
3334 |
goto out_disable_request_firmware; |
3335 |
} |
3336 |
goto out; |
3337 |
} |
3338 |
} |
3339 |
|
3340 |
out_disable_request_firmware: |
3341 |
tp->fw = NULL; |
3342 |
out: |
3343 |
return; |
3344 |
} |
3345 |
|
3306 |
static int rtl8169_open(struct net_device *dev) |
3346 |
static int rtl8169_open(struct net_device *dev) |
3307 |
{ |
3347 |
{ |
3308 |
struct rtl8169_private *tp = netdev_priv(dev); |
3348 |
struct rtl8169_private *tp = netdev_priv(dev); |
Lines 3334-3344
static int rtl8169_open(struct net_device *dev)
Link Here
|
3334 |
|
3374 |
|
3335 |
smp_mb(); |
3375 |
smp_mb(); |
3336 |
|
3376 |
|
|
|
3377 |
rtl_request_firmware(tp); |
3378 |
|
3337 |
retval = request_irq(dev->irq, rtl8169_interrupt, |
3379 |
retval = request_irq(dev->irq, rtl8169_interrupt, |
3338 |
(tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED, |
3380 |
(tp->features & RTL_FEATURE_MSI) ? 0 : IRQF_SHARED, |
3339 |
dev->name, dev); |
3381 |
dev->name, dev); |
3340 |
if (retval < 0) |
3382 |
if (retval < 0) |
3341 |
goto err_release_ring_2; |
3383 |
goto err_release_fw_2; |
3342 |
|
3384 |
|
3343 |
napi_enable(&tp->napi); |
3385 |
napi_enable(&tp->napi); |
3344 |
|
3386 |
|
Lines 3359-3365
static int rtl8169_open(struct net_device *dev)
Link Here
|
3359 |
out: |
3401 |
out: |
3360 |
return retval; |
3402 |
return retval; |
3361 |
|
3403 |
|
3362 |
err_release_ring_2: |
3404 |
err_release_fw_2: |
|
|
3405 |
rtl_release_firmware(tp); |
3363 |
rtl8169_rx_clear(tp); |
3406 |
rtl8169_rx_clear(tp); |
3364 |
err_free_rx_1: |
3407 |
err_free_rx_1: |
3365 |
dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray, |
3408 |
dma_free_coherent(&pdev->dev, R8169_RX_RING_BYTES, tp->RxDescArray, |