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, |