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