diff options
Diffstat (limited to 'skge-quirk-to-4gb-dma.patch')
-rw-r--r-- | skge-quirk-to-4gb-dma.patch | 70 |
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 |