| From 392bd0cb000d4aac9e88e4f50823db85e7220688 Mon Sep 17 00:00:00 2001 |
| From: Stanislaw Gruszka <sgruszka@redhat.com> |
| Date: Tue, 5 Oct 2010 15:11:40 -0700 |
| Subject: skge: add quirk to limit DMA |
| |
| From: Stanislaw Gruszka <sgruszka@redhat.com> |
| |
| commit 392bd0cb000d4aac9e88e4f50823db85e7220688 upstream. |
| |
| 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> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/net/skge.c | 18 +++++++++++++++++- |
| 1 file changed, 17 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/net/skge.c |
| +++ b/drivers/net/skge.c |
| @@ -43,6 +43,7 @@ |
| #include <linux/seq_file.h> |
| #include <linux/mii.h> |
| #include <linux/slab.h> |
| +#include <linux/dmi.h> |
| #include <asm/irq.h> |
| |
| #include "skge.h" |
| @@ -3868,6 +3869,8 @@ static void __devinit skge_show_addr(str |
| 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) |
| { |
| @@ -3889,7 +3892,7 @@ static int __devinit skge_probe(struct p |
| |
| 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)))) { |
| @@ -4147,8 +4150,21 @@ static struct pci_driver skge_driver = { |
| .shutdown = skge_shutdown, |
| }; |
| |
| +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); |
| } |