--- /dev/null
+From 8a745b9d91962991ce87a649a4dc3af3206c2c8b Mon Sep 17 00:00:00 2001
+From: Karsten Keil <keil@b1-systems.de>
+Date: Tue, 2 Jun 2009 14:57:35 +0200
+Subject: ISDN: Fix DMA alloc for hfcpci
+
+From: Karsten Keil <keil@b1-systems.de>
+
+commit 8a745b9d91962991ce87a649a4dc3af3206c2c8b upstream.
+
+Replace wrong code with correct DMA API functions.
+
+Signed-off-by: Karsten Keil <keil@b1-systems.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/isdn/hisax/hfc_pci.c | 41 ++++++++++++++++++++++++++++++-----------
+ drivers/isdn/hisax/hisax.h | 2 +-
+ 2 files changed, 31 insertions(+), 12 deletions(-)
+
+--- a/drivers/isdn/hisax/hfc_pci.c
++++ b/drivers/isdn/hisax/hfc_pci.c
+@@ -82,8 +82,9 @@ release_io_hfcpci(struct IsdnCardState *
+ Write_hfc(cs, HFCPCI_INT_M2, cs->hw.hfcpci.int_m2);
+ pci_write_config_word(cs->hw.hfcpci.dev, PCI_COMMAND, 0); /* disable memory mapped ports + busmaster */
+ del_timer(&cs->hw.hfcpci.timer);
+- kfree(cs->hw.hfcpci.share_start);
+- cs->hw.hfcpci.share_start = NULL;
++ pci_free_consistent(cs->hw.hfcpci.dev, 0x8000,
++ cs->hw.hfcpci.fifos, cs->hw.hfcpci.dma);
++ cs->hw.hfcpci.fifos = NULL;
+ iounmap((void *)cs->hw.hfcpci.pci_io);
+ }
+
+@@ -1663,8 +1664,19 @@ setup_hfcpci(struct IsdnCard *card)
+ dev_hfcpci);
+ i++;
+ if (tmp_hfcpci) {
++ dma_addr_t dma_mask = DMA_BIT_MASK(32) & ~0x7fffUL;
+ if (pci_enable_device(tmp_hfcpci))
+ continue;
++ if (pci_set_dma_mask(tmp_hfcpci, dma_mask)) {
++ printk(KERN_WARNING
++ "HiSax hfc_pci: No suitable DMA available.\n");
++ continue;
++ }
++ if (pci_set_consistent_dma_mask(tmp_hfcpci, dma_mask)) {
++ printk(KERN_WARNING
++ "HiSax hfc_pci: No suitable consistent DMA available.\n");
++ continue;
++ }
+ pci_set_master(tmp_hfcpci);
+ if ((card->para[0]) && (card->para[0] != (tmp_hfcpci->resource[ 0].start & PCI_BASE_ADDRESS_IO_MASK)))
+ continue;
+@@ -1693,22 +1705,29 @@ setup_hfcpci(struct IsdnCard *card)
+ printk(KERN_WARNING "HFC-PCI: No IO-Mem for PCI card found\n");
+ return (0);
+ }
++
+ /* Allocate memory for FIFOS */
+- /* Because the HFC-PCI needs a 32K physical alignment, we */
+- /* need to allocate the double mem and align the address */
+- if (!(cs->hw.hfcpci.share_start = kmalloc(65536, GFP_KERNEL))) {
+- printk(KERN_WARNING "HFC-PCI: Error allocating memory for FIFO!\n");
++ cs->hw.hfcpci.fifos = pci_alloc_consistent(cs->hw.hfcpci.dev,
++ 0x8000, &cs->hw.hfcpci.dma);
++ if (!cs->hw.hfcpci.fifos) {
++ printk(KERN_WARNING "HFC-PCI: Error allocating FIFO memory!\n");
++ return 0;
++ }
++ if (cs->hw.hfcpci.dma & 0x7fff) {
++ printk(KERN_WARNING
++ "HFC-PCI: Error DMA memory not on 32K boundary (%lx)\n",
++ (u_long)cs->hw.hfcpci.dma);
++ pci_free_consistent(cs->hw.hfcpci.dev, 0x8000,
++ cs->hw.hfcpci.fifos, cs->hw.hfcpci.dma);
+ return 0;
+ }
+- cs->hw.hfcpci.fifos = (void *)
+- (((ulong) cs->hw.hfcpci.share_start) & ~0x7FFF) + 0x8000;
+- pci_write_config_dword(cs->hw.hfcpci.dev, 0x80, (u_int) virt_to_bus(cs->hw.hfcpci.fifos));
++ pci_write_config_dword(cs->hw.hfcpci.dev, 0x80, (u32)cs->hw.hfcpci.dma);
+ cs->hw.hfcpci.pci_io = ioremap((ulong) cs->hw.hfcpci.pci_io, 256);
+ printk(KERN_INFO
+- "HFC-PCI: defined at mem %p fifo %p(%#x) IRQ %d HZ %d\n",
++ "HFC-PCI: defined at mem %p fifo %p(%lx) IRQ %d HZ %d\n",
+ cs->hw.hfcpci.pci_io,
+ cs->hw.hfcpci.fifos,
+- (u_int) virt_to_bus(cs->hw.hfcpci.fifos),
++ (u_long)cs->hw.hfcpci.dma,
+ cs->irq, HZ);
+
+ spin_lock_irqsave(&cs->lock, flags);
+--- a/drivers/isdn/hisax/hisax.h
++++ b/drivers/isdn/hisax/hisax.h
+@@ -694,7 +694,7 @@ struct hfcPCI_hw {
+ int nt_timer;
+ struct pci_dev *dev;
+ unsigned char *pci_io; /* start of PCI IO memory */
+- void *share_start; /* shared memory for Fifos start */
++ dma_addr_t dma; /* dma handle for Fifos */
+ void *fifos; /* FIFO memory */
+ int last_bfifo_cnt[2]; /* marker saving last b-fifo frame count */
+ struct timer_list timer;
--- /dev/null
+From 4a4aca641bc4598e77b866804f47c651ec4a764d Mon Sep 17 00:00:00 2001
+From: Jean Delvare <jdelvare@suse.de>
+Date: Fri, 5 Jun 2009 12:02:38 +0200
+Subject: x86: Add quirk for reboot stalls on a Dell Optiplex 360
+
+From: Jean Delvare <jdelvare@suse.de>
+
+commit 4a4aca641bc4598e77b866804f47c651ec4a764d upstream.
+
+The Dell Optiplex 360 hangs on reboot, just like the Optiplex 330, so
+the same quirk is needed.
+
+Signed-off-by: Jean Delvare <jdelvare@suse.de>
+Cc: Steve Conklin <steve.conklin@canonical.com>
+Cc: Leann Ogasawara <leann.ogasawara@canonical.com>
+LKML-Reference: <200906051202.38311.jdelvare@suse.de>
+Signed-off-by: Ingo Molnar <mingo@elte.hu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ arch/x86/kernel/reboot.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+--- a/arch/x86/kernel/reboot.c
++++ b/arch/x86/kernel/reboot.c
+@@ -169,6 +169,15 @@ static struct dmi_system_id __initdata r
+ DMI_MATCH(DMI_BOARD_NAME, "0KW626"),
+ },
+ },
++ { /* Handle problems with rebooting on Dell Optiplex 360 with 0T656F */
++ .callback = set_bios_reboot,
++ .ident = "Dell OptiPlex 360",
++ .matches = {
++ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
++ DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 360"),
++ DMI_MATCH(DMI_BOARD_NAME, "0T656F"),
++ },
++ },
+ { /* Handle problems with rebooting on Dell 2400's */
+ .callback = set_bios_reboot,
+ .ident = "Dell PowerEdge 2400",
--- /dev/null
+From 093bac154c142fa1fb31a3ac69ae1bc08930231b Mon Sep 17 00:00:00 2001
+From: Steve Conklin <sconklin@canonical.com>
+Date: Fri, 14 Nov 2008 00:55:51 -0600
+Subject: x86: quirk for reboot stalls on a Dell Optiplex 330
+
+From: Steve Conklin <sconklin@canonical.com>
+
+commit 093bac154c142fa1fb31a3ac69ae1bc08930231b upstream.
+
+Dell Optiplex 330 appears to hang on reboot. This is resolved by adding
+a quirk to set bios reboot.
+
+Signed-off-by: Leann Ogasawara <leann.ogasawara@canonical.com>
+Signed-off-by: Steve Conklin <steve.conklin@canonical.com>
+Signed-off-by: Ingo Molnar <mingo@elte.hu>
+Cc: Jean Delvare <khali@linux-fr.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ arch/x86/kernel/reboot.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+--- a/arch/x86/kernel/reboot.c
++++ b/arch/x86/kernel/reboot.c
+@@ -178,6 +178,15 @@ static struct dmi_system_id __initdata r
+ DMI_MATCH(DMI_BOARD_NAME, "0T656F"),
+ },
+ },
++ { /* Handle problems with rebooting on Dell Optiplex 330 with 0KP561 */
++ .callback = set_bios_reboot,
++ .ident = "Dell OptiPlex 330",
++ .matches = {
++ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
++ DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 330"),
++ DMI_MATCH(DMI_BOARD_NAME, "0KP561"),
++ },
++ },
+ { /* Handle problems with rebooting on Dell 2400's */
+ .callback = set_bios_reboot,
+ .ident = "Dell PowerEdge 2400",