diff options
Diffstat (limited to 'drivers')
115 files changed, 1152 insertions, 2054 deletions
diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c index 96792a6cc164..c3419182c9a7 100644 --- a/drivers/acpi/tables.c +++ b/drivers/acpi/tables.c | |||
@@ -42,7 +42,7 @@ static char *mps_inti_flags_trigger[] = { "dfl", "edge", "res", "level" }; | |||
42 | 42 | ||
43 | static struct acpi_table_desc initial_tables[ACPI_MAX_TABLES] __initdata; | 43 | static struct acpi_table_desc initial_tables[ACPI_MAX_TABLES] __initdata; |
44 | 44 | ||
45 | static int acpi_apic_instance __initdata = 2; | 45 | static int acpi_apic_instance __initdata; |
46 | 46 | ||
47 | void acpi_table_print_madt_entry(struct acpi_subtable_header *header) | 47 | void acpi_table_print_madt_entry(struct acpi_subtable_header *header) |
48 | { | 48 | { |
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index dc7b56225923..fd27227771b4 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
@@ -80,6 +80,7 @@ enum { | |||
80 | board_ahci_pi = 1, | 80 | board_ahci_pi = 1, |
81 | board_ahci_vt8251 = 2, | 81 | board_ahci_vt8251 = 2, |
82 | board_ahci_ign_iferr = 3, | 82 | board_ahci_ign_iferr = 3, |
83 | board_ahci_sb600 = 4, | ||
83 | 84 | ||
84 | /* global controller registers */ | 85 | /* global controller registers */ |
85 | HOST_CAP = 0x00, /* host capabilities */ | 86 | HOST_CAP = 0x00, /* host capabilities */ |
@@ -168,6 +169,7 @@ enum { | |||
168 | AHCI_FLAG_NO_NCQ = (1 << 24), | 169 | AHCI_FLAG_NO_NCQ = (1 << 24), |
169 | AHCI_FLAG_IGN_IRQ_IF_ERR = (1 << 25), /* ignore IRQ_IF_ERR */ | 170 | AHCI_FLAG_IGN_IRQ_IF_ERR = (1 << 25), /* ignore IRQ_IF_ERR */ |
170 | AHCI_FLAG_HONOR_PI = (1 << 26), /* honor PORTS_IMPL */ | 171 | AHCI_FLAG_HONOR_PI = (1 << 26), /* honor PORTS_IMPL */ |
172 | AHCI_FLAG_IGN_SERR_INTERNAL = (1 << 27), /* ignore SERR_INTERNAL */ | ||
171 | }; | 173 | }; |
172 | 174 | ||
173 | struct ahci_cmd_hdr { | 175 | struct ahci_cmd_hdr { |
@@ -362,6 +364,18 @@ static const struct ata_port_info ahci_port_info[] = { | |||
362 | .udma_mask = 0x7f, /* udma0-6 ; FIXME */ | 364 | .udma_mask = 0x7f, /* udma0-6 ; FIXME */ |
363 | .port_ops = &ahci_ops, | 365 | .port_ops = &ahci_ops, |
364 | }, | 366 | }, |
367 | /* board_ahci_sb600 */ | ||
368 | { | ||
369 | .sht = &ahci_sht, | ||
370 | .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | ||
371 | ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA | | ||
372 | ATA_FLAG_SKIP_D2H_BSY | | ||
373 | AHCI_FLAG_IGN_SERR_INTERNAL, | ||
374 | .pio_mask = 0x1f, /* pio0-4 */ | ||
375 | .udma_mask = 0x7f, /* udma0-6 ; FIXME */ | ||
376 | .port_ops = &ahci_ops, | ||
377 | }, | ||
378 | |||
365 | }; | 379 | }; |
366 | 380 | ||
367 | static const struct pci_device_id ahci_pci_tbl[] = { | 381 | static const struct pci_device_id ahci_pci_tbl[] = { |
@@ -399,7 +413,7 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
399 | PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci_ign_iferr }, | 413 | PCI_CLASS_STORAGE_SATA_AHCI, 0xffffff, board_ahci_ign_iferr }, |
400 | 414 | ||
401 | /* ATI */ | 415 | /* ATI */ |
402 | { PCI_VDEVICE(ATI, 0x4380), board_ahci }, /* ATI SB600 non-raid */ | 416 | { PCI_VDEVICE(ATI, 0x4380), board_ahci_sb600 }, /* ATI SB600 non-raid */ |
403 | { PCI_VDEVICE(ATI, 0x4381), board_ahci }, /* ATI SB600 raid */ | 417 | { PCI_VDEVICE(ATI, 0x4381), board_ahci }, /* ATI SB600 raid */ |
404 | 418 | ||
405 | /* VIA */ | 419 | /* VIA */ |
@@ -1067,8 +1081,11 @@ static void ahci_error_intr(struct ata_port *ap, u32 irq_stat) | |||
1067 | if (ap->flags & AHCI_FLAG_IGN_IRQ_IF_ERR) | 1081 | if (ap->flags & AHCI_FLAG_IGN_IRQ_IF_ERR) |
1068 | irq_stat &= ~PORT_IRQ_IF_ERR; | 1082 | irq_stat &= ~PORT_IRQ_IF_ERR; |
1069 | 1083 | ||
1070 | if (irq_stat & PORT_IRQ_TF_ERR) | 1084 | if (irq_stat & PORT_IRQ_TF_ERR) { |
1071 | err_mask |= AC_ERR_DEV; | 1085 | err_mask |= AC_ERR_DEV; |
1086 | if (ap->flags & AHCI_FLAG_IGN_SERR_INTERNAL) | ||
1087 | serror &= ~SERR_INTERNAL; | ||
1088 | } | ||
1072 | 1089 | ||
1073 | if (irq_stat & (PORT_IRQ_HBUS_ERR | PORT_IRQ_HBUS_DATA_ERR)) { | 1090 | if (irq_stat & (PORT_IRQ_HBUS_ERR | PORT_IRQ_HBUS_DATA_ERR)) { |
1074 | err_mask |= AC_ERR_HOST_BUS; | 1091 | err_mask |= AC_ERR_HOST_BUS; |
diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c index c428a56e6f31..03a0acff6cfa 100644 --- a/drivers/ata/libata-acpi.c +++ b/drivers/ata/libata-acpi.c | |||
@@ -305,7 +305,7 @@ static int do_drive_get_GTF(struct ata_port *ap, int ix, | |||
305 | *gtf_address = 0UL; | 305 | *gtf_address = 0UL; |
306 | *obj_loc = 0UL; | 306 | *obj_loc = 0UL; |
307 | 307 | ||
308 | if (noacpi) | 308 | if (libata_noacpi) |
309 | return 0; | 309 | return 0; |
310 | 310 | ||
311 | if (ata_msg_probe(ap)) | 311 | if (ata_msg_probe(ap)) |
@@ -531,7 +531,7 @@ static int do_drive_set_taskfiles(struct ata_port *ap, | |||
531 | ata_dev_printk(atadev, KERN_DEBUG, "%s: ENTER: port#: %d\n", | 531 | ata_dev_printk(atadev, KERN_DEBUG, "%s: ENTER: port#: %d\n", |
532 | __FUNCTION__, ap->port_no); | 532 | __FUNCTION__, ap->port_no); |
533 | 533 | ||
534 | if (noacpi || !(ap->cbl == ATA_CBL_SATA)) | 534 | if (libata_noacpi || !(ap->cbl == ATA_CBL_SATA)) |
535 | return 0; | 535 | return 0; |
536 | 536 | ||
537 | if (!ata_dev_enabled(atadev) || (ap->flags & ATA_FLAG_DISABLED)) | 537 | if (!ata_dev_enabled(atadev) || (ap->flags & ATA_FLAG_DISABLED)) |
@@ -574,7 +574,7 @@ int ata_acpi_exec_tfs(struct ata_port *ap) | |||
574 | unsigned long gtf_address; | 574 | unsigned long gtf_address; |
575 | unsigned long obj_loc; | 575 | unsigned long obj_loc; |
576 | 576 | ||
577 | if (noacpi) | 577 | if (libata_noacpi) |
578 | return 0; | 578 | return 0; |
579 | /* | 579 | /* |
580 | * TBD - implement PATA support. For now, | 580 | * TBD - implement PATA support. For now, |
@@ -636,7 +636,7 @@ int ata_acpi_push_id(struct ata_port *ap, unsigned int ix) | |||
636 | struct acpi_object_list input; | 636 | struct acpi_object_list input; |
637 | union acpi_object in_params[1]; | 637 | union acpi_object in_params[1]; |
638 | 638 | ||
639 | if (noacpi) | 639 | if (libata_noacpi) |
640 | return 0; | 640 | return 0; |
641 | 641 | ||
642 | if (ata_msg_probe(ap)) | 642 | if (ata_msg_probe(ap)) |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index bf327d473ce9..0abd72d0dec2 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -93,8 +93,8 @@ static int ata_probe_timeout = ATA_TMOUT_INTERNAL / HZ; | |||
93 | module_param(ata_probe_timeout, int, 0444); | 93 | module_param(ata_probe_timeout, int, 0444); |
94 | MODULE_PARM_DESC(ata_probe_timeout, "Set ATA probing timeout (seconds)"); | 94 | MODULE_PARM_DESC(ata_probe_timeout, "Set ATA probing timeout (seconds)"); |
95 | 95 | ||
96 | int noacpi; | 96 | int libata_noacpi = 1; |
97 | module_param(noacpi, int, 0444); | 97 | module_param_named(noacpi, libata_noacpi, int, 0444); |
98 | MODULE_PARM_DESC(noacpi, "Disables the use of ACPI in suspend/resume when set"); | 98 | MODULE_PARM_DESC(noacpi, "Disables the use of ACPI in suspend/resume when set"); |
99 | 99 | ||
100 | MODULE_AUTHOR("Jeff Garzik"); | 100 | MODULE_AUTHOR("Jeff Garzik"); |
@@ -1784,6 +1784,13 @@ int ata_dev_configure(struct ata_device *dev) | |||
1784 | dev->max_sectors = ATA_MAX_SECTORS; | 1784 | dev->max_sectors = ATA_MAX_SECTORS; |
1785 | } | 1785 | } |
1786 | 1786 | ||
1787 | if (ata_device_blacklisted(dev) & ATA_HORKAGE_MAX_SEC_128) | ||
1788 | dev->max_sectors = min(ATA_MAX_SECTORS_128, dev->max_sectors); | ||
1789 | |||
1790 | /* limit ATAPI DMA to R/W commands only */ | ||
1791 | if (ata_device_blacklisted(dev) & ATA_HORKAGE_DMA_RW_ONLY) | ||
1792 | dev->horkage |= ATA_HORKAGE_DMA_RW_ONLY; | ||
1793 | |||
1787 | if (ap->ops->dev_config) | 1794 | if (ap->ops->dev_config) |
1788 | ap->ops->dev_config(ap, dev); | 1795 | ap->ops->dev_config(ap, dev); |
1789 | 1796 | ||
@@ -3352,6 +3359,10 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
3352 | { "_NEC DV5800A", NULL, ATA_HORKAGE_NODMA }, | 3359 | { "_NEC DV5800A", NULL, ATA_HORKAGE_NODMA }, |
3353 | { "SAMSUNG CD-ROM SN-124","N001", ATA_HORKAGE_NODMA }, | 3360 | { "SAMSUNG CD-ROM SN-124","N001", ATA_HORKAGE_NODMA }, |
3354 | 3361 | ||
3362 | /* Weird ATAPI devices */ | ||
3363 | { "TORiSAN DVD-ROM DRD-N216", NULL, ATA_HORKAGE_MAX_SEC_128 | | ||
3364 | ATA_HORKAGE_DMA_RW_ONLY }, | ||
3365 | |||
3355 | /* Devices we expect to fail diagnostics */ | 3366 | /* Devices we expect to fail diagnostics */ |
3356 | 3367 | ||
3357 | /* Devices where NCQ should be avoided */ | 3368 | /* Devices where NCQ should be avoided */ |
@@ -3359,6 +3370,15 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { | |||
3359 | { "WDC WD740ADFD-00", NULL, ATA_HORKAGE_NONCQ }, | 3370 | { "WDC WD740ADFD-00", NULL, ATA_HORKAGE_NONCQ }, |
3360 | /* http://thread.gmane.org/gmane.linux.ide/14907 */ | 3371 | /* http://thread.gmane.org/gmane.linux.ide/14907 */ |
3361 | { "FUJITSU MHT2060BH", NULL, ATA_HORKAGE_NONCQ }, | 3372 | { "FUJITSU MHT2060BH", NULL, ATA_HORKAGE_NONCQ }, |
3373 | /* NCQ is broken */ | ||
3374 | { "Maxtor 6L250S0", "BANC1G10", ATA_HORKAGE_NONCQ }, | ||
3375 | /* NCQ hard hangs device under heavier load, needs hard power cycle */ | ||
3376 | { "Maxtor 6B250S0", "BANC1B70", ATA_HORKAGE_NONCQ }, | ||
3377 | /* Blacklist entries taken from Silicon Image 3124/3132 | ||
3378 | Windows driver .inf file - also several Linux problem reports */ | ||
3379 | { "HTS541060G9SA00", "MB3OC60D", ATA_HORKAGE_NONCQ, }, | ||
3380 | { "HTS541080G9SA00", "MB4OC60D", ATA_HORKAGE_NONCQ, }, | ||
3381 | { "HTS541010G9SA00", "MBZOC60D", ATA_HORKAGE_NONCQ, }, | ||
3362 | 3382 | ||
3363 | /* Devices with NCQ limits */ | 3383 | /* Devices with NCQ limits */ |
3364 | 3384 | ||
@@ -3670,6 +3690,26 @@ int ata_check_atapi_dma(struct ata_queued_cmd *qc) | |||
3670 | struct ata_port *ap = qc->ap; | 3690 | struct ata_port *ap = qc->ap; |
3671 | int rc = 0; /* Assume ATAPI DMA is OK by default */ | 3691 | int rc = 0; /* Assume ATAPI DMA is OK by default */ |
3672 | 3692 | ||
3693 | /* some drives can only do ATAPI DMA on read/write */ | ||
3694 | if (unlikely(qc->dev->horkage & ATA_HORKAGE_DMA_RW_ONLY)) { | ||
3695 | struct scsi_cmnd *cmd = qc->scsicmd; | ||
3696 | u8 *scsicmd = cmd->cmnd; | ||
3697 | |||
3698 | switch (scsicmd[0]) { | ||
3699 | case READ_10: | ||
3700 | case WRITE_10: | ||
3701 | case READ_12: | ||
3702 | case WRITE_12: | ||
3703 | case READ_6: | ||
3704 | case WRITE_6: | ||
3705 | /* atapi dma maybe ok */ | ||
3706 | break; | ||
3707 | default: | ||
3708 | /* turn off atapi dma */ | ||
3709 | return 1; | ||
3710 | } | ||
3711 | } | ||
3712 | |||
3673 | if (ap->ops->check_atapi_dma) | 3713 | if (ap->ops->check_atapi_dma) |
3674 | rc = ap->ops->check_atapi_dma(qc); | 3714 | rc = ap->ops->check_atapi_dma(qc); |
3675 | 3715 | ||
@@ -4713,8 +4753,8 @@ static void fill_result_tf(struct ata_queued_cmd *qc) | |||
4713 | { | 4753 | { |
4714 | struct ata_port *ap = qc->ap; | 4754 | struct ata_port *ap = qc->ap; |
4715 | 4755 | ||
4716 | ap->ops->tf_read(ap, &qc->result_tf); | ||
4717 | qc->result_tf.flags = qc->tf.flags; | 4756 | qc->result_tf.flags = qc->tf.flags; |
4757 | ap->ops->tf_read(ap, &qc->result_tf); | ||
4718 | } | 4758 | } |
4719 | 4759 | ||
4720 | /** | 4760 | /** |
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index 361953a50203..39f556c02992 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
@@ -982,26 +982,27 @@ static int ata_eh_read_log_10h(struct ata_device *dev, | |||
982 | * RETURNS: | 982 | * RETURNS: |
983 | * 0 on success, AC_ERR_* mask on failure | 983 | * 0 on success, AC_ERR_* mask on failure |
984 | */ | 984 | */ |
985 | static unsigned int atapi_eh_request_sense(struct ata_device *dev, | 985 | static unsigned int atapi_eh_request_sense(struct ata_queued_cmd *qc) |
986 | unsigned char *sense_buf) | ||
987 | { | 986 | { |
987 | struct ata_device *dev = qc->dev; | ||
988 | unsigned char *sense_buf = qc->scsicmd->sense_buffer; | ||
988 | struct ata_port *ap = dev->ap; | 989 | struct ata_port *ap = dev->ap; |
989 | struct ata_taskfile tf; | 990 | struct ata_taskfile tf; |
990 | u8 cdb[ATAPI_CDB_LEN]; | 991 | u8 cdb[ATAPI_CDB_LEN]; |
991 | 992 | ||
992 | DPRINTK("ATAPI request sense\n"); | 993 | DPRINTK("ATAPI request sense\n"); |
993 | 994 | ||
994 | ata_tf_init(dev, &tf); | ||
995 | |||
996 | /* FIXME: is this needed? */ | 995 | /* FIXME: is this needed? */ |
997 | memset(sense_buf, 0, SCSI_SENSE_BUFFERSIZE); | 996 | memset(sense_buf, 0, SCSI_SENSE_BUFFERSIZE); |
998 | 997 | ||
999 | /* XXX: why tf_read here? */ | 998 | /* initialize sense_buf with the error register, |
1000 | ap->ops->tf_read(ap, &tf); | 999 | * for the case where they are -not- overwritten |
1001 | 1000 | */ | |
1002 | /* fill these in, for the case where they are -not- overwritten */ | ||
1003 | sense_buf[0] = 0x70; | 1001 | sense_buf[0] = 0x70; |
1004 | sense_buf[2] = tf.feature >> 4; | 1002 | sense_buf[2] = qc->result_tf.feature >> 4; |
1003 | |||
1004 | /* some devices time out if garbage left in tf */ | ||
1005 | ata_tf_init(dev, &tf); | ||
1005 | 1006 | ||
1006 | memset(cdb, 0, ATAPI_CDB_LEN); | 1007 | memset(cdb, 0, ATAPI_CDB_LEN); |
1007 | cdb[0] = REQUEST_SENSE; | 1008 | cdb[0] = REQUEST_SENSE; |
@@ -1165,8 +1166,7 @@ static unsigned int ata_eh_analyze_tf(struct ata_queued_cmd *qc, | |||
1165 | 1166 | ||
1166 | case ATA_DEV_ATAPI: | 1167 | case ATA_DEV_ATAPI: |
1167 | if (!(qc->ap->pflags & ATA_PFLAG_FROZEN)) { | 1168 | if (!(qc->ap->pflags & ATA_PFLAG_FROZEN)) { |
1168 | tmp = atapi_eh_request_sense(qc->dev, | 1169 | tmp = atapi_eh_request_sense(qc); |
1169 | qc->scsicmd->sense_buffer); | ||
1170 | if (!tmp) { | 1170 | if (!tmp) { |
1171 | /* ATA_QCFLAG_SENSE_VALID is used to | 1171 | /* ATA_QCFLAG_SENSE_VALID is used to |
1172 | * tell atapi_qc_complete() that sense | 1172 | * tell atapi_qc_complete() that sense |
@@ -1743,12 +1743,17 @@ static int ata_eh_revalidate_and_attach(struct ata_port *ap, | |||
1743 | { | 1743 | { |
1744 | struct ata_eh_context *ehc = &ap->eh_context; | 1744 | struct ata_eh_context *ehc = &ap->eh_context; |
1745 | struct ata_device *dev; | 1745 | struct ata_device *dev; |
1746 | unsigned int new_mask = 0; | ||
1746 | unsigned long flags; | 1747 | unsigned long flags; |
1747 | int i, rc = 0; | 1748 | int i, rc = 0; |
1748 | 1749 | ||
1749 | DPRINTK("ENTER\n"); | 1750 | DPRINTK("ENTER\n"); |
1750 | 1751 | ||
1751 | for (i = 0; i < ATA_MAX_DEVICES; i++) { | 1752 | /* For PATA drive side cable detection to work, IDENTIFY must |
1753 | * be done backwards such that PDIAG- is released by the slave | ||
1754 | * device before the master device is identified. | ||
1755 | */ | ||
1756 | for (i = ATA_MAX_DEVICES - 1; i >= 0; i--) { | ||
1752 | unsigned int action, readid_flags = 0; | 1757 | unsigned int action, readid_flags = 0; |
1753 | 1758 | ||
1754 | dev = &ap->device[i]; | 1759 | dev = &ap->device[i]; |
@@ -1760,13 +1765,13 @@ static int ata_eh_revalidate_and_attach(struct ata_port *ap, | |||
1760 | if (action & ATA_EH_REVALIDATE && ata_dev_ready(dev)) { | 1765 | if (action & ATA_EH_REVALIDATE && ata_dev_ready(dev)) { |
1761 | if (ata_port_offline(ap)) { | 1766 | if (ata_port_offline(ap)) { |
1762 | rc = -EIO; | 1767 | rc = -EIO; |
1763 | break; | 1768 | goto err; |
1764 | } | 1769 | } |
1765 | 1770 | ||
1766 | ata_eh_about_to_do(ap, dev, ATA_EH_REVALIDATE); | 1771 | ata_eh_about_to_do(ap, dev, ATA_EH_REVALIDATE); |
1767 | rc = ata_dev_revalidate(dev, readid_flags); | 1772 | rc = ata_dev_revalidate(dev, readid_flags); |
1768 | if (rc) | 1773 | if (rc) |
1769 | break; | 1774 | goto err; |
1770 | 1775 | ||
1771 | ata_eh_done(ap, dev, ATA_EH_REVALIDATE); | 1776 | ata_eh_done(ap, dev, ATA_EH_REVALIDATE); |
1772 | 1777 | ||
@@ -1784,40 +1789,53 @@ static int ata_eh_revalidate_and_attach(struct ata_port *ap, | |||
1784 | 1789 | ||
1785 | rc = ata_dev_read_id(dev, &dev->class, readid_flags, | 1790 | rc = ata_dev_read_id(dev, &dev->class, readid_flags, |
1786 | dev->id); | 1791 | dev->id); |
1787 | if (rc == 0) { | 1792 | switch (rc) { |
1788 | ehc->i.flags |= ATA_EHI_PRINTINFO; | 1793 | case 0: |
1789 | rc = ata_dev_configure(dev); | 1794 | new_mask |= 1 << i; |
1790 | ehc->i.flags &= ~ATA_EHI_PRINTINFO; | 1795 | break; |
1791 | } else if (rc == -ENOENT) { | 1796 | case -ENOENT: |
1792 | /* IDENTIFY was issued to non-existent | 1797 | /* IDENTIFY was issued to non-existent |
1793 | * device. No need to reset. Just | 1798 | * device. No need to reset. Just |
1794 | * thaw and kill the device. | 1799 | * thaw and kill the device. |
1795 | */ | 1800 | */ |
1796 | ata_eh_thaw_port(ap); | 1801 | ata_eh_thaw_port(ap); |
1797 | dev->class = ATA_DEV_UNKNOWN; | 1802 | dev->class = ATA_DEV_UNKNOWN; |
1798 | rc = 0; | ||
1799 | } | ||
1800 | |||
1801 | if (rc) { | ||
1802 | dev->class = ATA_DEV_UNKNOWN; | ||
1803 | break; | 1803 | break; |
1804 | default: | ||
1805 | dev->class = ATA_DEV_UNKNOWN; | ||
1806 | goto err; | ||
1804 | } | 1807 | } |
1808 | } | ||
1809 | } | ||
1805 | 1810 | ||
1806 | if (ata_dev_enabled(dev)) { | 1811 | /* Configure new devices forward such that user doesn't see |
1807 | spin_lock_irqsave(ap->lock, flags); | 1812 | * device detection messages backwards. |
1808 | ap->pflags |= ATA_PFLAG_SCSI_HOTPLUG; | 1813 | */ |
1809 | spin_unlock_irqrestore(ap->lock, flags); | 1814 | for (i = 0; i < ATA_MAX_DEVICES; i++) { |
1815 | dev = &ap->device[i]; | ||
1810 | 1816 | ||
1811 | /* new device discovered, configure xfermode */ | 1817 | if (!(new_mask & (1 << i))) |
1812 | ehc->i.flags |= ATA_EHI_SETMODE; | 1818 | continue; |
1813 | } | 1819 | |
1814 | } | 1820 | ehc->i.flags |= ATA_EHI_PRINTINFO; |
1821 | rc = ata_dev_configure(dev); | ||
1822 | ehc->i.flags &= ~ATA_EHI_PRINTINFO; | ||
1823 | if (rc) | ||
1824 | goto err; | ||
1825 | |||
1826 | spin_lock_irqsave(ap->lock, flags); | ||
1827 | ap->pflags |= ATA_PFLAG_SCSI_HOTPLUG; | ||
1828 | spin_unlock_irqrestore(ap->lock, flags); | ||
1829 | |||
1830 | /* new device discovered, configure xfermode */ | ||
1831 | ehc->i.flags |= ATA_EHI_SETMODE; | ||
1815 | } | 1832 | } |
1816 | 1833 | ||
1817 | if (rc) | 1834 | return 0; |
1818 | *r_failed_dev = dev; | ||
1819 | 1835 | ||
1820 | DPRINTK("EXIT\n"); | 1836 | err: |
1837 | *r_failed_dev = dev; | ||
1838 | DPRINTK("EXIT rc=%d\n", rc); | ||
1821 | return rc; | 1839 | return rc; |
1822 | } | 1840 | } |
1823 | 1841 | ||
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 6cc817a10204..e9364434182c 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
@@ -333,7 +333,7 @@ int ata_task_ioctl(struct scsi_device *scsidev, void __user *arg) | |||
333 | scsi_cmd[8] = args[3]; | 333 | scsi_cmd[8] = args[3]; |
334 | scsi_cmd[10] = args[4]; | 334 | scsi_cmd[10] = args[4]; |
335 | scsi_cmd[12] = args[5]; | 335 | scsi_cmd[12] = args[5]; |
336 | scsi_cmd[13] = args[6] & 0x0f; | 336 | scsi_cmd[13] = args[6] & 0x4f; |
337 | scsi_cmd[14] = args[0]; | 337 | scsi_cmd[14] = args[0]; |
338 | 338 | ||
339 | /* Good values for timeout and retries? Values below | 339 | /* Good values for timeout and retries? Values below |
diff --git a/drivers/ata/libata.h b/drivers/ata/libata.h index c42671493e8c..1f1e3a51f859 100644 --- a/drivers/ata/libata.h +++ b/drivers/ata/libata.h | |||
@@ -56,7 +56,7 @@ extern struct workqueue_struct *ata_aux_wq; | |||
56 | extern int atapi_enabled; | 56 | extern int atapi_enabled; |
57 | extern int atapi_dmadir; | 57 | extern int atapi_dmadir; |
58 | extern int libata_fua; | 58 | extern int libata_fua; |
59 | extern int noacpi; | 59 | extern int libata_noacpi; |
60 | extern struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev); | 60 | extern struct ata_queued_cmd *ata_qc_new_init(struct ata_device *dev); |
61 | extern int ata_build_rw_tf(struct ata_taskfile *tf, struct ata_device *dev, | 61 | extern int ata_build_rw_tf(struct ata_taskfile *tf, struct ata_device *dev, |
62 | u64 block, u32 n_block, unsigned int tf_flags, | 62 | u64 block, u32 n_block, unsigned int tf_flags, |
diff --git a/drivers/ata/pata_pdc202xx_old.c b/drivers/ata/pata_pdc202xx_old.c index acdc52cbe38a..0a1493398913 100644 --- a/drivers/ata/pata_pdc202xx_old.c +++ b/drivers/ata/pata_pdc202xx_old.c | |||
@@ -195,7 +195,7 @@ static void pdc2026x_bmdma_start(struct ata_queued_cmd *qc) | |||
195 | /* Cases the state machine will not complete correctly without help */ | 195 | /* Cases the state machine will not complete correctly without help */ |
196 | if ((tf->flags & ATA_TFLAG_LBA48) || tf->protocol == ATA_PROT_ATAPI_DMA) | 196 | if ((tf->flags & ATA_TFLAG_LBA48) || tf->protocol == ATA_PROT_ATAPI_DMA) |
197 | { | 197 | { |
198 | len = qc->nbytes; | 198 | len = qc->nbytes / 2; |
199 | 199 | ||
200 | if (tf->flags & ATA_TFLAG_WRITE) | 200 | if (tf->flags & ATA_TFLAG_WRITE) |
201 | len |= 0x06000000; | 201 | len |= 0x06000000; |
diff --git a/drivers/base/core.c b/drivers/base/core.c index ad0f4a2f25c4..d7fcf823a42a 100644 --- a/drivers/base/core.c +++ b/drivers/base/core.c | |||
@@ -28,20 +28,6 @@ int (*platform_notify)(struct device * dev) = NULL; | |||
28 | int (*platform_notify_remove)(struct device * dev) = NULL; | 28 | int (*platform_notify_remove)(struct device * dev) = NULL; |
29 | 29 | ||
30 | /* | 30 | /* |
31 | * Detect the LANANA-assigned LOCAL/EXPERIMENTAL majors | ||
32 | */ | ||
33 | bool is_lanana_major(unsigned int major) | ||
34 | { | ||
35 | if (major >= 60 && major <= 63) | ||
36 | return 1; | ||
37 | if (major >= 120 && major <= 127) | ||
38 | return 1; | ||
39 | if (major >= 240 && major <= 254) | ||
40 | return 1; | ||
41 | return 0; | ||
42 | } | ||
43 | |||
44 | /* | ||
45 | * sysfs bindings for devices. | 31 | * sysfs bindings for devices. |
46 | */ | 32 | */ |
47 | 33 | ||
diff --git a/drivers/base/driver.c b/drivers/base/driver.c index 1214cbd17d86..082bfded3854 100644 --- a/drivers/base/driver.c +++ b/drivers/base/driver.c | |||
@@ -183,7 +183,14 @@ int driver_register(struct device_driver * drv) | |||
183 | void driver_unregister(struct device_driver * drv) | 183 | void driver_unregister(struct device_driver * drv) |
184 | { | 184 | { |
185 | bus_remove_driver(drv); | 185 | bus_remove_driver(drv); |
186 | wait_for_completion(&drv->unloaded); | 186 | /* |
187 | * If the driver is a module, we are probably in | ||
188 | * the module unload path, and we want to wait | ||
189 | * for everything to unload before we can actually | ||
190 | * finish the unload. | ||
191 | */ | ||
192 | if (drv->owner) | ||
193 | wait_for_completion(&drv->unloaded); | ||
187 | } | 194 | } |
188 | 195 | ||
189 | /** | 196 | /** |
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c index 072e18e6d76d..14d780666c0a 100644 --- a/drivers/block/cciss.c +++ b/drivers/block/cciss.c | |||
@@ -1915,6 +1915,7 @@ static void cciss_geometry_inquiry(int ctlr, int logvol, | |||
1915 | "does not support reading geometry\n"); | 1915 | "does not support reading geometry\n"); |
1916 | drv->heads = 255; | 1916 | drv->heads = 255; |
1917 | drv->sectors = 32; // Sectors per track | 1917 | drv->sectors = 32; // Sectors per track |
1918 | drv->cylinders = total_size + 1; | ||
1918 | drv->raid_level = RAID_UNKNOWN; | 1919 | drv->raid_level = RAID_UNKNOWN; |
1919 | } else { | 1920 | } else { |
1920 | drv->heads = inq_buff->data_byte[6]; | 1921 | drv->heads = inq_buff->data_byte[6]; |
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig index 3429ece4ef92..d0c978fbc204 100644 --- a/drivers/char/Kconfig +++ b/drivers/char/Kconfig | |||
@@ -386,6 +386,39 @@ config AU1000_SERIAL_CONSOLE | |||
386 | If you have an Alchemy AU1000 processor (MIPS based) and you want | 386 | If you have an Alchemy AU1000 processor (MIPS based) and you want |
387 | to use a console on a serial port, say Y. Otherwise, say N. | 387 | to use a console on a serial port, say Y. Otherwise, say N. |
388 | 388 | ||
389 | config SERIAL_DEC | ||
390 | bool "DECstation serial support" | ||
391 | depends on MACH_DECSTATION | ||
392 | default y | ||
393 | help | ||
394 | This selects whether you want to be asked about drivers for | ||
395 | DECstation serial ports. | ||
396 | |||
397 | Note that the answer to this question won't directly affect the | ||
398 | kernel: saying N will just cause the configurator to skip all | ||
399 | the questions about DECstation serial ports. | ||
400 | |||
401 | config SERIAL_DEC_CONSOLE | ||
402 | bool "Support for console on a DECstation serial port" | ||
403 | depends on SERIAL_DEC | ||
404 | default y | ||
405 | help | ||
406 | If you say Y here, it will be possible to use a serial port as the | ||
407 | system console (the system console is the device which receives all | ||
408 | kernel messages and warnings and which allows logins in single user | ||
409 | mode). Note that the firmware uses ttyS0 as the serial console on | ||
410 | the Maxine and ttyS2 on the others. | ||
411 | |||
412 | If unsure, say Y. | ||
413 | |||
414 | config ZS | ||
415 | bool "Z85C30 Serial Support" | ||
416 | depends on SERIAL_DEC | ||
417 | default y | ||
418 | help | ||
419 | Documentation on the Zilog 85C350 serial communications controller | ||
420 | is downloadable at <http://www.zilog.com/pdfs/serial/z85c30.pdf> | ||
421 | |||
389 | config A2232 | 422 | config A2232 |
390 | tristate "Commodore A2232 serial support (EXPERIMENTAL)" | 423 | tristate "Commodore A2232 serial support (EXPERIMENTAL)" |
391 | depends on EXPERIMENTAL && ZORRO && BROKEN_ON_SMP | 424 | depends on EXPERIMENTAL && ZORRO && BROKEN_ON_SMP |
diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c index e542a628f1c7..a9fdbf9126ca 100644 --- a/drivers/char/agp/intel-agp.c +++ b/drivers/char/agp/intel-agp.c | |||
@@ -18,11 +18,14 @@ | |||
18 | #define PCI_DEVICE_ID_INTEL_82965Q_IG 0x2992 | 18 | #define PCI_DEVICE_ID_INTEL_82965Q_IG 0x2992 |
19 | #define PCI_DEVICE_ID_INTEL_82965G_HB 0x29A0 | 19 | #define PCI_DEVICE_ID_INTEL_82965G_HB 0x29A0 |
20 | #define PCI_DEVICE_ID_INTEL_82965G_IG 0x29A2 | 20 | #define PCI_DEVICE_ID_INTEL_82965G_IG 0x29A2 |
21 | #define PCI_DEVICE_ID_INTEL_82965GM_HB 0x2A00 | ||
22 | #define PCI_DEVICE_ID_INTEL_82965GM_IG 0x2A02 | ||
21 | 23 | ||
22 | #define IS_I965 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82946GZ_HB || \ | 24 | #define IS_I965 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82946GZ_HB || \ |
23 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_1_HB || \ | 25 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_1_HB || \ |
24 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965Q_HB || \ | 26 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965Q_HB || \ |
25 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_HB) | 27 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_HB || \ |
28 | agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965GM_HB) | ||
26 | 29 | ||
27 | 30 | ||
28 | extern int agp_memory_reserved; | 31 | extern int agp_memory_reserved; |
@@ -1921,7 +1924,13 @@ static int __devinit agp_intel_probe(struct pci_dev *pdev, | |||
1921 | bridge->driver = &intel_845_driver; | 1924 | bridge->driver = &intel_845_driver; |
1922 | name = "965G"; | 1925 | name = "965G"; |
1923 | break; | 1926 | break; |
1924 | 1927 | case PCI_DEVICE_ID_INTEL_82965GM_HB: | |
1928 | if (find_i830(PCI_DEVICE_ID_INTEL_82965GM_IG)) | ||
1929 | bridge->driver = &intel_i965_driver; | ||
1930 | else | ||
1931 | bridge->driver = &intel_845_driver; | ||
1932 | name = "965GM"; | ||
1933 | break; | ||
1925 | case PCI_DEVICE_ID_INTEL_7505_0: | 1934 | case PCI_DEVICE_ID_INTEL_7505_0: |
1926 | bridge->driver = &intel_7505_driver; | 1935 | bridge->driver = &intel_7505_driver; |
1927 | name = "E7505"; | 1936 | name = "E7505"; |
@@ -2080,6 +2089,7 @@ static struct pci_device_id agp_intel_pci_table[] = { | |||
2080 | ID(PCI_DEVICE_ID_INTEL_82965G_1_HB), | 2089 | ID(PCI_DEVICE_ID_INTEL_82965G_1_HB), |
2081 | ID(PCI_DEVICE_ID_INTEL_82965Q_HB), | 2090 | ID(PCI_DEVICE_ID_INTEL_82965Q_HB), |
2082 | ID(PCI_DEVICE_ID_INTEL_82965G_HB), | 2091 | ID(PCI_DEVICE_ID_INTEL_82965G_HB), |
2092 | ID(PCI_DEVICE_ID_INTEL_82965GM_HB), | ||
2083 | { } | 2093 | { } |
2084 | }; | 2094 | }; |
2085 | 2095 | ||
diff --git a/drivers/char/drm/Makefile b/drivers/char/drm/Makefile index 3ad0f648c6b2..6915a0599dfb 100644 --- a/drivers/char/drm/Makefile +++ b/drivers/char/drm/Makefile | |||
@@ -15,7 +15,6 @@ i810-objs := i810_drv.o i810_dma.o | |||
15 | i830-objs := i830_drv.o i830_dma.o i830_irq.o | 15 | i830-objs := i830_drv.o i830_dma.o i830_irq.o |
16 | i915-objs := i915_drv.o i915_dma.o i915_irq.o i915_mem.o | 16 | i915-objs := i915_drv.o i915_dma.o i915_irq.o i915_mem.o |
17 | radeon-objs := radeon_drv.o radeon_cp.o radeon_state.o radeon_mem.o radeon_irq.o r300_cmdbuf.o | 17 | radeon-objs := radeon_drv.o radeon_cp.o radeon_state.o radeon_mem.o radeon_irq.o r300_cmdbuf.o |
18 | ffb-objs := ffb_drv.o ffb_context.o | ||
19 | sis-objs := sis_drv.o sis_mm.o | 18 | sis-objs := sis_drv.o sis_mm.o |
20 | savage-objs := savage_drv.o savage_bci.o savage_state.o | 19 | savage-objs := savage_drv.o savage_bci.o savage_state.o |
21 | via-objs := via_irq.o via_drv.o via_map.o via_mm.o via_dma.o via_verifier.o via_video.o via_dmablit.o | 20 | via-objs := via_irq.o via_drv.o via_map.o via_mm.o via_dma.o via_verifier.o via_video.o via_dmablit.o |
@@ -36,7 +35,6 @@ obj-$(CONFIG_DRM_MGA) += mga.o | |||
36 | obj-$(CONFIG_DRM_I810) += i810.o | 35 | obj-$(CONFIG_DRM_I810) += i810.o |
37 | obj-$(CONFIG_DRM_I830) += i830.o | 36 | obj-$(CONFIG_DRM_I830) += i830.o |
38 | obj-$(CONFIG_DRM_I915) += i915.o | 37 | obj-$(CONFIG_DRM_I915) += i915.o |
39 | obj-$(CONFIG_DRM_FFB) += ffb.o | ||
40 | obj-$(CONFIG_DRM_SIS) += sis.o | 38 | obj-$(CONFIG_DRM_SIS) += sis.o |
41 | obj-$(CONFIG_DRM_SAVAGE)+= savage.o | 39 | obj-$(CONFIG_DRM_SAVAGE)+= savage.o |
42 | obj-$(CONFIG_DRM_VIA) +=via.o | 40 | obj-$(CONFIG_DRM_VIA) +=via.o |
diff --git a/drivers/char/drm/ffb_context.c b/drivers/char/drm/ffb_context.c deleted file mode 100644 index ac9ab40d57aa..000000000000 --- a/drivers/char/drm/ffb_context.c +++ /dev/null | |||
@@ -1,544 +0,0 @@ | |||
1 | /* $Id: ffb_context.c,v 1.5 2001/08/09 17:47:51 davem Exp $ | ||
2 | * ffb_context.c: Creator/Creator3D DRI/DRM context switching. | ||
3 | * | ||
4 | * Copyright (C) 2000 David S. Miller (davem@redhat.com) | ||
5 | * | ||
6 | * Almost entirely stolen from tdfx_context.c, see there | ||
7 | * for authors. | ||
8 | */ | ||
9 | |||
10 | #include <asm/upa.h> | ||
11 | |||
12 | #include "ffb.h" | ||
13 | #include "drmP.h" | ||
14 | |||
15 | #include "ffb_drv.h" | ||
16 | |||
17 | static int DRM(alloc_queue) (drm_device_t * dev, int is_2d_only) { | ||
18 | ffb_dev_priv_t *fpriv = (ffb_dev_priv_t *) dev->dev_private; | ||
19 | int i; | ||
20 | |||
21 | for (i = 0; i < FFB_MAX_CTXS; i++) { | ||
22 | if (fpriv->hw_state[i] == NULL) | ||
23 | break; | ||
24 | } | ||
25 | if (i == FFB_MAX_CTXS) | ||
26 | return -1; | ||
27 | |||
28 | fpriv->hw_state[i] = kmalloc(sizeof(struct ffb_hw_context), GFP_KERNEL); | ||
29 | if (fpriv->hw_state[i] == NULL) | ||
30 | return -1; | ||
31 | |||
32 | fpriv->hw_state[i]->is_2d_only = is_2d_only; | ||
33 | |||
34 | /* Plus one because 0 is the special DRM_KERNEL_CONTEXT. */ | ||
35 | return i + 1; | ||
36 | } | ||
37 | |||
38 | static void ffb_save_context(ffb_dev_priv_t * fpriv, int idx) | ||
39 | { | ||
40 | ffb_fbcPtr ffb = fpriv->regs; | ||
41 | struct ffb_hw_context *ctx; | ||
42 | int i; | ||
43 | |||
44 | ctx = fpriv->hw_state[idx - 1]; | ||
45 | if (idx == 0 || ctx == NULL) | ||
46 | return; | ||
47 | |||
48 | if (ctx->is_2d_only) { | ||
49 | /* 2D applications only care about certain pieces | ||
50 | * of state. | ||
51 | */ | ||
52 | ctx->drawop = upa_readl(&ffb->drawop); | ||
53 | ctx->ppc = upa_readl(&ffb->ppc); | ||
54 | ctx->wid = upa_readl(&ffb->wid); | ||
55 | ctx->fg = upa_readl(&ffb->fg); | ||
56 | ctx->bg = upa_readl(&ffb->bg); | ||
57 | ctx->xclip = upa_readl(&ffb->xclip); | ||
58 | ctx->fbc = upa_readl(&ffb->fbc); | ||
59 | ctx->rop = upa_readl(&ffb->rop); | ||
60 | ctx->cmp = upa_readl(&ffb->cmp); | ||
61 | ctx->matchab = upa_readl(&ffb->matchab); | ||
62 | ctx->magnab = upa_readl(&ffb->magnab); | ||
63 | ctx->pmask = upa_readl(&ffb->pmask); | ||
64 | ctx->xpmask = upa_readl(&ffb->xpmask); | ||
65 | ctx->lpat = upa_readl(&ffb->lpat); | ||
66 | ctx->fontxy = upa_readl(&ffb->fontxy); | ||
67 | ctx->fontw = upa_readl(&ffb->fontw); | ||
68 | ctx->fontinc = upa_readl(&ffb->fontinc); | ||
69 | |||
70 | /* stencil/stencilctl only exists on FFB2+ and later | ||
71 | * due to the introduction of 3DRAM-III. | ||
72 | */ | ||
73 | if (fpriv->ffb_type == ffb2_vertical_plus || | ||
74 | fpriv->ffb_type == ffb2_horizontal_plus) { | ||
75 | ctx->stencil = upa_readl(&ffb->stencil); | ||
76 | ctx->stencilctl = upa_readl(&ffb->stencilctl); | ||
77 | } | ||
78 | |||
79 | for (i = 0; i < 32; i++) | ||
80 | ctx->area_pattern[i] = upa_readl(&ffb->pattern[i]); | ||
81 | ctx->ucsr = upa_readl(&ffb->ucsr); | ||
82 | return; | ||
83 | } | ||
84 | |||
85 | /* Fetch drawop. */ | ||
86 | ctx->drawop = upa_readl(&ffb->drawop); | ||
87 | |||
88 | /* If we were saving the vertex registers, this is where | ||
89 | * we would do it. We would save 32 32-bit words starting | ||
90 | * at ffb->suvtx. | ||
91 | */ | ||
92 | |||
93 | /* Capture rendering attributes. */ | ||
94 | |||
95 | ctx->ppc = upa_readl(&ffb->ppc); /* Pixel Processor Control */ | ||
96 | ctx->wid = upa_readl(&ffb->wid); /* Current WID */ | ||
97 | ctx->fg = upa_readl(&ffb->fg); /* Constant FG color */ | ||
98 | ctx->bg = upa_readl(&ffb->bg); /* Constant BG color */ | ||
99 | ctx->consty = upa_readl(&ffb->consty); /* Constant Y */ | ||
100 | ctx->constz = upa_readl(&ffb->constz); /* Constant Z */ | ||
101 | ctx->xclip = upa_readl(&ffb->xclip); /* X plane clip */ | ||
102 | ctx->dcss = upa_readl(&ffb->dcss); /* Depth Cue Scale Slope */ | ||
103 | ctx->vclipmin = upa_readl(&ffb->vclipmin); /* Primary XY clip, minimum */ | ||
104 | ctx->vclipmax = upa_readl(&ffb->vclipmax); /* Primary XY clip, maximum */ | ||
105 | ctx->vclipzmin = upa_readl(&ffb->vclipzmin); /* Primary Z clip, minimum */ | ||
106 | ctx->vclipzmax = upa_readl(&ffb->vclipzmax); /* Primary Z clip, maximum */ | ||
107 | ctx->dcsf = upa_readl(&ffb->dcsf); /* Depth Cue Scale Front Bound */ | ||
108 | ctx->dcsb = upa_readl(&ffb->dcsb); /* Depth Cue Scale Back Bound */ | ||
109 | ctx->dczf = upa_readl(&ffb->dczf); /* Depth Cue Scale Z Front */ | ||
110 | ctx->dczb = upa_readl(&ffb->dczb); /* Depth Cue Scale Z Back */ | ||
111 | ctx->blendc = upa_readl(&ffb->blendc); /* Alpha Blend Control */ | ||
112 | ctx->blendc1 = upa_readl(&ffb->blendc1); /* Alpha Blend Color 1 */ | ||
113 | ctx->blendc2 = upa_readl(&ffb->blendc2); /* Alpha Blend Color 2 */ | ||
114 | ctx->fbc = upa_readl(&ffb->fbc); /* Frame Buffer Control */ | ||
115 | ctx->rop = upa_readl(&ffb->rop); /* Raster Operation */ | ||
116 | ctx->cmp = upa_readl(&ffb->cmp); /* Compare Controls */ | ||
117 | ctx->matchab = upa_readl(&ffb->matchab); /* Buffer A/B Match Ops */ | ||
118 | ctx->matchc = upa_readl(&ffb->matchc); /* Buffer C Match Ops */ | ||
119 | ctx->magnab = upa_readl(&ffb->magnab); /* Buffer A/B Magnitude Ops */ | ||
120 | ctx->magnc = upa_readl(&ffb->magnc); /* Buffer C Magnitude Ops */ | ||
121 | ctx->pmask = upa_readl(&ffb->pmask); /* RGB Plane Mask */ | ||
122 | ctx->xpmask = upa_readl(&ffb->xpmask); /* X Plane Mask */ | ||
123 | ctx->ypmask = upa_readl(&ffb->ypmask); /* Y Plane Mask */ | ||
124 | ctx->zpmask = upa_readl(&ffb->zpmask); /* Z Plane Mask */ | ||
125 | |||
126 | /* Auxiliary Clips. */ | ||
127 | ctx->auxclip0min = upa_readl(&ffb->auxclip[0].min); | ||
128 | ctx->auxclip0max = upa_readl(&ffb->auxclip[0].max); | ||
129 | ctx->auxclip1min = upa_readl(&ffb->auxclip[1].min); | ||
130 | ctx->auxclip1max = upa_readl(&ffb->auxclip[1].max); | ||
131 | ctx->auxclip2min = upa_readl(&ffb->auxclip[2].min); | ||
132 | ctx->auxclip2max = upa_readl(&ffb->auxclip[2].max); | ||
133 | ctx->auxclip3min = upa_readl(&ffb->auxclip[3].min); | ||
134 | ctx->auxclip3max = upa_readl(&ffb->auxclip[3].max); | ||
135 | |||
136 | ctx->lpat = upa_readl(&ffb->lpat); /* Line Pattern */ | ||
137 | ctx->fontxy = upa_readl(&ffb->fontxy); /* XY Font Coordinate */ | ||
138 | ctx->fontw = upa_readl(&ffb->fontw); /* Font Width */ | ||
139 | ctx->fontinc = upa_readl(&ffb->fontinc); /* Font X/Y Increment */ | ||
140 | |||
141 | /* These registers/features only exist on FFB2 and later chips. */ | ||
142 | if (fpriv->ffb_type >= ffb2_prototype) { | ||
143 | ctx->dcss1 = upa_readl(&ffb->dcss1); /* Depth Cue Scale Slope 1 */ | ||
144 | ctx->dcss2 = upa_readl(&ffb->dcss2); /* Depth Cue Scale Slope 2 */ | ||
145 | ctx->dcss2 = upa_readl(&ffb->dcss3); /* Depth Cue Scale Slope 3 */ | ||
146 | ctx->dcs2 = upa_readl(&ffb->dcs2); /* Depth Cue Scale 2 */ | ||
147 | ctx->dcs3 = upa_readl(&ffb->dcs3); /* Depth Cue Scale 3 */ | ||
148 | ctx->dcs4 = upa_readl(&ffb->dcs4); /* Depth Cue Scale 4 */ | ||
149 | ctx->dcd2 = upa_readl(&ffb->dcd2); /* Depth Cue Depth 2 */ | ||
150 | ctx->dcd3 = upa_readl(&ffb->dcd3); /* Depth Cue Depth 3 */ | ||
151 | ctx->dcd4 = upa_readl(&ffb->dcd4); /* Depth Cue Depth 4 */ | ||
152 | |||
153 | /* And stencil/stencilctl only exists on FFB2+ and later | ||
154 | * due to the introduction of 3DRAM-III. | ||
155 | */ | ||
156 | if (fpriv->ffb_type == ffb2_vertical_plus || | ||
157 | fpriv->ffb_type == ffb2_horizontal_plus) { | ||
158 | ctx->stencil = upa_readl(&ffb->stencil); | ||
159 | ctx->stencilctl = upa_readl(&ffb->stencilctl); | ||
160 | } | ||
161 | } | ||
162 | |||
163 | /* Save the 32x32 area pattern. */ | ||
164 | for (i = 0; i < 32; i++) | ||
165 | ctx->area_pattern[i] = upa_readl(&ffb->pattern[i]); | ||
166 | |||
167 | /* Finally, stash away the User Constol/Status Register. */ | ||
168 | ctx->ucsr = upa_readl(&ffb->ucsr); | ||
169 | } | ||
170 | |||
171 | static void ffb_restore_context(ffb_dev_priv_t * fpriv, int old, int idx) | ||
172 | { | ||
173 | ffb_fbcPtr ffb = fpriv->regs; | ||
174 | struct ffb_hw_context *ctx; | ||
175 | int i; | ||
176 | |||
177 | ctx = fpriv->hw_state[idx - 1]; | ||
178 | if (idx == 0 || ctx == NULL) | ||
179 | return; | ||
180 | |||
181 | if (ctx->is_2d_only) { | ||
182 | /* 2D applications only care about certain pieces | ||
183 | * of state. | ||
184 | */ | ||
185 | upa_writel(ctx->drawop, &ffb->drawop); | ||
186 | |||
187 | /* If we were restoring the vertex registers, this is where | ||
188 | * we would do it. We would restore 32 32-bit words starting | ||
189 | * at ffb->suvtx. | ||
190 | */ | ||
191 | |||
192 | upa_writel(ctx->ppc, &ffb->ppc); | ||
193 | upa_writel(ctx->wid, &ffb->wid); | ||
194 | upa_writel(ctx->fg, &ffb->fg); | ||
195 | upa_writel(ctx->bg, &ffb->bg); | ||
196 | upa_writel(ctx->xclip, &ffb->xclip); | ||
197 | upa_writel(ctx->fbc, &ffb->fbc); | ||
198 | upa_writel(ctx->rop, &ffb->rop); | ||
199 | upa_writel(ctx->cmp, &ffb->cmp); | ||
200 | upa_writel(ctx->matchab, &ffb->matchab); | ||
201 | upa_writel(ctx->magnab, &ffb->magnab); | ||
202 | upa_writel(ctx->pmask, &ffb->pmask); | ||
203 | upa_writel(ctx->xpmask, &ffb->xpmask); | ||
204 | upa_writel(ctx->lpat, &ffb->lpat); | ||
205 | upa_writel(ctx->fontxy, &ffb->fontxy); | ||
206 | upa_writel(ctx->fontw, &ffb->fontw); | ||
207 | upa_writel(ctx->fontinc, &ffb->fontinc); | ||
208 | |||
209 | /* stencil/stencilctl only exists on FFB2+ and later | ||
210 | * due to the introduction of 3DRAM-III. | ||
211 | */ | ||
212 | if (fpriv->ffb_type == ffb2_vertical_plus || | ||
213 | fpriv->ffb_type == ffb2_horizontal_plus) { | ||
214 | upa_writel(ctx->stencil, &ffb->stencil); | ||
215 | upa_writel(ctx->stencilctl, &ffb->stencilctl); | ||
216 | upa_writel(0x80000000, &ffb->fbc); | ||
217 | upa_writel((ctx->stencilctl | 0x80000), | ||
218 | &ffb->rawstencilctl); | ||
219 | upa_writel(ctx->fbc, &ffb->fbc); | ||
220 | } | ||
221 | |||
222 | for (i = 0; i < 32; i++) | ||
223 | upa_writel(ctx->area_pattern[i], &ffb->pattern[i]); | ||
224 | upa_writel((ctx->ucsr & 0xf0000), &ffb->ucsr); | ||
225 | return; | ||
226 | } | ||
227 | |||
228 | /* Restore drawop. */ | ||
229 | upa_writel(ctx->drawop, &ffb->drawop); | ||
230 | |||
231 | /* If we were restoring the vertex registers, this is where | ||
232 | * we would do it. We would restore 32 32-bit words starting | ||
233 | * at ffb->suvtx. | ||
234 | */ | ||
235 | |||
236 | /* Restore rendering attributes. */ | ||
237 | |||
238 | upa_writel(ctx->ppc, &ffb->ppc); /* Pixel Processor Control */ | ||
239 | upa_writel(ctx->wid, &ffb->wid); /* Current WID */ | ||
240 | upa_writel(ctx->fg, &ffb->fg); /* Constant FG color */ | ||
241 | upa_writel(ctx->bg, &ffb->bg); /* Constant BG color */ | ||
242 | upa_writel(ctx->consty, &ffb->consty); /* Constant Y */ | ||
243 | upa_writel(ctx->constz, &ffb->constz); /* Constant Z */ | ||
244 | upa_writel(ctx->xclip, &ffb->xclip); /* X plane clip */ | ||
245 | upa_writel(ctx->dcss, &ffb->dcss); /* Depth Cue Scale Slope */ | ||
246 | upa_writel(ctx->vclipmin, &ffb->vclipmin); /* Primary XY clip, minimum */ | ||
247 | upa_writel(ctx->vclipmax, &ffb->vclipmax); /* Primary XY clip, maximum */ | ||
248 | upa_writel(ctx->vclipzmin, &ffb->vclipzmin); /* Primary Z clip, minimum */ | ||
249 | upa_writel(ctx->vclipzmax, &ffb->vclipzmax); /* Primary Z clip, maximum */ | ||
250 | upa_writel(ctx->dcsf, &ffb->dcsf); /* Depth Cue Scale Front Bound */ | ||
251 | upa_writel(ctx->dcsb, &ffb->dcsb); /* Depth Cue Scale Back Bound */ | ||
252 | upa_writel(ctx->dczf, &ffb->dczf); /* Depth Cue Scale Z Front */ | ||
253 | upa_writel(ctx->dczb, &ffb->dczb); /* Depth Cue Scale Z Back */ | ||
254 | upa_writel(ctx->blendc, &ffb->blendc); /* Alpha Blend Control */ | ||
255 | upa_writel(ctx->blendc1, &ffb->blendc1); /* Alpha Blend Color 1 */ | ||
256 | upa_writel(ctx->blendc2, &ffb->blendc2); /* Alpha Blend Color 2 */ | ||
257 | upa_writel(ctx->fbc, &ffb->fbc); /* Frame Buffer Control */ | ||
258 | upa_writel(ctx->rop, &ffb->rop); /* Raster Operation */ | ||
259 | upa_writel(ctx->cmp, &ffb->cmp); /* Compare Controls */ | ||
260 | upa_writel(ctx->matchab, &ffb->matchab); /* Buffer A/B Match Ops */ | ||
261 | upa_writel(ctx->matchc, &ffb->matchc); /* Buffer C Match Ops */ | ||
262 | upa_writel(ctx->magnab, &ffb->magnab); /* Buffer A/B Magnitude Ops */ | ||
263 | upa_writel(ctx->magnc, &ffb->magnc); /* Buffer C Magnitude Ops */ | ||
264 | upa_writel(ctx->pmask, &ffb->pmask); /* RGB Plane Mask */ | ||
265 | upa_writel(ctx->xpmask, &ffb->xpmask); /* X Plane Mask */ | ||
266 | upa_writel(ctx->ypmask, &ffb->ypmask); /* Y Plane Mask */ | ||
267 | upa_writel(ctx->zpmask, &ffb->zpmask); /* Z Plane Mask */ | ||
268 | |||
269 | /* Auxiliary Clips. */ | ||
270 | upa_writel(ctx->auxclip0min, &ffb->auxclip[0].min); | ||
271 | upa_writel(ctx->auxclip0max, &ffb->auxclip[0].max); | ||
272 | upa_writel(ctx->auxclip1min, &ffb->auxclip[1].min); | ||
273 | upa_writel(ctx->auxclip1max, &ffb->auxclip[1].max); | ||
274 | upa_writel(ctx->auxclip2min, &ffb->auxclip[2].min); | ||
275 | upa_writel(ctx->auxclip2max, &ffb->auxclip[2].max); | ||
276 | upa_writel(ctx->auxclip3min, &ffb->auxclip[3].min); | ||
277 | upa_writel(ctx->auxclip3max, &ffb->auxclip[3].max); | ||
278 | |||
279 | upa_writel(ctx->lpat, &ffb->lpat); /* Line Pattern */ | ||
280 | upa_writel(ctx->fontxy, &ffb->fontxy); /* XY Font Coordinate */ | ||
281 | upa_writel(ctx->fontw, &ffb->fontw); /* Font Width */ | ||
282 | upa_writel(ctx->fontinc, &ffb->fontinc); /* Font X/Y Increment */ | ||
283 | |||
284 | /* These registers/features only exist on FFB2 and later chips. */ | ||
285 | if (fpriv->ffb_type >= ffb2_prototype) { | ||
286 | upa_writel(ctx->dcss1, &ffb->dcss1); /* Depth Cue Scale Slope 1 */ | ||
287 | upa_writel(ctx->dcss2, &ffb->dcss2); /* Depth Cue Scale Slope 2 */ | ||
288 | upa_writel(ctx->dcss3, &ffb->dcss2); /* Depth Cue Scale Slope 3 */ | ||
289 | upa_writel(ctx->dcs2, &ffb->dcs2); /* Depth Cue Scale 2 */ | ||
290 | upa_writel(ctx->dcs3, &ffb->dcs3); /* Depth Cue Scale 3 */ | ||
291 | upa_writel(ctx->dcs4, &ffb->dcs4); /* Depth Cue Scale 4 */ | ||
292 | upa_writel(ctx->dcd2, &ffb->dcd2); /* Depth Cue Depth 2 */ | ||
293 | upa_writel(ctx->dcd3, &ffb->dcd3); /* Depth Cue Depth 3 */ | ||
294 | upa_writel(ctx->dcd4, &ffb->dcd4); /* Depth Cue Depth 4 */ | ||
295 | |||
296 | /* And stencil/stencilctl only exists on FFB2+ and later | ||
297 | * due to the introduction of 3DRAM-III. | ||
298 | */ | ||
299 | if (fpriv->ffb_type == ffb2_vertical_plus || | ||
300 | fpriv->ffb_type == ffb2_horizontal_plus) { | ||
301 | /* Unfortunately, there is a hardware bug on | ||
302 | * the FFB2+ chips which prevents a normal write | ||
303 | * to the stencil control register from working | ||
304 | * as it should. | ||
305 | * | ||
306 | * The state controlled by the FFB stencilctl register | ||
307 | * really gets transferred to the per-buffer instances | ||
308 | * of the stencilctl register in the 3DRAM chips. | ||
309 | * | ||
310 | * The bug is that FFB does not update buffer C correctly, | ||
311 | * so we have to do it by hand for them. | ||
312 | */ | ||
313 | |||
314 | /* This will update buffers A and B. */ | ||
315 | upa_writel(ctx->stencil, &ffb->stencil); | ||
316 | upa_writel(ctx->stencilctl, &ffb->stencilctl); | ||
317 | |||
318 | /* Force FFB to use buffer C 3dram regs. */ | ||
319 | upa_writel(0x80000000, &ffb->fbc); | ||
320 | upa_writel((ctx->stencilctl | 0x80000), | ||
321 | &ffb->rawstencilctl); | ||
322 | |||
323 | /* Now restore the correct FBC controls. */ | ||
324 | upa_writel(ctx->fbc, &ffb->fbc); | ||
325 | } | ||
326 | } | ||
327 | |||
328 | /* Restore the 32x32 area pattern. */ | ||
329 | for (i = 0; i < 32; i++) | ||
330 | upa_writel(ctx->area_pattern[i], &ffb->pattern[i]); | ||
331 | |||
332 | /* Finally, stash away the User Constol/Status Register. | ||
333 | * The only state we really preserve here is the picking | ||
334 | * control. | ||
335 | */ | ||
336 | upa_writel((ctx->ucsr & 0xf0000), &ffb->ucsr); | ||
337 | } | ||
338 | |||
339 | #define FFB_UCSR_FB_BUSY 0x01000000 | ||
340 | #define FFB_UCSR_RP_BUSY 0x02000000 | ||
341 | #define FFB_UCSR_ALL_BUSY (FFB_UCSR_RP_BUSY|FFB_UCSR_FB_BUSY) | ||
342 | |||
343 | static void FFBWait(ffb_fbcPtr ffb) | ||
344 | { | ||
345 | int limit = 100000; | ||
346 | |||
347 | do { | ||
348 | u32 regval = upa_readl(&ffb->ucsr); | ||
349 | |||
350 | if ((regval & FFB_UCSR_ALL_BUSY) == 0) | ||
351 | break; | ||
352 | } while (--limit); | ||
353 | } | ||
354 | |||
355 | int ffb_driver_context_switch(drm_device_t * dev, int old, int new) | ||
356 | { | ||
357 | ffb_dev_priv_t *fpriv = (ffb_dev_priv_t *) dev->dev_private; | ||
358 | |||
359 | #ifdef DRM_DMA_HISTOGRAM | ||
360 | dev->ctx_start = get_cycles(); | ||
361 | #endif | ||
362 | |||
363 | DRM_DEBUG("Context switch from %d to %d\n", old, new); | ||
364 | |||
365 | if (new == dev->last_context || dev->last_context == 0) { | ||
366 | dev->last_context = new; | ||
367 | return 0; | ||
368 | } | ||
369 | |||
370 | FFBWait(fpriv->regs); | ||
371 | ffb_save_context(fpriv, old); | ||
372 | ffb_restore_context(fpriv, old, new); | ||
373 | FFBWait(fpriv->regs); | ||
374 | |||
375 | dev->last_context = new; | ||
376 | |||
377 | return 0; | ||
378 | } | ||
379 | |||
380 | int ffb_driver_resctx(struct inode *inode, struct file *filp, unsigned int cmd, | ||
381 | unsigned long arg) | ||
382 | { | ||
383 | drm_ctx_res_t res; | ||
384 | drm_ctx_t ctx; | ||
385 | int i; | ||
386 | |||
387 | DRM_DEBUG("%d\n", DRM_RESERVED_CONTEXTS); | ||
388 | if (copy_from_user(&res, (drm_ctx_res_t __user *) arg, sizeof(res))) | ||
389 | return -EFAULT; | ||
390 | if (res.count >= DRM_RESERVED_CONTEXTS) { | ||
391 | memset(&ctx, 0, sizeof(ctx)); | ||
392 | for (i = 0; i < DRM_RESERVED_CONTEXTS; i++) { | ||
393 | ctx.handle = i; | ||
394 | if (copy_to_user(&res.contexts[i], &i, sizeof(i))) | ||
395 | return -EFAULT; | ||
396 | } | ||
397 | } | ||
398 | res.count = DRM_RESERVED_CONTEXTS; | ||
399 | if (copy_to_user((drm_ctx_res_t __user *) arg, &res, sizeof(res))) | ||
400 | return -EFAULT; | ||
401 | return 0; | ||
402 | } | ||
403 | |||
404 | int ffb_driver_addctx(struct inode *inode, struct file *filp, unsigned int cmd, | ||
405 | unsigned long arg) | ||
406 | { | ||
407 | drm_file_t *priv = filp->private_data; | ||
408 | drm_device_t *dev = priv->dev; | ||
409 | drm_ctx_t ctx; | ||
410 | int idx; | ||
411 | |||
412 | if (copy_from_user(&ctx, (drm_ctx_t __user *) arg, sizeof(ctx))) | ||
413 | return -EFAULT; | ||
414 | idx = DRM(alloc_queue) (dev, (ctx.flags & _DRM_CONTEXT_2DONLY)); | ||
415 | if (idx < 0) | ||
416 | return -ENFILE; | ||
417 | |||
418 | DRM_DEBUG("%d\n", ctx.handle); | ||
419 | ctx.handle = idx; | ||
420 | if (copy_to_user((drm_ctx_t __user *) arg, &ctx, sizeof(ctx))) | ||
421 | return -EFAULT; | ||
422 | return 0; | ||
423 | } | ||
424 | |||
425 | int ffb_driver_modctx(struct inode *inode, struct file *filp, unsigned int cmd, | ||
426 | unsigned long arg) | ||
427 | { | ||
428 | drm_file_t *priv = filp->private_data; | ||
429 | drm_device_t *dev = priv->dev; | ||
430 | ffb_dev_priv_t *fpriv = (ffb_dev_priv_t *) dev->dev_private; | ||
431 | struct ffb_hw_context *hwctx; | ||
432 | drm_ctx_t ctx; | ||
433 | int idx; | ||
434 | |||
435 | if (copy_from_user(&ctx, (drm_ctx_t __user *) arg, sizeof(ctx))) | ||
436 | return -EFAULT; | ||
437 | |||
438 | idx = ctx.handle; | ||
439 | if (idx <= 0 || idx >= FFB_MAX_CTXS) | ||
440 | return -EINVAL; | ||
441 | |||
442 | hwctx = fpriv->hw_state[idx - 1]; | ||
443 | if (hwctx == NULL) | ||
444 | return -EINVAL; | ||
445 | |||
446 | if ((ctx.flags & _DRM_CONTEXT_2DONLY) == 0) | ||
447 | hwctx->is_2d_only = 0; | ||
448 | else | ||
449 | hwctx->is_2d_only = 1; | ||
450 | |||
451 | return 0; | ||
452 | } | ||
453 | |||
454 | int ffb_driver_getctx(struct inode *inode, struct file *filp, unsigned int cmd, | ||
455 | unsigned long arg) | ||
456 | { | ||
457 | drm_file_t *priv = filp->private_data; | ||
458 | drm_device_t *dev = priv->dev; | ||
459 | ffb_dev_priv_t *fpriv = (ffb_dev_priv_t *) dev->dev_private; | ||
460 | struct ffb_hw_context *hwctx; | ||
461 | drm_ctx_t ctx; | ||
462 | int idx; | ||
463 | |||
464 | if (copy_from_user(&ctx, (drm_ctx_t __user *) arg, sizeof(ctx))) | ||
465 | return -EFAULT; | ||
466 | |||
467 | idx = ctx.handle; | ||
468 | if (idx <= 0 || idx >= FFB_MAX_CTXS) | ||
469 | return -EINVAL; | ||
470 | |||
471 | hwctx = fpriv->hw_state[idx - 1]; | ||
472 | if (hwctx == NULL) | ||
473 | return -EINVAL; | ||
474 | |||
475 | if (hwctx->is_2d_only != 0) | ||
476 | ctx.flags = _DRM_CONTEXT_2DONLY; | ||
477 | else | ||
478 | ctx.flags = 0; | ||
479 | |||
480 | if (copy_to_user((drm_ctx_t __user *) arg, &ctx, sizeof(ctx))) | ||
481 | return -EFAULT; | ||
482 | |||
483 | return 0; | ||
484 | } | ||
485 | |||
486 | int ffb_driver_switchctx(struct inode *inode, struct file *filp, | ||
487 | unsigned int cmd, unsigned long arg) | ||
488 | { | ||
489 | drm_file_t *priv = filp->private_data; | ||
490 | drm_device_t *dev = priv->dev; | ||
491 | drm_ctx_t ctx; | ||
492 | |||
493 | if (copy_from_user(&ctx, (drm_ctx_t __user *) arg, sizeof(ctx))) | ||
494 | return -EFAULT; | ||
495 | DRM_DEBUG("%d\n", ctx.handle); | ||
496 | return ffb_driver_context_switch(dev, dev->last_context, ctx.handle); | ||
497 | } | ||
498 | |||
499 | int ffb_driver_newctx(struct inode *inode, struct file *filp, unsigned int cmd, | ||
500 | unsigned long arg) | ||
501 | { | ||
502 | drm_ctx_t ctx; | ||
503 | |||
504 | if (copy_from_user(&ctx, (drm_ctx_t __user *) arg, sizeof(ctx))) | ||
505 | return -EFAULT; | ||
506 | DRM_DEBUG("%d\n", ctx.handle); | ||
507 | |||
508 | return 0; | ||
509 | } | ||
510 | |||
511 | int ffb_driver_rmctx(struct inode *inode, struct file *filp, unsigned int cmd, | ||
512 | unsigned long arg) | ||
513 | { | ||
514 | drm_ctx_t ctx; | ||
515 | drm_file_t *priv = filp->private_data; | ||
516 | drm_device_t *dev = priv->dev; | ||
517 | ffb_dev_priv_t *fpriv = (ffb_dev_priv_t *) dev->dev_private; | ||
518 | int idx; | ||
519 | |||
520 | if (copy_from_user(&ctx, (drm_ctx_t __user *) arg, sizeof(ctx))) | ||
521 | return -EFAULT; | ||
522 | DRM_DEBUG("%d\n", ctx.handle); | ||
523 | |||
524 | idx = ctx.handle - 1; | ||
525 | if (idx < 0 || idx >= FFB_MAX_CTXS) | ||
526 | return -EINVAL; | ||
527 | |||
528 | kfree(fpriv->hw_state[idx]); | ||
529 | fpriv->hw_state[idx] = NULL; | ||
530 | return 0; | ||
531 | } | ||
532 | |||
533 | void ffb_set_context_ioctls(void) | ||
534 | { | ||
535 | DRM(ioctls)[DRM_IOCTL_NR(DRM_IOCTL_ADD_CTX)].func = ffb_driver_addctx; | ||
536 | DRM(ioctls)[DRM_IOCTL_NR(DRM_IOCTL_RM_CTX)].func = ffb_driver_rmctx; | ||
537 | DRM(ioctls)[DRM_IOCTL_NR(DRM_IOCTL_MOD_CTX)].func = ffb_driver_modctx; | ||
538 | DRM(ioctls)[DRM_IOCTL_NR(DRM_IOCTL_GET_CTX)].func = ffb_driver_getctx; | ||
539 | DRM(ioctls)[DRM_IOCTL_NR(DRM_IOCTL_SWITCH_CTX)].func = | ||
540 | ffb_driver_switchctx; | ||
541 | DRM(ioctls)[DRM_IOCTL_NR(DRM_IOCTL_NEW_CTX)].func = ffb_driver_newctx; | ||
542 | DRM(ioctls)[DRM_IOCTL_NR(DRM_IOCTL_RES_CTX)].func = ffb_driver_resctx; | ||
543 | |||
544 | } | ||
diff --git a/drivers/char/drm/ffb_drv.c b/drivers/char/drm/ffb_drv.c deleted file mode 100644 index 9a19879e3b68..000000000000 --- a/drivers/char/drm/ffb_drv.c +++ /dev/null | |||
@@ -1,355 +0,0 @@ | |||
1 | /* $Id: ffb_drv.c,v 1.16 2001/10/18 16:00:24 davem Exp $ | ||
2 | * ffb_drv.c: Creator/Creator3D direct rendering driver. | ||
3 | * | ||
4 | * Copyright (C) 2000 David S. Miller (davem@redhat.com) | ||
5 | */ | ||
6 | |||
7 | #include "ffb.h" | ||
8 | #include "drmP.h" | ||
9 | |||
10 | #include "ffb_drv.h" | ||
11 | |||
12 | #include <linux/smp_lock.h> | ||
13 | #include <asm/shmparam.h> | ||
14 | #include <asm/oplib.h> | ||
15 | #include <asm/upa.h> | ||
16 | |||
17 | #define DRIVER_AUTHOR "David S. Miller" | ||
18 | |||
19 | #define DRIVER_NAME "ffb" | ||
20 | #define DRIVER_DESC "Creator/Creator3D" | ||
21 | #define DRIVER_DATE "20000517" | ||
22 | |||
23 | #define DRIVER_MAJOR 0 | ||
24 | #define DRIVER_MINOR 0 | ||
25 | #define DRIVER_PATCHLEVEL 1 | ||
26 | |||
27 | typedef struct _ffb_position_t { | ||
28 | int node; | ||
29 | int root; | ||
30 | } ffb_position_t; | ||
31 | |||
32 | static ffb_position_t *ffb_position; | ||
33 | |||
34 | static void get_ffb_type(ffb_dev_priv_t * ffb_priv, int instance) | ||
35 | { | ||
36 | volatile unsigned char *strap_bits; | ||
37 | unsigned char val; | ||
38 | |||
39 | strap_bits = (volatile unsigned char *) | ||
40 | (ffb_priv->card_phys_base + 0x00200000UL); | ||
41 | |||
42 | /* Don't ask, you have to read the value twice for whatever | ||
43 | * reason to get correct contents. | ||
44 | */ | ||
45 | val = upa_readb(strap_bits); | ||
46 | val = upa_readb(strap_bits); | ||
47 | switch (val & 0x78) { | ||
48 | case (0x0 << 5) | (0x0 << 3): | ||
49 | ffb_priv->ffb_type = ffb1_prototype; | ||
50 | printk("ffb%d: Detected FFB1 pre-FCS prototype\n", instance); | ||
51 | break; | ||
52 | case (0x0 << 5) | (0x1 << 3): | ||
53 | ffb_priv->ffb_type = ffb1_standard; | ||
54 | printk("ffb%d: Detected FFB1\n", instance); | ||
55 | break; | ||
56 | case (0x0 << 5) | (0x3 << 3): | ||
57 | ffb_priv->ffb_type = ffb1_speedsort; | ||
58 | printk("ffb%d: Detected FFB1-SpeedSort\n", instance); | ||
59 | break; | ||
60 | case (0x1 << 5) | (0x0 << 3): | ||
61 | ffb_priv->ffb_type = ffb2_prototype; | ||
62 | printk("ffb%d: Detected FFB2/vertical pre-FCS prototype\n", | ||
63 | instance); | ||
64 | break; | ||
65 | case (0x1 << 5) | (0x1 << 3): | ||
66 | ffb_priv->ffb_type = ffb2_vertical; | ||
67 | printk("ffb%d: Detected FFB2/vertical\n", instance); | ||
68 | break; | ||
69 | case (0x1 << 5) | (0x2 << 3): | ||
70 | ffb_priv->ffb_type = ffb2_vertical_plus; | ||
71 | printk("ffb%d: Detected FFB2+/vertical\n", instance); | ||
72 | break; | ||
73 | case (0x2 << 5) | (0x0 << 3): | ||
74 | ffb_priv->ffb_type = ffb2_horizontal; | ||
75 | printk("ffb%d: Detected FFB2/horizontal\n", instance); | ||
76 | break; | ||
77 | case (0x2 << 5) | (0x2 << 3): | ||
78 | ffb_priv->ffb_type = ffb2_horizontal; | ||
79 | printk("ffb%d: Detected FFB2+/horizontal\n", instance); | ||
80 | break; | ||
81 | default: | ||
82 | ffb_priv->ffb_type = ffb2_vertical; | ||
83 | printk("ffb%d: Unknown boardID[%08x], assuming FFB2\n", | ||
84 | instance, val); | ||
85 | break; | ||
86 | }; | ||
87 | } | ||
88 | |||
89 | static void ffb_apply_upa_parent_ranges(int parent, | ||
90 | struct linux_prom64_registers *regs) | ||
91 | { | ||
92 | struct linux_prom64_ranges ranges[PROMREG_MAX]; | ||
93 | char name[128]; | ||
94 | int len, i; | ||
95 | |||
96 | prom_getproperty(parent, "name", name, sizeof(name)); | ||
97 | if (strcmp(name, "upa") != 0) | ||
98 | return; | ||
99 | |||
100 | len = | ||
101 | prom_getproperty(parent, "ranges", (void *)ranges, sizeof(ranges)); | ||
102 | if (len <= 0) | ||
103 | return; | ||
104 | |||
105 | len /= sizeof(struct linux_prom64_ranges); | ||
106 | for (i = 0; i < len; i++) { | ||
107 | struct linux_prom64_ranges *rng = &ranges[i]; | ||
108 | u64 phys_addr = regs->phys_addr; | ||
109 | |||
110 | if (phys_addr >= rng->ot_child_base && | ||
111 | phys_addr < (rng->ot_child_base + rng->or_size)) { | ||
112 | regs->phys_addr -= rng->ot_child_base; | ||
113 | regs->phys_addr += rng->ot_parent_base; | ||
114 | return; | ||
115 | } | ||
116 | } | ||
117 | |||
118 | return; | ||
119 | } | ||
120 | |||
121 | static int ffb_init_one(drm_device_t * dev, int prom_node, int parent_node, | ||
122 | int instance) | ||
123 | { | ||
124 | struct linux_prom64_registers regs[2 * PROMREG_MAX]; | ||
125 | ffb_dev_priv_t *ffb_priv = (ffb_dev_priv_t *) dev->dev_private; | ||
126 | int i; | ||
127 | |||
128 | ffb_priv->prom_node = prom_node; | ||
129 | if (prom_getproperty(ffb_priv->prom_node, "reg", | ||
130 | (void *)regs, sizeof(regs)) <= 0) { | ||
131 | return -EINVAL; | ||
132 | } | ||
133 | ffb_apply_upa_parent_ranges(parent_node, ®s[0]); | ||
134 | ffb_priv->card_phys_base = regs[0].phys_addr; | ||
135 | ffb_priv->regs = (ffb_fbcPtr) | ||
136 | (regs[0].phys_addr + 0x00600000UL); | ||
137 | get_ffb_type(ffb_priv, instance); | ||
138 | for (i = 0; i < FFB_MAX_CTXS; i++) | ||
139 | ffb_priv->hw_state[i] = NULL; | ||
140 | |||
141 | return 0; | ||
142 | } | ||
143 | |||
144 | static drm_map_t *ffb_find_map(struct file *filp, unsigned long off) | ||
145 | { | ||
146 | drm_file_t *priv = filp->private_data; | ||
147 | drm_device_t *dev; | ||
148 | drm_map_list_t *r_list; | ||
149 | struct list_head *list; | ||
150 | drm_map_t *map; | ||
151 | |||
152 | if (!priv || (dev = priv->dev) == NULL) | ||
153 | return NULL; | ||
154 | |||
155 | list_for_each(list, &dev->maplist->head) { | ||
156 | r_list = (drm_map_list_t *) list; | ||
157 | map = r_list->map; | ||
158 | if (!map) | ||
159 | continue; | ||
160 | if (r_list->user_token == off) | ||
161 | return map; | ||
162 | } | ||
163 | |||
164 | return NULL; | ||
165 | } | ||
166 | |||
167 | unsigned long ffb_get_unmapped_area(struct file *filp, | ||
168 | unsigned long hint, | ||
169 | unsigned long len, | ||
170 | unsigned long pgoff, unsigned long flags) | ||
171 | { | ||
172 | drm_map_t *map = ffb_find_map(filp, pgoff << PAGE_SHIFT); | ||
173 | unsigned long addr = -ENOMEM; | ||
174 | |||
175 | if (!map) | ||
176 | return get_unmapped_area(NULL, hint, len, pgoff, flags); | ||
177 | |||
178 | if (map->type == _DRM_FRAME_BUFFER || map->type == _DRM_REGISTERS) { | ||
179 | #ifdef HAVE_ARCH_FB_UNMAPPED_AREA | ||
180 | addr = get_fb_unmapped_area(filp, hint, len, pgoff, flags); | ||
181 | #else | ||
182 | addr = get_unmapped_area(NULL, hint, len, pgoff, flags); | ||
183 | #endif | ||
184 | } else if (map->type == _DRM_SHM && SHMLBA > PAGE_SIZE) { | ||
185 | unsigned long slack = SHMLBA - PAGE_SIZE; | ||
186 | |||
187 | addr = get_unmapped_area(NULL, hint, len + slack, pgoff, flags); | ||
188 | if (!(addr & ~PAGE_MASK)) { | ||
189 | unsigned long kvirt = (unsigned long)map->handle; | ||
190 | |||
191 | if ((kvirt & (SHMLBA - 1)) != (addr & (SHMLBA - 1))) { | ||
192 | unsigned long koff, aoff; | ||
193 | |||
194 | koff = kvirt & (SHMLBA - 1); | ||
195 | aoff = addr & (SHMLBA - 1); | ||
196 | if (koff < aoff) | ||
197 | koff += SHMLBA; | ||
198 | |||
199 | addr += (koff - aoff); | ||
200 | } | ||
201 | } | ||
202 | } else { | ||
203 | addr = get_unmapped_area(NULL, hint, len, pgoff, flags); | ||
204 | } | ||
205 | |||
206 | return addr; | ||
207 | } | ||
208 | |||
209 | static int ffb_presetup(drm_device_t * dev) | ||
210 | { | ||
211 | ffb_dev_priv_t *ffb_priv; | ||
212 | int ret = 0; | ||
213 | int i = 0; | ||
214 | |||
215 | /* Check for the case where no device was found. */ | ||
216 | if (ffb_position == NULL) | ||
217 | return -ENODEV; | ||
218 | |||
219 | /* code used to use numdevs no numdevs anymore */ | ||
220 | ffb_priv = kmalloc(sizeof(ffb_dev_priv_t), GFP_KERNEL); | ||
221 | if (!ffb_priv) | ||
222 | return -ENOMEM; | ||
223 | memset(ffb_priv, 0, sizeof(*ffb_priv)); | ||
224 | dev->dev_private = ffb_priv; | ||
225 | |||
226 | ret = ffb_init_one(dev, ffb_position[i].node, ffb_position[i].root, i); | ||
227 | return ret; | ||
228 | } | ||
229 | |||
230 | static void ffb_driver_release(drm_device_t * dev, struct file *filp) | ||
231 | { | ||
232 | ffb_dev_priv_t *fpriv = (ffb_dev_priv_t *) dev->dev_private; | ||
233 | int context = _DRM_LOCKING_CONTEXT(dev->lock.hw_lock->lock); | ||
234 | int idx; | ||
235 | |||
236 | idx = context - 1; | ||
237 | if (fpriv && | ||
238 | context != DRM_KERNEL_CONTEXT && fpriv->hw_state[idx] != NULL) { | ||
239 | kfree(fpriv->hw_state[idx]); | ||
240 | fpriv->hw_state[idx] = NULL; | ||
241 | } | ||
242 | } | ||
243 | |||
244 | static void ffb_driver_pretakedown(drm_device_t * dev) | ||
245 | { | ||
246 | kfree(dev->dev_private); | ||
247 | } | ||
248 | |||
249 | static int ffb_driver_postcleanup(drm_device_t * dev) | ||
250 | { | ||
251 | kfree(ffb_position); | ||
252 | return 0; | ||
253 | } | ||
254 | |||
255 | static void ffb_driver_kernel_context_switch_unlock(struct drm_device *dev, | ||
256 | drm_lock_t * lock) | ||
257 | { | ||
258 | dev->lock.filp = 0; | ||
259 | { | ||
260 | __volatile__ unsigned int *plock = &dev->lock.hw_lock->lock; | ||
261 | unsigned int old, new, prev, ctx; | ||
262 | |||
263 | ctx = lock->context; | ||
264 | do { | ||
265 | old = *plock; | ||
266 | new = ctx; | ||
267 | prev = cmpxchg(plock, old, new); | ||
268 | } while (prev != old); | ||
269 | } | ||
270 | wake_up_interruptible(&dev->lock.lock_queue); | ||
271 | } | ||
272 | |||
273 | static unsigned long ffb_driver_get_map_ofs(drm_map_t * map) | ||
274 | { | ||
275 | return (map->offset & 0xffffffff); | ||
276 | } | ||
277 | |||
278 | static unsigned long ffb_driver_get_reg_ofs(drm_device_t * dev) | ||
279 | { | ||
280 | ffb_dev_priv_t *ffb_priv = (ffb_dev_priv_t *) dev->dev_private; | ||
281 | |||
282 | if (ffb_priv) | ||
283 | return ffb_priv->card_phys_base; | ||
284 | |||
285 | return 0; | ||
286 | } | ||
287 | |||
288 | static int postinit(struct drm_device *dev, unsigned long flags) | ||
289 | { | ||
290 | DRM_INFO("Initialized %s %d.%d.%d %s on minor %d\n", | ||
291 | DRIVER_NAME, | ||
292 | DRIVER_MAJOR, | ||
293 | DRIVER_MINOR, DRIVER_PATCHLEVEL, DRIVER_DATE, dev->minor); | ||
294 | return 0; | ||
295 | } | ||
296 | |||
297 | static int version(drm_version_t * version) | ||
298 | { | ||
299 | int len; | ||
300 | |||
301 | version->version_major = DRIVER_MAJOR; | ||
302 | version->version_minor = DRIVER_MINOR; | ||
303 | version->version_patchlevel = DRIVER_PATCHLEVEL; | ||
304 | DRM_COPY(version->name, DRIVER_NAME); | ||
305 | DRM_COPY(version->date, DRIVER_DATE); | ||
306 | DRM_COPY(version->desc, DRIVER_DESC); | ||
307 | return 0; | ||
308 | } | ||
309 | |||
310 | static drm_ioctl_desc_t ioctls[] = { | ||
311 | |||
312 | }; | ||
313 | |||
314 | static struct drm_driver driver = { | ||
315 | .driver_features = 0, | ||
316 | .dev_priv_size = sizeof(u32), | ||
317 | .release = ffb_driver_release, | ||
318 | .presetup = ffb_presetup, | ||
319 | .pretakedown = ffb_driver_pretakedown, | ||
320 | .postcleanup = ffb_driver_postcleanup, | ||
321 | .kernel_context_switch = ffb_driver_context_switch, | ||
322 | .kernel_context_switch_unlock = ffb_driver_kernel_context_switch_unlock, | ||
323 | .get_map_ofs = ffb_driver_get_map_ofs, | ||
324 | .get_reg_ofs = ffb_driver_get_reg_ofs, | ||
325 | .postinit = postinit, | ||
326 | .version = version, | ||
327 | .ioctls = ioctls, | ||
328 | .num_ioctls = DRM_ARRAY_SIZE(ioctls), | ||
329 | .fops = { | ||
330 | .owner = THIS_MODULE, | ||
331 | .open = drm_open, | ||
332 | .release = drm_release, | ||
333 | .ioctl = drm_ioctl, | ||
334 | .mmap = drm_mmap, | ||
335 | .poll = drm_poll, | ||
336 | .fasync = drm_fasync, | ||
337 | } | ||
338 | , | ||
339 | }; | ||
340 | |||
341 | static int __init ffb_init(void) | ||
342 | { | ||
343 | return -ENODEV; | ||
344 | } | ||
345 | |||
346 | static void __exit ffb_exit(void) | ||
347 | { | ||
348 | } | ||
349 | |||
350 | module_init(ffb_init); | ||
351 | module_exit(ffb_exit); | ||
352 | |||
353 | MODULE_AUTHOR(DRIVER_AUTHOR); | ||
354 | MODULE_DESCRIPTION(DRIVER_DESC); | ||
355 | MODULE_LICENSE("GPL and additional rights"); | ||
diff --git a/drivers/char/drm/ffb_drv.h b/drivers/char/drm/ffb_drv.h deleted file mode 100644 index 582afa6dd2b4..000000000000 --- a/drivers/char/drm/ffb_drv.h +++ /dev/null | |||
@@ -1,379 +0,0 @@ | |||
1 | /* $Id: ffb_drv.h,v 1.1 2000/06/01 04:24:39 davem Exp $ | ||
2 | * ffb_drv.h: Creator/Creator3D direct rendering driver. | ||
3 | * | ||
4 | * Copyright (C) 2000 David S. Miller (davem@redhat.com) | ||
5 | */ | ||
6 | |||
7 | /* Auxilliary clips. */ | ||
8 | typedef struct { | ||
9 | volatile unsigned int min; | ||
10 | volatile unsigned int max; | ||
11 | } ffb_auxclip, *ffb_auxclipPtr; | ||
12 | |||
13 | /* FFB register set. */ | ||
14 | typedef struct _ffb_fbc { | ||
15 | /* Next vertex registers, on the right we list which drawops | ||
16 | * use said register and the logical name the register has in | ||
17 | * that context. | ||
18 | *//* DESCRIPTION DRAWOP(NAME) */ | ||
19 | /*0x00*/ unsigned int pad1[3]; | ||
20 | /* Reserved */ | ||
21 | /*0x0c*/ volatile unsigned int alpha; | ||
22 | /* ALPHA Transparency */ | ||
23 | /*0x10*/ volatile unsigned int red; | ||
24 | /* RED */ | ||
25 | /*0x14*/ volatile unsigned int green; | ||
26 | /* GREEN */ | ||
27 | /*0x18*/ volatile unsigned int blue; | ||
28 | /* BLUE */ | ||
29 | /*0x1c*/ volatile unsigned int z; | ||
30 | /* DEPTH */ | ||
31 | /*0x20*/ volatile unsigned int y; | ||
32 | /* Y triangle(DOYF) */ | ||
33 | /* aadot(DYF) */ | ||
34 | /* ddline(DYF) */ | ||
35 | /* aaline(DYF) */ | ||
36 | /*0x24*/ volatile unsigned int x; | ||
37 | /* X triangle(DOXF) */ | ||
38 | /* aadot(DXF) */ | ||
39 | /* ddline(DXF) */ | ||
40 | /* aaline(DXF) */ | ||
41 | /*0x28*/ unsigned int pad2[2]; | ||
42 | /* Reserved */ | ||
43 | /*0x30*/ volatile unsigned int ryf; | ||
44 | /* Y (alias to DOYF) ddline(RYF) */ | ||
45 | /* aaline(RYF) */ | ||
46 | /* triangle(RYF) */ | ||
47 | /*0x34*/ volatile unsigned int rxf; | ||
48 | /* X ddline(RXF) */ | ||
49 | /* aaline(RXF) */ | ||
50 | /* triangle(RXF) */ | ||
51 | /*0x38*/ unsigned int pad3[2]; | ||
52 | /* Reserved */ | ||
53 | /*0x40*/ volatile unsigned int dmyf; | ||
54 | /* Y (alias to DOYF) triangle(DMYF) */ | ||
55 | /*0x44*/ volatile unsigned int dmxf; | ||
56 | /* X triangle(DMXF) */ | ||
57 | /*0x48*/ unsigned int pad4[2]; | ||
58 | /* Reserved */ | ||
59 | /*0x50*/ volatile unsigned int ebyi; | ||
60 | /* Y (alias to RYI) polygon(EBYI) */ | ||
61 | /*0x54*/ volatile unsigned int ebxi; | ||
62 | /* X polygon(EBXI) */ | ||
63 | /*0x58*/ unsigned int pad5[2]; | ||
64 | /* Reserved */ | ||
65 | /*0x60*/ volatile unsigned int by; | ||
66 | /* Y brline(RYI) */ | ||
67 | /* fastfill(OP) */ | ||
68 | /* polygon(YI) */ | ||
69 | /* rectangle(YI) */ | ||
70 | /* bcopy(SRCY) */ | ||
71 | /* vscroll(SRCY) */ | ||
72 | /*0x64*/ volatile unsigned int bx; | ||
73 | /* X brline(RXI) */ | ||
74 | /* polygon(XI) */ | ||
75 | /* rectangle(XI) */ | ||
76 | /* bcopy(SRCX) */ | ||
77 | /* vscroll(SRCX) */ | ||
78 | /* fastfill(GO) */ | ||
79 | /*0x68*/ volatile unsigned int dy; | ||
80 | /* destination Y fastfill(DSTY) */ | ||
81 | /* bcopy(DSRY) */ | ||
82 | /* vscroll(DSRY) */ | ||
83 | /*0x6c*/ volatile unsigned int dx; | ||
84 | /* destination X fastfill(DSTX) */ | ||
85 | /* bcopy(DSTX) */ | ||
86 | /* vscroll(DSTX) */ | ||
87 | /*0x70*/ volatile unsigned int bh; | ||
88 | /* Y (alias to RYI) brline(DYI) */ | ||
89 | /* dot(DYI) */ | ||
90 | /* polygon(ETYI) */ | ||
91 | /* Height fastfill(H) */ | ||
92 | /* bcopy(H) */ | ||
93 | /* vscroll(H) */ | ||
94 | /* Y count fastfill(NY) */ | ||
95 | /*0x74*/ volatile unsigned int bw; | ||
96 | /* X dot(DXI) */ | ||
97 | /* brline(DXI) */ | ||
98 | /* polygon(ETXI) */ | ||
99 | /* fastfill(W) */ | ||
100 | /* bcopy(W) */ | ||
101 | /* vscroll(W) */ | ||
102 | /* fastfill(NX) */ | ||
103 | /*0x78*/ unsigned int pad6[2]; | ||
104 | /* Reserved */ | ||
105 | /*0x80*/ unsigned int pad7[32]; | ||
106 | /* Reserved */ | ||
107 | |||
108 | /* Setup Unit's vertex state register */ | ||
109 | /*100*/ volatile unsigned int suvtx; | ||
110 | /*104*/ unsigned int pad8[63]; | ||
111 | /* Reserved */ | ||
112 | |||
113 | /* Frame Buffer Control Registers */ | ||
114 | /*200*/ volatile unsigned int ppc; | ||
115 | /* Pixel Processor Control */ | ||
116 | /*204*/ volatile unsigned int wid; | ||
117 | /* Current WID */ | ||
118 | /*208*/ volatile unsigned int fg; | ||
119 | /* FG data */ | ||
120 | /*20c*/ volatile unsigned int bg; | ||
121 | /* BG data */ | ||
122 | /*210*/ volatile unsigned int consty; | ||
123 | /* Constant Y */ | ||
124 | /*214*/ volatile unsigned int constz; | ||
125 | /* Constant Z */ | ||
126 | /*218*/ volatile unsigned int xclip; | ||
127 | /* X Clip */ | ||
128 | /*21c*/ volatile unsigned int dcss; | ||
129 | /* Depth Cue Scale Slope */ | ||
130 | /*220*/ volatile unsigned int vclipmin; | ||
131 | /* Viewclip XY Min Bounds */ | ||
132 | /*224*/ volatile unsigned int vclipmax; | ||
133 | /* Viewclip XY Max Bounds */ | ||
134 | /*228*/ volatile unsigned int vclipzmin; | ||
135 | /* Viewclip Z Min Bounds */ | ||
136 | /*22c*/ volatile unsigned int vclipzmax; | ||
137 | /* Viewclip Z Max Bounds */ | ||
138 | /*230*/ volatile unsigned int dcsf; | ||
139 | /* Depth Cue Scale Front Bound */ | ||
140 | /*234*/ volatile unsigned int dcsb; | ||
141 | /* Depth Cue Scale Back Bound */ | ||
142 | /*238*/ volatile unsigned int dczf; | ||
143 | /* Depth Cue Z Front */ | ||
144 | /*23c*/ volatile unsigned int dczb; | ||
145 | /* Depth Cue Z Back */ | ||
146 | /*240*/ unsigned int pad9; | ||
147 | /* Reserved */ | ||
148 | /*244*/ volatile unsigned int blendc; | ||
149 | /* Alpha Blend Control */ | ||
150 | /*248*/ volatile unsigned int blendc1; | ||
151 | /* Alpha Blend Color 1 */ | ||
152 | /*24c*/ volatile unsigned int blendc2; | ||
153 | /* Alpha Blend Color 2 */ | ||
154 | /*250*/ volatile unsigned int fbramitc; | ||
155 | /* FB RAM Interleave Test Control */ | ||
156 | /*254*/ volatile unsigned int fbc; | ||
157 | /* Frame Buffer Control */ | ||
158 | /*258*/ volatile unsigned int rop; | ||
159 | /* Raster OPeration */ | ||
160 | /*25c*/ volatile unsigned int cmp; | ||
161 | /* Frame Buffer Compare */ | ||
162 | /*260*/ volatile unsigned int matchab; | ||
163 | /* Buffer AB Match Mask */ | ||
164 | /*264*/ volatile unsigned int matchc; | ||
165 | /* Buffer C(YZ) Match Mask */ | ||
166 | /*268*/ volatile unsigned int magnab; | ||
167 | /* Buffer AB Magnitude Mask */ | ||
168 | /*26c*/ volatile unsigned int magnc; | ||
169 | /* Buffer C(YZ) Magnitude Mask */ | ||
170 | /*270*/ volatile unsigned int fbcfg0; | ||
171 | /* Frame Buffer Config 0 */ | ||
172 | /*274*/ volatile unsigned int fbcfg1; | ||
173 | /* Frame Buffer Config 1 */ | ||
174 | /*278*/ volatile unsigned int fbcfg2; | ||
175 | /* Frame Buffer Config 2 */ | ||
176 | /*27c*/ volatile unsigned int fbcfg3; | ||
177 | /* Frame Buffer Config 3 */ | ||
178 | /*280*/ volatile unsigned int ppcfg; | ||
179 | /* Pixel Processor Config */ | ||
180 | /*284*/ volatile unsigned int pick; | ||
181 | /* Picking Control */ | ||
182 | /*288*/ volatile unsigned int fillmode; | ||
183 | /* FillMode */ | ||
184 | /*28c*/ volatile unsigned int fbramwac; | ||
185 | /* FB RAM Write Address Control */ | ||
186 | /*290*/ volatile unsigned int pmask; | ||
187 | /* RGB PlaneMask */ | ||
188 | /*294*/ volatile unsigned int xpmask; | ||
189 | /* X PlaneMask */ | ||
190 | /*298*/ volatile unsigned int ypmask; | ||
191 | /* Y PlaneMask */ | ||
192 | /*29c*/ volatile unsigned int zpmask; | ||
193 | /* Z PlaneMask */ | ||
194 | /*2a0*/ ffb_auxclip auxclip[4]; | ||
195 | /* Auxilliary Viewport Clip */ | ||
196 | |||
197 | /* New 3dRAM III support regs */ | ||
198 | /*2c0*/ volatile unsigned int rawblend2; | ||
199 | /*2c4*/ volatile unsigned int rawpreblend; | ||
200 | /*2c8*/ volatile unsigned int rawstencil; | ||
201 | /*2cc*/ volatile unsigned int rawstencilctl; | ||
202 | /*2d0*/ volatile unsigned int threedram1; | ||
203 | /*2d4*/ volatile unsigned int threedram2; | ||
204 | /*2d8*/ volatile unsigned int passin; | ||
205 | /*2dc*/ volatile unsigned int rawclrdepth; | ||
206 | /*2e0*/ volatile unsigned int rawpmask; | ||
207 | /*2e4*/ volatile unsigned int rawcsrc; | ||
208 | /*2e8*/ volatile unsigned int rawmatch; | ||
209 | /*2ec*/ volatile unsigned int rawmagn; | ||
210 | /*2f0*/ volatile unsigned int rawropblend; | ||
211 | /*2f4*/ volatile unsigned int rawcmp; | ||
212 | /*2f8*/ volatile unsigned int rawwac; | ||
213 | /*2fc*/ volatile unsigned int fbramid; | ||
214 | |||
215 | /*300*/ volatile unsigned int drawop; | ||
216 | /* Draw OPeration */ | ||
217 | /*304*/ unsigned int pad10[2]; | ||
218 | /* Reserved */ | ||
219 | /*30c*/ volatile unsigned int lpat; | ||
220 | /* Line Pattern control */ | ||
221 | /*310*/ unsigned int pad11; | ||
222 | /* Reserved */ | ||
223 | /*314*/ volatile unsigned int fontxy; | ||
224 | /* XY Font coordinate */ | ||
225 | /*318*/ volatile unsigned int fontw; | ||
226 | /* Font Width */ | ||
227 | /*31c*/ volatile unsigned int fontinc; | ||
228 | /* Font Increment */ | ||
229 | /*320*/ volatile unsigned int font; | ||
230 | /* Font bits */ | ||
231 | /*324*/ unsigned int pad12[3]; | ||
232 | /* Reserved */ | ||
233 | /*330*/ volatile unsigned int blend2; | ||
234 | /*334*/ volatile unsigned int preblend; | ||
235 | /*338*/ volatile unsigned int stencil; | ||
236 | /*33c*/ volatile unsigned int stencilctl; | ||
237 | |||
238 | /*340*/ unsigned int pad13[4]; | ||
239 | /* Reserved */ | ||
240 | /*350*/ volatile unsigned int dcss1; | ||
241 | /* Depth Cue Scale Slope 1 */ | ||
242 | /*354*/ volatile unsigned int dcss2; | ||
243 | /* Depth Cue Scale Slope 2 */ | ||
244 | /*358*/ volatile unsigned int dcss3; | ||
245 | /* Depth Cue Scale Slope 3 */ | ||
246 | /*35c*/ volatile unsigned int widpmask; | ||
247 | /*360*/ volatile unsigned int dcs2; | ||
248 | /*364*/ volatile unsigned int dcs3; | ||
249 | /*368*/ volatile unsigned int dcs4; | ||
250 | /*36c*/ unsigned int pad14; | ||
251 | /* Reserved */ | ||
252 | /*370*/ volatile unsigned int dcd2; | ||
253 | /*374*/ volatile unsigned int dcd3; | ||
254 | /*378*/ volatile unsigned int dcd4; | ||
255 | /*37c*/ unsigned int pad15; | ||
256 | /* Reserved */ | ||
257 | /*380*/ volatile unsigned int pattern[32]; | ||
258 | /* area Pattern */ | ||
259 | /*400*/ unsigned int pad16[8]; | ||
260 | /* Reserved */ | ||
261 | /*420*/ volatile unsigned int reset; | ||
262 | /* chip RESET */ | ||
263 | /*424*/ unsigned int pad17[247]; | ||
264 | /* Reserved */ | ||
265 | /*800*/ volatile unsigned int devid; | ||
266 | /* Device ID */ | ||
267 | /*804*/ unsigned int pad18[63]; | ||
268 | /* Reserved */ | ||
269 | /*900*/ volatile unsigned int ucsr; | ||
270 | /* User Control & Status Register */ | ||
271 | /*904*/ unsigned int pad19[31]; | ||
272 | /* Reserved */ | ||
273 | /*980*/ volatile unsigned int mer; | ||
274 | /* Mode Enable Register */ | ||
275 | /*984*/ unsigned int pad20[1439]; | ||
276 | /* Reserved */ | ||
277 | } ffb_fbc, *ffb_fbcPtr; | ||
278 | |||
279 | struct ffb_hw_context { | ||
280 | int is_2d_only; | ||
281 | |||
282 | unsigned int ppc; | ||
283 | unsigned int wid; | ||
284 | unsigned int fg; | ||
285 | unsigned int bg; | ||
286 | unsigned int consty; | ||
287 | unsigned int constz; | ||
288 | unsigned int xclip; | ||
289 | unsigned int dcss; | ||
290 | unsigned int vclipmin; | ||
291 | unsigned int vclipmax; | ||
292 | unsigned int vclipzmin; | ||
293 | unsigned int vclipzmax; | ||
294 | unsigned int dcsf; | ||
295 | unsigned int dcsb; | ||
296 | unsigned int dczf; | ||
297 | unsigned int dczb; | ||
298 | unsigned int blendc; | ||
299 | unsigned int blendc1; | ||
300 | unsigned int blendc2; | ||
301 | unsigned int fbc; | ||
302 | unsigned int rop; | ||
303 | unsigned int cmp; | ||
304 | unsigned int matchab; | ||
305 | unsigned int matchc; | ||
306 | unsigned int magnab; | ||
307 | unsigned int magnc; | ||
308 | unsigned int pmask; | ||
309 | unsigned int xpmask; | ||
310 | unsigned int ypmask; | ||
311 | unsigned int zpmask; | ||
312 | unsigned int auxclip0min; | ||
313 | unsigned int auxclip0max; | ||
314 | unsigned int auxclip1min; | ||
315 | unsigned int auxclip1max; | ||
316 | unsigned int auxclip2min; | ||
317 | unsigned int auxclip2max; | ||
318 | unsigned int auxclip3min; | ||
319 | unsigned int auxclip3max; | ||
320 | unsigned int drawop; | ||
321 | unsigned int lpat; | ||
322 | unsigned int fontxy; | ||
323 | unsigned int fontw; | ||
324 | unsigned int fontinc; | ||
325 | unsigned int area_pattern[32]; | ||
326 | unsigned int ucsr; | ||
327 | unsigned int stencil; | ||
328 | unsigned int stencilctl; | ||
329 | unsigned int dcss1; | ||
330 | unsigned int dcss2; | ||
331 | unsigned int dcss3; | ||
332 | unsigned int dcs2; | ||
333 | unsigned int dcs3; | ||
334 | unsigned int dcs4; | ||
335 | unsigned int dcd2; | ||
336 | unsigned int dcd3; | ||
337 | unsigned int dcd4; | ||
338 | unsigned int mer; | ||
339 | }; | ||
340 | |||
341 | #define FFB_MAX_CTXS 32 | ||
342 | |||
343 | enum ffb_chip_type { | ||
344 | ffb1_prototype = 0, /* Early pre-FCS FFB */ | ||
345 | ffb1_standard, /* First FCS FFB, 100Mhz UPA, 66MHz gclk */ | ||
346 | ffb1_speedsort, /* Second FCS FFB, 100Mhz UPA, 75MHz gclk */ | ||
347 | ffb2_prototype, /* Early pre-FCS vertical FFB2 */ | ||
348 | ffb2_vertical, /* First FCS FFB2/vertical, 100Mhz UPA, 100MHZ gclk, | ||
349 | 75(SingleBuffer)/83(DoubleBuffer) MHz fclk */ | ||
350 | ffb2_vertical_plus, /* Second FCS FFB2/vertical, same timings */ | ||
351 | ffb2_horizontal, /* First FCS FFB2/horizontal, same timings as FFB2/vert */ | ||
352 | ffb2_horizontal_plus, /* Second FCS FFB2/horizontal, same timings */ | ||
353 | afb_m3, /* FCS Elite3D, 3 float chips */ | ||
354 | afb_m6 /* FCS Elite3D, 6 float chips */ | ||
355 | }; | ||
356 | |||
357 | typedef struct ffb_dev_priv { | ||
358 | /* Misc software state. */ | ||
359 | int prom_node; | ||
360 | enum ffb_chip_type ffb_type; | ||
361 | u64 card_phys_base; | ||
362 | struct miscdevice miscdev; | ||
363 | |||
364 | /* Controller registers. */ | ||
365 | ffb_fbcPtr regs; | ||
366 | |||
367 | /* Context table. */ | ||
368 | struct ffb_hw_context *hw_state[FFB_MAX_CTXS]; | ||
369 | } ffb_dev_priv_t; | ||
370 | |||
371 | extern unsigned long ffb_get_unmapped_area(struct file *filp, | ||
372 | unsigned long hint, | ||
373 | unsigned long len, | ||
374 | unsigned long pgoff, | ||
375 | unsigned long flags); | ||
376 | extern void ffb_set_context_ioctls(void); | ||
377 | extern drm_ioctl_desc_t DRM(ioctls)[]; | ||
378 | |||
379 | extern int ffb_driver_context_switch(drm_device_t * dev, int old, int new); | ||
diff --git a/drivers/char/generic_serial.c b/drivers/char/generic_serial.c index 337bbcdcf13d..8ea02755b1c9 100644 --- a/drivers/char/generic_serial.c +++ b/drivers/char/generic_serial.c | |||
@@ -710,12 +710,6 @@ void gs_close(struct tty_struct * tty, struct file * filp) | |||
710 | } | 710 | } |
711 | 711 | ||
712 | 712 | ||
713 | static unsigned int gs_baudrates[] = { | ||
714 | 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2400, 4800, | ||
715 | 9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600 | ||
716 | }; | ||
717 | |||
718 | |||
719 | void gs_set_termios (struct tty_struct * tty, | 713 | void gs_set_termios (struct tty_struct * tty, |
720 | struct ktermios * old_termios) | 714 | struct ktermios * old_termios) |
721 | { | 715 | { |
@@ -771,7 +765,6 @@ void gs_set_termios (struct tty_struct * tty, | |||
771 | 765 | ||
772 | baudrate = tty_get_baud_rate(tty); | 766 | baudrate = tty_get_baud_rate(tty); |
773 | 767 | ||
774 | baudrate = gs_baudrates[baudrate]; | ||
775 | if ((tiosp->c_cflag & CBAUD) == B38400) { | 768 | if ((tiosp->c_cflag & CBAUD) == B38400) { |
776 | if ( (port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) | 769 | if ( (port->flags & ASYNC_SPD_MASK) == ASYNC_SPD_HI) |
777 | baudrate = 57600; | 770 | baudrate = 57600; |
diff --git a/drivers/char/vt_ioctl.c b/drivers/char/vt_ioctl.c index 1fa2da8f4fbe..c9f2dd620e87 100644 --- a/drivers/char/vt_ioctl.c +++ b/drivers/char/vt_ioctl.c | |||
@@ -1039,10 +1039,22 @@ int vt_waitactive(int vt) | |||
1039 | 1039 | ||
1040 | add_wait_queue(&vt_activate_queue, &wait); | 1040 | add_wait_queue(&vt_activate_queue, &wait); |
1041 | for (;;) { | 1041 | for (;;) { |
1042 | set_current_state(TASK_INTERRUPTIBLE); | ||
1043 | retval = 0; | 1042 | retval = 0; |
1044 | if (vt == fg_console) | 1043 | |
1044 | /* | ||
1045 | * Synchronize with redraw_screen(). By acquiring the console | ||
1046 | * semaphore we make sure that the console switch is completed | ||
1047 | * before we return. If we didn't wait for the semaphore, we | ||
1048 | * could return at a point where fg_console has already been | ||
1049 | * updated, but the console switch hasn't been completed. | ||
1050 | */ | ||
1051 | acquire_console_sem(); | ||
1052 | set_current_state(TASK_INTERRUPTIBLE); | ||
1053 | if (vt == fg_console) { | ||
1054 | release_console_sem(); | ||
1045 | break; | 1055 | break; |
1056 | } | ||
1057 | release_console_sem(); | ||
1046 | retval = -EINTR; | 1058 | retval = -EINTR; |
1047 | if (signal_pending(current)) | 1059 | if (signal_pending(current)) |
1048 | break; | 1060 | break; |
diff --git a/drivers/clocksource/acpi_pm.c b/drivers/clocksource/acpi_pm.c index d42060ede930..5ac309ee7f05 100644 --- a/drivers/clocksource/acpi_pm.c +++ b/drivers/clocksource/acpi_pm.c | |||
@@ -90,7 +90,7 @@ __setup("acpi_pm_good", acpi_pm_good_setup); | |||
90 | static inline void acpi_pm_need_workaround(void) | 90 | static inline void acpi_pm_need_workaround(void) |
91 | { | 91 | { |
92 | clocksource_acpi_pm.read = acpi_pm_read_slow; | 92 | clocksource_acpi_pm.read = acpi_pm_read_slow; |
93 | clocksource_acpi_pm.rating = 110; | 93 | clocksource_acpi_pm.rating = 120; |
94 | } | 94 | } |
95 | 95 | ||
96 | /* | 96 | /* |
diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index f52facc570f5..3162010900c9 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c | |||
@@ -1015,6 +1015,10 @@ static int cpufreq_remove_dev (struct sys_device * sys_dev) | |||
1015 | { | 1015 | { |
1016 | unsigned int cpu = sys_dev->id; | 1016 | unsigned int cpu = sys_dev->id; |
1017 | int retval; | 1017 | int retval; |
1018 | |||
1019 | if (cpu_is_offline(cpu)) | ||
1020 | return 0; | ||
1021 | |||
1018 | if (unlikely(lock_policy_rwsem_write(cpu))) | 1022 | if (unlikely(lock_policy_rwsem_write(cpu))) |
1019 | BUG(); | 1023 | BUG(); |
1020 | 1024 | ||
diff --git a/drivers/eisa/pci_eisa.c b/drivers/eisa/pci_eisa.c index 9e913629ef39..74edb1d0110f 100644 --- a/drivers/eisa/pci_eisa.c +++ b/drivers/eisa/pci_eisa.c | |||
@@ -19,8 +19,8 @@ | |||
19 | /* There is only *one* pci_eisa device per machine, right ? */ | 19 | /* There is only *one* pci_eisa device per machine, right ? */ |
20 | static struct eisa_root_device pci_eisa_root; | 20 | static struct eisa_root_device pci_eisa_root; |
21 | 21 | ||
22 | static int __devinit pci_eisa_init (struct pci_dev *pdev, | 22 | static int __init pci_eisa_init(struct pci_dev *pdev, |
23 | const struct pci_device_id *ent) | 23 | const struct pci_device_id *ent) |
24 | { | 24 | { |
25 | int rc; | 25 | int rc; |
26 | 26 | ||
diff --git a/drivers/ide/Kconfig b/drivers/ide/Kconfig index 8f1fd017679b..ca2e4f830c39 100644 --- a/drivers/ide/Kconfig +++ b/drivers/ide/Kconfig | |||
@@ -103,8 +103,10 @@ config BLK_DEV_IDE_SATA | |||
103 | ---help--- | 103 | ---help--- |
104 | There are two drivers for Serial ATA controllers. | 104 | There are two drivers for Serial ATA controllers. |
105 | 105 | ||
106 | The main driver, "libata", exists inside the SCSI subsystem | 106 | The main driver, "libata", uses the SCSI subsystem |
107 | and supports most modern SATA controllers. | 107 | and supports most modern SATA controllers. In order to use it |
108 | you may take a look at "Serial ATA (prod) and Parallel ATA | ||
109 | (experimental) drivers". | ||
108 | 110 | ||
109 | The IDE driver (which you are currently configuring) supports | 111 | The IDE driver (which you are currently configuring) supports |
110 | a few first-generation SATA controllers. | 112 | a few first-generation SATA controllers. |
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index 45a928c058cf..638becda81c6 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -735,6 +735,15 @@ static int cdrom_decode_status(ide_drive_t *drive, int good_stat, int *stat_ret) | |||
735 | cdrom_saw_media_change (drive); | 735 | cdrom_saw_media_change (drive); |
736 | /*printk("%s: media changed\n",drive->name);*/ | 736 | /*printk("%s: media changed\n",drive->name);*/ |
737 | return 0; | 737 | return 0; |
738 | } else if ((sense_key == ILLEGAL_REQUEST) && | ||
739 | (rq->cmd[0] == GPCMD_START_STOP_UNIT)) { | ||
740 | /* | ||
741 | * Don't print error message for this condition-- | ||
742 | * SFF8090i indicates that 5/24/00 is the correct | ||
743 | * response to a request to close the tray if the | ||
744 | * drive doesn't have that capability. | ||
745 | * cdrom_log_sense() knows this! | ||
746 | */ | ||
738 | } else if (!(rq->cmd_flags & REQ_QUIET)) { | 747 | } else if (!(rq->cmd_flags & REQ_QUIET)) { |
739 | /* Otherwise, print an error. */ | 748 | /* Otherwise, print an error. */ |
740 | ide_dump_status(drive, "packet command error", stat); | 749 | ide_dump_status(drive, "packet command error", stat); |
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index c193553f6fe7..8670112f1d39 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c | |||
@@ -519,21 +519,24 @@ static ide_startstop_t ide_ata_error(ide_drive_t *drive, struct request *rq, u8 | |||
519 | if ((stat & DRQ_STAT) && rq_data_dir(rq) == READ && hwif->err_stops_fifo == 0) | 519 | if ((stat & DRQ_STAT) && rq_data_dir(rq) == READ && hwif->err_stops_fifo == 0) |
520 | try_to_flush_leftover_data(drive); | 520 | try_to_flush_leftover_data(drive); |
521 | 521 | ||
522 | if (rq->errors >= ERROR_MAX || blk_noretry_request(rq)) { | ||
523 | ide_kill_rq(drive, rq); | ||
524 | return ide_stopped; | ||
525 | } | ||
526 | |||
522 | if (hwif->INB(IDE_STATUS_REG) & (BUSY_STAT|DRQ_STAT)) | 527 | if (hwif->INB(IDE_STATUS_REG) & (BUSY_STAT|DRQ_STAT)) |
523 | /* force an abort */ | 528 | rq->errors |= ERROR_RESET; |
524 | hwif->OUTB(WIN_IDLEIMMEDIATE, IDE_COMMAND_REG); | ||
525 | 529 | ||
526 | if (rq->errors >= ERROR_MAX || blk_noretry_request(rq)) | 530 | if ((rq->errors & ERROR_RESET) == ERROR_RESET) { |
527 | ide_kill_rq(drive, rq); | ||
528 | else { | ||
529 | if ((rq->errors & ERROR_RESET) == ERROR_RESET) { | ||
530 | ++rq->errors; | ||
531 | return ide_do_reset(drive); | ||
532 | } | ||
533 | if ((rq->errors & ERROR_RECAL) == ERROR_RECAL) | ||
534 | drive->special.b.recalibrate = 1; | ||
535 | ++rq->errors; | 531 | ++rq->errors; |
532 | return ide_do_reset(drive); | ||
536 | } | 533 | } |
534 | |||
535 | if ((rq->errors & ERROR_RECAL) == ERROR_RECAL) | ||
536 | drive->special.b.recalibrate = 1; | ||
537 | |||
538 | ++rq->errors; | ||
539 | |||
537 | return ide_stopped; | 540 | return ide_stopped; |
538 | } | 541 | } |
539 | 542 | ||
@@ -1025,6 +1028,13 @@ static ide_startstop_t start_request (ide_drive_t *drive, struct request *rq) | |||
1025 | if (!drive->special.all) { | 1028 | if (!drive->special.all) { |
1026 | ide_driver_t *drv; | 1029 | ide_driver_t *drv; |
1027 | 1030 | ||
1031 | /* | ||
1032 | * We reset the drive so we need to issue a SETFEATURES. | ||
1033 | * Do it _after_ do_special() restored device parameters. | ||
1034 | */ | ||
1035 | if (drive->current_speed == 0xff) | ||
1036 | ide_config_drive_speed(drive, drive->desired_speed); | ||
1037 | |||
1028 | if (rq->cmd_type == REQ_TYPE_ATA_CMD || | 1038 | if (rq->cmd_type == REQ_TYPE_ATA_CMD || |
1029 | rq->cmd_type == REQ_TYPE_ATA_TASK || | 1039 | rq->cmd_type == REQ_TYPE_ATA_TASK || |
1030 | rq->cmd_type == REQ_TYPE_ATA_TASKFILE) | 1040 | rq->cmd_type == REQ_TYPE_ATA_TASKFILE) |
@@ -1216,6 +1226,7 @@ static void ide_do_request (ide_hwgroup_t *hwgroup, int masked_irq) | |||
1216 | #endif | 1226 | #endif |
1217 | /* so that ide_timer_expiry knows what to do */ | 1227 | /* so that ide_timer_expiry knows what to do */ |
1218 | hwgroup->sleeping = 1; | 1228 | hwgroup->sleeping = 1; |
1229 | hwgroup->req_gen_timer = hwgroup->req_gen; | ||
1219 | mod_timer(&hwgroup->timer, sleep); | 1230 | mod_timer(&hwgroup->timer, sleep); |
1220 | /* we purposely leave hwgroup->busy==1 | 1231 | /* we purposely leave hwgroup->busy==1 |
1221 | * while sleeping */ | 1232 | * while sleeping */ |
@@ -1401,7 +1412,8 @@ void ide_timer_expiry (unsigned long data) | |||
1401 | 1412 | ||
1402 | spin_lock_irqsave(&ide_lock, flags); | 1413 | spin_lock_irqsave(&ide_lock, flags); |
1403 | 1414 | ||
1404 | if ((handler = hwgroup->handler) == NULL) { | 1415 | if (((handler = hwgroup->handler) == NULL) || |
1416 | (hwgroup->req_gen != hwgroup->req_gen_timer)) { | ||
1405 | /* | 1417 | /* |
1406 | * Either a marginal timeout occurred | 1418 | * Either a marginal timeout occurred |
1407 | * (got the interrupt just as timer expired), | 1419 | * (got the interrupt just as timer expired), |
@@ -1429,6 +1441,7 @@ void ide_timer_expiry (unsigned long data) | |||
1429 | if ((wait = expiry(drive)) > 0) { | 1441 | if ((wait = expiry(drive)) > 0) { |
1430 | /* reset timer */ | 1442 | /* reset timer */ |
1431 | hwgroup->timer.expires = jiffies + wait; | 1443 | hwgroup->timer.expires = jiffies + wait; |
1444 | hwgroup->req_gen_timer = hwgroup->req_gen; | ||
1432 | add_timer(&hwgroup->timer); | 1445 | add_timer(&hwgroup->timer); |
1433 | spin_unlock_irqrestore(&ide_lock, flags); | 1446 | spin_unlock_irqrestore(&ide_lock, flags); |
1434 | return; | 1447 | return; |
@@ -1643,6 +1656,7 @@ irqreturn_t ide_intr (int irq, void *dev_id) | |||
1643 | printk(KERN_ERR "%s: ide_intr: hwgroup->busy was 0 ??\n", drive->name); | 1656 | printk(KERN_ERR "%s: ide_intr: hwgroup->busy was 0 ??\n", drive->name); |
1644 | } | 1657 | } |
1645 | hwgroup->handler = NULL; | 1658 | hwgroup->handler = NULL; |
1659 | hwgroup->req_gen++; | ||
1646 | del_timer(&hwgroup->timer); | 1660 | del_timer(&hwgroup->timer); |
1647 | spin_unlock(&ide_lock); | 1661 | spin_unlock(&ide_lock); |
1648 | 1662 | ||
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index bd513f5a2323..3caa176b3155 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c | |||
@@ -583,8 +583,12 @@ u8 eighty_ninty_three (ide_drive_t *drive) | |||
583 | if(!(drive->id->hw_config & 0x4000)) | 583 | if(!(drive->id->hw_config & 0x4000)) |
584 | return 0; | 584 | return 0; |
585 | #endif /* CONFIG_IDEDMA_IVB */ | 585 | #endif /* CONFIG_IDEDMA_IVB */ |
586 | if (!(drive->id->hw_config & 0x2000)) | 586 | /* |
587 | return 0; | 587 | * FIXME: |
588 | * - change master/slave IDENTIFY order | ||
589 | * - force bit13 (80c cable present) check | ||
590 | * (unless the slave device is pre-ATA3) | ||
591 | */ | ||
588 | return 1; | 592 | return 1; |
589 | } | 593 | } |
590 | 594 | ||
@@ -885,6 +889,7 @@ static void __ide_set_handler (ide_drive_t *drive, ide_handler_t *handler, | |||
885 | hwgroup->handler = handler; | 889 | hwgroup->handler = handler; |
886 | hwgroup->expiry = expiry; | 890 | hwgroup->expiry = expiry; |
887 | hwgroup->timer.expires = jiffies + timeout; | 891 | hwgroup->timer.expires = jiffies + timeout; |
892 | hwgroup->req_gen_timer = hwgroup->req_gen; | ||
888 | add_timer(&hwgroup->timer); | 893 | add_timer(&hwgroup->timer); |
889 | } | 894 | } |
890 | 895 | ||
@@ -925,6 +930,7 @@ void ide_execute_command(ide_drive_t *drive, task_ioreg_t cmd, ide_handler_t *ha | |||
925 | hwgroup->handler = handler; | 930 | hwgroup->handler = handler; |
926 | hwgroup->expiry = expiry; | 931 | hwgroup->expiry = expiry; |
927 | hwgroup->timer.expires = jiffies + timeout; | 932 | hwgroup->timer.expires = jiffies + timeout; |
933 | hwgroup->req_gen_timer = hwgroup->req_gen; | ||
928 | add_timer(&hwgroup->timer); | 934 | add_timer(&hwgroup->timer); |
929 | hwif->OUTBSYNC(drive, cmd, IDE_COMMAND_REG); | 935 | hwif->OUTBSYNC(drive, cmd, IDE_COMMAND_REG); |
930 | /* Drive takes 400nS to respond, we must avoid the IRQ being | 936 | /* Drive takes 400nS to respond, we must avoid the IRQ being |
@@ -1090,6 +1096,9 @@ static void pre_reset(ide_drive_t *drive) | |||
1090 | if (HWIF(drive)->pre_reset != NULL) | 1096 | if (HWIF(drive)->pre_reset != NULL) |
1091 | HWIF(drive)->pre_reset(drive); | 1097 | HWIF(drive)->pre_reset(drive); |
1092 | 1098 | ||
1099 | if (drive->current_speed != 0xff) | ||
1100 | drive->desired_speed = drive->current_speed; | ||
1101 | drive->current_speed = 0xff; | ||
1093 | } | 1102 | } |
1094 | 1103 | ||
1095 | /* | 1104 | /* |
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 695610f0e3e4..ae5bf2be6f52 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
@@ -1124,17 +1124,40 @@ static int set_io_32bit(ide_drive_t *drive, int arg) | |||
1124 | static int set_using_dma (ide_drive_t *drive, int arg) | 1124 | static int set_using_dma (ide_drive_t *drive, int arg) |
1125 | { | 1125 | { |
1126 | #ifdef CONFIG_BLK_DEV_IDEDMA | 1126 | #ifdef CONFIG_BLK_DEV_IDEDMA |
1127 | ide_hwif_t *hwif = drive->hwif; | ||
1128 | int err = -EPERM; | ||
1129 | |||
1127 | if (!drive->id || !(drive->id->capability & 1)) | 1130 | if (!drive->id || !(drive->id->capability & 1)) |
1128 | return -EPERM; | 1131 | goto out; |
1129 | if (HWIF(drive)->ide_dma_check == NULL) | 1132 | |
1130 | return -EPERM; | 1133 | if (hwif->ide_dma_check == NULL) |
1134 | goto out; | ||
1135 | |||
1136 | err = -EBUSY; | ||
1137 | if (ide_spin_wait_hwgroup(drive)) | ||
1138 | goto out; | ||
1139 | /* | ||
1140 | * set ->busy flag, unlock and let it ride | ||
1141 | */ | ||
1142 | hwif->hwgroup->busy = 1; | ||
1143 | spin_unlock_irq(&ide_lock); | ||
1144 | |||
1145 | err = 0; | ||
1146 | |||
1131 | if (arg) { | 1147 | if (arg) { |
1132 | if (ide_set_dma(drive)) | 1148 | if (ide_set_dma(drive) || hwif->ide_dma_on(drive)) |
1133 | return -EIO; | 1149 | err = -EIO; |
1134 | if (HWIF(drive)->ide_dma_on(drive)) return -EIO; | ||
1135 | } else | 1150 | } else |
1136 | ide_dma_off(drive); | 1151 | ide_dma_off(drive); |
1137 | return 0; | 1152 | |
1153 | /* | ||
1154 | * lock, clear ->busy flag and unlock before leaving | ||
1155 | */ | ||
1156 | spin_lock_irq(&ide_lock); | ||
1157 | hwif->hwgroup->busy = 0; | ||
1158 | spin_unlock_irq(&ide_lock); | ||
1159 | out: | ||
1160 | return err; | ||
1138 | #else | 1161 | #else |
1139 | return -EPERM; | 1162 | return -EPERM; |
1140 | #endif | 1163 | #endif |
@@ -1939,6 +1962,8 @@ static char *media_string(ide_drive_t *drive) | |||
1939 | return "tape"; | 1962 | return "tape"; |
1940 | case ide_floppy: | 1963 | case ide_floppy: |
1941 | return "floppy"; | 1964 | return "floppy"; |
1965 | case ide_optical: | ||
1966 | return "optical"; | ||
1942 | default: | 1967 | default: |
1943 | return "UNKNOWN"; | 1968 | return "UNKNOWN"; |
1944 | } | 1969 | } |
diff --git a/drivers/ide/pci/pdc202xx_new.c b/drivers/ide/pci/pdc202xx_new.c index 6ceb25bc5a7b..ace98929cc3d 100644 --- a/drivers/ide/pci/pdc202xx_new.c +++ b/drivers/ide/pci/pdc202xx_new.c | |||
@@ -255,7 +255,7 @@ static int config_chipset_for_dma(ide_drive_t *drive) | |||
255 | printk(KERN_WARNING "%s reduced to Ultra33 mode.\n", drive->name); | 255 | printk(KERN_WARNING "%s reduced to Ultra33 mode.\n", drive->name); |
256 | } | 256 | } |
257 | 257 | ||
258 | if (drive->media != ide_disk) | 258 | if (drive->media != ide_disk && drive->media != ide_cdrom) |
259 | return 0; | 259 | return 0; |
260 | 260 | ||
261 | if (id->capability & 4) { | 261 | if (id->capability & 4) { |
@@ -545,6 +545,7 @@ static void __devinit init_hwif_pdc202new(ide_hwif_t *hwif) | |||
545 | 545 | ||
546 | hwif->drives[0].autotune = hwif->drives[1].autotune = 1; | 546 | hwif->drives[0].autotune = hwif->drives[1].autotune = 1; |
547 | 547 | ||
548 | hwif->atapi_dma = 1; | ||
548 | hwif->ultra_mask = 0x7f; | 549 | hwif->ultra_mask = 0x7f; |
549 | hwif->mwdma_mask = 0x07; | 550 | hwif->mwdma_mask = 0x07; |
550 | 551 | ||
diff --git a/drivers/infiniband/hw/cxgb3/cxio_hal.c b/drivers/infiniband/hw/cxgb3/cxio_hal.c index 818cf1aee8c7..f5e9aeec6f6e 100644 --- a/drivers/infiniband/hw/cxgb3/cxio_hal.c +++ b/drivers/infiniband/hw/cxgb3/cxio_hal.c | |||
@@ -498,9 +498,9 @@ static int cxio_hal_init_ctrl_qp(struct cxio_rdev *rdev_p) | |||
498 | u64 sge_cmd, ctx0, ctx1; | 498 | u64 sge_cmd, ctx0, ctx1; |
499 | u64 base_addr; | 499 | u64 base_addr; |
500 | struct t3_modify_qp_wr *wqe; | 500 | struct t3_modify_qp_wr *wqe; |
501 | struct sk_buff *skb = alloc_skb(sizeof(*wqe), GFP_KERNEL); | 501 | struct sk_buff *skb; |
502 | |||
503 | 502 | ||
503 | skb = alloc_skb(sizeof(*wqe), GFP_KERNEL); | ||
504 | if (!skb) { | 504 | if (!skb) { |
505 | PDBG("%s alloc_skb failed\n", __FUNCTION__); | 505 | PDBG("%s alloc_skb failed\n", __FUNCTION__); |
506 | return -ENOMEM; | 506 | return -ENOMEM; |
@@ -508,7 +508,7 @@ static int cxio_hal_init_ctrl_qp(struct cxio_rdev *rdev_p) | |||
508 | err = cxio_hal_init_ctrl_cq(rdev_p); | 508 | err = cxio_hal_init_ctrl_cq(rdev_p); |
509 | if (err) { | 509 | if (err) { |
510 | PDBG("%s err %d initializing ctrl_cq\n", __FUNCTION__, err); | 510 | PDBG("%s err %d initializing ctrl_cq\n", __FUNCTION__, err); |
511 | return err; | 511 | goto err; |
512 | } | 512 | } |
513 | rdev_p->ctrl_qp.workq = dma_alloc_coherent( | 513 | rdev_p->ctrl_qp.workq = dma_alloc_coherent( |
514 | &(rdev_p->rnic_info.pdev->dev), | 514 | &(rdev_p->rnic_info.pdev->dev), |
@@ -518,7 +518,8 @@ static int cxio_hal_init_ctrl_qp(struct cxio_rdev *rdev_p) | |||
518 | GFP_KERNEL); | 518 | GFP_KERNEL); |
519 | if (!rdev_p->ctrl_qp.workq) { | 519 | if (!rdev_p->ctrl_qp.workq) { |
520 | PDBG("%s dma_alloc_coherent failed\n", __FUNCTION__); | 520 | PDBG("%s dma_alloc_coherent failed\n", __FUNCTION__); |
521 | return -ENOMEM; | 521 | err = -ENOMEM; |
522 | goto err; | ||
522 | } | 523 | } |
523 | pci_unmap_addr_set(&rdev_p->ctrl_qp, mapping, | 524 | pci_unmap_addr_set(&rdev_p->ctrl_qp, mapping, |
524 | rdev_p->ctrl_qp.dma_addr); | 525 | rdev_p->ctrl_qp.dma_addr); |
@@ -556,6 +557,9 @@ static int cxio_hal_init_ctrl_qp(struct cxio_rdev *rdev_p) | |||
556 | rdev_p->ctrl_qp.workq, 1 << T3_CTRL_QP_SIZE_LOG2); | 557 | rdev_p->ctrl_qp.workq, 1 << T3_CTRL_QP_SIZE_LOG2); |
557 | skb->priority = CPL_PRIORITY_CONTROL; | 558 | skb->priority = CPL_PRIORITY_CONTROL; |
558 | return (cxgb3_ofld_send(rdev_p->t3cdev_p, skb)); | 559 | return (cxgb3_ofld_send(rdev_p->t3cdev_p, skb)); |
560 | err: | ||
561 | kfree_skb(skb); | ||
562 | return err; | ||
559 | } | 563 | } |
560 | 564 | ||
561 | static int cxio_hal_destroy_ctrl_qp(struct cxio_rdev *rdev_p) | 565 | static int cxio_hal_destroy_ctrl_qp(struct cxio_rdev *rdev_p) |
diff --git a/drivers/infiniband/hw/mthca/mthca_mr.c b/drivers/infiniband/hw/mthca/mthca_mr.c index 8e4846b5c641..fdb576dcfaa8 100644 --- a/drivers/infiniband/hw/mthca/mthca_mr.c +++ b/drivers/infiniband/hw/mthca/mthca_mr.c | |||
@@ -881,8 +881,8 @@ int mthca_init_mr_table(struct mthca_dev *dev) | |||
881 | } | 881 | } |
882 | mpts = mtts = 1 << i; | 882 | mpts = mtts = 1 << i; |
883 | } else { | 883 | } else { |
884 | mpts = dev->limits.num_mtt_segs; | 884 | mtts = dev->limits.num_mtt_segs; |
885 | mtts = dev->limits.num_mpts; | 885 | mpts = dev->limits.num_mpts; |
886 | } | 886 | } |
887 | 887 | ||
888 | if (!mthca_is_memfree(dev) && | 888 | if (!mthca_is_memfree(dev) && |
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c index 0741c6d1337c..f2a40ae8e7d0 100644 --- a/drivers/infiniband/ulp/ipoib/ipoib_main.c +++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c | |||
@@ -814,7 +814,7 @@ static void ipoib_set_mcast_list(struct net_device *dev) | |||
814 | queue_work(ipoib_workqueue, &priv->restart_task); | 814 | queue_work(ipoib_workqueue, &priv->restart_task); |
815 | } | 815 | } |
816 | 816 | ||
817 | static void ipoib_neigh_destructor(struct neighbour *n) | 817 | static void ipoib_neigh_cleanup(struct neighbour *n) |
818 | { | 818 | { |
819 | struct ipoib_neigh *neigh; | 819 | struct ipoib_neigh *neigh; |
820 | struct ipoib_dev_priv *priv = netdev_priv(n->dev); | 820 | struct ipoib_dev_priv *priv = netdev_priv(n->dev); |
@@ -822,7 +822,7 @@ static void ipoib_neigh_destructor(struct neighbour *n) | |||
822 | struct ipoib_ah *ah = NULL; | 822 | struct ipoib_ah *ah = NULL; |
823 | 823 | ||
824 | ipoib_dbg(priv, | 824 | ipoib_dbg(priv, |
825 | "neigh_destructor for %06x " IPOIB_GID_FMT "\n", | 825 | "neigh_cleanup for %06x " IPOIB_GID_FMT "\n", |
826 | IPOIB_QPN(n->ha), | 826 | IPOIB_QPN(n->ha), |
827 | IPOIB_GID_RAW_ARG(n->ha + 4)); | 827 | IPOIB_GID_RAW_ARG(n->ha + 4)); |
828 | 828 | ||
@@ -874,7 +874,7 @@ void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh) | |||
874 | 874 | ||
875 | static int ipoib_neigh_setup_dev(struct net_device *dev, struct neigh_parms *parms) | 875 | static int ipoib_neigh_setup_dev(struct net_device *dev, struct neigh_parms *parms) |
876 | { | 876 | { |
877 | parms->neigh_destructor = ipoib_neigh_destructor; | 877 | parms->neigh_cleanup = ipoib_neigh_cleanup; |
878 | 878 | ||
879 | return 0; | 879 | return 0; |
880 | } | 880 | } |
diff --git a/drivers/infiniband/ulp/iser/iser_initiator.c b/drivers/infiniband/ulp/iser/iser_initiator.c index 89e37283c836..278fcbccc2d9 100644 --- a/drivers/infiniband/ulp/iser/iser_initiator.c +++ b/drivers/infiniband/ulp/iser/iser_initiator.c | |||
@@ -658,6 +658,7 @@ void iser_ctask_rdma_finalize(struct iscsi_iser_cmd_task *iser_ctask) | |||
658 | { | 658 | { |
659 | int deferred; | 659 | int deferred; |
660 | int is_rdma_aligned = 1; | 660 | int is_rdma_aligned = 1; |
661 | struct iser_regd_buf *regd; | ||
661 | 662 | ||
662 | /* if we were reading, copy back to unaligned sglist, | 663 | /* if we were reading, copy back to unaligned sglist, |
663 | * anyway dma_unmap and free the copy | 664 | * anyway dma_unmap and free the copy |
@@ -672,20 +673,20 @@ void iser_ctask_rdma_finalize(struct iscsi_iser_cmd_task *iser_ctask) | |||
672 | } | 673 | } |
673 | 674 | ||
674 | if (iser_ctask->dir[ISER_DIR_IN]) { | 675 | if (iser_ctask->dir[ISER_DIR_IN]) { |
675 | deferred = iser_regd_buff_release | 676 | regd = &iser_ctask->rdma_regd[ISER_DIR_IN]; |
676 | (&iser_ctask->rdma_regd[ISER_DIR_IN]); | 677 | deferred = iser_regd_buff_release(regd); |
677 | if (deferred) { | 678 | if (deferred) { |
678 | iser_err("References remain for BUF-IN rdma reg\n"); | 679 | iser_err("%d references remain for BUF-IN rdma reg\n", |
679 | BUG(); | 680 | atomic_read(®d->ref_count)); |
680 | } | 681 | } |
681 | } | 682 | } |
682 | 683 | ||
683 | if (iser_ctask->dir[ISER_DIR_OUT]) { | 684 | if (iser_ctask->dir[ISER_DIR_OUT]) { |
684 | deferred = iser_regd_buff_release | 685 | regd = &iser_ctask->rdma_regd[ISER_DIR_OUT]; |
685 | (&iser_ctask->rdma_regd[ISER_DIR_OUT]); | 686 | deferred = iser_regd_buff_release(regd); |
686 | if (deferred) { | 687 | if (deferred) { |
687 | iser_err("References remain for BUF-OUT rdma reg\n"); | 688 | iser_err("%d references remain for BUF-OUT rdma reg\n", |
688 | BUG(); | 689 | atomic_read(®d->ref_count)); |
689 | } | 690 | } |
690 | } | 691 | } |
691 | 692 | ||
diff --git a/drivers/isdn/gigaset/bas-gigaset.c b/drivers/isdn/gigaset/bas-gigaset.c index 63e51dd6debe..00e31609a238 100644 --- a/drivers/isdn/gigaset/bas-gigaset.c +++ b/drivers/isdn/gigaset/bas-gigaset.c | |||
@@ -54,7 +54,7 @@ MODULE_PARM_DESC(cidmode, "Call-ID mode"); | |||
54 | #define USB_SX353_PRODUCT_ID 0x0022 | 54 | #define USB_SX353_PRODUCT_ID 0x0022 |
55 | 55 | ||
56 | /* table of devices that work with this driver */ | 56 | /* table of devices that work with this driver */ |
57 | static struct usb_device_id gigaset_table [] = { | 57 | static const struct usb_device_id gigaset_table [] = { |
58 | { USB_DEVICE(USB_GIGA_VENDOR_ID, USB_3070_PRODUCT_ID) }, | 58 | { USB_DEVICE(USB_GIGA_VENDOR_ID, USB_3070_PRODUCT_ID) }, |
59 | { USB_DEVICE(USB_GIGA_VENDOR_ID, USB_3075_PRODUCT_ID) }, | 59 | { USB_DEVICE(USB_GIGA_VENDOR_ID, USB_3075_PRODUCT_ID) }, |
60 | { USB_DEVICE(USB_GIGA_VENDOR_ID, USB_SX303_PRODUCT_ID) }, | 60 | { USB_DEVICE(USB_GIGA_VENDOR_ID, USB_SX303_PRODUCT_ID) }, |
@@ -2305,7 +2305,7 @@ static void gigaset_disconnect(struct usb_interface *interface) | |||
2305 | gigaset_unassign(cs); | 2305 | gigaset_unassign(cs); |
2306 | } | 2306 | } |
2307 | 2307 | ||
2308 | static struct gigaset_ops gigops = { | 2308 | static const struct gigaset_ops gigops = { |
2309 | gigaset_write_cmd, | 2309 | gigaset_write_cmd, |
2310 | gigaset_write_room, | 2310 | gigaset_write_room, |
2311 | gigaset_chars_in_buffer, | 2311 | gigaset_chars_in_buffer, |
diff --git a/drivers/isdn/gigaset/common.c b/drivers/isdn/gigaset/common.c index b460a73a7c85..6df336bdd571 100644 --- a/drivers/isdn/gigaset/common.c +++ b/drivers/isdn/gigaset/common.c | |||
@@ -944,8 +944,8 @@ static DEFINE_SPINLOCK(driver_lock); | |||
944 | struct cardstate *gigaset_get_cs_by_id(int id) | 944 | struct cardstate *gigaset_get_cs_by_id(int id) |
945 | { | 945 | { |
946 | unsigned long flags; | 946 | unsigned long flags; |
947 | static struct cardstate *ret = NULL; | 947 | struct cardstate *ret = NULL; |
948 | static struct cardstate *cs; | 948 | struct cardstate *cs; |
949 | struct gigaset_driver *drv; | 949 | struct gigaset_driver *drv; |
950 | unsigned i; | 950 | unsigned i; |
951 | 951 | ||
@@ -999,7 +999,7 @@ void gigaset_debugdrivers(void) | |||
999 | static struct cardstate *gigaset_get_cs_by_minor(unsigned minor) | 999 | static struct cardstate *gigaset_get_cs_by_minor(unsigned minor) |
1000 | { | 1000 | { |
1001 | unsigned long flags; | 1001 | unsigned long flags; |
1002 | static struct cardstate *ret = NULL; | 1002 | struct cardstate *ret = NULL; |
1003 | struct gigaset_driver *drv; | 1003 | struct gigaset_driver *drv; |
1004 | unsigned index; | 1004 | unsigned index; |
1005 | 1005 | ||
diff --git a/drivers/isdn/gigaset/ev-layer.c b/drivers/isdn/gigaset/ev-layer.c index 4661e2c722bc..cec1ef342fcc 100644 --- a/drivers/isdn/gigaset/ev-layer.c +++ b/drivers/isdn/gigaset/ev-layer.c | |||
@@ -409,7 +409,7 @@ static struct reply_t tab_cid[] = /* no dle mode */ //FIXME | |||
409 | }; | 409 | }; |
410 | #endif | 410 | #endif |
411 | 411 | ||
412 | static struct resp_type_t resp_type[]= | 412 | static const struct resp_type_t resp_type[] = |
413 | { | 413 | { |
414 | /*{"", RSP_EMPTY, RT_NOTHING},*/ | 414 | /*{"", RSP_EMPTY, RT_NOTHING},*/ |
415 | {"OK", RSP_OK, RT_NOTHING}, | 415 | {"OK", RSP_OK, RT_NOTHING}, |
@@ -511,7 +511,7 @@ void gigaset_handle_modem_response(struct cardstate *cs) | |||
511 | unsigned char *argv[MAX_REC_PARAMS + 1]; | 511 | unsigned char *argv[MAX_REC_PARAMS + 1]; |
512 | int params; | 512 | int params; |
513 | int i, j; | 513 | int i, j; |
514 | struct resp_type_t *rt; | 514 | const struct resp_type_t *rt; |
515 | int curarg; | 515 | int curarg; |
516 | unsigned long flags; | 516 | unsigned long flags; |
517 | unsigned next, tail, head; | 517 | unsigned next, tail, head; |
diff --git a/drivers/isdn/gigaset/isocdata.c b/drivers/isdn/gigaset/isocdata.c index 8c0eb522dab1..e0505f238807 100644 --- a/drivers/isdn/gigaset/isocdata.c +++ b/drivers/isdn/gigaset/isocdata.c | |||
@@ -274,7 +274,7 @@ static inline void dump_bytes(enum debuglevel level, const char *tag, | |||
274 | * bit 12..10 = number of trailing '1' bits in result | 274 | * bit 12..10 = number of trailing '1' bits in result |
275 | * bit 14..13 = number of bits added by stuffing | 275 | * bit 14..13 = number of bits added by stuffing |
276 | */ | 276 | */ |
277 | static u16 stufftab[5 * 256] = { | 277 | static const u16 stufftab[5 * 256] = { |
278 | // previous 1s = 0: | 278 | // previous 1s = 0: |
279 | 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, | 279 | 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, |
280 | 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x201f, | 280 | 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001a, 0x001b, 0x001c, 0x001d, 0x001e, 0x201f, |
@@ -629,7 +629,7 @@ static inline void hdlc_frag(struct bc_state *bcs, unsigned inbits) | |||
629 | * (replacing 8 by 7 to make it fit; the algorithm won't care) | 629 | * (replacing 8 by 7 to make it fit; the algorithm won't care) |
630 | * bit 7 set if there are 5 or more "interior" consecutive '1' bits | 630 | * bit 7 set if there are 5 or more "interior" consecutive '1' bits |
631 | */ | 631 | */ |
632 | static unsigned char bitcounts[256] = { | 632 | static const unsigned char bitcounts[256] = { |
633 | 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04, | 633 | 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04, |
634 | 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x05, | 634 | 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x05, |
635 | 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04, | 635 | 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x04, |
diff --git a/drivers/isdn/gigaset/ser-gigaset.c b/drivers/isdn/gigaset/ser-gigaset.c index c8b7db65e48f..ea44302e6e7e 100644 --- a/drivers/isdn/gigaset/ser-gigaset.c +++ b/drivers/isdn/gigaset/ser-gigaset.c | |||
@@ -459,7 +459,7 @@ static int gigaset_set_line_ctrl(struct cardstate *cs, unsigned cflag) | |||
459 | return -EINVAL; | 459 | return -EINVAL; |
460 | } | 460 | } |
461 | 461 | ||
462 | static struct gigaset_ops ops = { | 462 | static const struct gigaset_ops ops = { |
463 | gigaset_write_cmd, | 463 | gigaset_write_cmd, |
464 | gigaset_write_room, | 464 | gigaset_write_room, |
465 | gigaset_chars_in_buffer, | 465 | gigaset_chars_in_buffer, |
diff --git a/drivers/isdn/gigaset/usb-gigaset.c b/drivers/isdn/gigaset/usb-gigaset.c index 04f2ad7ba8b0..2baef349c12d 100644 --- a/drivers/isdn/gigaset/usb-gigaset.c +++ b/drivers/isdn/gigaset/usb-gigaset.c | |||
@@ -50,7 +50,7 @@ MODULE_PARM_DESC(cidmode, "Call-ID mode"); | |||
50 | #define USB_M105_PRODUCT_ID 0x0009 | 50 | #define USB_M105_PRODUCT_ID 0x0009 |
51 | 51 | ||
52 | /* table of devices that work with this driver */ | 52 | /* table of devices that work with this driver */ |
53 | static struct usb_device_id gigaset_table [] = { | 53 | static const struct usb_device_id gigaset_table [] = { |
54 | { USB_DEVICE(USB_M105_VENDOR_ID, USB_M105_PRODUCT_ID) }, | 54 | { USB_DEVICE(USB_M105_VENDOR_ID, USB_M105_PRODUCT_ID) }, |
55 | { } /* Terminating entry */ | 55 | { } /* Terminating entry */ |
56 | }; | 56 | }; |
@@ -860,7 +860,7 @@ static void gigaset_disconnect(struct usb_interface *interface) | |||
860 | gigaset_unassign(cs); | 860 | gigaset_unassign(cs); |
861 | } | 861 | } |
862 | 862 | ||
863 | static struct gigaset_ops ops = { | 863 | static const struct gigaset_ops ops = { |
864 | gigaset_write_cmd, | 864 | gigaset_write_cmd, |
865 | gigaset_write_room, | 865 | gigaset_write_room, |
866 | gigaset_chars_in_buffer, | 866 | gigaset_chars_in_buffer, |
diff --git a/drivers/isdn/hisax/isar.c b/drivers/isdn/hisax/isar.c index 9df9e3548cf1..c547a6665052 100644 --- a/drivers/isdn/hisax/isar.c +++ b/drivers/isdn/hisax/isar.c | |||
@@ -440,7 +440,7 @@ isar_bh(struct work_struct *work) | |||
440 | { | 440 | { |
441 | struct BCState *bcs = container_of(work, struct BCState, tqueue); | 441 | struct BCState *bcs = container_of(work, struct BCState, tqueue); |
442 | 442 | ||
443 | BChannel_bh(bcs); | 443 | BChannel_bh(work); |
444 | if (test_and_clear_bit(B_LL_NOCARRIER, &bcs->event)) | 444 | if (test_and_clear_bit(B_LL_NOCARRIER, &bcs->event)) |
445 | ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_NOCARR); | 445 | ll_deliver_faxstat(bcs, ISDN_FAX_CLASS1_NOCARR); |
446 | if (test_and_clear_bit(B_LL_CONNECT, &bcs->event)) | 446 | if (test_and_clear_bit(B_LL_CONNECT, &bcs->event)) |
diff --git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c index bfa0ce42ea92..fbbf9d6b299f 100644 --- a/drivers/kvm/vmx.c +++ b/drivers/kvm/vmx.c | |||
@@ -618,7 +618,7 @@ static void fix_pmode_dataseg(int seg, struct kvm_save_segment *save) | |||
618 | { | 618 | { |
619 | struct kvm_vmx_segment_field *sf = &kvm_vmx_segment_fields[seg]; | 619 | struct kvm_vmx_segment_field *sf = &kvm_vmx_segment_fields[seg]; |
620 | 620 | ||
621 | if (vmcs_readl(sf->base) == save->base) { | 621 | if (vmcs_readl(sf->base) == save->base && (save->base & AR_S_MASK)) { |
622 | vmcs_write16(sf->selector, save->selector); | 622 | vmcs_write16(sf->selector, save->selector); |
623 | vmcs_writel(sf->base, save->base); | 623 | vmcs_writel(sf->base, save->base); |
624 | vmcs_write32(sf->limit, save->limit); | 624 | vmcs_write32(sf->limit, save->limit); |
@@ -1888,6 +1888,27 @@ again: | |||
1888 | [cr2]"i"(offsetof(struct kvm_vcpu, cr2)) | 1888 | [cr2]"i"(offsetof(struct kvm_vcpu, cr2)) |
1889 | : "cc", "memory" ); | 1889 | : "cc", "memory" ); |
1890 | 1890 | ||
1891 | /* | ||
1892 | * Reload segment selectors ASAP. (it's needed for a functional | ||
1893 | * kernel: x86 relies on having __KERNEL_PDA in %fs and x86_64 | ||
1894 | * relies on having 0 in %gs for the CPU PDA to work.) | ||
1895 | */ | ||
1896 | if (fs_gs_ldt_reload_needed) { | ||
1897 | load_ldt(ldt_sel); | ||
1898 | load_fs(fs_sel); | ||
1899 | /* | ||
1900 | * If we have to reload gs, we must take care to | ||
1901 | * preserve our gs base. | ||
1902 | */ | ||
1903 | local_irq_disable(); | ||
1904 | load_gs(gs_sel); | ||
1905 | #ifdef CONFIG_X86_64 | ||
1906 | wrmsrl(MSR_GS_BASE, vmcs_readl(HOST_GS_BASE)); | ||
1907 | #endif | ||
1908 | local_irq_enable(); | ||
1909 | |||
1910 | reload_tss(); | ||
1911 | } | ||
1891 | ++kvm_stat.exits; | 1912 | ++kvm_stat.exits; |
1892 | 1913 | ||
1893 | save_msrs(vcpu->guest_msrs, NR_BAD_MSRS); | 1914 | save_msrs(vcpu->guest_msrs, NR_BAD_MSRS); |
@@ -1905,22 +1926,6 @@ again: | |||
1905 | kvm_run->exit_reason = vmcs_read32(VM_INSTRUCTION_ERROR); | 1926 | kvm_run->exit_reason = vmcs_read32(VM_INSTRUCTION_ERROR); |
1906 | r = 0; | 1927 | r = 0; |
1907 | } else { | 1928 | } else { |
1908 | if (fs_gs_ldt_reload_needed) { | ||
1909 | load_ldt(ldt_sel); | ||
1910 | load_fs(fs_sel); | ||
1911 | /* | ||
1912 | * If we have to reload gs, we must take care to | ||
1913 | * preserve our gs base. | ||
1914 | */ | ||
1915 | local_irq_disable(); | ||
1916 | load_gs(gs_sel); | ||
1917 | #ifdef CONFIG_X86_64 | ||
1918 | wrmsrl(MSR_GS_BASE, vmcs_readl(HOST_GS_BASE)); | ||
1919 | #endif | ||
1920 | local_irq_enable(); | ||
1921 | |||
1922 | reload_tss(); | ||
1923 | } | ||
1924 | /* | 1929 | /* |
1925 | * Profile KVM exit RIPs: | 1930 | * Profile KVM exit RIPs: |
1926 | */ | 1931 | */ |
diff --git a/drivers/md/md.c b/drivers/md/md.c index 6c06e825cff5..509171ca7fa8 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
@@ -1318,6 +1318,7 @@ static int bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev) | |||
1318 | char b[BDEVNAME_SIZE]; | 1318 | char b[BDEVNAME_SIZE]; |
1319 | struct kobject *ko; | 1319 | struct kobject *ko; |
1320 | char *s; | 1320 | char *s; |
1321 | int err; | ||
1321 | 1322 | ||
1322 | if (rdev->mddev) { | 1323 | if (rdev->mddev) { |
1323 | MD_BUG(); | 1324 | MD_BUG(); |
@@ -1352,20 +1353,35 @@ static int bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev) | |||
1352 | while ( (s=strchr(rdev->kobj.k_name, '/')) != NULL) | 1353 | while ( (s=strchr(rdev->kobj.k_name, '/')) != NULL) |
1353 | *s = '!'; | 1354 | *s = '!'; |
1354 | 1355 | ||
1355 | list_add(&rdev->same_set, &mddev->disks); | ||
1356 | rdev->mddev = mddev; | 1356 | rdev->mddev = mddev; |
1357 | printk(KERN_INFO "md: bind<%s>\n", b); | 1357 | printk(KERN_INFO "md: bind<%s>\n", b); |
1358 | 1358 | ||
1359 | rdev->kobj.parent = &mddev->kobj; | 1359 | rdev->kobj.parent = &mddev->kobj; |
1360 | kobject_add(&rdev->kobj); | 1360 | if ((err = kobject_add(&rdev->kobj))) |
1361 | goto fail; | ||
1361 | 1362 | ||
1362 | if (rdev->bdev->bd_part) | 1363 | if (rdev->bdev->bd_part) |
1363 | ko = &rdev->bdev->bd_part->kobj; | 1364 | ko = &rdev->bdev->bd_part->kobj; |
1364 | else | 1365 | else |
1365 | ko = &rdev->bdev->bd_disk->kobj; | 1366 | ko = &rdev->bdev->bd_disk->kobj; |
1366 | sysfs_create_link(&rdev->kobj, ko, "block"); | 1367 | if ((err = sysfs_create_link(&rdev->kobj, ko, "block"))) { |
1368 | kobject_del(&rdev->kobj); | ||
1369 | goto fail; | ||
1370 | } | ||
1371 | list_add(&rdev->same_set, &mddev->disks); | ||
1367 | bd_claim_by_disk(rdev->bdev, rdev, mddev->gendisk); | 1372 | bd_claim_by_disk(rdev->bdev, rdev, mddev->gendisk); |
1368 | return 0; | 1373 | return 0; |
1374 | |||
1375 | fail: | ||
1376 | printk(KERN_WARNING "md: failed to register dev-%s for %s\n", | ||
1377 | b, mdname(mddev)); | ||
1378 | return err; | ||
1379 | } | ||
1380 | |||
1381 | static void delayed_delete(struct work_struct *ws) | ||
1382 | { | ||
1383 | mdk_rdev_t *rdev = container_of(ws, mdk_rdev_t, del_work); | ||
1384 | kobject_del(&rdev->kobj); | ||
1369 | } | 1385 | } |
1370 | 1386 | ||
1371 | static void unbind_rdev_from_array(mdk_rdev_t * rdev) | 1387 | static void unbind_rdev_from_array(mdk_rdev_t * rdev) |
@@ -1380,7 +1396,12 @@ static void unbind_rdev_from_array(mdk_rdev_t * rdev) | |||
1380 | printk(KERN_INFO "md: unbind<%s>\n", bdevname(rdev->bdev,b)); | 1396 | printk(KERN_INFO "md: unbind<%s>\n", bdevname(rdev->bdev,b)); |
1381 | rdev->mddev = NULL; | 1397 | rdev->mddev = NULL; |
1382 | sysfs_remove_link(&rdev->kobj, "block"); | 1398 | sysfs_remove_link(&rdev->kobj, "block"); |
1383 | kobject_del(&rdev->kobj); | 1399 | |
1400 | /* We need to delay this, otherwise we can deadlock when | ||
1401 | * writing to 'remove' to "dev/state" | ||
1402 | */ | ||
1403 | INIT_WORK(&rdev->del_work, delayed_delete); | ||
1404 | schedule_work(&rdev->del_work); | ||
1384 | } | 1405 | } |
1385 | 1406 | ||
1386 | /* | 1407 | /* |
@@ -2966,7 +2987,9 @@ static struct kobject *md_probe(dev_t dev, int *part, void *data) | |||
2966 | mddev->kobj.k_name = NULL; | 2987 | mddev->kobj.k_name = NULL; |
2967 | snprintf(mddev->kobj.name, KOBJ_NAME_LEN, "%s", "md"); | 2988 | snprintf(mddev->kobj.name, KOBJ_NAME_LEN, "%s", "md"); |
2968 | mddev->kobj.ktype = &md_ktype; | 2989 | mddev->kobj.ktype = &md_ktype; |
2969 | kobject_register(&mddev->kobj); | 2990 | if (kobject_register(&mddev->kobj)) |
2991 | printk(KERN_WARNING "md: cannot register %s/md - name in use\n", | ||
2992 | disk->disk_name); | ||
2970 | return NULL; | 2993 | return NULL; |
2971 | } | 2994 | } |
2972 | 2995 | ||
@@ -3144,9 +3167,12 @@ static int do_md_run(mddev_t * mddev) | |||
3144 | bitmap_destroy(mddev); | 3167 | bitmap_destroy(mddev); |
3145 | return err; | 3168 | return err; |
3146 | } | 3169 | } |
3147 | if (mddev->pers->sync_request) | 3170 | if (mddev->pers->sync_request) { |
3148 | sysfs_create_group(&mddev->kobj, &md_redundancy_group); | 3171 | if (sysfs_create_group(&mddev->kobj, &md_redundancy_group)) |
3149 | else if (mddev->ro == 2) /* auto-readonly not meaningful */ | 3172 | printk(KERN_WARNING |
3173 | "md: cannot register extra attributes for %s\n", | ||
3174 | mdname(mddev)); | ||
3175 | } else if (mddev->ro == 2) /* auto-readonly not meaningful */ | ||
3150 | mddev->ro = 0; | 3176 | mddev->ro = 0; |
3151 | 3177 | ||
3152 | atomic_set(&mddev->writes_pending,0); | 3178 | atomic_set(&mddev->writes_pending,0); |
@@ -3160,7 +3186,9 @@ static int do_md_run(mddev_t * mddev) | |||
3160 | if (rdev->raid_disk >= 0) { | 3186 | if (rdev->raid_disk >= 0) { |
3161 | char nm[20]; | 3187 | char nm[20]; |
3162 | sprintf(nm, "rd%d", rdev->raid_disk); | 3188 | sprintf(nm, "rd%d", rdev->raid_disk); |
3163 | sysfs_create_link(&mddev->kobj, &rdev->kobj, nm); | 3189 | if (sysfs_create_link(&mddev->kobj, &rdev->kobj, nm)) |
3190 | printk("md: cannot register %s for %s\n", | ||
3191 | nm, mdname(mddev)); | ||
3164 | } | 3192 | } |
3165 | 3193 | ||
3166 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); | 3194 | set_bit(MD_RECOVERY_NEEDED, &mddev->recovery); |
@@ -3325,6 +3353,7 @@ static int do_md_stop(mddev_t * mddev, int mode) | |||
3325 | mddev->queue->merge_bvec_fn = NULL; | 3353 | mddev->queue->merge_bvec_fn = NULL; |
3326 | mddev->queue->unplug_fn = NULL; | 3354 | mddev->queue->unplug_fn = NULL; |
3327 | mddev->queue->issue_flush_fn = NULL; | 3355 | mddev->queue->issue_flush_fn = NULL; |
3356 | mddev->queue->backing_dev_info.congested_fn = NULL; | ||
3328 | if (mddev->pers->sync_request) | 3357 | if (mddev->pers->sync_request) |
3329 | sysfs_remove_group(&mddev->kobj, &md_redundancy_group); | 3358 | sysfs_remove_group(&mddev->kobj, &md_redundancy_group); |
3330 | 3359 | ||
@@ -3371,6 +3400,9 @@ static int do_md_stop(mddev_t * mddev, int mode) | |||
3371 | sysfs_remove_link(&mddev->kobj, nm); | 3400 | sysfs_remove_link(&mddev->kobj, nm); |
3372 | } | 3401 | } |
3373 | 3402 | ||
3403 | /* make sure all delayed_delete calls have finished */ | ||
3404 | flush_scheduled_work(); | ||
3405 | |||
3374 | export_array(mddev); | 3406 | export_array(mddev); |
3375 | 3407 | ||
3376 | mddev->array_size = 0; | 3408 | mddev->array_size = 0; |
@@ -5385,8 +5417,12 @@ static int remove_and_add_spares(mddev_t *mddev) | |||
5385 | if (mddev->pers->hot_add_disk(mddev,rdev)) { | 5417 | if (mddev->pers->hot_add_disk(mddev,rdev)) { |
5386 | char nm[20]; | 5418 | char nm[20]; |
5387 | sprintf(nm, "rd%d", rdev->raid_disk); | 5419 | sprintf(nm, "rd%d", rdev->raid_disk); |
5388 | sysfs_create_link(&mddev->kobj, | 5420 | if (sysfs_create_link(&mddev->kobj, |
5389 | &rdev->kobj, nm); | 5421 | &rdev->kobj, nm)) |
5422 | printk(KERN_WARNING | ||
5423 | "md: cannot register " | ||
5424 | "%s for %s\n", | ||
5425 | nm, mdname(mddev)); | ||
5390 | spares++; | 5426 | spares++; |
5391 | md_new_event(mddev); | 5427 | md_new_event(mddev); |
5392 | } else | 5428 | } else |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 54a1ad5eef42..8d59914f2057 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
@@ -3642,12 +3642,15 @@ static int run(mddev_t *mddev) | |||
3642 | } | 3642 | } |
3643 | 3643 | ||
3644 | /* Ok, everything is just fine now */ | 3644 | /* Ok, everything is just fine now */ |
3645 | sysfs_create_group(&mddev->kobj, &raid5_attrs_group); | 3645 | if (sysfs_create_group(&mddev->kobj, &raid5_attrs_group)) |
3646 | printk(KERN_WARNING | ||
3647 | "raid5: failed to create sysfs attributes for %s\n", | ||
3648 | mdname(mddev)); | ||
3646 | 3649 | ||
3647 | mddev->queue->unplug_fn = raid5_unplug_device; | 3650 | mddev->queue->unplug_fn = raid5_unplug_device; |
3648 | mddev->queue->issue_flush_fn = raid5_issue_flush; | 3651 | mddev->queue->issue_flush_fn = raid5_issue_flush; |
3649 | mddev->queue->backing_dev_info.congested_fn = raid5_congested; | ||
3650 | mddev->queue->backing_dev_info.congested_data = mddev; | 3652 | mddev->queue->backing_dev_info.congested_data = mddev; |
3653 | mddev->queue->backing_dev_info.congested_fn = raid5_congested; | ||
3651 | 3654 | ||
3652 | mddev->array_size = mddev->size * (conf->previous_raid_disks - | 3655 | mddev->array_size = mddev->size * (conf->previous_raid_disks - |
3653 | conf->max_degraded); | 3656 | conf->max_degraded); |
@@ -3678,6 +3681,7 @@ static int stop(mddev_t *mddev) | |||
3678 | mddev->thread = NULL; | 3681 | mddev->thread = NULL; |
3679 | shrink_stripes(conf); | 3682 | shrink_stripes(conf); |
3680 | kfree(conf->stripe_hashtbl); | 3683 | kfree(conf->stripe_hashtbl); |
3684 | mddev->queue->backing_dev_info.congested_fn = NULL; | ||
3681 | blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/ | 3685 | blk_sync_queue(mddev->queue); /* the unplug fn references 'conf'*/ |
3682 | sysfs_remove_group(&mddev->kobj, &raid5_attrs_group); | 3686 | sysfs_remove_group(&mddev->kobj, &raid5_attrs_group); |
3683 | kfree(conf->disks); | 3687 | kfree(conf->disks); |
@@ -3950,7 +3954,12 @@ static int raid5_start_reshape(mddev_t *mddev) | |||
3950 | added_devices++; | 3954 | added_devices++; |
3951 | rdev->recovery_offset = 0; | 3955 | rdev->recovery_offset = 0; |
3952 | sprintf(nm, "rd%d", rdev->raid_disk); | 3956 | sprintf(nm, "rd%d", rdev->raid_disk); |
3953 | sysfs_create_link(&mddev->kobj, &rdev->kobj, nm); | 3957 | if (sysfs_create_link(&mddev->kobj, |
3958 | &rdev->kobj, nm)) | ||
3959 | printk(KERN_WARNING | ||
3960 | "raid5: failed to create " | ||
3961 | " link %s for %s\n", | ||
3962 | nm, mdname(mddev)); | ||
3954 | } else | 3963 | } else |
3955 | break; | 3964 | break; |
3956 | } | 3965 | } |
@@ -4104,6 +4113,10 @@ static struct mdk_personality raid4_personality = | |||
4104 | .spare_active = raid5_spare_active, | 4113 | .spare_active = raid5_spare_active, |
4105 | .sync_request = sync_request, | 4114 | .sync_request = sync_request, |
4106 | .resize = raid5_resize, | 4115 | .resize = raid5_resize, |
4116 | #ifdef CONFIG_MD_RAID5_RESHAPE | ||
4117 | .check_reshape = raid5_check_reshape, | ||
4118 | .start_reshape = raid5_start_reshape, | ||
4119 | #endif | ||
4107 | .quiesce = raid5_quiesce, | 4120 | .quiesce = raid5_quiesce, |
4108 | }; | 4121 | }; |
4109 | 4122 | ||
diff --git a/drivers/media/common/ir-functions.c b/drivers/media/common/ir-functions.c index cbf7c0564889..fcb194135627 100644 --- a/drivers/media/common/ir-functions.c +++ b/drivers/media/common/ir-functions.c | |||
@@ -310,13 +310,15 @@ void ir_rc5_timer_end(unsigned long data) | |||
310 | tv.tv_usec - ir->base_time.tv_usec; | 310 | tv.tv_usec - ir->base_time.tv_usec; |
311 | } | 311 | } |
312 | 312 | ||
313 | /* Allow some timmer jitter (RC5 is ~24ms anyway so this is ok) */ | 313 | /* signal we're ready to start a new code */ |
314 | ir->active = 0; | ||
315 | |||
316 | /* Allow some timer jitter (RC5 is ~24ms anyway so this is ok) */ | ||
314 | if (gap < 28000) { | 317 | if (gap < 28000) { |
315 | dprintk(1, "ir-common: spurious timer_end\n"); | 318 | dprintk(1, "ir-common: spurious timer_end\n"); |
316 | return; | 319 | return; |
317 | } | 320 | } |
318 | 321 | ||
319 | ir->active = 0; | ||
320 | if (ir->last_bit < 20) { | 322 | if (ir->last_bit < 20) { |
321 | /* ignore spurious codes (caused by light/other remotes) */ | 323 | /* ignore spurious codes (caused by light/other remotes) */ |
322 | dprintk(1, "ir-common: short code: %x\n", ir->code); | 324 | dprintk(1, "ir-common: short code: %x\n", ir->code); |
diff --git a/drivers/media/dvb/dvb-core/dmxdev.c b/drivers/media/dvb/dvb-core/dmxdev.c index fc77de45ca4d..a5c0e1a3e6d1 100644 --- a/drivers/media/dvb/dvb-core/dmxdev.c +++ b/drivers/media/dvb/dvb-core/dmxdev.c | |||
@@ -180,8 +180,7 @@ static int dvb_dvr_release(struct inode *inode, struct file *file) | |||
180 | struct dvb_device *dvbdev = file->private_data; | 180 | struct dvb_device *dvbdev = file->private_data; |
181 | struct dmxdev *dmxdev = dvbdev->priv; | 181 | struct dmxdev *dmxdev = dvbdev->priv; |
182 | 182 | ||
183 | if (mutex_lock_interruptible(&dmxdev->mutex)) | 183 | mutex_lock(&dmxdev->mutex); |
184 | return -ERESTARTSYS; | ||
185 | 184 | ||
186 | if ((file->f_flags & O_ACCMODE) == O_WRONLY) { | 185 | if ((file->f_flags & O_ACCMODE) == O_WRONLY) { |
187 | dmxdev->demux->disconnect_frontend(dmxdev->demux); | 186 | dmxdev->demux->disconnect_frontend(dmxdev->demux); |
@@ -673,13 +672,8 @@ static int dvb_demux_open(struct inode *inode, struct file *file) | |||
673 | static int dvb_dmxdev_filter_free(struct dmxdev *dmxdev, | 672 | static int dvb_dmxdev_filter_free(struct dmxdev *dmxdev, |
674 | struct dmxdev_filter *dmxdevfilter) | 673 | struct dmxdev_filter *dmxdevfilter) |
675 | { | 674 | { |
676 | if (mutex_lock_interruptible(&dmxdev->mutex)) | 675 | mutex_lock(&dmxdev->mutex); |
677 | return -ERESTARTSYS; | 676 | mutex_lock(&dmxdevfilter->mutex); |
678 | |||
679 | if (mutex_lock_interruptible(&dmxdevfilter->mutex)) { | ||
680 | mutex_unlock(&dmxdev->mutex); | ||
681 | return -ERESTARTSYS; | ||
682 | } | ||
683 | 677 | ||
684 | dvb_dmxdev_filter_stop(dmxdevfilter); | 678 | dvb_dmxdev_filter_stop(dmxdevfilter); |
685 | dvb_dmxdev_filter_reset(dmxdevfilter); | 679 | dvb_dmxdev_filter_reset(dmxdevfilter); |
diff --git a/drivers/media/dvb/dvb-core/dvb_demux.c b/drivers/media/dvb/dvb-core/dvb_demux.c index fcff5eab21a3..6d8d1c3df863 100644 --- a/drivers/media/dvb/dvb-core/dvb_demux.c +++ b/drivers/media/dvb/dvb-core/dvb_demux.c | |||
@@ -673,8 +673,7 @@ static int dmx_ts_feed_stop_filtering(struct dmx_ts_feed *ts_feed) | |||
673 | struct dvb_demux *demux = feed->demux; | 673 | struct dvb_demux *demux = feed->demux; |
674 | int ret; | 674 | int ret; |
675 | 675 | ||
676 | if (mutex_lock_interruptible(&demux->mutex)) | 676 | mutex_lock(&demux->mutex); |
677 | return -ERESTARTSYS; | ||
678 | 677 | ||
679 | if (feed->state < DMX_STATE_GO) { | 678 | if (feed->state < DMX_STATE_GO) { |
680 | mutex_unlock(&demux->mutex); | 679 | mutex_unlock(&demux->mutex); |
@@ -748,8 +747,7 @@ static int dvbdmx_release_ts_feed(struct dmx_demux *dmx, | |||
748 | struct dvb_demux *demux = (struct dvb_demux *)dmx; | 747 | struct dvb_demux *demux = (struct dvb_demux *)dmx; |
749 | struct dvb_demux_feed *feed = (struct dvb_demux_feed *)ts_feed; | 748 | struct dvb_demux_feed *feed = (struct dvb_demux_feed *)ts_feed; |
750 | 749 | ||
751 | if (mutex_lock_interruptible(&demux->mutex)) | 750 | mutex_lock(&demux->mutex); |
752 | return -ERESTARTSYS; | ||
753 | 751 | ||
754 | if (feed->state == DMX_STATE_FREE) { | 752 | if (feed->state == DMX_STATE_FREE) { |
755 | mutex_unlock(&demux->mutex); | 753 | mutex_unlock(&demux->mutex); |
@@ -916,8 +914,7 @@ static int dmx_section_feed_stop_filtering(struct dmx_section_feed *feed) | |||
916 | struct dvb_demux *dvbdmx = dvbdmxfeed->demux; | 914 | struct dvb_demux *dvbdmx = dvbdmxfeed->demux; |
917 | int ret; | 915 | int ret; |
918 | 916 | ||
919 | if (mutex_lock_interruptible(&dvbdmx->mutex)) | 917 | mutex_lock(&dvbdmx->mutex); |
920 | return -ERESTARTSYS; | ||
921 | 918 | ||
922 | if (!dvbdmx->stop_feed) { | 919 | if (!dvbdmx->stop_feed) { |
923 | mutex_unlock(&dvbdmx->mutex); | 920 | mutex_unlock(&dvbdmx->mutex); |
@@ -942,8 +939,7 @@ static int dmx_section_feed_release_filter(struct dmx_section_feed *feed, | |||
942 | struct dvb_demux_feed *dvbdmxfeed = (struct dvb_demux_feed *)feed; | 939 | struct dvb_demux_feed *dvbdmxfeed = (struct dvb_demux_feed *)feed; |
943 | struct dvb_demux *dvbdmx = dvbdmxfeed->demux; | 940 | struct dvb_demux *dvbdmx = dvbdmxfeed->demux; |
944 | 941 | ||
945 | if (mutex_lock_interruptible(&dvbdmx->mutex)) | 942 | mutex_lock(&dvbdmx->mutex); |
946 | return -ERESTARTSYS; | ||
947 | 943 | ||
948 | if (dvbdmxfilter->feed != dvbdmxfeed) { | 944 | if (dvbdmxfilter->feed != dvbdmxfeed) { |
949 | mutex_unlock(&dvbdmx->mutex); | 945 | mutex_unlock(&dvbdmx->mutex); |
@@ -1016,8 +1012,7 @@ static int dvbdmx_release_section_feed(struct dmx_demux *demux, | |||
1016 | struct dvb_demux_feed *dvbdmxfeed = (struct dvb_demux_feed *)feed; | 1012 | struct dvb_demux_feed *dvbdmxfeed = (struct dvb_demux_feed *)feed; |
1017 | struct dvb_demux *dvbdmx = (struct dvb_demux *)demux; | 1013 | struct dvb_demux *dvbdmx = (struct dvb_demux *)demux; |
1018 | 1014 | ||
1019 | if (mutex_lock_interruptible(&dvbdmx->mutex)) | 1015 | mutex_lock(&dvbdmx->mutex); |
1020 | return -ERESTARTSYS; | ||
1021 | 1016 | ||
1022 | if (dvbdmxfeed->state == DMX_STATE_FREE) { | 1017 | if (dvbdmxfeed->state == DMX_STATE_FREE) { |
1023 | mutex_unlock(&dvbdmx->mutex); | 1018 | mutex_unlock(&dvbdmx->mutex); |
@@ -1126,8 +1121,7 @@ static int dvbdmx_connect_frontend(struct dmx_demux *demux, | |||
1126 | if (demux->frontend) | 1121 | if (demux->frontend) |
1127 | return -EINVAL; | 1122 | return -EINVAL; |
1128 | 1123 | ||
1129 | if (mutex_lock_interruptible(&dvbdemux->mutex)) | 1124 | mutex_lock(&dvbdemux->mutex); |
1130 | return -ERESTARTSYS; | ||
1131 | 1125 | ||
1132 | demux->frontend = frontend; | 1126 | demux->frontend = frontend; |
1133 | mutex_unlock(&dvbdemux->mutex); | 1127 | mutex_unlock(&dvbdemux->mutex); |
@@ -1138,8 +1132,7 @@ static int dvbdmx_disconnect_frontend(struct dmx_demux *demux) | |||
1138 | { | 1132 | { |
1139 | struct dvb_demux *dvbdemux = (struct dvb_demux *)demux; | 1133 | struct dvb_demux *dvbdemux = (struct dvb_demux *)demux; |
1140 | 1134 | ||
1141 | if (mutex_lock_interruptible(&dvbdemux->mutex)) | 1135 | mutex_lock(&dvbdemux->mutex); |
1142 | return -ERESTARTSYS; | ||
1143 | 1136 | ||
1144 | demux->frontend = NULL; | 1137 | demux->frontend = NULL; |
1145 | mutex_unlock(&dvbdemux->mutex); | 1138 | mutex_unlock(&dvbdemux->mutex); |
diff --git a/drivers/media/dvb/dvb-core/dvbdev.c b/drivers/media/dvb/dvb-core/dvbdev.c index 490337b5ee3e..14a372a0fe8b 100644 --- a/drivers/media/dvb/dvb-core/dvbdev.c +++ b/drivers/media/dvb/dvb-core/dvbdev.c | |||
@@ -203,8 +203,7 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev, | |||
203 | 203 | ||
204 | int id; | 204 | int id; |
205 | 205 | ||
206 | if (mutex_lock_interruptible(&dvbdev_register_lock)) | 206 | mutex_lock(&dvbdev_register_lock); |
207 | return -ERESTARTSYS; | ||
208 | 207 | ||
209 | if ((id = dvbdev_get_free_id (adap, type)) < 0){ | 208 | if ((id = dvbdev_get_free_id (adap, type)) < 0){ |
210 | mutex_unlock(&dvbdev_register_lock); | 209 | mutex_unlock(&dvbdev_register_lock); |
@@ -294,8 +293,7 @@ int dvb_register_adapter(struct dvb_adapter *adap, const char *name, struct modu | |||
294 | { | 293 | { |
295 | int num; | 294 | int num; |
296 | 295 | ||
297 | if (mutex_lock_interruptible(&dvbdev_register_lock)) | 296 | mutex_lock(&dvbdev_register_lock); |
298 | return -ERESTARTSYS; | ||
299 | 297 | ||
300 | if ((num = dvbdev_get_free_adapter_num ()) < 0) { | 298 | if ((num = dvbdev_get_free_adapter_num ()) < 0) { |
301 | mutex_unlock(&dvbdev_register_lock); | 299 | mutex_unlock(&dvbdev_register_lock); |
@@ -323,8 +321,7 @@ EXPORT_SYMBOL(dvb_register_adapter); | |||
323 | 321 | ||
324 | int dvb_unregister_adapter(struct dvb_adapter *adap) | 322 | int dvb_unregister_adapter(struct dvb_adapter *adap) |
325 | { | 323 | { |
326 | if (mutex_lock_interruptible(&dvbdev_register_lock)) | 324 | mutex_lock(&dvbdev_register_lock); |
327 | return -ERESTARTSYS; | ||
328 | list_del (&adap->list_head); | 325 | list_del (&adap->list_head); |
329 | mutex_unlock(&dvbdev_register_lock); | 326 | mutex_unlock(&dvbdev_register_lock); |
330 | return 0; | 327 | return 0; |
diff --git a/drivers/media/dvb/frontends/isl6421.c b/drivers/media/dvb/frontends/isl6421.c index ef319369ec26..c967148a5945 100644 --- a/drivers/media/dvb/frontends/isl6421.c +++ b/drivers/media/dvb/frontends/isl6421.c | |||
@@ -122,6 +122,7 @@ struct dvb_frontend *isl6421_attach(struct dvb_frontend *fe, struct i2c_adapter | |||
122 | /* detect if it is present or not */ | 122 | /* detect if it is present or not */ |
123 | if (isl6421_set_voltage(fe, SEC_VOLTAGE_OFF)) { | 123 | if (isl6421_set_voltage(fe, SEC_VOLTAGE_OFF)) { |
124 | kfree(isl6421); | 124 | kfree(isl6421); |
125 | fe->sec_priv = NULL; | ||
125 | return NULL; | 126 | return NULL; |
126 | } | 127 | } |
127 | 128 | ||
diff --git a/drivers/media/dvb/frontends/tda10086.c b/drivers/media/dvb/frontends/tda10086.c index 4c27a2d90a38..ccc429cbbad0 100644 --- a/drivers/media/dvb/frontends/tda10086.c +++ b/drivers/media/dvb/frontends/tda10086.c | |||
@@ -212,7 +212,7 @@ static int tda10086_send_master_cmd (struct dvb_frontend* fe, | |||
212 | for(i=0; i< cmd->msg_len; i++) { | 212 | for(i=0; i< cmd->msg_len; i++) { |
213 | tda10086_write_byte(state, 0x48+i, cmd->msg[i]); | 213 | tda10086_write_byte(state, 0x48+i, cmd->msg[i]); |
214 | } | 214 | } |
215 | tda10086_write_byte(state, 0x36, 0x08 | ((cmd->msg_len + 1) << 4)); | 215 | tda10086_write_byte(state, 0x36, 0x08 | ((cmd->msg_len - 1) << 4)); |
216 | 216 | ||
217 | tda10086_diseqc_wait(state); | 217 | tda10086_diseqc_wait(state); |
218 | 218 | ||
diff --git a/drivers/media/dvb/pluto2/pluto2.c b/drivers/media/dvb/pluto2/pluto2.c index ffda71dfdd65..058df5c10034 100644 --- a/drivers/media/dvb/pluto2/pluto2.c +++ b/drivers/media/dvb/pluto2/pluto2.c | |||
@@ -149,6 +149,15 @@ static inline void pluto_rw(struct pluto *pluto, u32 reg, u32 mask, u32 bits) | |||
149 | writel(val, &pluto->io_mem[reg]); | 149 | writel(val, &pluto->io_mem[reg]); |
150 | } | 150 | } |
151 | 151 | ||
152 | static void pluto_write_tscr(struct pluto *pluto, u32 val) | ||
153 | { | ||
154 | /* set the number of packets */ | ||
155 | val &= ~TSCR_ADEF; | ||
156 | val |= TS_DMA_PACKETS / 2; | ||
157 | |||
158 | pluto_writereg(pluto, REG_TSCR, val); | ||
159 | } | ||
160 | |||
152 | static void pluto_setsda(void *data, int state) | 161 | static void pluto_setsda(void *data, int state) |
153 | { | 162 | { |
154 | struct pluto *pluto = data; | 163 | struct pluto *pluto = data; |
@@ -213,11 +222,11 @@ static void pluto_reset_ts(struct pluto *pluto, int reenable) | |||
213 | 222 | ||
214 | if (val & TSCR_RSTN) { | 223 | if (val & TSCR_RSTN) { |
215 | val &= ~TSCR_RSTN; | 224 | val &= ~TSCR_RSTN; |
216 | pluto_writereg(pluto, REG_TSCR, val); | 225 | pluto_write_tscr(pluto, val); |
217 | } | 226 | } |
218 | if (reenable) { | 227 | if (reenable) { |
219 | val |= TSCR_RSTN; | 228 | val |= TSCR_RSTN; |
220 | pluto_writereg(pluto, REG_TSCR, val); | 229 | pluto_write_tscr(pluto, val); |
221 | } | 230 | } |
222 | } | 231 | } |
223 | 232 | ||
@@ -339,7 +348,7 @@ static irqreturn_t pluto_irq(int irq, void *dev_id) | |||
339 | } | 348 | } |
340 | 349 | ||
341 | /* ACK the interrupt */ | 350 | /* ACK the interrupt */ |
342 | pluto_writereg(pluto, REG_TSCR, tscr | TSCR_IACK); | 351 | pluto_write_tscr(pluto, tscr | TSCR_IACK); |
343 | 352 | ||
344 | return IRQ_HANDLED; | 353 | return IRQ_HANDLED; |
345 | } | 354 | } |
@@ -348,9 +357,6 @@ static void __devinit pluto_enable_irqs(struct pluto *pluto) | |||
348 | { | 357 | { |
349 | u32 val = pluto_readreg(pluto, REG_TSCR); | 358 | u32 val = pluto_readreg(pluto, REG_TSCR); |
350 | 359 | ||
351 | /* set the number of packets */ | ||
352 | val &= ~TSCR_ADEF; | ||
353 | val |= TS_DMA_PACKETS / 2; | ||
354 | /* disable AFUL and LOCK interrupts */ | 360 | /* disable AFUL and LOCK interrupts */ |
355 | val |= (TSCR_MSKA | TSCR_MSKL); | 361 | val |= (TSCR_MSKA | TSCR_MSKL); |
356 | /* enable DMA and OVERFLOW interrupts */ | 362 | /* enable DMA and OVERFLOW interrupts */ |
@@ -358,7 +364,7 @@ static void __devinit pluto_enable_irqs(struct pluto *pluto) | |||
358 | /* clear pending interrupts */ | 364 | /* clear pending interrupts */ |
359 | val |= TSCR_IACK; | 365 | val |= TSCR_IACK; |
360 | 366 | ||
361 | pluto_writereg(pluto, REG_TSCR, val); | 367 | pluto_write_tscr(pluto, val); |
362 | } | 368 | } |
363 | 369 | ||
364 | static void pluto_disable_irqs(struct pluto *pluto) | 370 | static void pluto_disable_irqs(struct pluto *pluto) |
@@ -370,7 +376,7 @@ static void pluto_disable_irqs(struct pluto *pluto) | |||
370 | /* clear pending interrupts */ | 376 | /* clear pending interrupts */ |
371 | val |= TSCR_IACK; | 377 | val |= TSCR_IACK; |
372 | 378 | ||
373 | pluto_writereg(pluto, REG_TSCR, val); | 379 | pluto_write_tscr(pluto, val); |
374 | } | 380 | } |
375 | 381 | ||
376 | static int __devinit pluto_hw_init(struct pluto *pluto) | 382 | static int __devinit pluto_hw_init(struct pluto *pluto) |
diff --git a/drivers/media/radio/Kconfig b/drivers/media/radio/Kconfig index 920b63f8cf05..af66a5d5ecd8 100644 --- a/drivers/media/radio/Kconfig +++ b/drivers/media/radio/Kconfig | |||
@@ -3,7 +3,7 @@ | |||
3 | # | 3 | # |
4 | 4 | ||
5 | menu "Radio Adapters" | 5 | menu "Radio Adapters" |
6 | depends on VIDEO_DEV!=n | 6 | depends on VIDEO_DEV |
7 | 7 | ||
8 | config RADIO_CADET | 8 | config RADIO_CADET |
9 | tristate "ADS Cadet AM/FM Tuner" | 9 | tristate "ADS Cadet AM/FM Tuner" |
diff --git a/drivers/media/video/msp3400-driver.c b/drivers/media/video/msp3400-driver.c index 2fb9fe6a1ae7..ba1af3c8525e 100644 --- a/drivers/media/video/msp3400-driver.c +++ b/drivers/media/video/msp3400-driver.c | |||
@@ -780,18 +780,16 @@ static int msp_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
780 | return 0; | 780 | return 0; |
781 | } | 781 | } |
782 | 782 | ||
783 | static int msp_suspend(struct device * dev, pm_message_t state) | 783 | static int msp_suspend(struct i2c_client *client, pm_message_t state) |
784 | { | 784 | { |
785 | struct i2c_client *client = container_of(dev, struct i2c_client, dev); | ||
786 | 785 | ||
787 | v4l_dbg(1, msp_debug, client, "suspend\n"); | 786 | v4l_dbg(1, msp_debug, client, "suspend\n"); |
788 | msp_reset(client); | 787 | msp_reset(client); |
789 | return 0; | 788 | return 0; |
790 | } | 789 | } |
791 | 790 | ||
792 | static int msp_resume(struct device * dev) | 791 | static int msp_resume(struct i2c_client *client) |
793 | { | 792 | { |
794 | struct i2c_client *client = container_of(dev, struct i2c_client, dev); | ||
795 | 793 | ||
796 | v4l_dbg(1, msp_debug, client, "resume\n"); | 794 | v4l_dbg(1, msp_debug, client, "resume\n"); |
797 | msp_wake_thread(client); | 795 | msp_wake_thread(client); |
@@ -825,7 +823,7 @@ static int msp_attach(struct i2c_adapter *adapter, int address, int kind) | |||
825 | if (msp_reset(client) == -1) { | 823 | if (msp_reset(client) == -1) { |
826 | v4l_dbg(1, msp_debug, client, "msp3400 not found\n"); | 824 | v4l_dbg(1, msp_debug, client, "msp3400 not found\n"); |
827 | kfree(client); | 825 | kfree(client); |
828 | return -1; | 826 | return 0; |
829 | } | 827 | } |
830 | 828 | ||
831 | state = kmalloc(sizeof(*state), GFP_KERNEL); | 829 | state = kmalloc(sizeof(*state), GFP_KERNEL); |
@@ -859,7 +857,7 @@ static int msp_attach(struct i2c_adapter *adapter, int address, int kind) | |||
859 | v4l_dbg(1, msp_debug, client, "not an msp3400 (cannot read chip version)\n"); | 857 | v4l_dbg(1, msp_debug, client, "not an msp3400 (cannot read chip version)\n"); |
860 | kfree(state); | 858 | kfree(state); |
861 | kfree(client); | 859 | kfree(client); |
862 | return -1; | 860 | return 0; |
863 | } | 861 | } |
864 | 862 | ||
865 | msp_set_audio(client); | 863 | msp_set_audio(client); |
@@ -996,11 +994,11 @@ static struct i2c_driver i2c_driver = { | |||
996 | .id = I2C_DRIVERID_MSP3400, | 994 | .id = I2C_DRIVERID_MSP3400, |
997 | .attach_adapter = msp_probe, | 995 | .attach_adapter = msp_probe, |
998 | .detach_client = msp_detach, | 996 | .detach_client = msp_detach, |
997 | .suspend = msp_suspend, | ||
998 | .resume = msp_resume, | ||
999 | .command = msp_command, | 999 | .command = msp_command, |
1000 | .driver = { | 1000 | .driver = { |
1001 | .name = "msp3400", | 1001 | .name = "msp3400", |
1002 | .suspend = msp_suspend, | ||
1003 | .resume = msp_resume, | ||
1004 | }, | 1002 | }, |
1005 | }; | 1003 | }; |
1006 | 1004 | ||
diff --git a/drivers/media/video/saa7115.c b/drivers/media/video/saa7115.c index 7735b6758921..4d5bbd859de1 100644 --- a/drivers/media/video/saa7115.c +++ b/drivers/media/video/saa7115.c | |||
@@ -961,7 +961,7 @@ static void saa711x_set_v4lstd(struct i2c_client *client, v4l2_std_id std) | |||
961 | reg |= 0x10; | 961 | reg |= 0x10; |
962 | } else if (std == V4L2_STD_NTSC_M_JP) { | 962 | } else if (std == V4L2_STD_NTSC_M_JP) { |
963 | reg |= 0x40; | 963 | reg |= 0x40; |
964 | } else if (std == V4L2_STD_SECAM) { | 964 | } else if (std & V4L2_STD_SECAM) { |
965 | reg |= 0x50; | 965 | reg |= 0x50; |
966 | } | 966 | } |
967 | saa711x_write(client, R_0E_CHROMA_CNTL_1, reg); | 967 | saa711x_write(client, R_0E_CHROMA_CNTL_1, reg); |
diff --git a/drivers/media/video/tuner-core.c b/drivers/media/video/tuner-core.c index 7be73e3763de..15dbc6bf42a7 100644 --- a/drivers/media/video/tuner-core.c +++ b/drivers/media/video/tuner-core.c | |||
@@ -804,9 +804,8 @@ static int tuner_command(struct i2c_client *client, unsigned int cmd, void *arg) | |||
804 | return 0; | 804 | return 0; |
805 | } | 805 | } |
806 | 806 | ||
807 | static int tuner_suspend(struct device *dev, pm_message_t state) | 807 | static int tuner_suspend(struct i2c_client *c, pm_message_t state) |
808 | { | 808 | { |
809 | struct i2c_client *c = container_of (dev, struct i2c_client, dev); | ||
810 | struct tuner *t = i2c_get_clientdata (c); | 809 | struct tuner *t = i2c_get_clientdata (c); |
811 | 810 | ||
812 | tuner_dbg ("suspend\n"); | 811 | tuner_dbg ("suspend\n"); |
@@ -814,9 +813,8 @@ static int tuner_suspend(struct device *dev, pm_message_t state) | |||
814 | return 0; | 813 | return 0; |
815 | } | 814 | } |
816 | 815 | ||
817 | static int tuner_resume(struct device *dev) | 816 | static int tuner_resume(struct i2c_client *c) |
818 | { | 817 | { |
819 | struct i2c_client *c = container_of (dev, struct i2c_client, dev); | ||
820 | struct tuner *t = i2c_get_clientdata (c); | 818 | struct tuner *t = i2c_get_clientdata (c); |
821 | 819 | ||
822 | tuner_dbg ("resume\n"); | 820 | tuner_dbg ("resume\n"); |
@@ -837,10 +835,10 @@ static struct i2c_driver driver = { | |||
837 | .attach_adapter = tuner_probe, | 835 | .attach_adapter = tuner_probe, |
838 | .detach_client = tuner_detach, | 836 | .detach_client = tuner_detach, |
839 | .command = tuner_command, | 837 | .command = tuner_command, |
838 | .suspend = tuner_suspend, | ||
839 | .resume = tuner_resume, | ||
840 | .driver = { | 840 | .driver = { |
841 | .name = "tuner", | 841 | .name = "tuner", |
842 | .suspend = tuner_suspend, | ||
843 | .resume = tuner_resume, | ||
844 | }, | 842 | }, |
845 | }; | 843 | }; |
846 | static struct i2c_client client_template = { | 844 | static struct i2c_client client_template = { |
diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c index 404c014db1bd..1d2d03f77894 100644 --- a/drivers/message/fusion/mptsas.c +++ b/drivers/message/fusion/mptsas.c | |||
@@ -815,7 +815,7 @@ mptsas_taskmgmt_complete(MPT_ADAPTER *ioc, MPT_FRAME_HDR *mf, MPT_FRAME_HDR *mr) | |||
815 | static int | 815 | static int |
816 | mptsas_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) | 816 | mptsas_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) |
817 | { | 817 | { |
818 | MPT_SCSI_HOST *hd = (MPT_SCSI_HOST *)ioc->sh->hostdata; | 818 | MPT_SCSI_HOST *hd; |
819 | struct mptsas_target_reset_event *target_reset_list, *n; | 819 | struct mptsas_target_reset_event *target_reset_list, *n; |
820 | int rc; | 820 | int rc; |
821 | 821 | ||
@@ -827,7 +827,10 @@ mptsas_ioc_reset(MPT_ADAPTER *ioc, int reset_phase) | |||
827 | if (reset_phase != MPT_IOC_POST_RESET) | 827 | if (reset_phase != MPT_IOC_POST_RESET) |
828 | goto out; | 828 | goto out; |
829 | 829 | ||
830 | if (!hd || !hd->ioc) | 830 | if (!ioc->sh || !ioc->sh->hostdata) |
831 | goto out; | ||
832 | hd = (MPT_SCSI_HOST *)ioc->sh->hostdata; | ||
833 | if (!hd->ioc) | ||
831 | goto out; | 834 | goto out; |
832 | 835 | ||
833 | if (list_empty(&hd->target_reset_list)) | 836 | if (list_empty(&hd->target_reset_list)) |
diff --git a/drivers/message/i2o/i2o_block.c b/drivers/message/i2o/i2o_block.c index da9859f2caf2..b17c4b2bc9ef 100644 --- a/drivers/message/i2o/i2o_block.c +++ b/drivers/message/i2o/i2o_block.c | |||
@@ -390,13 +390,6 @@ static int i2o_block_prep_req_fn(struct request_queue *q, struct request *req) | |||
390 | return BLKPREP_KILL; | 390 | return BLKPREP_KILL; |
391 | } | 391 | } |
392 | 392 | ||
393 | /* request is already processed by us, so return */ | ||
394 | if (blk_special_request(req)) { | ||
395 | osm_debug("REQ_SPECIAL already set!\n"); | ||
396 | req->cmd_flags |= REQ_DONTPREP; | ||
397 | return BLKPREP_OK; | ||
398 | } | ||
399 | |||
400 | /* connect the i2o_block_request to the request */ | 393 | /* connect the i2o_block_request to the request */ |
401 | if (!req->special) { | 394 | if (!req->special) { |
402 | ireq = i2o_block_request_alloc(); | 395 | ireq = i2o_block_request_alloc(); |
@@ -408,11 +401,8 @@ static int i2o_block_prep_req_fn(struct request_queue *q, struct request *req) | |||
408 | ireq->i2o_blk_dev = i2o_blk_dev; | 401 | ireq->i2o_blk_dev = i2o_blk_dev; |
409 | req->special = ireq; | 402 | req->special = ireq; |
410 | ireq->req = req; | 403 | ireq->req = req; |
411 | } else | 404 | } |
412 | ireq = req->special; | ||
413 | |||
414 | /* do not come back here */ | 405 | /* do not come back here */ |
415 | req->cmd_type = REQ_TYPE_SPECIAL; | ||
416 | req->cmd_flags |= REQ_DONTPREP; | 406 | req->cmd_flags |= REQ_DONTPREP; |
417 | 407 | ||
418 | return BLKPREP_OK; | 408 | return BLKPREP_OK; |
diff --git a/drivers/mfd/sm501.c b/drivers/mfd/sm501.c index c707c8ebc1a2..b0b4458ae90b 100644 --- a/drivers/mfd/sm501.c +++ b/drivers/mfd/sm501.c | |||
@@ -319,7 +319,7 @@ int sm501_unit_power(struct device *dev, unsigned int unit, unsigned int to) | |||
319 | 319 | ||
320 | mode &= 3; /* get current power mode */ | 320 | mode &= 3; /* get current power mode */ |
321 | 321 | ||
322 | if (unit > ARRAY_SIZE(sm->unit_power)) { | 322 | if (unit >= ARRAY_SIZE(sm->unit_power)) { |
323 | dev_err(dev, "%s: bad unit %d\n", __FUNCTION__, unit); | 323 | dev_err(dev, "%s: bad unit %d\n", __FUNCTION__, unit); |
324 | goto already; | 324 | goto already; |
325 | } | 325 | } |
diff --git a/drivers/net/atl1/atl1_hw.c b/drivers/net/atl1/atl1_hw.c index 314dbaabb642..69482e0d849b 100644 --- a/drivers/net/atl1/atl1_hw.c +++ b/drivers/net/atl1/atl1_hw.c | |||
@@ -334,7 +334,6 @@ u32 atl1_hash_mc_addr(struct atl1_hw *hw, u8 *mc_addr) | |||
334 | int i; | 334 | int i; |
335 | 335 | ||
336 | crc32 = ether_crc_le(6, mc_addr); | 336 | crc32 = ether_crc_le(6, mc_addr); |
337 | crc32 = ~crc32; | ||
338 | for (i = 0; i < 32; i++) | 337 | for (i = 0; i < 32; i++) |
339 | value |= (((crc32 >> i) & 1) << (31 - i)); | 338 | value |= (((crc32 >> i) & 1) << (31 - i)); |
340 | 339 | ||
diff --git a/drivers/net/atl1/atl1_main.c b/drivers/net/atl1/atl1_main.c index dee3638ad744..8606eac5bec8 100644 --- a/drivers/net/atl1/atl1_main.c +++ b/drivers/net/atl1/atl1_main.c | |||
@@ -2320,6 +2320,16 @@ static void __devexit atl1_remove(struct pci_dev *pdev) | |||
2320 | return; | 2320 | return; |
2321 | 2321 | ||
2322 | adapter = netdev_priv(netdev); | 2322 | adapter = netdev_priv(netdev); |
2323 | |||
2324 | /* Some atl1 boards lack persistent storage for their MAC, and get it | ||
2325 | * from the BIOS during POST. If we've been messing with the MAC | ||
2326 | * address, we need to save the permanent one. | ||
2327 | */ | ||
2328 | if (memcmp(adapter->hw.mac_addr, adapter->hw.perm_mac_addr, ETH_ALEN)) { | ||
2329 | memcpy(adapter->hw.mac_addr, adapter->hw.perm_mac_addr, ETH_ALEN); | ||
2330 | atl1_set_mac_addr(&adapter->hw); | ||
2331 | } | ||
2332 | |||
2323 | iowrite16(0, adapter->hw.hw_addr + REG_GPHY_ENABLE); | 2333 | iowrite16(0, adapter->hw.hw_addr + REG_GPHY_ENABLE); |
2324 | unregister_netdev(netdev); | 2334 | unregister_netdev(netdev); |
2325 | pci_iounmap(pdev, adapter->hw.hw_addr); | 2335 | pci_iounmap(pdev, adapter->hw.hw_addr); |
diff --git a/drivers/net/b44.c b/drivers/net/b44.c index aaada572732a..d742bfe24471 100644 --- a/drivers/net/b44.c +++ b/drivers/net/b44.c | |||
@@ -1709,7 +1709,7 @@ static void __b44_set_rx_mode(struct net_device *dev) | |||
1709 | bw32(bp, B44_RXCONFIG, val); | 1709 | bw32(bp, B44_RXCONFIG, val); |
1710 | } else { | 1710 | } else { |
1711 | unsigned char zero[6] = {0, 0, 0, 0, 0, 0}; | 1711 | unsigned char zero[6] = {0, 0, 0, 0, 0, 0}; |
1712 | int i = 0; | 1712 | int i = 1; |
1713 | 1713 | ||
1714 | __b44_set_mac_addr(bp); | 1714 | __b44_set_mac_addr(bp); |
1715 | 1715 | ||
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index c12e5ea61819..0b7aded8dcfd 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
@@ -54,8 +54,8 @@ | |||
54 | 54 | ||
55 | #define DRV_MODULE_NAME "bnx2" | 55 | #define DRV_MODULE_NAME "bnx2" |
56 | #define PFX DRV_MODULE_NAME ": " | 56 | #define PFX DRV_MODULE_NAME ": " |
57 | #define DRV_MODULE_VERSION "1.5.5" | 57 | #define DRV_MODULE_VERSION "1.5.7" |
58 | #define DRV_MODULE_RELDATE "February 1, 2007" | 58 | #define DRV_MODULE_RELDATE "March 29, 2007" |
59 | 59 | ||
60 | #define RUN_AT(x) (jiffies + (x)) | 60 | #define RUN_AT(x) (jiffies + (x)) |
61 | 61 | ||
@@ -2033,8 +2033,8 @@ bnx2_has_work(struct bnx2 *bp) | |||
2033 | (sblk->status_tx_quick_consumer_index0 != bp->hw_tx_cons)) | 2033 | (sblk->status_tx_quick_consumer_index0 != bp->hw_tx_cons)) |
2034 | return 1; | 2034 | return 1; |
2035 | 2035 | ||
2036 | if (((sblk->status_attn_bits & STATUS_ATTN_BITS_LINK_STATE) != 0) != | 2036 | if ((sblk->status_attn_bits & STATUS_ATTN_BITS_LINK_STATE) != |
2037 | bp->link_up) | 2037 | (sblk->status_attn_bits_ack & STATUS_ATTN_BITS_LINK_STATE)) |
2038 | return 1; | 2038 | return 1; |
2039 | 2039 | ||
2040 | return 0; | 2040 | return 0; |
@@ -3099,20 +3099,18 @@ bnx2_nvram_write(struct bnx2 *bp, u32 offset, u8 *data_buf, | |||
3099 | 3099 | ||
3100 | if ((align_start = (offset32 & 3))) { | 3100 | if ((align_start = (offset32 & 3))) { |
3101 | offset32 &= ~3; | 3101 | offset32 &= ~3; |
3102 | len32 += (4 - align_start); | 3102 | len32 += align_start; |
3103 | if (len32 < 4) | ||
3104 | len32 = 4; | ||
3103 | if ((rc = bnx2_nvram_read(bp, offset32, start, 4))) | 3105 | if ((rc = bnx2_nvram_read(bp, offset32, start, 4))) |
3104 | return rc; | 3106 | return rc; |
3105 | } | 3107 | } |
3106 | 3108 | ||
3107 | if (len32 & 3) { | 3109 | if (len32 & 3) { |
3108 | if ((len32 > 4) || !align_start) { | 3110 | align_end = 4 - (len32 & 3); |
3109 | align_end = 4 - (len32 & 3); | 3111 | len32 += align_end; |
3110 | len32 += align_end; | 3112 | if ((rc = bnx2_nvram_read(bp, offset32 + len32 - 4, end, 4))) |
3111 | if ((rc = bnx2_nvram_read(bp, offset32 + len32 - 4, | 3113 | return rc; |
3112 | end, 4))) { | ||
3113 | return rc; | ||
3114 | } | ||
3115 | } | ||
3116 | } | 3114 | } |
3117 | 3115 | ||
3118 | if (align_start || align_end) { | 3116 | if (align_start || align_end) { |
@@ -3187,17 +3185,17 @@ bnx2_nvram_write(struct bnx2 *bp, u32 offset, u8 *data_buf, | |||
3187 | if ((rc = bnx2_enable_nvram_write(bp)) != 0) | 3185 | if ((rc = bnx2_enable_nvram_write(bp)) != 0) |
3188 | goto nvram_write_end; | 3186 | goto nvram_write_end; |
3189 | 3187 | ||
3190 | /* Erase the page */ | ||
3191 | if ((rc = bnx2_nvram_erase_page(bp, page_start)) != 0) | ||
3192 | goto nvram_write_end; | ||
3193 | |||
3194 | /* Re-enable the write again for the actual write */ | ||
3195 | bnx2_enable_nvram_write(bp); | ||
3196 | |||
3197 | /* Loop to write back the buffer data from page_start to | 3188 | /* Loop to write back the buffer data from page_start to |
3198 | * data_start */ | 3189 | * data_start */ |
3199 | i = 0; | 3190 | i = 0; |
3200 | if (bp->flash_info->buffered == 0) { | 3191 | if (bp->flash_info->buffered == 0) { |
3192 | /* Erase the page */ | ||
3193 | if ((rc = bnx2_nvram_erase_page(bp, page_start)) != 0) | ||
3194 | goto nvram_write_end; | ||
3195 | |||
3196 | /* Re-enable the write again for the actual write */ | ||
3197 | bnx2_enable_nvram_write(bp); | ||
3198 | |||
3201 | for (addr = page_start; addr < data_start; | 3199 | for (addr = page_start; addr < data_start; |
3202 | addr += 4, i += 4) { | 3200 | addr += 4, i += 4) { |
3203 | 3201 | ||
diff --git a/drivers/net/cxgb3/common.h b/drivers/net/cxgb3/common.h index 85e5543cfb57..97128d88eaef 100644 --- a/drivers/net/cxgb3/common.h +++ b/drivers/net/cxgb3/common.h | |||
@@ -112,8 +112,7 @@ enum { | |||
112 | }; | 112 | }; |
113 | 113 | ||
114 | enum { | 114 | enum { |
115 | SUPPORTED_OFFLOAD = 1 << 24, | 115 | SUPPORTED_IRQ = 1 << 24 |
116 | SUPPORTED_IRQ = 1 << 25 | ||
117 | }; | 116 | }; |
118 | 117 | ||
119 | enum { /* adapter interrupt-maintained statistics */ | 118 | enum { /* adapter interrupt-maintained statistics */ |
@@ -358,6 +357,9 @@ enum { | |||
358 | MC5_MODE_72_BIT = 2 | 357 | MC5_MODE_72_BIT = 2 |
359 | }; | 358 | }; |
360 | 359 | ||
360 | /* MC5 min active region size */ | ||
361 | enum { MC5_MIN_TIDS = 16 }; | ||
362 | |||
361 | struct vpd_params { | 363 | struct vpd_params { |
362 | unsigned int cclk; | 364 | unsigned int cclk; |
363 | unsigned int mclk; | 365 | unsigned int mclk; |
@@ -402,6 +404,7 @@ struct adapter_params { | |||
402 | unsigned int stats_update_period; /* MAC stats accumulation period */ | 404 | unsigned int stats_update_period; /* MAC stats accumulation period */ |
403 | unsigned int linkpoll_period; /* link poll period in 0.1s */ | 405 | unsigned int linkpoll_period; /* link poll period in 0.1s */ |
404 | unsigned int rev; /* chip revision */ | 406 | unsigned int rev; /* chip revision */ |
407 | unsigned int offload; | ||
405 | }; | 408 | }; |
406 | 409 | ||
407 | enum { /* chip revisions */ | 410 | enum { /* chip revisions */ |
@@ -602,7 +605,7 @@ static inline int is_10G(const struct adapter *adap) | |||
602 | 605 | ||
603 | static inline int is_offload(const struct adapter *adap) | 606 | static inline int is_offload(const struct adapter *adap) |
604 | { | 607 | { |
605 | return adapter_info(adap)->caps & SUPPORTED_OFFLOAD; | 608 | return adap->params.offload; |
606 | } | 609 | } |
607 | 610 | ||
608 | static inline unsigned int core_ticks_per_usec(const struct adapter *adap) | 611 | static inline unsigned int core_ticks_per_usec(const struct adapter *adap) |
diff --git a/drivers/net/cxgb3/cxgb3_main.c b/drivers/net/cxgb3/cxgb3_main.c index d55383610559..26240fd5e768 100644 --- a/drivers/net/cxgb3/cxgb3_main.c +++ b/drivers/net/cxgb3/cxgb3_main.c | |||
@@ -185,16 +185,26 @@ void t3_os_link_changed(struct adapter *adapter, int port_id, int link_stat, | |||
185 | int speed, int duplex, int pause) | 185 | int speed, int duplex, int pause) |
186 | { | 186 | { |
187 | struct net_device *dev = adapter->port[port_id]; | 187 | struct net_device *dev = adapter->port[port_id]; |
188 | struct port_info *pi = netdev_priv(dev); | ||
189 | struct cmac *mac = &pi->mac; | ||
188 | 190 | ||
189 | /* Skip changes from disabled ports. */ | 191 | /* Skip changes from disabled ports. */ |
190 | if (!netif_running(dev)) | 192 | if (!netif_running(dev)) |
191 | return; | 193 | return; |
192 | 194 | ||
193 | if (link_stat != netif_carrier_ok(dev)) { | 195 | if (link_stat != netif_carrier_ok(dev)) { |
194 | if (link_stat) | 196 | if (link_stat) { |
197 | t3_set_reg_field(adapter, | ||
198 | A_XGM_TXFIFO_CFG + mac->offset, | ||
199 | F_ENDROPPKT, 0); | ||
195 | netif_carrier_on(dev); | 200 | netif_carrier_on(dev); |
196 | else | 201 | } else { |
197 | netif_carrier_off(dev); | 202 | netif_carrier_off(dev); |
203 | t3_set_reg_field(adapter, | ||
204 | A_XGM_TXFIFO_CFG + mac->offset, | ||
205 | F_ENDROPPKT, F_ENDROPPKT); | ||
206 | } | ||
207 | |||
198 | link_report(dev); | 208 | link_report(dev); |
199 | } | 209 | } |
200 | } | 210 | } |
@@ -407,7 +417,7 @@ static void quiesce_rx(struct adapter *adap) | |||
407 | static int setup_sge_qsets(struct adapter *adap) | 417 | static int setup_sge_qsets(struct adapter *adap) |
408 | { | 418 | { |
409 | int i, j, err, irq_idx = 0, qset_idx = 0, dummy_dev_idx = 0; | 419 | int i, j, err, irq_idx = 0, qset_idx = 0, dummy_dev_idx = 0; |
410 | unsigned int ntxq = is_offload(adap) ? SGE_TXQ_PER_SET : 1; | 420 | unsigned int ntxq = SGE_TXQ_PER_SET; |
411 | 421 | ||
412 | if (adap->params.rev > 0 && !(adap->flags & USING_MSI)) | 422 | if (adap->params.rev > 0 && !(adap->flags & USING_MSI)) |
413 | irq_idx = -1; | 423 | irq_idx = -1; |
@@ -485,12 +495,14 @@ static ssize_t show_##name(struct device *d, struct device_attribute *attr, \ | |||
485 | static ssize_t set_nfilters(struct net_device *dev, unsigned int val) | 495 | static ssize_t set_nfilters(struct net_device *dev, unsigned int val) |
486 | { | 496 | { |
487 | struct adapter *adap = dev->priv; | 497 | struct adapter *adap = dev->priv; |
498 | int min_tids = is_offload(adap) ? MC5_MIN_TIDS : 0; | ||
488 | 499 | ||
489 | if (adap->flags & FULL_INIT_DONE) | 500 | if (adap->flags & FULL_INIT_DONE) |
490 | return -EBUSY; | 501 | return -EBUSY; |
491 | if (val && adap->params.rev == 0) | 502 | if (val && adap->params.rev == 0) |
492 | return -EINVAL; | 503 | return -EINVAL; |
493 | if (val > t3_mc5_size(&adap->mc5) - adap->params.mc5.nservers) | 504 | if (val > t3_mc5_size(&adap->mc5) - adap->params.mc5.nservers - |
505 | min_tids) | ||
494 | return -EINVAL; | 506 | return -EINVAL; |
495 | adap->params.mc5.nfilters = val; | 507 | adap->params.mc5.nfilters = val; |
496 | return 0; | 508 | return 0; |
@@ -508,7 +520,8 @@ static ssize_t set_nservers(struct net_device *dev, unsigned int val) | |||
508 | 520 | ||
509 | if (adap->flags & FULL_INIT_DONE) | 521 | if (adap->flags & FULL_INIT_DONE) |
510 | return -EBUSY; | 522 | return -EBUSY; |
511 | if (val > t3_mc5_size(&adap->mc5) - adap->params.mc5.nfilters) | 523 | if (val > t3_mc5_size(&adap->mc5) - adap->params.mc5.nfilters - |
524 | MC5_MIN_TIDS) | ||
512 | return -EINVAL; | 525 | return -EINVAL; |
513 | adap->params.mc5.nservers = val; | 526 | adap->params.mc5.nservers = val; |
514 | return 0; | 527 | return 0; |
@@ -708,7 +721,7 @@ static void bind_qsets(struct adapter *adap) | |||
708 | } | 721 | } |
709 | } | 722 | } |
710 | 723 | ||
711 | #define FW_FNAME "t3fw-%d.%d.bin" | 724 | #define FW_FNAME "t3fw-%d.%d.%d.bin" |
712 | 725 | ||
713 | static int upgrade_fw(struct adapter *adap) | 726 | static int upgrade_fw(struct adapter *adap) |
714 | { | 727 | { |
@@ -718,7 +731,7 @@ static int upgrade_fw(struct adapter *adap) | |||
718 | struct device *dev = &adap->pdev->dev; | 731 | struct device *dev = &adap->pdev->dev; |
719 | 732 | ||
720 | snprintf(buf, sizeof(buf), FW_FNAME, FW_VERSION_MAJOR, | 733 | snprintf(buf, sizeof(buf), FW_FNAME, FW_VERSION_MAJOR, |
721 | FW_VERSION_MINOR); | 734 | FW_VERSION_MINOR, FW_VERSION_MICRO); |
722 | ret = request_firmware(&fw, buf, dev); | 735 | ret = request_firmware(&fw, buf, dev); |
723 | if (ret < 0) { | 736 | if (ret < 0) { |
724 | dev_err(dev, "could not upgrade firmware: unable to load %s\n", | 737 | dev_err(dev, "could not upgrade firmware: unable to load %s\n", |
@@ -919,7 +932,7 @@ static int cxgb_open(struct net_device *dev) | |||
919 | return err; | 932 | return err; |
920 | 933 | ||
921 | set_bit(pi->port_id, &adapter->open_device_map); | 934 | set_bit(pi->port_id, &adapter->open_device_map); |
922 | if (!ofld_disable) { | 935 | if (is_offload(adapter) && !ofld_disable) { |
923 | err = offload_open(dev); | 936 | err = offload_open(dev); |
924 | if (err) | 937 | if (err) |
925 | printk(KERN_WARNING | 938 | printk(KERN_WARNING |
@@ -2116,7 +2129,7 @@ static void check_t3b2_mac(struct adapter *adapter) | |||
2116 | continue; | 2129 | continue; |
2117 | 2130 | ||
2118 | status = 0; | 2131 | status = 0; |
2119 | if (netif_running(dev)) | 2132 | if (netif_running(dev) && netif_carrier_ok(dev)) |
2120 | status = t3b2_mac_watchdog_task(&p->mac); | 2133 | status = t3b2_mac_watchdog_task(&p->mac); |
2121 | if (status == 1) | 2134 | if (status == 1) |
2122 | p->mac.stats.num_toggled++; | 2135 | p->mac.stats.num_toggled++; |
@@ -2267,9 +2280,9 @@ static void __devinit print_port_info(struct adapter *adap, | |||
2267 | 2280 | ||
2268 | if (!test_bit(i, &adap->registered_device_map)) | 2281 | if (!test_bit(i, &adap->registered_device_map)) |
2269 | continue; | 2282 | continue; |
2270 | printk(KERN_INFO "%s: %s %s RNIC (rev %d) %s%s\n", | 2283 | printk(KERN_INFO "%s: %s %s %sNIC (rev %d) %s%s\n", |
2271 | dev->name, ai->desc, pi->port_type->desc, | 2284 | dev->name, ai->desc, pi->port_type->desc, |
2272 | adap->params.rev, buf, | 2285 | is_offload(adap) ? "R" : "", adap->params.rev, buf, |
2273 | (adap->flags & USING_MSIX) ? " MSI-X" : | 2286 | (adap->flags & USING_MSIX) ? " MSI-X" : |
2274 | (adap->flags & USING_MSI) ? " MSI" : ""); | 2287 | (adap->flags & USING_MSI) ? " MSI" : ""); |
2275 | if (adap->name == dev->name && adap->params.vpd.mclk) | 2288 | if (adap->name == dev->name && adap->params.vpd.mclk) |
diff --git a/drivers/net/cxgb3/cxgb3_offload.c b/drivers/net/cxgb3/cxgb3_offload.c index f6ed033efb56..eed7a48e3111 100644 --- a/drivers/net/cxgb3/cxgb3_offload.c +++ b/drivers/net/cxgb3/cxgb3_offload.c | |||
@@ -553,7 +553,9 @@ int cxgb3_alloc_atid(struct t3cdev *tdev, struct cxgb3_client *client, | |||
553 | struct tid_info *t = &(T3C_DATA(tdev))->tid_maps; | 553 | struct tid_info *t = &(T3C_DATA(tdev))->tid_maps; |
554 | 554 | ||
555 | spin_lock_bh(&t->atid_lock); | 555 | spin_lock_bh(&t->atid_lock); |
556 | if (t->afree) { | 556 | if (t->afree && |
557 | t->atids_in_use + atomic_read(&t->tids_in_use) + MC5_MIN_TIDS <= | ||
558 | t->ntids) { | ||
557 | union active_open_entry *p = t->afree; | 559 | union active_open_entry *p = t->afree; |
558 | 560 | ||
559 | atid = (p - t->atid_tab) + t->atid_base; | 561 | atid = (p - t->atid_tab) + t->atid_base; |
diff --git a/drivers/net/cxgb3/mc5.c b/drivers/net/cxgb3/mc5.c index 644d62ea86a6..84c1ffa8e2d3 100644 --- a/drivers/net/cxgb3/mc5.c +++ b/drivers/net/cxgb3/mc5.c | |||
@@ -328,6 +328,9 @@ int t3_mc5_init(struct mc5 *mc5, unsigned int nservers, unsigned int nfilters, | |||
328 | unsigned int tcam_size = mc5->tcam_size; | 328 | unsigned int tcam_size = mc5->tcam_size; |
329 | struct adapter *adap = mc5->adapter; | 329 | struct adapter *adap = mc5->adapter; |
330 | 330 | ||
331 | if (!tcam_size) | ||
332 | return 0; | ||
333 | |||
331 | if (nroutes > MAX_ROUTES || nroutes + nservers + nfilters > tcam_size) | 334 | if (nroutes > MAX_ROUTES || nroutes + nservers + nfilters > tcam_size) |
332 | return -EINVAL; | 335 | return -EINVAL; |
333 | 336 | ||
diff --git a/drivers/net/cxgb3/regs.h b/drivers/net/cxgb3/regs.h index b38629a244d0..f8be41c5a081 100644 --- a/drivers/net/cxgb3/regs.h +++ b/drivers/net/cxgb3/regs.h | |||
@@ -1940,6 +1940,10 @@ | |||
1940 | 1940 | ||
1941 | #define V_TXFIFOTHRESH(x) ((x) << S_TXFIFOTHRESH) | 1941 | #define V_TXFIFOTHRESH(x) ((x) << S_TXFIFOTHRESH) |
1942 | 1942 | ||
1943 | #define S_ENDROPPKT 21 | ||
1944 | #define V_ENDROPPKT(x) ((x) << S_ENDROPPKT) | ||
1945 | #define F_ENDROPPKT V_ENDROPPKT(1U) | ||
1946 | |||
1943 | #define A_XGM_SERDES_CTRL 0x890 | 1947 | #define A_XGM_SERDES_CTRL 0x890 |
1944 | #define A_XGM_SERDES_CTRL0 0x8e0 | 1948 | #define A_XGM_SERDES_CTRL0 0x8e0 |
1945 | 1949 | ||
diff --git a/drivers/net/cxgb3/sge.c b/drivers/net/cxgb3/sge.c index c23783432e51..027ab2c3825c 100644 --- a/drivers/net/cxgb3/sge.c +++ b/drivers/net/cxgb3/sge.c | |||
@@ -2631,7 +2631,7 @@ int t3_sge_alloc_qset(struct adapter *adapter, unsigned int id, int nports, | |||
2631 | q->txq[TXQ_ETH].stop_thres = nports * | 2631 | q->txq[TXQ_ETH].stop_thres = nports * |
2632 | flits_to_desc(sgl_len(MAX_SKB_FRAGS + 1) + 3); | 2632 | flits_to_desc(sgl_len(MAX_SKB_FRAGS + 1) + 3); |
2633 | 2633 | ||
2634 | if (ntxq == 1) { | 2634 | if (!is_offload(adapter)) { |
2635 | #ifdef USE_RX_PAGE | 2635 | #ifdef USE_RX_PAGE |
2636 | q->fl[0].buf_size = RX_PAGE_SIZE; | 2636 | q->fl[0].buf_size = RX_PAGE_SIZE; |
2637 | #else | 2637 | #else |
diff --git a/drivers/net/cxgb3/t3_hw.c b/drivers/net/cxgb3/t3_hw.c index 791ed6dc1943..d83f075ef2d7 100644 --- a/drivers/net/cxgb3/t3_hw.c +++ b/drivers/net/cxgb3/t3_hw.c | |||
@@ -438,23 +438,23 @@ static const struct adapter_info t3_adap_info[] = { | |||
438 | {2, 0, 0, 0, | 438 | {2, 0, 0, 0, |
439 | F_GPIO2_OEN | F_GPIO4_OEN | | 439 | F_GPIO2_OEN | F_GPIO4_OEN | |
440 | F_GPIO2_OUT_VAL | F_GPIO4_OUT_VAL, F_GPIO3 | F_GPIO5, | 440 | F_GPIO2_OUT_VAL | F_GPIO4_OUT_VAL, F_GPIO3 | F_GPIO5, |
441 | SUPPORTED_OFFLOAD, | 441 | 0, |
442 | &mi1_mdio_ops, "Chelsio PE9000"}, | 442 | &mi1_mdio_ops, "Chelsio PE9000"}, |
443 | {2, 0, 0, 0, | 443 | {2, 0, 0, 0, |
444 | F_GPIO2_OEN | F_GPIO4_OEN | | 444 | F_GPIO2_OEN | F_GPIO4_OEN | |
445 | F_GPIO2_OUT_VAL | F_GPIO4_OUT_VAL, F_GPIO3 | F_GPIO5, | 445 | F_GPIO2_OUT_VAL | F_GPIO4_OUT_VAL, F_GPIO3 | F_GPIO5, |
446 | SUPPORTED_OFFLOAD, | 446 | 0, |
447 | &mi1_mdio_ops, "Chelsio T302"}, | 447 | &mi1_mdio_ops, "Chelsio T302"}, |
448 | {1, 0, 0, 0, | 448 | {1, 0, 0, 0, |
449 | F_GPIO1_OEN | F_GPIO6_OEN | F_GPIO7_OEN | F_GPIO10_OEN | | 449 | F_GPIO1_OEN | F_GPIO6_OEN | F_GPIO7_OEN | F_GPIO10_OEN | |
450 | F_GPIO1_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL, 0, | 450 | F_GPIO1_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL, 0, |
451 | SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_OFFLOAD, | 451 | SUPPORTED_10000baseT_Full | SUPPORTED_AUI, |
452 | &mi1_mdio_ext_ops, "Chelsio T310"}, | 452 | &mi1_mdio_ext_ops, "Chelsio T310"}, |
453 | {2, 0, 0, 0, | 453 | {2, 0, 0, 0, |
454 | F_GPIO1_OEN | F_GPIO2_OEN | F_GPIO4_OEN | F_GPIO5_OEN | F_GPIO6_OEN | | 454 | F_GPIO1_OEN | F_GPIO2_OEN | F_GPIO4_OEN | F_GPIO5_OEN | F_GPIO6_OEN | |
455 | F_GPIO7_OEN | F_GPIO10_OEN | F_GPIO11_OEN | F_GPIO1_OUT_VAL | | 455 | F_GPIO7_OEN | F_GPIO10_OEN | F_GPIO11_OEN | F_GPIO1_OUT_VAL | |
456 | F_GPIO5_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL, 0, | 456 | F_GPIO5_OUT_VAL | F_GPIO6_OUT_VAL | F_GPIO10_OUT_VAL, 0, |
457 | SUPPORTED_10000baseT_Full | SUPPORTED_AUI | SUPPORTED_OFFLOAD, | 457 | SUPPORTED_10000baseT_Full | SUPPORTED_AUI, |
458 | &mi1_mdio_ext_ops, "Chelsio T320"}, | 458 | &mi1_mdio_ext_ops, "Chelsio T320"}, |
459 | }; | 459 | }; |
460 | 460 | ||
@@ -2900,6 +2900,9 @@ static int mc7_init(struct mc7 *mc7, unsigned int mc7_clock, int mem_type) | |||
2900 | struct adapter *adapter = mc7->adapter; | 2900 | struct adapter *adapter = mc7->adapter; |
2901 | const struct mc7_timing_params *p = &mc7_timings[mem_type]; | 2901 | const struct mc7_timing_params *p = &mc7_timings[mem_type]; |
2902 | 2902 | ||
2903 | if (!mc7->size) | ||
2904 | return 0; | ||
2905 | |||
2903 | val = t3_read_reg(adapter, mc7->offset + A_MC7_CFG); | 2906 | val = t3_read_reg(adapter, mc7->offset + A_MC7_CFG); |
2904 | slow = val & F_SLOW; | 2907 | slow = val & F_SLOW; |
2905 | width = G_WIDTH(val); | 2908 | width = G_WIDTH(val); |
@@ -3100,8 +3103,10 @@ int t3_init_hw(struct adapter *adapter, u32 fw_params) | |||
3100 | do { /* wait for uP to initialize */ | 3103 | do { /* wait for uP to initialize */ |
3101 | msleep(20); | 3104 | msleep(20); |
3102 | } while (t3_read_reg(adapter, A_CIM_HOST_ACC_DATA) && --attempts); | 3105 | } while (t3_read_reg(adapter, A_CIM_HOST_ACC_DATA) && --attempts); |
3103 | if (!attempts) | 3106 | if (!attempts) { |
3107 | CH_ERR(adapter, "uP initialization timed out\n"); | ||
3104 | goto out_err; | 3108 | goto out_err; |
3109 | } | ||
3105 | 3110 | ||
3106 | err = 0; | 3111 | err = 0; |
3107 | out_err: | 3112 | out_err: |
@@ -3201,7 +3206,7 @@ static void __devinit mc7_prep(struct adapter *adapter, struct mc7 *mc7, | |||
3201 | mc7->name = name; | 3206 | mc7->name = name; |
3202 | mc7->offset = base_addr - MC7_PMRX_BASE_ADDR; | 3207 | mc7->offset = base_addr - MC7_PMRX_BASE_ADDR; |
3203 | cfg = t3_read_reg(adapter, mc7->offset + A_MC7_CFG); | 3208 | cfg = t3_read_reg(adapter, mc7->offset + A_MC7_CFG); |
3204 | mc7->size = mc7_calc_size(cfg); | 3209 | mc7->size = mc7->size = G_DEN(cfg) == M_DEN ? 0 : mc7_calc_size(cfg); |
3205 | mc7->width = G_WIDTH(cfg); | 3210 | mc7->width = G_WIDTH(cfg); |
3206 | } | 3211 | } |
3207 | 3212 | ||
@@ -3228,6 +3233,7 @@ void early_hw_init(struct adapter *adapter, const struct adapter_info *ai) | |||
3228 | V_I2C_CLKDIV(adapter->params.vpd.cclk / 80 - 1)); | 3233 | V_I2C_CLKDIV(adapter->params.vpd.cclk / 80 - 1)); |
3229 | t3_write_reg(adapter, A_T3DBG_GPIO_EN, | 3234 | t3_write_reg(adapter, A_T3DBG_GPIO_EN, |
3230 | ai->gpio_out | F_GPIO0_OEN | F_GPIO0_OUT_VAL); | 3235 | ai->gpio_out | F_GPIO0_OEN | F_GPIO0_OUT_VAL); |
3236 | t3_write_reg(adapter, A_MC5_DB_SERVER_INDEX, 0); | ||
3231 | 3237 | ||
3232 | if (adapter->params.rev == 0 || !uses_xaui(adapter)) | 3238 | if (adapter->params.rev == 0 || !uses_xaui(adapter)) |
3233 | val |= F_ENRGMII; | 3239 | val |= F_ENRGMII; |
@@ -3326,7 +3332,13 @@ int __devinit t3_prep_adapter(struct adapter *adapter, | |||
3326 | p->tx_num_pgs = pm_num_pages(p->chan_tx_size, p->tx_pg_size); | 3332 | p->tx_num_pgs = pm_num_pages(p->chan_tx_size, p->tx_pg_size); |
3327 | p->ntimer_qs = p->cm_size >= (128 << 20) || | 3333 | p->ntimer_qs = p->cm_size >= (128 << 20) || |
3328 | adapter->params.rev > 0 ? 12 : 6; | 3334 | adapter->params.rev > 0 ? 12 : 6; |
3335 | } | ||
3336 | |||
3337 | adapter->params.offload = t3_mc7_size(&adapter->pmrx) && | ||
3338 | t3_mc7_size(&adapter->pmtx) && | ||
3339 | t3_mc7_size(&adapter->cm); | ||
3329 | 3340 | ||
3341 | if (is_offload(adapter)) { | ||
3330 | adapter->params.mc5.nservers = DEFAULT_NSERVERS; | 3342 | adapter->params.mc5.nservers = DEFAULT_NSERVERS; |
3331 | adapter->params.mc5.nfilters = adapter->params.rev > 0 ? | 3343 | adapter->params.mc5.nfilters = adapter->params.rev > 0 ? |
3332 | DEFAULT_NFILTERS : 0; | 3344 | DEFAULT_NFILTERS : 0; |
diff --git a/drivers/net/cxgb3/version.h b/drivers/net/cxgb3/version.h index 82278f850259..042e27e291cd 100644 --- a/drivers/net/cxgb3/version.h +++ b/drivers/net/cxgb3/version.h | |||
@@ -36,6 +36,9 @@ | |||
36 | #define DRV_NAME "cxgb3" | 36 | #define DRV_NAME "cxgb3" |
37 | /* Driver version */ | 37 | /* Driver version */ |
38 | #define DRV_VERSION "1.0-ko" | 38 | #define DRV_VERSION "1.0-ko" |
39 | |||
40 | /* Firmware version */ | ||
39 | #define FW_VERSION_MAJOR 3 | 41 | #define FW_VERSION_MAJOR 3 |
40 | #define FW_VERSION_MINOR 2 | 42 | #define FW_VERSION_MINOR 3 |
43 | #define FW_VERSION_MICRO 0 | ||
41 | #endif /* __CHELSIO_VERSION_H */ | 44 | #endif /* __CHELSIO_VERSION_H */ |
diff --git a/drivers/net/cxgb3/xgmac.c b/drivers/net/cxgb3/xgmac.c index 2b42c13ba8e0..94aaff005a35 100644 --- a/drivers/net/cxgb3/xgmac.c +++ b/drivers/net/cxgb3/xgmac.c | |||
@@ -471,7 +471,6 @@ const struct mac_stats *t3_mac_update_stats(struct cmac *mac) | |||
471 | RMON_UPDATE(mac, rx_symbol_errs, RX_SYM_CODE_ERR_FRAMES); | 471 | RMON_UPDATE(mac, rx_symbol_errs, RX_SYM_CODE_ERR_FRAMES); |
472 | 472 | ||
473 | RMON_UPDATE(mac, rx_too_long, RX_OVERSIZE_FRAMES); | 473 | RMON_UPDATE(mac, rx_too_long, RX_OVERSIZE_FRAMES); |
474 | mac->stats.rx_too_long += RMON_READ(mac, A_XGM_RX_MAX_PKT_SIZE_ERR_CNT); | ||
475 | 474 | ||
476 | v = RMON_READ(mac, A_XGM_RX_MAX_PKT_SIZE_ERR_CNT); | 475 | v = RMON_READ(mac, A_XGM_RX_MAX_PKT_SIZE_ERR_CNT); |
477 | if (mac->adapter->params.rev == T3_REV_B2) | 476 | if (mac->adapter->params.rev == T3_REV_B2) |
diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c index 46e1697d9cfd..d04214e4e581 100644 --- a/drivers/net/forcedeth.c +++ b/drivers/net/forcedeth.c | |||
@@ -2050,9 +2050,10 @@ static void nv_tx_timeout(struct net_device *dev) | |||
2050 | nv_drain_tx(dev); | 2050 | nv_drain_tx(dev); |
2051 | nv_init_tx(dev); | 2051 | nv_init_tx(dev); |
2052 | setup_hw_rings(dev, NV_SETUP_TX_RING); | 2052 | setup_hw_rings(dev, NV_SETUP_TX_RING); |
2053 | netif_wake_queue(dev); | ||
2054 | } | 2053 | } |
2055 | 2054 | ||
2055 | netif_wake_queue(dev); | ||
2056 | |||
2056 | /* 4) restart tx engine */ | 2057 | /* 4) restart tx engine */ |
2057 | nv_start_tx(dev); | 2058 | nv_start_tx(dev); |
2058 | spin_unlock_irq(&np->lock); | 2059 | spin_unlock_irq(&np->lock); |
@@ -3536,7 +3537,10 @@ static void nv_do_nic_poll(unsigned long data) | |||
3536 | pci_push(base); | 3537 | pci_push(base); |
3537 | 3538 | ||
3538 | if (!using_multi_irqs(dev)) { | 3539 | if (!using_multi_irqs(dev)) { |
3539 | nv_nic_irq(0, dev); | 3540 | if (np->desc_ver == DESC_VER_3) |
3541 | nv_nic_irq_optimized(0, dev); | ||
3542 | else | ||
3543 | nv_nic_irq(0, dev); | ||
3540 | if (np->msi_flags & NV_MSI_X_ENABLED) | 3544 | if (np->msi_flags & NV_MSI_X_ENABLED) |
3541 | enable_irq_lockdep(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector); | 3545 | enable_irq_lockdep(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector); |
3542 | else | 3546 | else |
diff --git a/drivers/net/ifb.c b/drivers/net/ifb.c index ca2b21f9d444..07b4c0d7a75c 100644 --- a/drivers/net/ifb.c +++ b/drivers/net/ifb.c | |||
@@ -96,17 +96,24 @@ static void ri_tasklet(unsigned long dev) | |||
96 | skb->tc_verd = SET_TC_NCLS(skb->tc_verd); | 96 | skb->tc_verd = SET_TC_NCLS(skb->tc_verd); |
97 | stats->tx_packets++; | 97 | stats->tx_packets++; |
98 | stats->tx_bytes +=skb->len; | 98 | stats->tx_bytes +=skb->len; |
99 | |||
100 | skb->dev = __dev_get_by_index(skb->iif); | ||
101 | if (!skb->dev) { | ||
102 | dev_kfree_skb(skb); | ||
103 | stats->tx_dropped++; | ||
104 | break; | ||
105 | } | ||
106 | skb->iif = _dev->ifindex; | ||
107 | |||
99 | if (from & AT_EGRESS) { | 108 | if (from & AT_EGRESS) { |
100 | dp->st_rx_frm_egr++; | 109 | dp->st_rx_frm_egr++; |
101 | dev_queue_xmit(skb); | 110 | dev_queue_xmit(skb); |
102 | } else if (from & AT_INGRESS) { | 111 | } else if (from & AT_INGRESS) { |
103 | |||
104 | dp->st_rx_frm_ing++; | 112 | dp->st_rx_frm_ing++; |
113 | skb_pull(skb, skb->dev->hard_header_len); | ||
105 | netif_rx(skb); | 114 | netif_rx(skb); |
106 | } else { | 115 | } else |
107 | dev_kfree_skb(skb); | 116 | BUG(); |
108 | stats->tx_dropped++; | ||
109 | } | ||
110 | } | 117 | } |
111 | 118 | ||
112 | if (netif_tx_trylock(_dev)) { | 119 | if (netif_tx_trylock(_dev)) { |
@@ -157,26 +164,10 @@ static int ifb_xmit(struct sk_buff *skb, struct net_device *dev) | |||
157 | stats->rx_packets++; | 164 | stats->rx_packets++; |
158 | stats->rx_bytes+=skb->len; | 165 | stats->rx_bytes+=skb->len; |
159 | 166 | ||
160 | if (!from || !skb->input_dev) { | 167 | if (!(from & (AT_INGRESS|AT_EGRESS)) || !skb->iif) { |
161 | dropped: | ||
162 | dev_kfree_skb(skb); | 168 | dev_kfree_skb(skb); |
163 | stats->rx_dropped++; | 169 | stats->rx_dropped++; |
164 | return ret; | 170 | return ret; |
165 | } else { | ||
166 | /* | ||
167 | * note we could be going | ||
168 | * ingress -> egress or | ||
169 | * egress -> ingress | ||
170 | */ | ||
171 | skb->dev = skb->input_dev; | ||
172 | skb->input_dev = dev; | ||
173 | if (from & AT_INGRESS) { | ||
174 | skb_pull(skb, skb->dev->hard_header_len); | ||
175 | } else { | ||
176 | if (!(from & AT_EGRESS)) { | ||
177 | goto dropped; | ||
178 | } | ||
179 | } | ||
180 | } | 171 | } |
181 | 172 | ||
182 | if (skb_queue_len(&dp->rq) >= dev->tx_queue_len) { | 173 | if (skb_queue_len(&dp->rq) >= dev->tx_queue_len) { |
diff --git a/drivers/net/irda/pxaficp_ir.c b/drivers/net/irda/pxaficp_ir.c index 9137e239fac2..2272156af31e 100644 --- a/drivers/net/irda/pxaficp_ir.c +++ b/drivers/net/irda/pxaficp_ir.c | |||
@@ -321,15 +321,22 @@ static void pxa_irda_fir_dma_tx_irq(int channel, void *data) | |||
321 | pxa_irda_set_speed(si, si->newspeed); | 321 | pxa_irda_set_speed(si, si->newspeed); |
322 | si->newspeed = 0; | 322 | si->newspeed = 0; |
323 | } else { | 323 | } else { |
324 | int i = 64; | ||
325 | |||
324 | ICCR0 = 0; | 326 | ICCR0 = 0; |
325 | pxa_irda_fir_dma_rx_start(si); | 327 | pxa_irda_fir_dma_rx_start(si); |
328 | while ((ICSR1 & ICSR1_RNE) && i--) | ||
329 | (void)ICDR; | ||
326 | ICCR0 = ICCR0_ITR | ICCR0_RXE; | 330 | ICCR0 = ICCR0_ITR | ICCR0_RXE; |
331 | |||
332 | if (i < 0) | ||
333 | printk(KERN_ERR "pxa_ir: cannot clear Rx FIFO!\n"); | ||
327 | } | 334 | } |
328 | netif_wake_queue(dev); | 335 | netif_wake_queue(dev); |
329 | } | 336 | } |
330 | 337 | ||
331 | /* EIF(Error in FIFO/End in Frame) handler for FIR */ | 338 | /* EIF(Error in FIFO/End in Frame) handler for FIR */ |
332 | static void pxa_irda_fir_irq_eif(struct pxa_irda *si, struct net_device *dev) | 339 | static void pxa_irda_fir_irq_eif(struct pxa_irda *si, struct net_device *dev, int icsr0) |
333 | { | 340 | { |
334 | unsigned int len, stat, data; | 341 | unsigned int len, stat, data; |
335 | 342 | ||
@@ -350,7 +357,7 @@ static void pxa_irda_fir_irq_eif(struct pxa_irda *si, struct net_device *dev) | |||
350 | } | 357 | } |
351 | if (stat & ICSR1_ROR) { | 358 | if (stat & ICSR1_ROR) { |
352 | printk(KERN_DEBUG "pxa_ir: fir receive overrun\n"); | 359 | printk(KERN_DEBUG "pxa_ir: fir receive overrun\n"); |
353 | si->stats.rx_frame_errors++; | 360 | si->stats.rx_over_errors++; |
354 | } | 361 | } |
355 | } else { | 362 | } else { |
356 | si->dma_rx_buff[len++] = data; | 363 | si->dma_rx_buff[len++] = data; |
@@ -362,7 +369,15 @@ static void pxa_irda_fir_irq_eif(struct pxa_irda *si, struct net_device *dev) | |||
362 | 369 | ||
363 | if (stat & ICSR1_EOF) { | 370 | if (stat & ICSR1_EOF) { |
364 | /* end of frame. */ | 371 | /* end of frame. */ |
365 | struct sk_buff *skb = alloc_skb(len+1,GFP_ATOMIC); | 372 | struct sk_buff *skb; |
373 | |||
374 | if (icsr0 & ICSR0_FRE) { | ||
375 | printk(KERN_ERR "pxa_ir: dropping erroneous frame\n"); | ||
376 | si->stats.rx_dropped++; | ||
377 | return; | ||
378 | } | ||
379 | |||
380 | skb = alloc_skb(len+1,GFP_ATOMIC); | ||
366 | if (!skb) { | 381 | if (!skb) { |
367 | printk(KERN_ERR "pxa_ir: fir out of memory for receive skb\n"); | 382 | printk(KERN_ERR "pxa_ir: fir out of memory for receive skb\n"); |
368 | si->stats.rx_dropped++; | 383 | si->stats.rx_dropped++; |
@@ -392,7 +407,7 @@ static irqreturn_t pxa_irda_fir_irq(int irq, void *dev_id) | |||
392 | { | 407 | { |
393 | struct net_device *dev = dev_id; | 408 | struct net_device *dev = dev_id; |
394 | struct pxa_irda *si = netdev_priv(dev); | 409 | struct pxa_irda *si = netdev_priv(dev); |
395 | int icsr0; | 410 | int icsr0, i = 64; |
396 | 411 | ||
397 | /* stop RX DMA */ | 412 | /* stop RX DMA */ |
398 | DCSR(si->rxdma) &= ~DCSR_RUN; | 413 | DCSR(si->rxdma) &= ~DCSR_RUN; |
@@ -412,13 +427,18 @@ static irqreturn_t pxa_irda_fir_irq(int irq, void *dev_id) | |||
412 | 427 | ||
413 | if (icsr0 & ICSR0_EIF) { | 428 | if (icsr0 & ICSR0_EIF) { |
414 | /* An error in FIFO occured, or there is a end of frame */ | 429 | /* An error in FIFO occured, or there is a end of frame */ |
415 | pxa_irda_fir_irq_eif(si, dev); | 430 | pxa_irda_fir_irq_eif(si, dev, icsr0); |
416 | } | 431 | } |
417 | 432 | ||
418 | ICCR0 = 0; | 433 | ICCR0 = 0; |
419 | pxa_irda_fir_dma_rx_start(si); | 434 | pxa_irda_fir_dma_rx_start(si); |
435 | while ((ICSR1 & ICSR1_RNE) && i--) | ||
436 | (void)ICDR; | ||
420 | ICCR0 = ICCR0_ITR | ICCR0_RXE; | 437 | ICCR0 = ICCR0_ITR | ICCR0_RXE; |
421 | 438 | ||
439 | if (i < 0) | ||
440 | printk(KERN_ERR "pxa_ir: cannot clear Rx FIFO!\n"); | ||
441 | |||
422 | return IRQ_HANDLED; | 442 | return IRQ_HANDLED; |
423 | } | 443 | } |
424 | 444 | ||
diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c index c9f55bc57edb..8015a7c5b0c9 100644 --- a/drivers/net/mv643xx_eth.c +++ b/drivers/net/mv643xx_eth.c | |||
@@ -1379,7 +1379,7 @@ static int mv643xx_eth_probe(struct platform_device *pdev) | |||
1379 | 1379 | ||
1380 | spin_lock_init(&mp->lock); | 1380 | spin_lock_init(&mp->lock); |
1381 | 1381 | ||
1382 | port_num = pd->port_number; | 1382 | port_num = mp->port_num = pd->port_number; |
1383 | 1383 | ||
1384 | /* set default config values */ | 1384 | /* set default config values */ |
1385 | eth_port_uc_addr_get(dev, dev->dev_addr); | 1385 | eth_port_uc_addr_get(dev, dev->dev_addr); |
@@ -1411,8 +1411,6 @@ static int mv643xx_eth_probe(struct platform_device *pdev) | |||
1411 | duplex = pd->duplex; | 1411 | duplex = pd->duplex; |
1412 | speed = pd->speed; | 1412 | speed = pd->speed; |
1413 | 1413 | ||
1414 | mp->port_num = port_num; | ||
1415 | |||
1416 | /* Hook up MII support for ethtool */ | 1414 | /* Hook up MII support for ethtool */ |
1417 | mp->mii.dev = dev; | 1415 | mp->mii.dev = dev; |
1418 | mp->mii.mdio_read = mv643xx_mdio_read; | 1416 | mp->mii.mdio_read = mv643xx_mdio_read; |
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c index b05b20ef8c0a..c216e6a5d235 100644 --- a/drivers/net/myri10ge/myri10ge.c +++ b/drivers/net/myri10ge/myri10ge.c | |||
@@ -71,7 +71,7 @@ | |||
71 | #include "myri10ge_mcp.h" | 71 | #include "myri10ge_mcp.h" |
72 | #include "myri10ge_mcp_gen_header.h" | 72 | #include "myri10ge_mcp_gen_header.h" |
73 | 73 | ||
74 | #define MYRI10GE_VERSION_STR "1.3.0-1.226" | 74 | #define MYRI10GE_VERSION_STR "1.3.0-1.227" |
75 | 75 | ||
76 | MODULE_DESCRIPTION("Myricom 10G driver (10GbE)"); | 76 | MODULE_DESCRIPTION("Myricom 10G driver (10GbE)"); |
77 | MODULE_AUTHOR("Maintainer: help@myri.com"); | 77 | MODULE_AUTHOR("Maintainer: help@myri.com"); |
@@ -2015,10 +2015,9 @@ again: | |||
2015 | mss = 0; | 2015 | mss = 0; |
2016 | max_segments = MXGEFW_MAX_SEND_DESC; | 2016 | max_segments = MXGEFW_MAX_SEND_DESC; |
2017 | 2017 | ||
2018 | if (skb->len > (dev->mtu + ETH_HLEN)) { | 2018 | if (skb_is_gso(skb)) { |
2019 | mss = skb_shinfo(skb)->gso_size; | 2019 | mss = skb_shinfo(skb)->gso_size; |
2020 | if (mss != 0) | 2020 | max_segments = MYRI10GE_MAX_SEND_DESC_TSO; |
2021 | max_segments = MYRI10GE_MAX_SEND_DESC_TSO; | ||
2022 | } | 2021 | } |
2023 | 2022 | ||
2024 | if ((unlikely(avail < max_segments))) { | 2023 | if ((unlikely(avail < max_segments))) { |
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index 229aa1c4fb79..eff965dc5fff 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c | |||
@@ -438,6 +438,7 @@ do_rom_fast_read_words(struct netxen_adapter *adapter, int addr, | |||
438 | 438 | ||
439 | for (addridx = addr; addridx < (addr + size); addridx += 4) { | 439 | for (addridx = addr; addridx < (addr + size); addridx += 4) { |
440 | ret = do_rom_fast_read(adapter, addridx, (int *)bytes); | 440 | ret = do_rom_fast_read(adapter, addridx, (int *)bytes); |
441 | *(int *)bytes = cpu_to_le32(*(int *)bytes); | ||
441 | if (ret != 0) | 442 | if (ret != 0) |
442 | break; | 443 | break; |
443 | bytes += 4; | 444 | bytes += 4; |
@@ -497,7 +498,7 @@ static inline int do_rom_fast_write_words(struct netxen_adapter *adapter, | |||
497 | int timeout = 0; | 498 | int timeout = 0; |
498 | int data; | 499 | int data; |
499 | 500 | ||
500 | data = *(u32*)bytes; | 501 | data = le32_to_cpu((*(u32*)bytes)); |
501 | 502 | ||
502 | ret = do_rom_fast_write(adapter, addridx, data); | 503 | ret = do_rom_fast_write(adapter, addridx, data); |
503 | if (ret < 0) | 504 | if (ret < 0) |
diff --git a/drivers/net/ppp_generic.c b/drivers/net/ppp_generic.c index 11b575f89856..ef58e4128782 100644 --- a/drivers/net/ppp_generic.c +++ b/drivers/net/ppp_generic.c | |||
@@ -2544,6 +2544,9 @@ static void ppp_destroy_interface(struct ppp *ppp) | |||
2544 | ppp->active_filter = NULL; | 2544 | ppp->active_filter = NULL; |
2545 | #endif /* CONFIG_PPP_FILTER */ | 2545 | #endif /* CONFIG_PPP_FILTER */ |
2546 | 2546 | ||
2547 | if (ppp->xmit_pending) | ||
2548 | kfree_skb(ppp->xmit_pending); | ||
2549 | |||
2547 | kfree(ppp); | 2550 | kfree(ppp); |
2548 | } | 2551 | } |
2549 | 2552 | ||
diff --git a/drivers/net/qla3xxx.c b/drivers/net/qla3xxx.c index d3f65dab306c..a8246eb2f8d9 100755 --- a/drivers/net/qla3xxx.c +++ b/drivers/net/qla3xxx.c | |||
@@ -1691,6 +1691,27 @@ static int ql_populate_free_queue(struct ql3_adapter *qdev) | |||
1691 | /* | 1691 | /* |
1692 | * Caller holds hw_lock. | 1692 | * Caller holds hw_lock. |
1693 | */ | 1693 | */ |
1694 | static void ql_update_small_bufq_prod_index(struct ql3_adapter *qdev) | ||
1695 | { | ||
1696 | struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers; | ||
1697 | if (qdev->small_buf_release_cnt >= 16) { | ||
1698 | while (qdev->small_buf_release_cnt >= 16) { | ||
1699 | qdev->small_buf_q_producer_index++; | ||
1700 | |||
1701 | if (qdev->small_buf_q_producer_index == | ||
1702 | NUM_SBUFQ_ENTRIES) | ||
1703 | qdev->small_buf_q_producer_index = 0; | ||
1704 | qdev->small_buf_release_cnt -= 8; | ||
1705 | } | ||
1706 | wmb(); | ||
1707 | writel(qdev->small_buf_q_producer_index, | ||
1708 | &port_regs->CommonRegs.rxSmallQProducerIndex); | ||
1709 | } | ||
1710 | } | ||
1711 | |||
1712 | /* | ||
1713 | * Caller holds hw_lock. | ||
1714 | */ | ||
1694 | static void ql_update_lrg_bufq_prod_index(struct ql3_adapter *qdev) | 1715 | static void ql_update_lrg_bufq_prod_index(struct ql3_adapter *qdev) |
1695 | { | 1716 | { |
1696 | struct bufq_addr_element *lrg_buf_q_ele; | 1717 | struct bufq_addr_element *lrg_buf_q_ele; |
@@ -1732,13 +1753,10 @@ static void ql_update_lrg_bufq_prod_index(struct ql3_adapter *qdev) | |||
1732 | lrg_buf_q_ele = qdev->lrg_buf_q_virt_addr; | 1753 | lrg_buf_q_ele = qdev->lrg_buf_q_virt_addr; |
1733 | } | 1754 | } |
1734 | } | 1755 | } |
1735 | 1756 | wmb(); | |
1736 | qdev->lrg_buf_next_free = lrg_buf_q_ele; | 1757 | qdev->lrg_buf_next_free = lrg_buf_q_ele; |
1737 | 1758 | writel(qdev->lrg_buf_q_producer_index, | |
1738 | ql_write_common_reg(qdev, | 1759 | &port_regs->CommonRegs.rxLargeQProducerIndex); |
1739 | &port_regs->CommonRegs. | ||
1740 | rxLargeQProducerIndex, | ||
1741 | qdev->lrg_buf_q_producer_index); | ||
1742 | } | 1760 | } |
1743 | } | 1761 | } |
1744 | 1762 | ||
@@ -1915,17 +1933,18 @@ static void ql_process_macip_rx_intr(struct ql3_adapter *qdev, | |||
1915 | u16 checksum = le16_to_cpu(ib_ip_rsp_ptr->checksum); | 1933 | u16 checksum = le16_to_cpu(ib_ip_rsp_ptr->checksum); |
1916 | if (checksum & | 1934 | if (checksum & |
1917 | (IB_IP_IOCB_RSP_3032_ICE | | 1935 | (IB_IP_IOCB_RSP_3032_ICE | |
1918 | IB_IP_IOCB_RSP_3032_CE | | 1936 | IB_IP_IOCB_RSP_3032_CE)) { |
1919 | IB_IP_IOCB_RSP_3032_NUC)) { | ||
1920 | printk(KERN_ERR | 1937 | printk(KERN_ERR |
1921 | "%s: Bad checksum for this %s packet, checksum = %x.\n", | 1938 | "%s: Bad checksum for this %s packet, checksum = %x.\n", |
1922 | __func__, | 1939 | __func__, |
1923 | ((checksum & | 1940 | ((checksum & |
1924 | IB_IP_IOCB_RSP_3032_TCP) ? "TCP" : | 1941 | IB_IP_IOCB_RSP_3032_TCP) ? "TCP" : |
1925 | "UDP"),checksum); | 1942 | "UDP"),checksum); |
1926 | } else if (checksum & IB_IP_IOCB_RSP_3032_TCP) { | 1943 | } else if ((checksum & IB_IP_IOCB_RSP_3032_TCP) || |
1944 | (checksum & IB_IP_IOCB_RSP_3032_UDP && | ||
1945 | !(checksum & IB_IP_IOCB_RSP_3032_NUC))) { | ||
1927 | skb2->ip_summed = CHECKSUM_UNNECESSARY; | 1946 | skb2->ip_summed = CHECKSUM_UNNECESSARY; |
1928 | } | 1947 | } |
1929 | } | 1948 | } |
1930 | skb2->dev = qdev->ndev; | 1949 | skb2->dev = qdev->ndev; |
1931 | skb2->protocol = eth_type_trans(skb2, qdev->ndev); | 1950 | skb2->protocol = eth_type_trans(skb2, qdev->ndev); |
@@ -1944,16 +1963,12 @@ static void ql_process_macip_rx_intr(struct ql3_adapter *qdev, | |||
1944 | static int ql_tx_rx_clean(struct ql3_adapter *qdev, | 1963 | static int ql_tx_rx_clean(struct ql3_adapter *qdev, |
1945 | int *tx_cleaned, int *rx_cleaned, int work_to_do) | 1964 | int *tx_cleaned, int *rx_cleaned, int work_to_do) |
1946 | { | 1965 | { |
1947 | struct ql3xxx_port_registers __iomem *port_regs = qdev->mem_map_registers; | ||
1948 | struct net_rsp_iocb *net_rsp; | 1966 | struct net_rsp_iocb *net_rsp; |
1949 | struct net_device *ndev = qdev->ndev; | 1967 | struct net_device *ndev = qdev->ndev; |
1950 | unsigned long hw_flags; | ||
1951 | int work_done = 0; | 1968 | int work_done = 0; |
1952 | 1969 | ||
1953 | u32 rsp_producer_index = le32_to_cpu(*(qdev->prsp_producer_index)); | ||
1954 | |||
1955 | /* While there are entries in the completion queue. */ | 1970 | /* While there are entries in the completion queue. */ |
1956 | while ((rsp_producer_index != | 1971 | while ((le32_to_cpu(*(qdev->prsp_producer_index)) != |
1957 | qdev->rsp_consumer_index) && (work_done < work_to_do)) { | 1972 | qdev->rsp_consumer_index) && (work_done < work_to_do)) { |
1958 | 1973 | ||
1959 | net_rsp = qdev->rsp_current; | 1974 | net_rsp = qdev->rsp_current; |
@@ -2009,33 +2024,7 @@ static int ql_tx_rx_clean(struct ql3_adapter *qdev, | |||
2009 | work_done = *tx_cleaned + *rx_cleaned; | 2024 | work_done = *tx_cleaned + *rx_cleaned; |
2010 | } | 2025 | } |
2011 | 2026 | ||
2012 | if(work_done) { | 2027 | return work_done; |
2013 | spin_lock_irqsave(&qdev->hw_lock, hw_flags); | ||
2014 | |||
2015 | ql_update_lrg_bufq_prod_index(qdev); | ||
2016 | |||
2017 | if (qdev->small_buf_release_cnt >= 16) { | ||
2018 | while (qdev->small_buf_release_cnt >= 16) { | ||
2019 | qdev->small_buf_q_producer_index++; | ||
2020 | |||
2021 | if (qdev->small_buf_q_producer_index == | ||
2022 | NUM_SBUFQ_ENTRIES) | ||
2023 | qdev->small_buf_q_producer_index = 0; | ||
2024 | qdev->small_buf_release_cnt -= 8; | ||
2025 | } | ||
2026 | |||
2027 | wmb(); | ||
2028 | ql_write_common_reg(qdev, | ||
2029 | &port_regs->CommonRegs. | ||
2030 | rxSmallQProducerIndex, | ||
2031 | qdev->small_buf_q_producer_index); | ||
2032 | |||
2033 | } | ||
2034 | |||
2035 | spin_unlock_irqrestore(&qdev->hw_lock, hw_flags); | ||
2036 | } | ||
2037 | |||
2038 | return *tx_cleaned + *rx_cleaned; | ||
2039 | } | 2028 | } |
2040 | 2029 | ||
2041 | static int ql_poll(struct net_device *ndev, int *budget) | 2030 | static int ql_poll(struct net_device *ndev, int *budget) |
@@ -2059,9 +2048,10 @@ quit_polling: | |||
2059 | netif_rx_complete(ndev); | 2048 | netif_rx_complete(ndev); |
2060 | 2049 | ||
2061 | spin_lock_irqsave(&qdev->hw_lock, hw_flags); | 2050 | spin_lock_irqsave(&qdev->hw_lock, hw_flags); |
2062 | ql_write_common_reg(qdev, | 2051 | ql_update_small_bufq_prod_index(qdev); |
2063 | &port_regs->CommonRegs.rspQConsumerIndex, | 2052 | ql_update_lrg_bufq_prod_index(qdev); |
2064 | qdev->rsp_consumer_index); | 2053 | writel(qdev->rsp_consumer_index, |
2054 | &port_regs->CommonRegs.rspQConsumerIndex); | ||
2065 | spin_unlock_irqrestore(&qdev->hw_lock, hw_flags); | 2055 | spin_unlock_irqrestore(&qdev->hw_lock, hw_flags); |
2066 | 2056 | ||
2067 | ql_enable_interrupts(qdev); | 2057 | ql_enable_interrupts(qdev); |
@@ -2217,12 +2207,7 @@ static int ql_send_map(struct ql3_adapter *qdev, | |||
2217 | int seg_cnt, seg = 0; | 2207 | int seg_cnt, seg = 0; |
2218 | int frag_cnt = (int)skb_shinfo(skb)->nr_frags; | 2208 | int frag_cnt = (int)skb_shinfo(skb)->nr_frags; |
2219 | 2209 | ||
2220 | seg_cnt = tx_cb->seg_count = ql_get_seg_count(qdev, | 2210 | seg_cnt = tx_cb->seg_count; |
2221 | (skb_shinfo(skb)->nr_frags)); | ||
2222 | if(seg_cnt == -1) { | ||
2223 | printk(KERN_ERR PFX"%s: invalid segment count!\n",__func__); | ||
2224 | return NETDEV_TX_BUSY; | ||
2225 | } | ||
2226 | /* | 2211 | /* |
2227 | * Map the skb buffer first. | 2212 | * Map the skb buffer first. |
2228 | */ | 2213 | */ |
@@ -2278,7 +2263,7 @@ static int ql_send_map(struct ql3_adapter *qdev, | |||
2278 | pci_unmap_addr_set(&tx_cb->map[seg], mapaddr, | 2263 | pci_unmap_addr_set(&tx_cb->map[seg], mapaddr, |
2279 | map); | 2264 | map); |
2280 | pci_unmap_len_set(&tx_cb->map[seg], maplen, | 2265 | pci_unmap_len_set(&tx_cb->map[seg], maplen, |
2281 | len); | 2266 | sizeof(struct oal)); |
2282 | oal_entry = (struct oal_entry *)oal; | 2267 | oal_entry = (struct oal_entry *)oal; |
2283 | oal++; | 2268 | oal++; |
2284 | seg++; | 2269 | seg++; |
@@ -2380,6 +2365,7 @@ static int ql3xxx_send(struct sk_buff *skb, struct net_device *ndev) | |||
2380 | } | 2365 | } |
2381 | 2366 | ||
2382 | mac_iocb_ptr = tx_cb->queue_entry; | 2367 | mac_iocb_ptr = tx_cb->queue_entry; |
2368 | memset((void *)mac_iocb_ptr, 0, sizeof(struct ob_mac_iocb_req)); | ||
2383 | mac_iocb_ptr->opcode = qdev->mac_ob_opcode; | 2369 | mac_iocb_ptr->opcode = qdev->mac_ob_opcode; |
2384 | mac_iocb_ptr->flags = OB_MAC_IOCB_REQ_X; | 2370 | mac_iocb_ptr->flags = OB_MAC_IOCB_REQ_X; |
2385 | mac_iocb_ptr->flags |= qdev->mb_bit_mask; | 2371 | mac_iocb_ptr->flags |= qdev->mb_bit_mask; |
@@ -3054,15 +3040,6 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev) | |||
3054 | goto out; | 3040 | goto out; |
3055 | } | 3041 | } |
3056 | 3042 | ||
3057 | if (qdev->mac_index) | ||
3058 | ql_write_page0_reg(qdev, | ||
3059 | &port_regs->mac1MaxFrameLengthReg, | ||
3060 | qdev->max_frame_size); | ||
3061 | else | ||
3062 | ql_write_page0_reg(qdev, | ||
3063 | &port_regs->mac0MaxFrameLengthReg, | ||
3064 | qdev->max_frame_size); | ||
3065 | |||
3066 | value = qdev->nvram_data.tcpMaxWindowSize; | 3043 | value = qdev->nvram_data.tcpMaxWindowSize; |
3067 | ql_write_page0_reg(qdev, &port_regs->tcpMaxWindow, value); | 3044 | ql_write_page0_reg(qdev, &port_regs->tcpMaxWindow, value); |
3068 | 3045 | ||
@@ -3082,6 +3059,14 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev) | |||
3082 | ql_sem_unlock(qdev, QL_FLASH_SEM_MASK); | 3059 | ql_sem_unlock(qdev, QL_FLASH_SEM_MASK); |
3083 | } | 3060 | } |
3084 | 3061 | ||
3062 | if (qdev->mac_index) | ||
3063 | ql_write_page0_reg(qdev, | ||
3064 | &port_regs->mac1MaxFrameLengthReg, | ||
3065 | qdev->max_frame_size); | ||
3066 | else | ||
3067 | ql_write_page0_reg(qdev, | ||
3068 | &port_regs->mac0MaxFrameLengthReg, | ||
3069 | qdev->max_frame_size); | ||
3085 | 3070 | ||
3086 | if(ql_sem_spinlock(qdev, QL_PHY_GIO_SEM_MASK, | 3071 | if(ql_sem_spinlock(qdev, QL_PHY_GIO_SEM_MASK, |
3087 | (QL_RESOURCE_BITS_BASE_CODE | (qdev->mac_index) * | 3072 | (QL_RESOURCE_BITS_BASE_CODE | (qdev->mac_index) * |
@@ -3152,7 +3137,8 @@ static int ql_adapter_initialize(struct ql3_adapter *qdev) | |||
3152 | if (qdev->device_id == QL3032_DEVICE_ID) { | 3137 | if (qdev->device_id == QL3032_DEVICE_ID) { |
3153 | value = | 3138 | value = |
3154 | (QL3032_PORT_CONTROL_EF | QL3032_PORT_CONTROL_KIE | | 3139 | (QL3032_PORT_CONTROL_EF | QL3032_PORT_CONTROL_KIE | |
3155 | QL3032_PORT_CONTROL_EIv6 | QL3032_PORT_CONTROL_EIv4); | 3140 | QL3032_PORT_CONTROL_EIv6 | QL3032_PORT_CONTROL_EIv4 | |
3141 | QL3032_PORT_CONTROL_ET); | ||
3156 | ql_write_page0_reg(qdev, &port_regs->functionControl, | 3142 | ql_write_page0_reg(qdev, &port_regs->functionControl, |
3157 | ((value << 16) | value)); | 3143 | ((value << 16) | value)); |
3158 | } else { | 3144 | } else { |
diff --git a/drivers/net/qla3xxx.h b/drivers/net/qla3xxx.h index 34cd6580fd07..0203f88f0544 100755 --- a/drivers/net/qla3xxx.h +++ b/drivers/net/qla3xxx.h | |||
@@ -1014,8 +1014,7 @@ struct eeprom_data { | |||
1014 | 1014 | ||
1015 | /* Transmit and Receive Buffers */ | 1015 | /* Transmit and Receive Buffers */ |
1016 | #define NUM_LBUFQ_ENTRIES 128 | 1016 | #define NUM_LBUFQ_ENTRIES 128 |
1017 | #define JUMBO_NUM_LBUFQ_ENTRIES \ | 1017 | #define JUMBO_NUM_LBUFQ_ENTRIES 32 |
1018 | (NUM_LBUFQ_ENTRIES/(JUMBO_MTU_SIZE/NORMAL_MTU_SIZE)) | ||
1019 | #define NUM_SBUFQ_ENTRIES 64 | 1018 | #define NUM_SBUFQ_ENTRIES 64 |
1020 | #define QL_SMALL_BUFFER_SIZE 32 | 1019 | #define QL_SMALL_BUFFER_SIZE 32 |
1021 | #define QL_ADDR_ELE_PER_BUFQ_ENTRY \ | 1020 | #define QL_ADDR_ELE_PER_BUFQ_ENTRY \ |
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 521b5f0618a4..6a77b8a92245 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
@@ -66,6 +66,7 @@ VERSION 2.2LK <2005/01/25> | |||
66 | #include <linux/init.h> | 66 | #include <linux/init.h> |
67 | #include <linux/dma-mapping.h> | 67 | #include <linux/dma-mapping.h> |
68 | 68 | ||
69 | #include <asm/system.h> | ||
69 | #include <asm/io.h> | 70 | #include <asm/io.h> |
70 | #include <asm/irq.h> | 71 | #include <asm/irq.h> |
71 | 72 | ||
@@ -486,6 +487,7 @@ static int rtl8169_rx_interrupt(struct net_device *, struct rtl8169_private *, | |||
486 | void __iomem *); | 487 | void __iomem *); |
487 | static int rtl8169_change_mtu(struct net_device *dev, int new_mtu); | 488 | static int rtl8169_change_mtu(struct net_device *dev, int new_mtu); |
488 | static void rtl8169_down(struct net_device *dev); | 489 | static void rtl8169_down(struct net_device *dev); |
490 | static void rtl8169_rx_clear(struct rtl8169_private *tp); | ||
489 | 491 | ||
490 | #ifdef CONFIG_R8169_NAPI | 492 | #ifdef CONFIG_R8169_NAPI |
491 | static int rtl8169_poll(struct net_device *dev, int *budget); | 493 | static int rtl8169_poll(struct net_device *dev, int *budget); |
@@ -1751,16 +1753,10 @@ static int rtl8169_open(struct net_device *dev) | |||
1751 | { | 1753 | { |
1752 | struct rtl8169_private *tp = netdev_priv(dev); | 1754 | struct rtl8169_private *tp = netdev_priv(dev); |
1753 | struct pci_dev *pdev = tp->pci_dev; | 1755 | struct pci_dev *pdev = tp->pci_dev; |
1754 | int retval; | 1756 | int retval = -ENOMEM; |
1755 | 1757 | ||
1756 | rtl8169_set_rxbufsize(tp, dev); | ||
1757 | |||
1758 | retval = | ||
1759 | request_irq(dev->irq, rtl8169_interrupt, IRQF_SHARED, dev->name, dev); | ||
1760 | if (retval < 0) | ||
1761 | goto out; | ||
1762 | 1758 | ||
1763 | retval = -ENOMEM; | 1759 | rtl8169_set_rxbufsize(tp, dev); |
1764 | 1760 | ||
1765 | /* | 1761 | /* |
1766 | * Rx and Tx desscriptors needs 256 bytes alignment. | 1762 | * Rx and Tx desscriptors needs 256 bytes alignment. |
@@ -1769,19 +1765,26 @@ static int rtl8169_open(struct net_device *dev) | |||
1769 | tp->TxDescArray = pci_alloc_consistent(pdev, R8169_TX_RING_BYTES, | 1765 | tp->TxDescArray = pci_alloc_consistent(pdev, R8169_TX_RING_BYTES, |
1770 | &tp->TxPhyAddr); | 1766 | &tp->TxPhyAddr); |
1771 | if (!tp->TxDescArray) | 1767 | if (!tp->TxDescArray) |
1772 | goto err_free_irq; | 1768 | goto out; |
1773 | 1769 | ||
1774 | tp->RxDescArray = pci_alloc_consistent(pdev, R8169_RX_RING_BYTES, | 1770 | tp->RxDescArray = pci_alloc_consistent(pdev, R8169_RX_RING_BYTES, |
1775 | &tp->RxPhyAddr); | 1771 | &tp->RxPhyAddr); |
1776 | if (!tp->RxDescArray) | 1772 | if (!tp->RxDescArray) |
1777 | goto err_free_tx; | 1773 | goto err_free_tx_0; |
1778 | 1774 | ||
1779 | retval = rtl8169_init_ring(dev); | 1775 | retval = rtl8169_init_ring(dev); |
1780 | if (retval < 0) | 1776 | if (retval < 0) |
1781 | goto err_free_rx; | 1777 | goto err_free_rx_1; |
1782 | 1778 | ||
1783 | INIT_DELAYED_WORK(&tp->task, NULL); | 1779 | INIT_DELAYED_WORK(&tp->task, NULL); |
1784 | 1780 | ||
1781 | smp_mb(); | ||
1782 | |||
1783 | retval = request_irq(dev->irq, rtl8169_interrupt, IRQF_SHARED, | ||
1784 | dev->name, dev); | ||
1785 | if (retval < 0) | ||
1786 | goto err_release_ring_2; | ||
1787 | |||
1785 | rtl8169_hw_start(dev); | 1788 | rtl8169_hw_start(dev); |
1786 | 1789 | ||
1787 | rtl8169_request_timer(dev); | 1790 | rtl8169_request_timer(dev); |
@@ -1790,14 +1793,14 @@ static int rtl8169_open(struct net_device *dev) | |||
1790 | out: | 1793 | out: |
1791 | return retval; | 1794 | return retval; |
1792 | 1795 | ||
1793 | err_free_rx: | 1796 | err_release_ring_2: |
1797 | rtl8169_rx_clear(tp); | ||
1798 | err_free_rx_1: | ||
1794 | pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray, | 1799 | pci_free_consistent(pdev, R8169_RX_RING_BYTES, tp->RxDescArray, |
1795 | tp->RxPhyAddr); | 1800 | tp->RxPhyAddr); |
1796 | err_free_tx: | 1801 | err_free_tx_0: |
1797 | pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray, | 1802 | pci_free_consistent(pdev, R8169_TX_RING_BYTES, tp->TxDescArray, |
1798 | tp->TxPhyAddr); | 1803 | tp->TxPhyAddr); |
1799 | err_free_irq: | ||
1800 | free_irq(dev->irq, dev); | ||
1801 | goto out; | 1804 | goto out; |
1802 | } | 1805 | } |
1803 | 1806 | ||
@@ -2887,7 +2890,7 @@ static int rtl8169_suspend(struct pci_dev *pdev, pm_message_t state) | |||
2887 | void __iomem *ioaddr = tp->mmio_addr; | 2890 | void __iomem *ioaddr = tp->mmio_addr; |
2888 | 2891 | ||
2889 | if (!netif_running(dev)) | 2892 | if (!netif_running(dev)) |
2890 | goto out; | 2893 | goto out_pci_suspend; |
2891 | 2894 | ||
2892 | netif_device_detach(dev); | 2895 | netif_device_detach(dev); |
2893 | netif_stop_queue(dev); | 2896 | netif_stop_queue(dev); |
@@ -2901,10 +2904,11 @@ static int rtl8169_suspend(struct pci_dev *pdev, pm_message_t state) | |||
2901 | 2904 | ||
2902 | spin_unlock_irq(&tp->lock); | 2905 | spin_unlock_irq(&tp->lock); |
2903 | 2906 | ||
2907 | out_pci_suspend: | ||
2904 | pci_save_state(pdev); | 2908 | pci_save_state(pdev); |
2905 | pci_enable_wake(pdev, pci_choose_state(pdev, state), tp->wol_enabled); | 2909 | pci_enable_wake(pdev, pci_choose_state(pdev, state), tp->wol_enabled); |
2906 | pci_set_power_state(pdev, pci_choose_state(pdev, state)); | 2910 | pci_set_power_state(pdev, pci_choose_state(pdev, state)); |
2907 | out: | 2911 | |
2908 | return 0; | 2912 | return 0; |
2909 | } | 2913 | } |
2910 | 2914 | ||
@@ -2912,15 +2916,15 @@ static int rtl8169_resume(struct pci_dev *pdev) | |||
2912 | { | 2916 | { |
2913 | struct net_device *dev = pci_get_drvdata(pdev); | 2917 | struct net_device *dev = pci_get_drvdata(pdev); |
2914 | 2918 | ||
2919 | pci_set_power_state(pdev, PCI_D0); | ||
2920 | pci_restore_state(pdev); | ||
2921 | pci_enable_wake(pdev, PCI_D0, 0); | ||
2922 | |||
2915 | if (!netif_running(dev)) | 2923 | if (!netif_running(dev)) |
2916 | goto out; | 2924 | goto out; |
2917 | 2925 | ||
2918 | netif_device_attach(dev); | 2926 | netif_device_attach(dev); |
2919 | 2927 | ||
2920 | pci_set_power_state(pdev, PCI_D0); | ||
2921 | pci_restore_state(pdev); | ||
2922 | pci_enable_wake(pdev, PCI_D0, 0); | ||
2923 | |||
2924 | rtl8169_schedule_work(dev, rtl8169_reset_task); | 2928 | rtl8169_schedule_work(dev, rtl8169_reset_task); |
2925 | out: | 2929 | out: |
2926 | return 0; | 2930 | return 0; |
diff --git a/drivers/net/sc92031.c b/drivers/net/sc92031.c index 4a926f20b6ea..c32c21af3fdd 100644 --- a/drivers/net/sc92031.c +++ b/drivers/net/sc92031.c | |||
@@ -964,7 +964,7 @@ static int sc92031_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
964 | goto out; | 964 | goto out; |
965 | } | 965 | } |
966 | 966 | ||
967 | spin_lock_bh(&priv->lock); | 967 | spin_lock(&priv->lock); |
968 | 968 | ||
969 | if (unlikely(!netif_carrier_ok(dev))) { | 969 | if (unlikely(!netif_carrier_ok(dev))) { |
970 | err = -ENOLINK; | 970 | err = -ENOLINK; |
@@ -1005,7 +1005,7 @@ static int sc92031_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1005 | netif_stop_queue(dev); | 1005 | netif_stop_queue(dev); |
1006 | 1006 | ||
1007 | out_unlock: | 1007 | out_unlock: |
1008 | spin_unlock_bh(&priv->lock); | 1008 | spin_unlock(&priv->lock); |
1009 | 1009 | ||
1010 | out: | 1010 | out: |
1011 | dev_kfree_skb(skb); | 1011 | dev_kfree_skb(skb); |
@@ -1042,12 +1042,12 @@ static int sc92031_open(struct net_device *dev) | |||
1042 | priv->pm_config = 0; | 1042 | priv->pm_config = 0; |
1043 | 1043 | ||
1044 | /* Interrupts already disabled by sc92031_stop or sc92031_probe */ | 1044 | /* Interrupts already disabled by sc92031_stop or sc92031_probe */ |
1045 | spin_lock(&priv->lock); | 1045 | spin_lock_bh(&priv->lock); |
1046 | 1046 | ||
1047 | _sc92031_reset(dev); | 1047 | _sc92031_reset(dev); |
1048 | mmiowb(); | 1048 | mmiowb(); |
1049 | 1049 | ||
1050 | spin_unlock(&priv->lock); | 1050 | spin_unlock_bh(&priv->lock); |
1051 | sc92031_enable_interrupts(dev); | 1051 | sc92031_enable_interrupts(dev); |
1052 | 1052 | ||
1053 | if (netif_carrier_ok(dev)) | 1053 | if (netif_carrier_ok(dev)) |
@@ -1077,13 +1077,13 @@ static int sc92031_stop(struct net_device *dev) | |||
1077 | /* Disable interrupts, stop Tx and Rx. */ | 1077 | /* Disable interrupts, stop Tx and Rx. */ |
1078 | sc92031_disable_interrupts(dev); | 1078 | sc92031_disable_interrupts(dev); |
1079 | 1079 | ||
1080 | spin_lock(&priv->lock); | 1080 | spin_lock_bh(&priv->lock); |
1081 | 1081 | ||
1082 | _sc92031_disable_tx_rx(dev); | 1082 | _sc92031_disable_tx_rx(dev); |
1083 | _sc92031_tx_clear(dev); | 1083 | _sc92031_tx_clear(dev); |
1084 | mmiowb(); | 1084 | mmiowb(); |
1085 | 1085 | ||
1086 | spin_unlock(&priv->lock); | 1086 | spin_unlock_bh(&priv->lock); |
1087 | 1087 | ||
1088 | free_irq(pdev->irq, dev); | 1088 | free_irq(pdev->irq, dev); |
1089 | pci_free_consistent(pdev, TX_BUF_TOT_LEN, priv->tx_bufs, | 1089 | pci_free_consistent(pdev, TX_BUF_TOT_LEN, priv->tx_bufs, |
@@ -1539,13 +1539,13 @@ static int sc92031_suspend(struct pci_dev *pdev, pm_message_t state) | |||
1539 | /* Disable interrupts, stop Tx and Rx. */ | 1539 | /* Disable interrupts, stop Tx and Rx. */ |
1540 | sc92031_disable_interrupts(dev); | 1540 | sc92031_disable_interrupts(dev); |
1541 | 1541 | ||
1542 | spin_lock(&priv->lock); | 1542 | spin_lock_bh(&priv->lock); |
1543 | 1543 | ||
1544 | _sc92031_disable_tx_rx(dev); | 1544 | _sc92031_disable_tx_rx(dev); |
1545 | _sc92031_tx_clear(dev); | 1545 | _sc92031_tx_clear(dev); |
1546 | mmiowb(); | 1546 | mmiowb(); |
1547 | 1547 | ||
1548 | spin_unlock(&priv->lock); | 1548 | spin_unlock_bh(&priv->lock); |
1549 | 1549 | ||
1550 | out: | 1550 | out: |
1551 | pci_set_power_state(pdev, pci_choose_state(pdev, state)); | 1551 | pci_set_power_state(pdev, pci_choose_state(pdev, state)); |
@@ -1565,12 +1565,12 @@ static int sc92031_resume(struct pci_dev *pdev) | |||
1565 | goto out; | 1565 | goto out; |
1566 | 1566 | ||
1567 | /* Interrupts already disabled by sc92031_suspend */ | 1567 | /* Interrupts already disabled by sc92031_suspend */ |
1568 | spin_lock(&priv->lock); | 1568 | spin_lock_bh(&priv->lock); |
1569 | 1569 | ||
1570 | _sc92031_reset(dev); | 1570 | _sc92031_reset(dev); |
1571 | mmiowb(); | 1571 | mmiowb(); |
1572 | 1572 | ||
1573 | spin_unlock(&priv->lock); | 1573 | spin_unlock_bh(&priv->lock); |
1574 | sc92031_enable_interrupts(dev); | 1574 | sc92031_enable_interrupts(dev); |
1575 | 1575 | ||
1576 | netif_device_attach(dev); | 1576 | netif_device_attach(dev); |
diff --git a/drivers/net/sis190.c b/drivers/net/sis190.c index b08508b35833..34463ce6f132 100644 --- a/drivers/net/sis190.c +++ b/drivers/net/sis190.c | |||
@@ -324,6 +324,7 @@ static struct mii_chip_info { | |||
324 | u32 feature; | 324 | u32 feature; |
325 | } mii_chip_table[] = { | 325 | } mii_chip_table[] = { |
326 | { "Broadcom PHY BCM5461", { 0x0020, 0x60c0 }, LAN, F_PHY_BCM5461 }, | 326 | { "Broadcom PHY BCM5461", { 0x0020, 0x60c0 }, LAN, F_PHY_BCM5461 }, |
327 | { "Broadcom PHY AC131", { 0x0143, 0xbc70 }, LAN, 0 }, | ||
327 | { "Agere PHY ET1101B", { 0x0282, 0xf010 }, LAN, 0 }, | 328 | { "Agere PHY ET1101B", { 0x0282, 0xf010 }, LAN, 0 }, |
328 | { "Marvell PHY 88E1111", { 0x0141, 0x0cc0 }, LAN, F_PHY_88E1111 }, | 329 | { "Marvell PHY 88E1111", { 0x0141, 0x0cc0 }, LAN, F_PHY_88E1111 }, |
329 | { "Realtek PHY RTL8201", { 0x0000, 0x8200 }, LAN, 0 }, | 330 | { "Realtek PHY RTL8201", { 0x0000, 0x8200 }, LAN, 0 }, |
diff --git a/drivers/net/sun3lance.c b/drivers/net/sun3lance.c index c62e85d89f41..7bee45b42a2c 100644 --- a/drivers/net/sun3lance.c +++ b/drivers/net/sun3lance.c | |||
@@ -336,13 +336,27 @@ static int __init lance_probe( struct net_device *dev) | |||
336 | 336 | ||
337 | /* XXX - leak? */ | 337 | /* XXX - leak? */ |
338 | MEM = dvma_malloc_align(sizeof(struct lance_memory), 0x10000); | 338 | MEM = dvma_malloc_align(sizeof(struct lance_memory), 0x10000); |
339 | if (MEM == NULL) { | ||
340 | #ifdef CONFIG_SUN3 | ||
341 | iounmap((void __iomem *)ioaddr); | ||
342 | #endif | ||
343 | printk(KERN_WARNING "SUN3 Lance couldn't allocate DVMA memory\n"); | ||
344 | return 0; | ||
345 | } | ||
339 | 346 | ||
340 | lp->iobase = (volatile unsigned short *)ioaddr; | 347 | lp->iobase = (volatile unsigned short *)ioaddr; |
341 | dev->base_addr = (unsigned long)ioaddr; /* informational only */ | 348 | dev->base_addr = (unsigned long)ioaddr; /* informational only */ |
342 | 349 | ||
343 | REGA(CSR0) = CSR0_STOP; | 350 | REGA(CSR0) = CSR0_STOP; |
344 | 351 | ||
345 | request_irq(LANCE_IRQ, lance_interrupt, IRQF_DISABLED, "SUN3 Lance", dev); | 352 | if (request_irq(LANCE_IRQ, lance_interrupt, IRQF_DISABLED, "SUN3 Lance", dev) < 0) { |
353 | #ifdef CONFIG_SUN3 | ||
354 | iounmap((void __iomem *)ioaddr); | ||
355 | #endif | ||
356 | dvma_free((void *)MEM); | ||
357 | printk(KERN_WARNING "SUN3 Lance unable to allocate IRQ\n"); | ||
358 | return 0; | ||
359 | } | ||
346 | dev->irq = (unsigned short)LANCE_IRQ; | 360 | dev->irq = (unsigned short)LANCE_IRQ; |
347 | 361 | ||
348 | 362 | ||
diff --git a/drivers/net/sungem.c b/drivers/net/sungem.c index 616be8d0fa85..08ea61db46fe 100644 --- a/drivers/net/sungem.c +++ b/drivers/net/sungem.c | |||
@@ -2530,6 +2530,35 @@ static struct net_device_stats *gem_get_stats(struct net_device *dev) | |||
2530 | return &gp->net_stats; | 2530 | return &gp->net_stats; |
2531 | } | 2531 | } |
2532 | 2532 | ||
2533 | static int gem_set_mac_address(struct net_device *dev, void *addr) | ||
2534 | { | ||
2535 | struct sockaddr *macaddr = (struct sockaddr *) addr; | ||
2536 | struct gem *gp = dev->priv; | ||
2537 | unsigned char *e = &dev->dev_addr[0]; | ||
2538 | |||
2539 | if (!is_valid_ether_addr(macaddr->sa_data)) | ||
2540 | return -EADDRNOTAVAIL; | ||
2541 | |||
2542 | if (!netif_running(dev) || !netif_device_present(dev)) { | ||
2543 | /* We'll just catch it later when the | ||
2544 | * device is up'd or resumed. | ||
2545 | */ | ||
2546 | memcpy(dev->dev_addr, macaddr->sa_data, dev->addr_len); | ||
2547 | return 0; | ||
2548 | } | ||
2549 | |||
2550 | mutex_lock(&gp->pm_mutex); | ||
2551 | memcpy(dev->dev_addr, macaddr->sa_data, dev->addr_len); | ||
2552 | if (gp->running) { | ||
2553 | writel((e[4] << 8) | e[5], gp->regs + MAC_ADDR0); | ||
2554 | writel((e[2] << 8) | e[3], gp->regs + MAC_ADDR1); | ||
2555 | writel((e[0] << 8) | e[1], gp->regs + MAC_ADDR2); | ||
2556 | } | ||
2557 | mutex_unlock(&gp->pm_mutex); | ||
2558 | |||
2559 | return 0; | ||
2560 | } | ||
2561 | |||
2533 | static void gem_set_multicast(struct net_device *dev) | 2562 | static void gem_set_multicast(struct net_device *dev) |
2534 | { | 2563 | { |
2535 | struct gem *gp = dev->priv; | 2564 | struct gem *gp = dev->priv; |
@@ -3122,6 +3151,7 @@ static int __devinit gem_init_one(struct pci_dev *pdev, | |||
3122 | dev->change_mtu = gem_change_mtu; | 3151 | dev->change_mtu = gem_change_mtu; |
3123 | dev->irq = pdev->irq; | 3152 | dev->irq = pdev->irq; |
3124 | dev->dma = 0; | 3153 | dev->dma = 0; |
3154 | dev->set_mac_address = gem_set_mac_address; | ||
3125 | #ifdef CONFIG_NET_POLL_CONTROLLER | 3155 | #ifdef CONFIG_NET_POLL_CONTROLLER |
3126 | dev->poll_controller = gem_poll_controller; | 3156 | dev->poll_controller = gem_poll_controller; |
3127 | #endif | 3157 | #endif |
diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c index 8c8f9f4d47a5..256969e1300c 100644 --- a/drivers/net/tg3.c +++ b/drivers/net/tg3.c | |||
@@ -64,8 +64,8 @@ | |||
64 | 64 | ||
65 | #define DRV_MODULE_NAME "tg3" | 65 | #define DRV_MODULE_NAME "tg3" |
66 | #define PFX DRV_MODULE_NAME ": " | 66 | #define PFX DRV_MODULE_NAME ": " |
67 | #define DRV_MODULE_VERSION "3.74" | 67 | #define DRV_MODULE_VERSION "3.75" |
68 | #define DRV_MODULE_RELDATE "February 20, 2007" | 68 | #define DRV_MODULE_RELDATE "March 23, 2007" |
69 | 69 | ||
70 | #define TG3_DEF_MAC_MODE 0 | 70 | #define TG3_DEF_MAC_MODE 0 |
71 | #define TG3_DEF_RX_MODE 0 | 71 | #define TG3_DEF_RX_MODE 0 |
@@ -3568,32 +3568,34 @@ static irqreturn_t tg3_interrupt(int irq, void *dev_id) | |||
3568 | * Reading the PCI State register will confirm whether the | 3568 | * Reading the PCI State register will confirm whether the |
3569 | * interrupt is ours and will flush the status block. | 3569 | * interrupt is ours and will flush the status block. |
3570 | */ | 3570 | */ |
3571 | if ((sblk->status & SD_STATUS_UPDATED) || | 3571 | if (unlikely(!(sblk->status & SD_STATUS_UPDATED))) { |
3572 | !(tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) { | 3572 | if ((tp->tg3_flags & TG3_FLAG_CHIP_RESETTING) || |
3573 | /* | 3573 | (tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) { |
3574 | * Writing any value to intr-mbox-0 clears PCI INTA# and | 3574 | handled = 0; |
3575 | * chip-internal interrupt pending events. | ||
3576 | * Writing non-zero to intr-mbox-0 additional tells the | ||
3577 | * NIC to stop sending us irqs, engaging "in-intr-handler" | ||
3578 | * event coalescing. | ||
3579 | */ | ||
3580 | tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, | ||
3581 | 0x00000001); | ||
3582 | if (tg3_irq_sync(tp)) | ||
3583 | goto out; | 3575 | goto out; |
3584 | sblk->status &= ~SD_STATUS_UPDATED; | ||
3585 | if (likely(tg3_has_work(tp))) { | ||
3586 | prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); | ||
3587 | netif_rx_schedule(dev); /* schedule NAPI poll */ | ||
3588 | } else { | ||
3589 | /* No work, shared interrupt perhaps? re-enable | ||
3590 | * interrupts, and flush that PCI write | ||
3591 | */ | ||
3592 | tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, | ||
3593 | 0x00000000); | ||
3594 | } | 3576 | } |
3595 | } else { /* shared interrupt */ | 3577 | } |
3596 | handled = 0; | 3578 | |
3579 | /* | ||
3580 | * Writing any value to intr-mbox-0 clears PCI INTA# and | ||
3581 | * chip-internal interrupt pending events. | ||
3582 | * Writing non-zero to intr-mbox-0 additional tells the | ||
3583 | * NIC to stop sending us irqs, engaging "in-intr-handler" | ||
3584 | * event coalescing. | ||
3585 | */ | ||
3586 | tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001); | ||
3587 | if (tg3_irq_sync(tp)) | ||
3588 | goto out; | ||
3589 | sblk->status &= ~SD_STATUS_UPDATED; | ||
3590 | if (likely(tg3_has_work(tp))) { | ||
3591 | prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); | ||
3592 | netif_rx_schedule(dev); /* schedule NAPI poll */ | ||
3593 | } else { | ||
3594 | /* No work, shared interrupt perhaps? re-enable | ||
3595 | * interrupts, and flush that PCI write | ||
3596 | */ | ||
3597 | tw32_mailbox_f(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, | ||
3598 | 0x00000000); | ||
3597 | } | 3599 | } |
3598 | out: | 3600 | out: |
3599 | return IRQ_RETVAL(handled); | 3601 | return IRQ_RETVAL(handled); |
@@ -3611,31 +3613,33 @@ static irqreturn_t tg3_interrupt_tagged(int irq, void *dev_id) | |||
3611 | * Reading the PCI State register will confirm whether the | 3613 | * Reading the PCI State register will confirm whether the |
3612 | * interrupt is ours and will flush the status block. | 3614 | * interrupt is ours and will flush the status block. |
3613 | */ | 3615 | */ |
3614 | if ((sblk->status_tag != tp->last_tag) || | 3616 | if (unlikely(sblk->status_tag == tp->last_tag)) { |
3615 | !(tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) { | 3617 | if ((tp->tg3_flags & TG3_FLAG_CHIP_RESETTING) || |
3616 | /* | 3618 | (tr32(TG3PCI_PCISTATE) & PCISTATE_INT_NOT_ACTIVE)) { |
3617 | * writing any value to intr-mbox-0 clears PCI INTA# and | 3619 | handled = 0; |
3618 | * chip-internal interrupt pending events. | ||
3619 | * writing non-zero to intr-mbox-0 additional tells the | ||
3620 | * NIC to stop sending us irqs, engaging "in-intr-handler" | ||
3621 | * event coalescing. | ||
3622 | */ | ||
3623 | tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, | ||
3624 | 0x00000001); | ||
3625 | if (tg3_irq_sync(tp)) | ||
3626 | goto out; | 3620 | goto out; |
3627 | if (netif_rx_schedule_prep(dev)) { | ||
3628 | prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); | ||
3629 | /* Update last_tag to mark that this status has been | ||
3630 | * seen. Because interrupt may be shared, we may be | ||
3631 | * racing with tg3_poll(), so only update last_tag | ||
3632 | * if tg3_poll() is not scheduled. | ||
3633 | */ | ||
3634 | tp->last_tag = sblk->status_tag; | ||
3635 | __netif_rx_schedule(dev); | ||
3636 | } | 3621 | } |
3637 | } else { /* shared interrupt */ | 3622 | } |
3638 | handled = 0; | 3623 | |
3624 | /* | ||
3625 | * writing any value to intr-mbox-0 clears PCI INTA# and | ||
3626 | * chip-internal interrupt pending events. | ||
3627 | * writing non-zero to intr-mbox-0 additional tells the | ||
3628 | * NIC to stop sending us irqs, engaging "in-intr-handler" | ||
3629 | * event coalescing. | ||
3630 | */ | ||
3631 | tw32_mailbox(MAILBOX_INTERRUPT_0 + TG3_64BIT_REG_LOW, 0x00000001); | ||
3632 | if (tg3_irq_sync(tp)) | ||
3633 | goto out; | ||
3634 | if (netif_rx_schedule_prep(dev)) { | ||
3635 | prefetch(&tp->rx_rcb[tp->rx_rcb_ptr]); | ||
3636 | /* Update last_tag to mark that this status has been | ||
3637 | * seen. Because interrupt may be shared, we may be | ||
3638 | * racing with tg3_poll(), so only update last_tag | ||
3639 | * if tg3_poll() is not scheduled. | ||
3640 | */ | ||
3641 | tp->last_tag = sblk->status_tag; | ||
3642 | __netif_rx_schedule(dev); | ||
3639 | } | 3643 | } |
3640 | out: | 3644 | out: |
3641 | return IRQ_RETVAL(handled); | 3645 | return IRQ_RETVAL(handled); |
@@ -4823,6 +4827,21 @@ static int tg3_chip_reset(struct tg3 *tp) | |||
4823 | if (write_op == tg3_write_flush_reg32) | 4827 | if (write_op == tg3_write_flush_reg32) |
4824 | tp->write32 = tg3_write32; | 4828 | tp->write32 = tg3_write32; |
4825 | 4829 | ||
4830 | /* Prevent the irq handler from reading or writing PCI registers | ||
4831 | * during chip reset when the memory enable bit in the PCI command | ||
4832 | * register may be cleared. The chip does not generate interrupt | ||
4833 | * at this time, but the irq handler may still be called due to irq | ||
4834 | * sharing or irqpoll. | ||
4835 | */ | ||
4836 | tp->tg3_flags |= TG3_FLAG_CHIP_RESETTING; | ||
4837 | if (tp->hw_status) { | ||
4838 | tp->hw_status->status = 0; | ||
4839 | tp->hw_status->status_tag = 0; | ||
4840 | } | ||
4841 | tp->last_tag = 0; | ||
4842 | smp_mb(); | ||
4843 | synchronize_irq(tp->pdev->irq); | ||
4844 | |||
4826 | /* do the reset */ | 4845 | /* do the reset */ |
4827 | val = GRC_MISC_CFG_CORECLK_RESET; | 4846 | val = GRC_MISC_CFG_CORECLK_RESET; |
4828 | 4847 | ||
@@ -4904,6 +4923,8 @@ static int tg3_chip_reset(struct tg3 *tp) | |||
4904 | 4923 | ||
4905 | pci_restore_state(tp->pdev); | 4924 | pci_restore_state(tp->pdev); |
4906 | 4925 | ||
4926 | tp->tg3_flags &= ~TG3_FLAG_CHIP_RESETTING; | ||
4927 | |||
4907 | /* Make sure PCI-X relaxed ordering bit is clear. */ | 4928 | /* Make sure PCI-X relaxed ordering bit is clear. */ |
4908 | pci_read_config_dword(tp->pdev, TG3PCI_X_CAPS, &val); | 4929 | pci_read_config_dword(tp->pdev, TG3PCI_X_CAPS, &val); |
4909 | val &= ~PCIX_CAPS_RELAXED_ORDERING; | 4930 | val &= ~PCIX_CAPS_RELAXED_ORDERING; |
@@ -6321,8 +6342,6 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) | |||
6321 | RDMAC_MODE_ADDROFLOW_ENAB | RDMAC_MODE_FIFOOFLOW_ENAB | | 6342 | RDMAC_MODE_ADDROFLOW_ENAB | RDMAC_MODE_FIFOOFLOW_ENAB | |
6322 | RDMAC_MODE_FIFOURUN_ENAB | RDMAC_MODE_FIFOOREAD_ENAB | | 6343 | RDMAC_MODE_FIFOURUN_ENAB | RDMAC_MODE_FIFOOREAD_ENAB | |
6323 | RDMAC_MODE_LNGREAD_ENAB); | 6344 | RDMAC_MODE_LNGREAD_ENAB); |
6324 | if (tp->tg3_flags & TG3_FLAG_SPLIT_MODE) | ||
6325 | rdmac_mode |= RDMAC_MODE_SPLIT_ENABLE; | ||
6326 | 6345 | ||
6327 | /* If statement applies to 5705 and 5750 PCI devices only */ | 6346 | /* If statement applies to 5705 and 5750 PCI devices only */ |
6328 | if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 && | 6347 | if ((GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 && |
@@ -6495,9 +6514,6 @@ static int tg3_reset_hw(struct tg3 *tp, int reset_phy) | |||
6495 | } else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) { | 6514 | } else if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704) { |
6496 | val &= ~(PCIX_CAPS_SPLIT_MASK | PCIX_CAPS_BURST_MASK); | 6515 | val &= ~(PCIX_CAPS_SPLIT_MASK | PCIX_CAPS_BURST_MASK); |
6497 | val |= (PCIX_CAPS_MAX_BURST_CPIOB << PCIX_CAPS_BURST_SHIFT); | 6516 | val |= (PCIX_CAPS_MAX_BURST_CPIOB << PCIX_CAPS_BURST_SHIFT); |
6498 | if (tp->tg3_flags & TG3_FLAG_SPLIT_MODE) | ||
6499 | val |= (tp->split_mode_max_reqs << | ||
6500 | PCIX_CAPS_SPLIT_SHIFT); | ||
6501 | } | 6517 | } |
6502 | tw32(TG3PCI_X_CAPS, val); | 6518 | tw32(TG3PCI_X_CAPS, val); |
6503 | } | 6519 | } |
@@ -10863,14 +10879,6 @@ static int __devinit tg3_get_invariants(struct tg3 *tp) | |||
10863 | grc_misc_cfg = tr32(GRC_MISC_CFG); | 10879 | grc_misc_cfg = tr32(GRC_MISC_CFG); |
10864 | grc_misc_cfg &= GRC_MISC_CFG_BOARD_ID_MASK; | 10880 | grc_misc_cfg &= GRC_MISC_CFG_BOARD_ID_MASK; |
10865 | 10881 | ||
10866 | /* Broadcom's driver says that CIOBE multisplit has a bug */ | ||
10867 | #if 0 | ||
10868 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5704 && | ||
10869 | grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5704CIOBE) { | ||
10870 | tp->tg3_flags |= TG3_FLAG_SPLIT_MODE; | ||
10871 | tp->split_mode_max_reqs = SPLIT_MODE_5704_MAX_REQ; | ||
10872 | } | ||
10873 | #endif | ||
10874 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 && | 10882 | if (GET_ASIC_REV(tp->pci_chip_rev_id) == ASIC_REV_5705 && |
10875 | (grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5788 || | 10883 | (grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5788 || |
10876 | grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5788M)) | 10884 | grc_misc_cfg == GRC_MISC_CFG_BOARD_ID_5788M)) |
@@ -11968,14 +11976,12 @@ static int __devinit tg3_init_one(struct pci_dev *pdev, | |||
11968 | i == 5 ? '\n' : ':'); | 11976 | i == 5 ? '\n' : ':'); |
11969 | 11977 | ||
11970 | printk(KERN_INFO "%s: RXcsums[%d] LinkChgREG[%d] " | 11978 | printk(KERN_INFO "%s: RXcsums[%d] LinkChgREG[%d] " |
11971 | "MIirq[%d] ASF[%d] Split[%d] WireSpeed[%d] " | 11979 | "MIirq[%d] ASF[%d] WireSpeed[%d] TSOcap[%d]\n", |
11972 | "TSOcap[%d] \n", | ||
11973 | dev->name, | 11980 | dev->name, |
11974 | (tp->tg3_flags & TG3_FLAG_RX_CHECKSUMS) != 0, | 11981 | (tp->tg3_flags & TG3_FLAG_RX_CHECKSUMS) != 0, |
11975 | (tp->tg3_flags & TG3_FLAG_USE_LINKCHG_REG) != 0, | 11982 | (tp->tg3_flags & TG3_FLAG_USE_LINKCHG_REG) != 0, |
11976 | (tp->tg3_flags & TG3_FLAG_USE_MI_INTERRUPT) != 0, | 11983 | (tp->tg3_flags & TG3_FLAG_USE_MI_INTERRUPT) != 0, |
11977 | (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0, | 11984 | (tp->tg3_flags & TG3_FLAG_ENABLE_ASF) != 0, |
11978 | (tp->tg3_flags & TG3_FLAG_SPLIT_MODE) != 0, | ||
11979 | (tp->tg3_flags2 & TG3_FLG2_NO_ETH_WIRE_SPEED) == 0, | 11985 | (tp->tg3_flags2 & TG3_FLG2_NO_ETH_WIRE_SPEED) == 0, |
11980 | (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) != 0); | 11986 | (tp->tg3_flags2 & TG3_FLG2_TSO_CAPABLE) != 0); |
11981 | printk(KERN_INFO "%s: dma_rwctrl[%08x] dma_mask[%d-bit]\n", | 11987 | printk(KERN_INFO "%s: dma_rwctrl[%08x] dma_mask[%d-bit]\n", |
diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h index 086892d8c1f1..d515ed23841b 100644 --- a/drivers/net/tg3.h +++ b/drivers/net/tg3.h | |||
@@ -2223,7 +2223,7 @@ struct tg3 { | |||
2223 | #define TG3_FLAG_40BIT_DMA_BUG 0x08000000 | 2223 | #define TG3_FLAG_40BIT_DMA_BUG 0x08000000 |
2224 | #define TG3_FLAG_BROKEN_CHECKSUMS 0x10000000 | 2224 | #define TG3_FLAG_BROKEN_CHECKSUMS 0x10000000 |
2225 | #define TG3_FLAG_GOT_SERDES_FLOWCTL 0x20000000 | 2225 | #define TG3_FLAG_GOT_SERDES_FLOWCTL 0x20000000 |
2226 | #define TG3_FLAG_SPLIT_MODE 0x40000000 | 2226 | #define TG3_FLAG_CHIP_RESETTING 0x40000000 |
2227 | #define TG3_FLAG_INIT_COMPLETE 0x80000000 | 2227 | #define TG3_FLAG_INIT_COMPLETE 0x80000000 |
2228 | u32 tg3_flags2; | 2228 | u32 tg3_flags2; |
2229 | #define TG3_FLG2_RESTART_TIMER 0x00000001 | 2229 | #define TG3_FLG2_RESTART_TIMER 0x00000001 |
@@ -2262,9 +2262,6 @@ struct tg3 { | |||
2262 | #define TG3_FLG2_NO_FWARE_REPORTED 0x40000000 | 2262 | #define TG3_FLG2_NO_FWARE_REPORTED 0x40000000 |
2263 | #define TG3_FLG2_PHY_ADJUST_TRIM 0x80000000 | 2263 | #define TG3_FLG2_PHY_ADJUST_TRIM 0x80000000 |
2264 | 2264 | ||
2265 | u32 split_mode_max_reqs; | ||
2266 | #define SPLIT_MODE_5704_MAX_REQ 3 | ||
2267 | |||
2268 | struct timer_list timer; | 2265 | struct timer_list timer; |
2269 | u16 timer_counter; | 2266 | u16 timer_counter; |
2270 | u16 timer_multiplier; | 2267 | u16 timer_multiplier; |
diff --git a/drivers/net/wan/lmc/lmc_media.h b/drivers/net/wan/lmc/lmc_media.h deleted file mode 100644 index ddcc00403563..000000000000 --- a/drivers/net/wan/lmc/lmc_media.h +++ /dev/null | |||
@@ -1,65 +0,0 @@ | |||
1 | #ifndef _LMC_MEDIA_H_ | ||
2 | #define _LMC_MEDIA_H_ | ||
3 | |||
4 | lmc_media_t lmc_ds3_media = { | ||
5 | lmc_ds3_init, /* special media init stuff */ | ||
6 | lmc_ds3_default, /* reset to default state */ | ||
7 | lmc_ds3_set_status, /* reset status to state provided */ | ||
8 | lmc_dummy_set_1, /* set clock source */ | ||
9 | lmc_dummy_set2_1, /* set line speed */ | ||
10 | lmc_ds3_set_100ft, /* set cable length */ | ||
11 | lmc_ds3_set_scram, /* set scrambler */ | ||
12 | lmc_ds3_get_link_status, /* get link status */ | ||
13 | lmc_dummy_set_1, /* set link status */ | ||
14 | lmc_ds3_set_crc_length, /* set CRC length */ | ||
15 | lmc_dummy_set_1, /* set T1 or E1 circuit type */ | ||
16 | lmc_ds3_watchdog | ||
17 | }; | ||
18 | |||
19 | lmc_media_t lmc_hssi_media = { | ||
20 | lmc_hssi_init, /* special media init stuff */ | ||
21 | lmc_hssi_default, /* reset to default state */ | ||
22 | lmc_hssi_set_status, /* reset status to state provided */ | ||
23 | lmc_hssi_set_clock, /* set clock source */ | ||
24 | lmc_dummy_set2_1, /* set line speed */ | ||
25 | lmc_dummy_set_1, /* set cable length */ | ||
26 | lmc_dummy_set_1, /* set scrambler */ | ||
27 | lmc_hssi_get_link_status, /* get link status */ | ||
28 | lmc_hssi_set_link_status, /* set link status */ | ||
29 | lmc_hssi_set_crc_length, /* set CRC length */ | ||
30 | lmc_dummy_set_1, /* set T1 or E1 circuit type */ | ||
31 | lmc_hssi_watchdog | ||
32 | }; | ||
33 | |||
34 | lmc_media_t lmc_ssi_media = { lmc_ssi_init, /* special media init stuff */ | ||
35 | lmc_ssi_default, /* reset to default state */ | ||
36 | lmc_ssi_set_status, /* reset status to state provided */ | ||
37 | lmc_ssi_set_clock, /* set clock source */ | ||
38 | lmc_ssi_set_speed, /* set line speed */ | ||
39 | lmc_dummy_set_1, /* set cable length */ | ||
40 | lmc_dummy_set_1, /* set scrambler */ | ||
41 | lmc_ssi_get_link_status, /* get link status */ | ||
42 | lmc_ssi_set_link_status, /* set link status */ | ||
43 | lmc_ssi_set_crc_length, /* set CRC length */ | ||
44 | lmc_dummy_set_1, /* set T1 or E1 circuit type */ | ||
45 | lmc_ssi_watchdog | ||
46 | }; | ||
47 | |||
48 | lmc_media_t lmc_t1_media = { | ||
49 | lmc_t1_init, /* special media init stuff */ | ||
50 | lmc_t1_default, /* reset to default state */ | ||
51 | lmc_t1_set_status, /* reset status to state provided */ | ||
52 | lmc_t1_set_clock, /* set clock source */ | ||
53 | lmc_dummy_set2_1, /* set line speed */ | ||
54 | lmc_dummy_set_1, /* set cable length */ | ||
55 | lmc_dummy_set_1, /* set scrambler */ | ||
56 | lmc_t1_get_link_status, /* get link status */ | ||
57 | lmc_dummy_set_1, /* set link status */ | ||
58 | lmc_t1_set_crc_length, /* set CRC length */ | ||
59 | lmc_t1_set_circuit_type, /* set T1 or E1 circuit type */ | ||
60 | lmc_t1_watchdog | ||
61 | }; | ||
62 | |||
63 | |||
64 | #endif | ||
65 | |||
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_phy.c b/drivers/net/wireless/bcm43xx/bcm43xx_phy.c index cae89258a640..d1e89be965cd 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_phy.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_phy.c | |||
@@ -757,7 +757,7 @@ static void bcm43xx_phy_initb5(struct bcm43xx_private *bcm) | |||
757 | if (radio->version == 0x2050) | 757 | if (radio->version == 0x2050) |
758 | bcm43xx_phy_write(bcm, 0x0038, 0x0667); | 758 | bcm43xx_phy_write(bcm, 0x0038, 0x0667); |
759 | 759 | ||
760 | if (phy->type == BCM43xx_PHYTYPE_G) { | 760 | if (phy->connected) { |
761 | if (radio->version == 0x2050) { | 761 | if (radio->version == 0x2050) { |
762 | bcm43xx_radio_write16(bcm, 0x007A, | 762 | bcm43xx_radio_write16(bcm, 0x007A, |
763 | bcm43xx_radio_read16(bcm, 0x007A) | 763 | bcm43xx_radio_read16(bcm, 0x007A) |
@@ -1192,7 +1192,7 @@ static void bcm43xx_phy_initg(struct bcm43xx_private *bcm) | |||
1192 | bcm43xx_phy_write(bcm, 0x0811, 0x0400); | 1192 | bcm43xx_phy_write(bcm, 0x0811, 0x0400); |
1193 | bcm43xx_phy_write(bcm, 0x0015, 0x00C0); | 1193 | bcm43xx_phy_write(bcm, 0x0015, 0x00C0); |
1194 | } | 1194 | } |
1195 | if (phy->connected) { | 1195 | if (phy->rev >= 2 && phy->connected) { |
1196 | tmp = bcm43xx_phy_read(bcm, 0x0400) & 0xFF; | 1196 | tmp = bcm43xx_phy_read(bcm, 0x0400) & 0xFF; |
1197 | if (tmp < 6) { | 1197 | if (tmp < 6) { |
1198 | bcm43xx_phy_write(bcm, 0x04C2, 0x1816); | 1198 | bcm43xx_phy_write(bcm, 0x04C2, 0x1816); |
diff --git a/drivers/net/wireless/bcm43xx/bcm43xx_radio.c b/drivers/net/wireless/bcm43xx/bcm43xx_radio.c index ee1e7a2afc08..4025dd0089d2 100644 --- a/drivers/net/wireless/bcm43xx/bcm43xx_radio.c +++ b/drivers/net/wireless/bcm43xx/bcm43xx_radio.c | |||
@@ -458,7 +458,7 @@ static void bcm43xx_calc_nrssi_offset(struct bcm43xx_private *bcm) | |||
458 | bcm43xx_phy_write(bcm, 0x005A, 0x0480); | 458 | bcm43xx_phy_write(bcm, 0x005A, 0x0480); |
459 | bcm43xx_phy_write(bcm, 0x0059, 0x0810); | 459 | bcm43xx_phy_write(bcm, 0x0059, 0x0810); |
460 | bcm43xx_phy_write(bcm, 0x0058, 0x000D); | 460 | bcm43xx_phy_write(bcm, 0x0058, 0x000D); |
461 | if (phy->rev == 0) { | 461 | if (phy->analog == 0) { |
462 | bcm43xx_phy_write(bcm, 0x0003, 0x0122); | 462 | bcm43xx_phy_write(bcm, 0x0003, 0x0122); |
463 | } else { | 463 | } else { |
464 | bcm43xx_phy_write(bcm, 0x000A, | 464 | bcm43xx_phy_write(bcm, 0x000A, |
@@ -570,9 +570,9 @@ void bcm43xx_calc_nrssi_slope(struct bcm43xx_private *bcm) | |||
570 | nrssi0 = (s16)bcm43xx_phy_read(bcm, 0x0027); | 570 | nrssi0 = (s16)bcm43xx_phy_read(bcm, 0x0027); |
571 | bcm43xx_radio_write16(bcm, 0x007A, | 571 | bcm43xx_radio_write16(bcm, 0x007A, |
572 | bcm43xx_radio_read16(bcm, 0x007A) & 0x007F); | 572 | bcm43xx_radio_read16(bcm, 0x007A) & 0x007F); |
573 | if (phy->rev >= 2) { | 573 | if (phy->analog >= 2) { |
574 | bcm43xx_write16(bcm, 0x03E6, 0x0040); | 574 | bcm43xx_write16(bcm, 0x03E6, 0x0040); |
575 | } else if (phy->rev == 0) { | 575 | } else if (phy->analog == 0) { |
576 | bcm43xx_write16(bcm, 0x03E6, 0x0122); | 576 | bcm43xx_write16(bcm, 0x03E6, 0x0122); |
577 | } else { | 577 | } else { |
578 | bcm43xx_write16(bcm, BCM43xx_MMIO_CHANNEL_EXT, | 578 | bcm43xx_write16(bcm, BCM43xx_MMIO_CHANNEL_EXT, |
@@ -596,7 +596,7 @@ void bcm43xx_calc_nrssi_slope(struct bcm43xx_private *bcm) | |||
596 | bcm43xx_phy_write(bcm, 0x0015, backup[5]); | 596 | bcm43xx_phy_write(bcm, 0x0015, backup[5]); |
597 | bcm43xx_phy_write(bcm, 0x002A, backup[6]); | 597 | bcm43xx_phy_write(bcm, 0x002A, backup[6]); |
598 | bcm43xx_synth_pu_workaround(bcm, radio->channel); | 598 | bcm43xx_synth_pu_workaround(bcm, radio->channel); |
599 | if (phy->rev != 0) | 599 | if (phy->analog != 0) |
600 | bcm43xx_write16(bcm, 0x03F4, backup[13]); | 600 | bcm43xx_write16(bcm, 0x03F4, backup[13]); |
601 | 601 | ||
602 | bcm43xx_phy_write(bcm, 0x0020, backup[7]); | 602 | bcm43xx_phy_write(bcm, 0x0020, backup[7]); |
@@ -692,7 +692,7 @@ void bcm43xx_calc_nrssi_slope(struct bcm43xx_private *bcm) | |||
692 | 692 | ||
693 | bcm43xx_radio_write16(bcm, 0x007A, | 693 | bcm43xx_radio_write16(bcm, 0x007A, |
694 | bcm43xx_radio_read16(bcm, 0x007A) & 0x007F); | 694 | bcm43xx_radio_read16(bcm, 0x007A) & 0x007F); |
695 | if (phy->rev >= 2) { | 695 | if (phy->analog >= 2) { |
696 | bcm43xx_phy_write(bcm, 0x0003, | 696 | bcm43xx_phy_write(bcm, 0x0003, |
697 | (bcm43xx_phy_read(bcm, 0x0003) | 697 | (bcm43xx_phy_read(bcm, 0x0003) |
698 | & 0xFF9F) | 0x0040); | 698 | & 0xFF9F) | 0x0040); |
@@ -1579,7 +1579,7 @@ void bcm43xx_radio_set_tx_iq(struct bcm43xx_private *bcm) | |||
1579 | 1579 | ||
1580 | for (i = 0; i < 5; i++) { | 1580 | for (i = 0; i < 5; i++) { |
1581 | for (j = 0; j < 5; j++) { | 1581 | for (j = 0; j < 5; j++) { |
1582 | if (tmp == (data_high[i] << 4 | data_low[j])) { | 1582 | if (tmp == (data_high[i] | data_low[j])) { |
1583 | bcm43xx_phy_write(bcm, 0x0069, (i - j) << 8 | 0x00C0); | 1583 | bcm43xx_phy_write(bcm, 0x0069, (i - j) << 8 | 0x00C0); |
1584 | return; | 1584 | return; |
1585 | } | 1585 | } |
diff --git a/drivers/oprofile/event_buffer.c b/drivers/oprofile/event_buffer.c index 00e937e9240e..e7fbac529935 100644 --- a/drivers/oprofile/event_buffer.c +++ b/drivers/oprofile/event_buffer.c | |||
@@ -70,11 +70,12 @@ void wake_up_buffer_waiter(void) | |||
70 | int alloc_event_buffer(void) | 70 | int alloc_event_buffer(void) |
71 | { | 71 | { |
72 | int err = -ENOMEM; | 72 | int err = -ENOMEM; |
73 | unsigned long flags; | ||
73 | 74 | ||
74 | spin_lock(&oprofilefs_lock); | 75 | spin_lock_irqsave(&oprofilefs_lock, flags); |
75 | buffer_size = fs_buffer_size; | 76 | buffer_size = fs_buffer_size; |
76 | buffer_watershed = fs_buffer_watershed; | 77 | buffer_watershed = fs_buffer_watershed; |
77 | spin_unlock(&oprofilefs_lock); | 78 | spin_unlock_irqrestore(&oprofilefs_lock, flags); |
78 | 79 | ||
79 | if (buffer_watershed >= buffer_size) | 80 | if (buffer_watershed >= buffer_size) |
80 | return -EINVAL; | 81 | return -EINVAL; |
diff --git a/drivers/oprofile/oprofilefs.c b/drivers/oprofile/oprofilefs.c index 6e67b42ca46d..8543cb26cf34 100644 --- a/drivers/oprofile/oprofilefs.c +++ b/drivers/oprofile/oprofilefs.c | |||
@@ -65,6 +65,7 @@ ssize_t oprofilefs_ulong_to_user(unsigned long val, char __user * buf, size_t co | |||
65 | int oprofilefs_ulong_from_user(unsigned long * val, char const __user * buf, size_t count) | 65 | int oprofilefs_ulong_from_user(unsigned long * val, char const __user * buf, size_t count) |
66 | { | 66 | { |
67 | char tmpbuf[TMPBUFSIZE]; | 67 | char tmpbuf[TMPBUFSIZE]; |
68 | unsigned long flags; | ||
68 | 69 | ||
69 | if (!count) | 70 | if (!count) |
70 | return 0; | 71 | return 0; |
@@ -77,9 +78,9 @@ int oprofilefs_ulong_from_user(unsigned long * val, char const __user * buf, siz | |||
77 | if (copy_from_user(tmpbuf, buf, count)) | 78 | if (copy_from_user(tmpbuf, buf, count)) |
78 | return -EFAULT; | 79 | return -EFAULT; |
79 | 80 | ||
80 | spin_lock(&oprofilefs_lock); | 81 | spin_lock_irqsave(&oprofilefs_lock, flags); |
81 | *val = simple_strtoul(tmpbuf, NULL, 0); | 82 | *val = simple_strtoul(tmpbuf, NULL, 0); |
82 | spin_unlock(&oprofilefs_lock); | 83 | spin_unlock_irqrestore(&oprofilefs_lock, flags); |
83 | return 0; | 84 | return 0; |
84 | } | 85 | } |
85 | 86 | ||
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index ad33e0159514..435c1958a7b7 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
@@ -94,6 +94,7 @@ static void msi_set_mask_bit(unsigned int irq, int flag) | |||
94 | int offset = entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE + | 94 | int offset = entry->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE + |
95 | PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET; | 95 | PCI_MSIX_ENTRY_VECTOR_CTRL_OFFSET; |
96 | writel(flag, entry->mask_base + offset); | 96 | writel(flag, entry->mask_base + offset); |
97 | readl(entry->mask_base + offset); | ||
97 | break; | 98 | break; |
98 | } | 99 | } |
99 | default: | 100 | default: |
diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c index 0be5a0b30725..df383645e366 100644 --- a/drivers/pci/pcie/portdrv_pci.c +++ b/drivers/pci/pcie/portdrv_pci.c | |||
@@ -93,7 +93,7 @@ static int __devinit pcie_portdrv_probe (struct pci_dev *dev, | |||
93 | if (!dev->irq && dev->pin) { | 93 | if (!dev->irq && dev->pin) { |
94 | printk(KERN_WARNING | 94 | printk(KERN_WARNING |
95 | "%s->Dev[%04x:%04x] has invalid IRQ. Check vendor BIOS\n", | 95 | "%s->Dev[%04x:%04x] has invalid IRQ. Check vendor BIOS\n", |
96 | __FUNCTION__, dev->device, dev->vendor); | 96 | __FUNCTION__, dev->vendor, dev->device); |
97 | } | 97 | } |
98 | if (pcie_port_device_register(dev)) { | 98 | if (pcie_port_device_register(dev)) { |
99 | pci_disable_device(dev); | 99 | pci_disable_device(dev); |
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c index 7f94fc098cd3..65d6f23ead41 100644 --- a/drivers/pci/quirks.c +++ b/drivers/pci/quirks.c | |||
@@ -963,6 +963,13 @@ DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, k8t_sound_ho | |||
963 | * bridge. Unfortunately, this device has no subvendor/subdevice ID. So it | 963 | * bridge. Unfortunately, this device has no subvendor/subdevice ID. So it |
964 | * becomes necessary to do this tweak in two steps -- I've chosen the Host | 964 | * becomes necessary to do this tweak in two steps -- I've chosen the Host |
965 | * bridge as trigger. | 965 | * bridge as trigger. |
966 | * | ||
967 | * Note that we used to unhide the SMBus that way on Toshiba laptops | ||
968 | * (Satellite A40 and Tecra M2) but then found that the thermal management | ||
969 | * was done by SMM code, which could cause unsynchronized concurrent | ||
970 | * accesses to the SMBus registers, with potentially bad effects. Thus you | ||
971 | * should be very careful when adding new entries: if SMM is accessing the | ||
972 | * Intel SMBus, this is a very good reason to leave it hidden. | ||
966 | */ | 973 | */ |
967 | static int asus_hides_smbus; | 974 | static int asus_hides_smbus; |
968 | 975 | ||
@@ -1040,17 +1047,6 @@ static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev) | |||
1040 | case 0x099c: /* HP Compaq nx6110 */ | 1047 | case 0x099c: /* HP Compaq nx6110 */ |
1041 | asus_hides_smbus = 1; | 1048 | asus_hides_smbus = 1; |
1042 | } | 1049 | } |
1043 | } else if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_TOSHIBA)) { | ||
1044 | if (dev->device == PCI_DEVICE_ID_INTEL_82855GM_HB) | ||
1045 | switch(dev->subsystem_device) { | ||
1046 | case 0x0001: /* Toshiba Satellite A40 */ | ||
1047 | asus_hides_smbus = 1; | ||
1048 | } | ||
1049 | else if (dev->device == PCI_DEVICE_ID_INTEL_82855PM_HB) | ||
1050 | switch(dev->subsystem_device) { | ||
1051 | case 0x0001: /* Toshiba Tecra M2 */ | ||
1052 | asus_hides_smbus = 1; | ||
1053 | } | ||
1054 | } else if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG)) { | 1050 | } else if (unlikely(dev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG)) { |
1055 | if (dev->device == PCI_DEVICE_ID_INTEL_82855PM_HB) | 1051 | if (dev->device == PCI_DEVICE_ID_INTEL_82855PM_HB) |
1056 | switch(dev->subsystem_device) { | 1052 | switch(dev->subsystem_device) { |
diff --git a/drivers/pcmcia/au1000_generic.c b/drivers/pcmcia/au1000_generic.c index 551bde5d9430..b693367d38cd 100644 --- a/drivers/pcmcia/au1000_generic.c +++ b/drivers/pcmcia/au1000_generic.c | |||
@@ -372,7 +372,7 @@ int au1x00_pcmcia_socket_probe(struct device *dev, struct pcmcia_low_level *ops, | |||
372 | skt->socket.resource_ops = &pccard_static_ops; | 372 | skt->socket.resource_ops = &pccard_static_ops; |
373 | skt->socket.ops = &au1x00_pcmcia_operations; | 373 | skt->socket.ops = &au1x00_pcmcia_operations; |
374 | skt->socket.owner = ops->owner; | 374 | skt->socket.owner = ops->owner; |
375 | skt->socket.dev.dev = dev; | 375 | skt->socket.dev.parent = dev; |
376 | 376 | ||
377 | init_timer(&skt->poll_timer); | 377 | init_timer(&skt->poll_timer); |
378 | skt->poll_timer.function = au1x00_pcmcia_poll_event; | 378 | skt->poll_timer.function = au1x00_pcmcia_poll_event; |
diff --git a/drivers/pcmcia/omap_cf.c b/drivers/pcmcia/omap_cf.c index d77f75129f8a..2df216b00817 100644 --- a/drivers/pcmcia/omap_cf.c +++ b/drivers/pcmcia/omap_cf.c | |||
@@ -202,15 +202,14 @@ static struct pccard_operations omap_cf_ops = { | |||
202 | * "what chipselect is used". Boards could want more. | 202 | * "what chipselect is used". Boards could want more. |
203 | */ | 203 | */ |
204 | 204 | ||
205 | static int __devinit omap_cf_probe(struct device *dev) | 205 | static int __init omap_cf_probe(struct platform_device *pdev) |
206 | { | 206 | { |
207 | unsigned seg; | 207 | unsigned seg; |
208 | struct omap_cf_socket *cf; | 208 | struct omap_cf_socket *cf; |
209 | struct platform_device *pdev = to_platform_device(dev); | ||
210 | int irq; | 209 | int irq; |
211 | int status; | 210 | int status; |
212 | 211 | ||
213 | seg = (int) dev->platform_data; | 212 | seg = (int) pdev->dev.platform_data; |
214 | if (seg == 0 || seg > 3) | 213 | if (seg == 0 || seg > 3) |
215 | return -ENODEV; | 214 | return -ENODEV; |
216 | 215 | ||
@@ -227,7 +226,7 @@ static int __devinit omap_cf_probe(struct device *dev) | |||
227 | cf->timer.data = (unsigned long) cf; | 226 | cf->timer.data = (unsigned long) cf; |
228 | 227 | ||
229 | cf->pdev = pdev; | 228 | cf->pdev = pdev; |
230 | dev_set_drvdata(dev, cf); | 229 | platform_set_drvdata(pdev, cf); |
231 | 230 | ||
232 | /* this primarily just shuts up irq handling noise */ | 231 | /* this primarily just shuts up irq handling noise */ |
233 | status = request_irq(irq, omap_cf_irq, IRQF_SHARED, | 232 | status = request_irq(irq, omap_cf_irq, IRQF_SHARED, |
@@ -291,7 +290,7 @@ static int __devinit omap_cf_probe(struct device *dev) | |||
291 | omap_cf_present() ? "present" : "(not present)"); | 290 | omap_cf_present() ? "present" : "(not present)"); |
292 | 291 | ||
293 | cf->socket.owner = THIS_MODULE; | 292 | cf->socket.owner = THIS_MODULE; |
294 | cf->socket.dev.parent = dev; | 293 | cf->socket.dev.parent = &pdev->dev; |
295 | cf->socket.ops = &omap_cf_ops; | 294 | cf->socket.ops = &omap_cf_ops; |
296 | cf->socket.resource_ops = &pccard_static_ops; | 295 | cf->socket.resource_ops = &pccard_static_ops; |
297 | cf->socket.features = SS_CAP_PCCARD | SS_CAP_STATIC_MAP | 296 | cf->socket.features = SS_CAP_PCCARD | SS_CAP_STATIC_MAP |
@@ -318,9 +317,9 @@ fail0: | |||
318 | return status; | 317 | return status; |
319 | } | 318 | } |
320 | 319 | ||
321 | static int __devexit omap_cf_remove(struct device *dev) | 320 | static int __exit omap_cf_remove(struct platform_device *pdev) |
322 | { | 321 | { |
323 | struct omap_cf_socket *cf = dev_get_drvdata(dev); | 322 | struct omap_cf_socket *cf = platform_get_drvdata(pdev); |
324 | 323 | ||
325 | cf->active = 0; | 324 | cf->active = 0; |
326 | pcmcia_unregister_socket(&cf->socket); | 325 | pcmcia_unregister_socket(&cf->socket); |
@@ -332,26 +331,36 @@ static int __devexit omap_cf_remove(struct device *dev) | |||
332 | return 0; | 331 | return 0; |
333 | } | 332 | } |
334 | 333 | ||
335 | static struct device_driver omap_cf_driver = { | 334 | static int omap_cf_suspend(struct platform_device *pdev, pm_message_t mesg) |
336 | .name = (char *) driver_name, | 335 | { |
337 | .bus = &platform_bus_type, | 336 | return pcmcia_socket_dev_suspend(&pdev->dev, mesg); |
338 | .probe = omap_cf_probe, | 337 | } |
339 | .remove = __devexit_p(omap_cf_remove), | 338 | |
340 | .suspend = pcmcia_socket_dev_suspend, | 339 | static int omap_cf_resume(struct platform_device *pdev) |
341 | .resume = pcmcia_socket_dev_resume, | 340 | { |
341 | return pcmcia_socket_dev_resume(&pdev->dev); | ||
342 | } | ||
343 | |||
344 | static struct platform_driver omap_cf_driver = { | ||
345 | .driver = { | ||
346 | .name = (char *) driver_name, | ||
347 | }, | ||
348 | .remove = __exit_p(omap_cf_remove), | ||
349 | .suspend = omap_cf_suspend, | ||
350 | .resume = omap_cf_resume, | ||
342 | }; | 351 | }; |
343 | 352 | ||
344 | static int __init omap_cf_init(void) | 353 | static int __init omap_cf_init(void) |
345 | { | 354 | { |
346 | if (cpu_is_omap16xx()) | 355 | if (cpu_is_omap16xx()) |
347 | return driver_register(&omap_cf_driver); | 356 | return platform_driver_probe(&omap_cf_driver, omap_cf_probe); |
348 | return -ENODEV; | 357 | return -ENODEV; |
349 | } | 358 | } |
350 | 359 | ||
351 | static void __exit omap_cf_exit(void) | 360 | static void __exit omap_cf_exit(void) |
352 | { | 361 | { |
353 | if (cpu_is_omap16xx()) | 362 | if (cpu_is_omap16xx()) |
354 | driver_unregister(&omap_cf_driver); | 363 | platform_driver_unregister(&omap_cf_driver); |
355 | } | 364 | } |
356 | 365 | ||
357 | module_init(omap_cf_init); | 366 | module_init(omap_cf_init); |
diff --git a/drivers/pnp/system.c b/drivers/pnp/system.c index 2065e74bb63f..a8a95540b1ef 100644 --- a/drivers/pnp/system.c +++ b/drivers/pnp/system.c | |||
@@ -22,7 +22,7 @@ static const struct pnp_device_id pnp_dev_table[] = { | |||
22 | { "", 0 } | 22 | { "", 0 } |
23 | }; | 23 | }; |
24 | 24 | ||
25 | static void reserve_range(char *pnpid, int start, int end, int port) | 25 | static void reserve_range(const char *pnpid, resource_size_t start, resource_size_t end, int port) |
26 | { | 26 | { |
27 | struct resource *res; | 27 | struct resource *res; |
28 | char *regionid; | 28 | char *regionid; |
@@ -32,9 +32,9 @@ static void reserve_range(char *pnpid, int start, int end, int port) | |||
32 | return; | 32 | return; |
33 | snprintf(regionid, 16, "pnp %s", pnpid); | 33 | snprintf(regionid, 16, "pnp %s", pnpid); |
34 | if (port) | 34 | if (port) |
35 | res = request_region(start,end-start+1,regionid); | 35 | res = request_region(start, end-start+1, regionid); |
36 | else | 36 | else |
37 | res = request_mem_region(start,end-start+1,regionid); | 37 | res = request_mem_region(start, end-start+1, regionid); |
38 | if (res == NULL) | 38 | if (res == NULL) |
39 | kfree(regionid); | 39 | kfree(regionid); |
40 | else | 40 | else |
@@ -45,12 +45,13 @@ static void reserve_range(char *pnpid, int start, int end, int port) | |||
45 | * have double reservations. | 45 | * have double reservations. |
46 | */ | 46 | */ |
47 | printk(KERN_INFO | 47 | printk(KERN_INFO |
48 | "pnp: %s: %s range 0x%x-0x%x %s reserved\n", | 48 | "pnp: %s: %s range 0x%llx-0x%llx %s reserved\n", |
49 | pnpid, port ? "ioport" : "iomem", start, end, | 49 | pnpid, port ? "ioport" : "iomem", |
50 | (unsigned long long)start, (unsigned long long)end, | ||
50 | NULL != res ? "has been" : "could not be"); | 51 | NULL != res ? "has been" : "could not be"); |
51 | } | 52 | } |
52 | 53 | ||
53 | static void reserve_resources_of_dev(struct pnp_dev *dev) | 54 | static void reserve_resources_of_dev(const struct pnp_dev *dev) |
54 | { | 55 | { |
55 | int i; | 56 | int i; |
56 | 57 | ||
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index 85bf795abdcc..7c0d60910077 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c | |||
@@ -59,6 +59,19 @@ struct cmos_rtc { | |||
59 | 59 | ||
60 | static const char driver_name[] = "rtc_cmos"; | 60 | static const char driver_name[] = "rtc_cmos"; |
61 | 61 | ||
62 | /* The RTC_INTR register may have e.g. RTC_PF set even if RTC_PIE is clear; | ||
63 | * always mask it against the irq enable bits in RTC_CONTROL. Bit values | ||
64 | * are the same: PF==PIE, AF=AIE, UF=UIE; so RTC_IRQMASK works with both. | ||
65 | */ | ||
66 | #define RTC_IRQMASK (RTC_PF | RTC_AF | RTC_UF) | ||
67 | |||
68 | static inline int is_intr(u8 rtc_intr) | ||
69 | { | ||
70 | if (!(rtc_intr & RTC_IRQF)) | ||
71 | return 0; | ||
72 | return rtc_intr & RTC_IRQMASK; | ||
73 | } | ||
74 | |||
62 | /*----------------------------------------------------------------*/ | 75 | /*----------------------------------------------------------------*/ |
63 | 76 | ||
64 | static int cmos_read_time(struct device *dev, struct rtc_time *t) | 77 | static int cmos_read_time(struct device *dev, struct rtc_time *t) |
@@ -188,7 +201,8 @@ static int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t) | |||
188 | rtc_control &= ~RTC_AIE; | 201 | rtc_control &= ~RTC_AIE; |
189 | CMOS_WRITE(rtc_control, RTC_CONTROL); | 202 | CMOS_WRITE(rtc_control, RTC_CONTROL); |
190 | rtc_intr = CMOS_READ(RTC_INTR_FLAGS); | 203 | rtc_intr = CMOS_READ(RTC_INTR_FLAGS); |
191 | if (rtc_intr) | 204 | rtc_intr &= (rtc_control & RTC_IRQMASK) | RTC_IRQF; |
205 | if (is_intr(rtc_intr)) | ||
192 | rtc_update_irq(&cmos->rtc->class_dev, 1, rtc_intr); | 206 | rtc_update_irq(&cmos->rtc->class_dev, 1, rtc_intr); |
193 | 207 | ||
194 | /* update alarm */ | 208 | /* update alarm */ |
@@ -207,7 +221,8 @@ static int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t) | |||
207 | rtc_control |= RTC_AIE; | 221 | rtc_control |= RTC_AIE; |
208 | CMOS_WRITE(rtc_control, RTC_CONTROL); | 222 | CMOS_WRITE(rtc_control, RTC_CONTROL); |
209 | rtc_intr = CMOS_READ(RTC_INTR_FLAGS); | 223 | rtc_intr = CMOS_READ(RTC_INTR_FLAGS); |
210 | if (rtc_intr) | 224 | rtc_intr &= (rtc_control & RTC_IRQMASK) | RTC_IRQF; |
225 | if (is_intr(rtc_intr)) | ||
211 | rtc_update_irq(&cmos->rtc->class_dev, 1, rtc_intr); | 226 | rtc_update_irq(&cmos->rtc->class_dev, 1, rtc_intr); |
212 | } | 227 | } |
213 | 228 | ||
@@ -287,7 +302,8 @@ cmos_rtc_ioctl(struct device *dev, unsigned int cmd, unsigned long arg) | |||
287 | } | 302 | } |
288 | CMOS_WRITE(rtc_control, RTC_CONTROL); | 303 | CMOS_WRITE(rtc_control, RTC_CONTROL); |
289 | rtc_intr = CMOS_READ(RTC_INTR_FLAGS); | 304 | rtc_intr = CMOS_READ(RTC_INTR_FLAGS); |
290 | if (rtc_intr) | 305 | rtc_intr &= (rtc_control & RTC_IRQMASK) | RTC_IRQF; |
306 | if (is_intr(rtc_intr)) | ||
291 | rtc_update_irq(&cmos->rtc->class_dev, 1, rtc_intr); | 307 | rtc_update_irq(&cmos->rtc->class_dev, 1, rtc_intr); |
292 | spin_unlock_irqrestore(&rtc_lock, flags); | 308 | spin_unlock_irqrestore(&rtc_lock, flags); |
293 | return 0; | 309 | return 0; |
@@ -353,12 +369,10 @@ static irqreturn_t cmos_interrupt(int irq, void *p) | |||
353 | 369 | ||
354 | spin_lock(&rtc_lock); | 370 | spin_lock(&rtc_lock); |
355 | irqstat = CMOS_READ(RTC_INTR_FLAGS); | 371 | irqstat = CMOS_READ(RTC_INTR_FLAGS); |
372 | irqstat &= (CMOS_READ(RTC_CONTROL) & RTC_IRQMASK) | RTC_IRQF; | ||
356 | spin_unlock(&rtc_lock); | 373 | spin_unlock(&rtc_lock); |
357 | 374 | ||
358 | if (irqstat) { | 375 | if (is_intr(irqstat)) { |
359 | /* NOTE: irqstat may have e.g. RTC_PF set | ||
360 | * even when RTC_PIE is clear... | ||
361 | */ | ||
362 | rtc_update_irq(p, 1, irqstat); | 376 | rtc_update_irq(p, 1, irqstat); |
363 | return IRQ_HANDLED; | 377 | return IRQ_HANDLED; |
364 | } else | 378 | } else |
@@ -525,25 +539,26 @@ static int cmos_suspend(struct device *dev, pm_message_t mesg) | |||
525 | { | 539 | { |
526 | struct cmos_rtc *cmos = dev_get_drvdata(dev); | 540 | struct cmos_rtc *cmos = dev_get_drvdata(dev); |
527 | int do_wake = device_may_wakeup(dev); | 541 | int do_wake = device_may_wakeup(dev); |
528 | unsigned char tmp, irqstat; | 542 | unsigned char tmp; |
529 | 543 | ||
530 | /* only the alarm might be a wakeup event source */ | 544 | /* only the alarm might be a wakeup event source */ |
531 | spin_lock_irq(&rtc_lock); | 545 | spin_lock_irq(&rtc_lock); |
532 | cmos->suspend_ctrl = tmp = CMOS_READ(RTC_CONTROL); | 546 | cmos->suspend_ctrl = tmp = CMOS_READ(RTC_CONTROL); |
533 | if (tmp & (RTC_PIE|RTC_AIE|RTC_UIE)) { | 547 | if (tmp & (RTC_PIE|RTC_AIE|RTC_UIE)) { |
548 | unsigned char irqstat; | ||
549 | |||
534 | if (do_wake) | 550 | if (do_wake) |
535 | tmp &= ~(RTC_PIE|RTC_UIE); | 551 | tmp &= ~(RTC_PIE|RTC_UIE); |
536 | else | 552 | else |
537 | tmp &= ~(RTC_PIE|RTC_AIE|RTC_UIE); | 553 | tmp &= ~(RTC_PIE|RTC_AIE|RTC_UIE); |
538 | CMOS_WRITE(tmp, RTC_CONTROL); | 554 | CMOS_WRITE(tmp, RTC_CONTROL); |
539 | irqstat = CMOS_READ(RTC_INTR_FLAGS); | 555 | irqstat = CMOS_READ(RTC_INTR_FLAGS); |
540 | } else | 556 | irqstat &= (tmp & RTC_IRQMASK) | RTC_IRQF; |
541 | irqstat = 0; | 557 | if (is_intr(irqstat)) |
558 | rtc_update_irq(&cmos->rtc->class_dev, 1, irqstat); | ||
559 | } | ||
542 | spin_unlock_irq(&rtc_lock); | 560 | spin_unlock_irq(&rtc_lock); |
543 | 561 | ||
544 | if (irqstat) | ||
545 | rtc_update_irq(&cmos->rtc->class_dev, 1, irqstat); | ||
546 | |||
547 | /* ACPI HOOK: enable ACPI_EVENT_RTC when (tmp & RTC_AIE) | 562 | /* ACPI HOOK: enable ACPI_EVENT_RTC when (tmp & RTC_AIE) |
548 | * ... it'd be best if we could do that under rtc_lock. | 563 | * ... it'd be best if we could do that under rtc_lock. |
549 | */ | 564 | */ |
@@ -573,9 +588,10 @@ static int cmos_resume(struct device *dev) | |||
573 | spin_lock_irq(&rtc_lock); | 588 | spin_lock_irq(&rtc_lock); |
574 | CMOS_WRITE(tmp, RTC_CONTROL); | 589 | CMOS_WRITE(tmp, RTC_CONTROL); |
575 | tmp = CMOS_READ(RTC_INTR_FLAGS); | 590 | tmp = CMOS_READ(RTC_INTR_FLAGS); |
576 | spin_unlock_irq(&rtc_lock); | 591 | tmp &= (cmos->suspend_ctrl & RTC_IRQMASK) | RTC_IRQF; |
577 | if (tmp) | 592 | if (is_intr(tmp)) |
578 | rtc_update_irq(&cmos->rtc->class_dev, 1, tmp); | 593 | rtc_update_irq(&cmos->rtc->class_dev, 1, tmp); |
594 | spin_unlock_irq(&rtc_lock); | ||
579 | } | 595 | } |
580 | 596 | ||
581 | pr_debug("%s: resume, ctrl %02x\n", | 597 | pr_debug("%s: resume, ctrl %02x\n", |
@@ -594,7 +610,7 @@ static int cmos_resume(struct device *dev) | |||
594 | /*----------------------------------------------------------------*/ | 610 | /*----------------------------------------------------------------*/ |
595 | 611 | ||
596 | /* The "CMOS" RTC normally lives on the platform_bus. On ACPI systems, | 612 | /* The "CMOS" RTC normally lives on the platform_bus. On ACPI systems, |
597 | * the device node may alternatively be created as a PNP device. | 613 | * the device node will always be created as a PNPACPI device. |
598 | */ | 614 | */ |
599 | 615 | ||
600 | #ifdef CONFIG_PNPACPI | 616 | #ifdef CONFIG_PNPACPI |
@@ -673,7 +689,7 @@ module_exit(cmos_exit); | |||
673 | /*----------------------------------------------------------------*/ | 689 | /*----------------------------------------------------------------*/ |
674 | 690 | ||
675 | /* Platform setup should have set up an RTC device, when PNPACPI is | 691 | /* Platform setup should have set up an RTC device, when PNPACPI is |
676 | * unavailable ... this is the normal case, common even on PCs. | 692 | * unavailable ... this could happen even on (older) PCs. |
677 | */ | 693 | */ |
678 | 694 | ||
679 | static int __init cmos_platform_probe(struct platform_device *pdev) | 695 | static int __init cmos_platform_probe(struct platform_device *pdev) |
diff --git a/drivers/s390/block/dasd_diag.c b/drivers/s390/block/dasd_diag.c index ab782bb46ac1..e810e4a44ed4 100644 --- a/drivers/s390/block/dasd_diag.c +++ b/drivers/s390/block/dasd_diag.c | |||
@@ -65,7 +65,7 @@ static const u8 DASD_DIAG_CMS1[] = { 0xc3, 0xd4, 0xe2, 0xf1 };/* EBCDIC CMS1 */ | |||
65 | * resulting condition code and DIAG return code. */ | 65 | * resulting condition code and DIAG return code. */ |
66 | static inline int dia250(void *iob, int cmd) | 66 | static inline int dia250(void *iob, int cmd) |
67 | { | 67 | { |
68 | register unsigned long reg0 asm ("0") = (unsigned long) iob; | 68 | register unsigned long reg2 asm ("2") = (unsigned long) iob; |
69 | typedef union { | 69 | typedef union { |
70 | struct dasd_diag_init_io init_io; | 70 | struct dasd_diag_init_io init_io; |
71 | struct dasd_diag_rw_io rw_io; | 71 | struct dasd_diag_rw_io rw_io; |
@@ -74,15 +74,15 @@ static inline int dia250(void *iob, int cmd) | |||
74 | 74 | ||
75 | rc = 3; | 75 | rc = 3; |
76 | asm volatile( | 76 | asm volatile( |
77 | " diag 0,%2,0x250\n" | 77 | " diag 2,%2,0x250\n" |
78 | "0: ipm %0\n" | 78 | "0: ipm %0\n" |
79 | " srl %0,28\n" | 79 | " srl %0,28\n" |
80 | " or %0,1\n" | 80 | " or %0,3\n" |
81 | "1:\n" | 81 | "1:\n" |
82 | EX_TABLE(0b,1b) | 82 | EX_TABLE(0b,1b) |
83 | : "+d" (rc), "=m" (*(addr_type *) iob) | 83 | : "+d" (rc), "=m" (*(addr_type *) iob) |
84 | : "d" (cmd), "d" (reg0), "m" (*(addr_type *) iob) | 84 | : "d" (cmd), "d" (reg2), "m" (*(addr_type *) iob) |
85 | : "1", "cc"); | 85 | : "3", "cc"); |
86 | return rc; | 86 | return rc; |
87 | } | 87 | } |
88 | 88 | ||
diff --git a/drivers/s390/cio/device_status.c b/drivers/s390/cio/device_status.c index 6b1caea622ea..aa96e6752592 100644 --- a/drivers/s390/cio/device_status.c +++ b/drivers/s390/cio/device_status.c | |||
@@ -221,6 +221,14 @@ ccw_device_accumulate_irb(struct ccw_device *cdev, struct irb *irb) | |||
221 | 221 | ||
222 | cdev_irb = &cdev->private->irb; | 222 | cdev_irb = &cdev->private->irb; |
223 | 223 | ||
224 | /* | ||
225 | * If the clear function had been performed, all formerly pending | ||
226 | * status at the subchannel has been cleared and we must not pass | ||
227 | * intermediate accumulated status to the device driver. | ||
228 | */ | ||
229 | if (irb->scsw.fctl & SCSW_FCTL_CLEAR_FUNC) | ||
230 | memset(&cdev->private->irb, 0, sizeof(struct irb)); | ||
231 | |||
224 | /* Copy bits which are valid only for the start function. */ | 232 | /* Copy bits which are valid only for the start function. */ |
225 | if (irb->scsw.fctl & SCSW_FCTL_START_FUNC) { | 233 | if (irb->scsw.fctl & SCSW_FCTL_START_FUNC) { |
226 | /* Copy key. */ | 234 | /* Copy key. */ |
@@ -263,7 +271,11 @@ ccw_device_accumulate_irb(struct ccw_device *cdev, struct irb *irb) | |||
263 | cdev_irb->scsw.cpa = irb->scsw.cpa; | 271 | cdev_irb->scsw.cpa = irb->scsw.cpa; |
264 | /* Accumulate device status, but not the device busy flag. */ | 272 | /* Accumulate device status, but not the device busy flag. */ |
265 | cdev_irb->scsw.dstat &= ~DEV_STAT_BUSY; | 273 | cdev_irb->scsw.dstat &= ~DEV_STAT_BUSY; |
266 | cdev_irb->scsw.dstat |= irb->scsw.dstat; | 274 | /* dstat is not always valid. */ |
275 | if (irb->scsw.stctl & | ||
276 | (SCSW_STCTL_PRIM_STATUS | SCSW_STCTL_SEC_STATUS | ||
277 | | SCSW_STCTL_INTER_STATUS | SCSW_STCTL_ALERT_STATUS)) | ||
278 | cdev_irb->scsw.dstat |= irb->scsw.dstat; | ||
267 | /* Accumulate subchannel status. */ | 279 | /* Accumulate subchannel status. */ |
268 | cdev_irb->scsw.cstat |= irb->scsw.cstat; | 280 | cdev_irb->scsw.cstat |= irb->scsw.cstat; |
269 | /* Copy residual count if it is valid. */ | 281 | /* Copy residual count if it is valid. */ |
diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c index 181b51772b1b..bf37cdf43fae 100644 --- a/drivers/s390/crypto/ap_bus.c +++ b/drivers/s390/crypto/ap_bus.c | |||
@@ -505,6 +505,9 @@ static int ap_device_remove(struct device *dev) | |||
505 | spin_lock_bh(&ap_device_lock); | 505 | spin_lock_bh(&ap_device_lock); |
506 | list_del_init(&ap_dev->list); | 506 | list_del_init(&ap_dev->list); |
507 | spin_unlock_bh(&ap_device_lock); | 507 | spin_unlock_bh(&ap_device_lock); |
508 | spin_lock_bh(&ap_dev->lock); | ||
509 | atomic_sub(ap_dev->queue_count, &ap_poll_requests); | ||
510 | spin_unlock_bh(&ap_dev->lock); | ||
508 | return 0; | 511 | return 0; |
509 | } | 512 | } |
510 | 513 | ||
@@ -757,10 +760,16 @@ static void ap_scan_bus(struct work_struct *unused) | |||
757 | (void *)(unsigned long)qid, | 760 | (void *)(unsigned long)qid, |
758 | __ap_scan_bus); | 761 | __ap_scan_bus); |
759 | rc = ap_query_queue(qid, &queue_depth, &device_type); | 762 | rc = ap_query_queue(qid, &queue_depth, &device_type); |
760 | if (dev && rc) { | 763 | if (dev) { |
761 | put_device(dev); | 764 | ap_dev = to_ap_dev(dev); |
762 | device_unregister(dev); | 765 | spin_lock_bh(&ap_dev->lock); |
763 | continue; | 766 | if (rc || ap_dev->unregistered) { |
767 | spin_unlock_bh(&ap_dev->lock); | ||
768 | put_device(dev); | ||
769 | device_unregister(dev); | ||
770 | continue; | ||
771 | } else | ||
772 | spin_unlock_bh(&ap_dev->lock); | ||
764 | } | 773 | } |
765 | if (dev) { | 774 | if (dev) { |
766 | put_device(dev); | 775 | put_device(dev); |
@@ -861,6 +870,7 @@ static int ap_poll_read(struct ap_device *ap_dev, unsigned long *flags) | |||
861 | case AP_RESPONSE_NO_PENDING_REPLY: | 870 | case AP_RESPONSE_NO_PENDING_REPLY: |
862 | if (status.queue_empty) { | 871 | if (status.queue_empty) { |
863 | /* The card shouldn't forget requests but who knows. */ | 872 | /* The card shouldn't forget requests but who knows. */ |
873 | atomic_sub(ap_dev->queue_count, &ap_poll_requests); | ||
864 | ap_dev->queue_count = 0; | 874 | ap_dev->queue_count = 0; |
865 | list_splice_init(&ap_dev->pendingq, &ap_dev->requestq); | 875 | list_splice_init(&ap_dev->pendingq, &ap_dev->requestq); |
866 | ap_dev->requestq_count += ap_dev->pendingq_count; | 876 | ap_dev->requestq_count += ap_dev->pendingq_count; |
@@ -994,7 +1004,7 @@ void ap_queue_message(struct ap_device *ap_dev, struct ap_message *ap_msg) | |||
994 | ap_dev->unregistered = 1; | 1004 | ap_dev->unregistered = 1; |
995 | } else { | 1005 | } else { |
996 | ap_dev->drv->receive(ap_dev, ap_msg, ERR_PTR(-ENODEV)); | 1006 | ap_dev->drv->receive(ap_dev, ap_msg, ERR_PTR(-ENODEV)); |
997 | rc = 0; | 1007 | rc = -ENODEV; |
998 | } | 1008 | } |
999 | spin_unlock_bh(&ap_dev->lock); | 1009 | spin_unlock_bh(&ap_dev->lock); |
1000 | if (rc == -ENODEV) | 1010 | if (rc == -ENODEV) |
@@ -1044,18 +1054,12 @@ static void ap_poll_timeout(unsigned long unused) | |||
1044 | */ | 1054 | */ |
1045 | static int __ap_poll_all(struct ap_device *ap_dev, unsigned long *flags) | 1055 | static int __ap_poll_all(struct ap_device *ap_dev, unsigned long *flags) |
1046 | { | 1056 | { |
1047 | int rc; | ||
1048 | |||
1049 | spin_lock(&ap_dev->lock); | 1057 | spin_lock(&ap_dev->lock); |
1050 | if (!ap_dev->unregistered) { | 1058 | if (!ap_dev->unregistered) { |
1051 | rc = ap_poll_queue(ap_dev, flags); | 1059 | if (ap_poll_queue(ap_dev, flags)) |
1052 | if (rc) | ||
1053 | ap_dev->unregistered = 1; | 1060 | ap_dev->unregistered = 1; |
1054 | } else | 1061 | } |
1055 | rc = 0; | ||
1056 | spin_unlock(&ap_dev->lock); | 1062 | spin_unlock(&ap_dev->lock); |
1057 | if (rc) | ||
1058 | device_unregister(&ap_dev->device); | ||
1059 | return 0; | 1063 | return 0; |
1060 | } | 1064 | } |
1061 | 1065 | ||
diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c index 8c81cec85298..60446b88f721 100644 --- a/drivers/scsi/gdth.c +++ b/drivers/scsi/gdth.c | |||
@@ -3091,6 +3091,7 @@ static int gdth_fill_raw_cmd(int hanum,Scsi_Cmnd *scp,unchar b) | |||
3091 | cmdp->u.raw64.direction = | 3091 | cmdp->u.raw64.direction = |
3092 | gdth_direction_tab[scp->cmnd[0]]==DOU ? GDTH_DATA_OUT:GDTH_DATA_IN; | 3092 | gdth_direction_tab[scp->cmnd[0]]==DOU ? GDTH_DATA_OUT:GDTH_DATA_IN; |
3093 | memcpy(cmdp->u.raw64.cmd,scp->cmnd,16); | 3093 | memcpy(cmdp->u.raw64.cmd,scp->cmnd,16); |
3094 | cmdp->u.raw64.sg_ranz = 0; | ||
3094 | } else { | 3095 | } else { |
3095 | cmdp->u.raw.reserved = 0; | 3096 | cmdp->u.raw.reserved = 0; |
3096 | cmdp->u.raw.mdisc_time = 0; | 3097 | cmdp->u.raw.mdisc_time = 0; |
@@ -3107,6 +3108,7 @@ static int gdth_fill_raw_cmd(int hanum,Scsi_Cmnd *scp,unchar b) | |||
3107 | cmdp->u.raw.direction = | 3108 | cmdp->u.raw.direction = |
3108 | gdth_direction_tab[scp->cmnd[0]]==DOU ? GDTH_DATA_OUT:GDTH_DATA_IN; | 3109 | gdth_direction_tab[scp->cmnd[0]]==DOU ? GDTH_DATA_OUT:GDTH_DATA_IN; |
3109 | memcpy(cmdp->u.raw.cmd,scp->cmnd,12); | 3110 | memcpy(cmdp->u.raw.cmd,scp->cmnd,12); |
3111 | cmdp->u.raw.sg_ranz = 0; | ||
3110 | } | 3112 | } |
3111 | 3113 | ||
3112 | if (scp->use_sg) { | 3114 | if (scp->use_sg) { |
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 9d014e5a81c4..057fd7e0e379 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c | |||
@@ -1817,10 +1817,9 @@ static pci_ers_result_t lpfc_io_error_detected(struct pci_dev *pdev, | |||
1817 | struct lpfc_sli *psli = &phba->sli; | 1817 | struct lpfc_sli *psli = &phba->sli; |
1818 | struct lpfc_sli_ring *pring; | 1818 | struct lpfc_sli_ring *pring; |
1819 | 1819 | ||
1820 | if (state == pci_channel_io_perm_failure) { | 1820 | if (state == pci_channel_io_perm_failure) |
1821 | lpfc_pci_remove_one(pdev); | ||
1822 | return PCI_ERS_RESULT_DISCONNECT; | 1821 | return PCI_ERS_RESULT_DISCONNECT; |
1823 | } | 1822 | |
1824 | pci_disable_device(pdev); | 1823 | pci_disable_device(pdev); |
1825 | /* | 1824 | /* |
1826 | * There may be I/Os dropped by the firmware. | 1825 | * There may be I/Os dropped by the firmware. |
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index b8edcf5b5451..918bb6019540 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c | |||
@@ -716,7 +716,7 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd, | |||
716 | */ | 716 | */ |
717 | if (copy_sense) { | 717 | if (copy_sense) { |
718 | if (!SCSI_SENSE_VALID(scmd)) { | 718 | if (!SCSI_SENSE_VALID(scmd)) { |
719 | memcpy(scmd->sense_buffer, scmd->request_buffer, | 719 | memcpy(scmd->sense_buffer, page_address(sgl.page), |
720 | sizeof(scmd->sense_buffer)); | 720 | sizeof(scmd->sense_buffer)); |
721 | } | 721 | } |
722 | __free_page(sgl.page); | 722 | __free_page(sgl.page); |
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index 2328128728be..6657331eed93 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c | |||
@@ -189,8 +189,8 @@ static DECLARE_MUTEX(board_lock); | |||
189 | * this is exported so that for example a USB or parport based adapter | 189 | * this is exported so that for example a USB or parport based adapter |
190 | * driver could add devices (which it would learn about out-of-band). | 190 | * driver could add devices (which it would learn about out-of-band). |
191 | */ | 191 | */ |
192 | struct spi_device *__init_or_module | 192 | struct spi_device *spi_new_device(struct spi_master *master, |
193 | spi_new_device(struct spi_master *master, struct spi_board_info *chip) | 193 | struct spi_board_info *chip) |
194 | { | 194 | { |
195 | struct spi_device *proxy; | 195 | struct spi_device *proxy; |
196 | struct device *dev = master->cdev.dev; | 196 | struct device *dev = master->cdev.dev; |
@@ -352,8 +352,7 @@ static struct class spi_master_class = { | |||
352 | * the master's methods before calling spi_register_master(); and (after errors | 352 | * the master's methods before calling spi_register_master(); and (after errors |
353 | * adding the device) calling spi_master_put() to prevent a memory leak. | 353 | * adding the device) calling spi_master_put() to prevent a memory leak. |
354 | */ | 354 | */ |
355 | struct spi_master * __init_or_module | 355 | struct spi_master *spi_alloc_master(struct device *dev, unsigned size) |
356 | spi_alloc_master(struct device *dev, unsigned size) | ||
357 | { | 356 | { |
358 | struct spi_master *master; | 357 | struct spi_master *master; |
359 | 358 | ||
@@ -392,8 +391,7 @@ EXPORT_SYMBOL_GPL(spi_alloc_master); | |||
392 | * After a successful return, the caller is responsible for calling | 391 | * After a successful return, the caller is responsible for calling |
393 | * spi_unregister_master(). | 392 | * spi_unregister_master(). |
394 | */ | 393 | */ |
395 | int __init_or_module | 394 | int spi_register_master(struct spi_master *master) |
396 | spi_register_master(struct spi_master *master) | ||
397 | { | 395 | { |
398 | static atomic_t dyn_bus_id = ATOMIC_INIT((1<<16) - 1); | 396 | static atomic_t dyn_bus_id = ATOMIC_INIT((1<<16) - 1); |
399 | struct device *dev = master->cdev.dev; | 397 | struct device *dev = master->cdev.dev; |
diff --git a/drivers/tc/zs.c b/drivers/tc/zs.c index 3d72aa5cfc71..3524e3fc08b9 100644 --- a/drivers/tc/zs.c +++ b/drivers/tc/zs.c | |||
@@ -70,7 +70,6 @@ | |||
70 | #include <asm/dec/machtype.h> | 70 | #include <asm/dec/machtype.h> |
71 | #include <asm/dec/serial.h> | 71 | #include <asm/dec/serial.h> |
72 | #include <asm/dec/system.h> | 72 | #include <asm/dec/system.h> |
73 | #include <asm/dec/tc.h> | ||
74 | 73 | ||
75 | #ifdef CONFIG_KGDB | 74 | #ifdef CONFIG_KGDB |
76 | #include <asm/kgdb.h> | 75 | #include <asm/kgdb.h> |
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c index 0e5c646cb4f6..f08ec85a6d64 100644 --- a/drivers/usb/core/quirks.c +++ b/drivers/usb/core/quirks.c | |||
@@ -30,7 +30,8 @@ | |||
30 | static const struct usb_device_id usb_quirk_list[] = { | 30 | static const struct usb_device_id usb_quirk_list[] = { |
31 | /* HP 5300/5370C scanner */ | 31 | /* HP 5300/5370C scanner */ |
32 | { USB_DEVICE(0x03f0, 0x0701), .driver_info = USB_QUIRK_STRING_FETCH_255 }, | 32 | { USB_DEVICE(0x03f0, 0x0701), .driver_info = USB_QUIRK_STRING_FETCH_255 }, |
33 | 33 | /* Seiko Epson Corp - Perfection 1670 */ | |
34 | { USB_DEVICE(0x04b8, 0x011f), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, | ||
34 | /* Elsa MicroLink 56k (V.250) */ | 35 | /* Elsa MicroLink 56k (V.250) */ |
35 | { USB_DEVICE(0x05cc, 0x2267), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, | 36 | { USB_DEVICE(0x05cc, 0x2267), .driver_info = USB_QUIRK_NO_AUTOSUSPEND }, |
36 | 37 | ||
diff --git a/drivers/usb/gadget/omap_udc.c b/drivers/usb/gadget/omap_udc.c index 8f9a2b615422..b394e63894d2 100644 --- a/drivers/usb/gadget/omap_udc.c +++ b/drivers/usb/gadget/omap_udc.c | |||
@@ -296,6 +296,15 @@ omap_free_request(struct usb_ep *ep, struct usb_request *_req) | |||
296 | 296 | ||
297 | /*-------------------------------------------------------------------------*/ | 297 | /*-------------------------------------------------------------------------*/ |
298 | 298 | ||
299 | /* | ||
300 | * dma-coherent memory allocation (for dma-capable endpoints) | ||
301 | * | ||
302 | * NOTE: the dma_*_coherent() API calls suck. Most implementations are | ||
303 | * (a) page-oriented, so small buffers lose big; and (b) asymmetric with | ||
304 | * respect to calls with irqs disabled: alloc is safe, free is not. | ||
305 | * We currently work around (b), but not (a). | ||
306 | */ | ||
307 | |||
299 | static void * | 308 | static void * |
300 | omap_alloc_buffer( | 309 | omap_alloc_buffer( |
301 | struct usb_ep *_ep, | 310 | struct usb_ep *_ep, |
@@ -307,6 +316,9 @@ omap_alloc_buffer( | |||
307 | void *retval; | 316 | void *retval; |
308 | struct omap_ep *ep; | 317 | struct omap_ep *ep; |
309 | 318 | ||
319 | if (!_ep) | ||
320 | return NULL; | ||
321 | |||
310 | ep = container_of(_ep, struct omap_ep, ep); | 322 | ep = container_of(_ep, struct omap_ep, ep); |
311 | if (use_dma && ep->has_dma) { | 323 | if (use_dma && ep->has_dma) { |
312 | static int warned; | 324 | static int warned; |
@@ -326,6 +338,35 @@ omap_alloc_buffer( | |||
326 | return retval; | 338 | return retval; |
327 | } | 339 | } |
328 | 340 | ||
341 | static DEFINE_SPINLOCK(buflock); | ||
342 | static LIST_HEAD(buffers); | ||
343 | |||
344 | struct free_record { | ||
345 | struct list_head list; | ||
346 | struct device *dev; | ||
347 | unsigned bytes; | ||
348 | dma_addr_t dma; | ||
349 | }; | ||
350 | |||
351 | static void do_free(unsigned long ignored) | ||
352 | { | ||
353 | spin_lock_irq(&buflock); | ||
354 | while (!list_empty(&buffers)) { | ||
355 | struct free_record *buf; | ||
356 | |||
357 | buf = list_entry(buffers.next, struct free_record, list); | ||
358 | list_del(&buf->list); | ||
359 | spin_unlock_irq(&buflock); | ||
360 | |||
361 | dma_free_coherent(buf->dev, buf->bytes, buf, buf->dma); | ||
362 | |||
363 | spin_lock_irq(&buflock); | ||
364 | } | ||
365 | spin_unlock_irq(&buflock); | ||
366 | } | ||
367 | |||
368 | static DECLARE_TASKLET(deferred_free, do_free, 0); | ||
369 | |||
329 | static void omap_free_buffer( | 370 | static void omap_free_buffer( |
330 | struct usb_ep *_ep, | 371 | struct usb_ep *_ep, |
331 | void *buf, | 372 | void *buf, |
@@ -333,13 +374,29 @@ static void omap_free_buffer( | |||
333 | unsigned bytes | 374 | unsigned bytes |
334 | ) | 375 | ) |
335 | { | 376 | { |
336 | struct omap_ep *ep; | 377 | if (!_ep) { |
378 | WARN_ON(1); | ||
379 | return; | ||
380 | } | ||
337 | 381 | ||
338 | ep = container_of(_ep, struct omap_ep, ep); | 382 | /* free memory into the right allocator */ |
339 | if (use_dma && _ep && ep->has_dma) | 383 | if (dma != DMA_ADDR_INVALID) { |
340 | dma_free_coherent(ep->udc->gadget.dev.parent, bytes, buf, dma); | 384 | struct omap_ep *ep; |
341 | else | 385 | struct free_record *rec = buf; |
342 | kfree (buf); | 386 | unsigned long flags; |
387 | |||
388 | ep = container_of(_ep, struct omap_ep, ep); | ||
389 | |||
390 | rec->dev = ep->udc->gadget.dev.parent; | ||
391 | rec->bytes = bytes; | ||
392 | rec->dma = dma; | ||
393 | |||
394 | spin_lock_irqsave(&buflock, flags); | ||
395 | list_add_tail(&rec->list, &buffers); | ||
396 | tasklet_schedule(&deferred_free); | ||
397 | spin_unlock_irqrestore(&buflock, flags); | ||
398 | } else | ||
399 | kfree(buf); | ||
343 | } | 400 | } |
344 | 401 | ||
345 | /*-------------------------------------------------------------------------*/ | 402 | /*-------------------------------------------------------------------------*/ |
@@ -1691,12 +1748,38 @@ ep0out_status_stage: | |||
1691 | udc->ep0_pending = 0; | 1748 | udc->ep0_pending = 0; |
1692 | break; | 1749 | break; |
1693 | case USB_REQ_GET_STATUS: | 1750 | case USB_REQ_GET_STATUS: |
1751 | /* USB_ENDPOINT_HALT status? */ | ||
1752 | if (u.r.bRequestType != (USB_DIR_IN|USB_RECIP_ENDPOINT)) | ||
1753 | goto intf_status; | ||
1754 | |||
1755 | /* ep0 never stalls */ | ||
1756 | if (!(w_index & 0xf)) | ||
1757 | goto zero_status; | ||
1758 | |||
1759 | /* only active endpoints count */ | ||
1760 | ep = &udc->ep[w_index & 0xf]; | ||
1761 | if (w_index & USB_DIR_IN) | ||
1762 | ep += 16; | ||
1763 | if (!ep->desc) | ||
1764 | goto do_stall; | ||
1765 | |||
1766 | /* iso never stalls */ | ||
1767 | if (ep->bmAttributes == USB_ENDPOINT_XFER_ISOC) | ||
1768 | goto zero_status; | ||
1769 | |||
1770 | /* FIXME don't assume non-halted endpoints!! */ | ||
1771 | ERR("%s status, can't report\n", ep->ep.name); | ||
1772 | goto do_stall; | ||
1773 | |||
1774 | intf_status: | ||
1694 | /* return interface status. if we were pedantic, | 1775 | /* return interface status. if we were pedantic, |
1695 | * we'd detect non-existent interfaces, and stall. | 1776 | * we'd detect non-existent interfaces, and stall. |
1696 | */ | 1777 | */ |
1697 | if (u.r.bRequestType | 1778 | if (u.r.bRequestType |
1698 | != (USB_DIR_IN|USB_RECIP_INTERFACE)) | 1779 | != (USB_DIR_IN|USB_RECIP_INTERFACE)) |
1699 | goto delegate; | 1780 | goto delegate; |
1781 | |||
1782 | zero_status: | ||
1700 | /* return two zero bytes */ | 1783 | /* return two zero bytes */ |
1701 | UDC_EP_NUM_REG = UDC_EP_SEL|UDC_EP_DIR; | 1784 | UDC_EP_NUM_REG = UDC_EP_SEL|UDC_EP_DIR; |
1702 | UDC_DATA_REG = 0; | 1785 | UDC_DATA_REG = 0; |
@@ -2068,7 +2151,7 @@ static irqreturn_t omap_udc_iso_irq(int irq, void *_dev) | |||
2068 | 2151 | ||
2069 | /*-------------------------------------------------------------------------*/ | 2152 | /*-------------------------------------------------------------------------*/ |
2070 | 2153 | ||
2071 | static inline int machine_needs_vbus_session(void) | 2154 | static inline int machine_without_vbus_sense(void) |
2072 | { | 2155 | { |
2073 | return (machine_is_omap_innovator() | 2156 | return (machine_is_omap_innovator() |
2074 | || machine_is_omap_osk() | 2157 | || machine_is_omap_osk() |
@@ -2156,7 +2239,7 @@ int usb_gadget_register_driver (struct usb_gadget_driver *driver) | |||
2156 | /* boards that don't have VBUS sensing can't autogate 48MHz; | 2239 | /* boards that don't have VBUS sensing can't autogate 48MHz; |
2157 | * can't enter deep sleep while a gadget driver is active. | 2240 | * can't enter deep sleep while a gadget driver is active. |
2158 | */ | 2241 | */ |
2159 | if (machine_needs_vbus_session()) | 2242 | if (machine_without_vbus_sense()) |
2160 | omap_vbus_session(&udc->gadget, 1); | 2243 | omap_vbus_session(&udc->gadget, 1); |
2161 | 2244 | ||
2162 | done: | 2245 | done: |
@@ -2179,7 +2262,7 @@ int usb_gadget_unregister_driver (struct usb_gadget_driver *driver) | |||
2179 | if (udc->dc_clk != NULL) | 2262 | if (udc->dc_clk != NULL) |
2180 | omap_udc_enable_clock(1); | 2263 | omap_udc_enable_clock(1); |
2181 | 2264 | ||
2182 | if (machine_needs_vbus_session()) | 2265 | if (machine_without_vbus_sense()) |
2183 | omap_vbus_session(&udc->gadget, 0); | 2266 | omap_vbus_session(&udc->gadget, 0); |
2184 | 2267 | ||
2185 | if (udc->transceiver) | 2268 | if (udc->transceiver) |
@@ -2822,7 +2905,7 @@ static int __init omap_udc_probe(struct platform_device *pdev) | |||
2822 | hmc = HMC_1510; | 2905 | hmc = HMC_1510; |
2823 | type = "(unknown)"; | 2906 | type = "(unknown)"; |
2824 | 2907 | ||
2825 | if (machine_is_omap_innovator() || machine_is_sx1()) { | 2908 | if (machine_without_vbus_sense()) { |
2826 | /* just set up software VBUS detect, and then | 2909 | /* just set up software VBUS detect, and then |
2827 | * later rig it so we always report VBUS. | 2910 | * later rig it so we always report VBUS. |
2828 | * FIXME without really sensing VBUS, we can't | 2911 | * FIXME without really sensing VBUS, we can't |
diff --git a/drivers/usb/host/uhci-debug.c b/drivers/usb/host/uhci-debug.c index 8d24d3dc0a61..1497371583b9 100644 --- a/drivers/usb/host/uhci-debug.c +++ b/drivers/usb/host/uhci-debug.c | |||
@@ -145,7 +145,8 @@ static int uhci_show_urbp(struct urb_priv *urbp, char *buf, int len, int space) | |||
145 | return out - buf; | 145 | return out - buf; |
146 | } | 146 | } |
147 | 147 | ||
148 | static int uhci_show_qh(struct uhci_qh *qh, char *buf, int len, int space) | 148 | static int uhci_show_qh(struct uhci_hcd *uhci, |
149 | struct uhci_qh *qh, char *buf, int len, int space) | ||
149 | { | 150 | { |
150 | char *out = buf; | 151 | char *out = buf; |
151 | int i, nurbs; | 152 | int i, nurbs; |
@@ -190,6 +191,9 @@ static int uhci_show_qh(struct uhci_qh *qh, char *buf, int len, int space) | |||
190 | 191 | ||
191 | if (list_empty(&qh->queue)) { | 192 | if (list_empty(&qh->queue)) { |
192 | out += sprintf(out, "%*s queue is empty\n", space, ""); | 193 | out += sprintf(out, "%*s queue is empty\n", space, ""); |
194 | if (qh == uhci->skel_async_qh) | ||
195 | out += uhci_show_td(uhci->term_td, out, | ||
196 | len - (out - buf), 0); | ||
193 | } else { | 197 | } else { |
194 | struct urb_priv *urbp = list_entry(qh->queue.next, | 198 | struct urb_priv *urbp = list_entry(qh->queue.next, |
195 | struct urb_priv, node); | 199 | struct urb_priv, node); |
@@ -343,6 +347,7 @@ static int uhci_sprint_schedule(struct uhci_hcd *uhci, char *buf, int len) | |||
343 | struct list_head *tmp, *head; | 347 | struct list_head *tmp, *head; |
344 | int nframes, nerrs; | 348 | int nframes, nerrs; |
345 | __le32 link; | 349 | __le32 link; |
350 | __le32 fsbr_link; | ||
346 | 351 | ||
347 | static const char * const qh_names[] = { | 352 | static const char * const qh_names[] = { |
348 | "unlink", "iso", "int128", "int64", "int32", "int16", | 353 | "unlink", "iso", "int128", "int64", "int32", "int16", |
@@ -424,21 +429,22 @@ check_link: | |||
424 | 429 | ||
425 | out += sprintf(out, "Skeleton QHs\n"); | 430 | out += sprintf(out, "Skeleton QHs\n"); |
426 | 431 | ||
432 | fsbr_link = 0; | ||
427 | for (i = 0; i < UHCI_NUM_SKELQH; ++i) { | 433 | for (i = 0; i < UHCI_NUM_SKELQH; ++i) { |
428 | int cnt = 0; | 434 | int cnt = 0; |
429 | __le32 fsbr_link = 0; | ||
430 | 435 | ||
431 | qh = uhci->skelqh[i]; | 436 | qh = uhci->skelqh[i]; |
432 | out += sprintf(out, "- skel_%s_qh\n", qh_names[i]); \ | 437 | out += sprintf(out, "- skel_%s_qh\n", qh_names[i]); \ |
433 | out += uhci_show_qh(qh, out, len - (out - buf), 4); | 438 | out += uhci_show_qh(uhci, qh, out, len - (out - buf), 4); |
434 | 439 | ||
435 | /* Last QH is the Terminating QH, it's different */ | 440 | /* Last QH is the Terminating QH, it's different */ |
436 | if (i == SKEL_TERM) { | 441 | if (i == SKEL_TERM) { |
437 | if (qh_element(qh) != LINK_TO_TD(uhci->term_td)) | 442 | if (qh_element(qh) != LINK_TO_TD(uhci->term_td)) |
438 | out += sprintf(out, " skel_term_qh element is not set to term_td!\n"); | 443 | out += sprintf(out, " skel_term_qh element is not set to term_td!\n"); |
439 | if (link == LINK_TO_QH(uhci->skel_term_qh)) | 444 | link = fsbr_link; |
440 | goto check_qh_link; | 445 | if (!link) |
441 | continue; | 446 | link = LINK_TO_QH(uhci->skel_term_qh); |
447 | goto check_qh_link; | ||
442 | } | 448 | } |
443 | 449 | ||
444 | head = &qh->node; | 450 | head = &qh->node; |
@@ -448,7 +454,7 @@ check_link: | |||
448 | qh = list_entry(tmp, struct uhci_qh, node); | 454 | qh = list_entry(tmp, struct uhci_qh, node); |
449 | tmp = tmp->next; | 455 | tmp = tmp->next; |
450 | if (++cnt <= 10) | 456 | if (++cnt <= 10) |
451 | out += uhci_show_qh(qh, out, | 457 | out += uhci_show_qh(uhci, qh, out, |
452 | len - (out - buf), 4); | 458 | len - (out - buf), 4); |
453 | if (!fsbr_link && qh->skel >= SKEL_FSBR) | 459 | if (!fsbr_link && qh->skel >= SKEL_FSBR) |
454 | fsbr_link = LINK_TO_QH(qh); | 460 | fsbr_link = LINK_TO_QH(qh); |
@@ -463,8 +469,6 @@ check_link: | |||
463 | link = LINK_TO_QH(uhci->skel_async_qh); | 469 | link = LINK_TO_QH(uhci->skel_async_qh); |
464 | else if (!uhci->fsbr_is_on) | 470 | else if (!uhci->fsbr_is_on) |
465 | ; | 471 | ; |
466 | else if (fsbr_link) | ||
467 | link = fsbr_link; | ||
468 | else | 472 | else |
469 | link = LINK_TO_QH(uhci->skel_term_qh); | 473 | link = LINK_TO_QH(uhci->skel_term_qh); |
470 | check_qh_link: | 474 | check_qh_link: |
@@ -573,8 +577,8 @@ static const struct file_operations uhci_debug_operations = { | |||
573 | static inline void lprintk(char *buf) | 577 | static inline void lprintk(char *buf) |
574 | {} | 578 | {} |
575 | 579 | ||
576 | static inline int uhci_show_qh(struct uhci_qh *qh, char *buf, | 580 | static inline int uhci_show_qh(struct uhci_hcd *uhci, |
577 | int len, int space) | 581 | struct uhci_qh *qh, char *buf, int len, int space) |
578 | { | 582 | { |
579 | return 0; | 583 | return 0; |
580 | } | 584 | } |
diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c index 44da4334f1d6..d22da26ff167 100644 --- a/drivers/usb/host/uhci-hcd.c +++ b/drivers/usb/host/uhci-hcd.c | |||
@@ -632,7 +632,8 @@ static int uhci_start(struct usb_hcd *hcd) | |||
632 | */ | 632 | */ |
633 | for (i = SKEL_ISO + 1; i < SKEL_ASYNC; ++i) | 633 | for (i = SKEL_ISO + 1; i < SKEL_ASYNC; ++i) |
634 | uhci->skelqh[i]->link = LINK_TO_QH(uhci->skel_async_qh); | 634 | uhci->skelqh[i]->link = LINK_TO_QH(uhci->skel_async_qh); |
635 | uhci->skel_async_qh->link = uhci->skel_term_qh->link = UHCI_PTR_TERM; | 635 | uhci->skel_async_qh->link = UHCI_PTR_TERM; |
636 | uhci->skel_term_qh->link = LINK_TO_QH(uhci->skel_term_qh); | ||
636 | 637 | ||
637 | /* This dummy TD is to work around a bug in Intel PIIX controllers */ | 638 | /* This dummy TD is to work around a bug in Intel PIIX controllers */ |
638 | uhci_fill_td(uhci->term_td, 0, uhci_explen(0) | | 639 | uhci_fill_td(uhci->term_td, 0, uhci_explen(0) | |
diff --git a/drivers/usb/host/uhci-q.c b/drivers/usb/host/uhci-q.c index f4ebdb3e488f..19a0cc02b9a2 100644 --- a/drivers/usb/host/uhci-q.c +++ b/drivers/usb/host/uhci-q.c | |||
@@ -45,43 +45,27 @@ static inline void uhci_clear_next_interrupt(struct uhci_hcd *uhci) | |||
45 | */ | 45 | */ |
46 | static void uhci_fsbr_on(struct uhci_hcd *uhci) | 46 | static void uhci_fsbr_on(struct uhci_hcd *uhci) |
47 | { | 47 | { |
48 | struct uhci_qh *fsbr_qh, *lqh, *tqh; | 48 | struct uhci_qh *lqh; |
49 | 49 | ||
50 | /* The terminating skeleton QH always points back to the first | ||
51 | * FSBR QH. Make the last async QH point to the terminating | ||
52 | * skeleton QH. */ | ||
50 | uhci->fsbr_is_on = 1; | 53 | uhci->fsbr_is_on = 1; |
51 | lqh = list_entry(uhci->skel_async_qh->node.prev, | 54 | lqh = list_entry(uhci->skel_async_qh->node.prev, |
52 | struct uhci_qh, node); | 55 | struct uhci_qh, node); |
53 | 56 | lqh->link = LINK_TO_QH(uhci->skel_term_qh); | |
54 | /* Find the first FSBR QH. Linear search through the list is | ||
55 | * acceptable because normally FSBR gets turned on as soon as | ||
56 | * one QH needs it. */ | ||
57 | fsbr_qh = NULL; | ||
58 | list_for_each_entry_reverse(tqh, &uhci->skel_async_qh->node, node) { | ||
59 | if (tqh->skel < SKEL_FSBR) | ||
60 | break; | ||
61 | fsbr_qh = tqh; | ||
62 | } | ||
63 | |||
64 | /* No FSBR QH means we must insert the terminating skeleton QH */ | ||
65 | if (!fsbr_qh) { | ||
66 | uhci->skel_term_qh->link = LINK_TO_QH(uhci->skel_term_qh); | ||
67 | wmb(); | ||
68 | lqh->link = uhci->skel_term_qh->link; | ||
69 | |||
70 | /* Otherwise loop the last QH to the first FSBR QH */ | ||
71 | } else | ||
72 | lqh->link = LINK_TO_QH(fsbr_qh); | ||
73 | } | 57 | } |
74 | 58 | ||
75 | static void uhci_fsbr_off(struct uhci_hcd *uhci) | 59 | static void uhci_fsbr_off(struct uhci_hcd *uhci) |
76 | { | 60 | { |
77 | struct uhci_qh *lqh; | 61 | struct uhci_qh *lqh; |
78 | 62 | ||
63 | /* Remove the link from the last async QH to the terminating | ||
64 | * skeleton QH. */ | ||
79 | uhci->fsbr_is_on = 0; | 65 | uhci->fsbr_is_on = 0; |
80 | lqh = list_entry(uhci->skel_async_qh->node.prev, | 66 | lqh = list_entry(uhci->skel_async_qh->node.prev, |
81 | struct uhci_qh, node); | 67 | struct uhci_qh, node); |
82 | 68 | lqh->link = UHCI_PTR_TERM; | |
83 | /* End the async list normally and unlink the terminating QH */ | ||
84 | lqh->link = uhci->skel_term_qh->link = UHCI_PTR_TERM; | ||
85 | } | 69 | } |
86 | 70 | ||
87 | static void uhci_add_fsbr(struct uhci_hcd *uhci, struct urb *urb) | 71 | static void uhci_add_fsbr(struct uhci_hcd *uhci, struct urb *urb) |
@@ -464,9 +448,8 @@ static void link_interrupt(struct uhci_hcd *uhci, struct uhci_qh *qh) | |||
464 | */ | 448 | */ |
465 | static void link_async(struct uhci_hcd *uhci, struct uhci_qh *qh) | 449 | static void link_async(struct uhci_hcd *uhci, struct uhci_qh *qh) |
466 | { | 450 | { |
467 | struct uhci_qh *pqh, *lqh; | 451 | struct uhci_qh *pqh; |
468 | __le32 link_to_new_qh; | 452 | __le32 link_to_new_qh; |
469 | __le32 *extra_link = &link_to_new_qh; | ||
470 | 453 | ||
471 | /* Find the predecessor QH for our new one and insert it in the list. | 454 | /* Find the predecessor QH for our new one and insert it in the list. |
472 | * The list of QHs is expected to be short, so linear search won't | 455 | * The list of QHs is expected to be short, so linear search won't |
@@ -476,31 +459,17 @@ static void link_async(struct uhci_hcd *uhci, struct uhci_qh *qh) | |||
476 | break; | 459 | break; |
477 | } | 460 | } |
478 | list_add(&qh->node, &pqh->node); | 461 | list_add(&qh->node, &pqh->node); |
479 | qh->link = pqh->link; | ||
480 | |||
481 | link_to_new_qh = LINK_TO_QH(qh); | ||
482 | |||
483 | /* If this is now the first FSBR QH, take special action */ | ||
484 | if (uhci->fsbr_is_on && pqh->skel < SKEL_FSBR && | ||
485 | qh->skel >= SKEL_FSBR) { | ||
486 | lqh = list_entry(uhci->skel_async_qh->node.prev, | ||
487 | struct uhci_qh, node); | ||
488 | |||
489 | /* If the new QH is also the last one, we must unlink | ||
490 | * the terminating skeleton QH and make the new QH point | ||
491 | * back to itself. */ | ||
492 | if (qh == lqh) { | ||
493 | qh->link = link_to_new_qh; | ||
494 | extra_link = &uhci->skel_term_qh->link; | ||
495 | |||
496 | /* Otherwise the last QH must point to the new QH */ | ||
497 | } else | ||
498 | extra_link = &lqh->link; | ||
499 | } | ||
500 | 462 | ||
501 | /* Link it into the schedule */ | 463 | /* Link it into the schedule */ |
464 | qh->link = pqh->link; | ||
502 | wmb(); | 465 | wmb(); |
503 | *extra_link = pqh->link = link_to_new_qh; | 466 | link_to_new_qh = LINK_TO_QH(qh); |
467 | pqh->link = link_to_new_qh; | ||
468 | |||
469 | /* If this is now the first FSBR QH, link the terminating skeleton | ||
470 | * QH to it. */ | ||
471 | if (pqh->skel < SKEL_FSBR && qh->skel >= SKEL_FSBR) | ||
472 | uhci->skel_term_qh->link = link_to_new_qh; | ||
504 | } | 473 | } |
505 | 474 | ||
506 | /* | 475 | /* |
@@ -561,31 +530,16 @@ static void unlink_interrupt(struct uhci_hcd *uhci, struct uhci_qh *qh) | |||
561 | */ | 530 | */ |
562 | static void unlink_async(struct uhci_hcd *uhci, struct uhci_qh *qh) | 531 | static void unlink_async(struct uhci_hcd *uhci, struct uhci_qh *qh) |
563 | { | 532 | { |
564 | struct uhci_qh *pqh, *lqh; | 533 | struct uhci_qh *pqh; |
565 | __le32 link_to_next_qh = qh->link; | 534 | __le32 link_to_next_qh = qh->link; |
566 | 535 | ||
567 | pqh = list_entry(qh->node.prev, struct uhci_qh, node); | 536 | pqh = list_entry(qh->node.prev, struct uhci_qh, node); |
568 | |||
569 | /* If this is the first FSBQ QH, take special action */ | ||
570 | if (uhci->fsbr_is_on && pqh->skel < SKEL_FSBR && | ||
571 | qh->skel >= SKEL_FSBR) { | ||
572 | lqh = list_entry(uhci->skel_async_qh->node.prev, | ||
573 | struct uhci_qh, node); | ||
574 | |||
575 | /* If this QH is also the last one, we must link in | ||
576 | * the terminating skeleton QH. */ | ||
577 | if (qh == lqh) { | ||
578 | link_to_next_qh = LINK_TO_QH(uhci->skel_term_qh); | ||
579 | uhci->skel_term_qh->link = link_to_next_qh; | ||
580 | wmb(); | ||
581 | qh->link = link_to_next_qh; | ||
582 | |||
583 | /* Otherwise the last QH must point to the new first FSBR QH */ | ||
584 | } else | ||
585 | lqh->link = link_to_next_qh; | ||
586 | } | ||
587 | |||
588 | pqh->link = link_to_next_qh; | 537 | pqh->link = link_to_next_qh; |
538 | |||
539 | /* If this was the old first FSBR QH, link the terminating skeleton | ||
540 | * QH to the next (new first FSBR) QH. */ | ||
541 | if (pqh->skel < SKEL_FSBR && qh->skel >= SKEL_FSBR) | ||
542 | uhci->skel_term_qh->link = link_to_next_qh; | ||
589 | mb(); | 543 | mb(); |
590 | } | 544 | } |
591 | 545 | ||
@@ -1217,7 +1171,7 @@ static int uhci_result_common(struct uhci_hcd *uhci, struct urb *urb) | |||
1217 | 1171 | ||
1218 | if (debug > 1 && errbuf) { | 1172 | if (debug > 1 && errbuf) { |
1219 | /* Print the chain for debugging */ | 1173 | /* Print the chain for debugging */ |
1220 | uhci_show_qh(urbp->qh, errbuf, | 1174 | uhci_show_qh(uhci, urbp->qh, errbuf, |
1221 | ERRBUF_LEN, 0); | 1175 | ERRBUF_LEN, 0); |
1222 | lprintk(errbuf); | 1176 | lprintk(errbuf); |
1223 | } | 1177 | } |
diff --git a/drivers/usb/serial/airprime.c b/drivers/usb/serial/airprime.c index 7538c64a5097..39a498362594 100644 --- a/drivers/usb/serial/airprime.c +++ b/drivers/usb/serial/airprime.c | |||
@@ -18,7 +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, 0x1100) }, /* ExpressCard34 Qualcomm 3G CDMA */ | ||
22 | { USB_DEVICE(0x413c, 0x8115) }, /* Dell Wireless HSDPA 5500 */ | 21 | { USB_DEVICE(0x413c, 0x8115) }, /* Dell Wireless HSDPA 5500 */ |
23 | { }, | 22 | { }, |
24 | }; | 23 | }; |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 1633a0fd48e8..8ff9d54b21e6 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -879,6 +879,7 @@ static __u32 get_ftdi_divisor(struct usb_serial_port * port) | |||
879 | break; | 879 | break; |
880 | case FT232BM: /* FT232BM chip */ | 880 | case FT232BM: /* FT232BM chip */ |
881 | case FT2232C: /* FT2232C chip */ | 881 | case FT2232C: /* FT2232C chip */ |
882 | case FT232RL: | ||
882 | if (baud <= 3000000) { | 883 | if (baud <= 3000000) { |
883 | div_value = ftdi_232bm_baud_to_divisor(baud); | 884 | div_value = ftdi_232bm_baud_to_divisor(baud); |
884 | } else { | 885 | } else { |
@@ -1021,9 +1022,12 @@ static void ftdi_determine_type(struct usb_serial_port *port) | |||
1021 | /* (It might be a BM because of the iSerialNumber bug, | 1022 | /* (It might be a BM because of the iSerialNumber bug, |
1022 | * but it will still work as an AM device.) */ | 1023 | * but it will still work as an AM device.) */ |
1023 | priv->chip_type = FT8U232AM; | 1024 | priv->chip_type = FT8U232AM; |
1024 | } else { | 1025 | } else if (version < 0x600) { |
1025 | /* Assume its an FT232BM (or FT245BM) */ | 1026 | /* Assume its an FT232BM (or FT245BM) */ |
1026 | priv->chip_type = FT232BM; | 1027 | priv->chip_type = FT232BM; |
1028 | } else { | ||
1029 | /* Assume its an FT232R */ | ||
1030 | priv->chip_type = FT232RL; | ||
1027 | } | 1031 | } |
1028 | info("Detected %s", ftdi_chip_name[priv->chip_type]); | 1032 | info("Detected %s", ftdi_chip_name[priv->chip_type]); |
1029 | } | 1033 | } |
diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c index 53baeec8f265..4f8282ad7720 100644 --- a/drivers/usb/serial/generic.c +++ b/drivers/usb/serial/generic.c | |||
@@ -20,13 +20,14 @@ | |||
20 | #include <linux/usb/serial.h> | 20 | #include <linux/usb/serial.h> |
21 | #include <asm/uaccess.h> | 21 | #include <asm/uaccess.h> |
22 | 22 | ||
23 | static int generic_probe(struct usb_interface *interface, | ||
24 | const struct usb_device_id *id); | ||
25 | |||
26 | 23 | ||
27 | static int debug; | 24 | static int debug; |
28 | 25 | ||
29 | #ifdef CONFIG_USB_SERIAL_GENERIC | 26 | #ifdef CONFIG_USB_SERIAL_GENERIC |
27 | |||
28 | static int generic_probe(struct usb_interface *interface, | ||
29 | const struct usb_device_id *id); | ||
30 | |||
30 | static __u16 vendor = 0x05f9; | 31 | static __u16 vendor = 0x05f9; |
31 | static __u16 product = 0xffff; | 32 | static __u16 product = 0xffff; |
32 | 33 | ||
diff --git a/drivers/video/cg3.c b/drivers/video/cg3.c index ada6f7e3a891..767c850f8eb7 100644 --- a/drivers/video/cg3.c +++ b/drivers/video/cg3.c | |||
@@ -186,8 +186,7 @@ static int cg3_setcolreg(unsigned regno, | |||
186 | * @blank_mode: the blank mode we want. | 186 | * @blank_mode: the blank mode we want. |
187 | * @info: frame buffer structure that represents a single frame buffer | 187 | * @info: frame buffer structure that represents a single frame buffer |
188 | */ | 188 | */ |
189 | static int | 189 | static int cg3_blank(int blank, struct fb_info *info) |
190 | cg3_blank(int blank, struct fb_info *info) | ||
191 | { | 190 | { |
192 | struct cg3_par *par = (struct cg3_par *) info->par; | 191 | struct cg3_par *par = (struct cg3_par *) info->par; |
193 | struct cg3_regs __iomem *regs = par->regs; | 192 | struct cg3_regs __iomem *regs = par->regs; |
@@ -251,8 +250,8 @@ static int cg3_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg) | |||
251 | * Initialisation | 250 | * Initialisation |
252 | */ | 251 | */ |
253 | 252 | ||
254 | static void | 253 | static void __devinit cg3_init_fix(struct fb_info *info, int linebytes, |
255 | cg3_init_fix(struct fb_info *info, int linebytes, struct device_node *dp) | 254 | struct device_node *dp) |
256 | { | 255 | { |
257 | strlcpy(info->fix.id, dp->name, sizeof(info->fix.id)); | 256 | strlcpy(info->fix.id, dp->name, sizeof(info->fix.id)); |
258 | 257 | ||
@@ -264,8 +263,8 @@ cg3_init_fix(struct fb_info *info, int linebytes, struct device_node *dp) | |||
264 | info->fix.accel = FB_ACCEL_SUN_CGTHREE; | 263 | info->fix.accel = FB_ACCEL_SUN_CGTHREE; |
265 | } | 264 | } |
266 | 265 | ||
267 | static void cg3_rdi_maybe_fixup_var(struct fb_var_screeninfo *var, | 266 | static void __devinit cg3_rdi_maybe_fixup_var(struct fb_var_screeninfo *var, |
268 | struct device_node *dp) | 267 | struct device_node *dp) |
269 | { | 268 | { |
270 | char *params; | 269 | char *params; |
271 | char *p; | 270 | char *p; |
@@ -287,36 +286,36 @@ static void cg3_rdi_maybe_fixup_var(struct fb_var_screeninfo *var, | |||
287 | } | 286 | } |
288 | } | 287 | } |
289 | 288 | ||
290 | static u8 cg3regvals_66hz[] __initdata = { /* 1152 x 900, 66 Hz */ | 289 | static u8 cg3regvals_66hz[] __devinitdata = { /* 1152 x 900, 66 Hz */ |
291 | 0x14, 0xbb, 0x15, 0x2b, 0x16, 0x04, 0x17, 0x14, | 290 | 0x14, 0xbb, 0x15, 0x2b, 0x16, 0x04, 0x17, 0x14, |
292 | 0x18, 0xae, 0x19, 0x03, 0x1a, 0xa8, 0x1b, 0x24, | 291 | 0x18, 0xae, 0x19, 0x03, 0x1a, 0xa8, 0x1b, 0x24, |
293 | 0x1c, 0x01, 0x1d, 0x05, 0x1e, 0xff, 0x1f, 0x01, | 292 | 0x1c, 0x01, 0x1d, 0x05, 0x1e, 0xff, 0x1f, 0x01, |
294 | 0x10, 0x20, 0 | 293 | 0x10, 0x20, 0 |
295 | }; | 294 | }; |
296 | 295 | ||
297 | static u8 cg3regvals_76hz[] __initdata = { /* 1152 x 900, 76 Hz */ | 296 | static u8 cg3regvals_76hz[] __devinitdata = { /* 1152 x 900, 76 Hz */ |
298 | 0x14, 0xb7, 0x15, 0x27, 0x16, 0x03, 0x17, 0x0f, | 297 | 0x14, 0xb7, 0x15, 0x27, 0x16, 0x03, 0x17, 0x0f, |
299 | 0x18, 0xae, 0x19, 0x03, 0x1a, 0xae, 0x1b, 0x2a, | 298 | 0x18, 0xae, 0x19, 0x03, 0x1a, 0xae, 0x1b, 0x2a, |
300 | 0x1c, 0x01, 0x1d, 0x09, 0x1e, 0xff, 0x1f, 0x01, | 299 | 0x1c, 0x01, 0x1d, 0x09, 0x1e, 0xff, 0x1f, 0x01, |
301 | 0x10, 0x24, 0 | 300 | 0x10, 0x24, 0 |
302 | }; | 301 | }; |
303 | 302 | ||
304 | static u8 cg3regvals_rdi[] __initdata = { /* 640 x 480, cgRDI */ | 303 | static u8 cg3regvals_rdi[] __devinitdata = { /* 640 x 480, cgRDI */ |
305 | 0x14, 0x70, 0x15, 0x20, 0x16, 0x08, 0x17, 0x10, | 304 | 0x14, 0x70, 0x15, 0x20, 0x16, 0x08, 0x17, 0x10, |
306 | 0x18, 0x06, 0x19, 0x02, 0x1a, 0x31, 0x1b, 0x51, | 305 | 0x18, 0x06, 0x19, 0x02, 0x1a, 0x31, 0x1b, 0x51, |
307 | 0x1c, 0x06, 0x1d, 0x0c, 0x1e, 0xff, 0x1f, 0x01, | 306 | 0x1c, 0x06, 0x1d, 0x0c, 0x1e, 0xff, 0x1f, 0x01, |
308 | 0x10, 0x22, 0 | 307 | 0x10, 0x22, 0 |
309 | }; | 308 | }; |
310 | 309 | ||
311 | static u8 *cg3_regvals[] __initdata = { | 310 | static u8 *cg3_regvals[] __devinitdata = { |
312 | cg3regvals_66hz, cg3regvals_76hz, cg3regvals_rdi | 311 | cg3regvals_66hz, cg3regvals_76hz, cg3regvals_rdi |
313 | }; | 312 | }; |
314 | 313 | ||
315 | static u_char cg3_dacvals[] __initdata = { | 314 | static u_char cg3_dacvals[] __devinitdata = { |
316 | 4, 0xff, 5, 0x00, 6, 0x70, 7, 0x00, 0 | 315 | 4, 0xff, 5, 0x00, 6, 0x70, 7, 0x00, 0 |
317 | }; | 316 | }; |
318 | 317 | ||
319 | static void cg3_do_default_mode(struct cg3_par *par) | 318 | static void __devinit cg3_do_default_mode(struct cg3_par *par) |
320 | { | 319 | { |
321 | enum cg3_type type; | 320 | enum cg3_type type; |
322 | u8 *p; | 321 | u8 *p; |
@@ -433,7 +432,8 @@ static int __devinit cg3_init_one(struct of_device *op) | |||
433 | return 0; | 432 | return 0; |
434 | } | 433 | } |
435 | 434 | ||
436 | static int __devinit cg3_probe(struct of_device *dev, const struct of_device_id *match) | 435 | static int __devinit cg3_probe(struct of_device *dev, |
436 | const struct of_device_id *match) | ||
437 | { | 437 | { |
438 | struct of_device *op = to_of_device(&dev->dev); | 438 | struct of_device *op = to_of_device(&dev->dev); |
439 | 439 | ||
diff --git a/drivers/video/ffb.c b/drivers/video/ffb.c index 15854aec3180..1d4e8354b561 100644 --- a/drivers/video/ffb.c +++ b/drivers/video/ffb.c | |||
@@ -336,14 +336,30 @@ struct ffb_dac { | |||
336 | u32 value2; | 336 | u32 value2; |
337 | }; | 337 | }; |
338 | 338 | ||
339 | #define FFB_DAC_UCTRL 0x1001 /* User Control */ | ||
340 | #define FFB_DAC_UCTRL_MANREV 0x00000f00 /* 4-bit Manufacturing Revision */ | ||
341 | #define FFB_DAC_UCTRL_MANREV_SHIFT 8 | ||
342 | #define FFB_DAC_TGEN 0x6000 /* Timing Generator */ | ||
343 | #define FFB_DAC_TGEN_VIDE 0x00000001 /* Video Enable */ | ||
344 | #define FFB_DAC_DID 0x8000 /* Device Identification */ | ||
345 | #define FFB_DAC_DID_PNUM 0x0ffff000 /* Device Part Number */ | ||
346 | #define FFB_DAC_DID_PNUM_SHIFT 12 | ||
347 | #define FFB_DAC_DID_REV 0xf0000000 /* Device Revision */ | ||
348 | #define FFB_DAC_DID_REV_SHIFT 28 | ||
349 | |||
350 | #define FFB_DAC_CUR_CTRL 0x100 | ||
351 | #define FFB_DAC_CUR_CTRL_P0 0x00000001 | ||
352 | #define FFB_DAC_CUR_CTRL_P1 0x00000002 | ||
353 | |||
339 | struct ffb_par { | 354 | struct ffb_par { |
340 | spinlock_t lock; | 355 | spinlock_t lock; |
341 | struct ffb_fbc __iomem *fbc; | 356 | struct ffb_fbc __iomem *fbc; |
342 | struct ffb_dac __iomem *dac; | 357 | struct ffb_dac __iomem *dac; |
343 | 358 | ||
344 | u32 flags; | 359 | u32 flags; |
345 | #define FFB_FLAG_AFB 0x00000001 | 360 | #define FFB_FLAG_AFB 0x00000001 /* AFB m3 or m6 */ |
346 | #define FFB_FLAG_BLANKED 0x00000002 | 361 | #define FFB_FLAG_BLANKED 0x00000002 /* screen is blanked */ |
362 | #define FFB_FLAG_INVCURSOR 0x00000004 /* DAC has inverted cursor logic */ | ||
347 | 363 | ||
348 | u32 fg_cache __attribute__((aligned (8))); | 364 | u32 fg_cache __attribute__((aligned (8))); |
349 | u32 bg_cache; | 365 | u32 bg_cache; |
@@ -354,7 +370,6 @@ struct ffb_par { | |||
354 | unsigned long physbase; | 370 | unsigned long physbase; |
355 | unsigned long fbsize; | 371 | unsigned long fbsize; |
356 | 372 | ||
357 | int dac_rev; | ||
358 | int board_type; | 373 | int board_type; |
359 | }; | 374 | }; |
360 | 375 | ||
@@ -426,11 +441,12 @@ static void ffb_switch_from_graph(struct ffb_par *par) | |||
426 | FFBWait(par); | 441 | FFBWait(par); |
427 | 442 | ||
428 | /* Disable cursor. */ | 443 | /* Disable cursor. */ |
429 | upa_writel(0x100, &dac->type2); | 444 | upa_writel(FFB_DAC_CUR_CTRL, &dac->type2); |
430 | if (par->dac_rev <= 2) | 445 | if (par->flags & FFB_FLAG_INVCURSOR) |
431 | upa_writel(0, &dac->value2); | 446 | upa_writel(0, &dac->value2); |
432 | else | 447 | else |
433 | upa_writel(3, &dac->value2); | 448 | upa_writel((FFB_DAC_CUR_CTRL_P0 | |
449 | FFB_DAC_CUR_CTRL_P1), &dac->value2); | ||
434 | 450 | ||
435 | spin_unlock_irqrestore(&par->lock, flags); | 451 | spin_unlock_irqrestore(&par->lock, flags); |
436 | } | 452 | } |
@@ -664,18 +680,18 @@ ffb_blank(int blank, struct fb_info *info) | |||
664 | struct ffb_par *par = (struct ffb_par *) info->par; | 680 | struct ffb_par *par = (struct ffb_par *) info->par; |
665 | struct ffb_dac __iomem *dac = par->dac; | 681 | struct ffb_dac __iomem *dac = par->dac; |
666 | unsigned long flags; | 682 | unsigned long flags; |
667 | u32 tmp; | 683 | u32 val; |
684 | int i; | ||
668 | 685 | ||
669 | spin_lock_irqsave(&par->lock, flags); | 686 | spin_lock_irqsave(&par->lock, flags); |
670 | 687 | ||
671 | FFBWait(par); | 688 | FFBWait(par); |
672 | 689 | ||
690 | upa_writel(FFB_DAC_TGEN, &dac->type); | ||
691 | val = upa_readl(&dac->value); | ||
673 | switch (blank) { | 692 | switch (blank) { |
674 | case FB_BLANK_UNBLANK: /* Unblanking */ | 693 | case FB_BLANK_UNBLANK: /* Unblanking */ |
675 | upa_writel(0x6000, &dac->type); | 694 | val |= FFB_DAC_TGEN_VIDE; |
676 | tmp = (upa_readl(&dac->value) | 0x1); | ||
677 | upa_writel(0x6000, &dac->type); | ||
678 | upa_writel(tmp, &dac->value); | ||
679 | par->flags &= ~FFB_FLAG_BLANKED; | 695 | par->flags &= ~FFB_FLAG_BLANKED; |
680 | break; | 696 | break; |
681 | 697 | ||
@@ -683,13 +699,16 @@ ffb_blank(int blank, struct fb_info *info) | |||
683 | case FB_BLANK_VSYNC_SUSPEND: /* VESA blank (vsync off) */ | 699 | case FB_BLANK_VSYNC_SUSPEND: /* VESA blank (vsync off) */ |
684 | case FB_BLANK_HSYNC_SUSPEND: /* VESA blank (hsync off) */ | 700 | case FB_BLANK_HSYNC_SUSPEND: /* VESA blank (hsync off) */ |
685 | case FB_BLANK_POWERDOWN: /* Poweroff */ | 701 | case FB_BLANK_POWERDOWN: /* Poweroff */ |
686 | upa_writel(0x6000, &dac->type); | 702 | val &= ~FFB_DAC_TGEN_VIDE; |
687 | tmp = (upa_readl(&dac->value) & ~0x1); | ||
688 | upa_writel(0x6000, &dac->type); | ||
689 | upa_writel(tmp, &dac->value); | ||
690 | par->flags |= FFB_FLAG_BLANKED; | 703 | par->flags |= FFB_FLAG_BLANKED; |
691 | break; | 704 | break; |
692 | } | 705 | } |
706 | upa_writel(FFB_DAC_TGEN, &dac->type); | ||
707 | upa_writel(val, &dac->value); | ||
708 | for (i = 0; i < 10; i++) { | ||
709 | upa_writel(FFB_DAC_TGEN, &dac->type); | ||
710 | upa_readl(&dac->value); | ||
711 | } | ||
693 | 712 | ||
694 | spin_unlock_irqrestore(&par->lock, flags); | 713 | spin_unlock_irqrestore(&par->lock, flags); |
695 | 714 | ||
@@ -894,6 +913,7 @@ static int ffb_init_one(struct of_device *op) | |||
894 | struct ffb_dac __iomem *dac; | 913 | struct ffb_dac __iomem *dac; |
895 | struct all_info *all; | 914 | struct all_info *all; |
896 | int err; | 915 | int err; |
916 | u32 dac_pnum, dac_rev, dac_mrev; | ||
897 | 917 | ||
898 | all = kzalloc(sizeof(*all), GFP_KERNEL); | 918 | all = kzalloc(sizeof(*all), GFP_KERNEL); |
899 | if (!all) | 919 | if (!all) |
@@ -948,17 +968,31 @@ static int ffb_init_one(struct of_device *op) | |||
948 | if ((upa_readl(&fbc->ucsr) & FFB_UCSR_ALL_ERRORS) != 0) | 968 | if ((upa_readl(&fbc->ucsr) & FFB_UCSR_ALL_ERRORS) != 0) |
949 | upa_writel(FFB_UCSR_ALL_ERRORS, &fbc->ucsr); | 969 | upa_writel(FFB_UCSR_ALL_ERRORS, &fbc->ucsr); |
950 | 970 | ||
951 | ffb_switch_from_graph(&all->par); | ||
952 | |||
953 | dac = all->par.dac; | 971 | dac = all->par.dac; |
954 | upa_writel(0x8000, &dac->type); | 972 | upa_writel(FFB_DAC_DID, &dac->type); |
955 | all->par.dac_rev = upa_readl(&dac->value) >> 0x1c; | 973 | dac_pnum = upa_readl(&dac->value); |
974 | dac_rev = (dac_pnum & FFB_DAC_DID_REV) >> FFB_DAC_DID_REV_SHIFT; | ||
975 | dac_pnum = (dac_pnum & FFB_DAC_DID_PNUM) >> FFB_DAC_DID_PNUM_SHIFT; | ||
976 | |||
977 | upa_writel(FFB_DAC_UCTRL, &dac->type); | ||
978 | dac_mrev = upa_readl(&dac->value); | ||
979 | dac_mrev = (dac_mrev & FFB_DAC_UCTRL_MANREV) >> | ||
980 | FFB_DAC_UCTRL_MANREV_SHIFT; | ||
956 | 981 | ||
957 | /* Elite3D has different DAC revision numbering, and no DAC revisions | 982 | /* Elite3D has different DAC revision numbering, and no DAC revisions |
958 | * have the reversed meaning of cursor enable. | 983 | * have the reversed meaning of cursor enable. Otherwise, Pacifica 1 |
984 | * ramdacs with manufacturing revision less than 3 have inverted | ||
985 | * cursor logic. We identify Pacifica 1 as not Pacifica 2, the | ||
986 | * latter having a part number value of 0x236e. | ||
959 | */ | 987 | */ |
960 | if (all->par.flags & FFB_FLAG_AFB) | 988 | if ((all->par.flags & FFB_FLAG_AFB) || dac_pnum == 0x236e) { |
961 | all->par.dac_rev = 10; | 989 | all->par.flags &= ~FFB_FLAG_INVCURSOR; |
990 | } else { | ||
991 | if (dac_mrev < 3) | ||
992 | all->par.flags |= FFB_FLAG_INVCURSOR; | ||
993 | } | ||
994 | |||
995 | ffb_switch_from_graph(&all->par); | ||
962 | 996 | ||
963 | /* Unblank it just to be sure. When there are multiple | 997 | /* Unblank it just to be sure. When there are multiple |
964 | * FFB/AFB cards in the system, or it is not the OBP | 998 | * FFB/AFB cards in the system, or it is not the OBP |
@@ -993,10 +1027,12 @@ static int ffb_init_one(struct of_device *op) | |||
993 | 1027 | ||
994 | dev_set_drvdata(&op->dev, all); | 1028 | dev_set_drvdata(&op->dev, all); |
995 | 1029 | ||
996 | printk("%s: %s at %016lx, type %d, DAC revision %d\n", | 1030 | printk("%s: %s at %016lx, type %d, " |
1031 | "DAC pnum[%x] rev[%d] manuf_rev[%d]\n", | ||
997 | dp->full_name, | 1032 | dp->full_name, |
998 | ((all->par.flags & FFB_FLAG_AFB) ? "AFB" : "FFB"), | 1033 | ((all->par.flags & FFB_FLAG_AFB) ? "AFB" : "FFB"), |
999 | all->par.physbase, all->par.board_type, all->par.dac_rev); | 1034 | all->par.physbase, all->par.board_type, |
1035 | dac_pnum, dac_rev, dac_mrev); | ||
1000 | 1036 | ||
1001 | return 0; | 1037 | return 0; |
1002 | } | 1038 | } |