Bugzilla – Attachment 116115 Details for
Bug 214931
sound on VIA audio controller often repeating
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Forgot Password
[patch]
Fix VIA quirks breakage (v2)
via-quirk-fix-2.patch (text/plain), 4.42 KB, created by
Jean Delvare
on 2007-01-30 10:10:53 UTC
(
hide
)
Description:
Fix VIA quirks breakage (v2)
Filename:
MIME Type:
Creator:
Jean Delvare
Created:
2007-01-30 10:10:53 UTC
Size:
4.42 KB
patch
obsolete
>From: Jean Delvare <jdelvare@suse.de> >Subject: Fix VIA quirks breakage (again) >References: 214931 > >Fix VIA quirks that were recently broken by Alan Cox in the upstream >kernel (commit 1597cacbe39802d86656d1f2e6329895bd2ef531). > >My understanding is that pci_find_present() doesn't work yet at the >time the quirks are run. So I used a two-step quirk as is done for >some other quirks already. First we detect the VIA south bridges >and set the right low and high device limits, then we are ready to >actually run the quirks on the affected devices. > >Signed-off-by: Jean Delvare <jdelvare@suse.de> >--- > drivers/pci/quirks.c | 78 ++++++++++++++++++++++++++------------------------ > 1 files changed, 42 insertions(+), 36 deletions(-) > >--- linux-2.6.20-rc6.orig/drivers/pci/quirks.c 2007-01-26 09:08:14.000000000 +0100 >+++ linux-2.6.20-rc6/drivers/pci/quirks.c 2007-01-29 15:33:30.000000000 +0100 >@@ -654,19 +654,40 @@ > * VIA bridges which have VLink > */ > >-static const struct pci_device_id via_vlink_fixup_tbl[] = { >- /* Internal devices need IRQ line routing, pre VLink */ >- { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_82C686), 0 }, >- { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_8231), 17 }, >- /* Devices with VLink */ >- { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_8233_0), 17}, >- { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_8233A), 17 }, >- { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_8233C_0), 17 }, >- { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_8235), 16 }, >- { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_8237), 15 }, >- { PCI_VDEVICE(VIA, PCI_DEVICE_ID_VIA_8237A), 15 }, >- { 0, }, >-}; >+static int via_vlink_dev_lo = -1, via_vlink_dev_hi = 18; >+ >+static void quirk_via_bridge(struct pci_dev *dev) >+{ >+ /* See what bridge we have and find the device ranges */ >+ switch (dev->device) { >+ case PCI_DEVICE_ID_VIA_82C686: >+ /* 82C686 is special */ >+ via_vlink_dev_lo = 7; >+ via_vlink_dev_hi = 7; >+ break; >+ case PCI_DEVICE_ID_VIA_8237: >+ case PCI_DEVICE_ID_VIA_8237A: >+ via_vlink_dev_lo = 15; >+ break; >+ case PCI_DEVICE_ID_VIA_8235: >+ via_vlink_dev_lo = 16; >+ break; >+ case PCI_DEVICE_ID_VIA_8231: >+ case PCI_DEVICE_ID_VIA_8233_0: >+ case PCI_DEVICE_ID_VIA_8233A: >+ case PCI_DEVICE_ID_VIA_8233C_0: >+ via_vlink_dev_lo = 17; >+ break; >+ } >+} >+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, quirk_via_bridge); >+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8231, quirk_via_bridge); >+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8233_0, quirk_via_bridge); >+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8233A, quirk_via_bridge); >+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8233C_0, quirk_via_bridge); >+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, quirk_via_bridge); >+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, quirk_via_bridge); >+DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237A, quirk_via_bridge); > > /** > * quirk_via_vlink - VIA VLink IRQ number update >@@ -675,35 +696,20 @@ > * If the device we are dealing with is on a PIC IRQ we need to > * ensure that the IRQ line register which usually is not relevant > * for PCI cards, is actually written so that interrupts get sent >- * to the right place >+ * to the right place. >+ * We only do this on systems where a VIA south bridge was detected, >+ * and only for VIA devices on the motherboard (see quirk_via_bridge >+ * above). > */ > > static void quirk_via_vlink(struct pci_dev *dev) > { >- const struct pci_device_id *via_vlink_fixup; >- static int dev_lo = -1, dev_hi = 18; > u8 irq, new_irq; > >- /* Check if we have VLink and cache the result */ >- >- /* Checked already - no */ >- if (dev_lo == -2) >+ /* Check if we have VLink at all */ >+ if (via_vlink_dev_lo == -1) > return; > >- /* Not checked - see what bridge we have and find the device >- ranges */ >- >- if (dev_lo == -1) { >- via_vlink_fixup = pci_find_present(via_vlink_fixup_tbl); >- if (via_vlink_fixup == NULL) { >- dev_lo = -2; >- return; >- } >- dev_lo = via_vlink_fixup->driver_data; >- /* 82C686 is special - 0/0 */ >- if (dev_lo == 0) >- dev_hi = 0; >- } > new_irq = dev->irq; > > /* Don't quirk interrupts outside the legacy IRQ range */ >@@ -711,8 +717,8 @@ > return; > > /* Internal device ? */ >- if (dev->bus->number != 0 || PCI_SLOT(dev->devfn) > dev_hi || >- PCI_SLOT(dev->devfn) < dev_lo) >+ if (dev->bus->number != 0 || PCI_SLOT(dev->devfn) > via_vlink_dev_hi || >+ PCI_SLOT(dev->devfn) < via_vlink_dev_lo) > return; > > /* This is an internal VLink device on a PIC interrupt. The BIOS
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
Actions:
View
|
Diff
Attachments on
bug 214931
:
102582
|
102588
|
114657
|
114809
|
115902
|
116115
|
116184