diff options
Diffstat (limited to 'drivers')
87 files changed, 537 insertions, 490 deletions
diff --git a/drivers/acpi/events/evmisc.c b/drivers/acpi/events/evmisc.c index 8dcade63b04b..3a799b9b5df5 100644 --- a/drivers/acpi/events/evmisc.c +++ b/drivers/acpi/events/evmisc.c | |||
@@ -549,7 +549,7 @@ acpi_status acpi_ev_release_global_lock(void) | |||
549 | acpi_gbl_global_lock_acquired = FALSE; | 549 | acpi_gbl_global_lock_acquired = FALSE; |
550 | 550 | ||
551 | /* Release the local GL mutex */ | 551 | /* Release the local GL mutex */ |
552 | acpi_ev_global_lock_thread_id = 0; | 552 | acpi_ev_global_lock_thread_id = NULL; |
553 | acpi_ev_global_lock_acquired = 0; | 553 | acpi_ev_global_lock_acquired = 0; |
554 | acpi_os_release_mutex(acpi_gbl_global_lock_mutex); | 554 | acpi_os_release_mutex(acpi_gbl_global_lock_mutex); |
555 | return_ACPI_STATUS(status); | 555 | return_ACPI_STATUS(status); |
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig index d16b5b0c8b76..7bdbe5a914d0 100644 --- a/drivers/ata/Kconfig +++ b/drivers/ata/Kconfig | |||
@@ -564,7 +564,7 @@ config PATA_IXP4XX_CF | |||
564 | 564 | ||
565 | config PATA_SCC | 565 | config PATA_SCC |
566 | tristate "Toshiba's Cell Reference Set IDE support" | 566 | tristate "Toshiba's Cell Reference Set IDE support" |
567 | depends on PCI && PPC_IBM_CELL_BLADE | 567 | depends on PCI && PPC_CELLEB |
568 | help | 568 | help |
569 | This option enables support for the built-in IDE controller on | 569 | This option enables support for the built-in IDE controller on |
570 | Toshiba Cell Reference Board. | 570 | Toshiba Cell Reference Board. |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 3c1f8830ac8b..bf327d473ce9 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -826,7 +826,7 @@ static u64 ata_id_n_sectors(const u16 *id) | |||
826 | /** | 826 | /** |
827 | * ata_id_to_dma_mode - Identify DMA mode from id block | 827 | * ata_id_to_dma_mode - Identify DMA mode from id block |
828 | * @dev: device to identify | 828 | * @dev: device to identify |
829 | * @mode: mode to assume if we cannot tell | 829 | * @unknown: mode to assume if we cannot tell |
830 | * | 830 | * |
831 | * Set up the timing values for the device based upon the identify | 831 | * Set up the timing values for the device based upon the identify |
832 | * reported values for the DMA mode. This function is used by drivers | 832 | * reported values for the DMA mode. This function is used by drivers |
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 7349c3dbf774..361953a50203 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
@@ -1625,8 +1625,14 @@ static int ata_eh_reset(struct ata_port *ap, int classify, | |||
1625 | rc = prereset(ap); | 1625 | rc = prereset(ap); |
1626 | if (rc) { | 1626 | if (rc) { |
1627 | if (rc == -ENOENT) { | 1627 | if (rc == -ENOENT) { |
1628 | ata_port_printk(ap, KERN_DEBUG, "port disabled. ignoring.\n"); | 1628 | ata_port_printk(ap, KERN_DEBUG, |
1629 | "port disabled. ignoring.\n"); | ||
1629 | ap->eh_context.i.action &= ~ATA_EH_RESET_MASK; | 1630 | ap->eh_context.i.action &= ~ATA_EH_RESET_MASK; |
1631 | |||
1632 | for (i = 0; i < ATA_MAX_DEVICES; i++) | ||
1633 | classes[i] = ATA_DEV_NONE; | ||
1634 | |||
1635 | rc = 0; | ||
1630 | } else | 1636 | } else |
1631 | ata_port_printk(ap, KERN_ERR, | 1637 | ata_port_printk(ap, KERN_ERR, |
1632 | "prereset failed (errno=%d)\n", rc); | 1638 | "prereset failed (errno=%d)\n", rc); |
diff --git a/drivers/ata/pata_cs5520.c b/drivers/ata/pata_cs5520.c index 7ef834250a43..55cc293e7487 100644 --- a/drivers/ata/pata_cs5520.c +++ b/drivers/ata/pata_cs5520.c | |||
@@ -208,7 +208,7 @@ static struct ata_port_operations cs5520_port_ops = { | |||
208 | static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 208 | static int __devinit cs5520_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
209 | { | 209 | { |
210 | u8 pcicfg; | 210 | u8 pcicfg; |
211 | void *iomap[5]; | 211 | void __iomem *iomap[5]; |
212 | static struct ata_probe_ent probe[2]; | 212 | static struct ata_probe_ent probe[2]; |
213 | int ports = 0; | 213 | int ports = 0; |
214 | 214 | ||
diff --git a/drivers/ata/pata_ixp4xx_cf.c b/drivers/ata/pata_ixp4xx_cf.c index 9a0523b5c947..c6f0e1927551 100644 --- a/drivers/ata/pata_ixp4xx_cf.c +++ b/drivers/ata/pata_ixp4xx_cf.c | |||
@@ -193,7 +193,7 @@ static __devinit int ixp4xx_pata_probe(struct platform_device *pdev) | |||
193 | 193 | ||
194 | irq = platform_get_irq(pdev, 0); | 194 | irq = platform_get_irq(pdev, 0); |
195 | if (irq) | 195 | if (irq) |
196 | set_irq_type(irq, IRQT_HIGH); | 196 | set_irq_type(irq, IRQT_RISING); |
197 | 197 | ||
198 | /* Setup expansion bus chip selects */ | 198 | /* Setup expansion bus chip selects */ |
199 | *data->cs0_cfg = data->cs0_bits; | 199 | *data->cs0_cfg = data->cs0_bits; |
@@ -232,7 +232,6 @@ static __devexit int ixp4xx_pata_remove(struct platform_device *dev) | |||
232 | struct ata_host *host = platform_get_drvdata(dev); | 232 | struct ata_host *host = platform_get_drvdata(dev); |
233 | 233 | ||
234 | ata_host_detach(host); | 234 | ata_host_detach(host); |
235 | platform_set_drvdata(dev, NULL); | ||
236 | 235 | ||
237 | return 0; | 236 | return 0; |
238 | } | 237 | } |
diff --git a/drivers/ata/pata_mpc52xx.c b/drivers/ata/pata_mpc52xx.c index f5d88729ca79..882c36eaf293 100644 --- a/drivers/ata/pata_mpc52xx.c +++ b/drivers/ata/pata_mpc52xx.c | |||
@@ -329,7 +329,7 @@ mpc52xx_ata_init_one(struct device *dev, struct mpc52xx_ata_priv *priv) | |||
329 | ae->dev = dev; | 329 | ae->dev = dev; |
330 | ae->irq = priv->ata_irq; | 330 | ae->irq = priv->ata_irq; |
331 | 331 | ||
332 | aio->cmd_addr = 0; /* Don't have a classic reg block */ | 332 | aio->cmd_addr = NULL; /* Don't have a classic reg block */ |
333 | aio->altstatus_addr = &priv->ata_regs->tf_control; | 333 | aio->altstatus_addr = &priv->ata_regs->tf_control; |
334 | aio->ctl_addr = &priv->ata_regs->tf_control; | 334 | aio->ctl_addr = &priv->ata_regs->tf_control; |
335 | aio->data_addr = &priv->ata_regs->tf_data; | 335 | aio->data_addr = &priv->ata_regs->tf_data; |
diff --git a/drivers/ata/sata_inic162x.c b/drivers/ata/sata_inic162x.c index 3193a603d1a1..1e21688bfcf2 100644 --- a/drivers/ata/sata_inic162x.c +++ b/drivers/ata/sata_inic162x.c | |||
@@ -672,10 +672,6 @@ static int inic_init_one(struct pci_dev *pdev, const struct pci_device_id *ent) | |||
672 | if (rc) | 672 | if (rc) |
673 | return rc; | 673 | return rc; |
674 | 674 | ||
675 | rc = pci_request_regions(pdev, DRV_NAME); | ||
676 | if (rc) | ||
677 | return rc; | ||
678 | |||
679 | rc = pcim_iomap_regions(pdev, 0x3f, DRV_NAME); | 675 | rc = pcim_iomap_regions(pdev, 0x3f, DRV_NAME); |
680 | if (rc) | 676 | if (rc) |
681 | return rc; | 677 | return rc; |
diff --git a/drivers/ata/sata_sil24.c b/drivers/ata/sata_sil24.c index 75d961599651..5614df8c1ce2 100644 --- a/drivers/ata/sata_sil24.c +++ b/drivers/ata/sata_sil24.c | |||
@@ -346,6 +346,7 @@ static const struct pci_device_id sil24_pci_tbl[] = { | |||
346 | { PCI_VDEVICE(CMD, 0x3124), BID_SIL3124 }, | 346 | { PCI_VDEVICE(CMD, 0x3124), BID_SIL3124 }, |
347 | { PCI_VDEVICE(INTEL, 0x3124), BID_SIL3124 }, | 347 | { PCI_VDEVICE(INTEL, 0x3124), BID_SIL3124 }, |
348 | { PCI_VDEVICE(CMD, 0x3132), BID_SIL3132 }, | 348 | { PCI_VDEVICE(CMD, 0x3132), BID_SIL3132 }, |
349 | { PCI_VDEVICE(CMD, 0x0242), BID_SIL3132 }, | ||
349 | { PCI_VDEVICE(CMD, 0x3131), BID_SIL3131 }, | 350 | { PCI_VDEVICE(CMD, 0x3131), BID_SIL3131 }, |
350 | { PCI_VDEVICE(CMD, 0x3531), BID_SIL3131 }, | 351 | { PCI_VDEVICE(CMD, 0x3531), BID_SIL3131 }, |
351 | 352 | ||
diff --git a/drivers/ata/sata_sis.c b/drivers/ata/sata_sis.c index 1879e0cd56aa..a787f0d4a5ba 100644 --- a/drivers/ata/sata_sis.c +++ b/drivers/ata/sata_sis.c | |||
@@ -354,7 +354,7 @@ static int sis_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) | |||
354 | return -ENOMEM; | 354 | return -ENOMEM; |
355 | 355 | ||
356 | if (!(probe_ent->port_flags & SIS_FLAG_CFGSCR)) { | 356 | if (!(probe_ent->port_flags & SIS_FLAG_CFGSCR)) { |
357 | void *mmio; | 357 | void __iomem *mmio; |
358 | 358 | ||
359 | mmio = pcim_iomap(pdev, SIS_SCR_PCI_BAR, 0); | 359 | mmio = pcim_iomap(pdev, SIS_SCR_PCI_BAR, 0); |
360 | if (!mmio) | 360 | if (!mmio) |
diff --git a/drivers/atm/zatm.c b/drivers/atm/zatm.c index 0d7091e2077f..2ad2527cf5b3 100644 --- a/drivers/atm/zatm.c +++ b/drivers/atm/zatm.c | |||
@@ -1177,7 +1177,7 @@ static void __devinit eprom_get_esi(struct atm_dev *dev) | |||
1177 | /*--------------------------------- entries ---------------------------------*/ | 1177 | /*--------------------------------- entries ---------------------------------*/ |
1178 | 1178 | ||
1179 | 1179 | ||
1180 | static int __init zatm_init(struct atm_dev *dev) | 1180 | static int __devinit zatm_init(struct atm_dev *dev) |
1181 | { | 1181 | { |
1182 | struct zatm_dev *zatm_dev; | 1182 | struct zatm_dev *zatm_dev; |
1183 | struct pci_dev *pci_dev; | 1183 | struct pci_dev *pci_dev; |
@@ -1256,7 +1256,7 @@ static int __init zatm_init(struct atm_dev *dev) | |||
1256 | } | 1256 | } |
1257 | 1257 | ||
1258 | 1258 | ||
1259 | static int __init zatm_start(struct atm_dev *dev) | 1259 | static int __devinit zatm_start(struct atm_dev *dev) |
1260 | { | 1260 | { |
1261 | struct zatm_dev *zatm_dev = ZATM_DEV(dev); | 1261 | struct zatm_dev *zatm_dev = ZATM_DEV(dev); |
1262 | struct pci_dev *pdev = zatm_dev->pci_dev; | 1262 | struct pci_dev *pdev = zatm_dev->pci_dev; |
diff --git a/drivers/base/core.c b/drivers/base/core.c index f191afe62b4d..ad0f4a2f25c4 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
@@ -407,6 +407,35 @@ void device_remove_bin_file(struct device *dev, struct bin_attribute *attr) | |||
407 | } | 407 | } |
408 | EXPORT_SYMBOL_GPL(device_remove_bin_file); | 408 | EXPORT_SYMBOL_GPL(device_remove_bin_file); |
409 | 409 | ||
410 | /** | ||
411 | * device_schedule_callback - helper to schedule a callback for a device | ||
412 | * @dev: device. | ||
413 | * @func: callback function to invoke later. | ||
414 | * | ||
415 | * Attribute methods must not unregister themselves or their parent device | ||
416 | * (which would amount to the same thing). Attempts to do so will deadlock, | ||
417 | * since unregistration is mutually exclusive with driver callbacks. | ||
418 | * | ||
419 | * Instead methods can call this routine, which will attempt to allocate | ||
420 | * and schedule a workqueue request to call back @func with @dev as its | ||
421 | * argument in the workqueue's process context. @dev will be pinned until | ||
422 | * @func returns. | ||
423 | * | ||
424 | * Returns 0 if the request was submitted, -ENOMEM if storage could not | ||
425 | * be allocated. | ||
426 | * | ||
427 | * NOTE: This routine won't work if CONFIG_SYSFS isn't set! It uses an | ||
428 | * underlying sysfs routine (since it is intended for use by attribute | ||
429 | * methods), and if sysfs isn't available you'll get nothing but -ENOSYS. | ||
430 | */ | ||
431 | int device_schedule_callback(struct device *dev, | ||
432 | void (*func)(struct device *)) | ||
433 | { | ||
434 | return sysfs_schedule_callback(&dev->kobj, | ||
435 | (void (*)(void *)) func, dev); | ||
436 | } | ||
437 | EXPORT_SYMBOL_GPL(device_schedule_callback); | ||
438 | |||
410 | static void klist_children_get(struct klist_node *n) | 439 | static void klist_children_get(struct klist_node *n) |
411 | { | 440 | { |
412 | struct device *dev = container_of(n, struct device, knode_parent); | 441 | struct device *dev = container_of(n, struct device, knode_parent); |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 0c716ee905d7..072e18e6d76d 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
@@ -1439,7 +1439,7 @@ static int rebuild_lun_table(ctlr_info_t *h, struct gendisk *del_disk) | |||
1439 | 1439 | ||
1440 | if (return_code == IO_OK) { | 1440 | if (return_code == IO_OK) { |
1441 | listlength = | 1441 | listlength = |
1442 | be32_to_cpu(*(__u32 *) ld_buff->LUNListLength); | 1442 | be32_to_cpu(*(__be32 *) ld_buff->LUNListLength); |
1443 | } else { /* reading number of logical volumes failed */ | 1443 | } else { /* reading number of logical volumes failed */ |
1444 | printk(KERN_WARNING "cciss: report logical volume" | 1444 | printk(KERN_WARNING "cciss: report logical volume" |
1445 | " command failed\n"); | 1445 | " command failed\n"); |
@@ -1961,8 +1961,8 @@ cciss_read_capacity(int ctlr, int logvol, int withirq, sector_t *total_size, | |||
1961 | ctlr, buf, sizeof(ReadCapdata_struct), | 1961 | ctlr, buf, sizeof(ReadCapdata_struct), |
1962 | 1, logvol, 0, NULL, TYPE_CMD); | 1962 | 1, logvol, 0, NULL, TYPE_CMD); |
1963 | if (return_code == IO_OK) { | 1963 | if (return_code == IO_OK) { |
1964 | *total_size = be32_to_cpu(*(__u32 *) buf->total_size); | 1964 | *total_size = be32_to_cpu(*(__be32 *) buf->total_size); |
1965 | *block_size = be32_to_cpu(*(__u32 *) buf->block_size); | 1965 | *block_size = be32_to_cpu(*(__be32 *) buf->block_size); |
1966 | } else { /* read capacity command failed */ | 1966 | } else { /* read capacity command failed */ |
1967 | printk(KERN_WARNING "cciss: read capacity failed\n"); | 1967 | printk(KERN_WARNING "cciss: read capacity failed\n"); |
1968 | *total_size = 0; | 1968 | *total_size = 0; |
@@ -1997,8 +1997,8 @@ cciss_read_capacity_16(int ctlr, int logvol, int withirq, sector_t *total_size, | |||
1997 | 1, logvol, 0, NULL, TYPE_CMD); | 1997 | 1, logvol, 0, NULL, TYPE_CMD); |
1998 | } | 1998 | } |
1999 | if (return_code == IO_OK) { | 1999 | if (return_code == IO_OK) { |
2000 | *total_size = be64_to_cpu(*(__u64 *) buf->total_size); | 2000 | *total_size = be64_to_cpu(*(__be64 *) buf->total_size); |
2001 | *block_size = be32_to_cpu(*(__u32 *) buf->block_size); | 2001 | *block_size = be32_to_cpu(*(__be32 *) buf->block_size); |
2002 | } else { /* read capacity command failed */ | 2002 | } else { /* read capacity command failed */ |
2003 | printk(KERN_WARNING "cciss: read capacity failed\n"); | 2003 | printk(KERN_WARNING "cciss: read capacity failed\n"); |
2004 | *total_size = 0; | 2004 | *total_size = 0; |
diff --git a/drivers/block/paride/pd.c b/drivers/block/paride/pd.c index 99e2c8ce1cc4..31e01488eb51 100644 --- a/drivers/block/paride/pd.c +++ b/drivers/block/paride/pd.c | |||
@@ -663,11 +663,11 @@ static enum action pd_identify(struct pd_unit *disk) | |||
663 | return Fail; | 663 | return Fail; |
664 | pi_read_block(disk->pi, pd_scratch, 512); | 664 | pi_read_block(disk->pi, pd_scratch, 512); |
665 | disk->can_lba = pd_scratch[99] & 2; | 665 | disk->can_lba = pd_scratch[99] & 2; |
666 | disk->sectors = le16_to_cpu(*(u16 *) (pd_scratch + 12)); | 666 | disk->sectors = le16_to_cpu(*(__le16 *) (pd_scratch + 12)); |
667 | disk->heads = le16_to_cpu(*(u16 *) (pd_scratch + 6)); | 667 | disk->heads = le16_to_cpu(*(__le16 *) (pd_scratch + 6)); |
668 | disk->cylinders = le16_to_cpu(*(u16 *) (pd_scratch + 2)); | 668 | disk->cylinders = le16_to_cpu(*(__le16 *) (pd_scratch + 2)); |
669 | if (disk->can_lba) | 669 | if (disk->can_lba) |
670 | disk->capacity = le32_to_cpu(*(u32 *) (pd_scratch + 120)); | 670 | disk->capacity = le32_to_cpu(*(__le32 *) (pd_scratch + 120)); |
671 | else | 671 | else |
672 | disk->capacity = disk->sectors * disk->heads * disk->cylinders; | 672 | disk->capacity = disk->sectors * disk->heads * disk->cylinders; |
673 | 673 | ||
diff --git a/drivers/char/lcd.c b/drivers/char/lcd.c index 5f4fdcf7c96e..1f0962616ee5 100644 --- a/drivers/char/lcd.c +++ b/drivers/char/lcd.c | |||
@@ -11,9 +11,6 @@ | |||
11 | * March 2001: Ported from 2.0.34 by Liam Davies | 11 | * March 2001: Ported from 2.0.34 by Liam Davies |
12 | * | 12 | * |
13 | */ | 13 | */ |
14 | |||
15 | #define RTC_IO_EXTENT 0x10 /*Only really two ports, but... */ | ||
16 | |||
17 | #include <linux/types.h> | 14 | #include <linux/types.h> |
18 | #include <linux/errno.h> | 15 | #include <linux/errno.h> |
19 | #include <linux/miscdevice.h> | 16 | #include <linux/miscdevice.h> |
@@ -32,8 +29,6 @@ | |||
32 | 29 | ||
33 | #include "lcd.h" | 30 | #include "lcd.h" |
34 | 31 | ||
35 | static DEFINE_SPINLOCK(lcd_lock); | ||
36 | |||
37 | static int lcd_ioctl(struct inode *inode, struct file *file, | 32 | static int lcd_ioctl(struct inode *inode, struct file *file, |
38 | unsigned int cmd, unsigned long arg); | 33 | unsigned int cmd, unsigned long arg); |
39 | 34 | ||
diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index e45326856680..7a32df594907 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c | |||
@@ -1376,6 +1376,8 @@ static void do_tty_hangup(struct work_struct *work) | |||
1376 | read_unlock(&tasklist_lock); | 1376 | read_unlock(&tasklist_lock); |
1377 | 1377 | ||
1378 | tty->flags = 0; | 1378 | tty->flags = 0; |
1379 | put_pid(tty->session); | ||
1380 | put_pid(tty->pgrp); | ||
1379 | tty->session = NULL; | 1381 | tty->session = NULL; |
1380 | tty->pgrp = NULL; | 1382 | tty->pgrp = NULL; |
1381 | tty->ctrl_status = 0; | 1383 | tty->ctrl_status = 0; |
@@ -3841,6 +3843,9 @@ static struct pid *__proc_set_tty(struct task_struct *tsk, struct tty_struct *tt | |||
3841 | { | 3843 | { |
3842 | struct pid *old_pgrp; | 3844 | struct pid *old_pgrp; |
3843 | if (tty) { | 3845 | if (tty) { |
3846 | /* We should not have a session or pgrp to here but.... */ | ||
3847 | put_pid(tty->session); | ||
3848 | put_pid(tty->pgrp); | ||
3844 | tty->session = get_pid(task_session(tsk)); | 3849 | tty->session = get_pid(task_session(tsk)); |
3845 | tty->pgrp = get_pid(task_pgrp(tsk)); | 3850 | tty->pgrp = get_pid(task_pgrp(tsk)); |
3846 | } | 3851 | } |
diff --git a/drivers/char/vt.c b/drivers/char/vt.c index c3f8e383933b..1bbb45b937fd 100644 --- a/drivers/char/vt.c +++ b/drivers/char/vt.c | |||
@@ -724,6 +724,7 @@ int vc_allocate(unsigned int currcons) /* return 0 on success */ | |||
724 | return -ENOMEM; | 724 | return -ENOMEM; |
725 | memset(vc, 0, sizeof(*vc)); | 725 | memset(vc, 0, sizeof(*vc)); |
726 | vc_cons[currcons].d = vc; | 726 | vc_cons[currcons].d = vc; |
727 | INIT_WORK(&vc_cons[currcons].SAK_work, vc_SAK); | ||
727 | visual_init(vc, currcons, 1); | 728 | visual_init(vc, currcons, 1); |
728 | if (!*vc->vc_uni_pagedir_loc) | 729 | if (!*vc->vc_uni_pagedir_loc) |
729 | con_set_default_unimap(vc); | 730 | con_set_default_unimap(vc); |
@@ -2185,10 +2186,28 @@ static void console_callback(struct work_struct *ignored) | |||
2185 | release_console_sem(); | 2186 | release_console_sem(); |
2186 | } | 2187 | } |
2187 | 2188 | ||
2188 | void set_console(int nr) | 2189 | int set_console(int nr) |
2189 | { | 2190 | { |
2191 | struct vc_data *vc = vc_cons[fg_console].d; | ||
2192 | |||
2193 | if (!vc_cons_allocated(nr) || vt_dont_switch || | ||
2194 | (vc->vt_mode.mode == VT_AUTO && vc->vc_mode == KD_GRAPHICS)) { | ||
2195 | |||
2196 | /* | ||
2197 | * Console switch will fail in console_callback() or | ||
2198 | * change_console() so there is no point scheduling | ||
2199 | * the callback | ||
2200 | * | ||
2201 | * Existing set_console() users don't check the return | ||
2202 | * value so this shouldn't break anything | ||
2203 | */ | ||
2204 | return -EINVAL; | ||
2205 | } | ||
2206 | |||
2190 | want_console = nr; | 2207 | want_console = nr; |
2191 | schedule_console_callback(); | 2208 | schedule_console_callback(); |
2209 | |||
2210 | return 0; | ||
2192 | } | 2211 | } |
2193 | 2212 | ||
2194 | struct tty_driver *console_driver; | 2213 | struct tty_driver *console_driver; |
diff --git a/drivers/char/vt_ioctl.c b/drivers/char/vt_ioctl.c index 3a5d301e783b..1fa2da8f4fbe 100644 --- a/drivers/char/vt_ioctl.c +++ b/drivers/char/vt_ioctl.c | |||
@@ -34,7 +34,7 @@ | |||
34 | #include <linux/kbd_diacr.h> | 34 | #include <linux/kbd_diacr.h> |
35 | #include <linux/selection.h> | 35 | #include <linux/selection.h> |
36 | 36 | ||
37 | static char vt_dont_switch; | 37 | char vt_dont_switch; |
38 | extern struct tty_driver *console_driver; | 38 | extern struct tty_driver *console_driver; |
39 | 39 | ||
40 | #define VT_IS_IN_USE(i) (console_driver->ttys[i] && console_driver->ttys[i]->count) | 40 | #define VT_IS_IN_USE(i) (console_driver->ttys[i] && console_driver->ttys[i]->count) |
diff --git a/drivers/char/watchdog/Kconfig b/drivers/char/watchdog/Kconfig index ea09d0c974ea..e812aa129e28 100644 --- a/drivers/char/watchdog/Kconfig +++ b/drivers/char/watchdog/Kconfig | |||
@@ -301,6 +301,7 @@ config I6300ESB_WDT | |||
301 | config I8XX_TCO | 301 | config I8XX_TCO |
302 | tristate "Intel i8xx TCO Timer/Watchdog" | 302 | tristate "Intel i8xx TCO Timer/Watchdog" |
303 | depends on WATCHDOG && (X86 || IA64) && PCI | 303 | depends on WATCHDOG && (X86 || IA64) && PCI |
304 | default n | ||
304 | ---help--- | 305 | ---help--- |
305 | Hardware driver for the TCO timer built into the Intel 82801 | 306 | Hardware driver for the TCO timer built into the Intel 82801 |
306 | I/O Controller Hub family. The TCO (Total Cost of Ownership) | 307 | I/O Controller Hub family. The TCO (Total Cost of Ownership) |
diff --git a/drivers/char/watchdog/machzwd.c b/drivers/char/watchdog/machzwd.c index 4a328ba0d262..76c7fa37fa6c 100644 --- a/drivers/char/watchdog/machzwd.c +++ b/drivers/char/watchdog/machzwd.c | |||
@@ -314,21 +314,21 @@ static int zf_ioctl(struct inode *inode, struct file *file, unsigned int cmd, | |||
314 | { | 314 | { |
315 | void __user *argp = (void __user *)arg; | 315 | void __user *argp = (void __user *)arg; |
316 | int __user *p = argp; | 316 | int __user *p = argp; |
317 | switch(cmd){ | 317 | switch (cmd) { |
318 | case WDIOC_GETSUPPORT: | 318 | case WDIOC_GETSUPPORT: |
319 | if (copy_to_user(argp, &zf_info, sizeof(zf_info))) | 319 | if (copy_to_user(argp, &zf_info, sizeof(zf_info))) |
320 | return -EFAULT; | 320 | return -EFAULT; |
321 | break; | 321 | break; |
322 | 322 | ||
323 | case WDIOC_GETSTATUS: | 323 | case WDIOC_GETSTATUS: |
324 | return put_user(0, p); | 324 | return put_user(0, p); |
325 | 325 | ||
326 | case WDIOC_KEEPALIVE: | 326 | case WDIOC_KEEPALIVE: |
327 | zf_ping(0); | 327 | zf_ping(0); |
328 | break; | 328 | break; |
329 | 329 | ||
330 | default: | 330 | default: |
331 | return -ENOTTY; | 331 | return -ENOTTY; |
332 | } | 332 | } |
333 | 333 | ||
334 | return 0; | 334 | return 0; |
diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c index 15278044295c..322ee2984e3d 100644 --- a/drivers/dma/dmaengine.c +++ b/drivers/dma/dmaengine.c | |||
@@ -176,6 +176,7 @@ void dma_chan_cleanup(struct kref *kref) | |||
176 | chan->client = NULL; | 176 | chan->client = NULL; |
177 | kref_put(&chan->device->refcount, dma_async_device_cleanup); | 177 | kref_put(&chan->device->refcount, dma_async_device_cleanup); |
178 | } | 178 | } |
179 | EXPORT_SYMBOL(dma_chan_cleanup); | ||
179 | 180 | ||
180 | static void dma_chan_free_rcu(struct rcu_head *rcu) | 181 | static void dma_chan_free_rcu(struct rcu_head *rcu) |
181 | { | 182 | { |
@@ -261,6 +262,7 @@ struct dma_client *dma_async_client_register(dma_event_callback event_callback) | |||
261 | 262 | ||
262 | return client; | 263 | return client; |
263 | } | 264 | } |
265 | EXPORT_SYMBOL(dma_async_client_register); | ||
264 | 266 | ||
265 | /** | 267 | /** |
266 | * dma_async_client_unregister - unregister a client and free the &dma_client | 268 | * dma_async_client_unregister - unregister a client and free the &dma_client |
@@ -287,6 +289,7 @@ void dma_async_client_unregister(struct dma_client *client) | |||
287 | kfree(client); | 289 | kfree(client); |
288 | dma_chans_rebalance(); | 290 | dma_chans_rebalance(); |
289 | } | 291 | } |
292 | EXPORT_SYMBOL(dma_async_client_unregister); | ||
290 | 293 | ||
291 | /** | 294 | /** |
292 | * dma_async_client_chan_request - request DMA channels | 295 | * dma_async_client_chan_request - request DMA channels |
@@ -304,6 +307,7 @@ void dma_async_client_chan_request(struct dma_client *client, | |||
304 | client->chans_desired = number; | 307 | client->chans_desired = number; |
305 | dma_chans_rebalance(); | 308 | dma_chans_rebalance(); |
306 | } | 309 | } |
310 | EXPORT_SYMBOL(dma_async_client_chan_request); | ||
307 | 311 | ||
308 | /** | 312 | /** |
309 | * dma_async_device_register - registers DMA devices found | 313 | * dma_async_device_register - registers DMA devices found |
@@ -346,6 +350,7 @@ int dma_async_device_register(struct dma_device *device) | |||
346 | 350 | ||
347 | return 0; | 351 | return 0; |
348 | } | 352 | } |
353 | EXPORT_SYMBOL(dma_async_device_register); | ||
349 | 354 | ||
350 | /** | 355 | /** |
351 | * dma_async_device_cleanup - function called when all references are released | 356 | * dma_async_device_cleanup - function called when all references are released |
@@ -390,23 +395,12 @@ void dma_async_device_unregister(struct dma_device *device) | |||
390 | kref_put(&device->refcount, dma_async_device_cleanup); | 395 | kref_put(&device->refcount, dma_async_device_cleanup); |
391 | wait_for_completion(&device->done); | 396 | wait_for_completion(&device->done); |
392 | } | 397 | } |
398 | EXPORT_SYMBOL(dma_async_device_unregister); | ||
393 | 399 | ||
394 | static int __init dma_bus_init(void) | 400 | static int __init dma_bus_init(void) |
395 | { | 401 | { |
396 | mutex_init(&dma_list_mutex); | 402 | mutex_init(&dma_list_mutex); |
397 | return class_register(&dma_devclass); | 403 | return class_register(&dma_devclass); |
398 | } | 404 | } |
399 | |||
400 | subsys_initcall(dma_bus_init); | 405 | subsys_initcall(dma_bus_init); |
401 | 406 | ||
402 | EXPORT_SYMBOL(dma_async_client_register); | ||
403 | EXPORT_SYMBOL(dma_async_client_unregister); | ||
404 | EXPORT_SYMBOL(dma_async_client_chan_request); | ||
405 | EXPORT_SYMBOL(dma_async_memcpy_buf_to_buf); | ||
406 | EXPORT_SYMBOL(dma_async_memcpy_buf_to_pg); | ||
407 | EXPORT_SYMBOL(dma_async_memcpy_pg_to_pg); | ||
408 | EXPORT_SYMBOL(dma_async_memcpy_complete); | ||
409 | EXPORT_SYMBOL(dma_async_memcpy_issue_pending); | ||
410 | EXPORT_SYMBOL(dma_async_device_register); | ||
411 | EXPORT_SYMBOL(dma_async_device_unregister); | ||
412 | EXPORT_SYMBOL(dma_chan_cleanup); | ||
diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index f4ee1afe488f..67f3347afcf3 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <asm/byteorder.h> | 26 | #include <asm/byteorder.h> |
27 | #include <linux/input.h> | 27 | #include <linux/input.h> |
28 | #include <linux/wait.h> | 28 | #include <linux/wait.h> |
29 | #include <linux/vmalloc.h> | ||
29 | 30 | ||
30 | #include <linux/hid.h> | 31 | #include <linux/hid.h> |
31 | #include <linux/hiddev.h> | 32 | #include <linux/hiddev.h> |
@@ -654,12 +655,13 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size) | |||
654 | memcpy(device->rdesc, start, size); | 655 | memcpy(device->rdesc, start, size); |
655 | device->rsize = size; | 656 | device->rsize = size; |
656 | 657 | ||
657 | if (!(parser = kzalloc(sizeof(struct hid_parser), GFP_KERNEL))) { | 658 | if (!(parser = vmalloc(sizeof(struct hid_parser)))) { |
658 | kfree(device->rdesc); | 659 | kfree(device->rdesc); |
659 | kfree(device->collection); | 660 | kfree(device->collection); |
660 | kfree(device); | 661 | kfree(device); |
661 | return NULL; | 662 | return NULL; |
662 | } | 663 | } |
664 | memset(parser, 0, sizeof(struct hid_parser)); | ||
663 | parser->device = device; | 665 | parser->device = device; |
664 | 666 | ||
665 | end = start + size; | 667 | end = start + size; |
@@ -668,7 +670,7 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size) | |||
668 | if (item.format != HID_ITEM_FORMAT_SHORT) { | 670 | if (item.format != HID_ITEM_FORMAT_SHORT) { |
669 | dbg("unexpected long global item"); | 671 | dbg("unexpected long global item"); |
670 | hid_free_device(device); | 672 | hid_free_device(device); |
671 | kfree(parser); | 673 | vfree(parser); |
672 | return NULL; | 674 | return NULL; |
673 | } | 675 | } |
674 | 676 | ||
@@ -676,7 +678,7 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size) | |||
676 | dbg("item %u %u %u %u parsing failed\n", | 678 | dbg("item %u %u %u %u parsing failed\n", |
677 | item.format, (unsigned)item.size, (unsigned)item.type, (unsigned)item.tag); | 679 | item.format, (unsigned)item.size, (unsigned)item.type, (unsigned)item.tag); |
678 | hid_free_device(device); | 680 | hid_free_device(device); |
679 | kfree(parser); | 681 | vfree(parser); |
680 | return NULL; | 682 | return NULL; |
681 | } | 683 | } |
682 | 684 | ||
@@ -684,23 +686,23 @@ struct hid_device *hid_parse_report(__u8 *start, unsigned size) | |||
684 | if (parser->collection_stack_ptr) { | 686 | if (parser->collection_stack_ptr) { |
685 | dbg("unbalanced collection at end of report description"); | 687 | dbg("unbalanced collection at end of report description"); |
686 | hid_free_device(device); | 688 | hid_free_device(device); |
687 | kfree(parser); | 689 | vfree(parser); |
688 | return NULL; | 690 | return NULL; |
689 | } | 691 | } |
690 | if (parser->local.delimiter_depth) { | 692 | if (parser->local.delimiter_depth) { |
691 | dbg("unbalanced delimiter at end of report description"); | 693 | dbg("unbalanced delimiter at end of report description"); |
692 | hid_free_device(device); | 694 | hid_free_device(device); |
693 | kfree(parser); | 695 | vfree(parser); |
694 | return NULL; | 696 | return NULL; |
695 | } | 697 | } |
696 | kfree(parser); | 698 | vfree(parser); |
697 | return device; | 699 | return device; |
698 | } | 700 | } |
699 | } | 701 | } |
700 | 702 | ||
701 | dbg("item fetching failed at offset %d\n", (int)(end - start)); | 703 | dbg("item fetching failed at offset %d\n", (int)(end - start)); |
702 | hid_free_device(device); | 704 | hid_free_device(device); |
703 | kfree(parser); | 705 | vfree(parser); |
704 | return NULL; | 706 | return NULL; |
705 | } | 707 | } |
706 | EXPORT_SYMBOL_GPL(hid_parse_report); | 708 | EXPORT_SYMBOL_GPL(hid_parse_report); |
@@ -753,8 +755,7 @@ static __inline__ __u32 extract(__u8 *report, unsigned offset, unsigned n) | |||
753 | 755 | ||
754 | report += offset >> 3; /* adjust byte index */ | 756 | report += offset >> 3; /* adjust byte index */ |
755 | offset &= 7; /* now only need bit offset into one byte */ | 757 | offset &= 7; /* now only need bit offset into one byte */ |
756 | x = get_unaligned((u64 *) report); | 758 | x = le64_to_cpu(get_unaligned((__le64 *) report)); |
757 | x = le64_to_cpu(x); | ||
758 | x = (x >> offset) & ((1ULL << n) - 1); /* extract bit field */ | 759 | x = (x >> offset) & ((1ULL << n) - 1); /* extract bit field */ |
759 | return (u32) x; | 760 | return (u32) x; |
760 | } | 761 | } |
@@ -769,7 +770,7 @@ static __inline__ __u32 extract(__u8 *report, unsigned offset, unsigned n) | |||
769 | */ | 770 | */ |
770 | static __inline__ void implement(__u8 *report, unsigned offset, unsigned n, __u32 value) | 771 | static __inline__ void implement(__u8 *report, unsigned offset, unsigned n, __u32 value) |
771 | { | 772 | { |
772 | u64 x; | 773 | __le64 x; |
773 | u64 m = (1ULL << n) - 1; | 774 | u64 m = (1ULL << n) - 1; |
774 | 775 | ||
775 | WARN_ON(n > 32); | 776 | WARN_ON(n > 32); |
@@ -780,10 +781,10 @@ static __inline__ void implement(__u8 *report, unsigned offset, unsigned n, __u3 | |||
780 | report += offset >> 3; | 781 | report += offset >> 3; |
781 | offset &= 7; | 782 | offset &= 7; |
782 | 783 | ||
783 | x = get_unaligned((u64 *)report); | 784 | x = get_unaligned((__le64 *)report); |
784 | x &= cpu_to_le64(~(m << offset)); | 785 | x &= cpu_to_le64(~(m << offset)); |
785 | x |= cpu_to_le64(((u64) value) << offset); | 786 | x |= cpu_to_le64(((u64) value) << offset); |
786 | put_unaligned(x, (u64 *) report); | 787 | put_unaligned(x, (__le64 *) report); |
787 | } | 788 | } |
788 | 789 | ||
789 | /* | 790 | /* |
@@ -873,10 +874,6 @@ static void hid_output_field(struct hid_field *field, __u8 *data) | |||
873 | unsigned size = field->report_size; | 874 | unsigned size = field->report_size; |
874 | unsigned n; | 875 | unsigned n; |
875 | 876 | ||
876 | /* make sure the unused bits in the last byte are zeros */ | ||
877 | if (count > 0 && size > 0) | ||
878 | data[(offset+count*size-1)/8] = 0; | ||
879 | |||
880 | for (n = 0; n < count; n++) { | 877 | for (n = 0; n < count; n++) { |
881 | if (field->logical_minimum < 0) /* signed values */ | 878 | if (field->logical_minimum < 0) /* signed values */ |
882 | implement(data, offset + n * size, size, s32ton(field->value[n], size)); | 879 | implement(data, offset + n * size, size, s32ton(field->value[n], size)); |
diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig index c3d4856fb618..6d105a1d41b1 100644 --- a/drivers/hwmon/Kconfig +++ b/drivers/hwmon/Kconfig | |||
@@ -527,6 +527,7 @@ config SENSORS_W83792D | |||
527 | config SENSORS_W83793 | 527 | config SENSORS_W83793 |
528 | tristate "Winbond W83793" | 528 | tristate "Winbond W83793" |
529 | depends on HWMON && I2C && EXPERIMENTAL | 529 | depends on HWMON && I2C && EXPERIMENTAL |
530 | select HWMON_VID | ||
530 | help | 531 | help |
531 | If you say yes here you get support for the Winbond W83793 | 532 | If you say yes here you get support for the Winbond W83793 |
532 | hardware monitoring chip. | 533 | hardware monitoring chip. |
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index 5d134bb75ba1..8f1fd017679b 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
@@ -434,24 +434,8 @@ config BLK_DEV_IDEDMA_FORCED | |||
434 | 434 | ||
435 | Generally say N here. | 435 | Generally say N here. |
436 | 436 | ||
437 | config IDEDMA_PCI_AUTO | ||
438 | bool "Use PCI DMA by default when available" | ||
439 | ---help--- | ||
440 | Prior to kernel version 2.1.112, Linux used to automatically use | ||
441 | DMA for IDE drives and chipsets which support it. Due to concerns | ||
442 | about a couple of cases where buggy hardware may have caused damage, | ||
443 | the default is now to NOT use DMA automatically. To revert to the | ||
444 | previous behaviour, say Y to this question. | ||
445 | |||
446 | If you suspect your hardware is at all flakey, say N here. | ||
447 | Do NOT email the IDE kernel people regarding this issue! | ||
448 | |||
449 | It is normally safe to answer Y to this question unless your | ||
450 | motherboard uses a VIA VP2 chipset, in which case you should say N. | ||
451 | |||
452 | config IDEDMA_ONLYDISK | 437 | config IDEDMA_ONLYDISK |
453 | bool "Enable DMA only for disks " | 438 | bool "Enable DMA only for disks " |
454 | depends on IDEDMA_PCI_AUTO | ||
455 | help | 439 | help |
456 | This is used if you know your ATAPI Devices are going to fail DMA | 440 | This is used if you know your ATAPI Devices are going to fail DMA |
457 | Transfers. | 441 | Transfers. |
@@ -769,6 +753,14 @@ config BLK_DEV_TC86C001 | |||
769 | help | 753 | help |
770 | This driver adds support for Toshiba TC86C001 GOKU-S chip. | 754 | This driver adds support for Toshiba TC86C001 GOKU-S chip. |
771 | 755 | ||
756 | config BLK_DEV_CELLEB | ||
757 | tristate "Toshiba's Cell Reference Set IDE support" | ||
758 | depends on PPC_CELLEB | ||
759 | help | ||
760 | This driver provides support for the built-in IDE controller on | ||
761 | Toshiba Cell Reference Board. | ||
762 | If unsure, say Y. | ||
763 | |||
772 | endif | 764 | endif |
773 | 765 | ||
774 | config BLK_DEV_IDE_PMAC | 766 | config BLK_DEV_IDE_PMAC |
@@ -800,14 +792,6 @@ config BLK_DEV_IDEDMA_PMAC | |||
800 | to transfer data to and from memory. Saying Y is safe and improves | 792 | to transfer data to and from memory. Saying Y is safe and improves |
801 | performance. | 793 | performance. |
802 | 794 | ||
803 | config BLK_DEV_IDE_CELLEB | ||
804 | bool "Toshiba's Cell Reference Set IDE support" | ||
805 | depends on PPC_CELLEB | ||
806 | help | ||
807 | This driver provides support for the built-in IDE controller on | ||
808 | Toshiba Cell Reference Board. | ||
809 | If unsure, say Y. | ||
810 | |||
811 | config BLK_DEV_IDE_SWARM | 795 | config BLK_DEV_IDE_SWARM |
812 | tristate "IDE for Sibyte evaluation boards" | 796 | tristate "IDE for Sibyte evaluation boards" |
813 | depends on SIBYTE_SB1xxx_SOC | 797 | depends on SIBYTE_SB1xxx_SOC |
@@ -851,19 +835,6 @@ config BLK_DEV_IDEDMA_ICS | |||
851 | Say Y here if you want to add DMA (Direct Memory Access) support to | 835 | Say Y here if you want to add DMA (Direct Memory Access) support to |
852 | the ICS IDE driver. | 836 | the ICS IDE driver. |
853 | 837 | ||
854 | config IDEDMA_ICS_AUTO | ||
855 | bool "Use ICS DMA by default" | ||
856 | depends on BLK_DEV_IDEDMA_ICS | ||
857 | help | ||
858 | Prior to kernel version 2.1.112, Linux used to automatically use | ||
859 | DMA for IDE drives and chipsets which support it. Due to concerns | ||
860 | about a couple of cases where buggy hardware may have caused damage, | ||
861 | the default is now to NOT use DMA automatically. To revert to the | ||
862 | previous behaviour, say Y to this question. | ||
863 | |||
864 | If you suspect your hardware is at all flakey, say N here. | ||
865 | Do NOT email the IDE kernel people regarding this issue! | ||
866 | |||
867 | config BLK_DEV_IDE_RAPIDE | 838 | config BLK_DEV_IDE_RAPIDE |
868 | tristate "RapIDE interface support" | 839 | tristate "RapIDE interface support" |
869 | depends on ARM && ARCH_ACORN | 840 | depends on ARM && ARCH_ACORN |
@@ -1086,9 +1057,6 @@ config IDEDMA_IVB | |||
1086 | 1057 | ||
1087 | It is normally safe to answer Y; however, the default is N. | 1058 | It is normally safe to answer Y; however, the default is N. |
1088 | 1059 | ||
1089 | config IDEDMA_AUTO | ||
1090 | def_bool IDEDMA_PCI_AUTO || IDEDMA_ICS_AUTO | ||
1091 | |||
1092 | endif | 1060 | endif |
1093 | 1061 | ||
1094 | config BLK_DEV_HD_ONLY | 1062 | config BLK_DEV_HD_ONLY |
diff --git a/drivers/ide/Makefile b/drivers/ide/Makefile index 28feedfbd21d..d9f029e8ff74 100644 --- a/drivers/ide/Makefile +++ b/drivers/ide/Makefile | |||
@@ -37,7 +37,6 @@ ide-core-$(CONFIG_BLK_DEV_Q40IDE) += legacy/q40ide.o | |||
37 | # built-in only drivers from ppc/ | 37 | # built-in only drivers from ppc/ |
38 | ide-core-$(CONFIG_BLK_DEV_MPC8xx_IDE) += ppc/mpc8xx.o | 38 | ide-core-$(CONFIG_BLK_DEV_MPC8xx_IDE) += ppc/mpc8xx.o |
39 | ide-core-$(CONFIG_BLK_DEV_IDE_PMAC) += ppc/pmac.o | 39 | ide-core-$(CONFIG_BLK_DEV_IDE_PMAC) += ppc/pmac.o |
40 | ide-core-$(CONFIG_BLK_DEV_IDE_CELLEB) += ppc/scc_pata.o | ||
41 | 40 | ||
42 | # built-in only drivers from h8300/ | 41 | # built-in only drivers from h8300/ |
43 | ide-core-$(CONFIG_H8300) += h8300/ide-h8300.o | 42 | ide-core-$(CONFIG_H8300) += h8300/ide-h8300.o |
diff --git a/drivers/ide/arm/icside.c b/drivers/ide/arm/icside.c index 40e5c66b81ce..e2953fc1fafb 100644 --- a/drivers/ide/arm/icside.c +++ b/drivers/ide/arm/icside.c | |||
@@ -196,11 +196,6 @@ static void icside_maskproc(ide_drive_t *drive, int mask) | |||
196 | } | 196 | } |
197 | 197 | ||
198 | #ifdef CONFIG_BLK_DEV_IDEDMA_ICS | 198 | #ifdef CONFIG_BLK_DEV_IDEDMA_ICS |
199 | |||
200 | #ifndef CONFIG_IDEDMA_ICS_AUTO | ||
201 | #warning CONFIG_IDEDMA_ICS_AUTO=n support is obsolete, and will be removed soon. | ||
202 | #endif | ||
203 | |||
204 | /* | 199 | /* |
205 | * SG-DMA support. | 200 | * SG-DMA support. |
206 | * | 201 | * |
@@ -474,12 +469,6 @@ static int icside_dma_lostirq(ide_drive_t *drive) | |||
474 | 469 | ||
475 | static void icside_dma_init(ide_hwif_t *hwif) | 470 | static void icside_dma_init(ide_hwif_t *hwif) |
476 | { | 471 | { |
477 | int autodma = 0; | ||
478 | |||
479 | #ifdef CONFIG_IDEDMA_ICS_AUTO | ||
480 | autodma = 1; | ||
481 | #endif | ||
482 | |||
483 | printk(" %s: SG-DMA", hwif->name); | 472 | printk(" %s: SG-DMA", hwif->name); |
484 | 473 | ||
485 | hwif->atapi_dma = 1; | 474 | hwif->atapi_dma = 1; |
@@ -489,7 +478,7 @@ static void icside_dma_init(ide_hwif_t *hwif) | |||
489 | hwif->dmatable_cpu = NULL; | 478 | hwif->dmatable_cpu = NULL; |
490 | hwif->dmatable_dma = 0; | 479 | hwif->dmatable_dma = 0; |
491 | hwif->speedproc = icside_set_speed; | 480 | hwif->speedproc = icside_set_speed; |
492 | hwif->autodma = autodma; | 481 | hwif->autodma = 1; |
493 | 482 | ||
494 | hwif->ide_dma_check = icside_dma_check; | 483 | hwif->ide_dma_check = icside_dma_check; |
495 | hwif->dma_host_off = icside_dma_host_off; | 484 | hwif->dma_host_off = icside_dma_host_off; |
diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c index 08e7cd043bcc..fd213088b06b 100644 --- a/drivers/ide/ide-dma.c +++ b/drivers/ide/ide-dma.c | |||
@@ -767,7 +767,7 @@ int ide_set_dma(ide_drive_t *drive) | |||
767 | switch(rc) { | 767 | switch(rc) { |
768 | case -1: /* DMA needs to be disabled */ | 768 | case -1: /* DMA needs to be disabled */ |
769 | hwif->dma_off_quietly(drive); | 769 | hwif->dma_off_quietly(drive); |
770 | return 0; | 770 | return -1; |
771 | case 0: /* DMA needs to be enabled */ | 771 | case 0: /* DMA needs to be enabled */ |
772 | return hwif->ide_dma_on(drive); | 772 | return hwif->ide_dma_on(drive); |
773 | case 1: /* DMA setting cannot be changed */ | 773 | case 1: /* DMA setting cannot be changed */ |
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index dfbd74458522..695610f0e3e4 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
@@ -177,11 +177,7 @@ DECLARE_MUTEX(ide_cfg_sem); | |||
177 | static int ide_scan_direction; /* THIS was formerly 2.2.x pci=reverse */ | 177 | static int ide_scan_direction; /* THIS was formerly 2.2.x pci=reverse */ |
178 | #endif | 178 | #endif |
179 | 179 | ||
180 | #ifdef CONFIG_IDEDMA_AUTO | ||
181 | int noautodma = 0; | 180 | int noautodma = 0; |
182 | #else | ||
183 | int noautodma = 1; | ||
184 | #endif | ||
185 | 181 | ||
186 | EXPORT_SYMBOL(noautodma); | 182 | EXPORT_SYMBOL(noautodma); |
187 | 183 | ||
diff --git a/drivers/ide/mips/au1xxx-ide.c b/drivers/ide/mips/au1xxx-ide.c index b2dc028dc8ca..d54d9fe92a7d 100644 --- a/drivers/ide/mips/au1xxx-ide.c +++ b/drivers/ide/mips/au1xxx-ide.c | |||
@@ -639,6 +639,7 @@ static int au_ide_probe(struct device *dev) | |||
639 | _auide_hwif *ahwif = &auide_hwif; | 639 | _auide_hwif *ahwif = &auide_hwif; |
640 | ide_hwif_t *hwif; | 640 | ide_hwif_t *hwif; |
641 | struct resource *res; | 641 | struct resource *res; |
642 | hw_regs_t *hw; | ||
642 | int ret = 0; | 643 | int ret = 0; |
643 | 644 | ||
644 | #if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA) | 645 | #if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA) |
@@ -681,7 +682,7 @@ static int au_ide_probe(struct device *dev) | |||
681 | /* FIXME: This might possibly break PCMCIA IDE devices */ | 682 | /* FIXME: This might possibly break PCMCIA IDE devices */ |
682 | 683 | ||
683 | hwif = &ide_hwifs[pdev->id]; | 684 | hwif = &ide_hwifs[pdev->id]; |
684 | hw_regs_t *hw = &hwif->hw; | 685 | hw = &hwif->hw; |
685 | hwif->irq = hw->irq = ahwif->irq; | 686 | hwif->irq = hw->irq = ahwif->irq; |
686 | hwif->chipset = ide_au1xxx; | 687 | hwif->chipset = ide_au1xxx; |
687 | 688 | ||
diff --git a/drivers/ide/pci/Makefile b/drivers/ide/pci/Makefile index 6591ff4753cb..95d1ea8f1f14 100644 --- a/drivers/ide/pci/Makefile +++ b/drivers/ide/pci/Makefile | |||
@@ -3,6 +3,7 @@ obj-$(CONFIG_BLK_DEV_AEC62XX) += aec62xx.o | |||
3 | obj-$(CONFIG_BLK_DEV_ALI15X3) += alim15x3.o | 3 | obj-$(CONFIG_BLK_DEV_ALI15X3) += alim15x3.o |
4 | obj-$(CONFIG_BLK_DEV_AMD74XX) += amd74xx.o | 4 | obj-$(CONFIG_BLK_DEV_AMD74XX) += amd74xx.o |
5 | obj-$(CONFIG_BLK_DEV_ATIIXP) += atiixp.o | 5 | obj-$(CONFIG_BLK_DEV_ATIIXP) += atiixp.o |
6 | obj-$(CONFIG_BLK_DEV_CELLEB) += scc_pata.o | ||
6 | obj-$(CONFIG_BLK_DEV_CMD64X) += cmd64x.o | 7 | obj-$(CONFIG_BLK_DEV_CMD64X) += cmd64x.o |
7 | obj-$(CONFIG_BLK_DEV_CS5520) += cs5520.o | 8 | obj-$(CONFIG_BLK_DEV_CS5520) += cs5520.o |
8 | obj-$(CONFIG_BLK_DEV_CS5530) += cs5530.o | 9 | obj-$(CONFIG_BLK_DEV_CS5530) += cs5530.o |
diff --git a/drivers/ide/pci/cmd64x.c b/drivers/ide/pci/cmd64x.c index b0d4825c56a9..561197f7b5bb 100644 --- a/drivers/ide/pci/cmd64x.c +++ b/drivers/ide/pci/cmd64x.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* $Id: cmd64x.c,v 1.21 2000/01/30 23:23:16 | 1 | /* $Id: cmd64x.c,v 1.21 2000/01/30 23:23:16 |
2 | * | 2 | * |
3 | * linux/drivers/ide/pci/cmd64x.c Version 1.41 Feb 3, 2007 | 3 | * linux/drivers/ide/pci/cmd64x.c Version 1.42 Feb 8, 2007 |
4 | * | 4 | * |
5 | * cmd64x.c: Enable interrupts at initialization time on Ultra/PCI machines. | 5 | * cmd64x.c: Enable interrupts at initialization time on Ultra/PCI machines. |
6 | * Note, this driver is not used at all on other systems because | 6 | * Note, this driver is not used at all on other systems because |
@@ -189,6 +189,11 @@ static int cmd64x_get_info (char *buffer, char **addr, off_t offset, int count) | |||
189 | 189 | ||
190 | #endif /* defined(DISPLAY_CMD64X_TIMINGS) && defined(CONFIG_PROC_FS) */ | 190 | #endif /* defined(DISPLAY_CMD64X_TIMINGS) && defined(CONFIG_PROC_FS) */ |
191 | 191 | ||
192 | static u8 quantize_timing(int timing, int quant) | ||
193 | { | ||
194 | return (timing + quant - 1) / quant; | ||
195 | } | ||
196 | |||
192 | /* | 197 | /* |
193 | * This routine writes the prepared setup/active/recovery counts | 198 | * This routine writes the prepared setup/active/recovery counts |
194 | * for a drive into the cmd646 chipset registers to active them. | 199 | * for a drive into the cmd646 chipset registers to active them. |
@@ -268,47 +273,37 @@ static void program_drive_counts (ide_drive_t *drive, int setup_count, int activ | |||
268 | */ | 273 | */ |
269 | static u8 cmd64x_tune_pio (ide_drive_t *drive, u8 mode_wanted) | 274 | static u8 cmd64x_tune_pio (ide_drive_t *drive, u8 mode_wanted) |
270 | { | 275 | { |
271 | int setup_time, active_time, recovery_time; | 276 | int setup_time, active_time, cycle_time; |
272 | int clock_time, pio_mode, cycle_time; | 277 | u8 cycle_count, setup_count, active_count, recovery_count; |
273 | u8 recovery_count2, cycle_count; | 278 | u8 pio_mode; |
274 | int setup_count, active_count, recovery_count; | 279 | int clock_time = 1000 / system_bus_clock(); |
275 | int bus_speed = system_bus_clock(); | 280 | ide_pio_data_t pio; |
276 | ide_pio_data_t d; | ||
277 | 281 | ||
278 | pio_mode = ide_get_best_pio_mode(drive, mode_wanted, 5, &d); | 282 | pio_mode = ide_get_best_pio_mode(drive, mode_wanted, 5, &pio); |
279 | cycle_time = d.cycle_time; | 283 | cycle_time = pio.cycle_time; |
280 | 284 | ||
281 | /* | ||
282 | * I copied all this complicated stuff from cmd640.c and made a few | ||
283 | * minor changes. For now I am just going to pray that it is correct. | ||
284 | */ | ||
285 | setup_time = ide_pio_timings[pio_mode].setup_time; | 285 | setup_time = ide_pio_timings[pio_mode].setup_time; |
286 | active_time = ide_pio_timings[pio_mode].active_time; | 286 | active_time = ide_pio_timings[pio_mode].active_time; |
287 | recovery_time = cycle_time - (setup_time + active_time); | ||
288 | clock_time = 1000 / bus_speed; | ||
289 | cycle_count = (cycle_time + clock_time - 1) / clock_time; | ||
290 | |||
291 | setup_count = (setup_time + clock_time - 1) / clock_time; | ||
292 | 287 | ||
293 | active_count = (active_time + clock_time - 1) / clock_time; | 288 | setup_count = quantize_timing( setup_time, clock_time); |
289 | cycle_count = quantize_timing( cycle_time, clock_time); | ||
290 | active_count = quantize_timing(active_time, clock_time); | ||
294 | 291 | ||
295 | recovery_count = (recovery_time + clock_time - 1) / clock_time; | 292 | recovery_count = cycle_count - active_count; |
296 | recovery_count2 = cycle_count - (setup_count + active_count); | 293 | /* program_drive_counts() takes care of zero recovery cycles */ |
297 | if (recovery_count2 > recovery_count) | ||
298 | recovery_count = recovery_count2; | ||
299 | if (recovery_count > 16) { | 294 | if (recovery_count > 16) { |
300 | active_count += recovery_count - 16; | 295 | active_count += recovery_count - 16; |
301 | recovery_count = 16; | 296 | recovery_count = 16; |
302 | } | 297 | } |
303 | if (active_count > 16) | 298 | if (active_count > 16) |
304 | active_count = 16; /* maximum allowed by cmd646 */ | 299 | active_count = 16; /* maximum allowed by cmd64x */ |
305 | 300 | ||
306 | program_drive_counts (drive, setup_count, active_count, recovery_count); | 301 | program_drive_counts (drive, setup_count, active_count, recovery_count); |
307 | 302 | ||
308 | cmdprintk("%s: PIO mode wanted %d, selected %d (%dns)%s, " | 303 | cmdprintk("%s: PIO mode wanted %d, selected %d (%dns)%s, " |
309 | "clocks=%d/%d/%d\n", | 304 | "clocks=%d/%d/%d\n", |
310 | drive->name, mode_wanted, pio_mode, cycle_time, | 305 | drive->name, mode_wanted, pio_mode, cycle_time, |
311 | d.overridden ? " (overriding vendor mode)" : "", | 306 | pio.overridden ? " (overriding vendor mode)" : "", |
312 | setup_count, active_count, recovery_count); | 307 | setup_count, active_count, recovery_count); |
313 | 308 | ||
314 | return pio_mode; | 309 | return pio_mode; |
diff --git a/drivers/ide/pci/jmicron.c b/drivers/ide/pci/jmicron.c index 53f25500c22b..be4fc96c29e0 100644 --- a/drivers/ide/pci/jmicron.c +++ b/drivers/ide/pci/jmicron.c | |||
@@ -240,12 +240,31 @@ static int __devinit jmicron_init_one(struct pci_dev *dev, const struct pci_devi | |||
240 | return 0; | 240 | return 0; |
241 | } | 241 | } |
242 | 242 | ||
243 | /* If libata is configured, jmicron PCI quirk will configure it such | ||
244 | * that the SATA ports are in AHCI function while the PATA ports are | ||
245 | * in a separate IDE function. In such cases, match device class and | ||
246 | * attach only to IDE. If libata isn't configured, keep the old | ||
247 | * behavior for backward compatibility. | ||
248 | */ | ||
249 | #if defined(CONFIG_ATA) || defined(CONFIG_ATA_MODULE) | ||
250 | #define JMB_CLASS PCI_CLASS_STORAGE_IDE << 8 | ||
251 | #define JMB_CLASS_MASK 0xffff00 | ||
252 | #else | ||
253 | #define JMB_CLASS 0 | ||
254 | #define JMB_CLASS_MASK 0 | ||
255 | #endif | ||
256 | |||
243 | static struct pci_device_id jmicron_pci_tbl[] = { | 257 | static struct pci_device_id jmicron_pci_tbl[] = { |
244 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB361, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, | 258 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB361, |
245 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB363, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1}, | 259 | PCI_ANY_ID, PCI_ANY_ID, JMB_CLASS, JMB_CLASS_MASK, 0}, |
246 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB365, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 2}, | 260 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB363, |
247 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB366, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 3}, | 261 | PCI_ANY_ID, PCI_ANY_ID, JMB_CLASS, JMB_CLASS_MASK, 1}, |
248 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB368, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 4}, | 262 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB365, |
263 | PCI_ANY_ID, PCI_ANY_ID, JMB_CLASS, JMB_CLASS_MASK, 2}, | ||
264 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB366, | ||
265 | PCI_ANY_ID, PCI_ANY_ID, JMB_CLASS, JMB_CLASS_MASK, 3}, | ||
266 | { PCI_VENDOR_ID_JMICRON, PCI_DEVICE_ID_JMICRON_JMB368, | ||
267 | PCI_ANY_ID, PCI_ANY_ID, JMB_CLASS, JMB_CLASS_MASK, 4}, | ||
249 | { 0, }, | 268 | { 0, }, |
250 | }; | 269 | }; |
251 | 270 | ||
diff --git a/drivers/ide/ppc/scc_pata.c b/drivers/ide/pci/scc_pata.c index f84bf791f72e..f84bf791f72e 100644 --- a/drivers/ide/ppc/scc_pata.c +++ b/drivers/ide/pci/scc_pata.c | |||
diff --git a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c index a52c80fe7d3e..118fb3205ca8 100644 --- a/drivers/ide/setup-pci.c +++ b/drivers/ide/setup-pci.c | |||
@@ -505,11 +505,6 @@ static void ide_hwif_setup_dma(struct pci_dev *dev, ide_pci_device_t *d, ide_hwi | |||
505 | } | 505 | } |
506 | } | 506 | } |
507 | } | 507 | } |
508 | |||
509 | #ifndef CONFIG_IDEDMA_PCI_AUTO | ||
510 | #warning CONFIG_IDEDMA_PCI_AUTO=n support is obsolete, and will be removed soon. | ||
511 | #endif | ||
512 | |||
513 | #endif /* CONFIG_BLK_DEV_IDEDMA_PCI*/ | 508 | #endif /* CONFIG_BLK_DEV_IDEDMA_PCI*/ |
514 | 509 | ||
515 | /** | 510 | /** |
diff --git a/drivers/infiniband/hw/ipath/ipath_dma.c b/drivers/infiniband/hw/ipath/ipath_dma.c index f6f949040825..f87f003e3ef8 100644 --- a/drivers/infiniband/hw/ipath/ipath_dma.c +++ b/drivers/infiniband/hw/ipath/ipath_dma.c | |||
@@ -167,7 +167,7 @@ static void *ipath_dma_alloc_coherent(struct ib_device *dev, size_t size, | |||
167 | } | 167 | } |
168 | 168 | ||
169 | static void ipath_dma_free_coherent(struct ib_device *dev, size_t size, | 169 | static void ipath_dma_free_coherent(struct ib_device *dev, size_t size, |
170 | void *cpu_addr, dma_addr_t dma_handle) | 170 | void *cpu_addr, u64 dma_handle) |
171 | { | 171 | { |
172 | free_pages((unsigned long) cpu_addr, get_order(size)); | 172 | free_pages((unsigned long) cpu_addr, get_order(size)); |
173 | } | 173 | } |
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c index a163bca38973..dc7a8c78cbf9 100644 --- a/drivers/kvm/kvm_main.c +++ b/drivers/kvm/kvm_main.c | |||
@@ -2464,7 +2464,7 @@ int kvm_init_arch(struct kvm_arch_ops *ops, struct module *module) | |||
2464 | 2464 | ||
2465 | r = kvm_arch_ops->hardware_setup(); | 2465 | r = kvm_arch_ops->hardware_setup(); |
2466 | if (r < 0) | 2466 | if (r < 0) |
2467 | return r; | 2467 | goto out; |
2468 | 2468 | ||
2469 | on_each_cpu(kvm_arch_ops->hardware_enable, NULL, 0, 1); | 2469 | on_each_cpu(kvm_arch_ops->hardware_enable, NULL, 0, 1); |
2470 | r = register_cpu_notifier(&kvm_cpu_notifier); | 2470 | r = register_cpu_notifier(&kvm_cpu_notifier); |
@@ -2500,6 +2500,8 @@ out_free_2: | |||
2500 | out_free_1: | 2500 | out_free_1: |
2501 | on_each_cpu(kvm_arch_ops->hardware_disable, NULL, 0, 1); | 2501 | on_each_cpu(kvm_arch_ops->hardware_disable, NULL, 0, 1); |
2502 | kvm_arch_ops->hardware_unsetup(); | 2502 | kvm_arch_ops->hardware_unsetup(); |
2503 | out: | ||
2504 | kvm_arch_ops = NULL; | ||
2503 | return r; | 2505 | return r; |
2504 | } | 2506 | } |
2505 | 2507 | ||
diff --git a/drivers/kvm/mmu.c b/drivers/kvm/mmu.c index a1a93368f314..e85b4c7c36f7 100644 --- a/drivers/kvm/mmu.c +++ b/drivers/kvm/mmu.c | |||
@@ -131,7 +131,7 @@ static int dbg = 1; | |||
131 | (((address) >> PT32_LEVEL_SHIFT(level)) & ((1 << PT32_LEVEL_BITS) - 1)) | 131 | (((address) >> PT32_LEVEL_SHIFT(level)) & ((1 << PT32_LEVEL_BITS) - 1)) |
132 | 132 | ||
133 | 133 | ||
134 | #define PT64_BASE_ADDR_MASK (((1ULL << 52) - 1) & PAGE_MASK) | 134 | #define PT64_BASE_ADDR_MASK (((1ULL << 52) - 1) & ~(u64)(PAGE_SIZE-1)) |
135 | #define PT64_DIR_BASE_ADDR_MASK \ | 135 | #define PT64_DIR_BASE_ADDR_MASK \ |
136 | (PT64_BASE_ADDR_MASK & ~((1ULL << (PAGE_SHIFT + PT64_LEVEL_BITS)) - 1)) | 136 | (PT64_BASE_ADDR_MASK & ~((1ULL << (PAGE_SHIFT + PT64_LEVEL_BITS)) - 1)) |
137 | 137 | ||
@@ -406,8 +406,8 @@ static void rmap_write_protect(struct kvm_vcpu *vcpu, u64 gfn) | |||
406 | spte = desc->shadow_ptes[0]; | 406 | spte = desc->shadow_ptes[0]; |
407 | } | 407 | } |
408 | BUG_ON(!spte); | 408 | BUG_ON(!spte); |
409 | BUG_ON((*spte & PT64_BASE_ADDR_MASK) != | 409 | BUG_ON((*spte & PT64_BASE_ADDR_MASK) >> PAGE_SHIFT |
410 | page_to_pfn(page) << PAGE_SHIFT); | 410 | != page_to_pfn(page)); |
411 | BUG_ON(!(*spte & PT_PRESENT_MASK)); | 411 | BUG_ON(!(*spte & PT_PRESENT_MASK)); |
412 | BUG_ON(!(*spte & PT_WRITABLE_MASK)); | 412 | BUG_ON(!(*spte & PT_WRITABLE_MASK)); |
413 | rmap_printk("rmap_write_protect: spte %p %llx\n", spte, *spte); | 413 | rmap_printk("rmap_write_protect: spte %p %llx\n", spte, *spte); |
@@ -1093,22 +1093,40 @@ out: | |||
1093 | return r; | 1093 | return r; |
1094 | } | 1094 | } |
1095 | 1095 | ||
1096 | static void mmu_pre_write_zap_pte(struct kvm_vcpu *vcpu, | ||
1097 | struct kvm_mmu_page *page, | ||
1098 | u64 *spte) | ||
1099 | { | ||
1100 | u64 pte; | ||
1101 | struct kvm_mmu_page *child; | ||
1102 | |||
1103 | pte = *spte; | ||
1104 | if (is_present_pte(pte)) { | ||
1105 | if (page->role.level == PT_PAGE_TABLE_LEVEL) | ||
1106 | rmap_remove(vcpu, spte); | ||
1107 | else { | ||
1108 | child = page_header(pte & PT64_BASE_ADDR_MASK); | ||
1109 | mmu_page_remove_parent_pte(vcpu, child, spte); | ||
1110 | } | ||
1111 | } | ||
1112 | *spte = 0; | ||
1113 | } | ||
1114 | |||
1096 | void kvm_mmu_pre_write(struct kvm_vcpu *vcpu, gpa_t gpa, int bytes) | 1115 | void kvm_mmu_pre_write(struct kvm_vcpu *vcpu, gpa_t gpa, int bytes) |
1097 | { | 1116 | { |
1098 | gfn_t gfn = gpa >> PAGE_SHIFT; | 1117 | gfn_t gfn = gpa >> PAGE_SHIFT; |
1099 | struct kvm_mmu_page *page; | 1118 | struct kvm_mmu_page *page; |
1100 | struct kvm_mmu_page *child; | ||
1101 | struct hlist_node *node, *n; | 1119 | struct hlist_node *node, *n; |
1102 | struct hlist_head *bucket; | 1120 | struct hlist_head *bucket; |
1103 | unsigned index; | 1121 | unsigned index; |
1104 | u64 *spte; | 1122 | u64 *spte; |
1105 | u64 pte; | ||
1106 | unsigned offset = offset_in_page(gpa); | 1123 | unsigned offset = offset_in_page(gpa); |
1107 | unsigned pte_size; | 1124 | unsigned pte_size; |
1108 | unsigned page_offset; | 1125 | unsigned page_offset; |
1109 | unsigned misaligned; | 1126 | unsigned misaligned; |
1110 | int level; | 1127 | int level; |
1111 | int flooded = 0; | 1128 | int flooded = 0; |
1129 | int npte; | ||
1112 | 1130 | ||
1113 | pgprintk("%s: gpa %llx bytes %d\n", __FUNCTION__, gpa, bytes); | 1131 | pgprintk("%s: gpa %llx bytes %d\n", __FUNCTION__, gpa, bytes); |
1114 | if (gfn == vcpu->last_pt_write_gfn) { | 1132 | if (gfn == vcpu->last_pt_write_gfn) { |
@@ -1144,22 +1162,26 @@ void kvm_mmu_pre_write(struct kvm_vcpu *vcpu, gpa_t gpa, int bytes) | |||
1144 | } | 1162 | } |
1145 | page_offset = offset; | 1163 | page_offset = offset; |
1146 | level = page->role.level; | 1164 | level = page->role.level; |
1165 | npte = 1; | ||
1147 | if (page->role.glevels == PT32_ROOT_LEVEL) { | 1166 | if (page->role.glevels == PT32_ROOT_LEVEL) { |
1148 | page_offset <<= 1; /* 32->64 */ | 1167 | page_offset <<= 1; /* 32->64 */ |
1168 | /* | ||
1169 | * A 32-bit pde maps 4MB while the shadow pdes map | ||
1170 | * only 2MB. So we need to double the offset again | ||
1171 | * and zap two pdes instead of one. | ||
1172 | */ | ||
1173 | if (level == PT32_ROOT_LEVEL) { | ||
1174 | page_offset <<= 1; | ||
1175 | npte = 2; | ||
1176 | } | ||
1149 | page_offset &= ~PAGE_MASK; | 1177 | page_offset &= ~PAGE_MASK; |
1150 | } | 1178 | } |
1151 | spte = __va(page->page_hpa); | 1179 | spte = __va(page->page_hpa); |
1152 | spte += page_offset / sizeof(*spte); | 1180 | spte += page_offset / sizeof(*spte); |
1153 | pte = *spte; | 1181 | while (npte--) { |
1154 | if (is_present_pte(pte)) { | 1182 | mmu_pre_write_zap_pte(vcpu, page, spte); |
1155 | if (level == PT_PAGE_TABLE_LEVEL) | 1183 | ++spte; |
1156 | rmap_remove(vcpu, spte); | ||
1157 | else { | ||
1158 | child = page_header(pte & PT64_BASE_ADDR_MASK); | ||
1159 | mmu_page_remove_parent_pte(vcpu, child, spte); | ||
1160 | } | ||
1161 | } | 1184 | } |
1162 | *spte = 0; | ||
1163 | } | 1185 | } |
1164 | } | 1186 | } |
1165 | 1187 | ||
diff --git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c index c07178e61122..bfa0ce42ea92 100644 --- a/drivers/kvm/vmx.c +++ b/drivers/kvm/vmx.c | |||
@@ -371,10 +371,10 @@ static int vmx_get_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata) | |||
371 | data = vmcs_read32(GUEST_SYSENTER_CS); | 371 | data = vmcs_read32(GUEST_SYSENTER_CS); |
372 | break; | 372 | break; |
373 | case MSR_IA32_SYSENTER_EIP: | 373 | case MSR_IA32_SYSENTER_EIP: |
374 | data = vmcs_read32(GUEST_SYSENTER_EIP); | 374 | data = vmcs_readl(GUEST_SYSENTER_EIP); |
375 | break; | 375 | break; |
376 | case MSR_IA32_SYSENTER_ESP: | 376 | case MSR_IA32_SYSENTER_ESP: |
377 | data = vmcs_read32(GUEST_SYSENTER_ESP); | 377 | data = vmcs_readl(GUEST_SYSENTER_ESP); |
378 | break; | 378 | break; |
379 | default: | 379 | default: |
380 | msr = find_msr_entry(vcpu, msr_index); | 380 | msr = find_msr_entry(vcpu, msr_index); |
@@ -412,10 +412,10 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data) | |||
412 | vmcs_write32(GUEST_SYSENTER_CS, data); | 412 | vmcs_write32(GUEST_SYSENTER_CS, data); |
413 | break; | 413 | break; |
414 | case MSR_IA32_SYSENTER_EIP: | 414 | case MSR_IA32_SYSENTER_EIP: |
415 | vmcs_write32(GUEST_SYSENTER_EIP, data); | 415 | vmcs_writel(GUEST_SYSENTER_EIP, data); |
416 | break; | 416 | break; |
417 | case MSR_IA32_SYSENTER_ESP: | 417 | case MSR_IA32_SYSENTER_ESP: |
418 | vmcs_write32(GUEST_SYSENTER_ESP, data); | 418 | vmcs_writel(GUEST_SYSENTER_ESP, data); |
419 | break; | 419 | break; |
420 | case MSR_IA32_TIME_STAMP_COUNTER: | 420 | case MSR_IA32_TIME_STAMP_COUNTER: |
421 | guest_write_tsc(data); | 421 | guest_write_tsc(data); |
diff --git a/drivers/md/linear.c b/drivers/md/linear.c index c625ddb8833d..d5ecd2d53046 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c | |||
@@ -188,7 +188,7 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks) | |||
188 | for (i=0; i < cnt-1 ; i++) { | 188 | for (i=0; i < cnt-1 ; i++) { |
189 | sector_t sz = 0; | 189 | sector_t sz = 0; |
190 | int j; | 190 | int j; |
191 | for (j=i; i<cnt-1 && sz < min_spacing ; j++) | 191 | for (j = i; j < cnt - 1 && sz < min_spacing; j++) |
192 | sz += conf->disks[j].size; | 192 | sz += conf->disks[j].size; |
193 | if (sz >= min_spacing && sz < conf->hash_spacing) | 193 | if (sz >= min_spacing && sz < conf->hash_spacing) |
194 | conf->hash_spacing = sz; | 194 | conf->hash_spacing = sz; |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c index 1ff5138e4bb6..9916cf32494d 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c +++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c | |||
@@ -1248,10 +1248,10 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw) | |||
1248 | ret |= pvr2_write_register(hdw, 0xaa18, 0x00840000); /*unknown*/ | 1248 | ret |= pvr2_write_register(hdw, 0xaa18, 0x00840000); /*unknown*/ |
1249 | LOCK_TAKE(hdw->ctl_lock); do { | 1249 | LOCK_TAKE(hdw->ctl_lock); do { |
1250 | hdw->cmd_buffer[0] = FX2CMD_FWPOST1; | 1250 | hdw->cmd_buffer[0] = FX2CMD_FWPOST1; |
1251 | ret |= pvr2_send_request(hdw,hdw->cmd_buffer,1,0,0); | 1251 | ret |= pvr2_send_request(hdw,hdw->cmd_buffer,1,NULL,0); |
1252 | hdw->cmd_buffer[0] = FX2CMD_MEMSEL; | 1252 | hdw->cmd_buffer[0] = FX2CMD_MEMSEL; |
1253 | hdw->cmd_buffer[1] = 0; | 1253 | hdw->cmd_buffer[1] = 0; |
1254 | ret |= pvr2_send_request(hdw,hdw->cmd_buffer,2,0,0); | 1254 | ret |= pvr2_send_request(hdw,hdw->cmd_buffer,2,NULL,0); |
1255 | } while (0); LOCK_GIVE(hdw->ctl_lock); | 1255 | } while (0); LOCK_GIVE(hdw->ctl_lock); |
1256 | 1256 | ||
1257 | if (ret) { | 1257 | if (ret) { |
@@ -1320,7 +1320,7 @@ int pvr2_upload_firmware2(struct pvr2_hdw *hdw) | |||
1320 | LOCK_TAKE(hdw->ctl_lock); do { | 1320 | LOCK_TAKE(hdw->ctl_lock); do { |
1321 | hdw->cmd_buffer[0] = FX2CMD_MEMSEL; | 1321 | hdw->cmd_buffer[0] = FX2CMD_MEMSEL; |
1322 | hdw->cmd_buffer[1] = 0; | 1322 | hdw->cmd_buffer[1] = 0; |
1323 | ret |= pvr2_send_request(hdw,hdw->cmd_buffer,2,0,0); | 1323 | ret |= pvr2_send_request(hdw,hdw->cmd_buffer,2,NULL,0); |
1324 | } while (0); LOCK_GIVE(hdw->ctl_lock); | 1324 | } while (0); LOCK_GIVE(hdw->ctl_lock); |
1325 | 1325 | ||
1326 | if (ret) { | 1326 | if (ret) { |
diff --git a/drivers/media/video/pvrusb2/pvrusb2-v4l2.c b/drivers/media/video/pvrusb2/pvrusb2-v4l2.c index 5313d342666e..25d3830b482a 100644 --- a/drivers/media/video/pvrusb2/pvrusb2-v4l2.c +++ b/drivers/media/video/pvrusb2/pvrusb2-v4l2.c | |||
@@ -808,11 +808,11 @@ static void pvr2_v4l2_destroy_no_lock(struct pvr2_v4l2 *vp) | |||
808 | { | 808 | { |
809 | if (vp->dev_video) { | 809 | if (vp->dev_video) { |
810 | pvr2_v4l2_dev_destroy(vp->dev_video); | 810 | pvr2_v4l2_dev_destroy(vp->dev_video); |
811 | vp->dev_video = 0; | 811 | vp->dev_video = NULL; |
812 | } | 812 | } |
813 | if (vp->dev_radio) { | 813 | if (vp->dev_radio) { |
814 | pvr2_v4l2_dev_destroy(vp->dev_radio); | 814 | pvr2_v4l2_dev_destroy(vp->dev_radio); |
815 | vp->dev_radio = 0; | 815 | vp->dev_radio = NULL; |
816 | } | 816 | } |
817 | 817 | ||
818 | pvr2_trace(PVR2_TRACE_STRUCT,"Destroying pvr2_v4l2 id=%p",vp); | 818 | pvr2_trace(PVR2_TRACE_STRUCT,"Destroying pvr2_v4l2 id=%p",vp); |
@@ -1138,7 +1138,7 @@ static void pvr2_v4l2_dev_init(struct pvr2_v4l2_dev *dip, | |||
1138 | { | 1138 | { |
1139 | int mindevnum; | 1139 | int mindevnum; |
1140 | int unit_number; | 1140 | int unit_number; |
1141 | int *nr_ptr = 0; | 1141 | int *nr_ptr = NULL; |
1142 | dip->v4lp = vp; | 1142 | dip->v4lp = vp; |
1143 | 1143 | ||
1144 | 1144 | ||
diff --git a/drivers/mmc/imxmmc.c b/drivers/mmc/imxmmc.c index b060d4bfba29..0de5c9e94e74 100644 --- a/drivers/mmc/imxmmc.c +++ b/drivers/mmc/imxmmc.c | |||
@@ -569,10 +569,12 @@ static int imxmci_cpu_driven_data(struct imxmci_host *host, unsigned int *pstat) | |||
569 | 569 | ||
570 | if(host->dma_dir == DMA_FROM_DEVICE) { | 570 | if(host->dma_dir == DMA_FROM_DEVICE) { |
571 | imxmci_busy_wait_for_status(host, &stat, | 571 | imxmci_busy_wait_for_status(host, &stat, |
572 | STATUS_APPL_BUFF_FF | STATUS_DATA_TRANS_DONE, | 572 | STATUS_APPL_BUFF_FF | STATUS_DATA_TRANS_DONE | |
573 | STATUS_TIME_OUT_READ, | ||
573 | 50, "imxmci_cpu_driven_data read"); | 574 | 50, "imxmci_cpu_driven_data read"); |
574 | 575 | ||
575 | while((stat & (STATUS_APPL_BUFF_FF | STATUS_DATA_TRANS_DONE)) && | 576 | while((stat & (STATUS_APPL_BUFF_FF | STATUS_DATA_TRANS_DONE)) && |
577 | !(stat & STATUS_TIME_OUT_READ) && | ||
576 | (host->data_cnt < 512)) { | 578 | (host->data_cnt < 512)) { |
577 | 579 | ||
578 | udelay(20); /* required for clocks < 8MHz*/ | 580 | udelay(20); /* required for clocks < 8MHz*/ |
@@ -602,6 +604,12 @@ static int imxmci_cpu_driven_data(struct imxmci_host *host, unsigned int *pstat) | |||
602 | if(host->dma_size & 0x1ff) | 604 | if(host->dma_size & 0x1ff) |
603 | stat &= ~STATUS_CRC_READ_ERR; | 605 | stat &= ~STATUS_CRC_READ_ERR; |
604 | 606 | ||
607 | if(stat & STATUS_TIME_OUT_READ) { | ||
608 | dev_dbg(mmc_dev(host->mmc), "imxmci_cpu_driven_data read timeout STATUS = 0x%x\n", | ||
609 | stat); | ||
610 | trans_done = -1; | ||
611 | } | ||
612 | |||
605 | } else { | 613 | } else { |
606 | imxmci_busy_wait_for_status(host, &stat, | 614 | imxmci_busy_wait_for_status(host, &stat, |
607 | STATUS_APPL_BUFF_FE, | 615 | STATUS_APPL_BUFF_FE, |
@@ -709,6 +717,9 @@ static void imxmci_tasklet_fnc(unsigned long data) | |||
709 | */ | 717 | */ |
710 | stat |= host->status_reg; | 718 | stat |= host->status_reg; |
711 | 719 | ||
720 | if(test_bit(IMXMCI_PEND_CPU_DATA_b, &host->pending_events)) | ||
721 | stat &= ~STATUS_CRC_READ_ERR; | ||
722 | |||
712 | if(test_bit(IMXMCI_PEND_WAIT_RESP_b, &host->pending_events)) { | 723 | if(test_bit(IMXMCI_PEND_WAIT_RESP_b, &host->pending_events)) { |
713 | imxmci_busy_wait_for_status(host, &stat, | 724 | imxmci_busy_wait_for_status(host, &stat, |
714 | STATUS_END_CMD_RESP | STATUS_ERR_MASK, | 725 | STATUS_END_CMD_RESP | STATUS_ERR_MASK, |
diff --git a/drivers/net/atl1/atl1_main.c b/drivers/net/atl1/atl1_main.c index 88d4f70035bb..dee3638ad744 100644 --- a/drivers/net/atl1/atl1_main.c +++ b/drivers/net/atl1/atl1_main.c | |||
@@ -1328,7 +1328,7 @@ static int atl1_tx_csum(struct atl1_adapter *adapter, struct sk_buff *skb, | |||
1328 | 1328 | ||
1329 | if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { | 1329 | if (likely(skb->ip_summed == CHECKSUM_PARTIAL)) { |
1330 | cso = skb->h.raw - skb->data; | 1330 | cso = skb->h.raw - skb->data; |
1331 | css = (skb->h.raw + skb->csum) - skb->data; | 1331 | css = (skb->h.raw + skb->csum_offset) - skb->data; |
1332 | if (unlikely(cso & 0x1)) { | 1332 | if (unlikely(cso & 0x1)) { |
1333 | printk(KERN_DEBUG "%s: payload offset != even number\n", | 1333 | printk(KERN_DEBUG "%s: payload offset != even number\n", |
1334 | atl1_driver_name); | 1334 | atl1_driver_name); |
@@ -1562,7 +1562,7 @@ static int atl1_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
1562 | /* mss will be nonzero if we're doing segment offload (TSO/GSO) */ | 1562 | /* mss will be nonzero if we're doing segment offload (TSO/GSO) */ |
1563 | mss = skb_shinfo(skb)->gso_size; | 1563 | mss = skb_shinfo(skb)->gso_size; |
1564 | if (mss) { | 1564 | if (mss) { |
1565 | if (skb->protocol == ntohs(ETH_P_IP)) { | 1565 | if (skb->protocol == htons(ETH_P_IP)) { |
1566 | proto_hdr_len = ((skb->h.raw - skb->data) + | 1566 | proto_hdr_len = ((skb->h.raw - skb->data) + |
1567 | (skb->h.th->doff << 2)); | 1567 | (skb->h.th->doff << 2)); |
1568 | if (unlikely(proto_hdr_len > len)) { | 1568 | if (unlikely(proto_hdr_len > len)) { |
diff --git a/drivers/net/natsemi.c b/drivers/net/natsemi.c index c6172a77a6d7..349b96a3ec4c 100644 --- a/drivers/net/natsemi.c +++ b/drivers/net/natsemi.c | |||
@@ -1712,7 +1712,7 @@ static void init_registers(struct net_device *dev) | |||
1712 | 1712 | ||
1713 | /* Enable interrupts by setting the interrupt mask. */ | 1713 | /* Enable interrupts by setting the interrupt mask. */ |
1714 | writel(DEFAULT_INTR, ioaddr + IntrMask); | 1714 | writel(DEFAULT_INTR, ioaddr + IntrMask); |
1715 | writel(1, ioaddr + IntrEnable); | 1715 | natsemi_irq_enable(dev); |
1716 | 1716 | ||
1717 | writel(RxOn | TxOn, ioaddr + ChipCmd); | 1717 | writel(RxOn | TxOn, ioaddr + ChipCmd); |
1718 | writel(StatsClear, ioaddr + StatsCtrl); /* Clear Stats */ | 1718 | writel(StatsClear, ioaddr + StatsCtrl); /* Clear Stats */ |
@@ -2119,28 +2119,35 @@ static irqreturn_t intr_handler(int irq, void *dev_instance) | |||
2119 | struct netdev_private *np = netdev_priv(dev); | 2119 | struct netdev_private *np = netdev_priv(dev); |
2120 | void __iomem * ioaddr = ns_ioaddr(dev); | 2120 | void __iomem * ioaddr = ns_ioaddr(dev); |
2121 | 2121 | ||
2122 | if (np->hands_off) | 2122 | /* Reading IntrStatus automatically acknowledges so don't do |
2123 | * that while interrupts are disabled, (for example, while a | ||
2124 | * poll is scheduled). */ | ||
2125 | if (np->hands_off || !readl(ioaddr + IntrEnable)) | ||
2123 | return IRQ_NONE; | 2126 | return IRQ_NONE; |
2124 | 2127 | ||
2125 | /* Reading automatically acknowledges. */ | ||
2126 | np->intr_status = readl(ioaddr + IntrStatus); | 2128 | np->intr_status = readl(ioaddr + IntrStatus); |
2127 | 2129 | ||
2130 | if (!np->intr_status) | ||
2131 | return IRQ_NONE; | ||
2132 | |||
2128 | if (netif_msg_intr(np)) | 2133 | if (netif_msg_intr(np)) |
2129 | printk(KERN_DEBUG | 2134 | printk(KERN_DEBUG |
2130 | "%s: Interrupt, status %#08x, mask %#08x.\n", | 2135 | "%s: Interrupt, status %#08x, mask %#08x.\n", |
2131 | dev->name, np->intr_status, | 2136 | dev->name, np->intr_status, |
2132 | readl(ioaddr + IntrMask)); | 2137 | readl(ioaddr + IntrMask)); |
2133 | 2138 | ||
2134 | if (!np->intr_status) | ||
2135 | return IRQ_NONE; | ||
2136 | |||
2137 | prefetch(&np->rx_skbuff[np->cur_rx % RX_RING_SIZE]); | 2139 | prefetch(&np->rx_skbuff[np->cur_rx % RX_RING_SIZE]); |
2138 | 2140 | ||
2139 | if (netif_rx_schedule_prep(dev)) { | 2141 | if (netif_rx_schedule_prep(dev)) { |
2140 | /* Disable interrupts and register for poll */ | 2142 | /* Disable interrupts and register for poll */ |
2141 | natsemi_irq_disable(dev); | 2143 | natsemi_irq_disable(dev); |
2142 | __netif_rx_schedule(dev); | 2144 | __netif_rx_schedule(dev); |
2143 | } | 2145 | } else |
2146 | printk(KERN_WARNING | ||
2147 | "%s: Ignoring interrupt, status %#08x, mask %#08x.\n", | ||
2148 | dev->name, np->intr_status, | ||
2149 | readl(ioaddr + IntrMask)); | ||
2150 | |||
2144 | return IRQ_HANDLED; | 2151 | return IRQ_HANDLED; |
2145 | } | 2152 | } |
2146 | 2153 | ||
@@ -2156,6 +2163,20 @@ static int natsemi_poll(struct net_device *dev, int *budget) | |||
2156 | int work_done = 0; | 2163 | int work_done = 0; |
2157 | 2164 | ||
2158 | do { | 2165 | do { |
2166 | if (netif_msg_intr(np)) | ||
2167 | printk(KERN_DEBUG | ||
2168 | "%s: Poll, status %#08x, mask %#08x.\n", | ||
2169 | dev->name, np->intr_status, | ||
2170 | readl(ioaddr + IntrMask)); | ||
2171 | |||
2172 | /* netdev_rx() may read IntrStatus again if the RX state | ||
2173 | * machine falls over so do it first. */ | ||
2174 | if (np->intr_status & | ||
2175 | (IntrRxDone | IntrRxIntr | RxStatusFIFOOver | | ||
2176 | IntrRxErr | IntrRxOverrun)) { | ||
2177 | netdev_rx(dev, &work_done, work_to_do); | ||
2178 | } | ||
2179 | |||
2159 | if (np->intr_status & | 2180 | if (np->intr_status & |
2160 | (IntrTxDone | IntrTxIntr | IntrTxIdle | IntrTxErr)) { | 2181 | (IntrTxDone | IntrTxIntr | IntrTxIdle | IntrTxErr)) { |
2161 | spin_lock(&np->lock); | 2182 | spin_lock(&np->lock); |
@@ -2167,12 +2188,6 @@ static int natsemi_poll(struct net_device *dev, int *budget) | |||
2167 | if (np->intr_status & IntrAbnormalSummary) | 2188 | if (np->intr_status & IntrAbnormalSummary) |
2168 | netdev_error(dev, np->intr_status); | 2189 | netdev_error(dev, np->intr_status); |
2169 | 2190 | ||
2170 | if (np->intr_status & | ||
2171 | (IntrRxDone | IntrRxIntr | RxStatusFIFOOver | | ||
2172 | IntrRxErr | IntrRxOverrun)) { | ||
2173 | netdev_rx(dev, &work_done, work_to_do); | ||
2174 | } | ||
2175 | |||
2176 | *budget -= work_done; | 2191 | *budget -= work_done; |
2177 | dev->quota -= work_done; | 2192 | dev->quota -= work_done; |
2178 | 2193 | ||
@@ -2399,19 +2414,8 @@ static struct net_device_stats *get_stats(struct net_device *dev) | |||
2399 | #ifdef CONFIG_NET_POLL_CONTROLLER | 2414 | #ifdef CONFIG_NET_POLL_CONTROLLER |
2400 | static void natsemi_poll_controller(struct net_device *dev) | 2415 | static void natsemi_poll_controller(struct net_device *dev) |
2401 | { | 2416 | { |
2402 | struct netdev_private *np = netdev_priv(dev); | ||
2403 | |||
2404 | disable_irq(dev->irq); | 2417 | disable_irq(dev->irq); |
2405 | 2418 | intr_handler(dev->irq, dev); | |
2406 | /* | ||
2407 | * A real interrupt might have already reached us at this point | ||
2408 | * but NAPI might still haven't called us back. As the interrupt | ||
2409 | * status register is cleared by reading, we should prevent an | ||
2410 | * interrupt loss in this case... | ||
2411 | */ | ||
2412 | if (!np->intr_status) | ||
2413 | intr_handler(dev->irq, dev); | ||
2414 | |||
2415 | enable_irq(dev->irq); | 2419 | enable_irq(dev->irq); |
2416 | } | 2420 | } |
2417 | #endif | 2421 | #endif |
@@ -3071,7 +3075,7 @@ static void enable_wol_mode(struct net_device *dev, int enable_intr) | |||
3071 | * Could be used to send a netlink message. | 3075 | * Could be used to send a netlink message. |
3072 | */ | 3076 | */ |
3073 | writel(WOLPkt | LinkChange, ioaddr + IntrMask); | 3077 | writel(WOLPkt | LinkChange, ioaddr + IntrMask); |
3074 | writel(1, ioaddr + IntrEnable); | 3078 | natsemi_irq_enable(dev); |
3075 | } | 3079 | } |
3076 | } | 3080 | } |
3077 | 3081 | ||
@@ -3202,7 +3206,7 @@ static int natsemi_suspend (struct pci_dev *pdev, pm_message_t state) | |||
3202 | disable_irq(dev->irq); | 3206 | disable_irq(dev->irq); |
3203 | spin_lock_irq(&np->lock); | 3207 | spin_lock_irq(&np->lock); |
3204 | 3208 | ||
3205 | writel(0, ioaddr + IntrEnable); | 3209 | natsemi_irq_disable(dev); |
3206 | np->hands_off = 1; | 3210 | np->hands_off = 1; |
3207 | natsemi_stop_rxtx(dev); | 3211 | natsemi_stop_rxtx(dev); |
3208 | netif_stop_queue(dev); | 3212 | netif_stop_queue(dev); |
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h index 81742e4e5610..dd8ce35332fe 100644 --- a/drivers/net/netxen/netxen_nic.h +++ b/drivers/net/netxen/netxen_nic.h | |||
@@ -232,6 +232,7 @@ enum { | |||
232 | #define MPORT_SINGLE_FUNCTION_MODE 0x1111 | 232 | #define MPORT_SINGLE_FUNCTION_MODE 0x1111 |
233 | 233 | ||
234 | extern unsigned long long netxen_dma_mask; | 234 | extern unsigned long long netxen_dma_mask; |
235 | extern unsigned long last_schedule_time; | ||
235 | 236 | ||
236 | /* | 237 | /* |
237 | * NetXen host-peg signal message structure | 238 | * NetXen host-peg signal message structure |
diff --git a/drivers/net/netxen/netxen_nic_ethtool.c b/drivers/net/netxen/netxen_nic_ethtool.c index 986ef98db229..ee1b5a24cbe7 100644 --- a/drivers/net/netxen/netxen_nic_ethtool.c +++ b/drivers/net/netxen/netxen_nic_ethtool.c | |||
@@ -462,6 +462,7 @@ netxen_nic_set_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, | |||
462 | } | 462 | } |
463 | printk(KERN_INFO "%s: flash unlocked. \n", | 463 | printk(KERN_INFO "%s: flash unlocked. \n", |
464 | netxen_nic_driver_name); | 464 | netxen_nic_driver_name); |
465 | last_schedule_time = jiffies; | ||
465 | ret = netxen_flash_erase_secondary(adapter); | 466 | ret = netxen_flash_erase_secondary(adapter); |
466 | if (ret != FLASH_SUCCESS) { | 467 | if (ret != FLASH_SUCCESS) { |
467 | printk(KERN_ERR "%s: Flash erase failed.\n", | 468 | printk(KERN_ERR "%s: Flash erase failed.\n", |
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c index 1be55702557d..6537574a9cda 100644 --- a/drivers/net/netxen/netxen_nic_hw.c +++ b/drivers/net/netxen/netxen_nic_hw.c | |||
@@ -822,7 +822,10 @@ int netxen_nic_set_mtu_xgb(struct netxen_port *port, int new_mtu) | |||
822 | { | 822 | { |
823 | struct netxen_adapter *adapter = port->adapter; | 823 | struct netxen_adapter *adapter = port->adapter; |
824 | new_mtu += NETXEN_NIU_HDRSIZE + NETXEN_NIU_TLRSIZE; | 824 | new_mtu += NETXEN_NIU_HDRSIZE + NETXEN_NIU_TLRSIZE; |
825 | netxen_nic_write_w0(adapter, NETXEN_NIU_XGE_MAX_FRAME_SIZE, new_mtu); | 825 | if (port->portnum == 0) |
826 | netxen_nic_write_w0(adapter, NETXEN_NIU_XGE_MAX_FRAME_SIZE, new_mtu); | ||
827 | else if (port->portnum == 1) | ||
828 | netxen_nic_write_w0(adapter, NETXEN_NIU_XG1_MAX_FRAME_SIZE, new_mtu); | ||
826 | return 0; | 829 | return 0; |
827 | } | 830 | } |
828 | 831 | ||
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index 586d32b676af..229aa1c4fb79 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c | |||
@@ -42,6 +42,8 @@ struct crb_addr_pair { | |||
42 | u32 data; | 42 | u32 data; |
43 | }; | 43 | }; |
44 | 44 | ||
45 | unsigned long last_schedule_time; | ||
46 | |||
45 | #define NETXEN_MAX_CRB_XFORM 60 | 47 | #define NETXEN_MAX_CRB_XFORM 60 |
46 | static unsigned int crb_addr_xform[NETXEN_MAX_CRB_XFORM]; | 48 | static unsigned int crb_addr_xform[NETXEN_MAX_CRB_XFORM]; |
47 | #define NETXEN_ADDR_ERROR (0xffffffff) | 49 | #define NETXEN_ADDR_ERROR (0xffffffff) |
@@ -404,9 +406,14 @@ static inline int do_rom_fast_write(struct netxen_adapter *adapter, int addr, | |||
404 | static inline int | 406 | static inline int |
405 | do_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp) | 407 | do_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp) |
406 | { | 408 | { |
409 | if (jiffies > (last_schedule_time + (8 * HZ))) { | ||
410 | last_schedule_time = jiffies; | ||
411 | schedule(); | ||
412 | } | ||
413 | |||
407 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr); | 414 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr); |
408 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3); | 415 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3); |
409 | udelay(70); /* prevent bursting on CRB */ | 416 | udelay(100); /* prevent bursting on CRB */ |
410 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); | 417 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); |
411 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_INSTR_OPCODE, 0xb); | 418 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_INSTR_OPCODE, 0xb); |
412 | if (netxen_wait_rom_done(adapter)) { | 419 | if (netxen_wait_rom_done(adapter)) { |
@@ -415,7 +422,7 @@ do_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp) | |||
415 | } | 422 | } |
416 | /* reset abyte_cnt and dummy_byte_cnt */ | 423 | /* reset abyte_cnt and dummy_byte_cnt */ |
417 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 0); | 424 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 0); |
418 | udelay(70); /* prevent bursting on CRB */ | 425 | udelay(100); /* prevent bursting on CRB */ |
419 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); | 426 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0); |
420 | 427 | ||
421 | *valp = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_ROM_RDATA); | 428 | *valp = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_ROM_RDATA); |
diff --git a/drivers/net/pcmcia/ibmtr_cs.c b/drivers/net/pcmcia/ibmtr_cs.c index a956a51d284f..1060154ae750 100644 --- a/drivers/net/pcmcia/ibmtr_cs.c +++ b/drivers/net/pcmcia/ibmtr_cs.c | |||
@@ -138,7 +138,7 @@ static const struct ethtool_ops netdev_ethtool_ops = { | |||
138 | 138 | ||
139 | ======================================================================*/ | 139 | ======================================================================*/ |
140 | 140 | ||
141 | static int ibmtr_attach(struct pcmcia_device *link) | 141 | static int __devinit ibmtr_attach(struct pcmcia_device *link) |
142 | { | 142 | { |
143 | ibmtr_dev_t *info; | 143 | ibmtr_dev_t *info; |
144 | struct net_device *dev; | 144 | struct net_device *dev; |
@@ -217,7 +217,7 @@ static void ibmtr_detach(struct pcmcia_device *link) | |||
217 | #define CS_CHECK(fn, ret) \ | 217 | #define CS_CHECK(fn, ret) \ |
218 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) | 218 | do { last_fn = (fn); if ((last_ret = (ret)) != 0) goto cs_failed; } while (0) |
219 | 219 | ||
220 | static int ibmtr_config(struct pcmcia_device *link) | 220 | static int __devinit ibmtr_config(struct pcmcia_device *link) |
221 | { | 221 | { |
222 | ibmtr_dev_t *info = link->priv; | 222 | ibmtr_dev_t *info = link->priv; |
223 | struct net_device *dev = info->dev; | 223 | struct net_device *dev = info->dev; |
diff --git a/drivers/net/skge.c b/drivers/net/skge.c index eea75a401b0c..8fecf1b817f7 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c | |||
@@ -3275,24 +3275,30 @@ static int skge_set_mac_address(struct net_device *dev, void *p) | |||
3275 | struct skge_hw *hw = skge->hw; | 3275 | struct skge_hw *hw = skge->hw; |
3276 | unsigned port = skge->port; | 3276 | unsigned port = skge->port; |
3277 | const struct sockaddr *addr = p; | 3277 | const struct sockaddr *addr = p; |
3278 | u16 ctrl; | ||
3278 | 3279 | ||
3279 | if (!is_valid_ether_addr(addr->sa_data)) | 3280 | if (!is_valid_ether_addr(addr->sa_data)) |
3280 | return -EADDRNOTAVAIL; | 3281 | return -EADDRNOTAVAIL; |
3281 | 3282 | ||
3282 | mutex_lock(&hw->phy_mutex); | ||
3283 | memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); | 3283 | memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN); |
3284 | memcpy_toio(hw->regs + B2_MAC_1 + port*8, | ||
3285 | dev->dev_addr, ETH_ALEN); | ||
3286 | memcpy_toio(hw->regs + B2_MAC_2 + port*8, | ||
3287 | dev->dev_addr, ETH_ALEN); | ||
3288 | 3284 | ||
3289 | if (hw->chip_id == CHIP_ID_GENESIS) | 3285 | /* disable Rx */ |
3290 | xm_outaddr(hw, port, XM_SA, dev->dev_addr); | 3286 | ctrl = gma_read16(hw, port, GM_GP_CTRL); |
3291 | else { | 3287 | gma_write16(hw, port, GM_GP_CTRL, ctrl & ~GM_GPCR_RX_ENA); |
3292 | gma_set_addr(hw, port, GM_SRC_ADDR_1L, dev->dev_addr); | 3288 | |
3293 | gma_set_addr(hw, port, GM_SRC_ADDR_2L, dev->dev_addr); | 3289 | memcpy_toio(hw->regs + B2_MAC_1 + port*8, dev->dev_addr, ETH_ALEN); |
3290 | memcpy_toio(hw->regs + B2_MAC_2 + port*8, dev->dev_addr, ETH_ALEN); | ||
3291 | |||
3292 | if (netif_running(dev)) { | ||
3293 | if (hw->chip_id == CHIP_ID_GENESIS) | ||
3294 | xm_outaddr(hw, port, XM_SA, dev->dev_addr); | ||
3295 | else { | ||
3296 | gma_set_addr(hw, port, GM_SRC_ADDR_1L, dev->dev_addr); | ||
3297 | gma_set_addr(hw, port, GM_SRC_ADDR_2L, dev->dev_addr); | ||
3298 | } | ||
3294 | } | 3299 | } |
3295 | mutex_unlock(&hw->phy_mutex); | 3300 | |
3301 | gma_write16(hw, port, GM_GP_CTRL, ctrl); | ||
3296 | 3302 | ||
3297 | return 0; | 3303 | return 0; |
3298 | } | 3304 | } |
diff --git a/drivers/net/tokenring/ibmtr.c b/drivers/net/tokenring/ibmtr.c index 36202e94ee91..01d55315ee8c 100644 --- a/drivers/net/tokenring/ibmtr.c +++ b/drivers/net/tokenring/ibmtr.c | |||
@@ -346,7 +346,7 @@ static void ibmtr_cleanup_card(struct net_device *dev) | |||
346 | * which references it. | 346 | * which references it. |
347 | ****************************************************************************/ | 347 | ****************************************************************************/ |
348 | 348 | ||
349 | static int __init ibmtr_probe(struct net_device *dev) | 349 | static int __devinit ibmtr_probe(struct net_device *dev) |
350 | { | 350 | { |
351 | int i; | 351 | int i; |
352 | int base_addr = dev->base_addr; | 352 | int base_addr = dev->base_addr; |
@@ -366,7 +366,7 @@ static int __init ibmtr_probe(struct net_device *dev) | |||
366 | return -ENODEV; | 366 | return -ENODEV; |
367 | } | 367 | } |
368 | 368 | ||
369 | int __init ibmtr_probe_card(struct net_device *dev) | 369 | int __devinit ibmtr_probe_card(struct net_device *dev) |
370 | { | 370 | { |
371 | int err = ibmtr_probe(dev); | 371 | int err = ibmtr_probe(dev); |
372 | if (!err) { | 372 | if (!err) { |
diff --git a/drivers/net/tulip/dmfe.c b/drivers/net/tulip/dmfe.c index 24a29c99ba94..9aeac76184f3 100644 --- a/drivers/net/tulip/dmfe.c +++ b/drivers/net/tulip/dmfe.c | |||
@@ -190,13 +190,13 @@ | |||
190 | 190 | ||
191 | /* Structure/enum declaration ------------------------------- */ | 191 | /* Structure/enum declaration ------------------------------- */ |
192 | struct tx_desc { | 192 | struct tx_desc { |
193 | u32 tdes0, tdes1, tdes2, tdes3; /* Data for the card */ | 193 | __le32 tdes0, tdes1, tdes2, tdes3; /* Data for the card */ |
194 | char *tx_buf_ptr; /* Data for us */ | 194 | char *tx_buf_ptr; /* Data for us */ |
195 | struct tx_desc *next_tx_desc; | 195 | struct tx_desc *next_tx_desc; |
196 | } __attribute__(( aligned(32) )); | 196 | } __attribute__(( aligned(32) )); |
197 | 197 | ||
198 | struct rx_desc { | 198 | struct rx_desc { |
199 | u32 rdes0, rdes1, rdes2, rdes3; /* Data for the card */ | 199 | __le32 rdes0, rdes1, rdes2, rdes3; /* Data for the card */ |
200 | struct sk_buff *rx_skb_ptr; /* Data for us */ | 200 | struct sk_buff *rx_skb_ptr; /* Data for us */ |
201 | struct rx_desc *next_rx_desc; | 201 | struct rx_desc *next_rx_desc; |
202 | } __attribute__(( aligned(32) )); | 202 | } __attribute__(( aligned(32) )); |
@@ -458,7 +458,7 @@ static int __devinit dmfe_init_one (struct pci_dev *pdev, | |||
458 | 458 | ||
459 | /* read 64 word srom data */ | 459 | /* read 64 word srom data */ |
460 | for (i = 0; i < 64; i++) | 460 | for (i = 0; i < 64; i++) |
461 | ((u16 *) db->srom)[i] = | 461 | ((__le16 *) db->srom)[i] = |
462 | cpu_to_le16(read_srom_word(db->ioaddr, i)); | 462 | cpu_to_le16(read_srom_word(db->ioaddr, i)); |
463 | 463 | ||
464 | /* Set Node address */ | 464 | /* Set Node address */ |
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index 01869b1782e4..ad33e0159514 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
@@ -100,6 +100,7 @@ static void msi_set_mask_bit(unsigned int irq, int flag) | |||
100 | BUG(); | 100 | BUG(); |
101 | break; | 101 | break; |
102 | } | 102 | } |
103 | entry->msi_attrib.masked = !!flag; | ||
103 | } | 104 | } |
104 | 105 | ||
105 | void read_msi_msg(unsigned int irq, struct msi_msg *msg) | 106 | void read_msi_msg(unsigned int irq, struct msi_msg *msg) |
@@ -179,6 +180,7 @@ void write_msi_msg(unsigned int irq, struct msi_msg *msg) | |||
179 | default: | 180 | default: |
180 | BUG(); | 181 | BUG(); |
181 | } | 182 | } |
183 | entry->msg = *msg; | ||
182 | } | 184 | } |
183 | 185 | ||
184 | void mask_msi_irq(unsigned int irq) | 186 | void mask_msi_irq(unsigned int irq) |
@@ -225,164 +227,60 @@ static struct msi_desc* alloc_msi_entry(void) | |||
225 | } | 227 | } |
226 | 228 | ||
227 | #ifdef CONFIG_PM | 229 | #ifdef CONFIG_PM |
228 | static int __pci_save_msi_state(struct pci_dev *dev) | ||
229 | { | ||
230 | int pos, i = 0; | ||
231 | u16 control; | ||
232 | struct pci_cap_saved_state *save_state; | ||
233 | u32 *cap; | ||
234 | |||
235 | if (!dev->msi_enabled) | ||
236 | return 0; | ||
237 | |||
238 | pos = pci_find_capability(dev, PCI_CAP_ID_MSI); | ||
239 | if (pos <= 0) | ||
240 | return 0; | ||
241 | |||
242 | save_state = kzalloc(sizeof(struct pci_cap_saved_state) + sizeof(u32) * 5, | ||
243 | GFP_KERNEL); | ||
244 | if (!save_state) { | ||
245 | printk(KERN_ERR "Out of memory in pci_save_msi_state\n"); | ||
246 | return -ENOMEM; | ||
247 | } | ||
248 | cap = &save_state->data[0]; | ||
249 | |||
250 | pci_read_config_dword(dev, pos, &cap[i++]); | ||
251 | control = cap[0] >> 16; | ||
252 | pci_read_config_dword(dev, pos + PCI_MSI_ADDRESS_LO, &cap[i++]); | ||
253 | if (control & PCI_MSI_FLAGS_64BIT) { | ||
254 | pci_read_config_dword(dev, pos + PCI_MSI_ADDRESS_HI, &cap[i++]); | ||
255 | pci_read_config_dword(dev, pos + PCI_MSI_DATA_64, &cap[i++]); | ||
256 | } else | ||
257 | pci_read_config_dword(dev, pos + PCI_MSI_DATA_32, &cap[i++]); | ||
258 | if (control & PCI_MSI_FLAGS_MASKBIT) | ||
259 | pci_read_config_dword(dev, pos + PCI_MSI_MASK_BIT, &cap[i++]); | ||
260 | save_state->cap_nr = PCI_CAP_ID_MSI; | ||
261 | pci_add_saved_cap(dev, save_state); | ||
262 | return 0; | ||
263 | } | ||
264 | |||
265 | static void __pci_restore_msi_state(struct pci_dev *dev) | 230 | static void __pci_restore_msi_state(struct pci_dev *dev) |
266 | { | 231 | { |
267 | int i = 0, pos; | 232 | int pos; |
268 | u16 control; | 233 | u16 control; |
269 | struct pci_cap_saved_state *save_state; | 234 | struct msi_desc *entry; |
270 | u32 *cap; | ||
271 | 235 | ||
272 | if (!dev->msi_enabled) | 236 | if (!dev->msi_enabled) |
273 | return; | 237 | return; |
274 | 238 | ||
275 | save_state = pci_find_saved_cap(dev, PCI_CAP_ID_MSI); | 239 | entry = get_irq_msi(dev->irq); |
276 | pos = pci_find_capability(dev, PCI_CAP_ID_MSI); | 240 | pos = entry->msi_attrib.pos; |
277 | if (!save_state || pos <= 0) | ||
278 | return; | ||
279 | cap = &save_state->data[0]; | ||
280 | 241 | ||
281 | pci_intx(dev, 0); /* disable intx */ | 242 | pci_intx(dev, 0); /* disable intx */ |
282 | control = cap[i++] >> 16; | ||
283 | msi_set_enable(dev, 0); | 243 | msi_set_enable(dev, 0); |
284 | pci_write_config_dword(dev, pos + PCI_MSI_ADDRESS_LO, cap[i++]); | 244 | write_msi_msg(dev->irq, &entry->msg); |
285 | if (control & PCI_MSI_FLAGS_64BIT) { | 245 | if (entry->msi_attrib.maskbit) |
286 | pci_write_config_dword(dev, pos + PCI_MSI_ADDRESS_HI, cap[i++]); | 246 | msi_set_mask_bit(dev->irq, entry->msi_attrib.masked); |
287 | pci_write_config_dword(dev, pos + PCI_MSI_DATA_64, cap[i++]); | 247 | |
288 | } else | 248 | pci_read_config_word(dev, pos + PCI_MSI_FLAGS, &control); |
289 | pci_write_config_dword(dev, pos + PCI_MSI_DATA_32, cap[i++]); | 249 | control &= ~(PCI_MSI_FLAGS_QSIZE | PCI_MSI_FLAGS_ENABLE); |
290 | if (control & PCI_MSI_FLAGS_MASKBIT) | 250 | if (entry->msi_attrib.maskbit || !entry->msi_attrib.masked) |
291 | pci_write_config_dword(dev, pos + PCI_MSI_MASK_BIT, cap[i++]); | 251 | control |= PCI_MSI_FLAGS_ENABLE; |
292 | pci_write_config_word(dev, pos + PCI_MSI_FLAGS, control); | 252 | pci_write_config_word(dev, pos + PCI_MSI_FLAGS, control); |
293 | pci_remove_saved_cap(save_state); | ||
294 | kfree(save_state); | ||
295 | } | ||
296 | |||
297 | static int __pci_save_msix_state(struct pci_dev *dev) | ||
298 | { | ||
299 | int pos; | ||
300 | int irq, head, tail = 0; | ||
301 | u16 control; | ||
302 | struct pci_cap_saved_state *save_state; | ||
303 | |||
304 | if (!dev->msix_enabled) | ||
305 | return 0; | ||
306 | |||
307 | pos = pci_find_capability(dev, PCI_CAP_ID_MSIX); | ||
308 | if (pos <= 0) | ||
309 | return 0; | ||
310 | |||
311 | /* save the capability */ | ||
312 | pci_read_config_word(dev, msi_control_reg(pos), &control); | ||
313 | save_state = kzalloc(sizeof(struct pci_cap_saved_state) + sizeof(u16), | ||
314 | GFP_KERNEL); | ||
315 | if (!save_state) { | ||
316 | printk(KERN_ERR "Out of memory in pci_save_msix_state\n"); | ||
317 | return -ENOMEM; | ||
318 | } | ||
319 | *((u16 *)&save_state->data[0]) = control; | ||
320 | |||
321 | /* save the table */ | ||
322 | irq = head = dev->first_msi_irq; | ||
323 | while (head != tail) { | ||
324 | struct msi_desc *entry; | ||
325 | |||
326 | entry = get_irq_msi(irq); | ||
327 | read_msi_msg(irq, &entry->msg_save); | ||
328 | |||
329 | tail = entry->link.tail; | ||
330 | irq = tail; | ||
331 | } | ||
332 | |||
333 | save_state->cap_nr = PCI_CAP_ID_MSIX; | ||
334 | pci_add_saved_cap(dev, save_state); | ||
335 | return 0; | ||
336 | } | ||
337 | |||
338 | int pci_save_msi_state(struct pci_dev *dev) | ||
339 | { | ||
340 | int rc; | ||
341 | |||
342 | rc = __pci_save_msi_state(dev); | ||
343 | if (rc) | ||
344 | return rc; | ||
345 | |||
346 | rc = __pci_save_msix_state(dev); | ||
347 | |||
348 | return rc; | ||
349 | } | 253 | } |
350 | 254 | ||
351 | static void __pci_restore_msix_state(struct pci_dev *dev) | 255 | static void __pci_restore_msix_state(struct pci_dev *dev) |
352 | { | 256 | { |
353 | u16 save; | ||
354 | int pos; | 257 | int pos; |
355 | int irq, head, tail = 0; | 258 | int irq, head, tail = 0; |
356 | struct msi_desc *entry; | 259 | struct msi_desc *entry; |
357 | struct pci_cap_saved_state *save_state; | 260 | u16 control; |
358 | 261 | ||
359 | if (!dev->msix_enabled) | 262 | if (!dev->msix_enabled) |
360 | return; | 263 | return; |
361 | 264 | ||
362 | save_state = pci_find_saved_cap(dev, PCI_CAP_ID_MSIX); | ||
363 | if (!save_state) | ||
364 | return; | ||
365 | save = *((u16 *)&save_state->data[0]); | ||
366 | pci_remove_saved_cap(save_state); | ||
367 | kfree(save_state); | ||
368 | |||
369 | pos = pci_find_capability(dev, PCI_CAP_ID_MSIX); | ||
370 | if (pos <= 0) | ||
371 | return; | ||
372 | |||
373 | /* route the table */ | 265 | /* route the table */ |
374 | pci_intx(dev, 0); /* disable intx */ | 266 | pci_intx(dev, 0); /* disable intx */ |
375 | msix_set_enable(dev, 0); | 267 | msix_set_enable(dev, 0); |
376 | irq = head = dev->first_msi_irq; | 268 | irq = head = dev->first_msi_irq; |
269 | entry = get_irq_msi(irq); | ||
270 | pos = entry->msi_attrib.pos; | ||
377 | while (head != tail) { | 271 | while (head != tail) { |
378 | entry = get_irq_msi(irq); | 272 | entry = get_irq_msi(irq); |
379 | write_msi_msg(irq, &entry->msg_save); | 273 | write_msi_msg(irq, &entry->msg); |
274 | msi_set_mask_bit(irq, entry->msi_attrib.masked); | ||
380 | 275 | ||
381 | tail = entry->link.tail; | 276 | tail = entry->link.tail; |
382 | irq = tail; | 277 | irq = tail; |
383 | } | 278 | } |
384 | 279 | ||
385 | pci_write_config_word(dev, msi_control_reg(pos), save); | 280 | pci_read_config_word(dev, pos + PCI_MSIX_FLAGS, &control); |
281 | control &= ~PCI_MSIX_FLAGS_MASKALL; | ||
282 | control |= PCI_MSIX_FLAGS_ENABLE; | ||
283 | pci_write_config_word(dev, pos + PCI_MSIX_FLAGS, control); | ||
386 | } | 284 | } |
387 | 285 | ||
388 | void pci_restore_msi_state(struct pci_dev *dev) | 286 | void pci_restore_msi_state(struct pci_dev *dev) |
@@ -420,6 +318,7 @@ static int msi_capability_init(struct pci_dev *dev) | |||
420 | entry->msi_attrib.is_64 = is_64bit_address(control); | 318 | entry->msi_attrib.is_64 = is_64bit_address(control); |
421 | entry->msi_attrib.entry_nr = 0; | 319 | entry->msi_attrib.entry_nr = 0; |
422 | entry->msi_attrib.maskbit = is_mask_bit_support(control); | 320 | entry->msi_attrib.maskbit = is_mask_bit_support(control); |
321 | entry->msi_attrib.masked = 1; | ||
423 | entry->msi_attrib.default_irq = dev->irq; /* Save IOAPIC IRQ */ | 322 | entry->msi_attrib.default_irq = dev->irq; /* Save IOAPIC IRQ */ |
424 | entry->msi_attrib.pos = pos; | 323 | entry->msi_attrib.pos = pos; |
425 | if (is_mask_bit_support(control)) { | 324 | if (is_mask_bit_support(control)) { |
@@ -507,6 +406,7 @@ static int msix_capability_init(struct pci_dev *dev, | |||
507 | entry->msi_attrib.is_64 = 1; | 406 | entry->msi_attrib.is_64 = 1; |
508 | entry->msi_attrib.entry_nr = j; | 407 | entry->msi_attrib.entry_nr = j; |
509 | entry->msi_attrib.maskbit = 1; | 408 | entry->msi_attrib.maskbit = 1; |
409 | entry->msi_attrib.masked = 1; | ||
510 | entry->msi_attrib.default_irq = dev->irq; | 410 | entry->msi_attrib.default_irq = dev->irq; |
511 | entry->msi_attrib.pos = pos; | 411 | entry->msi_attrib.pos = pos; |
512 | entry->dev = dev; | 412 | entry->dev = dev; |
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index a32db0628157..d3eab057b2d3 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c | |||
@@ -551,7 +551,9 @@ static int pci_save_pcie_state(struct pci_dev *dev) | |||
551 | if (pos <= 0) | 551 | if (pos <= 0) |
552 | return 0; | 552 | return 0; |
553 | 553 | ||
554 | save_state = kzalloc(sizeof(*save_state) + sizeof(u16) * 4, GFP_KERNEL); | 554 | save_state = pci_find_saved_cap(dev, PCI_CAP_ID_EXP); |
555 | if (!save_state) | ||
556 | save_state = kzalloc(sizeof(*save_state) + sizeof(u16) * 4, GFP_KERNEL); | ||
555 | if (!save_state) { | 557 | if (!save_state) { |
556 | dev_err(&dev->dev, "Out of memory in pci_save_pcie_state\n"); | 558 | dev_err(&dev->dev, "Out of memory in pci_save_pcie_state\n"); |
557 | return -ENOMEM; | 559 | return -ENOMEM; |
@@ -582,8 +584,6 @@ static void pci_restore_pcie_state(struct pci_dev *dev) | |||
582 | pci_write_config_word(dev, pos + PCI_EXP_LNKCTL, cap[i++]); | 584 | pci_write_config_word(dev, pos + PCI_EXP_LNKCTL, cap[i++]); |
583 | pci_write_config_word(dev, pos + PCI_EXP_SLTCTL, cap[i++]); | 585 | pci_write_config_word(dev, pos + PCI_EXP_SLTCTL, cap[i++]); |
584 | pci_write_config_word(dev, pos + PCI_EXP_RTCTL, cap[i++]); | 586 | pci_write_config_word(dev, pos + PCI_EXP_RTCTL, cap[i++]); |
585 | pci_remove_saved_cap(save_state); | ||
586 | kfree(save_state); | ||
587 | } | 587 | } |
588 | 588 | ||
589 | 589 | ||
@@ -597,7 +597,9 @@ static int pci_save_pcix_state(struct pci_dev *dev) | |||
597 | if (pos <= 0) | 597 | if (pos <= 0) |
598 | return 0; | 598 | return 0; |
599 | 599 | ||
600 | save_state = kzalloc(sizeof(*save_state) + sizeof(u16), GFP_KERNEL); | 600 | save_state = pci_find_saved_cap(dev, PCI_CAP_ID_EXP); |
601 | if (!save_state) | ||
602 | save_state = kzalloc(sizeof(*save_state) + sizeof(u16), GFP_KERNEL); | ||
601 | if (!save_state) { | 603 | if (!save_state) { |
602 | dev_err(&dev->dev, "Out of memory in pci_save_pcie_state\n"); | 604 | dev_err(&dev->dev, "Out of memory in pci_save_pcie_state\n"); |
603 | return -ENOMEM; | 605 | return -ENOMEM; |
@@ -622,8 +624,6 @@ static void pci_restore_pcix_state(struct pci_dev *dev) | |||
622 | cap = (u16 *)&save_state->data[0]; | 624 | cap = (u16 *)&save_state->data[0]; |
623 | 625 | ||
624 | pci_write_config_word(dev, pos + PCI_X_CMD, cap[i++]); | 626 | pci_write_config_word(dev, pos + PCI_X_CMD, cap[i++]); |
625 | pci_remove_saved_cap(save_state); | ||
626 | kfree(save_state); | ||
627 | } | 627 | } |
628 | 628 | ||
629 | 629 | ||
@@ -638,8 +638,6 @@ pci_save_state(struct pci_dev *dev) | |||
638 | /* XXX: 100% dword access ok here? */ | 638 | /* XXX: 100% dword access ok here? */ |
639 | for (i = 0; i < 16; i++) | 639 | for (i = 0; i < 16; i++) |
640 | pci_read_config_dword(dev, i * 4,&dev->saved_config_space[i]); | 640 | pci_read_config_dword(dev, i * 4,&dev->saved_config_space[i]); |
641 | if ((i = pci_save_msi_state(dev)) != 0) | ||
642 | return i; | ||
643 | if ((i = pci_save_pcie_state(dev)) != 0) | 641 | if ((i = pci_save_pcie_state(dev)) != 0) |
644 | return i; | 642 | return i; |
645 | if ((i = pci_save_pcix_state(dev)) != 0) | 643 | if ((i = pci_save_pcix_state(dev)) != 0) |
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index ae7a975995a5..62ea04c8af64 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h | |||
@@ -52,10 +52,8 @@ static inline void pci_no_msi(void) { } | |||
52 | #endif | 52 | #endif |
53 | 53 | ||
54 | #if defined(CONFIG_PCI_MSI) && defined(CONFIG_PM) | 54 | #if defined(CONFIG_PCI_MSI) && defined(CONFIG_PM) |
55 | int pci_save_msi_state(struct pci_dev *dev); | ||
56 | void pci_restore_msi_state(struct pci_dev *dev); | 55 | void pci_restore_msi_state(struct pci_dev *dev); |
57 | #else | 56 | #else |
58 | static inline int pci_save_msi_state(struct pci_dev *dev) { return 0; } | ||
59 | static inline void pci_restore_msi_state(struct pci_dev *dev) {} | 57 | static inline void pci_restore_msi_state(struct pci_dev *dev) {} |
60 | #endif | 58 | #endif |
61 | 59 | ||
diff --git a/drivers/pnp/manager.c b/drivers/pnp/manager.c index 5026b345cb30..57e6ab1004d0 100644 --- a/drivers/pnp/manager.c +++ b/drivers/pnp/manager.c | |||
@@ -451,7 +451,7 @@ int pnp_auto_config_dev(struct pnp_dev *dev) | |||
451 | return -EINVAL; | 451 | return -EINVAL; |
452 | 452 | ||
453 | if(!pnp_can_configure(dev)) { | 453 | if(!pnp_can_configure(dev)) { |
454 | pnp_info("Device %s does not support resource configuration.", dev->dev.bus_id); | 454 | pnp_dbg("Device %s does not support resource configuration.", dev->dev.bus_id); |
455 | return -ENODEV; | 455 | return -ENODEV; |
456 | } | 456 | } |
457 | 457 | ||
@@ -482,7 +482,7 @@ int pnp_auto_config_dev(struct pnp_dev *dev) | |||
482 | int pnp_start_dev(struct pnp_dev *dev) | 482 | int pnp_start_dev(struct pnp_dev *dev) |
483 | { | 483 | { |
484 | if (!pnp_can_write(dev)) { | 484 | if (!pnp_can_write(dev)) { |
485 | pnp_info("Device %s does not support activation.", dev->dev.bus_id); | 485 | pnp_dbg("Device %s does not support activation.", dev->dev.bus_id); |
486 | return -EINVAL; | 486 | return -EINVAL; |
487 | } | 487 | } |
488 | 488 | ||
@@ -506,7 +506,7 @@ int pnp_start_dev(struct pnp_dev *dev) | |||
506 | int pnp_stop_dev(struct pnp_dev *dev) | 506 | int pnp_stop_dev(struct pnp_dev *dev) |
507 | { | 507 | { |
508 | if (!pnp_can_disable(dev)) { | 508 | if (!pnp_can_disable(dev)) { |
509 | pnp_info("Device %s does not support disabling.", dev->dev.bus_id); | 509 | pnp_dbg("Device %s does not support disabling.", dev->dev.bus_id); |
510 | return -EINVAL; | 510 | return -EINVAL; |
511 | } | 511 | } |
512 | if (dev->protocol->disable(dev)<0) { | 512 | if (dev->protocol->disable(dev)<0) { |
diff --git a/drivers/ps3/ps3av.c b/drivers/ps3/ps3av.c index 1926b4d3e1f4..d21e04ccb021 100644 --- a/drivers/ps3/ps3av.c +++ b/drivers/ps3/ps3av.c | |||
@@ -24,6 +24,8 @@ | |||
24 | #include <linux/reboot.h> | 24 | #include <linux/reboot.h> |
25 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
26 | #include <linux/ioctl.h> | 26 | #include <linux/ioctl.h> |
27 | |||
28 | #include <asm/firmware.h> | ||
27 | #include <asm/lv1call.h> | 29 | #include <asm/lv1call.h> |
28 | #include <asm/ps3av.h> | 30 | #include <asm/ps3av.h> |
29 | #include <asm/ps3.h> | 31 | #include <asm/ps3.h> |
@@ -947,7 +949,12 @@ static struct ps3_vuart_port_driver ps3av_driver = { | |||
947 | 949 | ||
948 | static int ps3av_module_init(void) | 950 | static int ps3av_module_init(void) |
949 | { | 951 | { |
950 | int error = ps3_vuart_port_driver_register(&ps3av_driver); | 952 | int error; |
953 | |||
954 | if (!firmware_has_feature(FW_FEATURE_PS3_LV1)) | ||
955 | return -ENODEV; | ||
956 | |||
957 | error = ps3_vuart_port_driver_register(&ps3av_driver); | ||
951 | if (error) { | 958 | if (error) { |
952 | printk(KERN_ERR | 959 | printk(KERN_ERR |
953 | "%s: ps3_vuart_port_driver_register failed %d\n", | 960 | "%s: ps3_vuart_port_driver_register failed %d\n", |
diff --git a/drivers/ps3/ps3av_cmd.c b/drivers/ps3/ps3av_cmd.c index 21c97c80aa2e..bc70e81f8cb0 100644 --- a/drivers/ps3/ps3av_cmd.c +++ b/drivers/ps3/ps3av_cmd.c | |||
@@ -485,12 +485,12 @@ static u8 ps3av_cnv_mclk(u32 fs) | |||
485 | 485 | ||
486 | static const u32 ps3av_ns_table[][5] = { | 486 | static const u32 ps3av_ns_table[][5] = { |
487 | /* D1, D2, D3, D4, D5 */ | 487 | /* D1, D2, D3, D4, D5 */ |
488 | [PS3AV_CMD_AUDIO_FS_44K-BASE] { 6272, 6272, 17836, 17836, 8918 }, | 488 | [PS3AV_CMD_AUDIO_FS_44K-BASE] = { 6272, 6272, 17836, 17836, 8918 }, |
489 | [PS3AV_CMD_AUDIO_FS_48K-BASE] { 6144, 6144, 11648, 11648, 5824 }, | 489 | [PS3AV_CMD_AUDIO_FS_48K-BASE] = { 6144, 6144, 11648, 11648, 5824 }, |
490 | [PS3AV_CMD_AUDIO_FS_88K-BASE] { 12544, 12544, 35672, 35672, 17836 }, | 490 | [PS3AV_CMD_AUDIO_FS_88K-BASE] = { 12544, 12544, 35672, 35672, 17836 }, |
491 | [PS3AV_CMD_AUDIO_FS_96K-BASE] { 12288, 12288, 23296, 23296, 11648 }, | 491 | [PS3AV_CMD_AUDIO_FS_96K-BASE] = { 12288, 12288, 23296, 23296, 11648 }, |
492 | [PS3AV_CMD_AUDIO_FS_176K-BASE] { 25088, 25088, 71344, 71344, 35672 }, | 492 | [PS3AV_CMD_AUDIO_FS_176K-BASE] = { 25088, 25088, 71344, 71344, 35672 }, |
493 | [PS3AV_CMD_AUDIO_FS_192K-BASE] { 24576, 24576, 46592, 46592, 23296 } | 493 | [PS3AV_CMD_AUDIO_FS_192K-BASE] = { 24576, 24576, 46592, 46592, 23296 } |
494 | }; | 494 | }; |
495 | 495 | ||
496 | static void ps3av_cnv_ns(u8 *ns, u32 fs, u32 video_vid) | 496 | static void ps3av_cnv_ns(u8 *ns, u32 fs, u32 video_vid) |
@@ -543,9 +543,10 @@ static void ps3av_cnv_ns(u8 *ns, u32 fs, u32 video_vid) | |||
543 | 543 | ||
544 | #undef BASE | 544 | #undef BASE |
545 | 545 | ||
546 | static u8 ps3av_cnv_enable(u32 source, u8 *enable) | 546 | static u8 ps3av_cnv_enable(u32 source, const u8 *enable) |
547 | { | 547 | { |
548 | u8 *p, ret = 0; | 548 | const u8 *p; |
549 | u8 ret = 0; | ||
549 | 550 | ||
550 | if (source == PS3AV_CMD_AUDIO_SOURCE_SPDIF) { | 551 | if (source == PS3AV_CMD_AUDIO_SOURCE_SPDIF) { |
551 | ret = 0x03; | 552 | ret = 0x03; |
@@ -559,9 +560,10 @@ static u8 ps3av_cnv_enable(u32 source, u8 *enable) | |||
559 | return ret; | 560 | return ret; |
560 | } | 561 | } |
561 | 562 | ||
562 | static u8 ps3av_cnv_fifomap(u8 *map) | 563 | static u8 ps3av_cnv_fifomap(const u8 *map) |
563 | { | 564 | { |
564 | u8 *p, ret = 0; | 565 | const u8 *p; |
566 | u8 ret = 0; | ||
565 | 567 | ||
566 | p = map; | 568 | p = map; |
567 | ret = p[0] + (p[1] << 2) + (p[2] << 4) + (p[3] << 6); | 569 | ret = p[0] + (p[1] << 2) + (p[2] << 4) + (p[3] << 6); |
@@ -615,7 +617,7 @@ static void ps3av_cnv_info(struct ps3av_audio_info_frame *info, | |||
615 | info->pb5.lsv = mode->audio_downmix_level; | 617 | info->pb5.lsv = mode->audio_downmix_level; |
616 | } | 618 | } |
617 | 619 | ||
618 | static void ps3av_cnv_chstat(u8 *chstat, u8 *cs_info) | 620 | static void ps3av_cnv_chstat(u8 *chstat, const u8 *cs_info) |
619 | { | 621 | { |
620 | memcpy(chstat, cs_info, 5); | 622 | memcpy(chstat, cs_info, 5); |
621 | } | 623 | } |
diff --git a/drivers/ps3/sys-manager.c b/drivers/ps3/sys-manager.c index 0fc30be8b81e..3aa2b0dcc369 100644 --- a/drivers/ps3/sys-manager.c +++ b/drivers/ps3/sys-manager.c | |||
@@ -22,7 +22,10 @@ | |||
22 | #include <linux/module.h> | 22 | #include <linux/module.h> |
23 | #include <linux/workqueue.h> | 23 | #include <linux/workqueue.h> |
24 | #include <linux/reboot.h> | 24 | #include <linux/reboot.h> |
25 | |||
26 | #include <asm/firmware.h> | ||
25 | #include <asm/ps3.h> | 27 | #include <asm/ps3.h> |
28 | |||
26 | #include "vuart.h" | 29 | #include "vuart.h" |
27 | 30 | ||
28 | MODULE_AUTHOR("Sony Corporation"); | 31 | MODULE_AUTHOR("Sony Corporation"); |
@@ -598,6 +601,9 @@ static struct ps3_vuart_port_driver ps3_sys_manager = { | |||
598 | 601 | ||
599 | static int __init ps3_sys_manager_init(void) | 602 | static int __init ps3_sys_manager_init(void) |
600 | { | 603 | { |
604 | if (!firmware_has_feature(FW_FEATURE_PS3_LV1)) | ||
605 | return -ENODEV; | ||
606 | |||
601 | return ps3_vuart_port_driver_register(&ps3_sys_manager); | 607 | return ps3_vuart_port_driver_register(&ps3_sys_manager); |
602 | } | 608 | } |
603 | 609 | ||
diff --git a/drivers/ps3/vuart.c b/drivers/ps3/vuart.c index 746298107d6f..6c12744eeb9d 100644 --- a/drivers/ps3/vuart.c +++ b/drivers/ps3/vuart.c | |||
@@ -952,7 +952,7 @@ fail_alloc_irq: | |||
952 | kfree(dev->priv); | 952 | kfree(dev->priv); |
953 | dev->priv = NULL; | 953 | dev->priv = NULL; |
954 | fail_alloc: | 954 | fail_alloc: |
955 | vuart_bus_priv.devices[port_number] = 0; | 955 | vuart_bus_priv.devices[port_number] = NULL; |
956 | fail_match: | 956 | fail_match: |
957 | up(&vuart_bus_priv.probe_mutex); | 957 | up(&vuart_bus_priv.probe_mutex); |
958 | dev_dbg(&dev->core, "%s:%d failed\n", __func__, __LINE__); | 958 | dev_dbg(&dev->core, "%s:%d failed\n", __func__, __LINE__); |
@@ -978,7 +978,7 @@ static int ps3_vuart_remove(struct device *_dev) | |||
978 | dev_dbg(&dev->core, "%s:%d: %s no remove method\n", __func__, | 978 | dev_dbg(&dev->core, "%s:%d: %s no remove method\n", __func__, |
979 | __LINE__, dev->core.bus_id); | 979 | __LINE__, dev->core.bus_id); |
980 | 980 | ||
981 | vuart_bus_priv.devices[dev->priv->port_number] = 0; | 981 | vuart_bus_priv.devices[dev->priv->port_number] = NULL; |
982 | 982 | ||
983 | if (--vuart_bus_priv.use_count == 0) { | 983 | if (--vuart_bus_priv.use_count == 0) { |
984 | BUG(); | 984 | BUG(); |
@@ -1031,7 +1031,7 @@ int __init ps3_vuart_bus_init(void) | |||
1031 | pr_debug("%s:%d:\n", __func__, __LINE__); | 1031 | pr_debug("%s:%d:\n", __func__, __LINE__); |
1032 | 1032 | ||
1033 | if (!firmware_has_feature(FW_FEATURE_PS3_LV1)) | 1033 | if (!firmware_has_feature(FW_FEATURE_PS3_LV1)) |
1034 | return 0; | 1034 | return -ENODEV; |
1035 | 1035 | ||
1036 | init_MUTEX(&vuart_bus_priv.probe_mutex); | 1036 | init_MUTEX(&vuart_bus_priv.probe_mutex); |
1037 | result = bus_register(&ps3_vuart_bus); | 1037 | result = bus_register(&ps3_vuart_bus); |
diff --git a/drivers/s390/cio/ccwgroup.c b/drivers/s390/cio/ccwgroup.c index d48e3ca4752c..5aeb68e732b0 100644 --- a/drivers/s390/cio/ccwgroup.c +++ b/drivers/s390/cio/ccwgroup.c | |||
@@ -71,19 +71,31 @@ __ccwgroup_remove_symlinks(struct ccwgroup_device *gdev) | |||
71 | * Provide an 'ungroup' attribute so the user can remove group devices no | 71 | * Provide an 'ungroup' attribute so the user can remove group devices no |
72 | * longer needed or accidentially created. Saves memory :) | 72 | * longer needed or accidentially created. Saves memory :) |
73 | */ | 73 | */ |
74 | static void ccwgroup_ungroup_callback(struct device *dev) | ||
75 | { | ||
76 | struct ccwgroup_device *gdev = to_ccwgroupdev(dev); | ||
77 | |||
78 | __ccwgroup_remove_symlinks(gdev); | ||
79 | device_unregister(dev); | ||
80 | } | ||
81 | |||
74 | static ssize_t | 82 | static ssize_t |
75 | ccwgroup_ungroup_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) | 83 | ccwgroup_ungroup_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) |
76 | { | 84 | { |
77 | struct ccwgroup_device *gdev; | 85 | struct ccwgroup_device *gdev; |
86 | int rc; | ||
78 | 87 | ||
79 | gdev = to_ccwgroupdev(dev); | 88 | gdev = to_ccwgroupdev(dev); |
80 | 89 | ||
81 | if (gdev->state != CCWGROUP_OFFLINE) | 90 | if (gdev->state != CCWGROUP_OFFLINE) |
82 | return -EINVAL; | 91 | return -EINVAL; |
83 | 92 | ||
84 | __ccwgroup_remove_symlinks(gdev); | 93 | /* Note that we cannot unregister the device from one of its |
85 | device_unregister(dev); | 94 | * attribute methods, so we have to use this roundabout approach. |
86 | 95 | */ | |
96 | rc = device_schedule_callback(dev, ccwgroup_ungroup_callback); | ||
97 | if (rc) | ||
98 | count = rc; | ||
87 | return count; | 99 | return count; |
88 | } | 100 | } |
89 | 101 | ||
diff --git a/drivers/s390/cio/qdio.c b/drivers/s390/cio/qdio.c index 5b1e3ff26c0b..05fac0733f3d 100644 --- a/drivers/s390/cio/qdio.c +++ b/drivers/s390/cio/qdio.c | |||
@@ -210,9 +210,11 @@ again: | |||
210 | goto again; | 210 | goto again; |
211 | } | 211 | } |
212 | if (rc < 0) { | 212 | if (rc < 0) { |
213 | QDIO_DBF_TEXT3(1,trace,"sqberr"); | 213 | QDIO_DBF_TEXT3(1,trace,"sqberr"); |
214 | sprintf(dbf_text,"%2x,%2x,%d,%d",tmp_cnt,*cnt,ccq,q_no); | 214 | sprintf(dbf_text,"%2x,%2x",tmp_cnt,*cnt); |
215 | QDIO_DBF_TEXT3(1,trace,dbf_text); | 215 | QDIO_DBF_TEXT3(1,trace,dbf_text); |
216 | sprintf(dbf_text,"%d,%d",ccq,q_no); | ||
217 | QDIO_DBF_TEXT3(1,trace,dbf_text); | ||
216 | q->handler(q->cdev,QDIO_STATUS_ACTIVATE_CHECK_CONDITION| | 218 | q->handler(q->cdev,QDIO_STATUS_ACTIVATE_CHECK_CONDITION| |
217 | QDIO_STATUS_LOOK_FOR_ERROR, | 219 | QDIO_STATUS_LOOK_FOR_ERROR, |
218 | 0, 0, 0, -1, -1, q->int_parm); | 220 | 0, 0, 0, -1, -1, q->int_parm); |
@@ -1250,7 +1252,6 @@ qdio_is_inbound_q_done(struct qdio_q *q) | |||
1250 | if (!no_used) { | 1252 | if (!no_used) { |
1251 | QDIO_DBF_TEXT4(0,trace,"inqisdnA"); | 1253 | QDIO_DBF_TEXT4(0,trace,"inqisdnA"); |
1252 | QDIO_DBF_HEX4(0,trace,&q,sizeof(void*)); | 1254 | QDIO_DBF_HEX4(0,trace,&q,sizeof(void*)); |
1253 | QDIO_DBF_TEXT4(0,trace,dbf_text); | ||
1254 | return 1; | 1255 | return 1; |
1255 | } | 1256 | } |
1256 | if (irq->is_qebsm) { | 1257 | if (irq->is_qebsm) { |
@@ -3371,10 +3372,15 @@ qdio_do_qdio_fill_input(struct qdio_q *q, unsigned int qidx, | |||
3371 | unsigned int count, struct qdio_buffer *buffers) | 3372 | unsigned int count, struct qdio_buffer *buffers) |
3372 | { | 3373 | { |
3373 | struct qdio_irq *irq = (struct qdio_irq *) q->irq_ptr; | 3374 | struct qdio_irq *irq = (struct qdio_irq *) q->irq_ptr; |
3375 | int tmp = 0; | ||
3376 | |||
3374 | qidx &= (QDIO_MAX_BUFFERS_PER_Q - 1); | 3377 | qidx &= (QDIO_MAX_BUFFERS_PER_Q - 1); |
3375 | if (irq->is_qebsm) { | 3378 | if (irq->is_qebsm) { |
3376 | while (count) | 3379 | while (count) { |
3377 | set_slsb(q, &qidx, SLSB_CU_INPUT_EMPTY, &count); | 3380 | tmp = set_slsb(q, &qidx, SLSB_CU_INPUT_EMPTY, &count); |
3381 | if (!tmp) | ||
3382 | return; | ||
3383 | } | ||
3378 | return; | 3384 | return; |
3379 | } | 3385 | } |
3380 | for (;;) { | 3386 | for (;;) { |
@@ -3390,11 +3396,15 @@ qdio_do_qdio_fill_output(struct qdio_q *q, unsigned int qidx, | |||
3390 | unsigned int count, struct qdio_buffer *buffers) | 3396 | unsigned int count, struct qdio_buffer *buffers) |
3391 | { | 3397 | { |
3392 | struct qdio_irq *irq = (struct qdio_irq *) q->irq_ptr; | 3398 | struct qdio_irq *irq = (struct qdio_irq *) q->irq_ptr; |
3399 | int tmp = 0; | ||
3393 | 3400 | ||
3394 | qidx &= (QDIO_MAX_BUFFERS_PER_Q - 1); | 3401 | qidx &= (QDIO_MAX_BUFFERS_PER_Q - 1); |
3395 | if (irq->is_qebsm) { | 3402 | if (irq->is_qebsm) { |
3396 | while (count) | 3403 | while (count) { |
3397 | set_slsb(q, &qidx, SLSB_CU_OUTPUT_PRIMED, &count); | 3404 | tmp = set_slsb(q, &qidx, SLSB_CU_OUTPUT_PRIMED, &count); |
3405 | if (!tmp) | ||
3406 | return; | ||
3407 | } | ||
3398 | return; | 3408 | return; |
3399 | } | 3409 | } |
3400 | 3410 | ||
diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c index c7d1355237b6..181b51772b1b 100644 --- a/drivers/s390/crypto/ap_bus.c +++ b/drivers/s390/crypto/ap_bus.c | |||
@@ -65,6 +65,8 @@ module_param_named(poll_thread, ap_thread_flag, int, 0000); | |||
65 | MODULE_PARM_DESC(poll_thread, "Turn on/off poll thread, default is 1 (on)."); | 65 | MODULE_PARM_DESC(poll_thread, "Turn on/off poll thread, default is 1 (on)."); |
66 | 66 | ||
67 | static struct device *ap_root_device = NULL; | 67 | static struct device *ap_root_device = NULL; |
68 | static DEFINE_SPINLOCK(ap_device_lock); | ||
69 | static LIST_HEAD(ap_device_list); | ||
68 | 70 | ||
69 | /** | 71 | /** |
70 | * Workqueue & timer for bus rescan. | 72 | * Workqueue & timer for bus rescan. |
@@ -457,6 +459,9 @@ static int ap_device_probe(struct device *dev) | |||
457 | int rc; | 459 | int rc; |
458 | 460 | ||
459 | ap_dev->drv = ap_drv; | 461 | ap_dev->drv = ap_drv; |
462 | spin_lock_bh(&ap_device_lock); | ||
463 | list_add(&ap_dev->list, &ap_device_list); | ||
464 | spin_unlock_bh(&ap_device_lock); | ||
460 | rc = ap_drv->probe ? ap_drv->probe(ap_dev) : -ENODEV; | 465 | rc = ap_drv->probe ? ap_drv->probe(ap_dev) : -ENODEV; |
461 | return rc; | 466 | return rc; |
462 | } | 467 | } |
@@ -497,6 +502,9 @@ static int ap_device_remove(struct device *dev) | |||
497 | ap_flush_queue(ap_dev); | 502 | ap_flush_queue(ap_dev); |
498 | if (ap_drv->remove) | 503 | if (ap_drv->remove) |
499 | ap_drv->remove(ap_dev); | 504 | ap_drv->remove(ap_dev); |
505 | spin_lock_bh(&ap_device_lock); | ||
506 | list_del_init(&ap_dev->list); | ||
507 | spin_unlock_bh(&ap_device_lock); | ||
500 | return 0; | 508 | return 0; |
501 | } | 509 | } |
502 | 510 | ||
@@ -772,6 +780,7 @@ static void ap_scan_bus(struct work_struct *unused) | |||
772 | spin_lock_init(&ap_dev->lock); | 780 | spin_lock_init(&ap_dev->lock); |
773 | INIT_LIST_HEAD(&ap_dev->pendingq); | 781 | INIT_LIST_HEAD(&ap_dev->pendingq); |
774 | INIT_LIST_HEAD(&ap_dev->requestq); | 782 | INIT_LIST_HEAD(&ap_dev->requestq); |
783 | INIT_LIST_HEAD(&ap_dev->list); | ||
775 | if (device_type == 0) | 784 | if (device_type == 0) |
776 | ap_probe_device_type(ap_dev); | 785 | ap_probe_device_type(ap_dev); |
777 | else | 786 | else |
@@ -1033,14 +1042,13 @@ static void ap_poll_timeout(unsigned long unused) | |||
1033 | * polling until bit 2^0 of the control flags is not set. If bit 2^1 | 1042 | * polling until bit 2^0 of the control flags is not set. If bit 2^1 |
1034 | * of the control flags has been set arm the poll timer. | 1043 | * of the control flags has been set arm the poll timer. |
1035 | */ | 1044 | */ |
1036 | static int __ap_poll_all(struct device *dev, void *data) | 1045 | static int __ap_poll_all(struct ap_device *ap_dev, unsigned long *flags) |
1037 | { | 1046 | { |
1038 | struct ap_device *ap_dev = to_ap_dev(dev); | ||
1039 | int rc; | 1047 | int rc; |
1040 | 1048 | ||
1041 | spin_lock(&ap_dev->lock); | 1049 | spin_lock(&ap_dev->lock); |
1042 | if (!ap_dev->unregistered) { | 1050 | if (!ap_dev->unregistered) { |
1043 | rc = ap_poll_queue(to_ap_dev(dev), (unsigned long *) data); | 1051 | rc = ap_poll_queue(ap_dev, flags); |
1044 | if (rc) | 1052 | if (rc) |
1045 | ap_dev->unregistered = 1; | 1053 | ap_dev->unregistered = 1; |
1046 | } else | 1054 | } else |
@@ -1054,10 +1062,15 @@ static int __ap_poll_all(struct device *dev, void *data) | |||
1054 | static void ap_poll_all(unsigned long dummy) | 1062 | static void ap_poll_all(unsigned long dummy) |
1055 | { | 1063 | { |
1056 | unsigned long flags; | 1064 | unsigned long flags; |
1065 | struct ap_device *ap_dev; | ||
1057 | 1066 | ||
1058 | do { | 1067 | do { |
1059 | flags = 0; | 1068 | flags = 0; |
1060 | bus_for_each_dev(&ap_bus_type, NULL, &flags, __ap_poll_all); | 1069 | spin_lock(&ap_device_lock); |
1070 | list_for_each_entry(ap_dev, &ap_device_list, list) { | ||
1071 | __ap_poll_all(ap_dev, &flags); | ||
1072 | } | ||
1073 | spin_unlock(&ap_device_lock); | ||
1061 | } while (flags & 1); | 1074 | } while (flags & 1); |
1062 | if (flags & 2) | 1075 | if (flags & 2) |
1063 | ap_schedule_poll_timer(); | 1076 | ap_schedule_poll_timer(); |
@@ -1075,6 +1088,7 @@ static int ap_poll_thread(void *data) | |||
1075 | DECLARE_WAITQUEUE(wait, current); | 1088 | DECLARE_WAITQUEUE(wait, current); |
1076 | unsigned long flags; | 1089 | unsigned long flags; |
1077 | int requests; | 1090 | int requests; |
1091 | struct ap_device *ap_dev; | ||
1078 | 1092 | ||
1079 | set_user_nice(current, 19); | 1093 | set_user_nice(current, 19); |
1080 | while (1) { | 1094 | while (1) { |
@@ -1092,10 +1106,12 @@ static int ap_poll_thread(void *data) | |||
1092 | set_current_state(TASK_RUNNING); | 1106 | set_current_state(TASK_RUNNING); |
1093 | remove_wait_queue(&ap_poll_wait, &wait); | 1107 | remove_wait_queue(&ap_poll_wait, &wait); |
1094 | 1108 | ||
1095 | local_bh_disable(); | ||
1096 | flags = 0; | 1109 | flags = 0; |
1097 | bus_for_each_dev(&ap_bus_type, NULL, &flags, __ap_poll_all); | 1110 | spin_lock_bh(&ap_device_lock); |
1098 | local_bh_enable(); | 1111 | list_for_each_entry(ap_dev, &ap_device_list, list) { |
1112 | __ap_poll_all(ap_dev, &flags); | ||
1113 | } | ||
1114 | spin_unlock_bh(&ap_device_lock); | ||
1099 | } | 1115 | } |
1100 | set_current_state(TASK_RUNNING); | 1116 | set_current_state(TASK_RUNNING); |
1101 | remove_wait_queue(&ap_poll_wait, &wait); | 1117 | remove_wait_queue(&ap_poll_wait, &wait); |
diff --git a/drivers/s390/crypto/ap_bus.h b/drivers/s390/crypto/ap_bus.h index 83b69c01cd6e..008559ea742b 100644 --- a/drivers/s390/crypto/ap_bus.h +++ b/drivers/s390/crypto/ap_bus.h | |||
@@ -106,6 +106,7 @@ struct ap_device { | |||
106 | struct device device; | 106 | struct device device; |
107 | struct ap_driver *drv; /* Pointer to AP device driver. */ | 107 | struct ap_driver *drv; /* Pointer to AP device driver. */ |
108 | spinlock_t lock; /* Per device lock. */ | 108 | spinlock_t lock; /* Per device lock. */ |
109 | struct list_head list; /* private list of all AP devices. */ | ||
109 | 110 | ||
110 | ap_qid_t qid; /* AP queue id. */ | 111 | ap_qid_t qid; /* AP queue id. */ |
111 | int queue_depth; /* AP queue depth.*/ | 112 | int queue_depth; /* AP queue depth.*/ |
diff --git a/drivers/s390/crypto/zcrypt_api.c b/drivers/s390/crypto/zcrypt_api.c index 99761391f340..e3625a47a596 100644 --- a/drivers/s390/crypto/zcrypt_api.c +++ b/drivers/s390/crypto/zcrypt_api.c | |||
@@ -298,14 +298,14 @@ static long zcrypt_rsa_modexpo(struct ica_rsa_modexpo *mex) | |||
298 | get_device(&zdev->ap_dev->device); | 298 | get_device(&zdev->ap_dev->device); |
299 | zdev->request_count++; | 299 | zdev->request_count++; |
300 | __zcrypt_decrease_preference(zdev); | 300 | __zcrypt_decrease_preference(zdev); |
301 | spin_unlock_bh(&zcrypt_device_lock); | ||
302 | if (try_module_get(zdev->ap_dev->drv->driver.owner)) { | 301 | if (try_module_get(zdev->ap_dev->drv->driver.owner)) { |
302 | spin_unlock_bh(&zcrypt_device_lock); | ||
303 | rc = zdev->ops->rsa_modexpo(zdev, mex); | 303 | rc = zdev->ops->rsa_modexpo(zdev, mex); |
304 | spin_lock_bh(&zcrypt_device_lock); | ||
304 | module_put(zdev->ap_dev->drv->driver.owner); | 305 | module_put(zdev->ap_dev->drv->driver.owner); |
305 | } | 306 | } |
306 | else | 307 | else |
307 | rc = -EAGAIN; | 308 | rc = -EAGAIN; |
308 | spin_lock_bh(&zcrypt_device_lock); | ||
309 | zdev->request_count--; | 309 | zdev->request_count--; |
310 | __zcrypt_increase_preference(zdev); | 310 | __zcrypt_increase_preference(zdev); |
311 | put_device(&zdev->ap_dev->device); | 311 | put_device(&zdev->ap_dev->device); |
@@ -373,14 +373,14 @@ static long zcrypt_rsa_crt(struct ica_rsa_modexpo_crt *crt) | |||
373 | get_device(&zdev->ap_dev->device); | 373 | get_device(&zdev->ap_dev->device); |
374 | zdev->request_count++; | 374 | zdev->request_count++; |
375 | __zcrypt_decrease_preference(zdev); | 375 | __zcrypt_decrease_preference(zdev); |
376 | spin_unlock_bh(&zcrypt_device_lock); | ||
377 | if (try_module_get(zdev->ap_dev->drv->driver.owner)) { | 376 | if (try_module_get(zdev->ap_dev->drv->driver.owner)) { |
377 | spin_unlock_bh(&zcrypt_device_lock); | ||
378 | rc = zdev->ops->rsa_modexpo_crt(zdev, crt); | 378 | rc = zdev->ops->rsa_modexpo_crt(zdev, crt); |
379 | spin_lock_bh(&zcrypt_device_lock); | ||
379 | module_put(zdev->ap_dev->drv->driver.owner); | 380 | module_put(zdev->ap_dev->drv->driver.owner); |
380 | } | 381 | } |
381 | else | 382 | else |
382 | rc = -EAGAIN; | 383 | rc = -EAGAIN; |
383 | spin_lock_bh(&zcrypt_device_lock); | ||
384 | zdev->request_count--; | 384 | zdev->request_count--; |
385 | __zcrypt_increase_preference(zdev); | 385 | __zcrypt_increase_preference(zdev); |
386 | put_device(&zdev->ap_dev->device); | 386 | put_device(&zdev->ap_dev->device); |
@@ -408,14 +408,14 @@ static long zcrypt_send_cprb(struct ica_xcRB *xcRB) | |||
408 | get_device(&zdev->ap_dev->device); | 408 | get_device(&zdev->ap_dev->device); |
409 | zdev->request_count++; | 409 | zdev->request_count++; |
410 | __zcrypt_decrease_preference(zdev); | 410 | __zcrypt_decrease_preference(zdev); |
411 | spin_unlock_bh(&zcrypt_device_lock); | ||
412 | if (try_module_get(zdev->ap_dev->drv->driver.owner)) { | 411 | if (try_module_get(zdev->ap_dev->drv->driver.owner)) { |
412 | spin_unlock_bh(&zcrypt_device_lock); | ||
413 | rc = zdev->ops->send_cprb(zdev, xcRB); | 413 | rc = zdev->ops->send_cprb(zdev, xcRB); |
414 | spin_lock_bh(&zcrypt_device_lock); | ||
414 | module_put(zdev->ap_dev->drv->driver.owner); | 415 | module_put(zdev->ap_dev->drv->driver.owner); |
415 | } | 416 | } |
416 | else | 417 | else |
417 | rc = -EAGAIN; | 418 | rc = -EAGAIN; |
418 | spin_lock_bh(&zcrypt_device_lock); | ||
419 | zdev->request_count--; | 419 | zdev->request_count--; |
420 | __zcrypt_increase_preference(zdev); | 420 | __zcrypt_increase_preference(zdev); |
421 | put_device(&zdev->ap_dev->device); | 421 | put_device(&zdev->ap_dev->device); |
diff --git a/drivers/s390/net/qeth.h b/drivers/s390/net/qeth.h index e95c281f1e36..84b108d7c7fd 100644 --- a/drivers/s390/net/qeth.h +++ b/drivers/s390/net/qeth.h | |||
@@ -873,7 +873,7 @@ qeth_realloc_headroom(struct qeth_card *card, struct sk_buff *skb, int size) | |||
873 | } | 873 | } |
874 | 874 | ||
875 | static inline struct sk_buff * | 875 | static inline struct sk_buff * |
876 | qeth_pskb_unshare(struct sk_buff *skb, int pri) | 876 | qeth_pskb_unshare(struct sk_buff *skb, gfp_t pri) |
877 | { | 877 | { |
878 | struct sk_buff *nskb; | 878 | struct sk_buff *nskb; |
879 | if (!skb_cloned(skb)) | 879 | if (!skb_cloned(skb)) |
diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c index c275dcac3f18..939de0de18bc 100644 --- a/drivers/scsi/scsi_sysfs.c +++ b/drivers/scsi/scsi_sysfs.c | |||
@@ -452,10 +452,22 @@ store_rescan_field (struct device *dev, struct device_attribute *attr, const cha | |||
452 | } | 452 | } |
453 | static DEVICE_ATTR(rescan, S_IWUSR, NULL, store_rescan_field); | 453 | static DEVICE_ATTR(rescan, S_IWUSR, NULL, store_rescan_field); |
454 | 454 | ||
455 | static void sdev_store_delete_callback(struct device *dev) | ||
456 | { | ||
457 | scsi_remove_device(to_scsi_device(dev)); | ||
458 | } | ||
459 | |||
455 | static ssize_t sdev_store_delete(struct device *dev, struct device_attribute *attr, const char *buf, | 460 | static ssize_t sdev_store_delete(struct device *dev, struct device_attribute *attr, const char *buf, |
456 | size_t count) | 461 | size_t count) |
457 | { | 462 | { |
458 | scsi_remove_device(to_scsi_device(dev)); | 463 | int rc; |
464 | |||
465 | /* An attribute cannot be unregistered by one of its own methods, | ||
466 | * so we have to use this roundabout approach. | ||
467 | */ | ||
468 | rc = device_schedule_callback(dev, sdev_store_delete_callback); | ||
469 | if (rc) | ||
470 | count = rc; | ||
459 | return count; | 471 | return count; |
460 | }; | 472 | }; |
461 | static DEVICE_ATTR(delete, S_IWUSR, NULL, sdev_store_delete); | 473 | static DEVICE_ATTR(delete, S_IWUSR, NULL, sdev_store_delete); |
diff --git a/drivers/serial/sh-sci.c b/drivers/serial/sh-sci.c index c53b69610a51..46c40bbc4bc6 100644 --- a/drivers/serial/sh-sci.c +++ b/drivers/serial/sh-sci.c | |||
@@ -17,6 +17,9 @@ | |||
17 | * License. See the file "COPYING" in the main directory of this archive | 17 | * License. See the file "COPYING" in the main directory of this archive |
18 | * for more details. | 18 | * for more details. |
19 | */ | 19 | */ |
20 | #if defined(CONFIG_SERIAL_SH_SCI_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) | ||
21 | #define SUPPORT_SYSRQ | ||
22 | #endif | ||
20 | 23 | ||
21 | #undef DEBUG | 24 | #undef DEBUG |
22 | 25 | ||
@@ -49,11 +52,6 @@ | |||
49 | #endif | 52 | #endif |
50 | 53 | ||
51 | #include <asm/sci.h> | 54 | #include <asm/sci.h> |
52 | |||
53 | #if defined(CONFIG_SERIAL_SH_SCI_CONSOLE) && defined(CONFIG_MAGIC_SYSRQ) | ||
54 | #define SUPPORT_SYSRQ | ||
55 | #endif | ||
56 | |||
57 | #include "sh-sci.h" | 55 | #include "sh-sci.h" |
58 | 56 | ||
59 | struct sci_port { | 57 | struct sci_port { |
@@ -645,6 +643,9 @@ static inline int sci_handle_breaks(struct uart_port *port) | |||
645 | struct tty_struct *tty = port->info->tty; | 643 | struct tty_struct *tty = port->info->tty; |
646 | struct sci_port *s = &sci_ports[port->line]; | 644 | struct sci_port *s = &sci_ports[port->line]; |
647 | 645 | ||
646 | if (uart_handle_break(port)) | ||
647 | return 0; | ||
648 | |||
648 | if (!s->break_flag && status & SCxSR_BRK(port)) { | 649 | if (!s->break_flag && status & SCxSR_BRK(port)) { |
649 | #if defined(CONFIG_CPU_SH3) | 650 | #if defined(CONFIG_CPU_SH3) |
650 | /* Debounce break */ | 651 | /* Debounce break */ |
diff --git a/drivers/spi/at25.c b/drivers/spi/at25.c index 48e4f48e779f..8efa07e8b8c2 100644 --- a/drivers/spi/at25.c +++ b/drivers/spi/at25.c | |||
@@ -291,7 +291,7 @@ static int at25_probe(struct spi_device *spi) | |||
291 | */ | 291 | */ |
292 | sr = spi_w8r8(spi, AT25_RDSR); | 292 | sr = spi_w8r8(spi, AT25_RDSR); |
293 | if (sr < 0 || sr & AT25_SR_nRDY) { | 293 | if (sr < 0 || sr & AT25_SR_nRDY) { |
294 | dev_dbg(&at25->spi->dev, "rdsr --> %d (%02x)\n", sr, sr); | 294 | dev_dbg(&spi->dev, "rdsr --> %d (%02x)\n", sr, sr); |
295 | err = -ENXIO; | 295 | err = -ENXIO; |
296 | goto fail; | 296 | goto fail; |
297 | } | 297 | } |
diff --git a/drivers/spi/atmel_spi.c b/drivers/spi/atmel_spi.c index 6fa260d1a9be..66e7bc985797 100644 --- a/drivers/spi/atmel_spi.c +++ b/drivers/spi/atmel_spi.c | |||
@@ -425,7 +425,7 @@ static int atmel_spi_setup(struct spi_device *spi) | |||
425 | if (ret) | 425 | if (ret) |
426 | return ret; | 426 | return ret; |
427 | spi->controller_state = (void *)npcs_pin; | 427 | spi->controller_state = (void *)npcs_pin; |
428 | gpio_direction_output(npcs_pin); | 428 | gpio_direction_output(npcs_pin, !(spi->mode & SPI_CS_HIGH)); |
429 | } | 429 | } |
430 | 430 | ||
431 | dev_dbg(&spi->dev, | 431 | dev_dbg(&spi->dev, |
diff --git a/drivers/spi/spi_bitbang.c b/drivers/spi/spi_bitbang.c index 24a330d82395..88425e1af4d3 100644 --- a/drivers/spi/spi_bitbang.c +++ b/drivers/spi/spi_bitbang.c | |||
@@ -302,10 +302,6 @@ static void bitbang_work(struct work_struct *work) | |||
302 | setup_transfer = NULL; | 302 | setup_transfer = NULL; |
303 | 303 | ||
304 | list_for_each_entry (t, &m->transfers, transfer_list) { | 304 | list_for_each_entry (t, &m->transfers, transfer_list) { |
305 | if (bitbang->shutdown) { | ||
306 | status = -ESHUTDOWN; | ||
307 | break; | ||
308 | } | ||
309 | 305 | ||
310 | /* override or restore speed and wordsize */ | 306 | /* override or restore speed and wordsize */ |
311 | if (t->speed_hz || t->bits_per_word) { | 307 | if (t->speed_hz || t->bits_per_word) { |
@@ -410,8 +406,6 @@ int spi_bitbang_transfer(struct spi_device *spi, struct spi_message *m) | |||
410 | m->status = -EINPROGRESS; | 406 | m->status = -EINPROGRESS; |
411 | 407 | ||
412 | bitbang = spi_master_get_devdata(spi->master); | 408 | bitbang = spi_master_get_devdata(spi->master); |
413 | if (bitbang->shutdown) | ||
414 | return -ESHUTDOWN; | ||
415 | 409 | ||
416 | spin_lock_irqsave(&bitbang->lock, flags); | 410 | spin_lock_irqsave(&bitbang->lock, flags); |
417 | if (!spi->max_speed_hz) | 411 | if (!spi->max_speed_hz) |
@@ -507,28 +501,12 @@ EXPORT_SYMBOL_GPL(spi_bitbang_start); | |||
507 | */ | 501 | */ |
508 | int spi_bitbang_stop(struct spi_bitbang *bitbang) | 502 | int spi_bitbang_stop(struct spi_bitbang *bitbang) |
509 | { | 503 | { |
510 | unsigned limit = 500; | 504 | spi_unregister_master(bitbang->master); |
511 | |||
512 | spin_lock_irq(&bitbang->lock); | ||
513 | bitbang->shutdown = 0; | ||
514 | while (!list_empty(&bitbang->queue) && limit--) { | ||
515 | spin_unlock_irq(&bitbang->lock); | ||
516 | 505 | ||
517 | dev_dbg(bitbang->master->cdev.dev, "wait for queue\n"); | 506 | WARN_ON(!list_empty(&bitbang->queue)); |
518 | msleep(10); | ||
519 | |||
520 | spin_lock_irq(&bitbang->lock); | ||
521 | } | ||
522 | spin_unlock_irq(&bitbang->lock); | ||
523 | if (!list_empty(&bitbang->queue)) { | ||
524 | dev_err(bitbang->master->cdev.dev, "queue didn't empty\n"); | ||
525 | return -EBUSY; | ||
526 | } | ||
527 | 507 | ||
528 | destroy_workqueue(bitbang->workqueue); | 508 | destroy_workqueue(bitbang->workqueue); |
529 | 509 | ||
530 | spi_unregister_master(bitbang->master); | ||
531 | |||
532 | return 0; | 510 | return 0; |
533 | } | 511 | } |
534 | EXPORT_SYMBOL_GPL(spi_bitbang_stop); | 512 | EXPORT_SYMBOL_GPL(spi_bitbang_stop); |
diff --git a/drivers/spi/spi_s3c24xx.c b/drivers/spi/spi_s3c24xx.c index 651379c51ae6..220abce63e4a 100644 --- a/drivers/spi/spi_s3c24xx.c +++ b/drivers/spi/spi_s3c24xx.c | |||
@@ -41,7 +41,7 @@ struct s3c24xx_spi { | |||
41 | int len; | 41 | int len; |
42 | int count; | 42 | int count; |
43 | 43 | ||
44 | int (*set_cs)(struct s3c2410_spi_info *spi, | 44 | void (*set_cs)(struct s3c2410_spi_info *spi, |
45 | int cs, int pol); | 45 | int cs, int pol); |
46 | 46 | ||
47 | /* data buffers */ | 47 | /* data buffers */ |
diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c index 63e50a1f1396..6584cf00f7f3 100644 --- a/drivers/usb/class/usblp.c +++ b/drivers/usb/class/usblp.c | |||
@@ -202,6 +202,7 @@ struct quirk_printer_struct { | |||
202 | 202 | ||
203 | #define USBLP_QUIRK_BIDIR 0x1 /* reports bidir but requires unidirectional mode (no INs/reads) */ | 203 | #define USBLP_QUIRK_BIDIR 0x1 /* reports bidir but requires unidirectional mode (no INs/reads) */ |
204 | #define USBLP_QUIRK_USB_INIT 0x2 /* needs vendor USB init string */ | 204 | #define USBLP_QUIRK_USB_INIT 0x2 /* needs vendor USB init string */ |
205 | #define USBLP_QUIRK_BAD_CLASS 0x4 /* descriptor uses vendor-specific Class or SubClass */ | ||
205 | 206 | ||
206 | static const struct quirk_printer_struct quirk_printers[] = { | 207 | static const struct quirk_printer_struct quirk_printers[] = { |
207 | { 0x03f0, 0x0004, USBLP_QUIRK_BIDIR }, /* HP DeskJet 895C */ | 208 | { 0x03f0, 0x0004, USBLP_QUIRK_BIDIR }, /* HP DeskJet 895C */ |
@@ -218,6 +219,7 @@ static const struct quirk_printer_struct quirk_printers[] = { | |||
218 | { 0x0409, 0xf0be, USBLP_QUIRK_BIDIR }, /* NEC Picty920 (HP OEM) */ | 219 | { 0x0409, 0xf0be, USBLP_QUIRK_BIDIR }, /* NEC Picty920 (HP OEM) */ |
219 | { 0x0409, 0xf1be, USBLP_QUIRK_BIDIR }, /* NEC Picty800 (HP OEM) */ | 220 | { 0x0409, 0xf1be, USBLP_QUIRK_BIDIR }, /* NEC Picty800 (HP OEM) */ |
220 | { 0x0482, 0x0010, USBLP_QUIRK_BIDIR }, /* Kyocera Mita FS 820, by zut <kernel@zut.de> */ | 221 | { 0x0482, 0x0010, USBLP_QUIRK_BIDIR }, /* Kyocera Mita FS 820, by zut <kernel@zut.de> */ |
222 | { 0x04b8, 0x0202, USBLP_QUIRK_BAD_CLASS }, /* Seiko Epson Receipt Printer M129C */ | ||
221 | { 0, 0 } | 223 | { 0, 0 } |
222 | }; | 224 | }; |
223 | 225 | ||
@@ -1048,7 +1050,8 @@ static int usblp_select_alts(struct usblp *usblp) | |||
1048 | ifd = &if_alt->altsetting[i]; | 1050 | ifd = &if_alt->altsetting[i]; |
1049 | 1051 | ||
1050 | if (ifd->desc.bInterfaceClass != 7 || ifd->desc.bInterfaceSubClass != 1) | 1052 | if (ifd->desc.bInterfaceClass != 7 || ifd->desc.bInterfaceSubClass != 1) |
1051 | continue; | 1053 | if (!(usblp->quirks & USBLP_QUIRK_BAD_CLASS)) |
1054 | continue; | ||
1052 | 1055 | ||
1053 | if (ifd->desc.bInterfaceProtocol < USBLP_FIRST_PROTOCOL || | 1056 | if (ifd->desc.bInterfaceProtocol < USBLP_FIRST_PROTOCOL || |
1054 | ifd->desc.bInterfaceProtocol > USBLP_LAST_PROTOCOL) | 1057 | ifd->desc.bInterfaceProtocol > USBLP_LAST_PROTOCOL) |
@@ -1232,6 +1235,7 @@ static struct usb_device_id usblp_ids [] = { | |||
1232 | { USB_INTERFACE_INFO(7, 1, 1) }, | 1235 | { USB_INTERFACE_INFO(7, 1, 1) }, |
1233 | { USB_INTERFACE_INFO(7, 1, 2) }, | 1236 | { USB_INTERFACE_INFO(7, 1, 2) }, |
1234 | { USB_INTERFACE_INFO(7, 1, 3) }, | 1237 | { USB_INTERFACE_INFO(7, 1, 3) }, |
1238 | { USB_DEVICE(0x04b8, 0x0202) }, /* Seiko Epson Receipt Printer M129C */ | ||
1235 | { } /* Terminating entry */ | 1239 | { } /* Terminating entry */ |
1236 | }; | 1240 | }; |
1237 | 1241 | ||
diff --git a/drivers/usb/misc/berry_charge.c b/drivers/usb/misc/berry_charge.c index 60893c6c8221..b15f2fd8dab4 100644 --- a/drivers/usb/misc/berry_charge.c +++ b/drivers/usb/misc/berry_charge.c | |||
@@ -69,7 +69,7 @@ static int magic_charge(struct usb_device *udev) | |||
69 | return retval; | 69 | return retval; |
70 | } | 70 | } |
71 | 71 | ||
72 | dbg(&udev->dev, "Sending first magic command\n"); | 72 | dbg(&udev->dev, "Sending second magic command\n"); |
73 | retval = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), | 73 | retval = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), |
74 | 0xa2, 0x40, 0, 1, dummy_buffer, 0, 100); | 74 | 0xa2, 0x40, 0, 1, dummy_buffer, 0, 100); |
75 | if (retval != 0) { | 75 | if (retval != 0) { |
diff --git a/drivers/usb/net/dm9601.c b/drivers/usb/net/dm9601.c index c0bc52be5e10..5130cc7eb314 100644 --- a/drivers/usb/net/dm9601.c +++ b/drivers/usb/net/dm9601.c | |||
@@ -578,6 +578,14 @@ static const struct usb_device_id products[] = { | |||
578 | USB_DEVICE(0x0a46, 0x9601), /* Davicom USB-100 */ | 578 | USB_DEVICE(0x0a46, 0x9601), /* Davicom USB-100 */ |
579 | .driver_info = (unsigned long)&dm9601_info, | 579 | .driver_info = (unsigned long)&dm9601_info, |
580 | }, | 580 | }, |
581 | { | ||
582 | USB_DEVICE(0x0a46, 0x6688), /* ZT6688 USB NIC */ | ||
583 | .driver_info = (unsigned long)&dm9601_info, | ||
584 | }, | ||
585 | { | ||
586 | USB_DEVICE(0x0a46, 0x0268), /* ShanTou ST268 USB NIC */ | ||
587 | .driver_info = (unsigned long)&dm9601_info, | ||
588 | }, | ||
581 | {}, // END | 589 | {}, // END |
582 | }; | 590 | }; |
583 | 591 | ||
diff --git a/drivers/usb/serial/airprime.c b/drivers/usb/serial/airprime.c index 310a8b5f5906..7538c64a5097 100644 --- a/drivers/usb/serial/airprime.c +++ b/drivers/usb/serial/airprime.c | |||
@@ -18,10 +18,6 @@ | |||
18 | 18 | ||
19 | static struct usb_device_id id_table [] = { | 19 | static struct usb_device_id id_table [] = { |
20 | { USB_DEVICE(0x0c88, 0x17da) }, /* Kyocera Wireless KPC650/Passport */ | 20 | { USB_DEVICE(0x0c88, 0x17da) }, /* Kyocera Wireless KPC650/Passport */ |
21 | { USB_DEVICE(0x1410, 0x1110) }, /* Novatel Wireless Merlin CDMA */ | ||
22 | { USB_DEVICE(0x1410, 0x1130) }, /* Novatel Wireless S720 CDMA/EV-DO */ | ||
23 | { USB_DEVICE(0x1410, 0x2110) }, /* Novatel Wireless U720 CDMA/EV-DO */ | ||
24 | { USB_DEVICE(0x1410, 0x1430) }, /* Novatel Merlin XU870 HSDPA/3G */ | ||
25 | { USB_DEVICE(0x1410, 0x1100) }, /* ExpressCard34 Qualcomm 3G CDMA */ | 21 | { USB_DEVICE(0x1410, 0x1100) }, /* ExpressCard34 Qualcomm 3G CDMA */ |
26 | { USB_DEVICE(0x413c, 0x8115) }, /* Dell Wireless HSDPA 5500 */ | 22 | { USB_DEVICE(0x413c, 0x8115) }, /* Dell Wireless HSDPA 5500 */ |
27 | { }, | 23 | { }, |
diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c index 2d588fb82573..19bf403f9db2 100644 --- a/drivers/usb/serial/mos7720.c +++ b/drivers/usb/serial/mos7720.c | |||
@@ -1628,6 +1628,7 @@ static struct usb_serial_driver moschip7720_2port_driver = { | |||
1628 | .chars_in_buffer = mos7720_chars_in_buffer, | 1628 | .chars_in_buffer = mos7720_chars_in_buffer, |
1629 | .break_ctl = mos7720_break, | 1629 | .break_ctl = mos7720_break, |
1630 | .read_bulk_callback = mos7720_bulk_in_callback, | 1630 | .read_bulk_callback = mos7720_bulk_in_callback, |
1631 | .read_int_callback = mos7720_interrupt_callback, | ||
1631 | }; | 1632 | }; |
1632 | 1633 | ||
1633 | static int __init moschip7720_init(void) | 1634 | static int __init moschip7720_init(void) |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index db92a7fb1f7c..e178e6f40319 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -109,7 +109,6 @@ static int option_send_setup(struct usb_serial_port *port); | |||
109 | #define HUAWEI_PRODUCT_E220 0x1003 | 109 | #define HUAWEI_PRODUCT_E220 0x1003 |
110 | 110 | ||
111 | #define NOVATELWIRELESS_VENDOR_ID 0x1410 | 111 | #define NOVATELWIRELESS_VENDOR_ID 0x1410 |
112 | #define NOVATELWIRELESS_PRODUCT_U740 0x1400 | ||
113 | 112 | ||
114 | #define ANYDATA_VENDOR_ID 0x16d5 | 113 | #define ANYDATA_VENDOR_ID 0x16d5 |
115 | #define ANYDATA_PRODUCT_ID 0x6501 | 114 | #define ANYDATA_PRODUCT_ID 0x6501 |
@@ -152,7 +151,19 @@ static struct usb_device_id option_ids[] = { | |||
152 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_NETWORK) }, | 151 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_NETWORK) }, |
153 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, | 152 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) }, |
154 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220) }, | 153 | { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220) }, |
155 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID,NOVATELWIRELESS_PRODUCT_U740) }, | 154 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1100) }, /* Novatel Merlin XS620/S640 */ |
155 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1110) }, /* Novatel Merlin S620 */ | ||
156 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1120) }, /* Novatel Merlin EX720 */ | ||
157 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1130) }, /* Novatel Merlin S720 */ | ||
158 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1400) }, /* Novatel U730 */ | ||
159 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1410) }, /* Novatel U740 */ | ||
160 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1420) }, /* Novatel EU870 */ | ||
161 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1430) }, /* Novatel Merlin XU870 HSDPA/3G */ | ||
162 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x1430) }, /* Novatel XU870 */ | ||
163 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2100) }, /* Novatel EV620 CDMA/EV-DO */ | ||
164 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2110) }, /* Novatel Merlin ES620 / Merlin ES720 / Ovation U720 */ | ||
165 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2130) }, /* Novatel Merlin ES620 SM Bus */ | ||
166 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, 0x2410) }, /* Novatel EU740 */ | ||
156 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ID) }, | 167 | { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ID) }, |
157 | { } /* Terminating entry */ | 168 | { } /* Terminating entry */ |
158 | }; | 169 | }; |
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 8511352251f3..7639022cdf84 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
@@ -138,6 +138,11 @@ static void destroy_serial(struct kref *kref) | |||
138 | 138 | ||
139 | dbg("%s - %s", __FUNCTION__, serial->type->description); | 139 | dbg("%s - %s", __FUNCTION__, serial->type->description); |
140 | 140 | ||
141 | serial->type->shutdown(serial); | ||
142 | |||
143 | /* return the minor range that this device had */ | ||
144 | return_serial(serial); | ||
145 | |||
141 | for (i = 0; i < serial->num_ports; ++i) | 146 | for (i = 0; i < serial->num_ports; ++i) |
142 | serial->port[i]->open_count = 0; | 147 | serial->port[i]->open_count = 0; |
143 | 148 | ||
@@ -148,12 +153,6 @@ static void destroy_serial(struct kref *kref) | |||
148 | serial->port[i] = NULL; | 153 | serial->port[i] = NULL; |
149 | } | 154 | } |
150 | 155 | ||
151 | if (serial->type->shutdown) | ||
152 | serial->type->shutdown(serial); | ||
153 | |||
154 | /* return the minor range that this device had */ | ||
155 | return_serial(serial); | ||
156 | |||
157 | /* If this is a "fake" port, we have to clean it up here, as it will | 156 | /* If this is a "fake" port, we have to clean it up here, as it will |
158 | * not get cleaned up in port_release() as it was never registered with | 157 | * not get cleaned up in port_release() as it was never registered with |
159 | * the driver core */ | 158 | * the driver core */ |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index 2dd31e3f5107..e13637dfb642 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
@@ -1411,6 +1411,16 @@ UNUSUAL_DEV( 0x22b8, 0x3010, 0x0001, 0x0001, | |||
1411 | US_SC_DEVICE, US_PR_DEVICE, NULL, | 1411 | US_SC_DEVICE, US_PR_DEVICE, NULL, |
1412 | US_FL_FIX_CAPACITY | US_FL_IGNORE_RESIDUE ), | 1412 | US_FL_FIX_CAPACITY | US_FL_IGNORE_RESIDUE ), |
1413 | 1413 | ||
1414 | /* | ||
1415 | * Patch by Pete Zaitcev <zaitcev@redhat.com> | ||
1416 | * Report by Mark Patton. Red Hat bz#208928. | ||
1417 | */ | ||
1418 | UNUSUAL_DEV( 0x22b8, 0x4810, 0x0001, 0x0001, | ||
1419 | "Motorola", | ||
1420 | "RAZR V3i", | ||
1421 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1422 | US_FL_FIX_CAPACITY), | ||
1423 | |||
1414 | /* Reported by Radovan Garabik <garabik@kassiopeia.juls.savba.sk> */ | 1424 | /* Reported by Radovan Garabik <garabik@kassiopeia.juls.savba.sk> */ |
1415 | UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999, | 1425 | UNUSUAL_DEV( 0x2735, 0x100b, 0x0000, 0x9999, |
1416 | "MPIO", | 1426 | "MPIO", |
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index 7f5a59836818..e4f0dd00ae85 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig | |||
@@ -1320,7 +1320,7 @@ config FB_AU1100 | |||
1320 | 1320 | ||
1321 | config FB_AU1200 | 1321 | config FB_AU1200 |
1322 | bool "Au1200 LCD Driver" | 1322 | bool "Au1200 LCD Driver" |
1323 | depends on FB && MIPS && SOC_AU1200 | 1323 | depends on (FB = y) && MIPS && SOC_AU1200 |
1324 | select FB_CFB_FILLRECT | 1324 | select FB_CFB_FILLRECT |
1325 | select FB_CFB_COPYAREA | 1325 | select FB_CFB_COPYAREA |
1326 | select FB_CFB_IMAGEBLIT | 1326 | select FB_CFB_IMAGEBLIT |
@@ -1470,7 +1470,7 @@ config FB_G364 | |||
1470 | 1470 | ||
1471 | config FB_68328 | 1471 | config FB_68328 |
1472 | bool "Motorola 68328 native frame buffer support" | 1472 | bool "Motorola 68328 native frame buffer support" |
1473 | depends on FB && (M68328 || M68EZ328 || M68VZ328) | 1473 | depends on (FB = y) && (M68328 || M68EZ328 || M68VZ328) |
1474 | select FB_CFB_FILLRECT | 1474 | select FB_CFB_FILLRECT |
1475 | select FB_CFB_COPYAREA | 1475 | select FB_CFB_COPYAREA |
1476 | select FB_CFB_IMAGEBLIT | 1476 | select FB_CFB_IMAGEBLIT |
@@ -1616,7 +1616,7 @@ config FB_IBM_GXT4500 | |||
1616 | 1616 | ||
1617 | config FB_PS3 | 1617 | config FB_PS3 |
1618 | bool "PS3 GPU framebuffer driver" | 1618 | bool "PS3 GPU framebuffer driver" |
1619 | depends on FB && PS3_PS3AV | 1619 | depends on (FB = y) && PS3_PS3AV |
1620 | select FB_CFB_FILLRECT | 1620 | select FB_CFB_FILLRECT |
1621 | select FB_CFB_COPYAREA | 1621 | select FB_CFB_COPYAREA |
1622 | select FB_CFB_IMAGEBLIT | 1622 | select FB_CFB_IMAGEBLIT |
diff --git a/drivers/video/backlight/locomolcd.c b/drivers/video/backlight/locomolcd.c index d1312477813e..6b488b8a7eee 100644 --- a/drivers/video/backlight/locomolcd.c +++ b/drivers/video/backlight/locomolcd.c | |||
@@ -199,8 +199,8 @@ static int locomolcd_remove(struct locomo_dev *dev) | |||
199 | { | 199 | { |
200 | unsigned long flags; | 200 | unsigned long flags; |
201 | 201 | ||
202 | locomobl_data.brightness = 0; | 202 | locomolcd_bl_device->props.brightness = 0; |
203 | locomobl_data.power = 0; | 203 | locomolcd_bl_device->props.power = 0; |
204 | locomolcd_set_intensity(locomolcd_bl_device); | 204 | locomolcd_set_intensity(locomolcd_bl_device); |
205 | 205 | ||
206 | backlight_device_unregister(locomolcd_bl_device); | 206 | backlight_device_unregister(locomolcd_bl_device); |
diff --git a/drivers/video/backlight/progear_bl.c b/drivers/video/backlight/progear_bl.c index 702269357861..836ab4df0ef2 100644 --- a/drivers/video/backlight/progear_bl.c +++ b/drivers/video/backlight/progear_bl.c | |||
@@ -65,13 +65,13 @@ static int progearbl_probe(struct platform_device *pdev) | |||
65 | u8 temp; | 65 | u8 temp; |
66 | struct backlight_device *progear_backlight_device; | 66 | struct backlight_device *progear_backlight_device; |
67 | 67 | ||
68 | pmu_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, 0); | 68 | pmu_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, NULL); |
69 | if (!pmu_dev) { | 69 | if (!pmu_dev) { |
70 | printk("ALI M7101 PMU not found.\n"); | 70 | printk("ALI M7101 PMU not found.\n"); |
71 | return -ENODEV; | 71 | return -ENODEV; |
72 | } | 72 | } |
73 | 73 | ||
74 | sb_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, 0); | 74 | sb_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, NULL); |
75 | if (!sb_dev) { | 75 | if (!sb_dev) { |
76 | printk("ALI 1533 SB not found.\n"); | 76 | printk("ALI 1533 SB not found.\n"); |
77 | pci_dev_put(pmu_dev); | 77 | pci_dev_put(pmu_dev); |
diff --git a/drivers/video/bw2.c b/drivers/video/bw2.c index 9bb6257d6918..b0b2e40bbd9f 100644 --- a/drivers/video/bw2.c +++ b/drivers/video/bw2.c | |||
@@ -186,8 +186,7 @@ static int bw2_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) | |||
186 | * Initialisation | 186 | * Initialisation |
187 | */ | 187 | */ |
188 | 188 | ||
189 | static void | 189 | static void __devinit bw2_init_fix(struct fb_info *info, int linebytes) |
190 | bw2_init_fix(struct fb_info *info, int linebytes) | ||
191 | { | 190 | { |
192 | strlcpy(info->fix.id, "bwtwo", sizeof(info->fix.id)); | 191 | strlcpy(info->fix.id, "bwtwo", sizeof(info->fix.id)); |
193 | 192 | ||
@@ -199,43 +198,44 @@ bw2_init_fix(struct fb_info *info, int linebytes) | |||
199 | info->fix.accel = FB_ACCEL_SUN_BWTWO; | 198 | info->fix.accel = FB_ACCEL_SUN_BWTWO; |
200 | } | 199 | } |
201 | 200 | ||
202 | static u8 bw2regs_1600[] __initdata = { | 201 | static u8 bw2regs_1600[] __devinitdata = { |
203 | 0x14, 0x8b, 0x15, 0x28, 0x16, 0x03, 0x17, 0x13, | 202 | 0x14, 0x8b, 0x15, 0x28, 0x16, 0x03, 0x17, 0x13, |
204 | 0x18, 0x7b, 0x19, 0x05, 0x1a, 0x34, 0x1b, 0x2e, | 203 | 0x18, 0x7b, 0x19, 0x05, 0x1a, 0x34, 0x1b, 0x2e, |
205 | 0x1c, 0x00, 0x1d, 0x0a, 0x1e, 0xff, 0x1f, 0x01, | 204 | 0x1c, 0x00, 0x1d, 0x0a, 0x1e, 0xff, 0x1f, 0x01, |
206 | 0x10, 0x21, 0 | 205 | 0x10, 0x21, 0 |
207 | }; | 206 | }; |
208 | 207 | ||
209 | static u8 bw2regs_ecl[] __initdata = { | 208 | static u8 bw2regs_ecl[] __devinitdata = { |
210 | 0x14, 0x65, 0x15, 0x1e, 0x16, 0x04, 0x17, 0x0c, | 209 | 0x14, 0x65, 0x15, 0x1e, 0x16, 0x04, 0x17, 0x0c, |
211 | 0x18, 0x5e, 0x19, 0x03, 0x1a, 0xa7, 0x1b, 0x23, | 210 | 0x18, 0x5e, 0x19, 0x03, 0x1a, 0xa7, 0x1b, 0x23, |
212 | 0x1c, 0x00, 0x1d, 0x08, 0x1e, 0xff, 0x1f, 0x01, | 211 | 0x1c, 0x00, 0x1d, 0x08, 0x1e, 0xff, 0x1f, 0x01, |
213 | 0x10, 0x20, 0 | 212 | 0x10, 0x20, 0 |
214 | }; | 213 | }; |
215 | 214 | ||
216 | static u8 bw2regs_analog[] __initdata = { | 215 | static u8 bw2regs_analog[] __devinitdata = { |
217 | 0x14, 0xbb, 0x15, 0x2b, 0x16, 0x03, 0x17, 0x13, | 216 | 0x14, 0xbb, 0x15, 0x2b, 0x16, 0x03, 0x17, 0x13, |
218 | 0x18, 0xb0, 0x19, 0x03, 0x1a, 0xa6, 0x1b, 0x22, | 217 | 0x18, 0xb0, 0x19, 0x03, 0x1a, 0xa6, 0x1b, 0x22, |
219 | 0x1c, 0x01, 0x1d, 0x05, 0x1e, 0xff, 0x1f, 0x01, | 218 | 0x1c, 0x01, 0x1d, 0x05, 0x1e, 0xff, 0x1f, 0x01, |
220 | 0x10, 0x20, 0 | 219 | 0x10, 0x20, 0 |
221 | }; | 220 | }; |
222 | 221 | ||
223 | static u8 bw2regs_76hz[] __initdata = { | 222 | static u8 bw2regs_76hz[] __devinitdata = { |
224 | 0x14, 0xb7, 0x15, 0x27, 0x16, 0x03, 0x17, 0x0f, | 223 | 0x14, 0xb7, 0x15, 0x27, 0x16, 0x03, 0x17, 0x0f, |
225 | 0x18, 0xae, 0x19, 0x03, 0x1a, 0xae, 0x1b, 0x2a, | 224 | 0x18, 0xae, 0x19, 0x03, 0x1a, 0xae, 0x1b, 0x2a, |
226 | 0x1c, 0x01, 0x1d, 0x09, 0x1e, 0xff, 0x1f, 0x01, | 225 | 0x1c, 0x01, 0x1d, 0x09, 0x1e, 0xff, 0x1f, 0x01, |
227 | 0x10, 0x24, 0 | 226 | 0x10, 0x24, 0 |
228 | }; | 227 | }; |
229 | 228 | ||
230 | static u8 bw2regs_66hz[] __initdata = { | 229 | static u8 bw2regs_66hz[] __devinitdata = { |
231 | 0x14, 0xbb, 0x15, 0x2b, 0x16, 0x04, 0x17, 0x14, | 230 | 0x14, 0xbb, 0x15, 0x2b, 0x16, 0x04, 0x17, 0x14, |
232 | 0x18, 0xae, 0x19, 0x03, 0x1a, 0xa8, 0x1b, 0x24, | 231 | 0x18, 0xae, 0x19, 0x03, 0x1a, 0xa8, 0x1b, 0x24, |
233 | 0x1c, 0x01, 0x1d, 0x05, 0x1e, 0xff, 0x1f, 0x01, | 232 | 0x1c, 0x01, 0x1d, 0x05, 0x1e, 0xff, 0x1f, 0x01, |
234 | 0x10, 0x20, 0 | 233 | 0x10, 0x20, 0 |
235 | }; | 234 | }; |
236 | 235 | ||
237 | static void bw2_do_default_mode(struct bw2_par *par, struct fb_info *info, | 236 | static void __devinit bw2_do_default_mode(struct bw2_par *par, |
238 | int *linebytes) | 237 | struct fb_info *info, |
238 | int *linebytes) | ||
239 | { | 239 | { |
240 | u8 status, mon; | 240 | u8 status, mon; |
241 | u8 *p; | 241 | u8 *p; |
diff --git a/drivers/video/cg14.c b/drivers/video/cg14.c index ec6a51a5822d..b071bb632b97 100644 --- a/drivers/video/cg14.c +++ b/drivers/video/cg14.c | |||
@@ -354,7 +354,8 @@ static int cg14_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) | |||
354 | * Initialisation | 354 | * Initialisation |
355 | */ | 355 | */ |
356 | 356 | ||
357 | static void cg14_init_fix(struct fb_info *info, int linebytes, struct device_node *dp) | 357 | static void __devinit cg14_init_fix(struct fb_info *info, int linebytes, |
358 | struct device_node *dp) | ||
358 | { | 359 | { |
359 | const char *name = dp->name; | 360 | const char *name = dp->name; |
360 | 361 | ||
@@ -368,7 +369,7 @@ static void cg14_init_fix(struct fb_info *info, int linebytes, struct device_nod | |||
368 | info->fix.accel = FB_ACCEL_SUN_CG14; | 369 | info->fix.accel = FB_ACCEL_SUN_CG14; |
369 | } | 370 | } |
370 | 371 | ||
371 | static struct sbus_mmap_map __cg14_mmap_map[CG14_MMAP_ENTRIES] __initdata = { | 372 | static struct sbus_mmap_map __cg14_mmap_map[CG14_MMAP_ENTRIES] __devinitdata = { |
372 | { | 373 | { |
373 | .voff = CG14_REGS, | 374 | .voff = CG14_REGS, |
374 | .poff = 0x80000000, | 375 | .poff = 0x80000000, |
diff --git a/drivers/video/savage/savagefb_driver.c b/drivers/video/savage/savagefb_driver.c index 4afa30522fdb..0166ec2ccf32 100644 --- a/drivers/video/savage/savagefb_driver.c +++ b/drivers/video/savage/savagefb_driver.c | |||
@@ -384,6 +384,19 @@ SavageSetup2DEngine(struct savagefb_par *par) | |||
384 | BCI_SEND(0); | 384 | BCI_SEND(0); |
385 | BCI_SEND(BCI_CMD_SETREG | (1 << 16) | BCI_GBD2); | 385 | BCI_SEND(BCI_CMD_SETREG | (1 << 16) | BCI_GBD2); |
386 | BCI_SEND(GlobalBitmapDescriptor); | 386 | BCI_SEND(GlobalBitmapDescriptor); |
387 | |||
388 | /* | ||
389 | * I don't know why, sending this twice fixes the intial black screen, | ||
390 | * prevents X from crashing at least in Toshiba laptops with SavageIX. | ||
391 | * --Tony | ||
392 | */ | ||
393 | par->bci_ptr = 0; | ||
394 | par->SavageWaitFifo(par, 4); | ||
395 | |||
396 | BCI_SEND(BCI_CMD_SETREG | (1 << 16) | BCI_GBD1); | ||
397 | BCI_SEND(0); | ||
398 | BCI_SEND(BCI_CMD_SETREG | (1 << 16) | BCI_GBD2); | ||
399 | BCI_SEND(GlobalBitmapDescriptor); | ||
387 | } | 400 | } |
388 | 401 | ||
389 | static void savagefb_set_clip(struct fb_info *info) | 402 | static void savagefb_set_clip(struct fb_info *info) |
@@ -496,7 +509,7 @@ static int common_calc_clock(long freq, int min_m, int min_n1, int max_n1, | |||
496 | #ifdef SAVAGEFB_DEBUG | 509 | #ifdef SAVAGEFB_DEBUG |
497 | /* This function is used to debug, it prints out the contents of s3 regs */ | 510 | /* This function is used to debug, it prints out the contents of s3 regs */ |
498 | 511 | ||
499 | static void SavagePrintRegs(void) | 512 | static void SavagePrintRegs(struct savagefb_par *par) |
500 | { | 513 | { |
501 | unsigned char i; | 514 | unsigned char i; |
502 | int vgaCRIndex = 0x3d4; | 515 | int vgaCRIndex = 0x3d4; |
@@ -1525,7 +1538,7 @@ static int savagefb_set_par(struct fb_info *info) | |||
1525 | savagefb_set_fix(info); | 1538 | savagefb_set_fix(info); |
1526 | savagefb_set_clip(info); | 1539 | savagefb_set_clip(info); |
1527 | 1540 | ||
1528 | SavagePrintRegs(); | 1541 | SavagePrintRegs(par); |
1529 | return 0; | 1542 | return 0; |
1530 | } | 1543 | } |
1531 | 1544 | ||
@@ -2155,7 +2168,6 @@ static int __devinit savagefb_probe(struct pci_dev* dev, | |||
2155 | int video_len; | 2168 | int video_len; |
2156 | 2169 | ||
2157 | DBG("savagefb_probe"); | 2170 | DBG("savagefb_probe"); |
2158 | SavagePrintRegs(); | ||
2159 | 2171 | ||
2160 | info = framebuffer_alloc(sizeof(struct savagefb_par), &dev->dev); | 2172 | info = framebuffer_alloc(sizeof(struct savagefb_par), &dev->dev); |
2161 | if (!info) | 2173 | if (!info) |
diff --git a/drivers/video/sstfb.c b/drivers/video/sstfb.c index 59cd1e750f30..62fa5500361d 100644 --- a/drivers/video/sstfb.c +++ b/drivers/video/sstfb.c | |||
@@ -257,6 +257,7 @@ static void __sst_dac_write(u8 __iomem *vbase, u8 reg, u8 val) | |||
257 | r_dprintk("sst_dac_write(%#x, %#x)\n", reg, val); | 257 | r_dprintk("sst_dac_write(%#x, %#x)\n", reg, val); |
258 | reg &= 0x07; | 258 | reg &= 0x07; |
259 | __sst_write(vbase, DAC_DATA,(((u32)reg << 8)) | (u32)val); | 259 | __sst_write(vbase, DAC_DATA,(((u32)reg << 8)) | (u32)val); |
260 | __sst_wait_idle(vbase); | ||
260 | } | 261 | } |
261 | 262 | ||
262 | /* indexed access to ti/att dacs */ | 263 | /* indexed access to ti/att dacs */ |