|
Kyle McMartin |
f8e3fe8 |
Skge devices installed on some Gigabyte motherboards are not able to
|
|
Kyle McMartin |
f8e3fe8 |
perform 64 dma correctly due to board PCI implementation, so limit
|
|
Kyle McMartin |
f8e3fe8 |
DMA to 32bit if such boards are detected.
|
|
Kyle McMartin |
f8e3fe8 |
|
|
Kyle McMartin |
f8e3fe8 |
Bug was reported here:
|
|
Kyle McMartin |
f8e3fe8 |
https://bugzilla.redhat.com/show_bug.cgi?id=447489
|
|
Kyle McMartin |
f8e3fe8 |
|
|
Kyle McMartin |
f8e3fe8 |
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
|
|
Kyle McMartin |
f8e3fe8 |
Tested-by: Luya Tshimbalanga <luya@fedoraproject.org>
|
|
Kyle McMartin |
f8e3fe8 |
---
|
|
Kyle McMartin |
f8e3fe8 |
drivers/net/skge.c | 22 +++++++++++++++++++++-
|
|
Kyle McMartin |
f8e3fe8 |
1 files changed, 21 insertions(+), 1 deletions(-)
|
|
Kyle McMartin |
f8e3fe8 |
|
|
Kyle McMartin |
f8e3fe8 |
diff --git a/drivers/net/skge.c b/drivers/net/skge.c
|
|
Kyle McMartin |
f8e3fe8 |
index a8a6358..571d4c3 100644
|
|
Kyle McMartin |
f8e3fe8 |
--- a/drivers/net/skge.c
|
|
Kyle McMartin |
f8e3fe8 |
+++ b/drivers/net/skge.c
|
|
Kyle McMartin |
f8e3fe8 |
@@ -43,5 +43,6 @@
|
|
Kyle McMartin |
f8e3fe8 |
#include <linux/seq_file.h>
|
|
Kyle McMartin |
f8e3fe8 |
#include <linux/mii.h>
|
|
Kyle McMartin |
f8e3fe8 |
+#include <linux/dmi.h>
|
|
Kyle McMartin |
f8e3fe8 |
#include <asm/irq.h>
|
|
Kyle McMartin |
f8e3fe8 |
|
|
Kyle McMartin |
f8e3fe8 |
#include "skge.h"
|
|
Kyle McMartin |
f8e3fe8 |
@@ -3869,6 +3870,8 @@ static void __devinit skge_show_addr(struct net_device *dev)
|
|
Kyle McMartin |
f8e3fe8 |
netif_info(skge, probe, skge->netdev, "addr %pM\n", dev->dev_addr);
|
|
Kyle McMartin |
f8e3fe8 |
}
|
|
Kyle McMartin |
f8e3fe8 |
|
|
Kyle McMartin |
f8e3fe8 |
+static int only_32bit_dma;
|
|
Kyle McMartin |
f8e3fe8 |
+
|
|
Kyle McMartin |
f8e3fe8 |
static int __devinit skge_probe(struct pci_dev *pdev,
|
|
Kyle McMartin |
f8e3fe8 |
const struct pci_device_id *ent)
|
|
Kyle McMartin |
f8e3fe8 |
{
|
|
Kyle McMartin |
f8e3fe8 |
@@ -3890,7 +3893,7 @@ static int __devinit skge_probe(struct pci_dev *pdev,
|
|
Kyle McMartin |
f8e3fe8 |
|
|
Kyle McMartin |
f8e3fe8 |
pci_set_master(pdev);
|
|
Kyle McMartin |
f8e3fe8 |
|
|
Kyle McMartin |
f8e3fe8 |
- if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
|
|
Kyle McMartin |
f8e3fe8 |
+ if (!only_32bit_dma && !pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
|
|
Kyle McMartin |
f8e3fe8 |
using_dac = 1;
|
|
Kyle McMartin |
f8e3fe8 |
err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64));
|
|
Kyle McMartin |
f8e3fe8 |
} else if (!(err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32)))) {
|
|
Kyle McMartin |
f8e3fe8 |
@@ -4148,8 +4151,25 @@ static struct pci_driver skge_driver = {
|
|
Kyle McMartin |
f8e3fe8 |
.shutdown = skge_shutdown,
|
|
Kyle McMartin |
f8e3fe8 |
};
|
|
Kyle McMartin |
f8e3fe8 |
|
|
Kyle McMartin |
f8e3fe8 |
+#ifndef CONFIG_DMI
|
|
Kyle McMartin |
f8e3fe8 |
+#warning "DMA quirk for Gigabyte nForce boards will not be applied"
|
|
Kyle McMartin |
f8e3fe8 |
+#endif
|
|
Kyle McMartin |
f8e3fe8 |
+
|
|
Kyle McMartin |
f8e3fe8 |
+static struct dmi_system_id skge_32bit_dma_boards[] = {
|
|
Kyle McMartin |
f8e3fe8 |
+ {
|
|
Kyle McMartin |
f8e3fe8 |
+ .ident = "Gigabyte nForce boards",
|
|
Kyle McMartin |
f8e3fe8 |
+ .matches = {
|
|
Kyle McMartin |
f8e3fe8 |
+ DMI_MATCH(DMI_BOARD_VENDOR, "Gigabyte Technology Co"),
|
|
Kyle McMartin |
f8e3fe8 |
+ DMI_MATCH(DMI_BOARD_NAME, "nForce"),
|
|
Kyle McMartin |
f8e3fe8 |
+ },
|
|
Kyle McMartin |
f8e3fe8 |
+ },
|
|
Kyle McMartin |
f8e3fe8 |
+ {}
|
|
Kyle McMartin |
f8e3fe8 |
+};
|
|
Kyle McMartin |
f8e3fe8 |
+
|
|
Kyle McMartin |
f8e3fe8 |
static int __init skge_init_module(void)
|
|
Kyle McMartin |
f8e3fe8 |
{
|
|
Kyle McMartin |
f8e3fe8 |
+ if (dmi_check_system(skge_32bit_dma_boards))
|
|
Kyle McMartin |
f8e3fe8 |
+ only_32bit_dma = 1;
|
|
Kyle McMartin |
f8e3fe8 |
skge_debug_init();
|
|
Kyle McMartin |
f8e3fe8 |
return pci_register_driver(&skge_driver);
|
|
Kyle McMartin |
f8e3fe8 |
}
|
|
Kyle McMartin |
f8e3fe8 |
--
|
|
Kyle McMartin |
f8e3fe8 |
1.5.5.6
|