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